[{"data":1,"prerenderedAt":695},["ShallowReactive",2],{"docs-nav:fr":3,"docs:\u002Ffr\u002Fdocs\u002Finfra\u002Fidentity":189},[4],{"title":5,"path":6,"stem":7,"children":8,"page":52},"Fr","\u002Ffr","fr",[9],{"title":10,"path":11,"stem":12,"children":13},"Qu'est-ce que Fougere","\u002Ffr\u002Fdocs","fr\u002Fdocs\u002Findex",[14,15,19,23,27,31,53,78,123,148],{"title":10,"path":11,"stem":12},{"title":16,"path":17,"stem":18},"Démarrer","\u002Ffr\u002Fdocs\u002Fgetting-started","fr\u002Fdocs\u002F01.getting-started",{"title":20,"path":21,"stem":22},"Une app que vous avez déjà","\u002Ffr\u002Fdocs\u002Fexisting-app","fr\u002Fdocs\u002F02.existing-app",{"title":24,"path":25,"stem":26},"Apportez votre schéma","\u002Ffr\u002Fdocs\u002Fbring-your-schema","fr\u002Fdocs\u002F03.bring-your-schema",{"title":28,"path":29,"stem":30},"La CLI","\u002Ffr\u002Fdocs\u002Fcli","fr\u002Fdocs\u002F04.cli",{"title":32,"path":33,"stem":34,"children":35,"page":52},"Concepts","\u002Ffr\u002Fdocs\u002Fconcepts","fr\u002Fdocs\u002F2.concepts",[36,40,44,48],{"title":37,"path":38,"stem":39},"Philosophie","\u002Ffr\u002Fdocs\u002Fconcepts\u002Fphilosophy","fr\u002Fdocs\u002F2.concepts\u002F1.philosophy",{"title":41,"path":42,"stem":43},"La Frond","\u002Ffr\u002Fdocs\u002Fconcepts\u002Ffrond","fr\u002Fdocs\u002F2.concepts\u002F2.frond",{"title":45,"path":46,"stem":47},"Le chemin le plus court","\u002Ffr\u002Fdocs\u002Fconcepts\u002Fshortest-path","fr\u002Fdocs\u002F2.concepts\u002F3.shortest-path",{"title":49,"path":50,"stem":51},"Le socle","\u002Ffr\u002Fdocs\u002Fconcepts\u002Fthe-base","fr\u002Fdocs\u002F2.concepts\u002F4.the-base",false,{"title":54,"path":55,"stem":56,"children":57,"page":52},"Schéma","\u002Ffr\u002Fdocs\u002Fschema","fr\u002Fdocs\u002F3.schema",[58,62,66,70,74],{"title":59,"path":60,"stem":61},"Entités","\u002Ffr\u002Fdocs\u002Fschema\u002Fentities","fr\u002Fdocs\u002F3.schema\u002F1.entities",{"title":63,"path":64,"stem":65},"Vues","\u002Ffr\u002Fdocs\u002Fschema\u002Fviews","fr\u002Fdocs\u002F3.schema\u002F2.views",{"title":67,"path":68,"stem":69},"La carte d'identité","\u002Ffr\u002Fdocs\u002Fschema\u002Fcard","fr\u002Fdocs\u002F3.schema\u002F3.card",{"title":71,"path":72,"stem":73},"Standard Schema","\u002Ffr\u002Fdocs\u002Fschema\u002Fstandard-schema","fr\u002Fdocs\u002F3.schema\u002F4.standard-schema",{"title":75,"path":76,"stem":77},"Comment un schéma bouge","\u002Ffr\u002Fdocs\u002Fschema\u002Fevolution","fr\u002Fdocs\u002F3.schema\u002F5.evolution",{"title":79,"path":80,"stem":81,"children":82,"page":52},"Métier","\u002Ffr\u002Fdocs\u002Fbusiness","fr\u002Fdocs\u002F4.business",[83,87,91,95,99,103,107,111,115,119],{"title":84,"path":85,"stem":86},"Handlers","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fhandlers","fr\u002Fdocs\u002F4.business\u002F1.handlers",{"title":88,"path":89,"stem":90},"Les ports","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fports","fr\u002Fdocs\u002F4.business\u002F10.ports",{"title":92,"path":93,"stem":94},"Presenters","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fpresenters","fr\u002Fdocs\u002F4.business\u002F2.presenters",{"title":96,"path":97,"stem":98},"Collectors","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fcollectors","fr\u002Fdocs\u002F4.business\u002F3.collectors",{"title":100,"path":101,"stem":102},"Erreurs","\u002Ffr\u002Fdocs\u002Fbusiness\u002Ferrors","fr\u002Fdocs\u002F4.business\u002F4.errors",{"title":104,"path":105,"stem":106},"Seeds","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fseeds","fr\u002Fdocs\u002F4.business\u002F5.seeds",{"title":108,"path":109,"stem":110},"Les faits","\u002Ffr\u002Fdocs\u002Fbusiness\u002Ffacts","fr\u002Fdocs\u002F4.business\u002F6.facts",{"title":112,"path":113,"stem":114},"Le port Storage","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fstorage","fr\u002Fdocs\u002F4.business\u002F7.storage",{"title":116,"path":117,"stem":118},"Des écritures qui tiennent ou tombent ensemble","\u002Ffr\u002Fdocs\u002Fbusiness\u002Ftogether","fr\u002Fdocs\u002F4.business\u002F8.together",{"title":120,"path":121,"stem":122},"Les repositories","\u002Ffr\u002Fdocs\u002Fbusiness\u002Frepositories","fr\u002Fdocs\u002F4.business\u002F9.repositories",{"title":124,"path":125,"stem":126,"children":127,"page":52},"Client","\u002Ffr\u002Fdocs\u002Fclient","fr\u002Fdocs\u002F5.client",[128,132,136,140,144],{"title":129,"path":130,"stem":131},"Queries & commands","\u002Ffr\u002Fdocs\u002Fclient\u002Fqueries-commands","fr\u002Fdocs\u002F5.client\u002F1.queries-commands",{"title":133,"path":134,"stem":135},"Formulaires","\u002Ffr\u002Fdocs\u002Fclient\u002Fforms","fr\u002Fdocs\u002F5.client\u002F2.forms",{"title":137,"path":138,"stem":139},"Session","\u002Ffr\u002Fdocs\u002Fclient\u002Fsession","fr\u002Fdocs\u002F5.client\u002F3.session",{"title":141,"path":142,"stem":143},"invoke","\u002Ffr\u002Fdocs\u002Fclient\u002Finvoke","fr\u002Fdocs\u002F5.client\u002F4.invoke",{"title":145,"path":146,"stem":147},"Back-office","\u002Ffr\u002Fdocs\u002Fclient\u002Fadmin","fr\u002Fdocs\u002F5.client\u002F5.admin",{"title":149,"path":150,"stem":151,"children":152,"page":52},"Infrastructure","\u002Ffr\u002Fdocs\u002Finfra","fr\u002Fdocs\u002F6.infra",[153,157,161,165,169,173,177,181,185],{"title":154,"path":155,"stem":156},"Le gradient","\u002Ffr\u002Fdocs\u002Finfra\u002Fgradient","fr\u002Fdocs\u002F6.infra\u002F1.gradient",{"title":158,"path":159,"stem":160},"Surfaces — REST & GraphQL","\u002Ffr\u002Fdocs\u002Finfra\u002Fsurfaces","fr\u002Fdocs\u002F6.infra\u002F2.surfaces",{"title":162,"path":163,"stem":164},"Déploiement","\u002Ffr\u002Fdocs\u002Finfra\u002Fdeployment","fr\u002Fdocs\u002F6.infra\u002F3.deployment",{"title":166,"path":167,"stem":168},"Hôtes","\u002Ffr\u002Fdocs\u002Finfra\u002Fhosts","fr\u002Fdocs\u002F6.infra\u002F4.hosts",{"title":170,"path":171,"stem":172},"Les sources","\u002Ffr\u002Fdocs\u002Finfra\u002Fsources","fr\u002Fdocs\u002F6.infra\u002F5.sources",{"title":174,"path":175,"stem":176},"Le cycle de vie","\u002Ffr\u002Fdocs\u002Finfra\u002Flifecycle","fr\u002Fdocs\u002F6.infra\u002F6.lifecycle",{"title":178,"path":179,"stem":180},"L'identité entre Fronds","\u002Ffr\u002Fdocs\u002Finfra\u002Fidentity","fr\u002Fdocs\u002F6.infra\u002F7.identity",{"title":182,"path":183,"stem":184},"Observabilité","\u002Ffr\u002Fdocs\u002Finfra\u002Fobservability","fr\u002Fdocs\u002F6.infra\u002F8.observability",{"title":186,"path":187,"stem":188},"Tests","\u002Ffr\u002Fdocs\u002Finfra\u002Ftesting","fr\u002Fdocs\u002F6.infra\u002F9.testing",{"id":190,"title":178,"body":191,"description":689,"extension":690,"meta":691,"navigation":692,"path":179,"seo":693,"stem":180,"__hash__":694},"docs_fr\u002Ffr\u002Fdocs\u002F6.infra\u002F7.identity.md",{"type":192,"value":193,"toc":679},"minimark",[194,198,207,212,215,226,233,237,240,361,364,400,404,410,417,420,424,457,475,485,489,492,558,565,569,581,603,632,636,646,656,662,666,675],[195,196,178],"h1",{"id":197},"lidentité-entre-fronds",[199,200,201,202,206],"p",{},"Dans un seul process, un appel est un appel de fonction : rien ne traverse, rien n'est à\nprouver. Séparez une Frond et le même appel devient une charge utile — et une charge utile\npeut dire n'importe quoi. Cette page répond à ce qu'un récepteur ",[203,204,205],"em",{},"établit"," au lieu\nd'accepter.",[208,209,211],"h2",{"id":210},"loopback-ou-signé","Loopback ou signé",[199,213,214],{},"Un récepteur refuse de démarrer quand il écoute au-delà du loopback sans moyen d'établir\nson appelant. Pas à chaque appel : au démarrage.",[216,217,222],"pre",{"className":218,"code":220,"language":221},[219],"language-text","127.0.0.1                        démarre, rien à configurer\n0.0.0.0 + FOUGERE_ROOT_KEY       démarre, vérifie chaque appel\n0.0.0.0 sans racine              ne démarre pas, et dit quoi faire\n0.0.0.0 + allowUnsigned: true    démarre — quelque chose en amont a déjà authentifié\n","text",[223,224,220],"code",{"__ignoreMap":225},"",[199,227,228,229,232],{},"L'adresse porte déjà la décision. Écouter au-delà du loopback est un acte délibéré —\n",[223,230,231],{},"hosts"," est l'endroit où vous l'écrivez — et un récepteur atteignable depuis l'extérieur qui\nn'établit rien croit l'état qu'on lui tend. Refuser au démarrage plutôt qu'à chaque appel\nest tout l'intérêt : un récepteur qui démarre puis rejette tout se découvre en production,\nun récepteur qui ne démarre pas se découvre au déploiement.",[208,234,236],{"id":235},"ce-qui-voyage","Ce qui voyage",[199,238,239],{},"Chaque appel qui traverse un lien porte une enveloppe, signée par l'appelant :",[216,241,245],{"className":242,"code":243,"language":244,"meta":225,"style":225},"language-json shiki shiki-themes material-theme-lighter github-light github-dark","{ \"method\": \"post.list\",\n  \"params\": { \"params\": {}, \"query\": {}, \"body\": null,\n              \"identity\": \"eyJhbGciOiJFZERTQSIs…\" } }\n","json",[223,246,247,282,335],{"__ignoreMap":225},[248,249,252,256,260,264,267,270,273,277,279],"span",{"class":250,"line":251},"line",1,[248,253,255],{"class":254},"sP7_E","{",[248,257,259],{"class":258},"s39Yj"," \"",[248,261,263],{"class":262},"sseR_","method",[248,265,266],{"class":258},"\"",[248,268,269],{"class":254},":",[248,271,259],{"class":272},"sjJ54",[248,274,276],{"class":275},"s_sjI","post.list",[248,278,266],{"class":272},[248,280,281],{"class":254},",\n",[248,283,285,288,291,293,295,298,300,303,305,307,310,312,315,317,319,321,323,326,328,330,333],{"class":250,"line":284},2,[248,286,287],{"class":258},"  \"",[248,289,290],{"class":262},"params",[248,292,266],{"class":258},[248,294,269],{"class":254},[248,296,297],{"class":254}," {",[248,299,259],{"class":258},[248,301,290],{"class":302},"sZMiF",[248,304,266],{"class":258},[248,306,269],{"class":254},[248,308,309],{"class":254}," {},",[248,311,259],{"class":258},[248,313,314],{"class":302},"query",[248,316,266],{"class":258},[248,318,269],{"class":254},[248,320,309],{"class":254},[248,322,259],{"class":258},[248,324,325],{"class":302},"body",[248,327,266],{"class":258},[248,329,269],{"class":254},[248,331,332],{"class":258}," null",[248,334,281],{"class":254},[248,336,338,341,344,346,348,350,353,355,358],{"class":250,"line":337},3,[248,339,340],{"class":258},"              \"",[248,342,343],{"class":302},"identity",[248,345,266],{"class":258},[248,347,269],{"class":254},[248,349,259],{"class":272},[248,351,352],{"class":275},"eyJhbGciOiJFZERTQSIs…",[248,354,266],{"class":272},[248,356,357],{"class":254}," }",[248,359,360],{"class":254}," }\n",[199,362,363],{},"L'enveloppe porte l'état — qui est connecté, s'il y a quelqu'un — et le récepteur le prend\nde là plutôt que de la charge utile. Envoyer les deux laisserait chaque lecteur en aval\nchoisir entre une preuve et une prétention sur la même chose.",[199,365,366,367,371,372,375,376,375,379,381,382,384,385,388,389,392,393,395,396,399],{},"Elle lie ",[368,369,370],"strong",{},"l'appel entier"," : ",[223,373,374],{},"entity",", ",[223,377,378],{},"op",[223,380,290],{}," et ",[223,383,314],{}," par valeur, le corps par\nempreinte. Signer l'état seul prouverait ",[203,386,387],{},"qui"," sans prouver ",[203,390,391],{},"quoi",", et une enveloppe\ncapturée pourrait être rejouée contre une autre opération tant qu'elle reste valide —\n",[223,394,276],{}," renvoyé en ",[223,397,398],{},"post.delete",", même signature, toujours bonne.",[208,401,403],{"id":402},"deux-signatures-une-clé-publique","Deux signatures, une clé publique",[216,405,408],{"className":406,"code":407,"language":221},[219],"GRANT      la racine dit « cette clé est blog »    — émis une fois, au déploiement\nENVELOPPE  blog dit « voici mon appel entier »     — signée à chaque appel\n",[223,409,407],{"__ignoreMap":225},[199,411,412,413,416],{},"Un récepteur détient la clé publique de la racine et ",[368,414,415],{},"rien d'autre",". Il admet une Frond\nqu'il n'a jamais vue, et une Frond dotée demain est admise par un récepteur déployé\naujourd'hui sans qu'on touche à sa configuration. C'est la différence entre une autorité et\nune liste d'appelants connus : la liste doit être mise à jour partout, et elle se périme.",[199,418,419],{},"La vérification est hors ligne — aucun service n'est joint, ni à un appel, ni à un\ndémarrage.",[208,421,423],{"id":422},"émettre","Émettre",[216,425,429],{"className":426,"code":427,"language":428,"meta":225,"style":225},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","fougere keys              # une fois par système — écrit .fougere\u002Froot.key, imprime FOUGERE_ROOT_KEY\nfougere grant blog        # une fois par Frond qui APPELLE — imprime FOUGERE_KEY et FOUGERE_GRANT\n","bash",[223,430,431,444],{"__ignoreMap":225},[248,432,433,437,440],{"class":250,"line":251},[248,434,436],{"class":435},"sbgvK","fougere",[248,438,439],{"class":275}," keys",[248,441,443],{"class":442},"sutJx","              # une fois par système — écrit .fougere\u002Froot.key, imprime FOUGERE_ROOT_KEY\n",[248,445,446,448,451,454],{"class":250,"line":284},[248,447,436],{"class":435},[248,449,450],{"class":275}," grant",[248,452,453],{"class":275}," blog",[248,455,456],{"class":442},"        # une fois par Frond qui APPELLE — imprime FOUGERE_KEY et FOUGERE_GRANT\n",[199,458,459,462,463,466,467,470,471,474],{},[223,460,461],{},"fougere keys"," est une commande, pas un service : elle s'exécute au déploiement et sort.\nRien ne reste vivant, rien n'est joint au démarrage. La clé privée de la racine est écrite\ndans ",[223,464,465],{},".fougere\u002Froot.key"," (mode ",[223,468,469],{},"600",", ajoutée au ",[223,472,473],{},".gitignore",") et jamais imprimée : elle\nsigne des grants, et un grant est la seule chose qui doive voyager.",[199,476,477,480,481,484],{},[223,478,479],{},"fougere grant"," imprime et ne stocke rien. La relancer émet une ",[368,482,483],{},"nouvelle"," clé au lieu de\nmontrer l'ancienne — c'est ce qu'est une rotation : relancez, redéployez cette Frond, et la\nconfiguration de personne d'autre ne bouge.",[208,486,488],{"id":487},"ce-quun-déploiement-injecte","Ce qu'un déploiement injecte",[199,490,491],{},"Trois variables, aucune clé de configuration — une clé privée n'a pas sa place dans un\nfichier versionné. PEM ou base64, les deux sont lus.",[493,494,495,510],"table",{},[496,497,498],"thead",{},[499,500,501,504,507],"tr",{},[502,503],"th",{},[502,505,506],{},"Où",[502,508,509],{},"Ce que c'est",[511,512,513,530,545],"tbody",{},[499,514,515,521,527],{},[516,517,518],"td",{},[223,519,520],{},"FOUGERE_ROOT_KEY",[516,522,523,524],{},"chaque Frond qui ",[368,525,526],{},"répond",[516,528,529],{},"publique — sans risque dans une image ou un manifeste",[499,531,532,537,542],{},[516,533,534],{},[223,535,536],{},"FOUGERE_KEY",[516,538,523,539],{},[368,540,541],{},"appelle",[516,543,544],{},"secrète, montrée une fois",[499,546,547,552,555],{},[516,548,549],{},[223,550,551],{},"FOUGERE_GRANT",[516,553,554],{},"à côté",[516,556,557],{},"la parole de la racine : cette clé est cette Frond",[199,559,560,561,564],{},"Une Frond peut détenir l'une des deux moitiés ou les deux : celle qui ne fait que répondre\nn'a pas de clé, celle qui ne fait qu'appeler ne fait confiance à aucune racine, celle du\nmilieu fait les deux. Faire confiance à une racine ",[368,562,563],{},"c'est"," demander à refuser : il n'y a\npas de second drapeau, parce qu'un déploiement qui nomme une autorité puis accepte des\nappels non signés a dit deux choses à la fois.",[208,566,568],{"id":567},"ce-quun-handler-voit","Ce qu'un handler voit",[199,570,571,572,576,577,580],{},"Rien de nouveau à écrire. L'état arrive là où il arrivait déjà, donc un\n",[573,574,575],"a",{"href":97},"collector"," qui lit ",[223,578,579],{},"ctx.state.user"," est inchangé — en process\ncomme en séparé. Ce qui s'ajoute est un champ :",[216,582,586],{"className":583,"code":584,"language":585,"meta":225,"style":225},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","invocation.caller   \u002F\u002F 'blog' — la Frond qui a signé, telle que la racine l'a nommée\n","ts",[223,587,588],{"__ignoreMap":225},[248,589,590,594,597,600],{"class":250,"line":251},[248,591,593],{"class":592},"su5hD","invocation",[248,595,596],{"class":254},".",[248,598,599],{"class":592},"caller   ",[248,601,602],{"class":442},"\u002F\u002F 'blog' — la Frond qui a signé, telle que la racine l'a nommée\n",[199,604,605,606,609,610,612,613,616,617,620,621,624,625,628,629,596],{},"Il est au premier niveau et non une clé de ",[223,607,608],{},"state",", et la raison décide de comment le lire :\n",[223,611,608],{}," voyage non vérifié quand aucun vérificateur n'est câblé, donc un ",[223,614,615],{},"caller"," logé\ndedans serait forgeable exactement là où rien ne contrôle. ",[368,618,619],{},"Absent veut dire non établi",",\net il n'existe aucune orthographe pour une prétention. Un émetteur le purge à chaque saut,\nsi bien qu'il nomme le dernier : ",[223,622,623],{},"shop → catalog → billing"," fait lire ",[223,626,627],{},"catalog"," à ",[223,630,631],{},"billing",[208,633,635],{"id":634},"ce-que-ceci-ne-fait-pas","Ce que ceci ne fait pas",[199,637,638,641,642,645],{},[368,639,640],{},"L'autorisation."," Une signature dit qui appelle, jamais ce qu'il a le droit d'appeler.\n",[223,643,644],{},"if (user.role !== 'admin') throw"," reste à votre charge.",[199,647,648,651,652,655],{},[368,649,650],{},"Le travail d'un mesh."," Sous un service mesh, le sidecar a terminé le mTLS avant que votre\nprocess ne voie la requête, et demander une seconde signature referait ce qui vient d'être\nfait un centimètre plus loin. C'est à ça que sert ",[223,653,654],{},"allowUnsigned: true"," — écrit séparément\nde tout le reste, pour qu'il ne puisse jamais vouloir dire autre chose que « j'y ai\nréfléchi ».",[199,657,658,661],{},[368,659,660],{},"Les corps entre langages."," Le corps est lié par une empreinte de son texte JSON, seul\nendroit où l'ordre des clés compte. Un émetteur écrit dans un autre langage doit émettre le\ncorps comme il l'a haché. Tout le reste est lié par valeur, ce qui maintient une dépendance\nà du JSON canonique hors du fil.",[208,663,665],{"id":664},"le-navigateur-nest-pas-dans-cette-histoire","Le navigateur n'est pas dans cette histoire",[199,667,668,669,671,672,596],{},"Un navigateur est en dehors de la topologie et ne détient aucune clé. Il ne signe jamais, et\nrien de ce qu'il envoie n'est pris pour une identité : l'hôte résout la session côté serveur\ndepuis le cookie de la requête, et le ",[223,670,608],{}," de la charge utile est jeté. C'était déjà vrai\net rien n'a changé — cette page parle du lien entre deux ",[203,673,674],{},"process",[676,677,678],"style",{},"html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sseR_, html code.shiki .sseR_{--shiki-light:#9C3EDA;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":225,"searchDepth":284,"depth":284,"links":680},[681,682,683,684,685,686,687,688],{"id":210,"depth":284,"text":211},{"id":235,"depth":284,"text":236},{"id":402,"depth":284,"text":403},{"id":422,"depth":284,"text":423},{"id":487,"depth":284,"text":488},{"id":567,"depth":284,"text":568},{"id":634,"depth":284,"text":635},{"id":664,"depth":284,"text":665},"Comment un récepteur établit qui appelle — enveloppes signées, une racine, et la règle qui dit qu'il n'y a pas de troisième façon de servir.","md",{},true,{"title":178,"description":689},"lexAQlwxqK1bPsuBEqY4nEhBf4f15DqPZW5JzE4Ilro",1788598419908]