Compare commits

..

54 Commits

Author SHA1 Message Date
ae5c888cdc static: remove cruft 2024-12-04 15:33:31 +01:00
e3e8007564 static: remove obsolete files 2024-12-04 15:32:13 +01:00
a6383e23e4 gitignore: add /static 2024-12-04 15:31:36 +01:00
a2e08809cf docs: update user documentation 2024-11-18 14:57:37 +01:00
58f44150c0 update assets 2024-11-18 11:26:12 +01:00
b1c56173c7 radiocampus/assets/ASoundListEditor.vue: enable removing episode sounds 2024-11-18 10:46:48 +01:00
ff9cfd4a89 aircox/views/episode: add name, url and delete properties as sound data available to vuejs 2024-11-18 10:43:17 +01:00
4f28e884ae radiocampus/assets/AFormSet: enable definition of the removeItem method 2024-11-18 08:34:17 +01:00
f073a9ef77 aircox/forms/episode: add episode id to EpisodeSoundFormset, this enables EpisodeUpdateView post requests validation 2024-11-15 15:33:25 +01:00
1363d22e89 aircox/forms/episode: limit available sounds 2024-11-15 15:04:34 +01:00
9a58fba0fd radiocampus/assets: remove cruft 2024-11-13 10:13:50 +01:00
ccc6ed26fd aircox/views/episode_detail: when episode page is unpublished and user not authorized, redirect to parent program page 2024-11-12 14:57:08 +01:00
56f9ecff1f css: preserve play icon on podcasts 2024-11-12 11:09:34 +01:00
a7eb1f4aa3 aircox/views/apge: order by -pub_date,-pk 2024-11-12 10:40:20 +01:00
97a534e422 aircox/admin: order episodes by -pub_date,-pk 2024-11-12 10:25:12 +01:00
973367ea8f update translations 2024-11-12 10:12:35 +01:00
1df0aa7332 templates/list_pagination: add links to first and last pages 2024-11-12 10:12:23 +01:00
cae5bdc1d8 aircox/views/episode: render selected attribute on option 0 2024-11-08 11:54:32 +01:00
8ecf71b96e aircox/templates: display a link to dashboard when user in not authenticated 2024-11-08 10:22:11 +01:00
0788d4af37 aircox/models/page: display episode/page title 2024-11-07 17:24:16 +01:00
05be58b0c1 aircox/models/page: remove custom published() method which prevented new Podcasts to be included in EpisodeQuerySet.with_podcasts(), maybe related to 33e46ebd53 2024-11-07 17:23:27 +01:00
529ed25d7f aircox/views/episode: redirect to edit view when adding an episode 2024-11-07 14:13:12 +01:00
129360f89d misc: add style to edit links 2024-11-07 13:36:25 +01:00
c102cf936e update translations 2024-11-07 08:19:54 +01:00
fe424e9d9d misc: enable adding new episodes 2024-11-07 08:12:11 +01:00
2a594821bb aircox/models/episodes: enable pointing to draft episodes edition 2024-11-07 07:44:21 +01:00
c6fe3a5a34 templates/item: display draft status when episode is unpublished 2024-11-07 07:34:39 +01:00
cd67b0ac6f templates/program_form: add a link to program episodes 2024-11-07 07:23:29 +01:00
7369d2d8d3 radiocampus/templates: display cover on episode page 2024-11-06 14:42:13 +01:00
7a5bb3fb41 aircox/permissions: use unqualified codename in group permissions 2024-11-06 14:39:45 +01:00
c09ad6c1fd docs: update instructions on permissions 2024-10-30 14:23:29 +01:00
eb77652569 radiocampus/urls: gestion points to dashboard 2024-10-30 11:07:34 +01:00
3caeab15d9 docs: update user manual with simplified program management for animators 2024-10-30 10:33:04 +01:00
92b6bcfae5 aircox/admin: order episodes by -pub_date 2024-10-28 10:37:05 +01:00
8b55ab5dea aircox/conf.py: allow attribute href 2024-10-21 07:45:59 +02:00
c5ecca2d36 templates: add target to preview links in order to be able to follow them in the dashboad view 2024-10-21 07:38:39 +02:00
efac8997f2 radiocampus: misc adjustments 2024-09-25 11:08:28 +02:00
3fa038ddf9 aircox/conf: allow iframes 2024-09-25 11:08:28 +02:00
9a702202e2 radiocampus/public: add secondary links 2024-09-25 11:08:28 +02:00
4adacd1f80 radiocampus: center selected date in timetables 2024-09-25 11:08:28 +02:00
acfd5c49b7 radiocampus: fred css reshape 2024-09-25 11:08:28 +02:00
29b4dc2de5 radiocampus: integrate marielle design, timetable pages 2024-09-25 11:08:21 +02:00
4e1c876d62 radiocampus: integrate marielle design, episodes page 2024-09-10 11:05:04 +02:00
86e0b1a7a0 radiocampus/homepage: add recently played 2024-09-05 17:08:35 +02:00
6615ebe5da radiocampus/urls: avoid loading debug_toolbar 2024-09-02 12:32:55 +02:00
2513d9eff5 radiocampus: integrate marielle design, homepage 2024-09-02 12:23:53 +02:00
b7429e11f0 radiocampus: integrate marielle design (step 1) 2024-08-29 11:59:49 +02:00
a0be3c0fda templatetags: add model_name 2024-08-27 08:56:26 +02:00
070af46ef1 radiocampus: style update 2024-07-24 12:13:14 +02:00
a8719bbc80 radiocampus: import new logo and background assets 2024-07-24 10:29:11 +02:00
1551e1310f radiocampus/fonts: bump campus_grotesk to v24 2024-07-24 10:29:06 +02:00
f29cced5f5 radiocampus: style update 2024-07-24 10:29:06 +02:00
a323901d0e templates/nav.html: logout view expects post requests 2024-07-24 10:29:05 +02:00
0a7a615288 templates/base.html: declare viewport 2024-07-24 10:29:05 +02:00
129 changed files with 13881 additions and 33364 deletions

2
.gitignore vendored
View File

@ -8,3 +8,5 @@ node_modules/
db.sqlite3
instance/settings/settings.py
/static

View File

@ -37,3 +37,4 @@ class EpisodeAdmin(SortableAdminBase, ChildPageAdmin):
# readonly_fields = ('parent',)
inlines = (TrackInline, EpisodeSoundInline, DiffusionInline)
ordering = ["-pub_date", "-pk"]

View File

@ -181,8 +181,8 @@ class Settings(BaseSettings):
"""Allow comments."""
# ---- bleach
ALLOWED_TAGS = [*sanitizer.ALLOWED_TAGS, "br", "p", "h3", "h4", "h5"]
ALLOWED_ATTRIBUTES = sanitizer.ALLOWED_ATTRIBUTES
ALLOWED_TAGS = [*sanitizer.ALLOWED_TAGS, "br", "p", "hr", "h2", "h3", "h4", "h5", "iframe", "pre"]
ALLOWED_ATTRIBUTES = [*sanitizer.ALLOWED_ATTRIBUTES, "src", "width", "height", "frameborder", "href"]
ALLOWED_PROTOCOLS = sanitizer.ALLOWED_PROTOCOLS

View File

@ -14,15 +14,27 @@ class EpisodeForm(ChildPageForm):
fields = ChildPageForm.Meta.fields
class EpisodeSoundForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if "instance" in kwargs:
"""Limit available sounds."""
episode_sounds = kwargs["instance"].episode.episodesound_set.all()
self.fields["sound"].queryset = models.Sound.objects.filter(id__in=[x.sound.id for x in episode_sounds])
EpisodeSoundFormSet = modelformset_factory(
models.EpisodeSound,
form=EpisodeSoundForm,
fields=(
"id",
"position",
"episode",
"sound",
"broadcast",
),
widgets={
"id": forms.HiddenInput(),
"broadcast": forms.CheckboxInput(),
"episode": forms.HiddenInput(),
# "sound": forms.HiddenInput(),

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Aircox 0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-04-28 18:57+0000\n"
"POT-Creation-Date: 2024-11-07 08:18+0100\n"
"PO-Revision-Date: 2016-10-10 16:00+02\n"
"Last-Translator: Aarys\n"
"Language-Team: Aircox's translators team\n"
@ -22,7 +22,7 @@ msgstr ""
msgid "start"
msgstr "début"
#: admin/diffusion.py:31 models/diffusion.py:127 models/program.py:172
#: admin/diffusion.py:31 models/diffusion.py:127 models/program.py:182
msgid "end"
msgstr "fin"
@ -38,7 +38,7 @@ msgstr "Depuis"
msgid "Until"
msgstr "Jusque"
#: admin/filters.py:28 models/page.py:289 tests/admin/test_filters.py:53
#: admin/filters.py:28 models/page.py:282 tests/admin/test_filters.py:53
msgid "None"
msgstr "Aucun"
@ -88,7 +88,7 @@ msgstr "temps"
msgid "Search"
msgstr "Chercher"
#: filters.py:36 models/episode.py:131
#: filters.py:36 models/episode.py:135
msgid "Podcast"
msgstr "Podcast"
@ -140,31 +140,33 @@ msgstr "éditer les dates de diffusion"
msgid "rerun"
msgstr "rediffusion"
#: models/episode.py:60 templates/aircox/dashboard/statistics.html:29
#: models/episode.py:61 templates/aircox/dashboard/statistics.html:29
msgid "Episode"
msgstr "Épisode"
#: models/episode.py:61
#: models/episode.py:62
#: templates/aircox/dashboard/widgets/program_episodes.html:4
#: templates/aircox/program_form.html:10
msgid "Episodes"
msgstr "Épisodes"
#: models/episode.py:118 models/page.py:351 models/track.py:35
#: models/episode.py:122 models/page.py:344 models/track.py:35
msgid "order"
msgstr "ordre"
#: models/episode.py:120 models/track.py:37
#: models/episode.py:124 models/track.py:37
msgid "position in the playlist"
msgstr "position dans la playlist"
#: models/episode.py:123 models/sound.py:59
#: models/episode.py:127 models/sound.py:59
msgid "Broadcast"
msgstr "Broadcast"
#: models/episode.py:125 models/sound.py:61
#: models/episode.py:129 models/sound.py:61
msgid "The sound is broadcasted on air"
msgstr "Le son est radiodiffusé"
#: models/episode.py:132 templates/aircox/episode_detail.html:16
#: models/episode.py:136 templates/aircox/episode_detail.html:16
#: templates/aircox/episode_form.html:11 templates/aircox/episode_list.html:8
msgid "Podcasts"
msgstr "Podcasts"
@ -213,7 +215,7 @@ msgstr "stop"
msgid "other"
msgstr "autre"
#: models/log.py:89 models/page.py:349 models/program.py:55
#: models/log.py:89 models/page.py:342 models/program.py:55
#: models/station.py:146
msgid "station"
msgstr "station"
@ -255,7 +257,7 @@ msgstr "Log"
msgid "Logs"
msgstr "Logs"
#: models/page.py:43 models/page.py:352 models/track.py:45
#: models/page.py:43 models/page.py:345 models/track.py:45
msgid "title"
msgstr "titre"
@ -271,7 +273,8 @@ msgstr "Catégorie"
msgid "Categories"
msgstr "Catégories"
#: models/page.py:84
#: models/page.py:84 templates/aircox/dashboard/widgets/program_episodes.html:6
#: views/episode.py:150
msgid "draft"
msgstr "brouillon"
@ -291,107 +294,107 @@ msgstr "statut"
msgid "cover"
msgstr "couverture"
#: models/page.py:103 models/page.py:329
#: models/page.py:102 models/page.py:322
msgid "content"
msgstr "contenu"
#: models/page.py:202
#: models/page.py:195
msgid "category"
msgstr "catégorie"
#: models/page.py:207
#: models/page.py:200
msgid "publication date"
msgstr "date de publication"
#: models/page.py:209
#: models/page.py:202
msgid "featured"
msgstr "en avant"
#: models/page.py:213
#: models/page.py:206
msgid "allow comments"
msgstr "autoriser les commentaires"
#: models/page.py:228
#: models/page.py:221
msgid "Publication"
msgstr "Publication"
#: models/page.py:229
#: models/page.py:222
msgid "Publications"
msgstr "Publications"
#: models/page.py:290
#: models/page.py:283
msgid "Home Page"
msgstr "Page d'accueil"
#: models/page.py:291
#: models/page.py:284
msgid "Timetable"
msgstr "Horaires"
#: models/page.py:292
#: models/page.py:285
msgid "Programs list"
msgstr "Liste des émissions"
#: models/page.py:293
#: models/page.py:286
msgid "Episodes list"
msgstr "Liste des épisodes"
#: models/page.py:294
#: models/page.py:287
msgid "Articles list"
msgstr "Liste des articles"
#: models/page.py:295
#: models/page.py:288
msgid "Publications list"
msgstr "Publications"
#: models/page.py:296
#: models/page.py:289
msgid "Podcasts list"
msgstr "Podcasts"
#: models/page.py:299
#: models/page.py:292
msgid "attach to"
msgstr "attacher à"
#: models/page.py:304
#: models/page.py:297
msgid "display this page content to related element"
msgstr "Afficher le contenu de cette page pour l'élément sélectionné"
#: models/page.py:322
#: models/page.py:315
msgid "related page"
msgstr "page liée"
#: models/page.py:326
#: models/page.py:319
msgid "nickname"
msgstr "pseudo"
#: models/page.py:327
#: models/page.py:320
msgid "email"
msgstr "email"
#: models/page.py:342
#: models/page.py:335
msgid "Comment"
msgstr "Commentaire"
#: models/page.py:343 templates/aircox/page_detail.html:51
#: models/page.py:336 templates/aircox/page_detail.html:51
msgid "Comments"
msgstr "Commentaires"
#: models/page.py:350
#: models/page.py:343
msgid "menu"
msgstr "menu"
#: models/page.py:353
#: models/page.py:346
msgid "url"
msgstr "url"
#: models/page.py:358
#: models/page.py:351
msgid "page"
msgstr "page"
#: models/page.py:364
#: models/page.py:357
msgid "Menu item"
msgstr "Élément du menu"
#: models/page.py:365
#: models/page.py:358
msgid "Menu items"
msgstr "Éléments de menu"
@ -411,7 +414,7 @@ msgstr "synchroniser"
msgid "update later diffusions according to schedule changes"
msgstr "met à jour les dates de diffusion à venir lorsque l'horaire change"
#: models/program.py:66 permissions.py:17
#: models/program.py:66 permissions.py:18
msgid "editors"
msgstr "éditeurs"
@ -420,23 +423,23 @@ msgstr "éditeurs"
msgid "Programs"
msgstr "Émissions"
#: models/program.py:157 models/rerun.py:42
#: models/program.py:167 models/rerun.py:42
msgid "related program"
msgstr "émission apparentée"
#: models/program.py:160
#: models/program.py:170
msgid "delay"
msgstr "délai"
#: models/program.py:163
#: models/program.py:173
msgid "minimal delay between two sound plays"
msgstr "délai minimum entre deux sons joués"
#: models/program.py:166
#: models/program.py:176
msgid "begin"
msgstr "début"
#: models/program.py:169 models/program.py:175
#: models/program.py:179 models/program.py:185
msgid "used to define a time range this stream is played"
msgstr "utilisé pour définir une période durant lequel ce stream est joué"
@ -550,8 +553,6 @@ msgid "downloadable"
msgstr "téléchargeable"
#: models/sound.py:55
#, fuzzy
#| msgid "sound can be downloaded by visitors"
msgid "Sound can be downloaded by website visitors."
msgstr "Le son peut être téléchargé par les visiteurs du site."
@ -706,7 +707,7 @@ msgstr "Séparateur de l'éditeur de playlist"
msgid " By %(filter_title)s "
msgstr "Par %(filter_title)s "
#: templates/aircox/base.html:70
#: templates/aircox/base.html:71
msgid "Main menu"
msgstr "Menu principal"
@ -735,8 +736,7 @@ msgid "Last Comments"
msgstr "Derniers commentaires"
#: templates/aircox/dashboard/statistics.html:4
#: templates/aircox/widgets/nav.html:41 tests/test_admin_site.py:40
#: views/admin.py:35
#: templates/aircox/widgets/nav.html:41 views/admin.py:35
msgid "Statistics"
msgstr "Statistiques"
@ -905,53 +905,56 @@ msgid "Post comment"
msgstr "Commenter"
#: templates/aircox/page_form.html:14
#, fuzzy, python-format
#| msgid "Create a %(model)s"
#, python-format
msgid "Create a %(model)s"
msgstr "Ajouter %(models)s"
msgstr "Ajouter un %(model)s"
#: templates/aircox/page_form.html:28
#: templates/aircox/page_form.html:34
msgid "Select an image"
msgstr "Sélectionner une image"
#: templates/aircox/page_form.html:44
#: templates/aircox/page_form.html:50
msgid "Are you sure you want to remove this item from server?"
msgstr "Êtes-vous sûr de vouloir retirer ce fichier du serveur?"
#: templates/aircox/page_form.html:91
#: templates/aircox/page_form.html:97
msgid "Change cover"
msgstr "Changer de couverture"
#: templates/aircox/page_form.html:125
#: templates/aircox/page_form.html:135
msgid "Update"
msgstr "Mise à jour"
#: templates/aircox/program_detail.html:24
#: templates/aircox/program_detail.html:26
#, python-format
msgid "Rerun of %(date)s"
msgstr "Rediffusion du %(date)s"
#: templates/aircox/program_detail.html:25
#: templates/aircox/program_detail.html:27
msgid "Rerun"
msgstr "Rediffusion"
#: templates/aircox/program_detail.html:41
#: templates/aircox/program_detail.html:48
msgid "Last Episodes"
msgstr "Derniers Épisodes"
#: templates/aircox/program_detail.html:42
#: templates/aircox/program_detail.html:49
msgid "All episodes"
msgstr "Tous les épisodes"
#: templates/aircox/program_detail.html:49
#: templates/aircox/program_detail.html:56
msgid "Last Articles"
msgstr "Derniers articles"
#: templates/aircox/program_detail.html:50
#: templates/aircox/program_detail.html:57
msgid "All articles"
msgstr "Tous les articles"
#: templates/aircox/program_form.html:13
#: templates/aircox/program_form.html:12
msgid "New episode"
msgstr "Nouvel épisode"
#: templates/aircox/program_form.html:17
msgid "Editors"
msgstr "Éditeurs"
@ -1021,7 +1024,7 @@ msgstr "Prochain"
msgid "Dashboard"
msgstr "Tableau de bord"
#: templates/aircox/widgets/nav.html:47
#: templates/aircox/widgets/nav.html:50
msgid "Disconnect"
msgstr "Déconnexion"
@ -1244,31 +1247,35 @@ msgstr "dashboard/"
msgid "dashboard/program/<pk>/"
msgstr "dashboard/emissions/<pk>/"
#: urls.py:130
#: urls.py:131
msgid "dashboard/program/<pk>/add-episode/"
msgstr "dashboard/emissions/<pk>/nouvel-episode/"
#: urls.py:133
msgid "dashboard/episodes/<pk>/"
msgstr "dashboard/episodes/<pk>/"
#: urls.py:131
#: urls.py:134
msgid "dashboard/statistics/"
msgstr "dashboard/statistiques/"
#: urls.py:132
#: urls.py:135
msgid "dashboard/statistics/<date:date>/"
msgstr "dashboard/statistiques/<date:date>/"
#: urls.py:133
#: urls.py:136
msgid "dashboard/users/"
msgstr "dashboard/utilisateurs/"
#: urls.py:135
#: urls.py:138
msgid "errors/no-station/"
msgstr "erreurs/pas-de-station/"
#: views/page.py:89
#: views/page.py:100
#, python-brace-format
msgid "{model}"
msgstr "{model}"
#: views/page.py:204
#: views/page.py:210
msgid "comments are not allowed"
msgstr "les commentaires ne sont pas autorisés"

View File

@ -2,6 +2,7 @@ import os
from django.conf import settings as d_settings
from django.db import models
from django.urls import reverse
from django.utils.functional import cached_property
from django.utils.translation import gettext_lazy as _
@ -85,6 +86,9 @@ class Episode(ChildPage):
)
return super().get_init_kwargs_from(page, title=title, program=page, **kwargs)
def get_absolute_url(self):
return reverse(self.detail_url_name, kwargs={"slug": self.slug})
class EpisodeSoundQuerySet(models.QuerySet):
def episode(self, episode):

View File

@ -182,8 +182,7 @@ class BasePage(Renderable, models.Model):
# FIXME: rename
class PageQuerySet(BasePageQuerySet):
def published(self):
return self.filter(status=Page.STATUS_PUBLISHED, pub_date__lte=tz.now())
pass
class Page(BasePage):
@ -241,7 +240,7 @@ class ChildPage(Page):
@property
def display_title(self):
if self.is_published:
if self.title:
return self.title
return self.parent and self.parent.title or ""

View File

@ -23,6 +23,7 @@ class PagePermissions:
"""Format used for permission name (displayed to humans)."""
perms_codename_format = "{obj._meta.label_lower}_{obj.pk}_{perm}"
"""Format used for permissions codename."""
perms_cn_format = "{obj._meta.model_name}_{obj.pk}_{perm}"
def __init__(self, model):
self.model = model
@ -78,7 +79,7 @@ class PagePermissions:
# TODO: avoid multiple database hits
for name in infos["perms"]:
perm, _ = Permission.objects.get_or_create(
codename=self.perms_codename_format.format(obj=obj, perm=name),
codename=self.perms_cn_format.format(obj=obj, perm=name),
content_type=ContentType.objects.get_for_model(obj),
defaults={"name": self.perms_name_format.format(obj=obj, perm=name)},
)

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -16,6 +16,7 @@ Usefull context:
<meta name="description" content="{{ site.description }}" />
<meta name="keywords" content="{{ site.tags }}" />
<meta name="generator" content="Aircox" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="icon" href="{% thumbnail site.favicon 32x32 crop %}" />
{% block assets %}
@ -75,10 +76,8 @@ Usefull context:
{% for item, render in items %}
{{ render }}
{% endfor %}
{% endblock %}
{% if user.is_authenticated %}
{% include "./widgets/nav.html" %}
{% endif %}
{% endblock %}
</div>
{% endblock %}
</nav>

View File

@ -7,9 +7,11 @@
{% endblock %}
{% block page-form-actions %}
<a class="button secondary withmargin" href="{% url 'episode-list' parent_slug=object.slug %}">{% trans "Episodes" %}</a>
<a class="button secondary withmargin" href="{% url 'program-add-episode' object.pk %}" target="_self">{% trans "New episode" %}</a>
{% if object and object.pk and request.user.is_superuser %}
<button type="button"
class="button secondary"
class="button secondary withmargin"
@click="$refs['group-users-modal'].open({id: {{ object.editors_group_id }}, name: '{{ object.editors_group.name }}' })">{% translate "Editors" %}</button>
{{ block.super }}

View File

@ -1,11 +1,20 @@
{% load aircox i18n %}
<div class="dropdown is-hoverable is-right">
<div class="dropdown-trigger">
<button class="button square" aria-haspopup="true" aria-controls="dropdown-menu" type="button">
{% if not user.is_authenticated %}
<div class="dropdown-trigger nav-item">
<a class="button square" href="{% url 'dashboard' %}" style="background-color:unset;">
<span class="icon">
<i class="fa-regular fa-user" aria-hidden="true"></i>
</span>
</a>
</div>
{% else %}
<div class="dropdown is-hoverable is-right" style="display:block;">
<div class="dropdown-trigger nav-item">
<a class="button square" aria-haspopup="true" aria-controls="dropdown-menu" style="background-color:unset;">
<span class="icon">
<i class="fa fa-user" aria-hidden="true"></i>
<i class="fa-regular fa-user" aria-hidden="true"></i>
</span>
</button>
</a>
</div>
<div class="dropdown-menu" id="dropdown-menu" role="menu" style="z-index:200">
<div class="dropdown-content">
@ -40,11 +49,17 @@
{% translate "Statistics" %}
</a>
{% endblock %}
<hr class="dropdown-divider" />
{% endif %}
<a class="dropdown-item" href="{% url "logout" %}" data-force-reload="1">
{% translate "Disconnect" %}
</a>
{% if user.is_authenticated %}
<hr class="dropdown-divider" />
<form id="logout" action="{% url 'logout' %}" method="post">
{% csrf_token %}
<a class="dropdown-item" href="#" type="submit" onclick="document.getElementById('logout').submit();">
{% translate "Disconnect" %}
</a>
</form>
{% endif %}
</div>
</div>
</div>
{% endif %}

View File

@ -13,14 +13,14 @@
{% with request.resolver_match.view_name as view_name %}
&nbsp;
{% if request.path != object.get_absolute_url %}
<a href="{% url view_name|detail_view page.slug %}" target="_self" title="{% translate 'View' %} {{ page }}">
<a href="{% url view_name|detail_view page.slug %}" target="_self" title="{% translate 'View' %} {{ page }}" class="button secondary withmargin">
<span class="icon">
<i class="fa-regular fa-eye"></i>
</span>
<span>{% translate 'View' %} </span>
</a>
{% elif can_edit %}
<a href="{% url view_name|edit_view page.pk %}" target="_self" title="{% translate 'Edit' %} {{ page }}">
<a href="{% url view_name|edit_view page.pk %}" target="_self" title="{% translate 'Edit' %} {{ page }}" class="button secondary withmargin">
<span class="icon">
<i class="fa-solid fa-pencil"></i>
</span>

View File

@ -181,3 +181,8 @@ def is_checkbox(field):
def is_select(field):
"""Return True if field is a select."""
return isinstance(field.widget, forms.Select)
@register.filter
def model_name(instance):
return instance.__class__.__name__

View File

@ -127,6 +127,9 @@ urls = [
# ---- dashboard
path(_("dashboard/"), views.dashboard.DashboardView.as_view(), name="dashboard"),
path(_("dashboard/program/<pk>/"), views.program.ProgramUpdateView.as_view(), name="program-edit"),
path(
_("dashboard/program/<pk>/add-episode/"), views.episode.EpisodeCreateView.as_view(), name="program-add-episode"
),
path(_("dashboard/episodes/<pk>/"), views.episode.EpisodeUpdateView.as_view(), name="episode-edit"),
path(_("dashboard/statistics/"), views.dashboard.StatisticsView.as_view(), name="dashboard-statistics"),
path(_("dashboard/statistics/<date:date>/"), views.dashboard.StatisticsView.as_view(), name="dashboard-statistics"),

View File

@ -1,7 +1,11 @@
from django.contrib.auth.mixins import UserPassesTestMixin
from django.http import Http404, HttpResponseRedirect
from django.shortcuts import get_object_or_404
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from django.views.generic.base import View
from aircox.models import Episode, Program, StaticPage, Track
from aircox.models import Episode, Program, StaticPage, Sound, Track
from aircox import forms, filters, permissions
from .mixins import VueFormDataMixin
@ -12,6 +16,7 @@ __all__ = (
"EpisodeDetailView",
"EpisodeListView",
"PodcastListView",
"EpisodeCreateView",
"EpisodeUpdateView",
)
@ -35,6 +40,17 @@ class EpisodeDetailView(PageDetailView):
def get_related_url(self):
return reverse("episode-list", kwargs={"parent_slug": self.object.parent.slug})
def get(self, *args, **kwargs):
"""When episode is unpublished and user not authorized, redirect to
parent page."""
try:
self.object = super().get_object()
except Http404:
episode = get_object_or_404(Episode, slug=self.kwargs["slug"])
return HttpResponseRedirect(reverse("program-detail", kwargs={"slug": episode.program.slug}))
context = self.get_context_data(object=self.object)
return self.render_to_response(context)
@attach
class EpisodeListView(PageListView):
@ -55,6 +71,13 @@ class EpisodeUpdateView(UserPassesTestMixin, VueFormDataMixin, PageUpdateView):
form_class = forms.EpisodeForm
template_name = "aircox/episode_form.html"
def get_form_kwargs(self, *args, **kwargs):
"""Render selected attribute on option 0."""
fk = super().get_form_kwargs(*args, **kwargs)
if not fk["instance"].status:
fk["initial"]["status"] = "0"
return fk
def can_edit(self, obj):
return self.test_func()
@ -121,6 +144,14 @@ class EpisodeUpdateView(UserPassesTestMixin, VueFormDataMixin, PageUpdateView):
for key in ("soundlist_formset", "tracklist_formset"):
formset = kwargs[key]
kwargs[f"{key}_data"] = self.get_formset_data(formset, {"episode": self.object.id})
for i, episode_sound in enumerate(kwargs["soundlist_formset_data"]["initials"]):
# annotate sound properties for vuejs
sound = Sound.objects.get(id=episode_sound["sound"])
kwargs["soundlist_formset_data"]["initials"][i]["name"] = sound.name
kwargs["soundlist_formset_data"]["initials"][i]["url"] = sound.file.url
kwargs["soundlist_formset_data"]["initials"][i]["delete_attr_name"] = f"sounds-{i}-DELETE"
return super().get_context_data(**kwargs)
def post(self, request, *args, **kwargs):
@ -139,3 +170,17 @@ class EpisodeUpdateView(UserPassesTestMixin, VueFormDataMixin, PageUpdateView):
if invalid:
return self.get(request, **formsets)
return resp
class EpisodeCreateView(UserPassesTestMixin, View):
def get(self, request, **kwargs):
program = self.get_object()
episode = Episode.objects.create(program=program, title="%s (%s)" % (program.title, _("draft")))
return HttpResponseRedirect(reverse("episode-edit", kwargs={"pk": episode.pk}))
def test_func(self):
program = self.get_object()
return permissions.program.can(self.request.user, "update", program)
def get_object(self):
return get_object_or_404(Program, pk=self.kwargs["pk"])

View File

@ -148,7 +148,7 @@ class PageListView(FiltersMixin, BasePageListView):
return super().get_filterset(data, query)
def get_queryset(self):
qs = super().get_queryset().select_related("category").order_by("-pub_date")
qs = super().get_queryset().select_related("category").order_by("-pub_date", "-pk")
cat_ids = self.model.objects.published().values_list("category_id", flat=True)
self.categories = Category.objects.filter(id__in=cat_ids)
return qs

Binary file not shown.

136
radiocampus/aircox_urls.py Executable file
View File

@ -0,0 +1,136 @@
from django.urls import include, path, register_converter
from django.utils.translation import gettext_lazy as _
from rest_framework.routers import DefaultRouter
from . import models, views, viewsets
from .converters import DateConverter, PagePathConverter, WeekConverter
__all__ = ["api", "urls"]
register_converter(PagePathConverter, "page_path")
register_converter(DateConverter, "date")
register_converter(WeekConverter, "week")
# urls = [
# path('on_air', views.on_air, name='aircox.on_air'),
# path('monitor', views.Monitor.as_view(), name='aircox.monitor'),
# path('stats', views.StatisticsView.as_view(), name='aircox.stats'),
# ]
router = DefaultRouter()
router.register("user", viewsets.UserViewSet, basename="user")
router.register("group", viewsets.GroupViewSet, basename="group")
router.register("usergroup", viewsets.UserGroupViewSet, basename="usergroup")
router.register("images", viewsets.ImageViewSet, basename="image")
router.register("sound", viewsets.SoundViewSet, basename="sound")
router.register("track", viewsets.TrackROViewSet, basename="track")
router.register("comment", viewsets.CommentViewSet, basename="comment")
api = [
path("logs/", views.log.LogListAPIView.as_view(), name="live"),
path(
"user/settings/",
viewsets.UserSettingsViewSet.as_view({"get": "retrieve", "post": "update", "put": "update"}),
name="user-settings",
),
] + router.urls
urls = [
path("", views.home.HomeView.as_view(), name="home"),
path("api/", include((api, "aircox"), namespace="api")),
# ---- ---- objects views
# ---- articles
path(
_("articles/<slug:slug>/"),
views.article.ArticleDetailView.as_view(),
name="article-detail",
),
path(
_("articles/"),
views.article.ArticleListView.as_view(model=models.article.Article),
name="article-list",
),
path(
_("articles/c/<slug:category_slug>/"),
views.article.ArticleListView.as_view(model=models.article.Article),
name="article-list",
),
# ---- timetable
path(_("timetable/"), views.diffusion.TimeTableView.as_view(), name="timetable-list"),
path(
_("timetable/<date:date>/"),
views.diffusion.TimeTableView.as_view(),
name="timetable-list",
),
# ---- pages
path(
_("publications/"),
views.PageListView.as_view(model=models.Page, attach_to_value=models.StaticPage.Target.PAGES),
name="page-list",
),
path(
_("publications/c/<slug:category_slug>/"),
views.PageListView.as_view(model=models.Page, attach_to_value=models.StaticPage.Target.PAGES),
name="page-list",
),
path(
_("pages/<slug:slug>/"),
views.BasePageDetailView.as_view(
model=models.StaticPage,
queryset=models.StaticPage.objects.filter(attach_to__isnull=True),
),
name="static-page-detail",
),
path(
_("pages/"),
views.BasePageListView.as_view(
model=models.StaticPage,
queryset=models.StaticPage.objects.filter(attach_to__isnull=True),
),
name="static-page-list",
),
# ---- programs
path(_("programs/"), views.program.ProgramListView.as_view(), name="program-list"),
path(_("programs/c/<slug:category_slug>/"), views.program.ProgramListView.as_view(), name="program-list"),
path(
_("programs/<slug:slug>/"),
views.program.ProgramDetailView.as_view(),
name="program-detail",
),
path(_("programs/<slug:parent_slug>/articles/"), views.article.ArticleListView.as_view(), name="article-list"),
path(_("programs/<slug:parent_slug>/podcasts/"), views.episode.PodcastListView.as_view(), name="podcast-list"),
path(_("programs/<slug:parent_slug>/episodes/"), views.episode.EpisodeListView.as_view(), name="episode-list"),
path(
_("programs/<slug:parent_slug>/diffusions/"), views.diffusion.DiffusionListView.as_view(), name="diffusion-list"
),
path(
_("programs/<slug:parent_slug>/publications/"),
views.PageListView.as_view(model=models.Page, attach_to_value=models.StaticPage.Target.PAGES),
name="page-list",
),
# ---- episodes
path(_("programs/episodes/"), views.episode.EpisodeListView.as_view(), name="episode-list"),
path(_("programs/episodes/c/<slug:category_slug>/"), views.episode.EpisodeListView.as_view(), name="episode-list"),
path(
_("programs/episodes/<slug:slug>/"),
views.episode.EpisodeDetailView.as_view(),
name="episode-detail",
),
path(_("podcasts/"), views.episode.PodcastListView.as_view(), name="podcast-list"),
path(_("podcasts/c/<slug:category_slug>/"), views.episode.PodcastListView.as_view(), name="podcast-list"),
# ---- dashboard
path(_("dashboard/"), views.dashboard.DashboardView.as_view(), name="dashboard"),
path(_("dashboard/program/<pk>/"), views.program.ProgramUpdateView.as_view(), name="program-edit"),
path(_("dashboard/episodes/<pk>/"), views.episode.EpisodeUpdateView.as_view(), name="episode-edit"),
path(_("dashboard/statistics/"), views.dashboard.StatisticsView.as_view(), name="dashboard-statistics"),
path(_("dashboard/statistics/<date:date>/"), views.dashboard.StatisticsView.as_view(), name="dashboard-statistics"),
path(_("dashboard/users/"), views.auth.UserListView.as_view(), name="user-list"),
# ---- others
path(_("errors/no-station/"), views.errors.NoStationErrorView.as_view(), name="errors-no-station"),
]

View File

@ -1,27 +0,0 @@
// Enable styling body background while using vue hotreload
// Tags with side effect (<script> and <style>) are ignored in client component templates.
const backgrounds = new Map();
backgrounds.set('default', "linear-gradient(#738ef2, white)");
backgrounds.set('/', "url(/static/radiocampus/backgrounds/photo-04-20.jpg) no-repeat center center fixed");
export default class BackgroundLoad {
constructor () {
let url = new URL(document.location)
this.path = url.pathname
this.update()
document.addEventListener("pageLoaded", this.handlePageLoad.bind(this), false)
}
handlePageLoad (e) {
this.path = e.detail
this.update()
}
update () {
let background = backgrounds.get(this.path) || backgrounds.get("default")
document.body.style.background = background;
document.body.style.backgroundSize = "cover";
}
}

View File

@ -108,6 +108,7 @@
//! If provided call this function instead of adding an item to rows on "+" button click.
actionAdd: Function,
actionRemove: Function,
//! If True, columns can be reordered
columnsOrderable: Boolean,
@ -161,14 +162,12 @@
this.$emit('move', {...event, seŧ: set_})
},
removeItem(row) {
const item = this.items[row]
if(item.id) {
// TODO
}
else {
this.items.splice(row,1)
removeItem(row, item) {
if(this.actionRemove) {
this.actionRemove(row, item);
return
}
this.items.splice(row,1)
},
//! Load items into set

View File

@ -24,7 +24,9 @@
<a-form-set ref="formset" :form-data="formData" :labels="labels"
:initials="initData.items"
order-by="position"
:action-add="actionAdd">
:action-add="actionAdd"
:action-remove="actionRemove"
>
<template v-for="[name,slot] of rowsSlots" :key="slot"
v-slot:[slot]="data">
<slot v-if="name != 'row-tail'" :name="name" v-bind="data"/>
@ -34,6 +36,7 @@
<label>{{ item.data.name }}</label><br>
<audio controls :src="item.data.url"/>
<input type="hidden" :name="inputName" :value="item.data.sound"/>
<input type="checkbox" :name="item.data.delete_attr_name" :id="item.data.delete_attr_name" style="display:none;">
</template>
</a-form-set>
</div>
@ -78,6 +81,12 @@ export default {
}
this.$refs.formset.set.push(data)
},
actionRemove(row, item) {
var ckbox = document.getElementById(item.data.delete_attr_name);
ckbox.checked = true;
ckbox.parentNode.parentNode.style["display"] = "none";
},
},
}
</script>

View File

@ -1,7 +1,6 @@
import {createApp} from 'vue'
import PageLoad from './pageLoad'
import BackgroundLoad from './backgroundLoad'
/**

Binary file not shown.

View File

@ -0,0 +1,239 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# 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: 2024-11-12 10:10+0100\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"
"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"
#: aircox_urls.py:50
msgid "articles/<slug:slug>/"
msgstr ""
#: aircox_urls.py:55
msgid "articles/"
msgstr "articles/"
#: aircox_urls.py:60
msgid "articles/c/<slug:category_slug>/"
msgstr ""
#: aircox_urls.py:65 urls.py:32
msgid "timetable/"
msgstr ""
#: aircox_urls.py:67 urls.py:34
msgid "timetable/<date:date>/"
msgstr ""
#: aircox_urls.py:73
msgid "publications/"
msgstr ""
#: aircox_urls.py:78
msgid "publications/c/<slug:category_slug>/"
msgstr ""
#: aircox_urls.py:83
msgid "pages/<slug:slug>/"
msgstr ""
#: aircox_urls.py:91
msgid "pages/"
msgstr ""
#: aircox_urls.py:99
msgid "programs/"
msgstr ""
#: aircox_urls.py:100
msgid "programs/c/<slug:category_slug>/"
msgstr ""
#: aircox_urls.py:102
msgid "programs/<slug:slug>/"
msgstr ""
#: aircox_urls.py:106
msgid "programs/<slug:parent_slug>/articles/"
msgstr ""
#: aircox_urls.py:107
msgid "programs/<slug:parent_slug>/podcasts/"
msgstr ""
#: aircox_urls.py:108
msgid "programs/<slug:parent_slug>/episodes/"
msgstr ""
#: aircox_urls.py:110
msgid "programs/<slug:parent_slug>/diffusions/"
msgstr ""
#: aircox_urls.py:113
msgid "programs/<slug:parent_slug>/publications/"
msgstr ""
#: aircox_urls.py:118
msgid "programs/episodes/"
msgstr ""
#: aircox_urls.py:119
msgid "programs/episodes/c/<slug:category_slug>/"
msgstr ""
#: aircox_urls.py:121
msgid "programs/episodes/<slug:slug>/"
msgstr ""
#: aircox_urls.py:125
msgid "podcasts/"
msgstr ""
#: aircox_urls.py:126
msgid "podcasts/c/<slug:category_slug>/"
msgstr ""
#: aircox_urls.py:128
msgid "dashboard/"
msgstr ""
#: aircox_urls.py:129
msgid "dashboard/program/<pk>/"
msgstr ""
#: aircox_urls.py:130
msgid "dashboard/episodes/<pk>/"
msgstr ""
#: aircox_urls.py:131
msgid "dashboard/statistics/"
msgstr ""
#: aircox_urls.py:132
msgid "dashboard/statistics/<date:date>/"
msgstr ""
#: aircox_urls.py:133
msgid "dashboard/users/"
msgstr ""
#: aircox_urls.py:135
msgid "errors/no-station/"
msgstr ""
#: templates/aircox/episode_list.html:8
msgid "Podcasts"
msgstr ""
#: templates/aircox/episode_list.html:38 templates/aircox/home.html:22
#: templates/aircox/page_list.html:19 templates/aircox/podcast_list.html:19
msgid "Categories"
msgstr ""
#: templates/aircox/page_detail.html:43
#, python-format
msgid "Related %(models)s"
msgstr ""
#: templates/aircox/page_detail.html:54
msgid "Comments"
msgstr ""
#: templates/aircox/page_detail.html:64
msgid "Post a comment"
msgstr ""
#: templates/aircox/page_detail.html:91
msgid "Post comment"
msgstr ""
#: templates/aircox/page_list.html:77
msgid "There is nothing published here..."
msgstr ""
#: templates/aircox/program_detail.html:25
#, python-format
msgid "Rerun of %(date)s"
msgstr ""
#: templates/aircox/program_detail.html:26
msgid "Rerun"
msgstr ""
#: templates/aircox/program_detail.html:46
msgid "Last Episodes"
msgstr "Derniers Épisodes"
#: templates/aircox/program_detail.html:47
msgid "All episodes"
msgstr "TOus les épisodes"
#: templates/aircox/program_detail.html:57
msgid "Last Articles"
msgstr "Derniers articles"
#: templates/aircox/program_detail.html:58
msgid "All articles"
msgstr "Tous les articles"
#: templates/aircox/widgets/episode.html:35
msgid "Live diffusion"
msgstr "Diffusion en direct"
#: templates/aircox/widgets/episode.html:38
msgid "Differed diffusion"
msgstr "Diffusion diférée"
#: templates/aircox/widgets/episode.html:65
#: templates/aircox/widgets/episode.html:67
msgid "Listen"
msgstr "Écouter"
#: templates/aircox/widgets/item.html:26
msgid "Draft"
msgstr "Brouillon"
#: templates/aircox/widgets/list_pagination.html:12
msgid "pagination"
msgstr ""
#. Translators: Bottom of the list, "previous page"
#: templates/aircox/widgets/list_pagination.html:16
msgid "first"
msgstr "première"
#: templates/aircox/widgets/list_pagination.html:18
#: templates/aircox/widgets/list_pagination.html:19
#: templates/aircox/widgets/list_pagination.html:20
#| msgid "Previous"
msgid "previous"
msgstr "précédente"
#: templates/aircox/widgets/list_pagination.html:31
#: templates/aircox/widgets/list_pagination.html:32
#: templates/aircox/widgets/list_pagination.html:33
msgid "next"
msgstr "suivante"
#: templates/aircox/widgets/list_pagination.html:36
#: templates/aircox/widgets/list_pagination.html:37
#: templates/aircox/widgets/list_pagination.html:38
msgid "last"
msgstr "dernière"
#: templates/aircox/widgets/preview.html:59
msgid "Edit"
msgstr "Édition"

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,2 @@
import{A as p}from"./index.js";import"vue";window.App=p;
//# sourceMappingURL=public.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"public.js","sources":["../../assets/src/public.js"],"sourcesContent":["import \"./styles/public.scss\"\nimport './index.js'\nimport App from './app.js'\n\nwindow.App = App\n"],"names":["App"],"mappings":"2CAIA,OAAO,IAAMA"}

View File

@ -1,15 +1,11 @@
// Enable styling body background while using vue hotreload
// Tags with side effect (<script> and <style>) are ignored in client component templates.
const backgrounds = new Map();
//backgrounds.set('default', "linear-gradient(#738ef2, white)");
//backgrounds.set('default', "linear-gradient(rgba(115, 142, 242, 0.9), white)");
backgrounds.set('default', "white");
backgrounds.set('/', "url(/static/radiocampus/backgrounds/photo-04-20.jpg) no-repeat center center fixed");
backgrounds.set('/podcasts/', "url(/static/radiocampus/backgrounds/photo-04-20.jpg) no-repeat center center fixed");
class BackgroundLoad {
// change background style on load
// and also on vuejs pageLoaded event
constructor () {
let url = new URL(document.location);
this.path = url.pathname;
@ -23,14 +19,30 @@ class BackgroundLoad {
}
update () {
let background = backgrounds.get(this.path) || backgrounds.get("default");
//let target = document.getElementsByClassName("page")[0];
let target = document.body;
target.style.background = background;
//document.body.
target.style.backgroundSize = "cover";
let theme = this.get_theme_name();
document.body.className = theme;
// home page uses different theme
if (this.path == "/") {
document.body.classList.add('home');
}
}
get_theme_name () {
var currentTime = new Date().getHours();
if (document.body) {
if (3 <= currentTime && currentTime <15) {
return "yellow";
}
else {
return "blue";
}
}
}
}
window.onload = function() {
let backgroundLoad = new BackgroundLoad();
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 448 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

View File

@ -0,0 +1,250 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Calque_1" data-name="Calque 1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 1190.6 841.9">
<defs>
<style>
.cls-1 {
fill: none;
}
.cls-1, .cls-2 {
stroke-width: 0px;
}
.cls-2 {
fill: #000;
}
</style>
</defs>
<g>
<g>
<path class="cls-2" d="M215.8-748.5c24.6.2,40.9,16,40.9,39.6s-15.6,43-38.9,43h-28.5l59,62.9h-25.2l-56.9-62.9h-12.6v62.9h-18.8v-145.5h81.1ZM153.5-684.1h64c13.3-.2,21.6-9.6,21.6-23.8s-8.3-22.3-21.6-22.5h-64v46.2Z"/>
<path class="cls-2" d="M370.4-651.2h-66.3l-19.5,48.1h-19.3l58.4-145.5h26.7l58.4,145.5h-19.3l-19.3-48.1ZM363.2-669.4l-22.7-56.5-3.2-8.1-3.2,8.1-22.7,56.5h51.8Z"/>
<path class="cls-2" d="M489.9-748.5c36.8.2,60.1,30.2,60.1,70.8s-19,74.7-61.4,74.7h-60.6v-145.5h61.8ZM446.9-621.2h45.6c25.5,0,39.4-22,39.4-55.4s-16.1-53.5-40.2-53.7h-44.7v109.1h0Z"/>
<path class="cls-2" d="M657.2-620.8v17.8h-94.1v-17.8h38.5v-110h-32.1v-17.8h81.3v17.8h-31.5v110h37.9Z"/>
</g>
<path class="cls-2" d="M369.4-476.5h-66.3l-19.5,48.1h-19.3l58.4-145.5h26.7l58.4,145.5h-19.3l-19.3-48.1ZM362.1-494.7l-22.7-56.5-3.2-8.1-3.2,8.1-22.7,56.5h51.8Z"/>
<path class="cls-2" d="M678.2-573.6c24.6.2,40.9,16,40.9,39.6s-15.6,43-38.9,43h-59.9v62.9h-18.8v-145.5h76.8ZM620.2-509.2h59.7c13.3-.2,21.6-9.6,21.6-23.7s-8.3-22.2-21.6-22.5h-59.7v46.2Z"/>
<path class="cls-2" d="M849.6-471.1c-.2,29.8-20.5,47.3-54.8,47.3s-57.8-18.2-57.8-45.4v-104.4h19v102.1c.2,18.8,14.1,29.1,37.7,29.1s36.6-10.3,36.8-29.1v-102.1h19v102.5h0Z"/>
<path class="cls-2" d="M929.4-442c17.8,0,30.8-6.8,30.8-21.4s-10.3-18.8-19.5-22c-11.8-4.1-21.4-5.6-35.1-9.6-17.1-5.1-29.7-19.7-29.7-40s15.6-42.6,47.7-42.6,38.1,4.1,55,22.5l-12.8,13.1c-15.2-14.8-34.2-17.3-43.2-17.3-17.3,0-27.8,11.1-27.8,23.5s6,19.3,20.1,23.3c7.3,2.1,18.6,5.4,34.4,10.1,23.5,7.1,29.7,21.4,29.7,38.7s-19.9,40-49.6,40-43.2-7.7-56.1-25.9l15.6-11.6c10.7,13.9,24.4,19.3,40.4,19.3Z"/>
<path class="cls-2" d="M536.2-272.3v18.2h-103.2v-145.9h18.2v127.7h85Z"/>
<path class="cls-2" d="M253.4-296.5c0,26.3-19.1,43-46,42.4l-9-.2h-63.4v-145.6h69.8c27.2,1.1,39,18.2,39,38.5s-3.9,21-9.2,27c10.7,7.3,18.8,20.8,18.8,37.9ZM153.2-340.8h51.8c14.8,0,20.5-8.6,20.5-20.3s-5.6-20.6-24.2-20.6h-48.2v40.9ZM235.2-298c0-13.5-7.3-24.6-24.8-24.6h-57.2v50.1h55c19.7,0,27-10.5,27-25.5Z"/>
<g>
<path class="cls-2" d="M301.9-381.8c0,10.1-8.2,18.3-18.3,18.3s-18.3-8.2-18.3-18.3,8.2-18.3,18.3-18.3,18.3,8.2,18.3,18.3Z"/>
<circle class="cls-2" cx="393.6" cy="-381.8" r="18.3"/>
<path class="cls-2" d="M338.6-345.3c0,10.1-8.2,18.3-18.3,18.4-10.1,0-18.3-8.2-18.4-18.3,0-10.1,8.2-18.3,18.3-18.4,10.1,0,18.3,8.2,18.4,18.3Z"/>
<circle class="cls-2" cx="356.9" cy="-345.3" r="18.3"/>
<path class="cls-2" d="M338.6-308.6c0,10.1-8.2,18.3-18.3,18.4-10.1,0-18.3-8.2-18.4-18.3,0-10.1,8.2-18.3,18.3-18.4,10.1,0,18.3,8.2,18.4,18.3Z"/>
<circle class="cls-2" cx="357" cy="-308.7" r="18.3"/>
<path class="cls-2" d="M301.9-271.8c0,10.1-8.2,18.3-18.3,18.3s-18.3-8.2-18.3-18.3,8.2-18.3,18.3-18.3c10.1,0,18.3,8.2,18.3,18.3Z"/>
<circle class="cls-2" cx="393.6" cy="-271.8" r="18.3"/>
</g>
<polygon class="cls-2" points="428.4 -573.9 428.4 -428.6 439 -428.6 439 -557.1 480.8 -557.1 480.8 -428.6 501.2 -428.6 501.2 -557.1 544.2 -557.1 544.2 -428.6 569.8 -428.6 569.8 -573.9 428.4 -573.9"/>
<polygon class="cls-2" points="253.5 -428.2 172.8 -428.2 172.8 -463.1 134.9 -463.1 134.9 -549.4 173.3 -549.4 173.3 -574.4 216.5 -574.4 216.5 -557.4 190.3 -557.4 190.3 -532.4 151.9 -532.4 151.9 -480.1 189.8 -480.1 189.8 -445.2 253.5 -445.2 253.5 -428.2"/>
<path class="cls-2" d="M809.9-693.8c6.1,4.5,12.4,8.6,18.8,12.5v-21.3c-2.8-1.8-5.5-3.7-8.1-5.7-16-11.8-29.8-25.3-41.5-40.3h-22.2c14.1,20.9,31.9,39.2,53,54.8Z"/>
<path class="cls-2" d="M695.8-655.8c-7.1-5.4-14.5-10.4-22.1-14.9v21.3c3.8,2.5,7.5,5.2,11.2,7.9,14.8,11.3,27.8,24.1,39,38.4h22.3c-13.7-20-30.6-37.7-50.4-52.8Z"/>
<path class="cls-2" d="M828.7-648.7v-21.6c-3.8,2.4-7.5,4.8-11.1,7.4-24.3,17-44.8,37.5-60.5,60h22.5c13.7-17.2,30.4-32.7,49.1-45.7Z"/>
<path class="cls-2" d="M746.5-748.7h-22.1c-13.9,18.4-31.1,34.2-50.8,47v21.1c29.4-17.1,54.4-40.3,72.8-68.1Z"/>
<path class="cls-2" d="M760-347.3c0,69.6-16.9,97.2-53.1,97.2s-39.4-10.3-47.7-25.7l14.1-10.1c6.6,12.2,17.1,18,34.5,18s32.3-12.4,34.5-44.3c-9,7.9-21.2,13.1-34.7,13.1-31.7,0-52.2-24-52.2-48.2s20.8-56.9,52.2-56.9c31.3,0,52.4,24.2,52.4,56.9ZM743.8-350.5c0-23.1-17.6-34.2-36.2-34.2s-34.7,11.1-34.7,34.2,14.8,33.4,34.7,33.4c20.8,0,36.2-13.5,36.2-33.4Z"/>
<path class="cls-2" d="M875.6-272.8v18.4h-92.5v-18.4c57.4-42.6,71.7-60.8,71.7-83.7s-11.3-28.9-31.7-28.9-33,11.3-26.8,39.2l-17.1,7.9c-9.2-30.2,4.7-65.9,45.6-65.9s47.3,18.2,47.3,43.9-21,59.5-62.9,87.6h66.4Z"/>
<path class="cls-2" d="M907.7-276.4v22h-22v-22h22Z"/>
<path class="cls-2" d="M960.6-399.9h18.4v145.8h-18.4v-122.7l-39,37.9v-22.7l39-38.3Z"/>
</g>
<g>
<path class="cls-2" d="M1448.4-1634.5c24.6.2,40.9,16,40.9,39.6s-15.6,43-38.9,43h-28.5l59,62.9h-25.2l-56.9-62.9h-12.6v62.9h-18.8v-145.5h81.1ZM1386.1-1570.1h64c13.3-.2,21.6-9.6,21.6-23.8s-8.3-22.3-21.6-22.5h-64v46.2Z"/>
<path class="cls-2" d="M1603-1537.1h-66.3l-19.5,48.1h-19.3l58.4-145.5h26.7l58.4,145.5h-19.3l-19.3-48.1ZM1595.7-1555.3l-22.7-56.5-3.2-8.1-3.2,8.1-22.7,56.5h51.8Z"/>
<path class="cls-2" d="M1722.4-1634.5c36.8.2,60.1,30.2,60.1,70.8s-19,74.7-61.4,74.7h-60.6v-145.5h61.8ZM1679.4-1507.2h45.6c25.5,0,39.4-22,39.4-55.4s-16.1-53.5-40.2-53.7h-44.7v109.1h0Z"/>
<path class="cls-2" d="M1889.8-1506.7v17.8h-94.1v-17.8h38.5v-110h-32.1v-17.8h81.3v17.8h-31.5v110h37.9Z"/>
<path class="cls-2" d="M1602-1362.4h-66.3l-19.5,48.1h-19.3l58.4-145.5h26.7l58.4,145.5h-19.3l-19.3-48.1ZM1594.7-1380.6l-22.7-56.5-3.2-8.1-3.2,8.1-22.7,56.5h51.8Z"/>
<path class="cls-2" d="M1910.8-1459.6c24.6.2,40.9,16,40.9,39.6s-15.6,43-38.9,43h-59.9v62.9h-18.8v-145.5h76.8ZM1852.8-1395.2h59.7c13.3-.2,21.6-9.6,21.6-23.8s-8.3-22.2-21.6-22.5h-59.7v46.2Z"/>
<path class="cls-2" d="M2082.2-1357.1c-.2,29.7-20.5,47.3-54.8,47.3s-57.8-18.2-57.8-45.4v-104.4h19v102.1c.2,18.8,14.1,29.1,37.7,29.1s36.6-10.3,36.8-29.1v-102.1h19v102.5h0Z"/>
<path class="cls-2" d="M2162-1328c17.8,0,30.8-6.8,30.8-21.4s-10.3-18.8-19.5-22c-11.8-4.1-21.4-5.6-35.1-9.6-17.1-5.1-29.7-19.7-29.7-40s15.6-42.6,47.7-42.6,38.1,4.1,55,22.5l-12.8,13.1c-15.2-14.8-34.2-17.3-43.2-17.3-17.3,0-27.8,11.1-27.8,23.5s6,19.3,20.1,23.3c7.3,2.1,18.6,5.4,34.4,10.1,23.5,7.1,29.7,21.4,29.7,38.7s-19.9,40-49.6,40-43.2-7.7-56.1-25.9l15.6-11.6c10.7,13.9,24.4,19.3,40.4,19.3Z"/>
<polygon class="cls-2" points="1660.9 -1459.9 1660.9 -1314.5 1671.6 -1314.5 1671.6 -1443.1 1713.3 -1443.1 1713.3 -1314.5 1733.8 -1314.5 1733.8 -1443.1 1776.7 -1443.1 1776.7 -1314.5 1802.4 -1314.5 1802.4 -1459.9 1660.9 -1459.9"/>
<polygon class="cls-2" points="1486.1 -1314.1 1405.3 -1314.1 1405.3 -1349.1 1367.5 -1349.1 1367.5 -1435.3 1405.9 -1435.3 1405.9 -1460.4 1449 -1460.4 1449 -1443.4 1422.9 -1443.4 1422.9 -1418.3 1384.5 -1418.3 1384.5 -1366.1 1422.3 -1366.1 1422.3 -1331.1 1486.1 -1331.1 1486.1 -1314.1"/>
<path class="cls-2" d="M2050.1-1548.9c-24.3,17-44.8,37.5-60.5,60h22.5c13.7-17.2,30.4-32.7,49.1-45.7v-21.6c-3.8,2.4-7.5,4.8-11.1,7.4Z"/>
<path class="cls-2" d="M2042.5-1579.8c6.1,4.5,12.4,8.7,18.8,12.6v-21.3c-2.8-1.8-5.5-3.7-8.1-5.7-16-11.8-29.8-25.3-41.5-40.3h-22.2c14.1,20.9,31.9,39.2,53,54.8Z"/>
<path class="cls-2" d="M1979.1-1634.6h-22.1c-13.9,18.4-31.1,34.2-50.8,47v21.1c29.5-17.1,54.4-40.3,72.9-68.1Z"/>
<path class="cls-2" d="M1928.3-1541.7c-7.1-5.4-14.5-10.3-22.1-14.9v21.3c3.8,2.5,7.5,5.2,11.2,7.9,14.8,11.3,27.8,24.1,39,38.4h22.3c-13.7-20-30.6-37.7-50.4-52.8Z"/>
<path class="cls-2" d="M1408.8-1192.9c0,10.2-8.2,18.5-18.5,18.5-10.2,0-18.5-8.2-18.5-18.5,0-10.2,8.2-18.5,18.5-18.5,10.2,0,18.5,8.3,18.5,18.5Z"/>
<path class="cls-2" d="M1445.8-1193c0,10.2-8.2,18.5-18.5,18.5-10.2,0-18.5-8.2-18.5-18.5,0-10.2,8.3-18.5,18.5-18.5,10.2,0,18.5,8.3,18.5,18.5Z"/>
<path class="cls-2" d="M1408.8-1155.9c0,10.2-8.3,18.5-18.5,18.5-10.2,0-18.5-8.2-18.5-18.5,0-10.2,8.3-18.5,18.5-18.5,10.2,0,18.5,8.2,18.5,18.5Z"/>
<path class="cls-2" d="M1445.8-1156c0,10.2-8.3,18.5-18.5,18.5-10.2,0-18.5-8.2-18.5-18.5,0-10.2,8.2-18.5,18.5-18.5,10.2,0,18.5,8.2,18.5,18.5Z"/>
<path class="cls-2" d="M1584.4-1182.4c0,26.3-19,43-46,42.4l-9-.2h-63.3v-145.5h69.8c27.2,1.1,38.9,18.2,38.9,38.5s-3.9,21-9.2,27c10.7,7.3,18.8,20.8,18.8,37.9ZM1484.2-1226.7h51.8c14.8,0,20.5-8.6,20.5-20.3s-5.6-20.5-24.2-20.5h-48.2v40.9ZM1566.2-1183.9c0-13.5-7.3-24.6-24.8-24.6h-57.1v50.1h55c19.7,0,27-10.5,27-25.5Z"/>
<path class="cls-2" d="M1620.8-1267.5v40.9h77.2v18.2h-77.2v50.1h85.8v18.2h-104v-145.5h104v18.2h-85.8Z"/>
</g>
<g>
<path class="cls-2" d="M1448.8-748.7c24.6.2,40.9,16,40.9,39.6s-15.6,43-38.9,43h-28.5l59,62.9h-25.2l-56.9-62.9h-12.6v62.9h-18.8v-145.5h81.1ZM1386.6-684.3h64c13.3-.2,21.6-9.6,21.6-23.8s-8.3-22.3-21.6-22.5h-64v46.2Z"/>
<path class="cls-2" d="M1603.5-651.4h-66.3l-19.5,48.1h-19.3l58.4-145.5h26.7l58.4,145.5h-19.3l-19.3-48.1ZM1596.2-669.5l-22.7-56.5-3.2-8.1-3.2,8.1-22.7,56.5h51.8Z"/>
<path class="cls-2" d="M1722.9-748.7c36.8.2,60.1,30.2,60.1,70.8s-19,74.7-61.4,74.7h-60.6v-145.5h61.8ZM1679.9-621.4h45.6c25.5,0,39.4-22,39.4-55.4s-16.1-53.5-40.2-53.7h-44.7v109.1h0Z"/>
<path class="cls-2" d="M1890.3-621v17.8h-94.1v-17.8h38.5v-110h-32.1v-17.8h81.3v17.8h-31.5v110h37.9Z"/>
<path class="cls-2" d="M1602.5-476.7h-66.3l-19.5,48.1h-19.3l58.4-145.5h26.7l58.4,145.5h-19.3l-19.3-48.1ZM1595.2-494.9l-22.7-56.5-3.2-8.1-3.2,8.1-22.7,56.5h51.8Z"/>
<path class="cls-2" d="M1911.3-573.8c24.6.2,40.9,16,40.9,39.6s-15.6,43-38.9,43h-59.9v62.9h-18.8v-145.5h76.8ZM1853.3-509.4h59.7c13.3-.2,21.6-9.6,21.6-23.8s-8.3-22.2-21.6-22.5h-59.7v46.2Z"/>
<path class="cls-2" d="M2082.6-471.3c-.2,29.7-20.5,47.3-54.8,47.3s-57.8-18.2-57.8-45.4v-104.4h19v102.1c.2,18.8,14.1,29.1,37.7,29.1s36.6-10.3,36.8-29.1v-102.1h19v102.5h0Z"/>
<path class="cls-2" d="M2162.5-442.2c17.8,0,30.8-6.8,30.8-21.4s-10.3-18.8-19.5-22c-11.8-4.1-21.4-5.6-35.1-9.6-17.1-5.1-29.7-19.7-29.7-40s15.6-42.6,47.7-42.6,38.1,4.1,55,22.5l-12.8,13.1c-15.2-14.8-34.2-17.3-43.2-17.3-17.3,0-27.8,11.1-27.8,23.5s6,19.3,20.1,23.3c7.3,2.1,18.6,5.4,34.4,10.1,23.5,7.1,29.7,21.4,29.7,38.7s-19.9,40-49.6,40-43.2-7.7-56.1-25.9l15.6-11.6c10.7,13.9,24.4,19.3,40.4,19.3Z"/>
<polygon class="cls-2" points="1661.4 -574.1 1661.4 -428.8 1672.1 -428.8 1672.1 -557.3 1713.8 -557.3 1713.8 -428.8 1734.2 -428.8 1734.2 -557.3 1777.2 -557.3 1777.2 -428.8 1802.8 -428.8 1802.8 -574.1 1661.4 -574.1"/>
<polygon class="cls-2" points="1486.6 -428.4 1405.8 -428.4 1405.8 -463.3 1368 -463.3 1368 -549.6 1406.4 -549.6 1406.4 -574.6 1449.5 -574.6 1449.5 -557.6 1423.4 -557.6 1423.4 -532.6 1385 -532.6 1385 -480.3 1422.8 -480.3 1422.8 -445.4 1486.6 -445.4 1486.6 -428.4"/>
<path class="cls-2" d="M2050.6-663.1c-24.3,17-44.8,37.5-60.5,60h22.5c13.7-17.2,30.4-32.7,49.1-45.7v-21.6c-3.8,2.4-7.5,4.8-11.1,7.4Z"/>
<path class="cls-2" d="M2042.9-694c6.1,4.5,12.4,8.7,18.8,12.6v-21.3c-2.8-1.8-5.5-3.7-8.1-5.7-16-11.8-29.8-25.3-41.5-40.3h-22.2c14.1,20.9,31.9,39.2,53,54.8Z"/>
<path class="cls-2" d="M1979.6-748.8h-22.1c-13.9,18.4-31.1,34.2-50.8,47v21.1c29.5-17.1,54.4-40.3,72.9-68.1Z"/>
<path class="cls-2" d="M1928.8-655.9c-7.1-5.4-14.5-10.3-22.1-14.9v21.3c3.8,2.5,7.5,5.2,11.2,7.9,14.8,11.3,27.8,24.1,39,38.4h22.3c-13.7-20-30.6-37.7-50.4-52.8Z"/>
<g>
<path class="cls-2" d="M1409.3-307.2c0,10.2-8.2,18.5-18.5,18.5-10.2,0-18.5-8.2-18.5-18.5,0-10.2,8.3-18.5,18.5-18.5,10.2,0,18.5,8.3,18.5,18.5Z"/>
<path class="cls-2" d="M1446.3-307.2c0,10.2-8.2,18.5-18.5,18.5-10.2,0-18.5-8.2-18.5-18.5,0-10.2,8.3-18.5,18.5-18.5,10.2,0,18.5,8.2,18.5,18.5Z"/>
<path class="cls-2" d="M1409.3-270.2c0,10.2-8.3,18.5-18.5,18.5-10.2,0-18.5-8.2-18.5-18.5s8.2-18.5,18.5-18.5c10.2,0,18.5,8.2,18.5,18.5Z"/>
<circle class="cls-2" cx="1427.8" cy="-270.2" r="18.5"/>
</g>
<g>
<path class="cls-2" d="M1584.9-296.6c0,26.3-19,43-46,42.4l-9-.2h-63.3v-145.5h69.8c27.2,1.1,38.9,18.2,38.9,38.5s-3.9,21-9.2,27c10.7,7.3,18.8,20.8,18.8,37.9ZM1484.7-340.9h51.8c14.8,0,20.5-8.6,20.5-20.3s-5.6-20.5-24.2-20.5h-48.1v40.9ZM1566.7-298.1c0-13.5-7.3-24.6-24.8-24.6h-57.1v50.1h55c19.7,0,27-10.5,27-25.5Z"/>
<path class="cls-2" d="M1621.3-381.8v40.9h77.2v18.2h-77.2v50.1h85.8v18.2h-104v-145.5h104v18.2h-85.8Z"/>
</g>
<g>
<path class="cls-2" d="M1993.6-346.7c0,69.6-16.9,97.2-53.1,97.2s-39.4-10.3-47.7-25.7l14.1-10.1c6.6,12.2,17.1,18,34.5,18s32.3-12.4,34.5-44.3c-9,7.9-21.2,13.1-34.7,13.1-31.7,0-52.2-24-52.2-48.2s20.8-56.9,52.2-56.9c31.3,0,52.4,24.2,52.4,56.9ZM1977.4-349.9c0-23.1-17.6-34.3-36.2-34.3s-34.7,11.1-34.7,34.3,14.8,33.4,34.7,33.4c20.8,0,36.2-13.5,36.2-33.4Z"/>
<path class="cls-2" d="M2109.2-272.2v18.4h-92.5v-18.4c57.4-42.6,71.7-60.8,71.7-83.7s-11.3-28.9-31.7-28.9-33,11.3-26.8,39.2l-17.1,7.9c-9.2-30.2,4.7-65.9,45.6-65.9s47.3,18.2,47.3,43.9-21,59.5-62.9,87.6h66.4Z"/>
<path class="cls-2" d="M2141.3-275.8v22h-22v-22h22Z"/>
<path class="cls-2" d="M2194.2-399.3h18.4v145.8h-18.4v-122.7l-39,37.9v-22.7l39-38.3Z"/>
</g>
</g>
<g>
<path class="cls-2" d="M3011.2-678.5c.2-.1.4-.2.6-.4h-1.2c.2.1.4.2.6.4Z"/>
<path class="cls-2" d="M2744.4-663.2c-24.3,17-44.8,37.5-60.5,60h22.5c13.7-17.2,30.4-32.7,49.1-45.7v-21.6c-3.8,2.4-7.5,4.8-11.1,7.4Z"/>
<path class="cls-2" d="M2736.8-694.1c6.1,4.5,12.4,8.7,18.8,12.6v-21.3c-2.8-1.8-5.5-3.7-8.1-5.7-16-11.8-29.8-25.3-41.5-40.3h-22.2c14.1,20.9,31.9,39.2,53,54.8Z"/>
<path class="cls-2" d="M2673.4-748.9h-22.1c-13.9,18.4-31.1,34.2-50.8,47v21.1c29.5-17.1,54.4-40.3,72.8-68.1Z"/>
<path class="cls-2" d="M2622.6-656c-7.1-5.4-14.5-10.3-22.1-14.9v21.3c3.8,2.5,7.5,5.2,11.2,7.9,14.8,11.3,27.8,24.1,39,38.4h22.3c-13.7-20-30.6-37.7-50.4-52.8Z"/>
<polygon class="cls-2" points="2912.4 -602.8 2831.7 -602.8 2831.7 -637.7 2793.8 -637.7 2793.8 -723.9 2832.2 -723.9 2832.2 -749 2875.4 -749 2875.4 -732 2849.2 -732 2849.2 -706.9 2810.8 -706.9 2810.8 -654.7 2848.7 -654.7 2848.7 -619.8 2912.4 -619.8 2912.4 -602.8"/>
<polygon class="cls-2" points="2944.5 -748 2944.5 -602.6 2955.1 -602.6 2955.1 -731.2 2996.9 -731.2 2996.9 -602.6 3017.3 -602.6 3017.3 -731.2 3060.3 -731.2 3060.3 -602.6 3085.9 -602.6 3085.9 -748 2944.5 -748"/>
<path class="cls-2" d="M3162.6-733.1c0,10.5-8.5,19.1-19.1,19.1s-19.1-8.5-19.1-19.1,8.5-19.1,19.1-19.1,19.1,8.5,19.1,19.1Z"/>
<circle class="cls-2" cx="3258" cy="-733.1" r="19.1"/>
<path class="cls-2" d="M3200.7-695.1c0,10.5-8.5,19.1-19,19.1s-19.1-8.5-19.1-19c0-10.5,8.5-19.1,19-19.1,10.5,0,19.1,8.5,19.1,19Z"/>
<circle class="cls-2" cx="3219.8" cy="-695.1" r="19.1"/>
<path class="cls-2" d="M3200.8-656.9c0,10.5-8.5,19.1-19,19.1-10.5,0-19.1-8.5-19.1-19s8.5-19.1,19-19.1,19.1,8.5,19.1,19Z"/>
<circle class="cls-2" cx="3219.9" cy="-656.9" r="19.1"/>
<path class="cls-2" d="M3162.6-618.6c0,10.5-8.5,19.1-19.1,19.1s-19.1-8.5-19.1-19.1,8.5-19.1,19.1-19.1,19.1,8.5,19.1,19.1Z"/>
<circle class="cls-2" cx="3258" cy="-618.6" r="19.1"/>
</g>
<g>
<path class="cls-2" d="M2765-1536.3c-27.7,19.4-51.1,42.7-69,68.4h25.6c15.6-19.6,34.6-37.3,56-52.1v-24.7c-4.3,2.7-8.5,5.5-12.7,8.4Z"/>
<path class="cls-2" d="M2756.2-1571.5c6.9,5.1,14.1,9.9,21.5,14.3v-24.3c-3.1-2.1-6.2-4.3-9.3-6.5-18.2-13.4-34-28.8-47.3-46h-25.3c16.1,23.8,36.3,44.8,60.4,62.5Z"/>
<path class="cls-2" d="M2683.9-1634h-25.2c-15.9,20.9-35.5,39-57.9,53.6v24.1c33.6-19.5,62-45.9,83.1-77.7Z"/>
<path class="cls-2" d="M2626-1528.1c-8.1-6.1-16.5-11.8-25.2-17v24.3c4.3,2.9,8.6,5.9,12.7,9.1,16.9,12.8,31.7,27.5,44.5,43.8h25.4c-15.7-22.8-34.9-43-57.5-60.2Z"/>
<polygon class="cls-2" points="2951.8 -1466.7 2859.7 -1466.7 2859.7 -1506.5 2816.6 -1506.5 2816.6 -1604.9 2860.3 -1604.9 2860.3 -1633.5 2909.6 -1633.5 2909.6 -1614.1 2879.7 -1614.1 2879.7 -1585.5 2835.9 -1585.5 2835.9 -1525.9 2879.1 -1525.9 2879.1 -1486.1 2951.8 -1486.1 2951.8 -1466.7"/>
<polygon class="cls-2" points="2600.8 -1442.6 2600.8 -1276.8 2612.9 -1276.8 2612.9 -1423.4 2660.5 -1423.4 2660.5 -1276.8 2683.9 -1276.8 2683.9 -1423.4 2732.9 -1423.4 2732.9 -1276.8 2762.1 -1276.8 2762.1 -1442.6 2600.8 -1442.6"/>
<path class="cls-2" d="M2854.6-1421c0,11.5-9.4,20.9-20.9,20.9s-20.9-9.4-20.9-20.9,9.4-20.9,20.9-20.9c11.5,0,20.9,9.4,20.9,20.9Z"/>
<circle class="cls-2" cx="2959.1" cy="-1421" r="20.9"/>
<path class="cls-2" d="M2896.4-1379.4c0,11.5-9.3,20.9-20.9,20.9-11.5,0-20.9-9.3-20.9-20.9,0-11.5,9.3-20.9,20.9-20.9,11.5,0,20.9,9.3,20.9,20.9Z"/>
<path class="cls-2" d="M2938.2-1379.5c0,11.5-9.3,20.9-20.9,20.9-11.5,0-20.9-9.3-20.9-20.9,0-11.5,9.3-20.9,20.9-20.9,11.5,0,20.9,9.3,20.9,20.9Z"/>
<path class="cls-2" d="M2896.5-1337.6c0,11.5-9.3,20.9-20.9,20.9-11.5,0-20.9-9.3-20.9-20.9,0-11.5,9.3-20.9,20.9-20.9,11.5,0,20.9,9.3,20.9,20.9Z"/>
<circle class="cls-2" cx="2917.4" cy="-1337.6" r="20.9"/>
<path class="cls-2" d="M2854.6-1295.6c0,11.5-9.4,20.9-20.9,20.9s-20.9-9.4-20.9-20.9,9.4-20.9,20.9-20.9c11.5,0,20.9,9.4,20.9,20.9Z"/>
<path class="cls-2" d="M2980-1295.6c0,11.5-9.4,20.9-20.9,20.9s-20.9-9.4-20.9-20.9,9.4-20.9,20.9-20.9c11.5,0,20.9,9.4,20.9,20.9Z"/>
</g>
<g>
<g>
<path class="cls-2" d="M215.5-1634c24.6.2,40.9,16,40.9,39.6s-15.6,43-38.9,43h-28.5l59,62.9h-25.2l-56.9-62.9h-12.6v62.9h-18.8v-145.5h81.1ZM153.2-1569.6h64c13.3-.2,21.6-9.6,21.6-23.8s-8.3-22.3-21.6-22.5h-64v46.2Z"/>
<path class="cls-2" d="M370.1-1536.7h-66.3l-19.5,48.1h-19.3l58.4-145.5h26.7l58.4,145.5h-19.3l-19.3-48.1ZM362.8-1554.9l-22.7-56.5-3.2-8.1-3.2,8.1-22.7,56.5h51.8Z"/>
<path class="cls-2" d="M489.5-1634c36.8.2,60.1,30.2,60.1,70.8s-19,74.7-61.4,74.7h-60.6v-145.5h61.8ZM446.5-1506.7h45.6c25.5,0,39.4-22,39.4-55.4s-16-53.5-40.2-53.7h-44.7v109.1h0Z"/>
<path class="cls-2" d="M656.9-1506.3v17.8h-94.1v-17.8h38.5v-110h-32.1v-17.8h81.3v17.8h-31.5v110h37.9Z"/>
</g>
<path class="cls-2" d="M369.1-1362h-66.3l-19.5,48.1h-19.3l58.4-145.5h26.7l58.4,145.5h-19.3l-19.3-48.1ZM361.8-1380.2l-22.7-56.5-3.2-8.1-3.2,8.1-22.7,56.5h51.8Z"/>
<path class="cls-2" d="M677.9-1459.1c24.6.2,40.9,16,40.9,39.6s-15.6,43-38.9,43h-59.9v62.9h-18.8v-145.5h76.8ZM619.9-1394.7h59.7c13.3-.2,21.6-9.6,21.6-23.8s-8.3-22.2-21.6-22.5h-59.7v46.2Z"/>
<path class="cls-2" d="M849.3-1356.6c-.2,29.7-20.5,47.3-54.8,47.3s-57.8-18.2-57.8-45.4v-104.4h19v102.1c.2,18.8,14.1,29.1,37.7,29.1s36.6-10.3,36.8-29.1v-102.1h19v102.5h0Z"/>
<path class="cls-2" d="M929.1-1327.5c17.8,0,30.8-6.8,30.8-21.4s-10.3-18.8-19.5-22c-11.8-4.1-21.4-5.6-35.1-9.6-17.1-5.1-29.7-19.7-29.7-40s15.6-42.6,47.7-42.6,38.1,4.1,55,22.5l-12.8,13.1c-15.2-14.8-34.2-17.3-43.2-17.3-17.3,0-27.8,11.1-27.8,23.5s6,19.3,20.1,23.3c7.3,2.1,18.6,5.4,34.4,10.1,23.5,7.1,29.7,21.4,29.7,38.7s-19.9,40-49.6,40-43.2-7.7-56.1-25.9l15.6-11.6c10.7,13.9,24.4,19.3,40.4,19.3Z"/>
<path class="cls-2" d="M535.8-1157.8v18.2h-103.2v-145.9h18.2v127.7h85Z"/>
<path class="cls-2" d="M253.1-1182c0,26.3-19.1,43-46,42.4l-9-.2h-63.4v-145.6h69.8c27.2,1.1,39,18.2,39,38.5s-3.9,21-9.2,27c10.7,7.3,18.8,20.8,18.8,37.9ZM152.9-1226.3h51.8c14.8,0,20.5-8.6,20.5-20.3s-5.6-20.6-24.2-20.6h-48.2v40.9h0ZM234.9-1183.5c0-13.5-7.3-24.6-24.8-24.6h-57.2v50.1h55c19.7,0,27-10.5,27-25.5Z"/>
<g>
<circle class="cls-2" cx="283.3" cy="-1267.3" r="18.3"/>
<circle class="cls-2" cx="393.3" cy="-1267.3" r="18.3"/>
<path class="cls-2" d="M338.3-1230.8c0,10.1-8.2,18.3-18.3,18.4-10.1,0-18.3-8.2-18.4-18.3,0-10.1,8.2-18.3,18.3-18.4,10.1,0,18.3,8.2,18.4,18.3Z"/>
<circle class="cls-2" cx="356.6" cy="-1230.8" r="18.3"/>
<path class="cls-2" d="M338.3-1194.2c0,10.1-8.2,18.3-18.3,18.4-10.1,0-18.3-8.2-18.4-18.3,0-10.1,8.2-18.3,18.3-18.4,10.1,0,18.3,8.2,18.4,18.3Z"/>
<circle class="cls-2" cx="356.6" cy="-1194.2" r="18.3"/>
<circle class="cls-2" cx="283.3" cy="-1157.3" r="18.3"/>
<circle class="cls-2" cx="393.3" cy="-1157.3" r="18.3"/>
</g>
<polygon class="cls-2" points="253.2 -1313.7 172.4 -1313.7 172.4 -1348.6 134.6 -1348.6 134.6 -1434.9 173 -1434.9 173 -1459.9 216.2 -1459.9 216.2 -1442.9 190 -1442.9 190 -1417.9 151.6 -1417.9 151.6 -1365.6 189.4 -1365.6 189.4 -1330.7 253.2 -1330.7 253.2 -1313.7"/>
<path class="cls-2" d="M756.8-1487.9h22.5c0,0,.1-.2.2-.3h-22.6c0,0-.1.2-.2.3Z"/>
<path class="cls-2" d="M673.4-1587.1v21.2c29.4-17.1,54.3-40.2,72.8-67.9h-22.2c-13.9,18.2-31,34-50.5,46.7Z"/>
<path class="cls-2" d="M828.7-1533.8v-21.7c-3.7,2.3-7.4,4.8-11.1,7.3-24.4,17.1-44.9,37.6-60.6,60.1h22.6c13.7-17.2,30.4-32.6,49.1-45.7Z"/>
<path class="cls-2" d="M695.5-1541c-7.1-5.4-14.5-10.4-22.1-14.9v21.3c3.8,2.5,7.5,5.2,11.2,7.9,14.8,11.3,27.9,24.2,39,38.5h22.4c-13.8-20.1-30.7-37.8-50.5-52.8Z"/>
<path class="cls-2" d="M820.6-1593.7c-15.9-11.7-29.7-25.1-41.3-40.1h-22.3c14.1,20.8,31.8,39.1,52.9,54.6,6.1,4.5,12.3,8.6,18.8,12.5v-21.4c-2.7-1.8-5.4-3.7-8.1-5.7Z"/>
<polygon class="cls-2" points="428 -1459.4 428 -1314.1 438.7 -1314.1 438.7 -1442.2 480.4 -1442.2 480.4 -1314.1 500.8 -1314.1 500.8 -1442.2 543.7 -1442.2 543.7 -1314.1 569.2 -1314.1 569.2 -1459.4 428 -1459.4"/>
</g>
<path class="cls-1" d="M1684.9,411c-11.5,0-20.9-9.3-20.9-20.9,0,11.5-9.3,20.9-20.9,20.9,11.5,0,20.9,9.3,20.9,20.9,0-11.5,9.3-20.9,20.9-20.9Z"/>
<path class="cls-2" d="M1646.7,283.4v-39.9h-43.1v-25.6c.2,0,.4-.1.6-.2-.2,0-.4-.1-.6-.2v-33.6h43.8v-28.6h29.8v-19.4h-49.2v28.6h-43.8v98.3h43.1v39.9h92.1v-19.4h-72.7Z"/>
<path class="cls-2" d="M1462.8,301.6h25.6c15.6-19.6,34.6-37.3,56-52.1v-24.7c-4.3,2.7-8.5,5.5-12.7,8.4-27.7,19.4-51.1,42.7-69,68.4Z"/>
<path class="cls-2" d="M1535.1,181.5c-18.2-13.4-34-28.8-47.3-46h-25.3c16.1,23.8,36.3,44.8,60.4,62.5,3.5,2.6,7.1,5.1,10.8,7.5,3.5,2.3,7.1,4.6,10.7,6.8v-24.3c-3.1-2.1-6.2-4.3-9.3-6.5Z"/>
<path class="cls-2" d="M1450.7,135.5h-25.2c-15.9,20.9-35.5,39-57.9,53.6v24.1c4.2-2.4,8.3-5,12.4-7.6,28.2-18.6,52.3-42.3,70.7-70.1Z"/>
<path class="cls-2" d="M1424.8,301.6h25.4c-15.7-22.8-34.9-43-57.5-60.2-8.1-6.1-16.5-11.8-25.2-17v24.3c4.3,2.9,8.6,5.9,12.7,9.1,16.9,12.8,31.7,27.5,44.5,43.8Z"/>
<polygon class="cls-2" points="1465.6 326.9 1447.3 326.9 1442.1 326.9 1369.8 326.9 1369.8 492.7 1382 492.7 1382 346.1 1429.6 346.1 1429.6 372 1429.6 492.7 1449.8 492.7 1452.9 492.7 1452.9 365.8 1452.9 347.6 1452.9 346.1 1460.7 346.1 1474.7 346.1 1501.9 346.1 1501.9 492.7 1531.1 492.7 1531.1 326.9 1470.8 326.9 1465.6 326.9"/>
<path class="cls-2" d="M1601.3,369.4c11.5,0,20.9-9.4,20.9-20.9s-9.4-20.9-20.9-20.9-20.9,9.4-20.9,20.9,9.4,20.9,20.9,20.9Z"/>
<circle class="cls-2" cx="1726.7" cy="348.5" r="20.9"/>
<path class="cls-2" d="M1664,390.1c0-11.5-9.4-20.9-20.9-20.9-11.5,0-20.9,9.4-20.9,20.9,0,11.5,9.4,20.9,20.9,20.9,11.5,0,20.9-9.4,20.9-20.9Z"/>
<circle class="cls-2" cx="1684.9" cy="390.1" r="20.9"/>
<path class="cls-2" d="M1643.1,411c-11.5,0-20.9,9.4-20.9,20.9,0,11.5,9.4,20.9,20.9,20.9,11.5,0,20.9-9.4,20.9-20.9,0-11.5-9.4-20.9-20.9-20.9Z"/>
<path class="cls-2" d="M1684.9,411c-11.5,0-20.9,9.4-20.9,20.9,0,11.5,9.4,20.9,20.9,20.9,11.5,0,20.9-9.4,20.9-20.9,0-11.5-9.4-20.9-20.9-20.9Z"/>
<path class="cls-2" d="M1601.3,453c-11.5,0-20.9,9.4-20.9,20.9s9.4,20.9,20.9,20.9,20.9-9.4,20.9-20.9c0-11.5-9.4-20.9-20.9-20.9Z"/>
<path class="cls-2" d="M1726.7,453c-11.5,0-20.9,9.4-20.9,20.9s9.4,20.9,20.9,20.9,20.9-9.4,20.9-20.9c0-11.5-9.4-20.9-20.9-20.9Z"/>
<path class="cls-2" d="M1900.6,139.4h-125.5c-5.5,0-10,5-10,11.1v85c0,6.1,4.5,11.1,10,11.1h18.5c.1,0,.2,0,.3,0h0s58.9,0,58.9,0h0c0,0,.1.2.1.3v19.2c0,.1,0,.2,0,.2h-30.1s0,0,0-.2v-10h-3.7v10c0,2.2,1.7,3.9,3.8,3.9h30.1c2.1,0,3.8-1.8,3.8-3.9v-19.2c0-.1,0-.2,0-.3h25.1c.1,0,.2,0,.3,0h18.5c5.5,0,10-5,10-11.1v-85c0-6.1-4.5-11.1-10-11.1ZM1790.1,238.2v-59.5c0-2.5,1.7-4.6,3.8-4.6h87.8c2.1,0,3.8,2.1,3.8,4.6v59.5c0,2.5-1.6,4.5-3.7,4.6h-8c.3-.8.5-1.7.5-2.7v-41.6c0-3.5-2.6-6.4-5.8-6.4h-61.5c-3.2,0-5.8,2.9-5.8,6.4v41.6c0,1,.2,1.9.5,2.7h-8c-2,0-3.7-2.1-3.7-4.6ZM1822.7,242.4v-20.4c0-.2,0-.3,0-.4h30.1s.1.1.1.3v20.4c0,.2,0,.3,0,.3h0s-30.1,0-30.1,0h0s-.1-.2-.1-.4ZM1852.9,218h-30.1c-2.1,0-3.8,1.8-3.8,4.1v20.4c0,.1,0,.2,0,.4h-2.7c-.5,0-.9-.6-.9-1.3v-29.1c0-.7.4-1.3.9-1.3h43c.5,0,.9.6.9,1.3v29.1c0,.7-.4,1.3-.9,1.3h0s-2.7,0-2.7,0c0-.1,0-.2,0-.4v-20.4c0-2.2-1.7-4.1-3.8-4.1ZM1859.4,207.3h-43c-2.6,0-4.6,2.2-4.6,5v29.1c0,.5,0,.9.2,1.3h-4.8c-1.2,0-2.1-1.2-2.1-2.7v-41.6c0-1.5,1-2.6,2.1-2.6h61.5c1.2,0,2.1,1.2,2.1,2.6v41.6c0,1.5-1,2.6-2.1,2.6h0s-4.8,0-4.8,0c.1-.4.2-.9.2-1.3v-29.1c0-2.8-2.1-5-4.6-5ZM1906.9,235.4c0,4.1-2.8,7.3-6.3,7.3h-12.5c.8-1.3,1.3-2.9,1.3-4.6v-59.5c0-4.6-3.4-8.3-7.6-8.3h-87.8c-4.2,0-7.6,3.7-7.6,8.3v59.5c0,1.7.5,3.3,1.3,4.6h-12.5c-3.5,0-6.3-3.3-6.3-7.3v-85c0-4.1,2.8-7.3,6.3-7.3h125.5c3.5,0,6.3,3.3,6.3,7.3v85h0Z"/>
<path class="cls-2" d="M2058,139h-126.3c-5.5,0-10,4.8-10,10.6v42.1h3.7v-42.1c0-3.8,2.8-6.9,6.3-6.9h126.3c3.5,0,6.3,3.1,6.3,6.9v80.9c0,3.3-2.8,7.1-6.3,7.1h-12.6c.8-1.3,1.2-2.8,1.2-4.4v-56.6c0-4.4-3.4-8-7.6-8h-88.4c-4.2,0-7.6,3.6-7.6,8v29.5h3.7v-29.5c0-2.4,1.7-4.3,3.9-4.3h88.4c2.1,0,3.9,1.9,3.9,4.3v56.6c0,2.4-1.8,4.4-3.9,4.4h0s-7.9,0-7.9,0c.3-.8.5-1.6.5-2.5v-39.6c0-3.4-2.6-6.1-5.9-6.1h-61.9c-3.2,0-5.9,2.8-5.9,6.1v20.6h3.7v-20.6c0-1.3,1-2.4,2.2-2.4h61.9c1.2,0,2.2,1.1,2.2,2.4v39.6c0,1.3-.9,2.4-1.9,2.5h-5c0-.4.2-.8.2-1.2v-27.7c0-2.7-2.1-4.9-4.7-4.9h-43.3c-2.6,0-4.7,2.2-4.7,4.9v14.4h3.7v-14.4c0-.6.4-1.1,1-1.1h43.3c.5,0,.9.5.9,1.1v27.7c0,.6-.4,1.2-.9,1.2h0s-2.7,0-2.7,0c0-.1,0-.2,0-.3v-19.4c0-2.2-1.7-4-3.8-4h-30.3c-2.1,0-3.8,1.8-3.8,4v10.1h3.7v-10.1c0-.2,0-.2.1-.2h30.3s.1,0,.1.2v19.4c0,.2,0,.3-.1.3h0s-30.1,0-30.1,0v3.7s45.9,0,45.9,0h0c.2,0,.4,0,.6,0h31.6c5.4,0,10-5,10-10.8v-80.9c0-5.9-4.5-10.6-10-10.6Z"/>
<path class="cls-2" d="M2010.1,261c0,.2,0,.2-.1.2h-30.3s-.1,0-.1-.2v-19.4c0-.2,0-.3.1-.3v-3.7c-2.1,0-3.8,1.8-3.8,4v19.4c0,2.2,1.7,4,3.8,4h30.3c2.1,0,3.8-1.8,3.8-4v-10.1h-3.7v10.1Z"/>
<path class="cls-2" d="M2225,336.8h-3.7v-186c0-3.8-2.8-6.9-6.2-6.9h-124.4c-3.4,0-6.2,3.1-6.2,6.9h-3.7c0-5.8,4.5-10.6,9.9-10.6h124.4c5.5,0,9.9,4.7,9.9,10.6v186Z"/>
<path class="cls-2" d="M2203.9,307.6h-3.7v-130.2c0-2.3-1.7-4.3-3.8-4.3h-87.1c-2.1,0-3.8,1.9-3.8,4.3h-3.7c0-4.4,3.4-8,7.5-8h87.1c4.1,0,7.5,3.6,7.5,8v130.2Z"/>
<path class="cls-2" d="M2189.2,287.2h-3.7v-91.2c0-1.3-.9-2.4-2.1-2.4h-61c-1.2,0-2.1,1.1-2.1,2.4h-3.7c0-3.4,2.6-6.1,5.8-6.1h61c3.2,0,5.8,2.8,5.8,6.1v91.2h0Z"/>
<path class="cls-2" d="M2178.8,272.8h-3.7v-63.8c0-.6-.4-1.1-.9-1.1h-42.7c-.5,0-.9.5-.9,1.1h-3.7c0-2.7,2.1-4.9,4.6-4.9h42.7c2.6,0,4.6,2.2,4.6,4.9v63.8h0Z"/>
<path class="cls-2" d="M2171.6,262.8h-3.7v-44.7c0-.2,0-.2,0-.2h-29.9s0,0,0,.2h-3.7c0-2.2,1.7-4,3.8-4h29.9c2.1,0,3.8,1.8,3.8,4v44.7Z"/>
<path class="cls-2" d="M2137.8,265.9c-2.1,0-3.8-1.8-3.8-4h3.7c0,.2,0,.3.1.3v3.7Z"/>
<path class="cls-2" d="M2131.5,276.2c-2.5,0-4.6-2.2-4.6-4.9h3.7c0,.6.4,1.2.9,1.2v3.7h0Z"/>
<path class="cls-2" d="M2122.3,291.6c-3.2,0-5.8-2.8-5.8-6.3h3.7c0,1.4.9,2.5,2.1,2.5v3.7h0Z"/>
<path class="cls-2" d="M2109.4,312.3c-4.1,0-7.5-3.7-7.5-8.1h3.7c0,2.4,1.7,4.4,3.7,4.4v3.7h0Z"/>
<path class="cls-2" d="M2090.4,344.1c-5.5,0-9.9-4.9-9.9-10.9h3.7c0,4,2.8,7.2,6.2,7.2v3.7Z"/>
<g>
<path class="cls-2" d="M1157.8,206.6v9.8h-55.5v-78.5h9.8v68.7h45.7Z"/>
<path class="cls-2" d="M1005.1,193.6c0,14.2-10.2,23.1-24.8,22.8h-4.8c0-.1-34.1-.1-34.1-.1v-78.3h37.5c14.6.6,21,9.8,21,20.7s-2.1,11.3-5,14.5c5.8,3.9,10.1,11.2,10.1,20.4ZM951.2,169.7h27.9c7.9,0,11.1-4.6,11.1-10.9s-3-11.1-13-11.1h-25.9v22h0ZM995.3,192.8c0-7.3-3.9-13.2-13.4-13.2h-30.8v26.9h29.6c10.6,0,14.5-5.6,14.5-13.7Z"/>
<circle class="cls-2" cx="1021.5" cy="147.7" r="9.9" transform="translate(643.1 1108) rotate(-76.7)"/>
<circle class="cls-2" cx="1080.7" cy="147.7" r="9.9"/>
<circle class="cls-2" cx="1041.3" cy="167.3" r="9.9"/>
<path class="cls-2" d="M1070.8,167.3c0,5.4-4.4,9.9-9.8,9.9-5.4,0-9.9-4.4-9.9-9.8,0-5.4,4.4-9.9,9.8-9.9,5.4,0,9.9,4.4,9.9,9.8Z"/>
<circle class="cls-2" cx="1041.3" cy="187" r="9.9"/>
<circle class="cls-2" cx="1061" cy="187" r="9.9"/>
<circle class="cls-2" cx="1021.5" cy="206.8" r="9.9" transform="translate(585.5 1153.5) rotate(-76.7)"/>
<circle class="cls-2" cx="1080.7" cy="206.8" r="9.9"/>
<path class="cls-2" d="M574.6,189.6h-35.7l-10.5,25.9h-10.4l31.4-78.3h14.4l31.4,78.3h-10.4l-10.4-25.9ZM570.7,179.8l-12.2-30.4-1.7-4.4-1.7,4.4-12.2,30.4h27.9Z"/>
<path class="cls-2" d="M740.7,137.3c13.2.1,22,8.6,22,21.3s-8.4,23.1-21,23.1h-32.2v33.8h-10.1v-78.3h41.3ZM709.5,172h32.1c7.1-.1,11.6-5.2,11.6-12.8s-4.5-12-11.6-12.1h-32.1v24.9Z"/>
<path class="cls-2" d="M832.9,192.5c-.1,16-11.1,25.4-29.5,25.4s-31.1-9.8-31.1-24.4v-56.2h10.2v54.9c.1,10.1,7.6,15.7,20.3,15.7s19.7-5.5,19.8-15.7v-54.9h10.2v55.1Z"/>
<path class="cls-2" d="M875.9,208.1c9.6,0,16.6-3.7,16.6-11.5s-5.5-10.1-10.5-11.9c-6.3-2.2-11.5-3-18.9-5.2-9.2-2.8-16-10.6-16-21.5s8.4-22.9,25.7-22.9,20.5,2.2,29.6,12.1l-6.9,7c-8.2-7.9-18.4-9.3-23.3-9.3-9.3,0-15,6-15,12.7s3.2,10.4,10.8,12.5c3.9,1.2,10,2.9,18.5,5.4,12.7,3.8,16,11.5,16,20.8s-10.7,21.5-26.7,21.5-23.3-4.1-30.2-13.9l8.4-6.2c5.8,7.5,13.1,10.4,21.8,10.4Z"/>
<polygon class="cls-2" points="512.3 215.6 468.8 215.6 468.8 196.8 448.4 196.8 448.4 150.4 469.1 150.4 469.1 136.9 492.3 136.9 492.3 146 478.2 146 478.2 159.5 457.6 159.5 457.6 187.6 477.9 187.6 477.9 206.4 512.3 206.4 512.3 215.6"/>
<path class="cls-2" d="M73.2,137.2c13.2.1,22,8.6,22,21.3s-8.4,23.1-21,23.1h-15.3l31.8,33.9h-13.6l-30.6-33.9h-6.8v33.8h-10.1v-78.3h43.6ZM39.7,171.9h34.4c7.1-.1,11.6-5.2,11.6-12.8s-4.5-12-11.6-12.1h-34.4v24.9Z"/>
<path class="cls-2" d="M156.4,189.6h-35.7l-10.5,25.9h-10.4l31.4-78.3h14.4l31.4,78.3h-10.4l-10.4-25.9ZM152.5,179.8l-12.2-30.4-1.7-4.4-1.7,4.4-12.2,30.4h27.9Z"/>
<path class="cls-2" d="M220.7,137.2c19.8.1,32.3,16.2,32.3,38.1s-10.2,40.2-33,40.2h-32.6v-78.3h33.3ZM197.5,205.7h24.5c13.7,0,21.2-11.9,21.2-29.8s-8.6-28.8-21.6-28.9h-24.1v58.7Z"/>
<path class="cls-2" d="M310.7,205.9v9.6h-50.6v-9.6h20.7v-59.2h-17.3v-9.6h43.7v9.6h-16.9v59.2h20.4Z"/>
<polygon class="cls-2" points="612 215.7 612 146.2 634.5 146.2 634.5 215.7 645.5 215.7 645.5 146.2 668.6 146.2 668.6 215.7 682.4 215.7 682.4 136.7 606.3 136.7 606.3 215.7 612 215.7"/>
<path class="cls-2" d="M319.6,162.4v11.4c15.8-9.2,29.1-21.6,39.1-36.5h-11.9c-7.5,9.8-16.6,18.2-27.1,25.1Z"/>
<path class="cls-2" d="M403,191v-11.7c-2,1.3-4,2.6-5.9,3.9-13.1,9.2-24.2,20.2-32.6,32.4h12.1c7.4-9.3,16.4-17.6,26.5-24.7Z"/>
<path class="cls-2" d="M319.6,190.6c2,1.4,4,2.8,6,4.3,8,6.1,15,13,21,20.7h12c-7.4-10.8-16.5-20.3-27.1-28.4-3.8-2.9-7.8-5.6-11.9-8v11.4h0Z"/>
<path class="cls-2" d="M403,161.9c-1.5-1-2.9-2-4.3-3-8.5-6.3-15.9-13.5-22.2-21.5h-12c7.6,11.1,17.1,21,28.4,29.3,3.2,2.4,6.6,4.6,10.1,6.7v-11.5h0Z"/>
</g>
<g id="small">
<g>
<path class="cls-2" d="M605.8,679.6h-35.7l-10.5,25.9h-10.4l31.4-78.3h14.4l31.4,78.3h-10.4l-10.4-25.9ZM601.8,669.8l-12.2-30.4-1.7-4.4-1.7,4.4-12.2,30.4h27.9Z"/>
<path class="cls-2" d="M771.9,627.3c13.2.1,22,8.6,22,21.3s-8.4,23.1-21,23.1h-32.2v33.8h-10.1v-78.3h41.3ZM740.7,662h32.1c7.1-.1,11.6-5.2,11.6-12.8s-4.5-12-11.6-12.1h-32.1v24.9Z"/>
<path class="cls-2" d="M864.1,682.5c-.1,16-11.1,25.4-29.5,25.4s-31.1-9.8-31.1-24.4v-56.2h10.2v54.9c.1,10.1,7.6,15.7,20.3,15.7s19.7-5.5,19.8-15.7v-54.9h10.2v55.1Z"/>
<path class="cls-2" d="M907,698.1c9.6,0,16.6-3.7,16.6-11.5s-5.5-10.1-10.5-11.9c-6.3-2.2-11.5-3-18.9-5.2-9.2-2.8-16-10.6-16-21.5s8.4-22.9,25.7-22.9,20.5,2.2,29.6,12.1l-6.9,7c-8.2-7.9-18.4-9.3-23.3-9.3-9.3,0-15,6-15,12.7s3.2,10.4,10.8,12.5c3.9,1.2,10,2.9,18.5,5.4,12.7,3.8,16,11.5,16,20.8s-10.7,21.5-26.7,21.5-23.3-4.1-30.2-13.9l8.4-6.2c5.8,7.5,13.1,10.4,21.8,10.4Z"/>
<polygon class="cls-2" points="543.4 705.6 500 705.6 500 686.8 479.6 686.8 479.6 640.4 500.3 640.4 500.3 626.9 523.5 626.9 523.5 636 509.4 636 509.4 649.5 488.7 649.5 488.7 677.6 509.1 677.6 509.1 696.4 543.4 696.4 543.4 705.6"/>
<path class="cls-2" d="M104.4,627.2c13.2.1,22,8.6,22,21.3s-8.4,23.1-21,23.1h-15.3l31.8,33.9h-13.6l-30.6-33.9h-6.8v33.8h-10.1v-78.3h43.6ZM70.9,661.9h34.4c7.1-.1,11.6-5.2,11.6-12.8s-4.5-12-11.6-12.1h-34.4v24.9Z"/>
<path class="cls-2" d="M187.6,679.6h-35.7l-10.5,25.9h-10.4l31.4-78.3h14.4l31.4,78.3h-10.4l-10.4-25.9ZM183.7,669.8l-12.2-30.4-1.7-4.4-1.7,4.4-12.2,30.4h27.9Z"/>
<path class="cls-2" d="M251.8,627.2c19.8.1,32.3,16.2,32.3,38.1s-10.2,40.2-33,40.2h-32.6v-78.3h33.3ZM228.7,695.7h24.5c13.7,0,21.2-11.9,21.2-29.8s-8.6-28.8-21.6-28.9h-24.1v58.7h0Z"/>
<path class="cls-2" d="M341.9,695.9v9.6h-50.6v-9.6h20.7v-59.2h-17.3v-9.6h43.7v9.6h-16.9v59.2h20.4Z"/>
<polygon class="cls-2" points="643.2 705.7 643.2 636.2 665.7 636.2 665.7 705.7 676.7 705.7 676.7 636.2 699.8 636.2 699.8 705.7 713.6 705.7 713.6 626.7 637.4 626.7 637.4 705.7 643.2 705.7"/>
<path class="cls-2" d="M350.8,652.4v11.4c15.8-9.2,29.1-21.6,39.1-36.5h-11.9c-7.5,9.8-16.6,18.2-27.1,25.1Z"/>
<path class="cls-2" d="M434.1,681v-11.7c-2,1.3-4,2.6-5.9,3.9-13.1,9.2-24.2,20.2-32.6,32.4h12.1c7.4-9.3,16.4-17.6,26.5-24.7Z"/>
<path class="cls-2" d="M350.8,680.6c2,1.4,4,2.8,6,4.3,8,6,15,13,21,20.7h12c-7.4-10.8-16.5-20.3-27.1-28.4-3.8-2.9-7.8-5.6-11.9-8v11.5h0Z"/>
<path class="cls-2" d="M434.1,651.9c-1.5-1-2.9-2-4.3-3-8.5-6.3-15.9-13.5-22.2-21.5h-12c7.6,11.1,17.1,21,28.4,29.3,3.2,2.4,6.6,4.6,10.1,6.7v-11.5Z"/>
<g>
<path class="cls-2" d="M963.9,677.9c0,5.5-4.4,10-9.9,10-5.5,0-10-4.4-10-9.9,0-5.5,4.4-10,9.9-10,5.5,0,10,4.4,10,9.9Z"/>
<circle class="cls-2" cx="973.8" cy="677.8" r="10"/>
<circle class="cls-2" cx="954" cy="697.8" r="10"/>
<circle class="cls-2" cx="973.9" cy="697.8" r="10"/>
<path class="cls-2" d="M1058.4,683.5c0,14.2-10.2,23.1-24.8,22.8h-4.8c0-.1-34.1-.1-34.1-.1v-78.3h37.5c14.6.6,21,9.8,21,20.7s-2.1,11.3-5,14.5c5.8,3.9,10.1,11.2,10.1,20.4ZM1004.5,659.7h27.9c7.9,0,11.1-4.6,11.1-10.9s-3-11.1-13-11.1h-25.9v22h0ZM1048.6,682.7c0-7.3-3.9-13.2-13.4-13.2h-30.7v26.9h29.6c10.6,0,14.5-5.6,14.5-13.7Z"/>
<path class="cls-2" d="M1077.9,637.7v22h41.6v9.8h-41.6v26.9h46.2v9.8h-55.9v-78.3h55.9v9.8h-46.2Z"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 33 KiB

View File

@ -0,0 +1,69 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Calque_1" data-name="Calque 1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 1190.6 841.9">
<defs>
<style>
.cls-1 {
fill: #000;
stroke-width: 0px;
}
</style>
</defs>
<g>
<path class="cls-1" d="M80,318.5c14.5.1,24.2,9.5,24.2,23.4s-9.2,25.4-23,25.4h-16.8l34.9,37.2h-14.9l-33.6-37.2h-7.4v37.2h-11.1v-86h47.9,0ZM43.2,356.6h37.8c7.9-.1,12.8-5.7,12.8-14.1s-4.9-13.2-12.8-13.3h-37.8v27.3h0Z"/>
<path class="cls-1" d="M171.4,376.1h-39.2l-11.5,28.4h-11.4l34.5-86h15.8l34.5,86h-11.4l-11.4-28.4h.1ZM167.1,365.4l-13.4-33.4-1.9-4.8-1.9,4.8-13.4,33.4h30.6,0Z"/>
<path class="cls-1" d="M242,318.5c21.8.1,35.5,17.9,35.5,41.9s-11.2,44.2-36.3,44.2h-35.8v-86h36.6ZM216.6,393.8h27c15.1,0,23.3-13,23.3-32.7s-9.5-31.6-23.8-31.7h-26.4v64.5h0Z"/>
<path class="cls-1" d="M341,394v10.5h-55.6v-10.5h22.8v-65h-19v-10.5h48.1v10.5h-18.6v65h22.4,0Z"/>
<path class="cls-1" d="M170.9,479.3h-39.2l-11.5,28.4h-11.4l34.5-86h15.8l34.5,86h-11.4l-11.4-28.4h.1ZM166.5,468.6l-13.4-33.4-1.9-4.8-1.9,4.8-13.4,33.4h30.6,0Z"/>
<path class="cls-1" d="M353.4,421.9c14.5.1,24.2,9.5,24.2,23.4s-9.2,25.4-23,25.4h-35.4v37.2h-11.1v-86h45.4,0ZM319.1,460h35.3c7.9-.1,12.8-5.7,12.8-14.1s-4.9-13.1-12.8-13.3h-35.3v27.3h0Z"/>
<path class="cls-1" d="M454.7,482.5c-.1,17.6-12.1,28-32.4,28s-34.2-10.8-34.2-26.8v-61.7h11.2v60.4c.1,11.1,8.3,17.2,22.3,17.2s21.6-6.1,21.8-17.2v-60.4h11.2v60.6h0Z"/>
<path class="cls-1" d="M501.9,499.7c10.5,0,18.2-4,18.2-12.7s-6.1-11.1-11.5-13c-7-2.4-12.6-3.3-20.7-5.7-10.1-3-17.6-11.6-17.6-23.6s9.2-25.2,28.2-25.2,22.5,2.4,32.5,13.3l-7.6,7.7c-9-8.7-20.2-10.2-25.5-10.2-10.2,0-16.4,6.6-16.4,13.9s3.5,11.4,11.9,13.8c4.3,1.2,11,3.2,20.3,6,13.9,4.2,17.6,12.7,17.6,22.9s-11.8,23.6-29.3,23.6-25.5-4.6-33.2-15.3l9.2-6.9c6.3,8.2,14.4,11.4,23.9,11.4h0Z"/>
<polygon class="cls-1" points="205.7 421.8 205.7 507.6 212 507.6 212 431.7 236.6 431.7 236.6 507.6 248.7 507.6 248.7 431.7 274.1 431.7 274.1 507.6 289.3 507.6 289.3 421.8 205.7 421.8"/>
<polygon class="cls-1" points="102.3 507.9 54.6 507.9 54.6 487.3 32.2 487.3 32.2 436.2 54.9 436.2 54.9 421.5 80.4 421.5 80.4 431.5 65 431.5 65 446.3 42.3 446.3 42.3 477.2 64.6 477.2 64.6 497.8 102.3 497.8 102.3 507.9"/>
<path class="cls-1" d="M435.7,369.1c-14.4,10-26.5,22.2-35.8,35.5h13.3c8.1-10.2,18-19.3,29-27v-12.8c-2.2,1.4-4.4,2.8-6.6,4.4h0Z"/>
<path class="cls-1" d="M431.2,350.9c3.6,2.7,7.3,5.1,11.1,7.4v-12.6c-1.7-1.1-3.3-2.2-4.8-3.4-9.5-7-17.6-15-24.5-23.8h-13.1c8.3,12.4,18.9,23.2,31.3,32.4h0Z"/>
<path class="cls-1" d="M393.8,318.5h-13.1c-8.2,10.9-18.4,20.2-30,27.8v12.5c17.4-10.1,32.2-23.8,43.1-40.3Z"/>
<path class="cls-1" d="M363.7,373.4c-4.2-3.2-8.6-6.1-13.1-8.8v12.6c2.2,1.5,4.4,3.1,6.6,4.7,8.7,6.7,16.4,14.2,23.1,22.7h13.2c-8.1-11.8-18.1-22.3-29.8-31.2h0Z"/>
<g>
<path class="cls-1" d="M56.7,579.5c0,6-4.8,10.9-10.9,10.9s-10.9-4.8-10.9-10.9,4.9-10.9,10.9-10.9,10.9,4.9,10.9,10.9Z"/>
<path class="cls-1" d="M78.5,579.5c0,6-4.8,10.9-10.9,10.9s-10.9-4.8-10.9-10.9,4.9-10.9,10.9-10.9,10.9,4.8,10.9,10.9Z"/>
<path class="cls-1" d="M56.7,601.4c0,6-4.9,10.9-10.9,10.9s-10.9-4.8-10.9-10.9,4.8-10.9,10.9-10.9,10.9,4.8,10.9,10.9Z"/>
<circle class="cls-1" cx="67.6" cy="601.4" r="10.9"/>
</g>
<g>
<path class="cls-1" d="M160.5,585.8c0,15.5-11.2,25.4-27.2,25.1h-5.3c0-.1-37.4-.1-37.4-.1v-86h41.3c16.1.7,23,10.8,23,22.8s-2.3,12.4-5.4,16c6.3,4.3,11.1,12.3,11.1,22.4h0ZM101.2,559.6h30.6c8.7,0,12.1-5.1,12.1-12s-3.3-12.1-14.3-12.1h-28.4v24.2h0ZM149.7,584.9c0-8-4.3-14.5-14.7-14.5h-33.8v29.6h32.5c11.6,0,16-6.2,16-15.1h0Z"/>
<path class="cls-1" d="M182,535.4v24.2h45.6v10.8h-45.6v29.6h50.7v10.8h-61.5v-86h61.5v10.8h-50.7Z"/>
</g>
<g>
<path class="cls-1" d="M402,556.2c0,41.1-10,57.5-31.4,57.5s-23.3-6.1-28.2-15.2l8.3-6c3.9,7.2,10.1,10.6,20.4,10.6s19.1-7.3,20.4-26.2c-5.3,4.7-12.5,7.7-20.5,7.7-18.7,0-30.9-14.2-30.9-28.5s12.3-33.6,30.9-33.6,31,14.3,31,33.6h0ZM392.5,554.3c0-13.7-10.4-20.3-21.4-20.3s-20.5,6.6-20.5,20.3,8.7,19.7,20.5,19.7,21.4-8,21.4-19.7Z"/>
<path class="cls-1" d="M470.4,600.2v10.9h-54.7v-10.9c33.9-25.2,42.4-35.9,42.4-49.5s-6.7-17.1-18.7-17.1-19.5,6.7-15.8,23.2l-10.1,4.7c-5.4-17.9,2.8-39,27-39s28,10.8,28,26-12.4,35.2-37.2,51.8h39.3Z"/>
<path class="cls-1" d="M489.4,598.1v13h-13v-13h13Z"/>
<path class="cls-1" d="M520.6,525.1h10.9v86.2h-10.9v-72.5l-23.1,22.4v-13.4l23.1-22.6Z"/>
</g>
</g>
<g>
<path class="cls-1" d="M1157.8,206.6v9.8h-55.5v-78.5h9.8v68.7h45.7Z"/>
<path class="cls-1" d="M1005.1,193.6c0,14.2-10.2,23.1-24.8,22.8h-4.8c0-.1-34.1-.1-34.1-.1v-78.3h37.5c14.6.6,21,9.8,21,20.7s-2.1,11.3-5,14.5c5.8,3.9,10.1,11.2,10.1,20.4h0ZM951.2,169.7h27.9c7.9,0,11.1-4.6,11.1-10.9s-3-11.1-13-11.1h-25.9v22h0ZM995.3,192.8c0-7.3-3.9-13.2-13.4-13.2h-30.8v26.9h29.6c10.6,0,14.5-5.6,14.5-13.7h.1Z"/>
<circle class="cls-1" cx="1021.8" cy="147.9" r="9.9" transform="translate(642.9 1108.3) rotate(-76.7)"/>
<circle class="cls-1" cx="1080.7" cy="147.7" r="9.9"/>
<circle class="cls-1" cx="1041.3" cy="167.3" r="9.9"/>
<path class="cls-1" d="M1070.8,167.3c0,5.4-4.4,9.9-9.8,9.9s-9.9-4.4-9.9-9.8,4.4-9.9,9.8-9.9,9.9,4.4,9.9,9.8Z"/>
<circle class="cls-1" cx="1041.3" cy="187" r="9.9"/>
<circle class="cls-1" cx="1061" cy="187" r="9.9"/>
<circle class="cls-1" cx="1021.7" cy="207" r="9.9" transform="translate(585.3 1153.7) rotate(-76.7)"/>
<circle class="cls-1" cx="1080.7" cy="206.8" r="9.9"/>
<path class="cls-1" d="M574.6,189.6h-35.7l-10.5,25.9h-10.4l31.4-78.3h14.4l31.4,78.3h-10.4l-10.4-25.9h.2ZM570.7,179.8l-12.2-30.4-1.7-4.4-1.7,4.4-12.2,30.4h27.9,0Z"/>
<path class="cls-1" d="M740.7,137.3c13.2.1,22,8.6,22,21.3s-8.4,23.1-21,23.1h-32.2v33.8h-10.1v-78.3h41.3ZM709.5,172h32.1c7.1-.1,11.6-5.2,11.6-12.8s-4.5-12-11.6-12.1h-32.1v24.9h0Z"/>
<path class="cls-1" d="M832.9,192.5c0,16-11.1,25.4-29.5,25.4s-31.1-9.8-31.1-24.4v-56.2h10.2v54.9c0,10.1,7.6,15.7,20.3,15.7s19.7-5.5,19.8-15.7v-54.9h10.2v55.1h0Z"/>
<path class="cls-1" d="M875.9,208.1c9.6,0,16.6-3.7,16.6-11.5s-5.5-10.1-10.5-11.9c-6.3-2.2-11.5-3-18.9-5.2-9.2-2.8-16-10.6-16-21.5s8.4-22.9,25.7-22.9,20.5,2.2,29.6,12.1l-6.9,7c-8.2-7.9-18.4-9.3-23.3-9.3-9.3,0-15,6-15,12.7s3.2,10.4,10.8,12.5c3.9,1.2,10,2.9,18.5,5.4,12.7,3.8,16,11.5,16,20.8s-10.7,21.5-26.7,21.5-23.3-4.1-30.2-13.9l8.4-6.2c5.8,7.5,13.1,10.4,21.8,10.4h.1Z"/>
<polygon class="cls-1" points="512.3 215.6 468.8 215.6 468.8 196.8 448.4 196.8 448.4 150.4 469.1 150.4 469.1 136.9 492.3 136.9 492.3 146 478.2 146 478.2 159.5 457.6 159.5 457.6 187.6 477.9 187.6 477.9 206.4 512.3 206.4 512.3 215.6"/>
<path class="cls-1" d="M73.2,137.2c13.2.1,22,8.6,22,21.3s-8.4,23.1-21,23.1h-15.3l31.8,33.9h-13.6l-30.6-33.9h-6.8v33.8h-10.1v-78.3h43.6ZM39.7,171.9h34.4c7.1-.1,11.6-5.2,11.6-12.8s-4.5-12-11.6-12.1h-34.4v24.9h0Z"/>
<path class="cls-1" d="M156.4,189.6h-35.7l-10.5,25.9h-10.4l31.4-78.3h14.4l31.4,78.3h-10.4l-10.4-25.9h.2ZM152.5,179.8l-12.2-30.4-1.7-4.4-1.7,4.4-12.2,30.4h27.9-.1Z"/>
<path class="cls-1" d="M220.7,137.2c19.8.1,32.3,16.2,32.3,38.1s-10.2,40.2-33,40.2h-32.6v-78.3h33.3ZM197.5,205.7h24.5c13.7,0,21.2-11.9,21.2-29.8s-8.6-28.8-21.6-28.9h-24.1v58.7h0Z"/>
<path class="cls-1" d="M310.7,205.9v9.6h-50.6v-9.6h20.7v-59.2h-17.3v-9.6h43.7v9.6h-16.9v59.2h20.4,0Z"/>
<polygon class="cls-1" points="612 215.7 612 146.2 634.5 146.2 634.5 215.7 645.5 215.7 645.5 146.2 668.6 146.2 668.6 215.7 682.4 215.7 682.4 136.7 606.3 136.7 606.3 215.7 612 215.7"/>
<path class="cls-1" d="M319.6,162.4v11.4c15.8-9.2,29.1-21.6,39.1-36.5h-11.9c-7.5,9.8-16.6,18.2-27.1,25.1h-.1Z"/>
<path class="cls-1" d="M403,191v-11.7c-2,1.3-4,2.6-5.9,3.9-13.1,9.2-24.2,20.2-32.6,32.4h12.1c7.4-9.3,16.4-17.6,26.5-24.7h-.1Z"/>
<path class="cls-1" d="M319.6,190.6c2,1.4,4,2.8,6,4.3,8,6.1,15,13,21,20.7h12c-7.4-10.8-16.5-20.3-27.1-28.4-3.8-2.9-7.8-5.6-11.9-8v11.4h0Z"/>
<path class="cls-1" d="M403,161.9c-1.5-1-2.9-2-4.3-3-8.5-6.3-15.9-13.5-22.2-21.5h-12c7.6,11.1,17.1,21,28.4,29.3,3.2,2.4,6.6,4.6,10.1,6.7v-11.5h0Z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.9 KiB

View File

@ -1,108 +1,574 @@
:root {
--heading-font-family: "campus_heading";
--nav-bg: #6c7ed2;
--nav-secondary-bg: #F7F7F6;
--nav-hv-bg: unset;
--nav-active-bg: unset;
--a-player-bar-bg: #F7F7F6; /*linear-gradient(rgba(126, 159, 244, 0.9), rgba(126, 159, 244, 1)) 0% 0% / cover;*/
--a-player-bar-bg: #738EF2;
--a-player-bar-fg: #4897c7;
--a-player-url-fg: white;
--a-playlist-header-bg: #F6ED80;;
--a-playlist-header-fg: #222;
--a-player-panel-bg: #738ef2;
--a-player-panel-fg: white;
--a-sound-hv-bg: #f6ed80;
--a-sound-hv-fg: #444;
--a-sound-bg: #f6ed80;
--body-bg: unset;
--text-color: #eee;
--main-color-light: #F4F881;
--button-bg: #F4F88D;
--button-fg: #555;
--break-color: transparent;
--button-bg: #e9e9ed;
--button-fg: #222;
--button-hv-bg: #F4F88D;
--button-hv-fg: #1d3cab;
--link-hv-fg: #879ef4;
--a-playlist-header-bg: #4acca2;
--a-playlist-header-fg: #fff;
--a-sound-hv-bg: #FFF89E; //#ffe453;
--a-sound-hv-fg: #222;
--a-player-panel-bg: #F7F7F6;
--heading-link-hv-fg: #95a9f3;
--break-color: transparent;
--button-active-fg: white;
--button-active-bg: #738ef2;
--cover-small-h: 10rem;
--cover-small-w: 10rem;
--heading-font-family: "campus_grotesk";
--header-height: 320px;
--heading-link-hv-fg: #aa217b;
--heading-hg-fg: #fff;
--link-fg: #3b47ff;
--link-hv-fg: #c40c85;
--main-color-light: #F4F881;
--nav-bg: transparent;
--nav-fg: #222;
--nav-secondary-bg: transparent;
--nav-hv-bg: unset;
--nav-active-bg: unset;
--nav-active-fg: white;
--preview-title-sz: 21px;
--text-color: #75124e;
--text-color-light: #eee;
}
@font-face {
font-family: 'campus_heading';
src: url("/static/radiocampus/fonts/CampusGroteskv23-Regular.otf");
font-family: "campus_grotesk";
src:
local("campus_grotesk"),
url("/static/radiocampus/fonts/campus_grotesk/CampusGroteskv24-Regular.woff2") format("woff2"),
url("/static/radiocampus/fonts/campus_grotesk/CampusGroteskv24-Regular.woff") format("woff"),
url("/static/radiocampus/fonts/campus_grotesk/CampusGroteskv24-Regular.otf") format("opentype") tech(color-COLRv1);
}
body {
color: #222;
background-size: cover;
}
body.home, body.home .preview .headings a, body.home .page a {
color: #fff;
}
body.home .preview .headings a:hover {
color: #f4f88d !important;
}
body.home .nav.primary {
max-width: 1200px;
margin: 0 auto;
}
body.yellow {
background: url(/static/radiocampus/backgrounds/degrade-jaune.jpg) repeat-x top fixed;
}
body.yellow :root {
--nav-active-fg: #f4f88d;
}
body.yellow.home {
background: url(/static/radiocampus/backgrounds/photo-degrade-02.jpg) no-repeat center/cover;
background-attachment: fixed;
}
body.blue {
background: url(/static/radiocampus/backgrounds/degrade-bleu.jpg) repeat-x top fixed;
}
body.blue.home {
background: url(/static/radiocampus/backgrounds/photo-degrade-01.jpg) no-repeat center/cover;
background-attachment: fixed;
}
body.blue #grandlogo img {
content: url('/static/radiocampus/logos/logo-RC-blanc1.png');
}
body.yellow #grandlogo img {
content: url('/static/radiocampus/logos/logo-RC-bleu1.png');
}
body.blue.home #grandlogo img {
content: url('/static/radiocampus/logos/logo-RC-blanc2.png');
}
body.yellow.home #grandlogo img {
content: url('/static/radiocampus/logos/logo-RC-bleu2.png');
}
body.yellow .nav .nav-item.active {
color: #738EF2 !important;
text-shadow: -3px 3px 17px rgb(0, 48, 111);
}
body.blue #grandlogo img, body.yellow #grandlogo img {
width: 120px;
margin: 12px 0 0 48px;
}
body.blue.home #grandlogo, body.yellow.home #grandlogo {
text-align: center;
width: 100%;
}
body.blue.home #grandlogo img , body.yellow.home #grandlogo img {
margin: 12px auto 0 auto;
width: 100%;
opacity: 0.8;
}
.a-player-bar {
border-top: 1px solid #555;
}
.a-player .button, .a-player-bar-content {
color: white;
}
#player .a-sound-item .label {
color: white !important;
}
.a-switch-nav span {
color: white;
}
.a-switch-nav span:hover {
color: #333;
}
a.heading.title {
color: black;
}
a.heading.title:hover {
/*color: var(--link-hv-fg); */
color: #738ef2;
}
.a-sound-item .label::before, .a-sound-item.playing .label::before, .a-sound-item.playing .label:hover::before {
content: "";
font-family: "Font Awesome 6 Free";
margin-right: .6em;
}
.button, a.button, button.button {
border: 0;
}
.header-cover:not(:only-child) {
float: left;
margin: 0 1.2rem 1.2rem 0;
}
.header.has-cover {
min-height: unset;
}
.item-section {display:flex; align-items:end}
.fifty {
width: 55%;
}
.grid.list-emissions {
grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
grid-auto-flow: dense;
gap: 0.2rem;
}
.grid.list-emissions .media-content {
font-size: 0.84rem;
}
.today {
color: yellow;
font-size: 1.4em !important;
}
.list-grille article {
border-bottom: 1px solid black;
}
.lagrille .category {
color: white;
margin-left: 10px;
vertical-align: text-bottom;
font-size: 0.8rem;
}
.lagrille:not(.homedisplay) .heading.subtitle {
color: black;
}
.mt-3 {
margin-top: unset !important;
}
.nav.primary .nav-brand {
display: none;
}
.nav.secondary .nav-item {
color: black !important;
}
a.nav-item:hover {
opacity: 0.8;
}
.nav.primary .nav-item {
font-weight: unset;
font-size: 1.4em;
}
.page section.container {
margin-top: 0;
}
.program-list {
flex-direction: column;
}
.list-home {
display: block;
}
.list-home article div.media {
line-height: 1;
padding: 0;
}
.list-home article.active div.media div.media-content a, .list-home article.active div.media div.media-content span {
color: yellow;
}
.list-home article.active div.media a:before {
content: "\2192";
margin-right: 6px;
}
.list-home article div.media a.preview-cover {
display: none;
}
.list-home article div.media div.media-content.flex-column {
display: unset;
}
.list-home article div.media div.media-content section.content {
display: none;
}
.list-home article div.media div.media-content div.episode-date {
display: none;
}
.list-home article div.media div.media-content span.heading.subtitle {
float: right;
}
.schedule {
background-color: unset;
font-size: 0.9em;
margin: 0 0.2rem;
opacity: 0.6;
padding: 0 0.2rem 0.2rem 0.2rem;
}
.schedules {
margin-bottom: 0.4rem !important;
}
.title, .preview .title, .preview .title:not(:last-child) {
text-transform: unset;
font-weight: unset;
font-size: 1.2rem;
}
@media screen and (max-width: 400px) {
body {
font-size: 16px;
}
}
@media screen and (max-width: 1024px) {
:root {
--header-height: 200px;
}
.page {
margin-top: 0;
padding-top: var(--nav-primary-height);
}
.nav.primary .nav-brand {
display: inline-block;
}
.nav.secondary .nav-item {
color: white !important;
}
.dropdown-trigger .icon, .icon.bullet {
color: white;
}
.dropdown.is-right .dropdown-menu {
left: 0;
}
.grid.list-emissions {
grid-template-columns: 1fr 1fr 1fr;
}
#grandlogo {
display: none;
}
.navs, .nav-menu.active {
background-color: #7892f1; /*#738ef2;*/
}
.nav .nav-item {
color: white !important;
}
.nav .nav-item.active {
color: white !important;
}
.navs .nav + .nav {
flex-grow: 1 !important;
}
}
@media screen and (min-width: 1408px) {
.container:not(.is-max-desktop):not(.is-max-widescreen) {
max-width: unset;
margin: 10px 64px;
}
body.home .container:not(.is-max-desktop):not(.is-max-widescreen) {
max-width: 1400px;
margin: 0 auto;
}
}
@media screen and (min-width: 1216px) {
.container:not(.is-max-desktop):not(.is-max-widescreen) {
max-width: unset;
margin: 0 64px;
}
body.home .container:not(.is-max-desktop):not(.is-max-widescreen) {
max-width: 1152px;
margin: 0 auto;
}
}
@media screen and (max-width: 900px) {
.grid.list-emissions {
grid-template-columns: 1fr 1fr;
}
}
.list-item .headings {
margin-bottom: .2rem !important;
}
.list-item:nth-child(3n+1):not(.wide) .media {
border-color: transparent !important;
}
.list-item:nth-child(3n):not(.wide) .media {
border-color: transparent !important;
}
.list-item:not(.wide) .media {
padding: 0.2rem;
}
.media-content .content p, .episode-date {
opacity: 0.7;
}
/*
.nav-urls .urls a, .nav-urls .urls span {
color: white;
background-color: #444;
border-radius: 5px;
padding: 4px;
}
#background {
background-size: cover;
padding: 80px 0 80px 0;
width: 100%;
}
.button:hover, a.button:hover, button.button:hover {
opacity: 0.9 !important;
}
.container {
background: whitesmoke;
padding: 24px;
border-radius: 5px;
max-width: 960px;
border: 1px solid #929293;
}
.container.breadcrumbs, .container.header {
background: transparent;
border-radius: 0;
padding: 0 24px 0 24px;
border: 0;
}
.container.breadcrumbs a {
color: white;
}
.grid .list-item .headings .heading {
padding-top: 10px;
padding-left: 12px;
}
.nav.secondary {
opacity: 0.9;
}
.nav.secondary .nav-item{
color: #1d3cab !important;
}
.nav .nav-item {
border: 1px solid transparent;
border-radius: 30px;
olor: #1d3cab !important;
color: #8c827e !important;
font-size: 1.1em;
}
.nav .nav-item:hover {
opacity: 0.8;
}
.preview-card {
background-color: unset !important;
.navs {
border-bottom: 1px solid #4d4545;
}
.page {
min-height: 500px;
}
.preview-cover {
border-radius: 5px;
opacity: 0.92;
border: 1px solid #fff;
}
.a-carousel .preview-cover {
border: 1px solid #ccc;
order: none;
}
.preview-card .headings .heading {
opacity: 0.85;
padding: 10px;
padding: 12px;
background-color: #242121;
}
.list-item .headings .heading {
padding: 20px 0 8px 20px;
background: rgba(255, 255, 255, 0.9);
display: block
.preview-card .headings a {
color: white;
}
.list-item .headings {
margin-bottom: 0 !important
.grid .preview .headings a {
color: black;
}
.preview .headings a {
color: rgb(115, 142, 242);
}
/*
.preview .title, .preview .title:not(:last-child) {
font-weight: normal;
}
@media screen and (max-width: 1024px) {
.nav .nav-menu {
background-color: #6C7ED2;
}
.page {
margin-top: 10px;
}
#background {
padding: 100px 0 50px 0;
}
.container, .page .container {
margin-left: 0;
margin-right: 0;
border-radius: 0;
}
}
*/
.a-player-bar {
border-top: none;
/* fred fixes */
.grid.list-emissions:not(.list-home) {display: flex !important;flex-wrap: wrap !important; gap: 20px 1rem;}
.grid.list-emissions:not(.list-home) > .list-item {width: calc(20% - 2rem) !important ;}
.grid.list-emissions:not(.list-home) > .list-item .preview-cover {max-width: 100% !important;
display: block;
width: 100% !important;
min-width: auto;
aspect-ratio: 1 / 1;
height: fit-content;
background-size: contain;
background-position: center;
background-color: white;
margin-bottom: 0.5rem;
}
.header.preview-header,.page section.container, .page section.container > .title {
margin-top: 0;
margin-bottom: 0;
padding-top: 0.6em;
.grid.list-emissions:not(.list-home) .media-content {margin-top: 0;}
.grid.list-emissions:not(.list-home) > .list-item .media .media-content > br, .grid.listfive > .list-item .media .media-content .episode-date > br {display: none;}
.grid.list-emissions:not(.list-home) .list-item .subtitle {text-align: left !important;font-size: 0.8rem !important;}
.grid.list-emissions:not(.list-home) .preview.active .heading:not(:empty) {
color: #738EF2 !important;
}
.media {
background: rgba(255, 255, 255, 0.9);
.grid.list-podcasts {display: flex !important;flex-wrap: wrap !important; gap: 20px 1rem;}
.grid.list-podcasts > .list-item {width: calc(50% - 2rem) !important ;}
.grid.list-podcasts > .list-item .preview-cover {max-width: 100% !important;
display: block;
width: 50% !important;
min-width: auto;
aspect-ratio: 1 / 1;
height: fit-content;
background-size: contain;
background-position: center;
background-color: white;
}
.button, a.button, button.button {
border: #bbb 1px solid;
border-radius: 20px;
.grid.list-podcasts .media-content {margin-top: 0;}
.grid.list-podcasts .media .media-left {width: 25% !important;}
.grid.list-podcasts .media .media-content {width: 75%;}
.grid.list-podcasts > .list-item .media .media-content > br, .grid.list-emissions > .list-item .media .media-content .episode-date > br {display: none;}
.grid.list-podcasts .list-item .subtitle {text-align: left !important;font-size: 0.8rem !important;}
.grid.list-podcasts .preview.active .heading:not(:empty) {
color: #738EF2 !important;
}
.list-item:nth-child(3n):not(.wide) .media, .list-item:nth-child(3n+1):not(.wide) .media {
border: 1px solid var(--break-color) !important;
.withmargin {
margin-bottom: 5px;
margin-right: 5px;
}
@media screen and (max-width: 1224px) {
.grid.list-emissions:not(.list-home) > .list-item {width: calc(33% - 2rem) !important;;}
}
@media screen and (max-width: 924px) {
.grid.list-emissions:not(.list-home) > .list-item {width: calc(50% - 2rem) !important;}
}
@media screen and (max-width: 1024px) {
.grid.list-emissions > .list-item {width: 100% !important;}
.program-list {flex-direction: column;}
.grid.list-podcasts > .list-item {width: 100% !important ;}
}
.list-item .subtitle:not(:empty) {
min-width: auto !important;
}
@media screen and (max-width: 924px) {
.a-player-bar-content {overflow: hidden;}
.a-player-bar-content .title {
display: inline-block;
padding-right: 2em;
padding-left: 100%;
white-space: nowrap;
animation: defilement-rtl 55s infinite linear;
overflow: visible;}
@keyframes defilement-rtl {
0% {
transform: translate3d(0,0,0); /* position initiale à droite */
}
100% {
transform: translate3d(-100%,0,0); /* position finale à gauche */
}
}
}
@media screen and (max-width: 540px) {
.media {
flex-direction: column;
}
.grid.list-podcasts .media .media-content {width:100%}
.grid.list-emissions:not(.list-home) > .list-item {
width: 100% !important;
}
}
.list-item .media-content {height:auto;}

View File

@ -7,8 +7,19 @@
<script src="{% static "radiocampus/backgroundLoad.js" %}"></script>
{% endblock %}
{% block nav %}
<div id="grandlogo" class="container"><a href="/"><img /></a></div>
{{ block.super }}
{% endblock %}
{% block header-container %}
{% if not page.attach_to %}
{{ block.super }}
{% endif %}
{% endblock %}
{% block header-cover %}
{% if cover %}
<img src="{{ cover }}" ref="cover" class="cover">
{% endif %}
{% endblock %}

View File

@ -0,0 +1,42 @@
{% extends "aircox/basepage_list.html" %}
{% load i18n %}
{% block filters %}
{{ block.super }}
<div class="field is-horizontal">
<div class="field-label">
<label class="label">{% translate "Podcasts" %}</label>
</div>
<div class="field-body">
<div class="checkbox">
<input type="checkbox" class="checkbox" name="podcast" value="True"
{% if filterset_data.podcast %}checked{% endif %} />
</div>
</div>
</div>
{% endblock %}
{% block list-container %}
{% with list_class="list-podcasts" %}
{{ block.super }}
{% endwith %}
{% endblock %}
{% block secondary-nav %}
{% if not parent and categories %}
<nav class="nav secondary">
<div class="nav-menu nav-categories">
{% for cat in categories %}
<a class="nav-item{% if cat == category %} active{% endif %}"
href="{% url request.resolver_match.url_name category_slug=cat.slug %}">
{{ cat.title }}
</a>
{% endfor %}
</div>
<a-switch class="button burger"
el=".nav-categories" group="nav" icon="fas fa-tags"
aria-label="{% translate "Categories" %}">
</a-switch>
</nav>
{% endif %}
{% endblock %}

View File

@ -0,0 +1,107 @@
{% extends "aircox/page_list.html" %}
{% comment %}List of diffusions as a timetable{% endcomment %}
{% load i18n aircox humanize %}
{% block subtitle %}{{ date|date:"l d F Y" }}{% endblock %}
{% block secondary-nav %}
<nav class="nav secondary">
<div class="nav-menu nav-categories">
<a class="nav-item" id="recent-link"
href="#" onclick="javascript:display('recentdisplay');">
Derniers titres diffusés
</a>
<a class="nav-item active" id="home-link"
href="#" onclick="javascript:display('homedisplay');">
Aujourd'hui
</a>
</div>
<a-switch class="button burger"
el=".nav-categories" group="nav" icon="fas fa-tags"
aria-label="{% translate "Categories" %}">
</a-switch>
</nav>
<script>
function display(id) {
var h = document.getElementsByClassName('homedisplay');
var r = document.getElementsByClassName('recentdisplay');
if (id == "homedisplay") {
for(var i = 0; i < h.length; i++) { h[i].setAttribute('style', 'display:inline !important'); }
for(var i = 0; i < r.length; i++) { r[i].setAttribute('style', 'display:none !important'); }
document.getElementById('recent-link').classList.remove('active');
document.getElementById('home-link').classList.add('active');
} else {
for(var i = 0; i < h.length; i++) { h[i].setAttribute('style', 'display:none !important'); }
for(var i = 0; i < r.length; i++) { r[i].setAttribute('style', 'display:inline !important'); }
document.getElementById('recent-link').classList.add('active');
document.getElementById('home-link').classList.remove('active');
}
}
</script>
{% endblock %}
{% block breadcrumbs %}
{% endblock %}
{% block list-container %}
<br />
<div class="lagrille homedisplay">
<section class="container" style="display:flex;justify-content:flex-end;min-height:600px">
<div>
<!-- <a href="{% url "timetable-list" date=date %}">{{ date|date:"l d F Y" }}</a> -->
<section class="clear-both list grid radiocampus-grid" role="list">
</section>
{% with list_class="list-home" %}
{{ block.super }}
{% endwith %}
</div>
</section>
</div>
<br />
<div class="recentdisplay" style="display:none">
<section class="container" style="min-height:600px">
<div>
<!-- <a href="{% url "timetable-list" date=date %}">{{ date|date:"l d F Y" }}</a> -->
<section class="clear-both list grid radiocampus-grid" role="list">
</section>
{% with list_class="list-home" %}
{{ block.super }}
{% endwith %}
</div>
</section>
</div>
{% endblock %}
{% block list %}
{% with object_list=object_list timetable=True %}
{% with widget|default:"item" as widget %}
{% for object in object_list %}
{% if object.episode %}
<div class="homedisplay">
{% page_widget widget object.episode diffusion=object timetable=True %}
</div>
{% else %}
<div class="preview list-item logs">
<div class="media d-block content recentdisplay" style="display:none !important;">
{% for obj in object %}
{% include "aircox/widgets/track_item.html" with object=obj.track log=obj timetable=True %}
<br />
{% endfor %}
</div>
</div>
{% endif %}
{% endfor %}
{% endwith %}
{% endwith %}
{% endblock %}

View File

@ -0,0 +1,98 @@
{% extends "aircox/public.html" %}
{% load static i18n humanize honeypot aircox %}
{% comment %}
Base template used to display a Page
Context:
- page: page
- parent: parent page
- related_objects: list of object to display as related publications
- related_url: url to the full list of related_objects
{% endcomment %}
{% block breadcrumbs %}
{% if parent %}
{% include "./widgets/breadcrumbs.html" with page=parent %}
{% if page %}
<a href="{% url page.list_url_name parent_slug=parent.slug %}">
{{ page|verbose_name:True }}
</a>
{% endif %}
{% elif page %}
{% include "./widgets/breadcrumbs.html" with page=page no_title=True %}
{% endif %}
{% endblock %}
{% block title-container %}
{{ block.super }}
{% block page-actions %}
{% include "aircox/widgets/page_actions.html" %}
{% endblock %}
{% endblock %}
{% block main %}
{{ block.super }}
{% block episodes %}
{% endblock %}
{% block related %}
{% if related_objects %}
<section class="container">
{% with models=object|verbose_name:True %}
<h2 class="title is-2">{% blocktranslate %}Related {{models}}{% endblocktranslate %}</h2>
{% include "./widgets/carousel.html" with objects=related_objects url_name=object.list_url_name url_category=object.category %}
{% endwith %}
</section>
{% endif %}
{% endblock %}
{% block comments %}
{% if comments %}
<section class="container">
<h2 class="title is-2">{% translate "Comments" %}</h2>
{% for object in comments %}
{% page_widget "item" object %}
{% endfor %}
</section>
{% endif %}
{% if comment_form %}
<section class="container">
<h2 class="title is-2">{% translate "Post a comment" %}</h2>
<form method="POST">
{% csrf_token %}
{% render_honeypot_field "website" %}
<div class="field">
<div class="control">
{{ comment_form.content }}
</div>
</div>
{% for field in comment_form %}
{% if field.name != "content" %}
<div class="field is-horizontal">
<label class="label">{{ field.label }}</label>
<div class="control">{{ field }}</div>
</div>
{% if field.errors %}
<p class="help is-danger">{{ field.errors }}</p>
{% endif %}
{% if field.help_text %}
<p class="help">{{ field.help_text|safe }}</p>
{% endif %}
{% endif %}
{% endfor %}
<div class="has-text-right">
<button type="submit" class="button">{% translate "Post comment" %}</button>
</div>
</form>
</section>
{% endif %}
{% endblock %}
{% endblock %}

View File

@ -0,0 +1,82 @@
{% extends "aircox/basepage_list.html" %}
{% comment %}Display a list of Pages{% endcomment %}
{% load i18n aircox %}
{% block secondary-nav %}
{% if not parent and categories %}
<nav class="nav secondary">
<div class="nav-menu nav-categories">
{% for cat in categories %}
<a class="nav-item{% if cat == category %} active{% endif %}"
href="{% url request.resolver_match.url_name category_slug=cat.slug %}">
{{ cat.title }}
</a>
{% endfor %}
</div>
<a-switch class="button burger"
el=".nav-categories" group="nav" icon="fas fa-tags"
aria-label="{% translate "Categories" %}">
</a-switch>
</nav>
{% endif %}
{% endblock %}
{% block title %}
{% if parent %}{{ parent.title }}
{% else %}{{ block.super }}
{% endif %}
{% endblock %}
{% block header %}
{% if page and not object %}
{% with page as object %}
{{ block.super }}
{% endwith %}
{% else %}
{{ block.super }}
{% endif %}
{% endblock %}
{% block breadcrumbs %}
{% if parent and model.list_url_name %}
{% include "./widgets/breadcrumbs.html" with page=parent %}
<a href="{% url model.list_url_name %}">{{ model|verbose_name:True }}</a>
{% elif page and model.list_url_name %}
<a href="{% url model.list_url_name %}">{{ page.title }}</a>
{% if category %}
<a href="{% url request.resolver_match.url_name category_slug=category.slug %}">
{{ category.title }}
</a>
{% endif %}
{% else %}
<a href="{% url request.resolver_match.url_name %}">{{ model|verbose_name:True }}</a>
{% if category %}
<a href="{% url request.resolver_match.url_name category_slug=category.slug %}">
{{ category.title }}
</a>
{% endif %}
{% endif %}
{% endblock %}
{% block content-container %}{% endblock %}
{% block list-pagination %}
{% include "./widgets/page_pagination.html" %}
{% endblock %}
{% block list-container %}
<section class="container clear-both list grid {{ list_class|default:"" }} list-emissions" role="list">
{% block list %}
{% with has_headline=True %}
{% for object in object_list %}
{% block list_object %}
{% page_widget item_widget|default:"program" object %}
{% endblock %}
{% empty %}
{% blocktranslate %}There is nothing published here...{% endblocktranslate %}
{% endfor %}
{% endwith %}
{% endblock %}
</section>
{% endblock %}

View File

@ -0,0 +1,62 @@
{% extends "aircox/basepage_list.html" %}
{% comment %}Display a list of Pages{% endcomment %}
{% load i18n aircox %}
{% block secondary-nav %}
{% if not parent and categories %}
<nav class="nav secondary">
<div class="nav-menu nav-categories">
{% for cat in categories %}
<a class="nav-item{% if cat == category %} active{% endif %}"
href="{% url request.resolver_match.url_name category_slug=cat.slug %}">
{{ cat.title }}
</a>
{% endfor %}
</div>
<a-switch class="button burger"
el=".nav-categories" group="nav" icon="fas fa-tags"
aria-label="{% translate "Categories" %}">
</a-switch>
</nav>
{% endif %}
{% endblock %}
{% block title %}
{% if parent %}{{ parent.title }}
{% else %}{{ block.super }}
{% endif %}
{% endblock %}
{% block header %}
{% if page and not object %}
{% with page as object %}
{{ block.super }}
{% endwith %}
{% else %}
{{ block.super }}
{% endif %}
{% endblock %}
{% block breadcrumbs %}
{% if parent and model.list_url_name %}
{% include "./widgets/breadcrumbs.html" with page=parent %}
<a href="{% url model.list_url_name %}">{{ model|verbose_name:True }}</a>
{% elif page.title == "Podcasts" and not category %}
{% elif page and model.list_url_name %}
<a href="{% url model.list_url_name %}">{{ page.title }}</a>
{% if category %}
<a href="{% url request.resolver_match.url_name category_slug=category.slug %}">
{{ category.title }}
</a>
{% endif %}
{% else %}
<a href="{% url request.resolver_match.url_name %}">{{ model|verbose_name:True }}</a>
{% if category %}
<a href="{% url request.resolver_match.url_name category_slug=category.slug %}">
{{ category.title }}
</a>
{% endif %}
{% endif %}
{% endblock %}
{% block content-container %}{% endblock %}

View File

@ -0,0 +1,61 @@
{% extends "aircox/page_detail.html" %}
{% comment %}Detail page of a show{% endcomment %}
{% load i18n aircox %}
{% block content %}
{% with schedules=object.schedule_set.all %}
{% if object.active and schedules %}
<header class="schedules mt-3">
{% for schedule in schedules %}
<div class="schedule">
<div class="heading">
<span class="day">{{ schedule.get_frequency_display }}</span>
{% with schedule.start|date:"H:i" as start %}
{% with schedule.end|date:"H:i" as end %}
<time datetime="{{ start }}">{{ start }}</time>
&mdash;
<time datetime="{{ end }}">{{ end }}</time>
{% endwith %}
{% endwith %}
<small>
{% if schedule.is_rerun %}
{% with schedule.initial.date as date %}
<span title="{% blocktranslate %}Rerun of {{ date }}{% endblocktranslate %}">
({% translate "Rerun" %})
</span>
{% endwith %}
{% endif %}
</small>
</div>
</div>
{% endfor %}
</header>
{% endif %}
{% endwith %}
{{ block.super }}
{% endblock %}
{% block episodes %}
{% if episodes %}
<section class="container">
<h2 class="title is-2">{% translate "Last Episodes" %}</h2>
{% include "./widgets/carousel.html" with objects=episodes url_name="episode-list" url_parent=object url_label=_("All episodes") %}
</section>
{% endif %}
{% endblock %}
{% block main %}
{{ block.super }}
{% if articles %}
<section class="container">
<h2 class="title is-2">{% translate "Last Articles" %}</h2>
{% include "./widgets/carousel.html" with objects=articles url_name="article-list" url_parent=object url_label=_("All articles") %}
</section>
{% endif %}
{% endblock %}

View File

@ -0,0 +1,32 @@
{% extends "./base.html" %}
{% load aircox %}
{% comment %}
Override is a trick here: it allows to change title at two different different
places inside the page: inside `<title>` tag, and inside the page
content.
{% endcomment %}
{% block head-title %}
{% block title %}
{% if page and page.title %}{{ page.title }}{% endif %}
{% endblock %}
{% if page and page.title %}&mdash;{% endif %}
{{ station.name }}
{% endblock %}
{% block header %}{% if page %}{{ block.super }}{% endif %}{% endblock %}
{% block secondary-nav %}
{% if '/pages/' in request.path %}
<nav class="nav secondary">
<div class="nav-menu nav-categories">
{% nav_items "secondary" css_class="nav-item" active_class="active" as items %}
{% for item, render in items %}
{{ render }}
{% endfor %}
</div>
</nav>
{% endif %}
{% endblock %}

View File

@ -0,0 +1,95 @@
{% extends "aircox/basepage_list.html" %}
{% comment %}List of diffusions as a timetable{% endcomment %}
{% load i18n aircox humanize %}
{% block subtitle %}{{ date|date:"l d F Y" }}{% endblock %}
{% block secondary-nav %}
<nav class="nav secondary">
{% include "./widgets/dates_menu.html" with url_name=view.redirect_date_url %}
</nav>
{% endblock %}
{% block breadcrumbs %}
{% if page and model.list_url_name %}
<a href="{% url model.list_url_name %}">{{ page.title }}</a>
{% if category %}
<a href="{% url request.resolver_match.url_name category_slug=category.slug %}">
{{ category.title }}
</a>
{% endif %}
{% endif %}
<a href="{% url "timetable-list" date=date %}">{{ date|date:"l d F Y" }}</a>
{% endblock %}
{% block list-container %}
{% with list_class="grid" %}
<section class="container clear-both list grid list-grille list-home list-emissions" role="list">
<section class="container" style="display:flex;justify-content:flex-end;min-height:600px">
<div class="fifty">
{% block list %}
{% with object_list=object_list timetable=True %}
{% with widget|default:"item" as widget %}
{% for object in object_list %}
{% if object.episode %}
<div class="lagrille">
{% page_widget widget object.episode diffusion=object timetable=True %}
</div>
{% else %}
<div class="preview list-item logs">
<div class="media d-block content recentdisplay" style="display:none !important;">
{% for obj in object %}
{% include "aircox/widgets/track_item.html" with object=obj.track log=obj timetable=True %}
<br />
{% endfor %}
</div>
</div>
{% endif %}
{% endfor %}
{% endwith %}
{% endwith %}
{% endblock %}
</div>
</section>
</section>
{% endwith %}
{% endblock %}
{% block title %}
{% if parent %}{{ parent.title }}
{% else %}{{ block.super }}
{% endif %}
{% endblock %}
{% block header %}
{% if page and not object %}
{% with page as object %}
{{ block.super }}
{% endwith %}
{% else %}
{{ block.super }}
{% endif %}
{% endblock %}
{% block content-container %}{% endblock %}
{% block list-pagination %}
{% include "./widgets/page_pagination.html" %}
{% endblock %}

Some files were not shown because too many files have changed in this diff Show More