From 2f2f363650b7e5afde0b42e08462b3a5a905f7ff Mon Sep 17 00:00:00 2001 From: Mathis Date: Sun, 4 Oct 2026 22:59:00 +0200 Subject: [PATCH] =?UTF-8?q?v1.0.0=20=E2=80=94=20redesign=20complet=20chart?= =?UTF-8?q?e=20graphique=20V2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 8 états météo : arc-en-ciel, ensoleillé, brumeux, nuageux, pluvieux, orageux, tempête, fin du monde - Fonts : Fredoka (titres) + Nunito (texte), palette V2 (bleu #3B82F6, orange #F59E0B, rouge #EF4444) - Nav flottante : Météo / Radar / Bilan / Paramètres (La Carte supprimée) - Thème clair / sombre (toggle dans Paramètres) - Icône app : papier quadrillé + 0 rouge manuscrit - Illustrations météo CSS pures (soleil, nuages, pluie, éclair, champignon nucléaire, arc-en-ciel) - Panel admin centralisé dans Paramètres (flash, classe, évaluations, météo, membres) - Bottom nav flottante avec safe-area pour ne plus toucher la nav système Android - Suppression des anciennes vues (cards.ts, map.ts, plus.ts, exam-form.ts) --- scripts/gen-icons.mjs | 91 ++- shared/src/index.ts | 174 +++-- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 2786 -> 1909 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 1869 -> 1909 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 3981 -> 1909 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 6644 -> 1909 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 9441 -> 10475 bytes web/index.html | 22 +- web/public/icon-192.png | Bin 3151 -> 1909 bytes web/public/icon-512.png | Bin 10931 -> 10475 bytes web/src/dom.ts | 45 +- web/src/main.ts | 90 ++- web/src/styles.css | 577 +++++++++++++- web/src/update.ts | 10 +- web/src/views/cards.ts | 103 --- web/src/views/exam-form.ts | 235 ------ web/src/views/journal.ts | 17 + web/src/views/map.ts | 152 ---- web/src/views/plus.ts | 583 -------------- web/src/views/radar.ts | 58 +- web/src/views/settings.ts | 458 +++++++++++ web/src/views/weather-art.ts | 64 ++ web/src/views/week.ts | 715 +++++++++--------- 23 files changed, 1679 insertions(+), 1715 deletions(-) delete mode 100644 web/src/views/cards.ts delete mode 100644 web/src/views/exam-form.ts create mode 100644 web/src/views/journal.ts delete mode 100644 web/src/views/map.ts delete mode 100644 web/src/views/plus.ts create mode 100644 web/src/views/settings.ts create mode 100644 web/src/views/weather-art.ts diff --git a/scripts/gen-icons.mjs b/scripts/gen-icons.mjs index 305ce59..be9e78e 100644 --- a/scripts/gen-icons.mjs +++ b/scripts/gen-icons.mjs @@ -1,6 +1,5 @@ /** - * Génère des icônes PWA simples (dégradé bleu + pastille blanche). - * Usage : node scripts/gen-icons.mjs + * Génère l'icône Météo Exam V2 : papier quadrillé + 0 rouge manuscrit. */ import { writeFileSync, mkdirSync } from 'node:fs' import { resolve } from 'node:path' @@ -51,51 +50,73 @@ function encodePng(width, height, rgba) { function drawIcon(size) { const buf = Buffer.alloc(size * size * 4) - const c0 = [56, 189, 248] - const c1 = [99, 102, 241] + const paperR = 248, paperG = 250, paperB = 252 // #F8FAFC + const gridR = 185, gridG = 213, gridB = 246 // #B9D5F6 + const redR = 239, redG = 68, redB = 68 // #EF4444 + const lineR = 236, lineG = 73, lineB = 73 // #EC4949 const cx = size / 2 const cy = size / 2 - const rInner = size * 0.3 - const rPad = size * 0.16 + const gridSize = size / 10 for (let y = 0; y < size; y++) { for (let x = 0; x < size; x++) { const i = (y * size + x) * 4 - const dx = x - cx - const dy = y - cy - const dist = Math.sqrt(dx * dx + dy * dy) - // Fond arrondi : on coupe les coins - let transparent = false - if (x < rPad && y < rPad) transparent = Math.hypot(rPad - x, rPad - y) > rPad - else if (x >= size - rPad && y < rPad) transparent = Math.hypot(x - (size - rPad), rPad - y) > rPad - else if (x < rPad && y >= size - rPad) transparent = Math.hypot(rPad - x, y - (size - rPad)) > rPad - else if (x >= size - rPad && y >= size - rPad) transparent = Math.hypot(x - (size - rPad), y - (size - rPad)) > rPad + // Fond papier + let r = paperR, g = paperG, b = paperB, a = 255 - if (transparent) { - buf[i + 3] = 0 - continue + // Quadrillage + const gx = x % gridSize + const gy = y % gridSize + const nearVx = gx < 1.5 || gx > gridSize - 1.5 + const nearHy = gy < 1.5 || gy > gridSize - 1.5 + if (nearVx || nearHy) { + r = gridR; g = gridG; b = gridB } - const t = (x + y) / (size * 2) - let r = c0[0] + (c1[0] - c0[0]) * t - let g = c0[1] + (c1[1] - c0[1]) * t - let b = c0[2] + (c1[2] - c0[2]) * t - - if (dist < rInner) { - r = 255 - g = 255 - b = 255 - } else if (dist < rInner + size * 0.025) { - r = Math.min(255, r + 50) - g = Math.min(255, g + 50) - b = Math.min(255, b + 50) + // Marge rouge verticale (style cahier) + if (x < size * 0.08 && x > size * 0.05) { + r = lineR; g = lineG; b = lineB } - buf[i] = Math.round(r) - buf[i + 1] = Math.round(g) - buf[i + 2] = Math.round(b) - buf[i + 3] = 255 + // Dessiner le "0" rouge (ellipse inclinée) + const dx = (x - cx) / (size * 0.22) + const dy = (y - cy) / (size * 0.3) + const dist0 = Math.sqrt(dx * dx + dy * dy) + + // Anneau du 0 + if (dist0 > 0.7 && dist0 < 1.15) { + r = redR; g = redG; b = redB + } + + // Rayons du soleil (petits traits autour du 0) + const angle = Math.atan2(y - cy, x - cx) + const rayDist = Math.sqrt((x - cx) ** 2 + (y - cy) ** 2) + const rayOuter = size * 0.42 + const rayInner = size * 0.36 + if (rayDist > rayInner && rayDist < rayOuter) { + // 8 rayons + const rayAngle = (Math.round(angle / (Math.PI / 4)) * Math.PI) / 4 + const perpDist = Math.abs((x - cx) * Math.sin(rayAngle) - (y - cy) * Math.cos(rayAngle)) + if (perpDist < size * 0.02) { + r = redR; g = redG; b = redB + } + } + + // Soulignement double en bas + const underY1 = cy + size * 0.38 + const underY2 = cy + size * 0.42 + if (Math.abs(y - underY1) < size * 0.015 && x > cx - size * 0.3 && x < cx + size * 0.3) { + r = redR; g = redG; b = redB + } + if (Math.abs(y - underY2) < size * 0.015 && x > cx - size * 0.28 && x < cx + size * 0.32) { + r = redR; g = redG; b = redB + } + + buf[i] = r + buf[i + 1] = g + buf[i + 2] = b + buf[i + 3] = a } } return buf diff --git a/shared/src/index.ts b/shared/src/index.ts index f5dde43..22438c1 100644 --- a/shared/src/index.ts +++ b/shared/src/index.ts @@ -1,90 +1,128 @@ /** * Types et métadonnées partagés entre le serveur et le front. - * Aucun import runtime ici : ce module est consommé tel quel par les deux côtés. + * Charte graphique V2 — 8 états météo. */ -/** Statut météorologique d'une évaluation. */ -export type WeatherKind = 'soleil' | 'brouillard' | 'vent' | 'orage' | 'tempete' +export type WeatherKind = + | 'arcenciel' // aucune évaluation + événement spécial + | 'soleil' // aucune évaluation + | 'brouillard' // suspicion + | 'nuageux' // petite évaluation / QCM + | 'pluie' // évaluation classique + | 'orage' // DS / contrôle surveillé + | 'tempete' // bac blanc / examen blanc + | 'fin_du_monde' // vrai bac -export const WEATHER_KINDS: WeatherKind[] = ['soleil', 'brouillard', 'vent', 'orage', 'tempete'] +export const WEATHER_KINDS: WeatherKind[] = [ + 'arcenciel', 'soleil', 'brouillard', 'nuageux', 'pluie', 'orage', 'tempete', 'fin_du_monde', +] -/** Du plus rassurant au plus menaçant. Sert aux tris et au calcul du statut d'une journée. */ export const SEVERITY: Record = { + arcenciel: 0, soleil: 0, brouillard: 1, - vent: 2, - orage: 3, - tempete: 4, + nuageux: 2, + pluie: 3, + orage: 4, + tempete: 5, + fin_du_monde: 6, } export interface WeatherMeta { - /** Nom affiché, ex. « Alerte Rouge ». */ label: string - /** Titre long pour les modales et la légende. */ title: string icon: string - /** Description pédagogique affichée dans la légende. */ hint: string - /** Couleur d'accent en dur, pour les SVG et jauges. */ + /** Couleur principale du statut (hex). */ hex: string - /** Classes Tailwind de la pastille (fond / bordure / texte). */ - chip: string - /** Classe de couleur du texte seule, pour les libellés sur fond neutre. */ - accent: string /** Classes Tailwind du badge plein. */ badge: string + /** Classe de couleur du texte seule. */ + accent: string + /** Gradient CSS pour les cartes hero / mini-arts. */ + gradient: string } export const WEATHER: Record = { + arcenciel: { + label: 'Arc-en-ciel', + title: 'Arc-en-ciel', + icon: '🌈', + hint: 'Aucune évaluation + événement spécial : sortie, pas de cours…', + hex: '#3B82F6', + badge: 'bg-blue-500/15 text-blue-300 border-blue-400/30', + accent: 'text-blue-400', + gradient: 'linear-gradient(145deg,#1570EF,#7555D9)', + }, soleil: { - label: 'Grand Soleil', - title: 'Grand Soleil', + label: 'Ensoleillé', + title: 'Ensoleillé', icon: '☀️', - hint: 'Journée calme. Aucun examen répertorié ni suspecté.', - hex: '#0284c7', - chip: 'bg-sky-500/10 border-sky-500/20 text-sky-400', - accent: 'text-sky-400', - badge: 'bg-sky-500/15 text-sky-300 border-sky-400/30', + hint: 'Aucune évaluation aujourd’hui.', + hex: '#FFD43B', + badge: 'bg-amber-400/15 text-amber-300 border-amber-400/30', + accent: 'text-amber-300', + gradient: 'linear-gradient(145deg,#1488FF,#55B8FF)', }, brouillard: { - label: 'Brouillard', - title: 'Brouillard', + label: 'Brumeux', + title: 'Brumeux', icon: '🌫️', - hint: 'Zone d’incertitude. Rumeur ou sous-entendu d’un professeur.', - hex: '#7c3aed', - chip: 'bg-purple-500/10 border-purple-500/20 text-purple-400', - accent: 'text-purple-400', - badge: 'bg-purple-500/15 text-purple-300 border-purple-400/30', + hint: 'Suspicion d’évaluation aujourd’hui.', + hex: '#9CA3AF', + badge: 'bg-slate-400/15 text-slate-300 border-slate-400/30', + accent: 'text-slate-300', + gradient: 'linear-gradient(145deg,#A6B5C9,#7288A8)', }, - vent: { - label: 'Coup de vent', - title: 'Coup de vent', - icon: '💨', - hint: 'Interrogation surprise potentielle ou petit QCM, coefficient faible.', - hex: '#d97706', - chip: 'bg-amber-500/10 border-amber-500/20 text-amber-400', - accent: 'text-amber-400', - badge: 'bg-amber-500/15 text-amber-300 border-amber-400/30', + nuageux: { + label: 'Nuageux', + title: 'Nuageux', + icon: '☁️', + hint: 'Petite évaluation, exposé ou QCM aujourd’hui.', + hex: '#60A5FA', + badge: 'bg-sky-400/15 text-sky-300 border-sky-400/30', + accent: 'text-sky-400', + gradient: 'linear-gradient(145deg,#57B7FF,#2D86ED)', + }, + pluie: { + label: 'Pluvieux', + title: 'Pluvieux', + icon: '🌧️', + hint: 'Évaluation classique aujourd’hui.', + hex: '#3B82F6', + badge: 'bg-blue-500/15 text-blue-300 border-blue-400/30', + accent: 'text-blue-400', + gradient: 'linear-gradient(145deg,#14589B,#092E64)', }, orage: { - label: 'Orage', - title: 'Orage / Pluie battante', - icon: '🌩️', - hint: 'Devoir surveillé (DS) confirmé ou évaluation de chapitre.', - hex: '#e11d48', - chip: 'bg-rose-500/10 border-rose-500/20 text-rose-400', - accent: 'text-rose-400', - badge: 'bg-rose-500/15 text-rose-300 border-rose-400/30', + label: 'Orageux', + title: 'Orageux', + icon: '⛈️', + hint: 'Devoir surveillé aujourd’hui.', + hex: '#8B5CF6', + badge: 'bg-purple-500/15 text-purple-300 border-purple-400/30', + accent: 'text-purple-400', + gradient: 'linear-gradient(145deg,#291B69,#152758)', }, tempete: { - label: 'Alerte Rouge', - title: 'Alerte Rouge / Tempête', - icon: '🚨', - hint: 'Examen blanc, épreuve commune ou gros devoir de fin de trimestre.', - hex: '#dc2626', - chip: 'bg-red-500/10 border-red-500/20 text-red-500', - accent: 'text-red-500', + label: 'Tempête', + title: 'Tempête', + icon: '🌀', + hint: 'Bac blanc / examen blanc.', + hex: '#EF4444', badge: 'bg-red-500/15 text-red-300 border-red-400/30', + accent: 'text-red-400', + gradient: 'radial-gradient(circle at 50% 50%,#FBAE45 0 5%,#F04464 6% 12%,#7E2BD5 13% 21%,#11194B 22% 36%,#F04464 37% 43%,#11194B 44%)', + }, + fin_du_monde: { + label: 'Fin du monde', + title: 'Fin du monde', + icon: '💥', + hint: 'Vrai bac. Niveau maximal.', + hex: '#FF713D', + badge: 'bg-orange-500/15 text-orange-300 border-orange-400/30', + accent: 'text-orange-400', + gradient: 'linear-gradient(#281846,#B33C33 55%,#F59337)', }, } @@ -92,28 +130,24 @@ export function isWeatherKind(value: unknown): value is WeatherKind { return typeof value === 'string' && (WEATHER_KINDS as string[]).includes(value) } -/** - * Statut par défaut déduit du coefficient, pour pré-remplir le formulaire d'ajout. - * 0 = rien de prévu, 1 = interro surprise, 2-3 = DS, 4+ = alerte rouge. - */ export function kindFromWeight(weight: number): WeatherKind { if (weight <= 0) return 'soleil' - if (weight < 2) return 'vent' + if (weight < 1) return 'nuageux' + if (weight < 2) return 'pluie' if (weight < 4) return 'orage' - return 'tempete' + if (weight < 5) return 'tempete' + return 'fin_du_monde' } -/** Les coefficients proposés dans le formulaire, avec leur statut déduit. */ export const WEIGHT_PRESETS: { value: number; label: string }[] = [ - { value: 0, label: '0 — coursework' }, - { value: 1, label: '1 — interro' }, + { value: 0, label: '0 — rien' }, + { value: 1, label: '1 — QCM / interro' }, { value: 2, label: '2 — contrôle' }, { value: 3, label: '3 — DS' }, { value: 4, label: '4 — examen blanc' }, { value: 5, label: '5 — épreuve commune' }, ] -/** Statut le plus sévère d'une journée ; `soleil` si la journée est vide. */ export function dominantKind(exams: { kind: WeatherKind }[]): WeatherKind { let best: WeatherKind = 'soleil' for (const exam of exams) { @@ -131,10 +165,8 @@ export interface Exam { teacher: string | null room: string | null chapter: string | null - /** ISO 8601 UTC. */ startsAt: string durationMin: number - /** Coefficient : alimente la future « pression atmosphérique ». */ weight: number kind: WeatherKind note: string | null @@ -146,7 +178,6 @@ export interface ClassInfo { id: number name: string level: string | null - /** Message d'annonce du jour (flash info), lu par tous les membres. */ flashMessage: string | null } @@ -155,11 +186,9 @@ export interface Member { classId: number nickname: string role: Role - /** true = créateur de la classe (ne peut pas être rétrogradé). */ isCreator: boolean } -/** Charge utile de `GET /api/me`, renvoyée aussi à la création et à l'adhésion. */ export interface Session { member: Member klass: ClassInfo @@ -169,7 +198,6 @@ export interface ApiError { error: string } -/** Override météo posé par l'admin pour un jour donné (clé locale AAAA-MM-JJ). */ export interface DayWeather { classId: number dayKey: string @@ -177,15 +205,12 @@ export interface DayWeather { updatedAt: string } -/** Flash info : message quotidien rédigé par l'admin. */ export interface FlashInfo { classId: number - /** null = pas de message publié. */ message: string | null updatedAt: string } -/** Payloads émis par le flux SSE. */ export type StreamEvent = | { type: 'exam.created'; exam: Exam } | { type: 'exam.updated'; exam: Exam } @@ -198,5 +223,4 @@ export type StreamEvent = export const CLASS_CODE_LENGTH = 6 -/** Version de l'application. Incrémentée à chaque release APK. */ -export const APP_VERSION = '0.5.0' +export const APP_VERSION = '1.0.0' diff --git a/web/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/web/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index c023e50595074292c7361183a64de08cf9686c9c..01b714ff3dd22e0494b1da249d4538016e2eba4b 100644 GIT binary patch literal 1909 zcmaJ?4K&+X7QabE(xyV!j4;|p8P>KXCZ->uG};=2ttzEuMyR2-U1J?Vd<1`^UA9z9 zSVTH66WVA9;_8-pKJ+pgu-#PESd(Zp5-+S-A z`|+pXAV0Is?`;MEGyji|hM=>=*omg-81gKU06;kCf7It>2LF}7=hn9U7DsXp{DB)s zegCeTN^r&+Q$Duev|z%eDQs7W@UBWq_Ur$#`rOW$DcPI6+_&G~picDW2%qQe*y)!u z`?eU6pwVc^UDLk_KLuQazWJQ2x$$F~x;<<@#oHECVcvNlX--`QFmnwQr-E#L(PoOmSS!IpX{Coq3c?T&Oxf^qne+Y`K>h`R5@0vD;Z}2xsd4&8> z*5EiGgpexk)Yk($Y3d~I#O%fEZ))|4O@Ur3ryB+W_4=MRg5*q-#$Ich|G*|I-VAvV zGKPO{hAnhIh?Tq|4@aJV$i5-ESC%rcTWDM6^>-_ztg*D_SXB64;_-B)P6-y))542F zk_PTeXsH@=0*h=Vf`o#EjXPtQ$A{a$ zY$~2H^_g-Q)+AMc%5_FLJc>^pPJA5M3l<+vU0b}e9QGvfas6AUTe$4?;wxAFjkBE0 zPFt`bZ-PvStF!{Ax1+vnE7(RxL@}O3fVvJ)1;c3nQ-4Ud2F>AD&H#v`s5&&~P8)PI zZgn3WP6x%fD)-}W(23Gw!EGHg@IU8SY0~JP5GU6+u zUCXxo*9O#x$C3tl$8Z)=Zm6u#83`qOz{MAaS0WrPeL8hX*CqA3+cJd4@ol*okRuwJ zpRof8h$nE6ur4ni+qX4IyUsTcutdkGehY2lfAdRvJ5VK%(zQZ=yafVi*W^(56a8_E z9VkfSnY?G!8_;mqu}q#9OL^tc+%MlGsew4xa4&U9RlQ-3x3EU+zM8dzF5S9e91@VD z-Sp2;8(mJ%uIbT9rG8%ONl(cf#JMQX44$CH>&M-3>qpE)-+91yVA=2v$TtCr(kr94 zLo(kItXvIgv##vd84T`9cY-Mt6mxj(|LF7}R53P;yJ(mE7oAkrWH7n}lQ_!Go$ky^ zM^`0)Eo4OZY?En!Farxptnb-D-MR+_Y~}G*T9S;hP#Jq~Xy&OIxH%WC#8Y7(LDKWS zJKJNZ(-B;{`YhOu@_KGj=4-_Q+zhac;#;0geh02s{Z8Gkt((*WHCJQbqe%){Qa+ba zEBij%4}f953rLLEV2lE$TX-(|Y2{d?0JHpgx*|37qtzgmBL=>Bv4}$$pp{{P3b)d6 z;B$oKvPat5b~e!J6#)bjKNuraU8gMX!QwQBInJ<&nWXDN~6W zdr?JRTvbmk4$KQnPCLO2X8D{UdgM0VPH1Sh5_Q)H?AwfiROdFsZi=Y6KG3SCbrF7A z#kOod78M+?ubpdCx9jml6FY|w(<0i7`#fmBhsY4|)^tkTpGW&IUp>O&C0Lj3g<8Cj z=pUtul4?8JSxVgedqTQ%S{dgzeX`!H_-sPa;-%N2RU*HjOa=!BPU2C=zLkd@sjSNu z+-4hH4P%p~8wt^lR`^ID)#DHa_T1Tz&Vgz#(BySp_|XI)I1=@mMl|?0gm`mipoS6~6mtATa49hDU|tapH}f8z zFgTP&KH(r7+R{ic|K%L|9q2v_v}4gM04h_YfXY&%S$=+3?fCcuagJQW Z{rp_8@7(#=U!k1f?;CXV*5Q~h{t0E{B*Fjy literal 2786 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 diff --git a/web/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/web/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 72905b854cb4d39e8717090424302e370239a08e..01b714ff3dd22e0494b1da249d4538016e2eba4b 100644 GIT binary patch literal 1909 zcmaJ?4K&+X7QabE(xyV!j4;|p8P>KXCZ->uG};=2ttzEuMyR2-U1J?Vd<1`^UA9z9 zSVTH66WVA9;_8-pKJ+pgu-#PESd(Zp5-+S-A z`|+pXAV0Is?`;MEGyji|hM=>=*omg-81gKU06;kCf7It>2LF}7=hn9U7DsXp{DB)s zegCeTN^r&+Q$Duev|z%eDQs7W@UBWq_Ur$#`rOW$DcPI6+_&G~picDW2%qQe*y)!u z`?eU6pwVc^UDLk_KLuQazWJQ2x$$F~x;<<@#oHECVcvNlX--`QFmnwQr-E#L(PoOmSS!IpX{Coq3c?T&Oxf^qne+Y`K>h`R5@0vD;Z}2xsd4&8> z*5EiGgpexk)Yk($Y3d~I#O%fEZ))|4O@Ur3ryB+W_4=MRg5*q-#$Ich|G*|I-VAvV zGKPO{hAnhIh?Tq|4@aJV$i5-ESC%rcTWDM6^>-_ztg*D_SXB64;_-B)P6-y))542F zk_PTeXsH@=0*h=Vf`o#EjXPtQ$A{a$ zY$~2H^_g-Q)+AMc%5_FLJc>^pPJA5M3l<+vU0b}e9QGvfas6AUTe$4?;wxAFjkBE0 zPFt`bZ-PvStF!{Ax1+vnE7(RxL@}O3fVvJ)1;c3nQ-4Ud2F>AD&H#v`s5&&~P8)PI zZgn3WP6x%fD)-}W(23Gw!EGHg@IU8SY0~JP5GU6+u zUCXxo*9O#x$C3tl$8Z)=Zm6u#83`qOz{MAaS0WrPeL8hX*CqA3+cJd4@ol*okRuwJ zpRof8h$nE6ur4ni+qX4IyUsTcutdkGehY2lfAdRvJ5VK%(zQZ=yafVi*W^(56a8_E z9VkfSnY?G!8_;mqu}q#9OL^tc+%MlGsew4xa4&U9RlQ-3x3EU+zM8dzF5S9e91@VD z-Sp2;8(mJ%uIbT9rG8%ONl(cf#JMQX44$CH>&M-3>qpE)-+91yVA=2v$TtCr(kr94 zLo(kItXvIgv##vd84T`9cY-Mt6mxj(|LF7}R53P;yJ(mE7oAkrWH7n}lQ_!Go$ky^ zM^`0)Eo4OZY?En!Farxptnb-D-MR+_Y~}G*T9S;hP#Jq~Xy&OIxH%WC#8Y7(LDKWS zJKJNZ(-B;{`YhOu@_KGj=4-_Q+zhac;#;0geh02s{Z8Gkt((*WHCJQbqe%){Qa+ba zEBij%4}f953rLLEV2lE$TX-(|Y2{d?0JHpgx*|37qtzgmBL=>Bv4}$$pp{{P3b)d6 z;B$oKvPat5b~e!J6#)bjKNuraU8gMX!QwQBInJ<&nWXDN~6W zdr?JRTvbmk4$KQnPCLO2X8D{UdgM0VPH1Sh5_Q)H?AwfiROdFsZi=Y6KG3SCbrF7A z#kOod78M+?ubpdCx9jml6FY|w(<0i7`#fmBhsY4|)^tkTpGW&IUp>O&C0Lj3g<8Cj z=pUtul4?8JSxVgedqTQ%S{dgzeX`!H_-sPa;-%N2RU*HjOa=!BPU2C=zLkd@sjSNu z+-4hH4P%p~8wt^lR`^ID)#DHa_T1Tz&Vgz#(BySp_|XI)I1=@mMl|?0gm`mipoS6~6mtATa49hDU|tapH}f8z zFgTP&KH(r7+R{ic|K%L|9q2v_v}4gM04h_YfXY&%S$=+3?fCcuagJQW Z{rp_8@7(#=U!k1f?;CXV*5Q~h{t0E{B*Fjy literal 1869 zcmV-T2eSByP)xSd z#Lfy~3D{sKwzH9i;2=l{N}m08$9`|7XWGqI)35z{dV1z9Msf}rz0&LH>8Y--x~jUW zXWqPP*HwH8AzDE5=a^cW5&U|ht4NXc%cBoOdlBeP&>eF`H1{H#Y>C3-|7Osp>FMbd zV}6!%9wO#N`-pts&wAQ3x+k)YrE$Jrnx!HjaQhu_~)3AJ1*n6 zpCP@^^U!v}&vl|_5IAVNcn9FE<8(ey62^Me=aMoZSGupS?>1dl6Tp1>KXc~HJrFEU zS|&zGTBkk-8nS6VvJ!Zg#==w*$ElTY0?kVq2tctoQRwOExnGyn3ZTEg|6ZWZ(S)Ss zB-5b@$_|SFivvJoy_x`cFb+x-zMKQy(;^QW+O}=m;(7t(i5Z!QIiUif+bs351Q62Z zeQDEZ$APHYyf66&V?9pq(h78Sbv@7!fWT%g6OuqvB{u@h2EyjBHlCzyr=l30=VZwV ztN=dH8~}4drTI9Y&_N&s$F5AkQxjI%d}uW)W=t#45CEGKSD1wyHYvoi3MKkQMG;OV zRO-UZ)u<{l4<~471xzO$VDPDL7!grnI;?W&ktit$0IV!vkplKf4bED zHsgtvKXdW?w_LP+0}$VFF=PQzW>WapUI5rBL9F`;W-`S>!p|B2g)q{*O<=Q+>^*hG z7oEdgyl|ij;^hhmC0Gf*kLaNMCVW##H&AW@$m@S`?+{(4;N4FmaDM&xLlRE5UT(b3dQ;XAmIw_192eE z6}Wf@f_?%aQd8k^DS-IE0I?jxKf8~MXZFff*m44^!g%675hQjnKT0K<-pFhq&KG_0 zE==XMU$|J&ZwE1s`}YrV@uC6ZInb8hq)F9I09oT3Sv>$wW_+>cFhb_9VGv^mh)ju# z_Y4p(q1|_pM;vRLWPeFnr4FKFC=6nQ z1qAto>DaW{={q(v62e(+WK;&yO1Lb!k|G;D1`zA(0FknUSV}u+C2TAF|D+O*td5c# zj$--Nvs}C}5H%;$CoWqyyH!X*a+AzfVm1%Jt%NXJ#%U&IyDxCD8k&7`FbZO$B|7Pw z-3lagr_xdLnH2ygO{ZGa`*si{{GNZ1j6tJs!3jjsiOHOO<;fp+|j#LSb9Z40pqgf3)Kc{=N&-e&W}d@$vS^~fSS0ASq_ zxe7baOX1BBYi@R%PD;(!s_fKGJnN!9V)uwlSCGeic2)u)>b(#Z-Ugxr|EIIHD?3%x zy9|MZHB;34eguG7@=YRiZXSgbUzED(~Elh z(MPewM9HaLz>^lKWMnleJ9RRrYVfA&foM@*Ju$PbMqG%sr3WmbvQuUg@YIsIS?$EG z+KJ6WC*$-WZnLwU*x5jk*~ob!=F}8`T!jI5WKp4=%teKd1CexQ%0j1olBYW8GRDmm zG<6;B4h#(3CyRP%LQ3=Upv#XHK5{Zw&z0HOeWK#T*vPuOyB|yf5PUS)zJ2@c zs0T7Gqa4T!K5(dy4-}K>qeI+>jF}G_03K9QHO5tWvdH_DQ$f0SA)Cl%bJ@<$&bvv* zg9i`JPx{1k)9C2vS71u-39>)@0>G{&M=yF|G zjEs!zfNTru`9{{Vbm`K?!^6Y9>2x}m%jb*ZKXCZ->uG};=2ttzEuMyR2-U1J?Vd<1`^UA9z9 zSVTH66WVA9;_8-pKJ+pgu-#PESd(Zp5-+S-A z`|+pXAV0Is?`;MEGyji|hM=>=*omg-81gKU06;kCf7It>2LF}7=hn9U7DsXp{DB)s zegCeTN^r&+Q$Duev|z%eDQs7W@UBWq_Ur$#`rOW$DcPI6+_&G~picDW2%qQe*y)!u z`?eU6pwVc^UDLk_KLuQazWJQ2x$$F~x;<<@#oHECVcvNlX--`QFmnwQr-E#L(PoOmSS!IpX{Coq3c?T&Oxf^qne+Y`K>h`R5@0vD;Z}2xsd4&8> z*5EiGgpexk)Yk($Y3d~I#O%fEZ))|4O@Ur3ryB+W_4=MRg5*q-#$Ich|G*|I-VAvV zGKPO{hAnhIh?Tq|4@aJV$i5-ESC%rcTWDM6^>-_ztg*D_SXB64;_-B)P6-y))542F zk_PTeXsH@=0*h=Vf`o#EjXPtQ$A{a$ zY$~2H^_g-Q)+AMc%5_FLJc>^pPJA5M3l<+vU0b}e9QGvfas6AUTe$4?;wxAFjkBE0 zPFt`bZ-PvStF!{Ax1+vnE7(RxL@}O3fVvJ)1;c3nQ-4Ud2F>AD&H#v`s5&&~P8)PI zZgn3WP6x%fD)-}W(23Gw!EGHg@IU8SY0~JP5GU6+u zUCXxo*9O#x$C3tl$8Z)=Zm6u#83`qOz{MAaS0WrPeL8hX*CqA3+cJd4@ol*okRuwJ zpRof8h$nE6ur4ni+qX4IyUsTcutdkGehY2lfAdRvJ5VK%(zQZ=yafVi*W^(56a8_E z9VkfSnY?G!8_;mqu}q#9OL^tc+%MlGsew4xa4&U9RlQ-3x3EU+zM8dzF5S9e91@VD z-Sp2;8(mJ%uIbT9rG8%ONl(cf#JMQX44$CH>&M-3>qpE)-+91yVA=2v$TtCr(kr94 zLo(kItXvIgv##vd84T`9cY-Mt6mxj(|LF7}R53P;yJ(mE7oAkrWH7n}lQ_!Go$ky^ zM^`0)Eo4OZY?En!Farxptnb-D-MR+_Y~}G*T9S;hP#Jq~Xy&OIxH%WC#8Y7(LDKWS zJKJNZ(-B;{`YhOu@_KGj=4-_Q+zhac;#;0geh02s{Z8Gkt((*WHCJQbqe%){Qa+ba zEBij%4}f953rLLEV2lE$TX-(|Y2{d?0JHpgx*|37qtzgmBL=>Bv4}$$pp{{P3b)d6 z;B$oKvPat5b~e!J6#)bjKNuraU8gMX!QwQBInJ<&nWXDN~6W zdr?JRTvbmk4$KQnPCLO2X8D{UdgM0VPH1Sh5_Q)H?AwfiROdFsZi=Y6KG3SCbrF7A z#kOod78M+?ubpdCx9jml6FY|w(<0i7`#fmBhsY4|)^tkTpGW&IUp>O&C0Lj3g<8Cj z=pUtul4?8JSxVgedqTQ%S{dgzeX`!H_-sPa;-%N2RU*HjOa=!BPU2C=zLkd@sjSNu z+-4hH4P%p~8wt^lR`^ID)#DHa_T1Tz&Vgz#(BySp_|XI)I1=@mMl|?0gm`mipoS6~6mtATa49hDU|tapH}f8z zFgTP&KH(r7+R{ic|K%L|9q2v_v}4gM04h_YfXY&%S$=+3?fCcuagJQW Z{rp_8@7(#=U!k1f?;CXV*5Q~h{t0E{B*Fjy literal 3981 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 nm0GElTB(&OnKI&V600000NkvXXu0mjff+~0a diff --git a/web/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/web/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 6cdf97c1196d48e9833487ff6de7c4cfc4e1232d..01b714ff3dd22e0494b1da249d4538016e2eba4b 100644 GIT binary patch literal 1909 zcmaJ?4K&+X7QabE(xyV!j4;|p8P>KXCZ->uG};=2ttzEuMyR2-U1J?Vd<1`^UA9z9 zSVTH66WVA9;_8-pKJ+pgu-#PESd(Zp5-+S-A z`|+pXAV0Is?`;MEGyji|hM=>=*omg-81gKU06;kCf7It>2LF}7=hn9U7DsXp{DB)s zegCeTN^r&+Q$Duev|z%eDQs7W@UBWq_Ur$#`rOW$DcPI6+_&G~picDW2%qQe*y)!u z`?eU6pwVc^UDLk_KLuQazWJQ2x$$F~x;<<@#oHECVcvNlX--`QFmnwQr-E#L(PoOmSS!IpX{Coq3c?T&Oxf^qne+Y`K>h`R5@0vD;Z}2xsd4&8> z*5EiGgpexk)Yk($Y3d~I#O%fEZ))|4O@Ur3ryB+W_4=MRg5*q-#$Ich|G*|I-VAvV zGKPO{hAnhIh?Tq|4@aJV$i5-ESC%rcTWDM6^>-_ztg*D_SXB64;_-B)P6-y))542F zk_PTeXsH@=0*h=Vf`o#EjXPtQ$A{a$ zY$~2H^_g-Q)+AMc%5_FLJc>^pPJA5M3l<+vU0b}e9QGvfas6AUTe$4?;wxAFjkBE0 zPFt`bZ-PvStF!{Ax1+vnE7(RxL@}O3fVvJ)1;c3nQ-4Ud2F>AD&H#v`s5&&~P8)PI zZgn3WP6x%fD)-}W(23Gw!EGHg@IU8SY0~JP5GU6+u zUCXxo*9O#x$C3tl$8Z)=Zm6u#83`qOz{MAaS0WrPeL8hX*CqA3+cJd4@ol*okRuwJ zpRof8h$nE6ur4ni+qX4IyUsTcutdkGehY2lfAdRvJ5VK%(zQZ=yafVi*W^(56a8_E z9VkfSnY?G!8_;mqu}q#9OL^tc+%MlGsew4xa4&U9RlQ-3x3EU+zM8dzF5S9e91@VD z-Sp2;8(mJ%uIbT9rG8%ONl(cf#JMQX44$CH>&M-3>qpE)-+91yVA=2v$TtCr(kr94 zLo(kItXvIgv##vd84T`9cY-Mt6mxj(|LF7}R53P;yJ(mE7oAkrWH7n}lQ_!Go$ky^ zM^`0)Eo4OZY?En!Farxptnb-D-MR+_Y~}G*T9S;hP#Jq~Xy&OIxH%WC#8Y7(LDKWS zJKJNZ(-B;{`YhOu@_KGj=4-_Q+zhac;#;0geh02s{Z8Gkt((*WHCJQbqe%){Qa+ba zEBij%4}f953rLLEV2lE$TX-(|Y2{d?0JHpgx*|37qtzgmBL=>Bv4}$$pp{{P3b)d6 z;B$oKvPat5b~e!J6#)bjKNuraU8gMX!QwQBInJ<&nWXDN~6W zdr?JRTvbmk4$KQnPCLO2X8D{UdgM0VPH1Sh5_Q)H?AwfiROdFsZi=Y6KG3SCbrF7A z#kOod78M+?ubpdCx9jml6FY|w(<0i7`#fmBhsY4|)^tkTpGW&IUp>O&C0Lj3g<8Cj z=pUtul4?8JSxVgedqTQ%S{dgzeX`!H_-sPa;-%N2RU*HjOa=!BPU2C=zLkd@sjSNu z+-4hH4P%p~8wt^lR`^ID)#DHa_T1Tz&Vgz#(BySp_|XI)I1=@mMl|?0gm`mipoS6~6mtATa49hDU|tapH}f8z zFgTP&KH(r7+R{ic|K%L|9q2v_v}4gM04h_YfXY&%S$=+3?fCcuagJQW Z{rp_8@7(#=U!k1f?;CXV*5Q~h{t0E{B*Fjy literal 6644 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 diff --git a/web/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/web/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 46de6e255a95abb68a915d7cb45776d890768922..5f8825c595d833fd2533def1789134f5abe62534 100644 GIT binary patch literal 10475 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 Y;QQTE#tYyhMr`wjZ%yy4KXCHD04Z6o_5c6? literal 9441 zcmbW7_d8tAANJ3##jd)sR*AN&%gRUZb+w2d5~35GDA7e*ix5Oa4T6m{U65$eqRVO# zy|*BVvLbqWe4oGIxt<@+oS)7$*UXu@-}k)kd1_>EieCzHDrL)0!XDtSdd`n5O^#-%xwSq_}C)t@WLB>Tca{I&q74)0g)Bl1f^e5ah?aW7!5 zDEa4&&;aY5n$NrBD(9c(eAkXHYCcu+RJ<3I??aZv%tL%*Zt%EO3SH0cH5=}B$fJs4 zOt@!!1Eamd%1gg;k8$*mWY2pJzlYD}b*Z94ysIkjjrs3|eBJSp8vf?e{Ao0B`2+oz znf)dIlcj(YzZ$cW1m%3ppPcs-k(qDJJZ}6B_GeVGE!yZZrgduSu5ZjIn*B3o^|m_U zQlgx&=x#R6xPjajnzbwwL&~qQaG2bYj6SFF|E`F=kvL5U&g$DM+S?nZ4~96a1bu+R zA4kKGH+N4$=MA{hmGU!P*-P%Ibr}{N-Kp^SdqnXXKAb`Ba>j1uVc!4Q7}^`$@^F6U zt%Hy#Q@FBJm!EJ7?B%U-o$Miz*Ty+(R)#2O`E^%Xv+U2G^r-wV2X2a=Q2tA@W0N=_sEjJbM%~8DL zoeYI``|@q?jxak&BX6;fL&Jt2ph}&>i~vbLSAg zMt;2T6fU4~ggC>^TO-cRR2?j9A7*FE0psPClmPp?lHWtY`dlhdt!wD`YKBk7XNvF* zEsw4tGSFG>i`~KoaOb%afloA=f|9ZT@@&e2`0AK!a7R!72gT-;Z4Z2FLqiDZCrG{Q z?dwj)EpJ!&&S~#fRND|cI1Y{IwevM00y6ald5$N$d3!dCTx! z&r8iXy|}Cjs)R!OW1p0G9`BZh(t}QfVHoG9gI=EJ{ev_B#dQ>jXm|1`*aW^4lPtaLfDF!zV{bI!XO#!ugS(0k%+R@9je_~bD#U-UN z&9HmA3jU2Yri&yv8+r{67b9?#Tw$aFtcNu4LxNtlL#{opjd3gZlcRb1q?}@rsXCmm zBNqwn*O(0U`4lJMK$HF8sLpFodJmXnUZGZ<1CQvKl?~p zQ9w5<>tV}|0TA&wt>BE>)pL8cp~s0F=SG7=VobvZ>4811jq#*A9X2pVZ$Iri9>FGa zliDC{eOB5!BWMy=!flbor>E?eD()kb(%<}~{2P|FIaNPzf2 z4eqEjnt~ywuEIv(Dol{c5H`%+tu5WLJ&5v9gbo0gk!S2m7u8fq&YCR|Sdi@@e&D_6 zLyufP^b_5a(mp*#ev#!DoJK&tri0qD1>(V==N!-IKKPee`=SIVC zRvUSn^wZVD%^3<@etv!@pb>@gx+6A9U$>#aPD-`WaMaet>7FIrL-b4h z3g#nDQ{X=2N1XWmQx~AXVMW*E*m$YA9%%WU1&Ta=+B%kDHMp02Ceh^Nn5#0MK=jo} z`QfI3h_|Vys&z01Ue$mSkq%vhRcV$|1-sSU7ovXJntHxtT?H7v##U!XQE%+9DWJ;H zAKZdBMQpyJZBolKk8R6N>s@t21o~?u8P|JA=(3d`#J5((pR*8UJQI)(b^I2sD32YL z4g|t8nk4&5S7sW)j8|{S327dqNobW*v=MJBa4i)~DJ&6``r5wQ-0xEc8uI@P#^^xR$U+RC8($Uenj@uZHEzjT>-taAW?3pU-B?yZ|J+O7Pg5WD!A zMorX0y7zE`b(Lr+BOk5$VL7Dj_9e06;+cyuv_8#hWf`+B&yDEknHGF)kjLX7 zOa+EtR@Vvd+BPI4L}ti9=sm?OS{P`4WM3M{??wI$GQF&(gxFpxohy3(jcMF2O^ZQvr2#Ei7aNjXcF~{>g-F38yBUfmf;ML(j0Vs>Oq_k1TpsSjS{u3 zWG|oBE+v)}8d*SSIaePurkM$Rp#PCaepL~A!{F6Io;-850Pc^af#*fVI<2piRCtBW z7S8S-Nhd`bg1QKmHrh48M(!VSVsP|8K!Kf^pTD+ak>9s*$b>{wm!tU)NtDsA{qk9L zmxvn|9^;e1aKu;+E~AYMFWHZl7+m-RZzaPQp%TYPq6Mny4q?MgmlOF_Kz%0}zzNOV8tqSdgy~$U0zUFG z2R<=_KzuF_pWo|kKEK|ONp(5B-h{4y9N=F7v_$&!qBO}>`U2M=s_|kAwe5sl#82aL3##CN;L`T$E zx)G{j=r;cXKke~RQXCM?en`Uk;nnCa+n10$vBboh-R))j@(rk68+ z@OHF4I*XK1sfvA4JDN8xICakkx2dshIsg!MN$#QP_ERj0gHqL~$V6RP(_$jcDe2rj z7=-`wINA)HzmbwHHqQ{r#}W`OuA?ASMzc7T2F{zXZMy-pyvzT3214#T0ovQG;@5vVZ zVCApv7k1EKwYO$IYcNzt=#G}|nR5`?a0eye-^)UuRmi2r4}yZ)^n5c)X5U5adm^;I zvlodaFSG2e@dlbex2G645izmatw=I_^xd;LfAW)V@lpkJJQ+C5np8-RbbfuFPC>YR z#@b7I@{CyqeK;ON2^s1NO6m~rPFZbyUZJ>PH4n7Wf-2=8tPU(P+ut`I>j1Nnk-4K} zMpdl0J4G1qu!&&jB8jEf_xK_9Yw#YOHk8jPM079uNF;Qe0v8|yxfYJEoLXM6jW6J_ zM;lwCfV;+yr^L!yO2Fsyv07K#4Ju|Z_PjGn>y^r{`Y+jrADIL+zKM4W%R|=sxaBW? zq9WJ;8HlYd)0_Y)Y zY(F}vcG5u#mjM(S%%Luj@MhZMIxj?Egpx* zxt*$Z+Z+~b*YNkgCRefHiP0$1eR6_&_oPT)?CC+SBV1O!%;dMfYl|YNK<@3-a%>8asGau0!o9|jK2GceD+V6!a4_cv;3OrZ&`R7(=YXR{|uoZf$#au2PQRf372cnXn}TAeI#{WgC-U(X6SQI58C2(NGv*H-d~E9 zPvaWc&J(M>n2-FD1VK5+-v#Y*iS}CEXv{s`+=ieacrF;u?l9(%qOtUieD{^6I3RI5 zHK>TnLxg0m%n}wq$s@J7#$1@(f^x9b8}+5$WR}-y`5^ zL2l}3c$N>BT{-I-Rv+dCtVDv}z{}=JQx%Gjytll8#h68BdLS$u+}p{W2owKO)-*CC z0F{ipS{&QT97=t$`2rtfxtypIAhzD}AR zL)^490Ze(UHowRg6Bm%`73%P61`X*r*GrI8+yVL&653R2EHJ6yubDW=O^av^C4Nc* z!x$quz+LUL8g4sgei zIzLs>KK9@H+L=E|X-mr9`l1*z^}Ko>F@6t z%D?ZC9KM_(1^zP{mLSzUcI5nq02RO=@lnV@q>mFm`^|%{Aq>w&MS|56F>jt|XFN<; zpvKoqL;(Ql-_l(uTDnyzBF3Gkt4A!ko*``LC%r0V4~v5Qs<}-A|I|FXpDg6Ov*2F} z$i>Ng<`@6~M)5z~owj9!XJ((!^%-RNkDdq>c)D=z7tl^G(vNR4AyP7Qa;owXhB*D6 zfASZkL$jmHA&(|XtTcGP`gfW@JoVLNGeNa8w?u-u1_lw_0qUe-__nURXx9$a>)N4W z_@H14>pLOdI24!IC~IAAUv=KDMEAnplynsrD|k| zvl$T@3q5F*>#hR&$SKBgiaptp^&w#fLum4~Z%1r=l;}Rj@iMRV`S^&M&agkbufi?^ zg2bkG?i|3{*;nM)zi4Zwn{BTtCEi_}!DuEfu#!(t8Ms6@KEJgd+ot1t&lnMTe)vFu zXv1h_^VENPI72MeX`iN2kwbo(TKsn*9rYW&q&3p5+YL8|zT6lO>{Jo45Kg_BHrv#3HTUs%h}48;)e1kC?1;YQ_byqP)0 zIo6%-XX)cra3Bm=_Zt4b%OIy{AxZtN#;P}*;Fxk8U7z7Z4aqPY{L@h`7GbB#*CBWO zJ{XI^A$2->SrUJDAfpxkCOA>d)%K}4gy|+Jf;KrAOl??qg+~a8jf!`XbzxarTKwNM z?n%J_CV=+V{Yr&4^O!}SDb(df4%Umy6w22j&?7l zDyJ|fE?MX%&hDFLR5chB9|=QVa*#0rX(;VwmP3PNy3gF^YwHNvuAy!+XtxD`y*du2 zUvr+}uLi!_yB`RL%%S{bWXRxD*vNibf02Yzv9%kOR&(&y-@7y{5Vsulyce)FZQrVt zqItF4*8d{LDcMmE-JhVoyCEtzQsS?#%w3Zn7K2uNAPCQRHXDBRZptal77;U(vIfK5 zM2wPn%}Niz&rFL4yc1htz@g5^zDT}$sfWyN-Xv4^`!HjnN`H=l2(tLga=WW_$s&cm z5>b1gbAUwQnG63e;7$<|Gkq3BXA!r%Phz%WY+ z^WU9#UO)-$)@>hnT^nYiNQQEIB6FqI?lIW2AX+Ja6k~^C0k6BK{3G3zjiOU9{3!Dw zO+i{x9ay$)$u&GnLtT|LQNYGMOQvfA)1D&UME*5-S2pjM>vNYk7)}9-lS}_Mi@xUa z0t^Y7!eE(^mnBMCg`uTa?siy*kUbVF_4hBPQhzST?#_4g$K%L@$LePR&~|_%8pi^q zejRM98g**>trKz9Z9}B-7qrjjpg_X!lF!>W5$vLn9T5 zPm@|7)EJ3UNIfR~AHzfB?RuHmB0nMIuQ|)>07=y+?p8cws&hw1%HMA>ao+Z$2-%_E zF%!4-SBdd(S3y>Xmx@#7uPqevXl`vqR0(vT%OI$c%UQRS5K95FMcCIAYG6VKu>G2J zy#kePc90Mr>J-k_xZ=VOX%OGmNlDy6$QmY&|C}P!!|zM9dOa=Jzxf~h3HK3%4yt+< zhw1x<2{FixH?d(2e88qEn%`j!TbAwi+9m#YO%@JT_H#{7__tnrL7GU2^wAk|8DUbHt1 z9tj8TpjoQ_QaHR?-(Y0mZ25V5@D05EB6ZB-1pd+N!#9~ulmO8#v?G-x^T@nl9fW7Y zq0*q81&JZ=onQU^CZ}v!Jaq~?OSacD?taM+!7gV3yuFB|d*!m1_^ccdG`3AZ9s*Z9 zY5ZJBc%|7WR9`JzZD{9`ln1vPCFQIcRm7~Z)Fg>fzZkboAl>YOo!-wv0G))#jn>_NhxE#Az3Y1h~G1horrQ z;DUmbH1mVIV>N0iupH75FPG&H9C|Oi}-bKhji>p(T zPl2k{M_ma|Xz)Da4kdO582<4i?Kd5Nz{*(Y(nr2 zj0wyKdl_O0F@Pycogu+5VIfZ}(7@f3tj)ymFs#D(UMv}*Xn<9-;$8ERH znR3W~&^5aI%g;@^1!?dl0r#1r+kTPwAGg#RPMGo!YqS&^Lt{X8^RHgjb+9$}PUCSu zVVT>befOnuKbVj~p5KAC3Do~!YAqCyVC#ulg_YH)+iMzdU);`c`sZ=wk3?)@d2bb4 zNpxNrX%)qnSQ*ZdJ_m)n;#PwP-#0Zi1upkXbn+KINac;Os`wCcC2Hg0LPXN4Yl8!na2q`x8g(v~aZ<~Q`9GyJ}+$~k#k{;_+<=#E6>z}G>9XpM`aZLKM|vsryq zKva?{!csHp?&Gdec5W6pA#p*kdDv{|pr1i9k95^?ZDx@?Qb4n6i>(Dq={r3FqF}~Ihv+!xuJ$(-9#!##IpAZ`%5^lPg1ma(>}boLVyAY1MY*EZZ@`ZEHGB)_IQz0+j3VE z(#1IGpK~I`NfCI#^W7)ay5J}Ys?k6U4uRi|hl}nyaMZXY%P=W< z4}Z&Ot3EFMzH$-|CnaUA2b+Z5T+$g9vqUfY#b623zkEJr+dd153BsV_O}g(JdZDw` zQ6mJ$>_MT6k4d}fn0Odo6*f7R?V9DP_i`kO4#|)%R#*vXRLZ9=dHhM>_UrH@xLc3s zlfAz%#=H{&+E1!3_d;Igq@G-XjovxJ;8o4$ z&H5rsK?$~wKdPF?zv1@w6GamauU%EV=SD7JP{#kD@_`DHP%7v1r7G?m+CA=|H#EX?=KU;*e_`#*XXZpwHTa+eSC}Knx{?eb z*c5AYxjQ8hpQ4OjNOTvX;`h4yO|grLw%TL<_V5_ZIC(mtGW^$L4!lJfFSE0;_G+%X z#^9OFno%lE<*5>QGPzd5@X9&=5d`q!P0t+7pAqj!^q7o<`h{3QM;I^P(s=7@_T6&r zW!>P1b~mFpSb)2JYxMK;c5AQ=9is#wO3UTqg;>)T1NQ*BOvd^BizQm!?y)qdNletT ziOm!YC}O`|A-I-OqNPBq7QE#Jfr_f+F4V-@9YY4bzpkakZMCnOOD{>B zVux8OKQDXZQ9HC)&@RD(2HG7a-t;KdsxS;3R9#jM(q_o{X93fQlTTA8xVWz!GJ005 z<}Hn_B%3i&VQ0Vu6r;E3)eh_}Ici4P?W}%#kTG>NiuON_=n)}pY16!E+j1uH@3mQZZVAi% zWfwaCR7dj?`|s}`gO$>jU2gxU&HX@)@U)MG4X!lXyTJnvy!>I?>qRFP{6(lwg;2S zip@RKb@-|y&QB(ayXUDb6b@(oT%r%eLBN)T@_w;l9u#0#3?{XHg-Mq&&1AB}gc2QD zS4`F0+=KU-#t?S#wk(jxzEBo`l8znKdcNfys_IZX?(9f~OB882;;pa0g8dkzCi>up z53d)i!%gFE*^^qB{ql1bwTDQE@F1652b;r=5eo$NS{{t}eXupt_dN1!MUGIF_+R73 zsxSx$oJ^7!Qbgzxez>Z*4CO0Xx=Wd)-xwk@bLc!a@0Rt1E_WXPc!Kgu)s2ypbY9~a zm91%&S5(y7=sdYTHeL|bZJ=`g@Baomr`umxKLuPIuNS~9YNWD+fMn%g zZ_^Ay4!we4m4!Cuz)TEBGz<8srd;qH=c z!~Yh=4276zLC$<;!xW8g`(*o-wB4|a!{n1^H;!JQE^N<#n|Y|}5{j?FP$ajiz_dkf zz7*g*{d)LEkqQ8u$!#%ToJ_P{6kNs6FQO^wbNH{N49Fu}L2ldb_rx~uaX*#f z(&dZv)Z4gwmttRP<0#l+WUTXLZ^nQ}_jL)|A{IvD(Latu#rS`(CWA*ErSAJ};MwK< zi=4mcY=FcqQTk<0c3lNu{rw@_vLx)Wa^(DKN#?D6t!q5%&Cfy7k-Q}o0{yS6v;puzqM|28p%F} zTA!C_+zA-nb(f;;cQh7c>}?4@?HwM59}jp()HuvHg#<+fs;bv!4px88klX9=K+0wu zsK_nFAe6&qAN5!RTrmf&R`othO#%gBzWRnk)z(Tx(`R0s?8dd;3l**ZMs%+Seke_@ zt%|IX7L`qReWg#PZee?g;-J60{-@Q!@9)BQ715%7@9T_#&o=YDChN`F*ryYu@>}fH zTTjlY|7e9iejKQ@+ld$&C{T$6jeWC?a#mF!T-_chFV-8p*uDpd`wOTxF*O}b)wo1% zBuNYcsUUnS;e18Hx&P=NbL&x;ZewF(MeA-iTPshsZIJauP{p6$373~P6Z;(BCtNQo zDvnw)1Ak&7Zk}6PTlYnBdCK4^lp}Y$vT*#WY=mpWRIU`C$gWp^_Q#i(Uv;T32MW!W ze}Pp!ZK!b`kl*?D!|;-23;5c@LQ_rj^7uMR;eYi>H~IqMsXx$LeZ&ga%ZBdET38{j-SDufm~13WNNo8VY3r)o%*8 zPt!LBT_RG;V^=&q**!g+v=pcpXrufzU)sl2J5Ld39-gWbmG|XCFKQm@_xlVSd5T1+ zz~3w2Qmg|%@XH$<-65oey9fP0-~36fyQDnqc3C - + - + Météo Exam - - - - - + - -
+ +