pawnote
Version:
A purrfect API wrapper for PRONOTE.
1 lines • 54.1 kB
JavaScript
import{setCookiesArrayToRequest as e,defaultFetcher as s}from"@literate.ink/utilities";import t from"node-forge";import n from"pako";var i=e=>{let s=new URL(e);s=new URL(`${s.protocol}//${s.host}${s.pathname}`);const t=s.pathname.split("/");return t[t.length-1].includes(".html")&&t.pop(),s.pathname=t.join("/"),s.href.endsWith("/")?s.href.slice(0,-1):s.href},a=(e,s)=>e.instance.weekFrequencies.get(s),r=(e,s,t="timetable")=>{const n=e.instance.version.join(".");return`${e.information.url}/ical/${t}.ics?icalsecurise=${s}&version=${n}¶m=266f3d32`},o=class extends Error{constructor(){super("Unable to resolve the challenge, make sure the credentials or token are corrects"),this.name="BadCredentialsError"}},c=class extends Error{constructor(e){super(e),this.name="AuthenticateError"}},u=class extends Error{constructor(){super("You do not have access to this area or your authorizations are insufficient"),this.name="AccessDeniedError"}},l=class extends Error{constructor(){super("Your account has been deactivated"),this.name="AccountDisabledError"}},d=class extends Error{constructor(){super("You can't send a message or a draft in this discussion"),this.name="DiscussionActionError"}},p=class extends Error{constructor(){super("You should request messages before sending anything"),this.name="DiscussionMessagesMissingError"}},m=e=>{if("["!==(e=e.trim())[0]||"]"!==e[e.length-1])return[];if(0===(e=e.slice(1,-1)).length)return[];const s=[];for(const t of e.split(","))if(t.includes("..")){const[e,n]=t.split("..").map((e=>parseInt(e)));for(let t=e;t<=n;t++)s.push(t)}else s.push(parseInt(t));return s},h=class extends Error{handle;constructor(e,s,t){super("You're asked to custom your security methods"),this.name="SecurityError",this.handle=((e,s,t)=>{const n=m(e.actionsDoubleAuth.V);return{availableSecurityModes:m(e.modesPossibles.V),defaultSecurityMode:e.modeSecurisationParDefaut,passwordRules:(i=e.reglesSaisieMDP,{maxLength:i.max,minLength:i.min,rules:m(i.regles.V)}),shouldCustomPassword:n.includes(x.AIHMSC_PersonnalisationMotDePasse),shouldCustomDoubleAuth:n.includes(x.AIHMSC_ChoixStrategie),shouldEnterPIN:n.includes(x.AIHMSC_SaisieCodePINetSource),shouldEnterSource:n.includes(x.AIHMSC_SaisieSourcePourNotifSeulement),context:{authentication:e,identity:s,initialUsername:t}};var i})(e,s,t)}},f=class extends Error{constructor(e){super(`The source name is too long, limited to ${e} characters`),this.name="SecuritySourceTooLongError"}},g=class extends Error{constructor(){super("Your IP address has been suspended"),this.name="SuspendedIPError"}},D=class extends Error{constructor(){super("The session has expired"),this.name="SessionExpiredError"}},w=class extends Error{constructor(){super("The requested page does not exist"),this.name="PageUnavailableError"}},b=class extends Error{constructor(){super("The site is temporarily unavailable"),this.name="BusyPageError"}},C=class extends Error{constructor(){super("You've been rate-limited"),this.name="RateLimitedError"}},A=class extends Error{constructor(e="An error occurred, server-side"){super(e),this.name="ServerSideError"}},E=class extends Error{constructor(e){super(`Unreachable code reached in '${e}' function, please open an issue on GitHub (LiterateInk/Pawnote)`),this.name="UnreachableError"}},v=class extends Error{constructor(e){super(`The file you are trying to upload is too large, maximum allowed is ${e} bytes`),this.name="UploadSizeError"}},y=class extends Error{constructor(){super("The file upload failed"),this.name="UploadFailedError"}},V={STUDENT:6,PARENT:7,TEACHER:8},M={None:0,Easy:1,Medium:2,Hard:3},P={None:0,Paper:1,FileUpload:2,Kiosk:3,AudioRecording:4},N={Link:0,File:1},S={lu:"lu",nonLu:"nonLu",archiver:"archiver",desarchiver:"desarchiver",transferer:"transferer",signaler:"signaler",modifierCategories:"modifierCategories",fermerDiscussion:"fermerDiscussion",ouvrirDiscussion:"ouvrirDiscussion",signalerSuppression:"signalerSuppression",Trash:"corbeille",Restore:"restauration",Delete:"suppression",brouillon:"brouillon",plus:"plus",purger:"purger",discussionEnFenetre:"discussionEnFenetre",entrerSortirDiscussion:"entrerSortirDiscussion",modificationObjetDiscussion:"modificationObjetDiscussion",afficherDestinataires:"afficherDestinataires",copierContenuVisu:"copierContenuVisu",repondreMessage:"repondreMessage",afficherDiscussion:"afficherDiscussion"},I={OCEM_Utilisateur:0,OCEM_Pre_Reception:1,OCEM_Pre_Archive:2,OCEM_Pre_Envoye:3,OCEM_Pre_Brouillon:4,OCEM_Pre_Poubelle:5,OCEM_Pre_Signalement:6,OCEM_Expl_Bleu:7,OCEM_Expl_Vert:8,OCEM_Expl_Rouge:9,OCEM_Pre_CarnetLiaison:10,OCEM_Pre_Alerte:11,OCEM_Pre_ContactVS:12,OCEM_Pre_Conversation:13,OCEM_Pre_InvisiblePlageDesactivee:14},L={Send:0,SendEveryone:1,SendEveryoneExceptParentsAndStudents:3,ReplyEveryone:2,ReplyEveryoneExceptParentsAndStudents:4,Close:5},T={Entry:0,Main:1,Side:2,Drink:3,Dessert:4,Fromage:5},R={UNKNOWN:0,TEXT:1,PDF:2,EXCEL:3,ARCHIVE:4,IMAGE:5,SOUND:6,VIDEO:7,DIAPORAMA:8,GEOGEBRA:9},k={URL:0,FILE:1,CLOUD:2,KIOSK_LINK:3,CONFERENCE_LINK:4},x={AIHMSC_PersonnalisationMotDePasse:0,AIHMSC_ChoixStrategie:1,AIHMSC_ChoixCodePINetSource:2,AIHMSC_SaisieCodePINetSource:3,AIHMSC_ReinitCodePINetSource:4,AIHMSC_SaisieSourcePourNotifSeulement:5},O={MGDA_PasEncoreChoisi:0,MGDA_Inactive:1,MGDA_NotificationSeulement:2,MGDA_SaisieCodePIN:3},_={csch_VerifierPIN:0,csch_VerifierMotDePassePersonnalise:1,csch_LibellesSourceConnexionDejaConnus:2,csch_EnregistrerChoixUtilisateur:3,csch_AffecterModeDoubleAuthentification:4,csch_AffecterCodePIN:5,csch_RenommerSourceConnexionConnue:6,csch_SupprimerSourceConnexionConnue:7,csch_AffecterMotDePassePersonnalise:8,csch_ModifierLogin:9,csch_DemandeReinitialisationPIN:10,csch_VerifierCodeReinitialisationPIN:11},F={Aucune:0,Classe:1,Group:2,Teacher:3,Student:4,Responsable:5,Niveau:6,Orientation:7,Specialite:8,OptionSpecialite:9,Etablissement:10,Period:11,Service:12,Absence:13,Delay:14,Exclusion:15,Subject:16,Room:17,CoEnseignant:18,Suivis:19,Cours:20,Infirmerie:21,AbsenceRepas:22,Pilier:23,ElementPilier:24,Competence:25,_DisciplineBrevet:26,Palier:27,SousItem:28,Evaluation:29,Stage:30,SousMatiere:31,MaitreDeStage:32,InspecteurPedagogique:33,Personal:34,EvaluationHistorique:35,DossierProgression:36,ContenuDeCours:37,TravailAFaire:38,Progression:39,Dispense:40,Punishment:41,Sanction:42,Communication:43,AbsenceInternat:44,Observation:45,ObservationProfesseurEleve:46,ConvocationVS:47,DocumentJoint:48,InternetCategorie:49,DocJointEtablissement:50,Option:51,ProgrammationPunition:52,ReportPunition:53,DisciplineLivretScolaire:54,QCM:55,ExecutionQCM:56,QCMEditeur:57,PartieDeClasse:58,DocJointEleve:59,Devoir:60,InternetEnumere:61,AppreciationBulletinCompetence:62,Entreprise:63,DomaineProfessionnel:64,OffreDeStage:65,SujetDeStage:66,DocumentCasier:67,Message:68,PossessionMessage:69,RelationMessageDocJointEtablissement:70,Engagement:71,PrecautionaryMeasure:72,SousCategorieObjetDossier:73,Incident:74,ProtagonisteIncident:75,RelationIncidentFichierExterne:76,RegimeEleve:77,RepasAPreparer:78,SessionDeStage:79,Materiel:80,Bourse:81,RelationTravailAFaireEleve:82,LieuDossier:83,ElementProgramme:84,ChapitreEltPgm:85,EltPgmTravailleCDT:86,Appreciation:87,ExecutionDevoirKiosque:88,PanierRessourceKiosque:89,RessourceNumeriqueKiosque:90,MetaMatiere:91,EvaluationSujet:92,EvaluationCorrige:93,LibelleCours:94,Site:95,QuestionQCM:96,RelationElevePilierDeCompetence:97,QuestionCopieQCM:98,Coordonnees:99,ResponsablePostulant:100,ExecutionQCMEleve:101,DocJointInscription:102,CategorieDossier:103,MEFGEP:104,AutreOrientation:105,Commission:106,ReponseEducative:107,SuiviReponseEducative:108,NatureDocumentEleve:109},U={NONE:0,CREATION:1,MODIFICATION:2,DELETION:3,CHILDREN_MODIFICATION:4},G={Error:-1,Grade:0,Absent:1,Exempted:2,NotGraded:3,Unfit:4,Unreturned:5,AbsentZero:6,UnreturnedZero:7,Congratulations:8},B={Lunch:0,Dinner:1},j={InformationText:0,SurveyText:5,TextInput:1,UniqueChoice:2,MultipleChoice:3},q={Reception:0,Broadcast:1,Draft:2,Template:3},$={LogBookIssue:0,Observation:1,Encouragement:2,Other:3},H={NONE:0,LESSON:1,CORRECTION:2,DST:3,ORAL_INTERROGATION:4,TD:5,TP:6,EVALUATION_COMPETENCES:7,EPI:8,AP:9,VISIO:12},J={ACCOUNT:0,ACCOUNT_CONNECTION:1,DIRECT_CONNECTION:2,TOKEN_ACCOUNT_CONNECTION:3,TOKEN_DIRECT_CONNECTION:4,COOKIE_CONNECTION:5},K={Grades:198,Resources:89,Assignments:88,Timetable:16,Evaluations:201,Account:49,Presence:7,News:8,Notebook:19,Discussions:131,Gradebook:13,Menus:10},Q=async(n,i=s)=>{const a=new URL(n.base+"/"+(e=>{let s;switch(e){case V.STUDENT:s="eleve";break;case V.PARENT:s="parent";break;case V.TEACHER:s="professeur"}return`mobile.${s}.html`})(n.kind));for(const[e,s]of Object.entries(n.params))a.searchParams.set(e,s);const r={url:a,redirect:"manual"};e(r,n.cookies);const{content:o}=await i(r);try{const e=o.replace(/ /gu,"").replace(/\n/gu,""),s="Start(",i=")}catch",a=e.substring(e.indexOf(s)+s.length,e.indexOf(i)).replace(/(['"])?([a-z0-9A-Z_]+)(['"])?:/gu,'"$2": ').replace(/'/gu,'"');return((e,s)=>{const n=!e.MR&&!e.ER;return{url:s,id:parseInt(e.h),accountKind:e.a,demo:e.d??!1,accessKind:e.g??J.ACCOUNT,rsaModulus:n?"B99B77A3D72D3A29B4271FC7B7300E2F791EB8948174BE7B8024667E915446D4EEA0C2424B8D1EBF7E2DDFF94691C6E994E839225C627D140A8F1146D1B0B5F18A09BBD3D8F421CA1E3E4796B301EEBCCF80D81A32A1580121B8294433C38377083C5517D5921E8A078CDC019B15775292EFDA2C30251B1CCABE812386C893E5":e.MR,rsaExponent:n?"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010001":e.ER,rsaFromConstants:n,aesIV:t.random.getBytesSync(16),aesKey:"",skipEncryption:e.sCrA??!1,skipCompression:e.sCoA??!1,http:e.http??!1,poll:e.poll??!1,order:0}})(JSON.parse(a),n.base)}catch(e){if(o.includes("Votre adresse IP est provisoirement suspendue"))throw new g;if(o.includes("Le site n'est pas disponible"))throw new w;if(o.includes("Le site est momentanément indisponible"))throw new b;throw new w}},z=class{static decrypt(e,s,n){s=t.md.md5.create().update(s.bytes()).digest(),n=n.length()?t.md.md5.create().update(n.bytes()).digest():t.util.createBuffer().fillWithByte(0,16);const i=t.util.createBuffer(t.util.binary.hex.decode(e)),a=t.cipher.createDecipher("AES-CBC",s);return a.start({iv:n}),a.update(i),a.finish(),a.output.bytes()}static encrypt(e,s,n){s=t.md.md5.create().update(s.bytes()).digest(),n=n.length()?t.md.md5.create().update(n.bytes()).digest():t.util.createBuffer().fillWithByte(0,16),e=t.util.createBuffer(e);const i=t.cipher.createCipher("AES-CBC",s);return i.start({iv:n}),i.update(e),i.finish(),i.output.toHex()}},Y=(e,s=!1)=>({iv:t.util.createBuffer(s?"":e.information.aesIV),key:t.util.createBuffer(e.information.aesKey)}),W=class{constructor(e,s){this.session=e,this.data=s,this.session.information.order++;const t=s;try{const e=JSON.parse(t);if(e.Erreur){const s=e.Erreur.Titre||"Server Error";throw new A(s)}if(this.data=e.donneesSec,this.session.information.skipEncryption||this.decrypt(),this.session.information.skipCompression||this.decompress(),"string"==typeof this.data&&(this.data=JSON.parse(this.data)),void 0!==this.data?._Signature_?.Erreur)throw new A(this.data._Signature_.MessageErreur);if(void 0!==this.data?.Signature?.Erreur)throw new A(this.data.Signature.MessageErreur)}catch(e){if(t.includes("La page a expir"))throw new D;if(t.includes("Votre adresse IP "))throw new g;if(t.includes("La page dem")||t.includes("Impossible d'a"))throw new w;if(t.includes("Vous avez d"))throw new C;if(t.includes("s refus"))throw new u;throw e}}decrypt(){const{iv:e,key:s}=Y(this.session);this.data=z.decrypt(this.data,s,e),this.session.information.skipCompression||(this.data=t.util.bytesToHex(this.data))}decompress(){const e=t.util.hexToBytes(this.data),s=new Uint8Array(Array.from(e).map((e=>e.charCodeAt(0))));this.data=n.inflateRaw(s,{to:"string"})}},Z=class{constructor(e,s,t){this.session=e,this.name=s,this.data=t}process(){this.session.information.order++;const e=this.generateOrder(),s=new URL(`${this.session.information.url}/appelfonction/${this.session.information.accountKind}/${this.session.information.id}/${e}`);return this.session.information.skipCompression||this.compress(),this.session.information.skipEncryption||this.encrypt(),{order:e,url:s}}keys(){return Y(this.session,1===this.session.information.order)}generateOrder(){const{key:e,iv:s}=this.keys();return z.encrypt(this.session.information.order.toString(),e,s)}stringify(){return t.util.encodeUtf8(JSON.stringify(this.data)||"")}compress(){const e=t.util.createBuffer(this.stringify()).toHex(),s=n.deflateRaw(e,{level:6}),i=Array.from(s).map((e=>String.fromCharCode(e))).join("");this.data=t.util.bytesToHex(i)}encrypt(){const{key:e,iv:s}=this.keys(),n=this.session.information.skipCompression?this.stringify():t.util.hexToBytes(this.data);this.data=z.encrypt(n,e,s)}async send(){return this.session.queue.push((async()=>{const e=this.process(),s=await this.session.fetcher({url:e.url,method:"POST",headers:{"Content-Type":"application/json"},content:JSON.stringify({session:this.session.information.id,numeroOrdre:e.order,nom:this.name,donneesSec:this.data})});return new W(this.session,s.content)}))}},X=/^\d{2}\/\d{2}\/\d{4}$/,ee=/^\d{2}\/\d{2}\/\d{4} \d{2}:\d{2}:\d{2}$/,se=/^\d{2}\/\d{2}\/\d{2} \d{2}h\d{2}$/,te=(new Date).getFullYear().toString().slice(0,2),ne=e=>{if(X.test(e)){const[s,t,n]=e.split("/").map(Number);return new Date(n,t-1,s)}if(ee.test(e)){const[s,t]=e.split(" "),[n,i,a]=s.split("/").map(Number),[r,o,c]=t.split(":").map(Number),u=new Date(a,i-1,n);return u.setHours(r,o,c),u}if(se.test(e)){const[s,t]=e.split(" "),[n,i,a]=s.split("/").map(Number),[r,o]=t.split("h").map(Number),c=new Date(parseInt(`${te}${a}`),i-1,n);return c.setHours(r,o),c}throw new E("decodePronoteDate")},ie=e=>({id:e.N,name:e.L,startDate:ne(e.dateDebut.V),endDate:ne(e.dateFin.V)}),ae=e=>({id:e.N,kind:e.G,name:e.L,startDate:ne(e.dateDebut.V),endDate:ne(e.dateFin.V)}),re=async(e,s=null)=>{const n=t.pki.rsa.setPublicKey(new t.jsbn.BigInteger(e.information.rsaModulus,16),new t.jsbn.BigInteger(e.information.rsaExponent,16)),i=e.information.aesIV;let a;a=e.information.rsaFromConstants?t.util.encode64(e.information.http?n.encrypt(i):i,64):t.util.encode64(n.encrypt(i));const r={identifiantNav:s,Uuid:a},o=new Z(e,"FonctionParametres",{data:r,donnees:r}),c=await o.send();return(e=>{const s=new Map;for(const t of[1,2]){const n=m(e.General.DomainesFrequences[t].V);for(const i of n)s.set(i,{label:e.General.LibellesFrequences[t],fortnight:t})}return{version:e.General.versionPN.split(".").map(Number),nextBusinessDay:ne(e.General.JourOuvre.V),firstMonday:ne(e.General.PremierLundi.V),firstDate:ne(e.General.PremiereDate.V),lastDate:ne(e.General.DerniereDate.V),navigatorIdentifier:e.identifiantNav,endings:e.General.ListeHeuresFin.V.map((e=>e.L)),periods:e.General.ListePeriodes.map(ae),holidays:e.General.listeJoursFeries.V.map(ie),weekFrequencies:s,blocksPerDay:e.General.PlacesParJour}})(c.data.data||c.data.donnees)},oe=([e,s,t])=>e>2024||!(e<2024)&&(s>3||!(s<3)&&t>=9),ce=e=>oe(e.instance.version)?{data:"data",signature:"Signature"}:{data:"donnees",signature:"_Signature_"},ue=async(e,s)=>{const t=ce(e),n=new Z(e,"Identification",{[t.data]:{genreConnexion:0,genreEspace:e.information.accountKind,identifiant:s.username,pourENT:s.useCAS,enConnexionAuto:!1,enConnexionAppliMobile:s.reuseMobileAuthentication,demandeConnexionAuto:!1,demandeConnexionAppliMobile:s.requestFirstMobileAuthentication,demandeConnexionAppliMobileJeton:s.requestFromQRCode,uuidAppliMobile:s.deviceUUID,loginTokenSAV:""}});return(await n.send()).data[t.data]},le=async(e,s)=>{const t=ce(e),n=new Z(e,"Authentification",{[t.data]:{connexion:0,challenge:s,espace:e.information.accountKind}}),i=(await n.send()).data[t.data];if("number"==typeof i.Acces&&0!==i.Acces)switch(i.Acces){case 1:throw new o;case 2:case 3:case 4:case 5:case 7:case 8:throw new u;case 6:case 10:throw new l;case 9:if(void 0!==i.AccesMessage){let e=i.AccesMessage.message??"(none)";throw i.AccesMessage.titre&&(e+=`${i.AccesMessage.titre} ${e}`),new c(e)}}return i},de=(e,s)=>{const t=e.AvecDiscussion??!1,n=t&&!e.discussionInterdit,i=n&&(e.AvecDiscussionPersonnels??!1),a=n&&(e.AvecDiscussionParents??!1),r=n&&(e.AvecDiscussionEleves??!1),o=n&&(e.AvecDiscussionProfesseurs??!1),c=[];if(s.length>0){const e=s=>{"G"in s&&c.push(s.G),"Onglet"in s&&s.Onglet.forEach(e)};s.forEach(e)}return{canReadDiscussions:t,canDiscuss:n,canDiscussWithStaff:i,canDiscussWithParents:a,canDiscussWithStudents:r,canDiscussWithTeachers:o,hasAdvancedDiscussionEditor:e.AvecDiscussionAvancee??!1,maxAssignmentFileUploadSize:e.tailleMaxRenduTafEleve,tabs:c}},pe=(e,s,t={})=>{const n=e.L??"",i=e.G,a=e.N;let r;if(i===N.Link)r=e.url??n;else{const{iv:e,key:i}=Y(s),o=JSON.stringify({N:a,Actif:!0,...t}),c=z.encrypt(o,i,e);r=`${s.information.url}/FichiersExternes/${c}/${encodeURIComponent(n)}?Session=${s.information.id}`}return{kind:i,name:n,url:r,id:a}},me=(e,s)=>{const t=e=>s.find((s=>s.id===e)),n=e.periodeParDefaut&&t(e.periodeParDefaut.V.N),i=e.listePeriodes.V.map((e=>t(e.N))).filter(Boolean);return{defaultPeriod:n,location:e.G,periods:i}},he=(e,s)=>{let t;switch(s.information.accountKind){case V.STUDENT:case V.TEACHER:t=[e.ressource];break;case V.PARENT:t=e.ressource.listeRessources}return{id:e.ressource.N,kind:e.ressource.G,name:e.ressource.L,resources:t.map((e=>((e,s)=>{let t=null;e.avecPhoto&&(t=pe({G:1,N:e.N,L:"photo.jpg"},s));const n=new Map;for(const t of e.listeOngletsPourPeriodes?.V??[])n.set(t.G,me(t,s.instance.periods));return{id:e.N,kind:e.G,name:e.L,establishmentName:e.Etablissement.V.L,className:e.classeDEleve?.L,profilePicture:t,tabs:n,isDirector:e.estDirecteur??!1,isDelegate:e.estDelegue??!1,isMemberCA:e.estMembreCA??!1}})(e,s))),authorizations:de(e.autorisations,e.listeOnglets)}},fe=e=>{const s=e.split(".");switch(s.pop(),s.pop()){case"eleve":return V.STUDENT;case"parent":return V.PARENT;case"professeur":return V.TEACHER;default:throw new E("decodeAccountKindFromPath")}};function ge(e,s){e.userResource="number"==typeof s?e.user.resources[s]:s}var De={fd:1,login:!0},we=async(e,s)=>{const t=i(s.url);e.information=await Q({base:t,kind:s.kind,cookies:[],params:{...De,bydlg:"A6ABB224-12DD-4E31-AD3E-8A39A1C2C335"}},e.fetcher),e.instance=await re(e,s.navigatorIdentifier);const n=await ue(e,{username:s.username,deviceUUID:s.deviceUUID,requestFirstMobileAuthentication:!0,reuseMobileAuthentication:!1,requestFromQRCode:!1,useCAS:!1});ve(s,"password",n);const a=Ee(n,s.username,s.password),r=ye(e,n,a),o=await le(e,r);return Ve(e,o,a),Me(o)?Ae(e,{token:o.jetonConnexionAppliMobile,username:n.login??s.username,deviceUUID:s.deviceUUID}):Pe(e,o,n,s.username)},be=async(e,s)=>{const t=i(s.url);e.information=await Q({base:t,kind:s.kind,cookies:["appliMobile=1"],params:De},e.fetcher),e.instance=await re(e,s.navigatorIdentifier);const n=await ue(e,{username:s.username,deviceUUID:s.deviceUUID,requestFirstMobileAuthentication:!1,reuseMobileAuthentication:!0,requestFromQRCode:!1,useCAS:!1});ve(s,"token",n);const a=Ee(n,s.username,s.token),r=ye(e,n,a),o=await le(e,r);if(Ve(e,o,a),Me(o))throw new h(o,n,s.username);return Pe(e,o,n,s.username)},Ce=async(e,s)=>{const n=(e=>{const s=e.url,t=s.lastIndexOf("/")+1,n=s.substring(0,t-1),i=s.substring(t);return{kind:fe(i),url:n,token:e.jeton,username:e.login}})(s.qr),i=t.util.createBuffer(s.pin),a=e=>z.decrypt(t.util.encodeUtf8(n[e]),i,t.util.createBuffer()),r={username:a("username"),token:a("token")};e.information=await Q({base:n.url,kind:n.kind,cookies:["appliMobile=1"],params:De},e.fetcher),e.instance=await re(e,s.navigatorIdentifier);const o=await ue(e,{username:r.username,deviceUUID:s.deviceUUID,requestFirstMobileAuthentication:!0,reuseMobileAuthentication:!1,requestFromQRCode:!0,useCAS:!1});ve(r,"token",o);const c=Ee(o,r.username,r.token),u=ye(e,o,c),l=await le(e,u);return Ve(e,l,c),Me(l)?Ae(e,{token:l.jetonConnexionAppliMobile,username:o.login??r.username,deviceUUID:s.deviceUUID}):Pe(e,l,o,r.username)},Ae=(e,s)=>be(e,{url:e.information.url,kind:e.information.accountKind,username:s.username,token:s.token,deviceUUID:s.deviceUUID,navigatorIdentifier:e.instance.navigatorIdentifier}),Ee=(e,s,n)=>{const i=t.md.sha256.create().update(e.alea??"").update(t.util.encodeUtf8(n)).digest().toHex().toUpperCase();return t.util.createBuffer(s+i)},ve=(e,s,t)=>{1===t.modeCompLog&&(e.username=e.username.toLowerCase()),1===t.modeCompMdp&&(e[s]=e[s].toLowerCase())},ye=(e,s,n)=>{const i=t.util.createBuffer(e.information.aesIV);try{const e=t.util.decodeUtf8(z.decrypt(s.challenge,n,i)),a=new Array(e.length);for(let s=0;s<e.length;s+=1)s%2==0&&a.push(e.charAt(s));const r=t.util.encodeUtf8(a.join(""));return z.encrypt(r,n,i)}catch{throw new o}},Ve=(e,s,n)=>{const i=t.util.createBuffer(e.information.aesIV),a=z.decrypt(s.cle,n,i).split(",").map((e=>String.fromCharCode(parseInt(e)))).join("");e.information.aesKey=a},Me=e=>Boolean(e.actionsDoubleAuth),Pe=async(e,s,t,n)=>(e.user=await(async e=>{const s=new Z(e,"ParametresUtilisateur",{}),t=await s.send();return he(t.data[ce(e).data],e)})(e),ge(e,0),{token:s.jetonConnexionAppliMobile,username:t.login??n,kind:e.information.accountKind,url:e.information.url,navigatorIdentifier:e.instance.navigatorIdentifier}),Ne=(e,s,t)=>{e.kind===j.TextInput||e.kind===j.InformationText?e.textInputAnswer=s:(e.selectedAnswers=s,e.textInputAnswer=t),e.answered=void 0!==s,e.answerDate=e.answered?new Date:void 0},Se=(e,s,{withSuperposedCanceledClasses:t=!1,withCanceledClasses:n=s.withCanceledClasses,withPlannedClasses:i=!0})=>{const a=s.classes;if(!n)for(const e of a)"lesson"===e.is&&e.canceled&&(e._visible=!1);if(!i)for(const e of a)"lesson"===e.is&&!1!==e._visible&&!e.canceled&&[0,3,4].includes(e.kind)&&(e._visible=!1);if(n&&!t){let s=!0;for(;s;)s=Te(e,a)}s.classes=a.filter((e=>!1!==e._visible));for(const e of a)delete e._visible},Ie=(e,s)=>{const t=e.instance.blocksPerDay,n=Math.floor(s.blockPosition/t);let i=s.blockPosition+s.blockLength-1;return Math.floor(i/t)!==n&&(i=n*t+t-1),i},Le=(e,s,t,n)=>{const i=[t],a=s.blockPosition,r=Ie(e,s);for(let e=a;e<=r;e++){const s=n[e];void 0!==s&&(s===t||i.includes(s)||i.push(s))}return i},Te=(e,s)=>{const t={};for(let n=0;n<s.length;n++){const i=s[n];i.weekNumber in t||(t[i.weekNumber]=[]);const a=t[i.weekNumber],r=i.blockPosition,o=Ie(e,i);if(!1!==i._visible)for(let t=r;t<=o;t++){if(void 0!==a[t]){const t=Le(e,i,n,a);let r=!1,o=!1;for(let e=0;e<t.length;e++){const n=s[t[e]];o||(o=!("lesson"===n.is&&n.canceled)),r||(r="lesson"===n.is&&n.canceled)}if(o&&r)for(let e=0;e<t.length;e++){const n=s[t[e]];if(n&&"lesson"===n.is&&n.canceled)return n._visible=!1,!0}break}a[t]=n}}return!1},Re=async e=>{let s;s=oe(e.instance.version)?new Z(e,"Navigation",{Signature:{onglet:K.Presence},data:{onglet:K.Presence,ongletPrec:K.Presence}}):new Z(e,"Presence",{_Signature_:{onglet:K.Presence}}),await s.send()},ke=(e,s=12e4)=>{xe(e),e.presence=setInterval((()=>Re(e)),s)},xe=e=>{e.presence&&(clearInterval(e.presence),e.presence=null)},Oe=class{queue=[];pendingPromise=!1;push(e){return new Promise(((s,t)=>{this.queue.push({promise:e,resolve:s,reject:t}),this.pendingPromise||this.dequeue()}))}dequeue(){if(this.pendingPromise)return!1;const e=this.queue.shift();return!!e&&(this.pendingPromise=!0,e.promise().then((s=>{e.resolve(s),this.pendingPromise=!1,this.dequeue()})).catch((s=>{e.reject(s),this.pendingPromise=!1,this.dequeue()})),!0)}},_e=(e=s)=>({information:null,instance:null,user:null,queue:new Oe,fetcher:e,presence:null}),Fe=e=>e.getTime()+60*e.getTimezoneOffset()*1e3,Ue=e=>new Date(Fe(e)),Ge=(e,s)=>{const t=Math.floor((Fe(e)-Fe(s))/864e5);return 1+Math.floor(t/7)},Be=async e=>{const s=ce(e),t=new Z(e,"PageInfosPerso",{[s.signature]:{onglet:K.Account}});return((e,s)=>{const t=e.Informations;let n;return s.instance.version[0]>=2024&&(n=e.iCal?.liste.V[0]?.paramICal),{address:[t.adresse1,t.adresse2,t.adresse3,t.adresse4],postalCode:t.codePostal,province:t.province,country:t.pays,city:t.ville,email:t.eMail,phone:`+${t.indicatifTel}${t.telephonePortable}`,INE:t.numeroINE,iCalToken:n}})((await t.send()).data[s.data],e)},je=async(e,s)=>{const t=ce(e),n=new Z(e,"SaisieTAFARendreEleve",{[t.signature]:{onglet:K.Assignments},[t.data]:{listeFichiers:[{E:U.DELETION,TAF:{N:s}}]}});await n.send()},qe=async(e,s,t)=>{const n=ce(e),i=new Z(e,"SaisieTAFFaitEleve",{[n.signature]:{onglet:K.Assignments},[n.data]:{listeTAF:[{E:U.MODIFICATION,TAFFait:t,N:s}]}});await i.send()},$e=-1e3,He=()=>$e-=1,Je=class{constructor(e,s,t,n){this.session=e,this.functionName=s,this.fileName=n,e.information.order++;const{iv:i,key:a}=Y(e);this.order=z.encrypt(e.information.order.toString(),a,i);const r=new FormData;r.append("numeroOrdre",this.order),r.append("numeroSession",e.information.id.toString()),r.append("nomRequete",s),r.append("idFichier",this.id),r.append("md5",""),r.append("files[]",t,n),this.form=r,this.url=e.information.url+`/uploadfilesession/${e.information.accountKind}/${e.information.id}`,this.headers["Content-Disposition"]=`attachment; filename="${encodeURI(n)}"`}order;id=`selecfile_1_${Date.now()}`;url;form;headers={};async send(){const e=await new Response(this.form).text();this.headers["Content-Type"]=`multipart/form-data; boundary=${e.split("\n")[0].slice(2)}`;let s=3;for(;3===s;){const t=await this.session.fetcher({url:new URL(this.url),method:"POST",content:e,headers:this.headers});s=JSON.parse(t.content).etat}if(this.session.information.order++,0===s||2===s)throw new y}},Ke=async(e,s,t,n)=>{const i=t.size||t.byteLength,a=e.user.authorizations.maxAssignmentFileUploadSize;if("number"==typeof i&&i>a)throw new v(a);const r=new Je(e,"SaisieTAFARendreEleve",t,n);await r.send();const o=ce(e),c=new Z(e,"SaisieTAFARendreEleve",{[o.signature]:{onglet:K.Assignments},[o.data]:{listeFichiers:[{E:U.CREATION,G:k.FILE,L:n,N:He(),idFichier:r.id,TAF:{N:s}}]}});await c.send()},Qe=e=>({id:e.N,name:e.L,inGroups:e.estServiceGroupe??!1}),ze=e=>({id:e.N,name:e.L,subject:Qe(e.Matiere.V)}),Ye=(e,s)=>({id:e.N,subject:Qe(e.Matiere.V),description:e.descriptif.V,backgroundColor:e.CouleurFond,done:e.TAFFait,deadline:ne(e.PourLe.V),attachments:e.ListePieceJointe.V.map((e=>pe(e,s))),difficulty:e.niveauDifficulte,length:e.duree,themes:e.ListeThemes.V.map((e=>ze(e))),return:{kind:e.genreRendu??P.None,canUpload:e.peuRendre??!1,uploaded:e.documentRendu&&pe(e.documentRendu.V,s)},resourceID:e.cahierDeTextes?.V.N}),We=async(e,s,t,n)=>{const i=ce(e),a=new Z(e,"PageCahierDeTexte",{[i.signature]:{onglet:s},[i.data]:{domaine:{_T:8,V:"number"==typeof n?`[${t}..${n}]`:`[${t}]`}}});return(await a.send()).data[i.data]},Ze=async(e,s,t,n)=>{t=Ue(t),n=Ue(n);const i=Ge(t,e.instance.firstMonday),a=Ge(n,e.instance.firstMonday);return We(e,s,i,a)},Xe=(e,s)=>s.ListeTravauxAFaire.V.map((s=>Ye(s,e))),es=async(e,s,t)=>{const n=await We(e,K.Assignments,s,t);return Xe(e,n)},ss=async(e,s,t)=>{const n=await Ze(e,K.Assignments,s,t);return Xe(e,n).filter((e=>s<=e.deadline&&e.deadline<=t))},ts=async(e,s,t)=>{let n;switch(s){case S.brouillon:n={commande:s,brouillon:"number"==typeof t.id?{E:U.CREATION,N:t.id}:{E:U.MODIFICATION,N:t.id},contenu:t.content,messagePourReponse:{G:0,N:t.replyMessageID},listeDestinataires:[],listeFichiers:[],objet:""};break;case"":n={commande:s,bouton:{N:0,G:t.button},brouillon:{N:t.id},contenu:t.content,listeDestinataires:[],listeFichiers:[],messagePourReponse:{G:0,N:t.replyMessageID}};break;default:n={commande:s,listePossessionsMessages:t.possessions}}const i=ce(e),a=new Z(e,"SaisieMessage",{[i.signature]:{onglet:K.Discussions},[i.data]:n});await a.send()},ns=e=>({id:e.N,name:e.L,kind:e.G}),is=async(e,s={_:[]})=>{const t=ce(e),n=new Z(e,"ListeMessagerie",{[t.signature]:{onglet:K.Discussions},[t.data]:{avecLu:!0,avecMessage:!0,possessionMessageDiscussionUnique:null}}),i=(await n.send()).data[t.data],a=i.listeEtiquettes.V.map(ns),r=i.listeMessagerie.V.filter((e=>{const s=0===(e.profondeur||0),t=e.messagePourParticipants?.V.N;return e.estUneDiscussion&&t&&s})).map((e=>((e,s,t)=>({cache:t,creator:e.initiateur,dateAsFrenchText:e.libelleDate,recipientName:e.public,participantsMessageID:e.messagePourParticipants.V.N,possessions:e.listePossessionsMessages.V,numberOfDrafts:e.nbBrouillons??0,subject:e.objet??"",numberOfMessages:e.nombreMessages??0,numberOfMessagesUnread:e.nbNonLus??0,closed:e.ferme??!1,folders:e.listeEtiquettes?.V.map((e=>s.find((s=>s.id===e.N)))).filter(Boolean)??[]}))(e,a,s)));s._.length=0,s._.push(...r);for(const e of s._)e.participantsMessageID in s?Object.assign(s[e.participantsMessageID],e):s[e.participantsMessageID]=e;for(const e in s)"_"!==e&&(s._.find((s=>s.participantsMessageID===e))||delete s[e]);return{folders:a,items:s._}},as=e=>{const s=e.estHTML??!1;return{possessionID:e.possessionMessage.V.N,replyMessageID:e.messageSource.V.N,content:s?e.contenu.V:e.contenu,isHTML:s}},rs=e=>{let s;switch(e){case"Professeur":s=F.Teacher;break;case"Personnel":s=F.Personal;break;default:s=F.Student}return s},os=(e,s)=>{let t,n;return"Moi"!==e.public_gauche&&(t={name:e.public_gauche,kind:rs(e.hint_gauche)}),"Moi"===e.public_droite?n=void 0:"string"==typeof e.public_droite&&(n={name:e.public_droite,kind:rs(e.hint_droite)}),{id:e.N,content:e.estHTML?e.contenu.V:e.contenu,creationDate:ne(e.date.V),author:t,receiver:n,partialVisibility:e.estUnAparte,amountOfRecipients:(e.nbPublic??1)+1,files:e.listeDocumentsJoints?.V.map((e=>pe(e,s)))??[]}},cs=(e,s,t)=>{const n=[],i=e.messageSource.V.N;if(e.listeMessagesPourContexte)for(const t of e.listeMessagesPourContexte.V){const e=os(t,s);n.push(e)}let a=t.find((e=>e.id===i));return{...os(e,s),transferredMessages:n,replyMessageID:i,replyingTo:a}},us=async(e,s,t=!1)=>{const n=ce(e),i=new Z(e,"ListeMessages",{[n.signature]:{onglet:K.Discussions},[n.data]:{listePossessionsMessages:s.possessions,marquerCommeLu:t,nbMessagesVus:0}}),a=((e,s)=>{const t=e.brouillon,n=[],i=[],a=e.messagePourReponse.V.N;for(const t of e.listeMessages.V)t.brouillon?i.push(as(t)):n.push(cs(t,s,n));if(n.sort(((e,s)=>s.creationDate.getTime()-e.creationDate.getTime())),t){const e=t.V.estHTML??!1;i.push({isHTML:e,content:e?t.V.contenu:t.V.contenu.V,possessionID:t.V.N,replyMessageID:a})}const r=e.listeBoutons.V.find((e=>e.L.startsWith("Envoyer")))?.G;return{sents:n,drafts:i,defaultReplyMessageID:a,sendAction:r,canIncludeStudentsAndParents:r===L.ReplyEveryoneExceptParentsAndStudents||r===L.SendEveryoneExceptParentsAndStudents}})((await i.send()).data[n.data],e);return s.messages?Object.assign(s.messages,a):s.messages=a,a},ls=async(e,s,t,n=s.messages?.defaultReplyMessageID)=>{await ts(e,S.brouillon,{id:He(),content:t,replyMessageID:n}),await is(e,s.cache),await us(e,s)},ds=async(e,s)=>{await ts(e,S.Delete,{possessions:s.possessions}),await is(e,s.cache)},ps=async(e,s)=>{await us(e,s,!0)},ms=e=>({id:e.N,name:e.L,kind:e.G,disallowMessages:e.refusMess??!1}),hs=async(e,s)=>{const t=ce(e),n=new Z(e,"SaisiePublicMessage",{[t.signature]:{onglet:K.Discussions},[t.data]:{message:{N:s.participantsMessageID},estPublicParticipant:!0,estDestinatairesReponse:!1}});return(await n.send()).data[t.data].listeDest.V.map(ms)},fs=async(e,s,t)=>{await ts(e,S.brouillon,{id:t.possessionID,content:t.content,replyMessageID:t.replyMessageID}),await is(e,s.cache),await us(e,s)},gs=async(e,s,t)=>{await ts(e,S.Delete,{possessions:[{N:t.possessionID}]}),await is(e,s.cache),await us(e,s)},Ds=async(e,s)=>{await ts(e,S.Restore,{possessions:s.possessions}),await is(e,s.cache)},ws=(e,s)=>(e===L.SendEveryoneExceptParentsAndStudents&&s&&(e=L.SendEveryone),e===L.ReplyEveryoneExceptParentsAndStudents&&s&&(e=L.ReplyEveryone),e),bs=async(e,s,t,n=!1)=>{if(void 0===s.messages?.sendAction)throw new d;await ts(e,"",{button:ws(s.messages.sendAction,n),content:t.content,id:t.possessionID,replyMessageID:t.replyMessageID}),await is(e,s.cache),await us(e,s)},Cs=async(e,s,t,n=!1,i=s.messages?.defaultReplyMessageID)=>{if(!s.messages)throw new p;if(void 0===s.messages.sendAction)throw new d;const a=ce(e),r=ws(s.messages.sendAction,n),o=new Z(e,"SaisieMessage",{[a.data]:{contenu:e.user.authorizations.hasAdvancedDiscussionEditor?{_T:21,V:t}:t,bouton:{N:0,G:r},brouillon:{N:He(),E:U.CREATION},genreDiscussion:0,messagePourReponse:{G:0,N:i},listeFichiers:[]},[a.signature]:{onglet:K.Discussions}});await o.send(),await is(e,s.cache),await us(e,s)},As=async(e,s)=>{await ts(e,S.Trash,{possessions:s.possessions}),await is(e,s.cache)},Es=e=>({id:e.N,level:e.L,abbreviation:e.abbreviation,coefficient:e.coefficient,domainID:e.domaine.V.N,domainName:e.domaine.V.L,itemID:e.item?.V.N,itemName:e.item?.V.L,order:e.ordre,pillarID:e.pilier.V.N,pillarName:e.pilier.V.L,pillarPrefixes:e.pilier.V.strPrefixes.split(",").map((e=>e.trim()))}),vs=e=>{const s=e.listeNiveauxDAcquisitions.V.map(Es);return s.sort(((e,s)=>e.order-s.order)),{skills:s,name:e.L,id:e.N,teacher:e.individu.V.L,coefficient:e.coefficient,description:e.descriptif,subject:Qe(e.matiere.V),levels:e.listePaliers.V.map((e=>e.L)),date:ne(e.date.V)}},ys=e=>({N:e.id,G:e.kind,L:e.name}),Vs=async(e,s)=>{const t=ce(e),n=new Z(e,"DernieresEvaluations",{[t.signature]:{onglet:K.Evaluations},[t.data]:{periode:ys(s)}});return(await n.send()).data[t.data].listeEvaluations.V.map(vs)},Ms=e=>e*Math.PI/180,Ps=e=>(e=>e*e)(Math.sin(e/2)),Ns=(e,s)=>{const t=Ms(e[0]),n=Ms(s[0]),i=Ms(e[1]),a=Ms(s[1]),r=Ps(n-t)+Math.cos(t)*Math.cos(n)*Ps(a-i);return 12756274*Math.asin(Math.sqrt(r))},Ss=async(e,t=s)=>{const n=`data={"nomFonction":"geoLoc","lat":"${e.latitude}","long":"${e.longitude}"}`,i=await t({url:new URL("https://www.index-education.com/swie/geoloc.php"),method:"POST",content:n,headers:{"Content-Type":"application/x-www-form-urlencoded;charset=UTF-8"}});if("{}"===i.content)return[];const a=JSON.parse(i.content).map((s=>((e,s)=>{const t=parseFloat(e.lat),n=parseFloat(e.long);return{url:e.url.toLowerCase(),name:e.nomEtab.trim().replace("COLLEGE","COLLÈGE").replace("LYCEE","LYCÉE"),latitude:t,longitude:n,postalCode:parseInt(e.cp),distance:Ns(s,[t,n])}})(s,[e.latitude,e.longitude])));return a.sort(((e,s)=>e.distance>s.distance?1:e.distance<s.distance?-1:e.name>s.name?1:e.name<s.name?-1:0)),a},Is=async(e,s)=>{const t=ce(e),n=new Z(e,"GenerationPDF",{[t.data]:{avecCodeCompetences:!1,genreGenerationPDF:2,options:{adapterHauteurService:!1,desEleves:!1,gererRectoVerso:!1,hauteurServiceMax:15,hauteurServiceMin:10,piedMonobloc:!0,portrait:!0,taillePolice:6.5,taillePoliceMin:5,taillePolicePied:6.5,taillePolicePiedMin:5},periode:ys(s)},[t.signature]:{onglet:K.Gradebook}}),i=await n.send();return e.information.url+"/"+encodeURI(i.data[t.data].url.V)},Ls=async(e,s)=>{const t=ce(e);s={...s,kind:2};const n=new Z(e,"PageBulletins",{[t.data]:{classe:{},eleve:{},periode:ys(s)},[t.signature]:{onglet:K.Gradebook}}),i=await n.send();return await(async(e,s,t)=>{if(0==Object.keys(t).length||t.message)throw new w;let n=t.ObjetListeAppreciations.V.ListeAppreciations.V.map((e=>({name:e.Intitule,value:e.L})));const i=t.ListeServices.V.map((e=>({subject:Qe(e.Matiere?.V),subjectGroup:e.SurMatiere.V,coef:parseInt(e.Coefficient.V),averages:{student:parseFloat(e.MoyenneEleve.V.replace(",",".")),classOverall:parseFloat(e.MoyenneClasse.V.replace(",",".")),max:parseFloat(e.MoyenneSup.V.replace(",",".")),min:parseFloat(e.MoyenneInf.V.replace(",","."))},assessments:e.ListeAppreciations.V.map((e=>e.L)),teachers:e.ListeElements?.V.map((e=>e.ListeProfesseurs?.V.map((e=>e.L))))??e.ListeProfesseurs?.V.map((e=>e.L))??[]})));return{overallAssessments:n,graph:t?.graphe?.replace("\\n",""),subjects:i,url:await Is(e,s)}})(e,s,i.data[t.data])},Ts=e=>{let s,t=G.Grade;if("string"==typeof e)e.split("|").length>=2&&(t=parseInt(e.split("|")[1])),s=parseFloat(e.replace(",",".")),t!==G.AbsentZero&&t!==G.UnreturnedZero||(s=0);else{if("number"!=typeof e)throw new E("decodeGradeValue");s=e}return{kind:t,points:s}},Rs=e=>({student:e.moyEleve&&Ts(e.moyEleve.V),outOf:e.baremeMoyEleve&&Ts(e.baremeMoyEleve.V),defaultOutOf:e.baremeMoyEleveParDefaut&&Ts(e.baremeMoyEleveParDefaut.V),class_average:e.moyClasse&&Ts(e.moyClasse.V),min:e.moyMin&&Ts(e.moyMin.V),max:e.moyMax&&Ts(e.moyMax.V),subject:Qe(e),backgroundColor:e.couleur}),ks=(e,s)=>({grades:e.listeDevoirs.V.map((e=>((e,s)=>{const t=e.N,n=e.estBonus,i=(n,i)=>e[n]&&pe({G:N.File,L:e[n],N:t},s,{G:i});return{id:t,value:Ts(e.note.V),outOf:Ts(e.bareme.V),defaultOutOf:Ts(e.baremeParDefaut.V),date:ne(e.date.V),subject:Qe(e.service.V),average:e.moyenne&&Ts(e.moyenne.V),max:e.noteMax&&Ts(e.noteMax.V),min:e.noteMin&&Ts(e.noteMin.V),coefficient:e.coefficient,comment:e.commentaire,commentaireSurNote:e.commentaireSurNote,isBonus:n,isOptional:e.estFacultatif&&!n,isOutOf20:e.estRamenerSur20,subjectFile:i("libelleSujet","DevoirSujet"),correctionFile:i("libelleCorrige","DevoirCorrige")}})(e,s))),subjectsAverages:e.listeServices.V.map(Rs),classAverage:e.moyGeneraleClasse&&Ts(e.moyGeneraleClasse.V),overallAverage:e.moyGenerale&&Ts(e.moyGenerale.V)}),xs=async(e,s)=>{const t=ce(e),n=new Z(e,"DernieresNotes",{[t.signature]:{onglet:K.Grades},[t.data]:{Periode:ys(s)}}),i=await n.send();return ks(i.data[t.data],e)},Os=e=>`${e.getDate()}/${e.getMonth()+1}/${e.getFullYear()} ${e.getHours()}:${e.getMinutes()}:${e.getSeconds()}`,_s=e=>({description:e.commentaire,name:e.L,url:e.url}),Fs=e=>({name:e.libellePorteMonnaie,description:e.hintPorteMonnaie,warning:e.avecWarning,balance:parseInt(e.valeurSolde.replace(",",".")),balanceDescription:e.hintSolde}),Us=e=>({sso:e.SSO}),Gs=e=>{const s=[];let t,n;var i;"partenaireARD"in e&&(i=e.partenaireARD,n={...Us(i),canRefreshData:i.avecActualisation,wallets:i.porteMonnaie.V.map(Fs)});for(const n of e.lienUtile.listeLiens.V)"SSO"in n?"TURBOSELF"===n.SSO.codePartenaire&&(t=Us(n)):s.push(_s(n));return{partnerARD:n,partnerTurboself:t,links:s}},Bs=async(e,s=e.instance.nextBusinessDay)=>{const t=ce(e),n=Ge(s,e.instance.firstMonday),i=Os(s),a=new Z(e,"PageAccueil",{[t.signature]:{onglet:K.Presence},[t.data]:{avecConseilDeClasse:!0,dateGrille:{_T:7,V:i},numeroSemaine:n,coursNonAssures:{numeroSemaine:n},personnelsAbsents:{numeroSemaine:n},incidents:{numeroSemaine:n},exclusions:{numeroSemaine:n},donneesVS:{numeroSemaine:n},registreAppel:{date:{_T:7,V:i}},previsionnelAbsServiceAnnexe:{date:{_T:7,V:i}},donneesProfs:{numeroSemaine:n},EDT:{numeroSemaine:n},TAFARendre:{date:{_T:7,V:i}},TAFEtActivites:{date:{_T:7,V:i}},partenaireCDI:{CDI:{}},tableauDeBord:{date:{_T:7,V:i}},modificationsEDT:{date:{_T:7,V:i}}}}),r=await a.send();return Gs(r.data[t.data])},js=async(e,t=s)=>{e=i(e),e+="/infoMobileApp.json?id=0D264427-EEFC-4810-A9E9-346942A862A4";const n={url:new URL(e)},a=await t(n);return(e=>{let s,t;return e.CAS.actif&&(s=e.CAS.casURL,t=e.CAS.jetonCAS),{name:e.nomEtab,version:e.version,date:new Date(e.date),accounts:e.espaces.map((e=>({name:e.nom,path:e.URL}))),casURL:s,casToken:t}})(JSON.parse(a.content))},qs=e=>({name:e.L,color:e.couleur}),$s=e=>({name:e.L,color:e.couleur}),Hs=e=>({name:e.L,allergens:e.listeAllergenesAlimentaire.V.map(qs),labels:e.listeLabelsAlimentaires.V.map($s)}),Js=e=>{let s=e.ListeRepas.V.reduce(((e,s)=>{let t;switch(s.G){case B.Lunch:t="lunch";break;case B.Dinner:t="dinner";break;default:throw new E("decodeMenu")}return e[t]=(e=>{const s=e.ListePlats.V.reduce(((e,s)=>{let t;switch(s.G){case T.Entry:t="entry";break;case T.Main:t="main";break;case T.Side:t="side";break;case T.Drink:t="drink";break;case T.Fromage:t="fromage";break;case T.Dessert:t="dessert";break;default:throw new E("decodeMeal")}return e[t]=s.ListeAliments.V.map(Hs),e}),{});return{name:e.L,...s}})(s),e}),{});return{date:ne(e.Date.V),...s}},Ks=async(e,s=new Date)=>{const t=ce(e),n=new Z(e,"PageMenus",{[t.signature]:{onglet:K.Menus},[t.data]:{date:{_T:7,V:Os(s)}}}),i=await n.send();return{containsLunch:(a=i.data[t.data]).AvecRepasMidi,containsDinner:a.AvecRepasSoir,days:a.ListeJours.V.map(Js),weeks:m(a.DomaineDePresence.V),allergens:a.ListeAllergenes.V.map(qs),labels:a.Listelabels.V.map($s)};var a},Qs=e=>({id:e.N,name:e.L,from:e.libelleMatiere}),zs=(e,s)=>({id:e.N,name:e.L,sub:s}),Ys=e=>{const s=[];if(e.listeRessources){const t=e.listeRessources.V.filter((e=>e.estUneSousMatiere)).map(Qs);for(const n of e.listeRessources.V)n.estUneSousMatiere||s.push(zs(n,t.filter((e=>e.from===n.L))))}return{id:e.N,name:e.L,kind:e.G,subjects:s,function:e.fonction&&(t=e.fonction.V,{id:t.N,name:t.L}),isPrincipal:e.estPrincipal??!1};var t},Ws=async(e,s)=>{const t=ce(e),n=e.userResource,i=new Z(e,"ListeRessourcesPourCommunication",{[t.signature]:{onglet:K.Discussions},[t.data]:{filtreElement:{G:n.kind,L:n.name,N:n.id},onglet:{N:0,G:s}}});return(await i.send()).data[t.data].listeRessourcesPourCommunication.V.filter((e=>e.avecDiscussion)).map(Ys)},Zs=async(e,s,t,n)=>{const i=ce(e),a=new Z(e,"SaisieMessage",{[i.signature]:{onglet:K.Discussions},[i.data]:{contenu:e.user.authorizations.hasAdvancedDiscussionEditor?{_T:21,V:t}:t,objet:s,estCreationCarnetLiaison:!1,listeFichiers:[],listeDestinataires:n.map((e=>({E:U.MODIFICATION,G:e.kind,N:e.id})))}});await a.send()},Xs=e=>{if(0===e.length)return"[]";const s=[...e].sort(((e,s)=>e-s)),t=[];let n=s[0],i=n;for(let e=1;e<s.length;e++)s[e]-n!=1&&(i===n?t.push(i.toString()):t.push(`${i}..${n}`),i=s[e]),n=s[e];return i===n?t.push(i.toString()):t.push(`${i}..${n}`),`[${t.join(",")}]`},et=async(e,s,t={delete:!1,markAsRead:!0,onlyMarkAsRead:!1})=>{const n=ce(e),i=t.onlyMarkAsRead||t.delete?[]:"information"===s.is?[s.question]:s.questions,a=new Z(e,"SaisieActualites",{[n.signature]:{onglet:K.News},[n.data]:{listeActualites:[{N:s.id,L:s.title??"",genrePublic:s.public.G,public:s.public,validationDirecte:!0,listeQuestions:i.map((e=>({N:e.id,L:e.fullTitle,genreReponse:e.kind,reponse:{N:parseInt(e.answerID),Actif:!0,valeurReponse:e.kind===j.InformationText||e.kind===j.TextInput?e.textInputAnswer??"":{_T:8,V:Xs(e.selectedAnswers??[])},valeurReponseLibre:e.choices.filter((e=>e.isTextInput)).length>0?e.textInputAnswer:void 0,avecReponse:e.answered,estReponseAttendue:e.shouldAnswer,_validationSaisie:!0}}))),marqueLueSeulement:!t.delete&&t.onlyMarkAsRead,lue:!t.delete&&t.markAsRead,supprimee:!t.onlyMarkAsRead&&t.delete,saisieActualite:!1}],saisieActualite:!1}});await a.send()},st=async(e,s)=>{await et(e,s,{onlyMarkAsRead:!1,markAsRead:!1,delete:!0})},tt=async(e,s,t)=>{s.read!==t&&(await et(e,s,{onlyMarkAsRead:!0,markAsRead:t,delete:!1}),s.read=t)},nt=async(e,s,t=!0)=>{if(!s.needToAcknowledge||s.acknowledged)return tt(e,s,t);Ne(s.question,""),await et(e,s,{markAsRead:t,onlyMarkAsRead:!1,delete:!1}),t&&(s.read=!0)},it=async(e,s,t=!0)=>{await et(e,s,{markAsRead:t,onlyMarkAsRead:!1,delete:!1}),t&&(s.read=!0)},at=(e,s)=>({id:e.N,title:e.L,category:s.find((s=>s.id===e.categorie.V.N)),creationDate:ne(e.dateCreation.V),startDate:ne(e.dateDebut.V),endDate:ne(e.dateFin.V),author:e.auteur,public:e.public.V,read:e.lue}),rt=e=>({value:e.L,position:e.rang,isTextInput:!!e.estReponseLibre}),ot=(e,s)=>{const t=e.genreReponse,n=e.reponse.V.avecReponse;let i,a;return n&&e.reponse.V.valeurReponse&&("string"==typeof e.reponse.V.valeurReponse?a=e.reponse.V.valeurReponse:(i=m(e.reponse.V.valeurReponse.V),a=e.reponse.V.valeurReponseLibre)),{id:e.N,fullTitle:e.L,title:e.titre,position:e.rang,kind:t,maximumLength:e.tailleReponse,shouldRespectMaximumChoices:e.avecMaximum,maximumChoices:e.nombreReponsesMax,content:e.texte.V,attachments:e.listePiecesJointes.V.map((e=>pe(e,s))),answerID:e.reponse.V.N,answered:n,shouldAnswer:e.reponse.V.estReponseAttendue,answerDate:e.reponse.V.reponduLe?.V&&ne(e.reponse.V.reponduLe.V),choices:t===j.TextInput?[]:e.listeChoix.V.map(rt),selectedAnswers:i,textInputAnswer:a}},ct=(e,s,t)=>({is:"information",...at(e,t),question:ot(e.listeQuestions.V[0],s),get attachments(){return this.question.attachments},get acknowledged(){return this.question.answered},get acknowledgedDate(){return this.question.answerDate},get needToAcknowledge(){return this.question.shouldAnswer},get content(){return this.question.content}}),ut=e=>({id:e.N,name:e.L,default:e.estDefaut??!1}),lt=(e,s,t)=>({is:"survey",...at(e,t),questions:e.listeQuestions.V.map((e=>ot(e,s))),isAnonymous:e.reponseAnonyme}),dt=async e=>{const s=ce(e),t=new Z(e,"PageActualites",{[s.signature]:{onglet:K.News},[s.data]:{modesAffActus:{_T:26,V:Xs([0])}}});return((e,s)=>{const t=e.listeCategories.V.map(ut);return{categories:t,items:e.listeModesAff[0].listeActualites.V.map((e=>{let n;if(e.estInformation)n=ct;else{if(!e.estSondage)throw new E("decodeNews");n=lt}return n(e,s,t)}))}})((await t.send()).data[s.data],e)},pt=e=>{const[s,t]=e.NbrHeures.split("h").map(Number),n=e.estMotifNonEncoreConnu;return{id:e.N,startDate:ne(e.dateDebut.V),endDate:ne(e.dateFin.V),justified:e.justifie,opened:e.ouverte,hoursMissed:s,minutesMissed:t,daysMissed:e.NbrJours,shouldParentsJustify:e.aJustifierParParents,administrativelyFixed:e.reglee,isReasonUnknown:n,reason:!n&&e.listeMotifs.V[0].L}},mt=e=>{const s=e.estMotifNonEncoreConnu,t=e.justifie;return{id:e.N,date:ne(e.date.V),minutes:e.duree,justified:t,justification:t&&e.justification,shouldParentsJustify:e.aJustifierParParents,administrativelyFixed:e.reglee,isReasonUnknown:s,reason:!s&&e.listeMotifs.V[0].L}},ht=(e,s)=>({id:e.N,title:e.nature.V.L,reasons:e.listeMotifs.V.map((e=>e.L)),exclusion:e.estUneExclusion,isDuringLesson:!e.horsCours,workToDo:e.travailAFaire,workToDoDocuments:e.documentsTAF.V.map((e=>pe(e,s))),circumstances:e.circonstances,circumstancesDocuments:e.documentsCirconstances.V.map((e=>pe(e,s))),giver:e.demandeur.V.L,dateGiven:ne(e.dateDemande.V),durationMinutes:e.duree}),ft=e=>{let s;return"L"in e.matiere.V&&"0"!==e.matiere.V.N&&(s=Qe(e.matiere.V)),{id:e.N,date:ne(e.date.V),opened:e.estLue,shouldParentsJustify:e.avecARObservation,name:e.L,kind:e.genreObservation,sectionID:e.rubrique.V.N,subject:s,reason:e.commentaire}},gt=(e,s)=>({id:e.N,title:e.nature.V.L,comments:e.commentaire,reasons:e.listeMotifs.V.map((e=>e.L)),exclusion:e.estUneExclusion,circumstances:e.circonstances,circumstancesDocuments:e.documentsCirconstances.V.map((e=>pe(e,s))),decisionMaker:e.decideur.V.L,giver:e.demandeur.V.L,dateGiven:ne(e.dateDemande.V),startDate:ne(e.dateDebut.V),endDate:ne(e.dateFin.V),disallowedAccesses:m(e.interditAcces.V)}),Dt=async(e,s)=>{const t=ce(e),n=new Z(e,"PagePresence",{[t.signature]:{onglet:K.Notebook},[t.data]:{periode:ys(s),DateDebut:{_T:7,V:Os(s.startDate)},DateFin:{_T:7,V:Os(s.endDate)}}});return((e,s)=>{const t=[],n=[],i=[],a=[],r=[];for(const o of e.listeAbsences.V)switch(o.G){case 13:t.push(pt(o));break;case 14:n.push(mt(o));break;case 41:i.push(ht(o,s));break;case 46:a.push(ft(o));break;case 72:r.push(gt(o,s))}return{absences:t,delays:n,punishments:i,observations:a,precautionaryMeasures:r}})((await n.send()).data[t.data],e)},wt=async(e,s)=>{const t=ce(e),n=new Z(e,"SaisieURLPartenaire",{[t.signature]:{onglet:K.Presence},[t.data]:{SSO:s.sso}});return(await n.send()).data.RapportSaisie.urlSSO.V},bt=async(e,s)=>{const t=ce(e),n=new Z(e,"donneesContenusCDT",{[t.signature]:{onglet:K.Resources},[t.data]:{pourTAF:!0,cahierDeTextes:{N:s}}});return(await n.send()).data[t.data].ListeCahierDeTextes.V[0].ListeTravailAFaire.V.map((s=>Ye(s,e)))},Ct=(e,s)=>({id:e.N,startDate:ne(e.Date.V),endDate:ne(e.DateFin.V),subject:Qe(e.Matiere.V),haveAssignment:void 0!==e.dateTAF,assignmentDeadline:e.dateTAF?.V&&ne(e.dateTAF.V),teachers:e.listeProfesseurs.V.map((e=>e.L)),groups:e.listeGroupes.V.map((e=>e.L)),backgroundColor:e.CouleurFond,contents:e.listeContenus.V.map((e=>((e,s)=>({id:e.N,title:e.L,description:e.descriptif.V,category:e.categorie.V.G,categoryText:e.categorie.V.L,files:e.ListePieceJointe.V.map((e=>pe(e,s))),themes:e.ListeThemes.V.map((e=>ze(e))),educativeValue:e.parcoursEducatif}))(e,s)))}),At=async(e,s)=>{const t=ce(e),n=new Z(e,"donneesContenusCDT",{[t.signature]:{onglet:K.Resources},[t.data]:{cahierDeTextes:{N:s}}}),i=(await n.send()).data[t.data].ListeCahierDeTextes.V[0];return Ct(i,e)},Et=(e,s)=>s.ListeCahierDeTextes.V.map((s=>Ct(s,e))),vt=async(e,s,t)=>{const n=await We(e,K.Resources,s,t);return Et(e,n)},yt=async(e,s,t)=>{const n=await Ze(e,K.Resources,s,t);return Et(e,n).filter((e=>s<=e.endDate&&e.endDate<=t))},Vt=async(e,s)=>{const t=ce(e),n=Y(e),i=new Z(e,"SecurisationCompteDoubleAuth",{[t.data]:{action:_.csch_VerifierMotDePassePersonnalise,nouveauMDP:z.encrypt(s,n.key,n.iv)}});return(await i.send()).data[t.data].result},Mt=async(e,s)=>{const t=ce(e),n=Y(e),i=new Z(e,"SecurisationCompteDoubleAuth",{[t.data]:{action:_.csch_VerifierPIN,codePin:z.encrypt(s,n.key,n.iv)}});return(await i.send()).data[t.data].result},Pt=async(e,s,t)=>{const n={action:_.csch_EnregistrerChoixUtilisateur},i=Y(e);"number"==typeof t.mode&&(n.mode=t.mode),t.password&&(n.nouveauMDP=z.encrypt(t.password,i.key,i.iv)),t.pin&&(n.codePin=z.encrypt(t.pin,i.key,i.iv)),t.deviceName&&(n.avecIdentification=!0,n.strIdentification=t.deviceName);const a=ce(e),r=new Z(e,"SecurisationCompteDoubleAuth",{[a.data]:n}),o=(await r.send()).data[a.data].jetonConnexionAppliMobile;o&&(s.context.authentication.jetonConnexionAppliMobile=o)},Nt=async(e,s)=>{if(s.length>30)throw new f(30);const t=ce(e),n=new Z(e,"SecurisationCompteDoubleAuth",{[t.data]:{action:_.csch_LibellesSourceConnexionDejaConnus,libelle:s}});return(await n.send()).data[t.data].dejaConnu},St=(e,s)=>({[e]:s,[e[0].toUpperCase()+e.substring(1)]:s}),It=(e,s)=>{const t=ne(e.DateDuCours.V),n=e.place,i=e.duree;let a;if("string"==typeof e.DateDuCoursFin?.V)a=ne(e.DateDuCoursFin.V);else{const e=(({instance:{endings:e}},s)=>{s>e.length&&(s%=e.length-1);const t=e[s],[n,i]=t.split("h").map(Number);return{hours:n,minutes:i}})(s,n%s.instance.blocksPerDay+i-1);a=new Date(t),a.setHours(e.hours,e.minutes)}return{id:e.N,backgroundColor:e.CouleurFond,notes:e.memo,startDate:t,endDate:a,blockLength:i,blockPosition:n,weekNumber:Ge(t,s.instance.firstMonday)}},Lt=(e,s)=>({absences:e.absences,withCanceledClasses:e.avecCoursAnnule??!0,classes:(e.ListeCours??[]).map((e=>(e=>"estSortiePedagogique"in e&&e.estSortiePedagogique)(e)?((e,s)=>({is:"activity",...It(e,s),title:e.motif,attendan