2025-12-17 13:07:35 +00:00
<!DOCTYPE html>
< html style = 'scrollbar-gutter: stable both-edges;' >
< head >
< meta charset = 'UTF-8' >
< meta name = 'color-scheme' content = 'dark light' >
< meta name = 'viewport' content = 'width=device-width, initial-scale=1.0' >
< title > Playwright Test Report< / title >
Phase 2 stabilisation: code mort, Modal→Dialog, feature flags, tests, router split, Rust legacy
Bloc A - Code mort:
- Suppression Studio (components, views, features)
- Suppression gamification + services mock (projectService, storageService, gamificationService)
- Mise à jour Sidebar, Navbar, locales
Bloc B - Frontend:
- Suppression modal.tsx deprecated, Modal.stories (doublon Dialog)
- Feature flags: PLAYLIST_SEARCH, PLAYLIST_RECOMMENDATIONS, ROLE_MANAGEMENT = true
- Suppression 19 tests orphelins, retrait exclusions vitest.config
Bloc C - Backend:
- Extraction routes_auth.go depuis router.go
Bloc D - Rust:
- Suppression security_legacy.rs (code mort, patterns déjà dans security/)
2026-02-14 16:23:32 +00:00
< script type = "module" > v a r N A = O b j e c t . d e f i n e P r o p e r t y ; v a r B A = ( l , u , c ) = > u i n l ? N A ( l , u , { e n u m e r a b l e : ! 0 , c o n f i g u r a b l e : ! 0 , w r i t a b l e : ! 0 , v a l u e : c } ) : l [ u ] = c ; v a r y n = ( l , u , c ) = > B A ( l , t y p e o f u ! = " s y m b o l " ? u + " " : u , c ) ; ( f u n c t i o n ( ) { c o n s t u = d o c u m e n t . c r e a t e E l e m e n t ( " l i n k " ) . r e l L i s t ; i f ( u & & u . s u p p o r t s & & u . s u p p o r t s ( " m o d u l e p r e l o a d " ) ) r e t u r n ; f o r ( c o n s t r o f d o c u m e n t . q u e r y S e l e c t o r A l l ( ' l i n k [ r e l = " m o d u l e p r e l o a d " ] ' ) ) f ( r ) ; n e w M u t a t i o n O b s e r v e r ( r = > { f o r ( c o n s t o o f r ) i f ( o . t y p e = = = " c h i l d L i s t " ) f o r ( c o n s t h o f o . a d d e d N o d e s ) h . t a g N a m e = = = " L I N K " & & h . r e l = = = " m o d u l e p r e l o a d " & & f ( h ) } ) . o b s e r v e ( d o c u m e n t , { c h i l d L i s t : ! 0 , s u b t r e e : ! 0 } ) ; f u n c t i o n c ( r ) { c o n s t o = { } ; r e t u r n r . i n t e g r i t y & & ( o . i n t e g r i t y = r . i n t e g r i t y ) , r . r e f e r r e r P o l i c y & & ( o . r e f e r r e r P o l i c y = r . r e f e r r e r P o l i c y ) , r . c r o s s O r i g i n = = = " u s e - c r e d e n t i a l s " ? o . c r e d e n t i a l s = " i n c l u d e " : r . c r o s s O r i g i n = = = " a n o n y m o u s " ? o . c r e d e n t i a l s = " o m i t " : o . c r e d e n t i a l s = " s a m e - o r i g i n " , o } f u n c t i o n f ( r ) { i f ( r . e p ) r e t u r n ; r . e p = ! 0 ; c o n s t o = c ( r ) ; f e t c h ( r . h r e f , o ) } } ) ( ) ; f u n c t i o n U A ( l ) { r e t u r n l & & l . _ _ e s M o d u l e & & O b j e c t . p r o t o t y p e . h a s O w n P r o p e r t y . c a l l ( l , " d e f a u l t " ) ? l . d e f a u l t : l } v a r M f = { e x p o r t s : { } } , E i = { } ; / * *
2025-12-17 13:07:35 +00:00
* @license React
* react-jsx-runtime.production.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
Phase 2 stabilisation: code mort, Modal→Dialog, feature flags, tests, router split, Rust legacy
Bloc A - Code mort:
- Suppression Studio (components, views, features)
- Suppression gamification + services mock (projectService, storageService, gamificationService)
- Mise à jour Sidebar, Navbar, locales
Bloc B - Frontend:
- Suppression modal.tsx deprecated, Modal.stories (doublon Dialog)
- Feature flags: PLAYLIST_SEARCH, PLAYLIST_RECOMMENDATIONS, ROLE_MANAGEMENT = true
- Suppression 19 tests orphelins, retrait exclusions vitest.config
Bloc C - Backend:
- Extraction routes_auth.go depuis router.go
Bloc D - Rust:
- Suppression security_legacy.rs (code mort, patterns déjà dans security/)
2026-02-14 16:23:32 +00:00
*/var D1;function QA(){if(D1)return Ei;D1=1;var l=Symbol.for("react.transitional.element"),u=Symbol.for("react.fragment");function c(f,r,o){var h=null;if(o!==void 0& & (h=""+o),r.key!==void 0& & (h=""+r.key),"key"in r){o={};for(var v in r)v!=="key"& & (o[v]=r[v])}else o=r;return r=o.ref,{$$typeof:l,type:f,key:h,ref:r!==void 0?r:null,props:o}}return Ei.Fragment=u,Ei.jsx=c,Ei.jsxs=c,Ei}var M1;function zA(){return M1||(M1=1,Mf.exports=QA()),Mf.exports}var m=zA();const YA=15,xt=0,bn=1,LA=2,ye=-2,Ut=-3,j1=-4,xn=-5,Me=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535],L2=1440,GA=0,XA=4,VA=9,ZA=5,qA=[96,7,256,0,8,80,0,8,16,84,8,115,82,7,31,0,8,112,0,8,48,0,9,192,80,7,10,0,8,96,0,8,32,0,9,160,0,8,0,0,8,128,0,8,64,0,9,224,80,7,6,0,8,88,0,8,24,0,9,144,83,7,59,0,8,120,0,8,56,0,9,208,81,7,17,0,8,104,0,8,40,0,9,176,0,8,8,0,8,136,0,8,72,0,9,240,80,7,4,0,8,84,0,8,20,85,8,227,83,7,43,0,8,116,0,8,52,0,9,200,81,7,13,0,8,100,0,8,36,0,9,168,0,8,4,0,8,132,0,8,68,0,9,232,80,7,8,0,8,92,0,8,28,0,9,152,84,7,83,0,8,124,0,8,60,0,9,216,82,7,23,0,8,108,0,8,44,0,9,184,0,8,12,0,8,140,0,8,76,0,9,248,80,7,3,0,8,82,0,8,18,85,8,163,83,7,35,0,8,114,0,8,50,0,9,196,81,7,11,0,8,98,0,8,34,0,9,164,0,8,2,0,8,130,0,8,66,0,9,228,80,7,7,0,8,90,0,8,26,0,9,148,84,7,67,0,8,122,0,8,58,0,9,212,82,7,19,0,8,106,0,8,42,0,9,180,0,8,10,0,8,138,0,8,74,0,9,244,80,7,5,0,8,86,0,8,22,192,8,0,83,7,51,0,8,118,0,8,54,0,9,204,81,7,15,0,8,102,0,8,38,0,9,172,0,8,6,0,8,134,0,8,70,0,9,236,80,7,9,0,8,94,0,8,30,0,9,156,84,7,99,0,8,126,0,8,62,0,9,220,82,7,27,0,8,110,0,8,46,0,9,188,0,8,14,0,8,142,0,8,78,0,9,252,96,7,256,0,8,81,0,8,17,85,8,131,82,7,31,0,8,113,0,8,49,0,9,194,80,7,10,0,8,97,0,8,33,0,9,162,0,8,1,0,8,129,0,8,65,0,9,226,80,7,6,0,8,89,0,8,25,0,9,146,83,7,59,0,8,121,0,8,57,0,9,210,81,7,17,0,8,105,0,8,41,0,9,178,0,8,9,0,8,137,0,8,73,0,9,242,80,7,4,0,8,85,0,8,21,80,8,258,83,7,43,0,8,117,0,8,53,0,9,202,81,7,13,0,8,101,0,8,37,0,9,170,0,8,5,0,8,133,0,8,69,0,9,234,80,7,8,0,8,93,0,8,29,0,9,154,84,7,83,0,8,125,0,8,61,0,9,218,82,7,23,0,8,109,0,8,45,0,9,186,0,8,13,0,8,141,0,8,77,0,9,250,80,7,3,0,8,83,0,8,19,85,8,195,83,7,35,0,8,115,0,8,51,0,9,198,81,7,11,0,8,99,0,8,35,0,9,166,0,8,3,0,8,131,0,8,67,0,9,230,80,7,7,0,8,91,0,8,27,0,9,150,84,7,67,0,8,123,0,8,59,0,9,214,82,7,19,0,8,107,0,8,43,0,9,182,0,8,11,0,8,139,0,8,75,0,9,246,80,7,5,0,8,87,0,8,23,192,8,0,83,7,51,0,8,119,0,8,55,0,9,206,81,7,15,0,8,103,0,8,39,0,9,174,0,8,7,0,8,135,0,8,71,0,9,238,80,7,9,0,8,95,0,8,31,0,9,158,84,7,99,0,8,127,0,8,63,0,9,222,82,7,27,0,8,111,0,8,47,0,9,190,0,8,15,0,8,143,0,8,79,0,9,254,96,7,256,0,8,80,0,8,16,84,8,115,82,7,31,0,8,112,0,8,48,0,9,193,80,7,10,0,8,96,0,8,32,0,9,161,0,8,0,0,8,128,0,8,64,0,9,225,80,7,6,0,8,88,0,8,24,0,9,145,83,7,59,0,8,120,0,8,56,0,9,209,81,7,17,0,8,104,0,8,40,0,9,177,0,8,8,0,8,136,0,8,72,0,9,241,80,7,4,0,8,84,0,8,20,85,8,227,83,7,43,0,8,116,0,8,52,0,9,201,81,7,13,0,8,100,0,8,36,0,9,169,0,8,4,0,8,132,0,8,68,0,9,233,80,7,8,0,8,92,0,8,28,0,9,153,84,7,83,0,8,124,0,8,60,0,9,217,82,7,23,0,8,108,0,8,44,0,9,185,0,8,12,0,8,140,0,8,76,0,9,249,80,7,3,0,8,82,0,8,18,85,8,163,83,7,35,0,8,114,0,8,50,0,9,197,81,7,11,0,8,98,0,8,34,0,9,165,0,8,2,0,8,130,0,8,66,0,9,229,80,7,7,0,8,90,0,8,26,0,9,149,84,7,67,0,8,122,0,8,58,0,9,213,82,7,19,0,8,106,0,8,42,0,9,181,0,8,10,0,8,138,0,8,74,0,9,245,80,7,5,0,8,86,0,8,22,192,8,0,83,7,51,0,8,118,0,8,54,0,9,205,81,7,15,0,8,102,0,8,38,0,9,173,0,8,6,0,8,134,0,8,70,0,9,237,80,7,9,0,8,94,0,8,30,0,9,157,84,7,99,0,8,126,0,8,62,0,9,221,82,7,27,0,8,110,0,8,46,0,9,189,0,8,14,0,8,142,0,8,78,0,9,253,96,7,256,0,8,81,0,8,17,85,8,131,82,7,31,0,8,113,0,8,49,0,9,195,80,7,10,0,8,97,0,8,33,0,9,163,0,8,1,0,8,129,0,8,65,0,9,227,80,7,6,0,8,89,0,8,25,0,9,147,83,7,59,0,8,121,0,8,57,0,9,211,81,7,17,0,8,105,0,8,41,0,9,179,0,8,9,0,8,137,0,8,73,0,9,243,80,7,4,0,8,85,0,8,21,80,8,258,83,7,43,0,8,117,0,8,53,0,9,203,81,7,13,0,8,101,0,8,37,0,9,171,0,8,5,0,8,133,0,8,69,0,9,235,80,7,8,0,8,93,0,8,29,0,9,155,84,7,83,0,8,125,0,8,61,0,9,219,82,7,23,0,8,109,0,8,45,0,9,187,0,8,13,0,8,141,0,8,77,0,9,251,80,7,3,0,8,83,0,8,19,85,8,195,83,7,35,0,8,115,0,8,51,0,9,199,81,7,11,0,8,99,0,8,35,0,9,167,0,8,3,0,
2025-12-17 13:07:35 +00:00
* @license React
* react.production.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
Phase 2 stabilisation: code mort, Modal→Dialog, feature flags, tests, router split, Rust legacy
Bloc A - Code mort:
- Suppression Studio (components, views, features)
- Suppression gamification + services mock (projectService, storageService, gamificationService)
- Mise à jour Sidebar, Navbar, locales
Bloc B - Frontend:
- Suppression modal.tsx deprecated, Modal.stories (doublon Dialog)
- Feature flags: PLAYLIST_SEARCH, PLAYLIST_RECOMMENDATIONS, ROLE_MANAGEMENT = true
- Suppression 19 tests orphelins, retrait exclusions vitest.config
Bloc C - Backend:
- Extraction routes_auth.go depuis router.go
Bloc D - Rust:
- Suppression security_legacy.rs (code mort, patterns déjà dans security/)
2026-02-14 16:23:32 +00:00
*/var T2;function B5(){if(T2)return dt;T2=1;var l=Symbol.for("react.transitional.element"),u=Symbol.for("react.portal"),c=Symbol.for("react.fragment"),f=Symbol.for("react.strict_mode"),r=Symbol.for("react.profiler"),o=Symbol.for("react.consumer"),h=Symbol.for("react.context"),v=Symbol.for("react.forward_ref"),y=Symbol.for("react.suspense"),A=Symbol.for("react.memo"),E=Symbol.for("react.lazy"),S=Symbol.for("react.activity"),O=Symbol.iterator;function X(C){return C===null||typeof C!="object"?null:(C=O& & C[O]||C["@@iterator"],typeof C=="function"?C:null)}var B={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},b=Object.assign,p={};function x(C,L,W){this.props=C,this.context=L,this.refs=p,this.updater=W||B}x.prototype.isReactComponent={},x.prototype.setState=function(C,L){if(typeof C!="object"& & typeof C!="function"& & C!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,C,L,"setState")},x.prototype.forceUpdate=function(C){this.updater.enqueueForceUpdate(this,C,"forceUpdate")};function R(){}R.prototype=x.prototype;function U(C,L,W){this.props=C,this.context=L,this.refs=p,this.updater=W||B}var Z=U.prototype=new R;Z.constructor=U,b(Z,x.prototype),Z.isPureReactComponent=!0;var F=Array.isArray;function j(){}var D={H:null,A:null,T:null,S:null},N=Object.prototype.hasOwnProperty;function K(C,L,W){var et=W.ref;return{$$typeof:l,type:C,key:L,ref:et!==void 0?et:null,props:W}}function J(C,L){return K(C.type,L,C.props)}function k(C){return typeof C=="object"& & C!==null& & C.$$typeof===l}function nt(C){var L={"=":"=0",":":"=2"};return"$"+C.replace(/[=:]/g,function(W){return L[W]})}var P=/\/+/g;function st(C,L){return typeof C=="object"& & C!==null& & C.key!=null?nt(""+C.key):L.toString(36)}function it(C){switch(C.status){case"fulfilled":return C.value;case"rejected":throw C.reason;default:switch(typeof C.status=="string"?C.then(j,j):(C.status="pending",C.then(function(L){C.status==="pending"& & (C.status="fulfilled",C.value=L)},function(L){C.status==="pending"& & (C.status="rejected",C.reason=L)})),C.status){case"fulfilled":return C.value;case"rejected":throw C.reason}}throw C}function H(C,L,W,et,rt){var ot=typeof C;(ot==="undefined"||ot==="boolean")&&(C=null); var gt=!1;if(C===null)gt=!0;else switch(ot){case"bigint":case"string":case"number":gt=!0;break;case"object":switch(C.$$typeof){case l:case u:gt=!0;break;case E:return gt=C._init,H(gt(C._payload),L,W,et,rt)}}if(gt)return rt=rt(C),gt=et===""?"."+st(C,0):et,F(rt)?(W="",gt!=null& & (W=gt.replace(P,"$& /")+"/"),H(rt,L,W,"",function(On){return On})):rt!=null&&(k(rt)&&(rt=J(rt,W+(rt.key==null||C&&C.key===rt.key?"":(""+rt.key).replace(P,"$&/")+"/")+gt)),L.push(rt)),1; gt=0;var Ft=et===""?".":et+":";if(F(C))for(var Qt=0;Qt< C.length ; Qt + + ) et = C[Qt],ot=Ft+st(et,Qt),gt+=H(et,L,W,ot,rt);else if ( Qt = X(C),typeof Qt = ="function")for(C=Qt.call(C),Qt=0;!(et=C.next()).done;)et=et.value,ot=Ft+st(et,Qt++),gt+=H(et,L,W,ot,rt);else if ( ot = =="object"){if(typeof C . then = ="function")return H ( it ( C ) , L , W , et , rt ) ; throw L = String(C),Error("Objects are not valid as a React child ( found: " + ( L = =="[object Object ] " ? " object with keys { " + Object . keys ( C ) . join ( " , " ) + " } " :L ) + " ) . If you meant to render a collection of children , use an array instead . " ) } return gt } function _ ( C , L , W ) { if ( C = =null)return C ; var et = [],rt=0;return H ( C , et , " " , " " , function ( ot ) { return L . call ( W , ot , rt + + ) } ) , et } function $ ( C ) { if ( C . _status = ==-1){var L = C._result;L=L(),L.then(function(W){(C._status===0||C._status===-1)&&(C._status=1,C._result=W)},function(W){(C._status===0||C._status===-1)&&(C._status=2,C._result=W)}),C._status===-1&&(C._status=0,C._result=L)}if(C._status===1)return C . _result . default ; throw C . _result } var ht = typeof reportError = ="function"?reportError:function(C){if(typeof window = ="object"&&typeof window . ErrorEvent = ="function"){var L = new window . ErrorEvent ( " error " , { bubbles: ! 0 , cancelable: ! 0 , message:typeof C = ="object"&&C!==null&&typeof C . message = ="string"?String(C.message):String(C),error:C});if(!wi
2025-12-17 13:07:35 +00:00
* @license React
* scheduler.production.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
Phase 2 stabilisation: code mort, Modal→Dialog, feature flags, tests, router split, Rust legacy
Bloc A - Code mort:
- Suppression Studio (components, views, features)
- Suppression gamification + services mock (projectService, storageService, gamificationService)
- Mise à jour Sidebar, Navbar, locales
Bloc B - Frontend:
- Suppression modal.tsx deprecated, Modal.stories (doublon Dialog)
- Feature flags: PLAYLIST_SEARCH, PLAYLIST_RECOMMENDATIONS, ROLE_MANAGEMENT = true
- Suppression 19 tests orphelins, retrait exclusions vitest.config
Bloc C - Backend:
- Extraction routes_auth.go depuis router.go
Bloc D - Rust:
- Suppression security_legacy.rs (code mort, patterns déjà dans security/)
2026-02-14 16:23:32 +00:00
*/var O2;function U5(){return O2||(O2=1,(function(l){function u(H,_){var $=H.length;H.push(_);t:for(;0< $;){var ht=$-1>>>1,tt=H[ht];if(0< r ( tt , _ ) ) H [ ht ] = _ , H [ $ ] = tt , $ = ht ; else break t } } function c ( H ) { return H . length = ==0?null:H[0]}function f ( H ) { if ( H . length = ==0)return null ; var _ = H[0],$=H.pop();if($!==_){H[0]=$;t:for(var ht = 0,tt=H.length,C=tt > >>1;ht< C ; ) { var L = 2*(ht+1)-1,W=H[L],et=L+1,rt=H[et];if(0 > r(W,$))et< tt & & 0 > r(rt,W)?(H[ht]=rt,H[et]=$,ht=et):(H[ht]=W,H[L]=$,ht=L);else if(et< tt & & 0 > r(rt,$))H[ht]=rt,H[et]=$,ht=et;else break t}}return _}function r(H,_){var $=H.sortIndex-_.sortIndex;return $!==0?$:H.id-_.id}if(l.unstable_now=void 0,typeof performance=="object"& & typeof performance.now=="function"){var o=performance;l.unstable_now=function(){return o.now()}}else{var h=Date,v=h.now();l.unstable_now=function(){return h.now()-v}}var y=[],A=[],E=1,S=null,O=3,X=!1,B=!1,b=!1,p=!1,x=typeof setTimeout=="function"?setTimeout:null,R=typeof clearTimeout=="function"?clearTimeout:null,U=typeof setImmediate< "u"?setImmediate:null;function Z(H){for(var _=c(A);_!==null;){if(_.callback===null)f(A);else if(_.startTime< =H)f(A),_.sortIndex=_.expirationTime,u(y,_);else break;_=c(A)}}function F(H){if(b=!1,Z(H),!B)if(c(y)!==null)B=!0,j||(j=!0,nt());else{var _=c(A);_!==null& & it(F,_.startTime-H)}}var j=!1,D=-1,N=5,K=-1;function J(){return p?!0:!(l.unstable_now()-K< N ) } function k ( ) { if ( p = !1,j){var H = l.unstable_now();K=H;var _ = !0;try{t:{B=!1,b&&(b=!1,R(D),D=-1),X=!0;var $ = O ; try { e: { for ( Z ( H ) , S = c(y);S!==null&&!(S.expirationTime > H&&J()); ){var ht=S.callback;if(typeof ht=="function"){S.callback=null,O=S.priorityLevel;var tt=ht(S.expirationTime< =H);if(H=l.unstable_now(),typeof tt=="function"){S.callback=tt,Z(H),_=!0;break e}S===c(y)& & f(y),Z(H)}else f(y);S=c(y)}if(S!==null)_=!0;else{var C=c(A);C!==null& & it(F,C.startTime-H),_=!1}}break t}finally{S=null,O=$,X=!1}_=void 0}}finally{_?nt():j=!1}}}var nt;if(typeof U=="function")nt=function(){U(k)};else if(typeof MessageChannel< "u"){var P=new MessageChannel,st=P.port2;P.port1.onmessage=k,nt=function(){st.postMessage(null)}}else nt=function(){x(k,0)};function it(H,_){D=x(function(){H(l.unstable_now())},_)}l.unstable_IdlePriority=5,l.unstable_ImmediatePriority=1,l.unstable_LowPriority=4,l.unstable_NormalPriority=3,l.unstable_Profiling=null,l.unstable_UserBlockingPriority=2,l.unstable_cancelCallback=function(H){H.callback=null},l.unstable_forceFrameRate=function(H){0>H||125< H ? console . error ( " forceFrameRate takes a positive int between 0 and 125 , forcing frame rates higher than 125 fps is not supported " ) :N = 0<H?Math.floor(1e3/H):5},l.unstable_getCurrentPriorityLevel=function(){return O } , l . unstable_next = function(H){switch(O){case 1:case 2:case 3:var _ = 3;break;default:_=O}var $ = O ; O = _;try{return H ( ) } finally { O = $}},l.unstable_requestPaint=function(){p=!0},l.unstable_runWithPriority=function(H,_){switch(H){case 1:case 2:case 3:case 4:case 5:break ; default:H = 3}var $ = O ; O = H;try{return _ ( ) } finally { O = $}},l.unstable_scheduleCallback=function(H,_,$){var ht = l.unstable_now();switch(typeof $ = = " object " & & $ ! = = null ? ( $ = $ . delay , $ = typeof $ = = " number " & & 0 < $ ? ht + $ :ht ) : $ = ht , H ) { case 1:var tt = -1;break;case 2:tt = 250;break;case 5:tt = 1073741823;break;case 4:tt = 1e4;break;default:tt=5e3}return tt = $+tt,H={id:E++,callback:_,priorityLevel:H,startTime:$,expirationTime:tt,sortIndex:-1},$ > ht?(H.sortIndex=$,u(A,H),c(y)===null& & H===c(A)& & (b?(R(D),D=-1):b=!0,it(F,$-ht))):(H.sortIndex=tt,u(y,H),B||X||(B=!0,j||(j=!0,nt()))),H},l.unstable_shouldYield=J,l.unstable_wrapCallback=function(H){var _=O;return function(){var $=O;O=_;try{return H.apply(this,arguments)}finally{O=$}}}})(qf)),qf}var w2;function Q5(){return w2||(w2=1,Zf.exports=U5()),Zf.exports}var If={exports:{}},ce={};/**
2025-12-17 13:07:35 +00:00
* @license React
* react-dom.production.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
Phase 2 stabilisation: code mort, Modal→Dialog, feature flags, tests, router split, Rust legacy
Bloc A - Code mort:
- Suppression Studio (components, views, features)
- Suppression gamification + services mock (projectService, storageService, gamificationService)
- Mise à jour Sidebar, Navbar, locales
Bloc B - Frontend:
- Suppression modal.tsx deprecated, Modal.stories (doublon Dialog)
- Feature flags: PLAYLIST_SEARCH, PLAYLIST_RECOMMENDATIONS, ROLE_MANAGEMENT = true
- Suppression 19 tests orphelins, retrait exclusions vitest.config
Bloc C - Backend:
- Extraction routes_auth.go depuis router.go
Bloc D - Rust:
- Suppression security_legacy.rs (code mort, patterns déjà dans security/)
2026-02-14 16:23:32 +00:00
*/var R2;function z5(){if(R2)return ce;R2=1;var l=xr();function u(y){var A="https://react.dev/errors/"+y;if(1< arguments.length ) { A + = " ? args [ ] = " + encodeURIComponent ( arguments [ 1 ] ) ; for ( var E = 2;E<arguments.length;E++)A+="&args[]="+encodeURIComponent(arguments[E])}return"Minified React error # " + y + " ; visit " + A + " for the full message or use the non-minified dev environment for full errors and additional helpful warnings . " } function c ( ) { } var f = {d:{f:c,r:function(){throw Error ( u ( 522 ) ) } , D:c , C:c , L:c , m:c , X:c , S:c , M:c } , p:0 , findDOMNode:null } , r = Symbol.for("react.portal");function o ( y , A , E ) { var S = 3<arguments.length&&arguments[3]!==void 0 ? arguments [ 3 ] :null ; return { $ $ typeof:r , key:S = =null?null:""+S,children:y,containerInfo:A,implementation:E}}var h = l.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function v ( y , A ) { if ( y = =="font")return"";if(typeof A = ="string")return A = =="use-credentials"?A:""}return ce . __DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE = f,ce.createPortal=function(y,A){var E = 2<arguments.length&&arguments[2]!==void 0 ? arguments [ 2 ] :null ; if ( ! A | | A . nodeType ! = = 1 & & A . nodeType ! = = 9 & & A . nodeType ! = = 11 ) throw Error ( u ( 299 ) ) ; return o ( y , A , null , E ) } , ce . flushSync = function(y){var A = h.T,E=f.p;try{if(h.T=null,f.p=2,y)return y ( ) } finally { h . T = A,f.p=E,f.d.f()}},ce.preconnect=function(y,A){typeof y = ="string"&&(A?(A=A.crossOrigin,A=typeof A = ="string"?A==="use-credentials"?A:"":void 0 ) :A = null,f.d.C(y,A))},ce.prefetchDNS=function(y){typeof y = ="string"&&f.d.D(y)},ce.preinit=function(y,A){if(typeof y = ="string"&&A&&typeof A . as = ="string"){var E = A.as,S=v(E,A.crossOrigin),O=typeof A . integrity = ="string"?A.integrity:void 0 , X = typeof A . fetchPriority = ="string"?A.fetchPriority:void 0 ; E = =="style"?f.d.S(y,typeof A . precedence = ="string"?A.precedence:void 0 , { crossOrigin:S , integrity:O , fetchPriority:X } ) :E = =="script"&&f.d.X(y,{crossOrigin:S,integrity:O,fetchPriority:X,nonce:typeof A . nonce = ="string"?A.nonce:void 0 } ) } } , ce . preinitModule = function(y,A){if(typeof y = ="string")if(typeof A = ="object"&&A!==null){if(A.as==null||A.as==="script"){var E = v(A.as,A.crossOrigin);f.d.M(y,{crossOrigin:E,integrity:typeof A . integrity = ="string"?A.integrity:void 0 , nonce:typeof A . nonce = ="string"?A.nonce:void 0 } ) } } else A = =null&&f.d.M(y)},ce.preload=function(y,A){if(typeof y = ="string"&&typeof A = ="object"&&A!==null&&typeof A . as = ="string"){var E = A.as,S=v(E,A.crossOrigin);f.d.L(y,E,{crossOrigin:S,integrity:typeof A . integrity = ="string"?A.integrity:void 0 , nonce:typeof A . nonce = ="string"?A.nonce:void 0 , type:typeof A . type = ="string"?A.type:void 0 , fetchPriority:typeof A . fetchPriority = ="string"?A.fetchPriority:void 0 , referrerPolicy:typeof A . referrerPolicy = ="string"?A.referrerPolicy:void 0 , imageSrcSet:typeof A . imageSrcSet = ="string"?A.imageSrcSet:void 0 , imageSizes:typeof A . imageSizes = ="string"?A.imageSizes:void 0 , media:typeof A . media = ="string"?A.media:void 0 } ) } } , ce . preloadModule = function(y,A){if(typeof y = ="string")if(A){var E = v(A.as,A.crossOrigin);f.d.m(y,{as:typeof A . as = ="string"&&A.as!=="script"?A.as:void 0 , crossOrigin:E , integrity:typeof A . integrity = ="string"?A.integrity:void 0 } ) } else f . d . m ( y ) } , ce . requestFormReset = function(y){f.d.r(y)},ce.unstable_batchedUpdates=function(y,A){return y ( A ) } , ce . useFormState = function(y,A,E){return h . H . useFormState ( y , A , E ) } , ce . useFormStatus = function(){return h . H . useHostTransitionStatus ( ) } , ce . version = "19.2.1" , ce } var D2 ; function Y5 ( ) { if ( D2 ) return If . exports ; D2 = 1;function l ( ) { if ( ! ( typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ > "u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(l)}catch(u){console.error(u)}}return l(),If.exports=z5(),If.exports}/**
2025-12-17 13:07:35 +00:00
* @license React
* react-dom-client.production.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
Phase 2 stabilisation: code mort, Modal→Dialog, feature flags, tests, router split, Rust legacy
Bloc A - Code mort:
- Suppression Studio (components, views, features)
- Suppression gamification + services mock (projectService, storageService, gamificationService)
- Mise à jour Sidebar, Navbar, locales
Bloc B - Frontend:
- Suppression modal.tsx deprecated, Modal.stories (doublon Dialog)
- Feature flags: PLAYLIST_SEARCH, PLAYLIST_RECOMMENDATIONS, ROLE_MANAGEMENT = true
- Suppression 19 tests orphelins, retrait exclusions vitest.config
Bloc C - Backend:
- Extraction routes_auth.go depuis router.go
Bloc D - Rust:
- Suppression security_legacy.rs (code mort, patterns déjà dans security/)
2026-02-14 16:23:32 +00:00
*/var M2;function L5(){if(M2)return xi;M2=1;var l=Q5(),u=xr(),c=Y5();function f(t){var e="https://react.dev/errors/"+t;if(1< arguments.length ) { e + = " ? args [ ] = " + encodeURIComponent ( arguments [ 1 ] ) ; for ( var n = 2;n<arguments.length;n++)e+="&args[]="+encodeURIComponent(arguments[n])}return"Minified React error # " + t + " ; visit " + e + " for the full message or use the non-minified dev environment for full errors and additional helpful warnings . " } function r ( t ) { return ! ( ! t | | t . nodeType ! = = 1 & & t . nodeType ! = = 9 & & t . nodeType ! = = 11 ) } function o ( t ) { var e = t,n=t;if(t.alternate)for(;e.return;)e=e.return;else{t=e;do e = t,(e.flags&4098)!==0&&(n=e.return),t=e.return;while(t)}return e . tag = ==3?n:null}function h ( t ) { if ( t . tag = ==13){var e = t.memoizedState;if(e===null&&(t=t.alternate,t!==null&&(e=t.memoizedState)),e!==null)return e . dehydrated } return null } function v ( t ) { if ( t . tag = ==31){var e = t.memoizedState;if(e===null&&(t=t.alternate,t!==null&&(e=t.memoizedState)),e!==null)return e . dehydrated } return null } function y ( t ) { if ( o ( t ) ! = = t ) throw Error ( f ( 188 ) ) } function A ( t ) { var e = t.alternate;if(!e){if(e=o(t),e===null)throw Error ( f ( 188 ) ) ; return e ! = = t ? null:t } for ( var n = t,a=e;;){var i = n.return;if(i===null)break;var s = i.alternate;if(s===null){if(a=i.return,a!==null){n=a;continue}break}if(i.child===s.child){for(s=i.child;s;){if(s===n)return y ( i ) , t ; if ( s = ==a)return y ( i ) , e ; s = s.sibling}throw Error ( f ( 188 ) ) } if ( n . return ! = = a . return ) n = i,a=s;else{for(var d = !1,g=i.child;g;){if(g===n){d=!0,n=i,a=s;break}if(g===a){d=!0,a=i,n=s;break}g=g.sibling}if(!d){for(g=s.child;g;){if(g===n){d=!0,n=s,a=i;break}if(g===a){d=!0,a=s,n=i;break}g=g.sibling}if(!d)throw Error ( f ( 189 ) ) } } if ( n . alternate ! = = a ) throw Error ( f ( 190 ) ) } if ( n . tag ! = = 3 ) throw Error ( f ( 188 ) ) ; return n . stateNode . current = ==n?t:e}function E ( t ) { var e = t.tag;if(e===5||e===26||e===27||e===6)return t ; for ( t = t.child;t!==null;){if(e=E(t),e!==null)return e ; t = t.sibling}return null } var S = Object.assign,O=Symbol.for("react.element"),X=Symbol.for("react.transitional.element"),B=Symbol.for("react.portal"),b=Symbol.for("react.fragment"),p=Symbol.for("react.strict_mode"),x=Symbol.for("react.profiler"),R=Symbol.for("react.consumer"),U=Symbol.for("react.context"),Z=Symbol.for("react.forward_ref"),F=Symbol.for("react.suspense"),j=Symbol.for("react.suspense_list"),D=Symbol.for("react.memo"),N=Symbol.for("react.lazy"),K=Symbol.for("react.activity"),J=Symbol.for("react.memo_cache_sentinel"),k=Symbol.iterator;function nt ( t ) { return t = ==null||typeof t ! = " object " ? null: ( t = k&&t[k]||t["@@iterator"],typeof t = ="function"?t:null)}var P = Symbol.for("react.client.reference");function st ( t ) { if ( t = =null)return null ; if ( typeof t = ="function")return t . $ $ typeof = ==P?null:t.displayName||t.name||null;if(typeof t = ="string")return t ; switch ( t ) { case b:return " Fragment " ; case x:return " Profiler " ; case p:return " StrictMode " ; case F:return " Suspense " ; case j:return " SuspenseList " ; case K:return " Activity " } if ( typeof t = ="object")switch(t.$$typeof){case B:return " Portal " ; case U:return t . displayName | | " Context " ; case R:return ( t . _context . displayName | | " Context " ) + " . Consumer " ; case Z:var e = t.render;return t = t.displayName,t||(t=e.displayName||e.name||"",t=t!==""?"ForwardRef("+t+")":"ForwardRef"),t;case D:return e = t.displayName||null,e!==null?e:st(t.type)||"Memo";case N:e = t._payload,t=t._init;try{return st ( t ( e ) ) } catch { } } return null } var it = Array.isArray,H=u.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,_=c.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,$={pending:!1,data:null,method:null,action:null},ht=[],tt=-1;function C ( t ) { return { current:t } } function L ( t ) { 0 > tt||(t.current=ht[tt],ht[tt]=null,tt--)}function W(t,e){tt++,ht[tt]=t.current,t.current=e}var et=C(null),rt=C(null),ot=C(null),gt=C(null);function Ft(t,e){switch(W(ot,e),W(rt,t),W(et,null),e.nodeType){case 9:case 11:t=(t=e.documentElement)&&(t=t.namespaceURI)?Pd(t):0; break;default:if(t=e.tagName,e=e.namespaceURI)e=Pd(e),t=$d(e,t);else switch(t){case"svg":t=1;break;case"math":t=2;break;default:t=0}}L(et),W(et,t)}function Qt(){L(et),L(rt),L(ot)}function On(t){t.memoizedState!==null&&W(gt,t); var e=et.current,n=$d(e,t.type);e!==n& & (W(rt,t),W(et,n))}function
2025-12-17 13:07:35 +00:00
at`)?" (< anonymous > )":-1< n.stack.indexOf ( " @ " ) ? " @ unknown:0:0 " : " " } return `
Phase 2 stabilisation: code mort, Modal→Dialog, feature flags, tests, router split, Rust legacy
Bloc A - Code mort:
- Suppression Studio (components, views, features)
- Suppression gamification + services mock (projectService, storageService, gamificationService)
- Mise à jour Sidebar, Navbar, locales
Bloc B - Frontend:
- Suppression modal.tsx deprecated, Modal.stories (doublon Dialog)
- Feature flags: PLAYLIST_SEARCH, PLAYLIST_RECOMMENDATIONS, ROLE_MANAGEMENT = true
- Suppression 19 tests orphelins, retrait exclusions vitest.config
Bloc C - Backend:
- Extraction routes_auth.go depuis router.go
Bloc D - Rust:
- Suppression security_legacy.rs (code mort, patterns déjà dans security/)
2026-02-14 16:23:32 +00:00
`+wn+t+Ba}var Ua=!1;function Rn(t,e){if(!t||Ua)return"";Ua=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var a={DetermineComponentFrameRoot:function(){try{if(e){var I=function(){throw Error()};if(Object.defineProperty(I.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"& & Reflect.construct){try{Reflect.construct(I,[])}catch(G){var Y=G}Reflect.construct(t,[],I)}else{try{I.call()}catch(G){Y=G}t.call(I.prototype)}}else{try{throw Error()}catch(G){Y=G}(I=t())& & typeof I.catch=="function"& & I.catch(function(){})}}catch(G){if(G& & Y& & typeof G.stack=="string")return[G.stack,Y.stack]}return[null,null]}};a.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var i=Object.getOwnPropertyDescriptor(a.DetermineComponentFrameRoot,"name");i&&i.configurable&&Object.defineProperty(a.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"}); var s=a.DetermineComponentFrameRoot(),d=s[0],g=s[1];if(d& & g){var T=d.split(`
`),z=g.split(`
`);for(i=a=0;a< T.length & & ! T [ a ] . includes ( " DetermineComponentFrameRoot " ) ; ) a + + ; for ( ; i < z . length & & ! z [ i ] . includes ( " DetermineComponentFrameRoot " ) ; ) i + + ; if ( a = ==T.length||i===z.length)for(a=T.length-1,i=z.length-1;1<=a&&0<=i&&T[a]!==z[i];)i--;for(;1<=a&&0<=i;a--,i--)if(T[a]!==z[i]){if(a!==1||i!==1)do if ( a-- , i-- , 0 > i||T[a]!==z[i]){var V=`
`+T[a].replace(" at new "," at ");return t.displayName&&V.includes("<anonymous>")&&(V=V.replace("<anonymous>",t.displayName)),V}while(1<=a&&0<=i); break}}}finally{Ua=!1,Error.prepareStackTrace=n}return(n=t?t.displayName||t.name:"")?Ee(n):""}function Qa(t,e){switch(t.tag){case 26:case 27:case 5:return Ee(t.type);case 16:return Ee("Lazy");case 13:return t.child!==e& & e!==null?Ee("Suspense Fallback"):Ee("Suspense");case 19:return Ee("SuspenseList");case 0:case 15:return Rn(t.type,!1);case 11:return Rn(t.type.render,!1);case 1:return Rn(t.type,!0);case 31:return Ee("Activity");default:return""}}function Bi(t){try{var e="",n=null;do e+=Qa(t,n),n=t,t=t.return;while(t);return e}catch(a){return`
Error generating stack: `+a.message+`
`+a.stack}}var mc=Object.prototype.hasOwnProperty,gc=l.unstable_scheduleCallback,Ac=l.unstable_cancelCallback,om=l.unstable_shouldYield,dm=l.unstable_requestPaint,pe=l.unstable_now,hm=l.unstable_getCurrentPriorityLevel,Dr=l.unstable_ImmediatePriority,Mr=l.unstable_UserBlockingPriority,Ui=l.unstable_NormalPriority,mm=l.unstable_LowPriority,jr=l.unstable_IdlePriority,gm=l.log,Am=l.unstable_setDisableYieldValue,wl=null,be=null;function Dn(t){if(typeof gm=="function"& & Am(t),be& & typeof be.setStrictMode=="function")try{be.setStrictMode(wl,t)}catch{}}var xe=Math.clz32?Math.clz32:Em,vm=Math.log,ym=Math.LN2;function Em(t){return t>>>=0,t===0?32:31-(vm(t)/ym|0)|0}var Qi=256,zi=262144,Yi=4194304;function oa(t){var e=t&42; if(e!==0)return e;switch(t& -t){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return t&261888; case 262144:case 524288:case 1048576:case 2097152:return t&3932160; case 4194304:case 8388608:case 16777216:case 33554432:return t&62914560; case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return t}}function Li(t,e,n){var a=t.pendingLanes;if(a===0)return 0;var i=0,s=t.suspendedLanes,d=t.pingedLanes;t=t.warmLanes;var g=a&134217727; return g!==0?(a=g& ~s,a!==0?i=oa(a):(d& =g,d!==0?i=oa(d):n||(n=g& ~t,n!==0& & (i=oa(n))))):(g=a& ~s,g!==0?i=oa(g):d!==0?i=oa(d):n||(n=a& ~t,n!==0& & (i=oa(n)))),i===0?0:e!==0& & e!==i& & (e& s)===0& & (s=i& -i,n=e& -e,s>=n||s===32& & (n& 4194048)!==0)?e:i}function Rl(t,e){return(t.pendingLanes& ~(t.suspendedLanes& ~t.pingedLanes)& e)===0}function pm(t,e){switch(t){case 1:case 2:case 4:case 8:case 64:return e+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Hr(){var t=Yi;return Yi< < =1,(Yi& 62914560)===0& & (Yi=4194304),t}function vc(t){for(var e=[],n=0;31>n;n++)e.push(t);return e}function Dl(t,e){t.pendingLanes|=e,e!==268435456& & (t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0)}function bm(t,e,n,a,i,s){var d=t.pendingLanes;t.pendingLanes=n,t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0,t.expiredLanes&=n,t.entangledLanes&=n,t.errorRecoveryDisabledLanes&=n,t.shellSuspendCounter=0; var g=t.entanglements,T=t.expirationTimes,z=t.hiddenUpdates;for(n=d&~n; 0< n ; ) { var V = 31-xe(n),I=1<<V;g[V]=0,T[V]=-1;var Y = z[V];if(Y!==null)for(z[V]=null,V=0;V<Y.length;V++){var G = Y[V];G!==null&&(G.lane&=-536870913)}n&=~I}a!==0&&Nr(t,a,0),s!==0&&i===0&&t.tag!==0&&(t.suspendedLanes|=s&~(d&~e))}function Nr ( t , e , n ) { t . pendingLanes | = e , t . suspendedLanes & = ~ e ; var a = 31-xe(e);t.entangledLanes|=e,t.entanglements[a]=t.entanglements[a]|1073741824|n&261930}function Br ( t , e ) { var n = t.entangledLanes|=e;for(t=t.entanglements;n;){var a = 31-xe(n),i=1<<a;i&e|t[a]&e&&(t[a]|=e),n&=~i}}function Ur ( t , e ) { var n = e&-e;return n = (n&42)!==0?1:yc(n),(n&(t.suspendedLanes|e))!==0?0:n}function yc ( t ) { switch ( t ) { case 2:t = 1;break;case 8:t = 4;break;case 32:t = 16;break;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:t = 128;break;case 268435456:t = 134217728;break;default:t=0}return t } function Ec ( t ) { return t & = -t , 2 < t ? 8 < t ? ( t & 134217727 ) ! = = 0 ? 32:268435456:8:2 } function Qr ( ) { var t = _.p;return t ! = = 0 ? t: ( t = window.event,t===void 0 ? 32:x1 ( t . type ) ) } function zr ( t , e ) { var n = _.p;try{return _ . p = t,e()}finally{_.p=n}}var Mn = Math.random().toString(36).slice(2),te="__reactFiber$"+Mn,oe="__reactProps$"+Mn,za="__reactContainer$"+Mn,pc="__reactEvents$"+Mn,xm="__reactListeners$"+Mn,Sm="__reactHandles$"+Mn,Yr="__reactResources$"+Mn,Ml="__reactMarker$"+Mn;function
`).replace(eA,"")}function Wd(t,e){return e=Fd(e),Fd(t)===e}function Dt(t,e,n,a,i,s){switch(n){case"children":typeof a=="string"?e==="body"||e==="textarea"& & a===""||Za(t,a):(typeof a=="number"||typeof a=="bigint")&&e!=="body"&&Za(t,""+a); break;case"className":Xi(t,"class",a);break;case"tabIndex":Xi(t,"tabindex",a);break;case"dir":case"role":case"viewBox":case"width":case"height":Xi(t,n,a);break;case"style":Fr(t,a,s);break;case"data":if(e!=="object"){Xi(t,"data",a);break}case"src":case"href":if(a===""&&(e!=="a"||n!=="href")){t.removeAttribute(n); break}if(a==null||typeof a=="function"||typeof a=="symbol"||typeof a=="boolean"){t.removeAttribute(n);break}a=Zi(""+a),t.setAttribute(n,a);break;case"action":case"formAction":if(typeof a=="function"){t.setAttribute(n,"javascript:throw new Error('A React form was unexpectedly submitted. If you called form.submit() manually, consider using form.requestSubmit() instead. If you\\'re trying to use event.stopPropagation() in a submit event handler, consider also calling event.preventDefault().')");break}else typeof s=="function"&&(n==="formAction"?(e!=="input"&&Dt(t,e,"name",i.name,i,null),Dt(t,e,"formEncType",i.formEncType,i,null),Dt(t,e,"formMethod",i.formMethod,i,null),Dt(t,e,"formTarget",i.formTarget,i,null)):(Dt(t,e,"encType",i.encType,i,null),Dt(t,e,"method",i.method,i,null),Dt(t,e,"target",i.target,i,null))); if(a==null||typeof a=="symbol"||typeof a=="boolean"){t.removeAttribute(n);break}a=Zi(""+a),t.setAttribute(n,a);break;case"onClick":a!=null&&(t.onclick=tn); break;case"onScroll":a!=null&&yt("scroll",t); break;case"onScrollEnd":a!=null&&yt("scrollend",t); break;case"dangerouslySetInnerHTML":if(a!=null){if(typeof a!="object"||!("__html"in a))throw Error(f(61));if(n=a.__html,n!=null){if(i.children!=null)throw Error(f(60));t.innerHTML=n}}break;case"multiple":t.multiple=a& & typeof a!="function"& & typeof a!="symbol";break;case"muted":t.muted=a& & typeof a!="function"& & typeof a!="symbol";break;case"suppressContentEditableWarning":case"suppressHydrationWarning":case"defaultValue":case"defaultChecked":case"innerHTML":case"ref":break;case"autoFocus":break;case"xlinkHref":if(a==null||typeof a=="function"||typeof a=="boolean"||typeof a=="symbol"){t.removeAttribute("xlink:href");break}n=Zi(""+a),t.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",n);break;case"contentEditable":case"spellCheck":case"draggable":case"value":case"autoReverse":case"externalResourcesRequired":case"focusable":case"preserveAlpha":a!=null& & typeof a!="function"& & typeof a!="symbol"?t.setAttribute(n,""+a):t.removeAttribute(n);break;case"inert":case"allowFullScreen":case"async":case"autoPlay":case"controls":case"default":case"defer":case"disabled":case"disablePictureInPicture":case"disableRemotePlayback":case"formNoValidate":case"hidden":case"loop":case"noModule":case"noValidate":case"open":case"playsInline":case"readOnly":case"required":case"reversed":case"scoped":case"seamless":case"itemScope":a& & typeof a!="function"& & typeof a!="symbol"?t.setAttribute(n,""):t.removeAttribute(n);break;case"capture":case"download":a===!0?t.setAttribute(n,""):a!==!1& & a!=null& & typeof a!="function"& & typeof a!="symbol"?t.setAttribute(n,a):t.removeAttribute(n);break;case"cols":case"rows":case"size":case"span":a!=null& & typeof a!="function"& & typeof a!="symbol"&&!isNaN(a)&&1<=a?t.setAttribute(n,a):t.removeAttribute(n); break;case"rowSpan":case"start":a==null||typeof a=="function"||typeof a=="symbol"||isNaN(a)?t.removeAttribute(n):t.setAttribute(n,a);break;case"popover":yt("beforetoggle",t),yt("toggle",t),Gi(t,"popover",a);break;case"xlinkActuate":$e(t,"http://www.w3.org/1999/xlink","xlink:actuate",a);break;case"xlinkArcrole":$e(t,"http://www.w3.org/1999/xlink","xlink:arcrole",a);break;case"xlinkRole":$e(t,"http://www.w3.org/1999/xlink","xlink:role",a);break;case"xlinkShow":$e(t,"http://www.w3.org/1999/xlink","xlink:show",a);break;case"xlinkTitle":$e(t,"http://www.w3.org/1999/xlink","xlink:title",a);break;case"xlinkType":$e(t,"http://www.w3.org/1999/xlink","xlink:type",a);break;case"xmlBase":$e(t,"http://www.w3.org/XML/1998/namespace","xml:ba
2025-12-17 13:07:35 +00:00
linear-gradient(-45deg, #80808020 25%, transparent 25%),
linear-gradient(45deg, transparent 75%, #80808020 75%),
linear-gradient(-45deg, transparent 75%, #80808020 75%)`,backgroundSize:"20px 20px",backgroundPosition:"0 0, 0 10px, 10px -10px, -10px 0px",boxShadow:`rgb(0 0 0 / 10%) 0px 1.8px 1.9px,
rgb(0 0 0 / 15%) 0px 6.1px 6.3px,
rgb(0 0 0 / 10%) 0px -2px 4px,
rgb(0 0 0 / 15%) 0px -6.1px 12px,
Phase 2 stabilisation: code mort, Modal→Dialog, feature flags, tests, router split, Rust legacy
Bloc A - Code mort:
- Suppression Studio (components, views, features)
- Suppression gamification + services mock (projectService, storageService, gamificationService)
- Mise à jour Sidebar, Navbar, locales
Bloc B - Frontend:
- Suppression modal.tsx deprecated, Modal.stories (doublon Dialog)
- Feature flags: PLAYLIST_SEARCH, PLAYLIST_RECOMMENDATIONS, ROLE_MANAGEMENT = true
- Suppression 19 tests orphelins, retrait exclusions vitest.config
Bloc C - Backend:
- Extraction routes_auth.go depuis router.go
Bloc D - Rust:
- Suppression security_legacy.rs (code mort, patterns déjà dans security/)
2026-02-14 16:23:32 +00:00
rgb(0 0 0 / 25%) 0px 6px 12px`},um=({diff:l,noTargetBlank:u,hideDetails:c})=>{const[f,r]=ct.useState(l.diff?"diff":"actual"),[o,h]=ct.useState(!1),[v,y]=ct.useState(null),[A,E]=ct.useState("Expected"),[S,O]=ct.useState(null),[X,B]=ct.useState(null),[b,p]=Wh();ct.useEffect(()=>{(async()=>{var K,J,k,nt;y(await kf((K=l.expected)==null?void 0:K.attachment.path)),E(((J=l.expected)==null?void 0:J.title)||"Expected"),O(await kf((k=l.actual)==null?void 0:k.attachment.path)),B(await kf((nt=l.diff)==null?void 0:nt.attachment.path))})()},[l]);const x=v& & S& & X,R=x?Math.max(v.naturalWidth,S.naturalWidth,200):500,U=x?Math.max(v.naturalHeight,S.naturalHeight,200):500,Z=Math.min(1,(b.width-30)/R),F=Math.min(1,(b.width-50)/R/2),j=R*Z,D=U*Z,N={flex:"none",margin:"0 10px",cursor:"pointer",userSelect:"none"};return m.jsx("div",{"data-testid":"test-result-image-mismatch",style:{display:"flex",flexDirection:"column",alignItems:"center",flex:"auto"},ref:p,children:x& & m.jsxs(m.Fragment,{children:[m.jsxs("div",{"data-testid":"test-result-image-mismatch-tabs",style:{display:"flex",margin:"10px 0 20px"},children:[l.diff& & m.jsx("div",{style:{...N,fontWeight:f==="diff"?600:"initial"},onClick:()=>r("diff"),children:"Diff"}),m.jsx("div",{style:{...N,fontWeight:f==="actual"?600:"initial"},onClick:()=>r("actual"),children:"Actual"}),m.jsx("div",{style:{...N,fontWeight:f==="expected"?600:"initial"},onClick:()=>r("expected"),children:A}),m.jsx("div",{style:{...N,fontWeight:f==="sxs"?600:"initial"},onClick:()=>r("sxs"),children:"Side by side"}),m.jsx("div",{style:{...N,fontWeight:f==="slider"?600:"initial"},onClick:()=>r("slider"),children:"Slider"})]}),m.jsxs("div",{style:{display:"flex",justifyContent:"center",flex:"auto",minHeight:D+60},children:[l.diff& & f==="diff"& & m.jsx(En,{image:X,alt:"Diff",hideSize:c,canvasWidth:j,canvasHeight:D,scale:Z}),l.diff& & f==="actual"& & m.jsx(En,{image:S,alt:"Actual",hideSize:c,canvasWidth:j,canvasHeight:D,scale:Z}),l.diff& & f==="expected"& & m.jsx(En,{image:v,alt:A,hideSize:c,canvasWidth:j,canvasHeight:D,scale:Z}),l.diff& & f==="slider"& & m.jsx(Dv,{expectedImage:v,actualImage:S,hideSize:c,canvasWidth:j,canvasHeight:D,scale:Z,expectedTitle:A}),l.diff& & f==="sxs"& & m.jsxs("div",{style:{display:"flex"},children:[m.jsx(En,{image:v,title:A,hideSize:c,canvasWidth:F*R,canvasHeight:F*U,scale:F}),m.jsx(En,{image:o?X:S,title:o?"Diff":"Actual",onClick:()=>h(!o),hideSize:c,canvasWidth:F*R,canvasHeight:F*U,scale:F})]}),!l.diff& & f==="actual"& & m.jsx(En,{image:S,title:"Actual",hideSize:c,canvasWidth:j,canvasHeight:D,scale:Z}),!l.diff& & f==="expected"& & m.jsx(En,{image:v,title:A,hideSize:c,canvasWidth:j,canvasHeight:D,scale:Z}),!l.diff& & f==="sxs"& & m.jsxs("div",{style:{display:"flex"},children:[m.jsx(En,{image:v,title:A,canvasWidth:F*R,canvasHeight:F*U,scale:F}),m.jsx(En,{image:S,title:"Actual",canvasWidth:F*R,canvasHeight:F*U,scale:F})]})]}),!c& & m.jsxs("div",{style:{alignSelf:"start",lineHeight:"18px",marginLeft:"15px"},children:[m.jsx("div",{children:l.diff& & m.jsx("a",{target:"_blank",href:l.diff.attachment.path,rel:"noreferrer",children:l.diff.attachment.name})}),m.jsx("div",{children:m.jsx("a",{target:u?"":"_blank",href:l.actual.attachment.path,rel:"noreferrer",children:l.actual.attachment.name})}),m.jsx("div",{children:m.jsx("a",{target:u?"":"_blank",href:l.expected.attachment.path,rel:"noreferrer",children:l.expected.attachment.name})})]})]})})},Dv=({expectedImage:l,actualImage:u,canvasWidth:c,canvasHeight:f,scale:r,expectedTitle:o,hideSize:h})=>{const v={position:"absolute",top:0,left:0},[y,A]=ct.useState(c/2),E=l.naturalWidth===u.naturalWidth&&l.naturalHeight===u.naturalHeight; return m.jsxs("div",{style:{flex:"none",display:"flex",alignItems:"center",flexDirection:"column",userSelect:"none"},children:[!h& & m.jsxs("div",{style:{margin:5},children:[!E& & m.jsx("span",{style:{flex:"none",margin:"0 5px"},children:"Expected "}),m.jsx("span",{children:l.naturalWidth}),m.jsx("span",{style:{flex:"none",margin:"0 5px"},children:"x"}),m.jsx("span",{children:l.naturalHeight}),!E& & m.jsx("span",{style:{flex:"none",margin:"0 5px 0 15px"},children
2025-12-17 13:07:35 +00:00
# Instructions
- Following Playwright test failed.
- Explain why, be concise, respect Playwright best practices.
- Provide a snippet of code with the fix, if possible.
Phase 2 stabilisation: code mort, Modal→Dialog, feature flags, tests, router split, Rust legacy
Bloc A - Code mort:
- Suppression Studio (components, views, features)
- Suppression gamification + services mock (projectService, storageService, gamificationService)
- Mise à jour Sidebar, Navbar, locales
Bloc B - Frontend:
- Suppression modal.tsx deprecated, Modal.stories (doublon Dialog)
- Feature flags: PLAYLIST_SEARCH, PLAYLIST_RECOMMENDATIONS, ROLE_MANAGEMENT = true
- Suppression 19 tests orphelins, retrait exclusions vitest.config
Bloc C - Backend:
- Extraction routes_auth.go depuis router.go
Bloc D - Rust:
- Suppression security_legacy.rs (code mort, patterns déjà dans security/)
2026-02-14 16:23:32 +00:00
`.trimStart();async function zv({testInfo:l,metadata:u,errorContext:c,errors:f,buildCodeFrame:r,stdout:o,stderr:h}){var S;const v=new Set(f.filter(O=>O.message& & !O.message.includes(`
`)).map(O=>O.message));for(const O of f)for(const X of v.keys())(S=O.message)!=null&&S.includes(X)&&v.delete(X); const y=f.filter(O=>!(!O.message||!O.message.includes(`
`)&&!v.has(O.message))); if(!y.length)return;const A=[Qv,"# Test info","",l];o& & A.push("","# Stdout","","```",Jf(o),"```"),h& & A.push("","# Stderr","","```",Jf(h),"```"),A.push("","# Error details");for(const O of y)A.push("","```",Jf(O.message||""),"```");c&&A.push(c); const E=await r(y[y.length-1]);return E& & A.push("","# Test source","","```ts",E,"```"),u!=null& & u.gitDiff& & A.push("","# Local changes","","```diff",u.gitDiff,"```"),A.join(`
`)}const Yv=new RegExp("([\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)|(?:(?:\\d{1,4}(?:; \\d{0,4})*)?[\\dA-PR-TZcf-ntqry=>< ~])))","g");function Jf(l){return l.replace(Yv,"")}function Lv(l,u){var f;const c=new Map;for(const r of l){const o=r.name.match(/^(.*)-(expected|actual|diff|previous)(\.[^.]+)?$/);if(!o)continue;const[,h,v,y=""]=o,A=h+y;let E=c.get(A);E||(E={name:A,anchors:[`attachment-${h}`]},c.set(A,E)),E.anchors.push(`attachment-${u.attachments.indexOf(r)}`),v==="actual"& & (E.actual={attachment:r}),v==="expected"& & (E.expected={attachment:r,title:"Expected"}),v==="previous"& & (E.expected={attachment:r,title:"Previous"}),v==="diff"& & (E.diff={attachment:r})}for(const[r,o]of c)!o.actual||!o.expected?c.delete(r):(l.delete(o.actual.attachment),l.delete(o.expected.attachment),l.delete((f=o.diff)==null?void 0:f.attachment));return[...c.values()]}const Gv=({test:l,result:u,testRunMetadata:c,options:f})=>{const{screenshots:r,videos:o,traces:h,otherAttachments:v,diffs:y,errors:A,otherAttachmentAnchors:E,screenshotAnchors:S,errorContext:O}=ct.useMemo(()=>{const B=u.attachments.filter(N=>!N.name.startsWith("_")),b=new Set(B.filter(N=>N.contentType.startsWith("image/"))),p=[...b].map(N=>`attachment-${B.indexOf(N)}`),x=B.filter(N=>N.contentType.startsWith("video/")),R=B.filter(N=>N.name==="trace"),U=B.find(N=>N.name==="error-context"),Z=new Set(B);[...b,...x,...R].forEach(N=>Z.delete(N));const F=[...Z].map(N=>`attachment-${B.indexOf(N)}`),j=Lv(b,u),D=u.errors.map(N=>N.message);return{screenshots:[...b],videos:x,traces:R,otherAttachments:Z,diffs:j,errors:D,otherAttachmentAnchors:F,screenshotAnchors:p,errorContext:U}},[u]),X=P5(async()=>{if(f!=null&&f.noCopyPrompt)return; const B=u.attachments.find(R=>R.name==="stdout"),b=u.attachments.find(R=>R.name==="stderr"),p=B!=null& & B.body& & B.contentType==="text/plain"?B.body:void 0,x=b!=null& & b.body& & b.contentType==="text/plain"?b.body:void 0;return await zv({testInfo:[`- Name: ${l.path.join(" >> ")} >> ${l.title}`,`- Location: ${l.location.file}:${l.location.line}:${l.location.column}`].join(`
`),metadata:c,errorContext:O!=null& & O.path?await fetch(O.path).then(R=>R.text()):O==null?void 0:O.body,errors:u.errors,buildCodeFrame:async R=>R.codeframe,stdout:p,stderr:x})},[l,O,c,u],void 0);return m.jsxs("div",{className:"test-result",children:[!!A.length& & m.jsxs(ke,{header:"Errors",children:[X& & m.jsx("div",{style:{position:"absolute",right:"16px",padding:"10px",zIndex:1},children:m.jsx(Nv,{prompt:X})}),A.map((B,b)=>{const p=Xv(B,y);return m.jsxs(m.Fragment,{children:[m.jsx(wr,{code:B},"test-result-error-message-"+b),p& & m.jsx(Bv,{diff:p})]})})]}),!!u.steps.length& & m.jsx(ke,{header:"Test Steps",children:u.steps.map((B,b)=>m.jsx(cm,{step:B,result:u,test:l,depth:0},`step-${b}`))}),y.map((B,b)=>m.jsx(Si,{id:B.anchors,children:m.jsx(ke,{dataTestId:"test-results-image-diff",header:`Image mismatch: ${B.name}`,revealOnAnchorId:B.anchors,children:m.jsx(um,{diff:B})})},`diff-${b}`)),!!r.length&&m.jsx(ke,{header:"Screenshots",revealOnAnchorId:S,children:r.map((B,b)=>m.jsxs(Si,{id:`attachment-${u.attachments.indexOf(B)}`,children:[m.jsx("a",{href:Ve(B.path),children:m.jsx("img",{className:"screenshot",src:Ve(B.path)})}),m.jsx(nc,{attachment:B,result:u})]},`screenshot-${b}`))}),!!h.length&&m.jsx(Si,{id:"attachment-trace",children:m.jsx(ke,{header:"Traces",revealOnAnchorId:"attachment-trace",children:m.jsxs("div",{children:[m.jsx("a",{href:Ve(nm(h)),children:m.jsx("img",{className:"screenshot",src:Cv,style:{width:192,height:117,marginLeft:20}})}),h.map((B,b)=>m.jsx(nc,{attachment:B,result:u,linkName:h.length===1?"trace":`trace-${b+1}`},`trace-${b}`))]})})}),!!o.length&&m.jsx(Si,{id:"attachment-video",children:m.jsx(ke,{header:"Videos",revealOnAnchorId:"attachment-video",children:o.map(B=>m.jsxs("div",{children:[m.jsx("video",{controls:!0,children:m.jsx("source",{src:Ve(B.path),type:B.contentType})}),m.jsx(nc,{attachment:B,result:u})]},B.path))})}),!!v.size&&m.jsx(ke,{header:"Attachments",revealOnAnchorId:E,dataTestId:"attachments",children:[...v].map((B,b)=>m.jsx(Si,{id:`attachment-${u.attachments.indexOf(B)}`,children:m.jsx(nc,{attachment:B,result:u,openInNewTab:B.contentType.startsWith("text/html")})},`attachment-link-${b}`))})]})}; function Xv(l,u){const c=l.split(`
`)[0];if(!(!c.includes("toHaveScreenshot")& & !c.includes("toMatchSnapshot")))return u.find(f=>l.includes(f.name))}const cm=({test:l,step:u,result:c,depth:f})=>{const r=se();return m.jsx(Tv,{title:m.jsxs("div",{"aria-label":u.title,className:"step-title-container",children:[hc(u.error||u.duration===-1?"failed":u.skipped?"skipped":"passed"),m.jsxs("span",{className:"step-title-text",children:[m.jsx("span",{children:u.title}),u.count>1& & m.jsxs(m.Fragment,{children:[" ✕ ",m.jsx("span",{className:"test-result-counter",children:u.count})]}),u.location& & m.jsxs("span",{className:"test-result-path",children:["— ",u.location.file,":",u.location.line]})]}),m.jsx("span",{className:"step-spacer"}),u.attachments.length>0& & m.jsx("a",{className:"step-attachment-link",title:"reveal attachment",href:Ve(Cn({test:l,result:c,anchor:`attachment-${u.attachments[0]}`},r)),onClick:o=>{o.stopPropagation()},children:Ih()}),m.jsx("span",{className:"step-duration",children:Ol(u.duration)})]}),loadChildren:u.steps.length||u.snippet?()=>{const o=u.snippet?[m.jsx(wr,{testId:"test-snippet",code:u.snippet},"line")]:[],h=u.steps.map((v,y)=>m.jsx(cm,{step:v,depth:f+1,result:c,test:l},y));return o.concat(h)}:void 0,depth:f})},Vv=({projectNames:l,test:u,testRunMetadata:c,run:f,next:r,prev:o,options:h})=>{const[v,y]=ct.useState(f),A=se(),E=u.annotations.filter(S=>!S.type.startsWith("_"))??[];return m.jsxs(m.Fragment,{children:[m.jsx(Or,{title:u.title,leftSuperHeader:m.jsx("div",{className:"test-case-path",children:u.path.join(" › ")}),rightSuperHeader:m.jsxs(m.Fragment,{children:[m.jsx("div",{className:Ze(!o& & "hidden"),children:m.jsx(Tn,{href:Cn({test:o},A),children:"« previous"})}),m.jsx("div",{style:{width:10}}),m.jsx("div",{className:Ze(!r& & "hidden"),children:m.jsx(Tn,{href:Cn({test:r},A),children:"next »"})})]})}),m.jsxs("div",{className:"hbox",style:{lineHeight:"24px"},children:[m.jsx("div",{className:"test-case-location",children:m.jsxs(Sr,{value:`${u.location.file}:${u.location.line}`,children:[u.location.file,":",u.location.line]})}),m.jsx("div",{style:{flex:"auto"}}),m.jsx(tm,{test:u,trailingSeparator:!0}),m.jsx("div",{className:"test-case-duration",children:Ol(u.duration)})]}),m.jsx($h,{style:{marginLeft:"6px"},projectNames:l,activeProjectName:u.projectName,otherLabels:u.tags}),u.results.length===0& & E.length!==0& & m.jsx(ke,{header:"Annotations",dataTestId:"test-case-annotations",children:E.map((S,O)=>m.jsx(z2,{annotation:S},O))}),m.jsx(Sv,{tabs:u.results.map((S,O)=>({id:String(O),title:m.jsxs("div",{style:{display:"flex",alignItems:"center"},children:[hc(S.status)," ",Zv(O),u.results.length>1& & m.jsx("span",{className:"test-case-run-duration",children:Ol(S.duration)})]}),render:()=>{const X=S.annotations.filter(B=>!B.type.startsWith("_"));return m.jsxs(m.Fragment,{children:[!!X.length&&m.jsx(ke,{header:"Annotations",dataTestId:"test-case-annotations",children:X.map((B,b)=>m.jsx(z2,{annotation:B},b))}),m.jsx(Gv,{test:u,result:S,testRunMetadata:c,options:h})]})}}))||[],selectedTab:String(v),setSelectedTab:S=>y(+S)})]})}; function z2({annotation:{type:l,description:u}}){return m.jsxs("div",{className:"test-case-annotation",children:[m.jsx("span",{style:{fontWeight:"bold"},children:l}),u& & m.jsxs(Sr,{value:u,children:[": ",Di(u)]})]})}function Zv(l){return l?`Retry #${l}`:"Run"}const sm=({file:l,projectNames:u,isFileExpanded:c,setFileExpanded:f,footer:r})=>{const o=se();return m.jsx(im,{expanded:c?c(l.fileId):void 0,noInsets:!0,setExpanded:f?(h=>f(l.fileId,h)):void 0,header:m.jsx("span",{className:"chip-header-allow-selection",children:l.fileName}),footer:r,children:l.tests.map(h=>m.jsxs("div",{className:Ze("test-file-test","test-file-test-outcome-"+h.outcome),children:[m.jsxs("div",{className:"hbox",style:{alignItems:"flex-start"},children:[m.jsxs("div",{className:"hbox",children:[m.jsx("span",{className:"test-file-test-status-icon",children:hc(h.outcome)}),m.jsxs("span",{children:[m.jsx(Tn,{href:Cn({test:h},o),title:[...h.path,h.title].join(" › "),children:m.jsx("span",{className:"test-file-title",children:[...h.path,h.title].join(" › ")})}),m
2025-12-17 13:07:35 +00:00
< / script >
Phase 2 stabilisation: code mort, Modal→Dialog, feature flags, tests, router split, Rust legacy
Bloc A - Code mort:
- Suppression Studio (components, views, features)
- Suppression gamification + services mock (projectService, storageService, gamificationService)
- Mise à jour Sidebar, Navbar, locales
Bloc B - Frontend:
- Suppression modal.tsx deprecated, Modal.stories (doublon Dialog)
- Feature flags: PLAYLIST_SEARCH, PLAYLIST_RECOMMENDATIONS, ROLE_MANAGEMENT = true
- Suppression 19 tests orphelins, retrait exclusions vitest.config
Bloc C - Backend:
- Extraction routes_auth.go depuis router.go
Bloc D - Rust:
- Suppression security_legacy.rs (code mort, patterns déjà dans security/)
2026-02-14 16:23:32 +00:00
< style type = 'text/css' > : r o o t { - - c o l o r - c a n v a s - d e f a u l t - t r a n s p a r e n t : r g b a ( 2 5 5 , 2 5 5 , 2 5 5 , 0 ) ; - - c o l o r - m a r k e t i n g - i c o n - p r i m a r y : # 2 1 8 b f f ; - - c o l o r - m a r k e t i n g - i c o n - s e c o n d a r y : # 5 4 a e f f ; - - c o l o r - d i f f - b l o b - a d d i t i o n - n u m - t e x t : # 2 4 2 9 2 f ; - - c o l o r - d i f f - b l o b - a d d i t i o n - f g : # 2 4 2 9 2 f ; - - c o l o r - d i f f - b l o b - a d d i t i o n - n u m - b g : # C C F F D 8 ; - - c o l o r - d i f f - b l o b - a d d i t i o n - l i n e - b g : # E 6 F F E C ; - - c o l o r - d i f f - b l o b - a d d i t i o n - w o r d - b g : # A B F 2 B C ; - - c o l o r - d i f f - b l o b - d e l e t i o n - n u m - t e x t : # 2 4 2 9 2 f ; - - c o l o r - d i f f - b l o b - d e l e t i o n - f g : # 2 4 2 9 2 f ; - - c o l o r - d i f f - b l o b - d e l e t i o n - n u m - b g : # F F D 7 D 5 ; - - c o l o r - d i f f - b l o b - d e l e t i o n - l i n e - b g : # F F E B E 9 ; - - c o l o r - d i f f - b l o b - d e l e t i o n - w o r d - b g : r g b a ( 2 5 5 , 1 2 9 , 1 3 0 , . 4 ) ; - - c o l o r - d i f f - b l o b - h u n k - n u m - b g : r g b a ( 8 4 , 1 7 4 , 2 5 5 , . 4 ) ; - - c o l o r - d i f f - b l o b - e x p a n d e r - i c o n : # 5 7 6 0 6 a ; - - c o l o r - d i f f - b l o b - s e l e c t e d - l i n e - h i g h l i g h t - m i x - b l e n d - m o d e : m u l t i p l y ; - - c o l o r - d i f f s t a t - d e l e t i o n - b o r d e r : r g b a ( 2 7 , 3 1 , 3 6 , . 1 5 ) ; - - c o l o r - d i f f s t a t - a d d i t i o n - b o r d e r : r g b a ( 2 7 , 3 1 , 3 6 , . 1 5 ) ; - - c o l o r - d i f f s t a t - a d d i t i o n - b g : # 2 d a 4 4 e ; - - c o l o r - s e a r c h - k e y w o r d - h l : # f f f 8 c 5 ; - - c o l o r - p r e t t y l i g h t s - s y n t a x - c o m m e n t : # 6 e 7 7 8 1 ; - - c o l o r - p r e t t y l i g h t s - s y n t a x - c o n s t a n t : # 0 5 5 0 a e ; - - c o l o r - p r e t t y l i g h t s - s y n t a x - e n t i t y : # 8 2 5 0 d f ; - - c o l o r - p r e t t y l i g h t s - s y n t a x - s t o r a g e - m o d i f i e r - i m p o r t : # 2 4 2 9 2 f ; - - c o l o r - p r e t t y l i g h t s - s y n t a x - e n t i t y - t a g : # 1 1 6 3 2 9 ; - - c o l o r - p r e t t y l i g h t s - s y n t a x - k e y w o r d : # c f 2 2 2 e ; - - c o l o r - p r e t t y l i g h t s - s y n t a x - s t r i n g : # 0 a 3 0 6 9 ; - - c o l o r - p r e t t y l i g h t s - s y n t a x - v a r i a b l e : # 9 5 3 8 0 0 ; - - c o l o r - p r e t t y l i g h t s - s y n t a x - b r a c k e t h i g h l i g h t e r - u n m a t c h e d : # 8 2 0 7 1 e ; - - c o l o r - p r e t t y l i g h t s - s y n t a x - i n v a l i d - i l l e g a l - t e x t : # f 6 f 8 f a ; - - c o l o r - p r e t t y l i g h t s - s y n t a x - i n v a l i d - i l l e g a l - b g : # 8 2 0 7 1 e ; - - c o l o r - p r e t t y l i g h t s - s y n t a x - c a r r i a g e - r e t u r n - t e x t : # f 6 f 8 f a ; - - c o l o r - p r e t t y l i g h t s - s y n t a x - c a r r i a g e - r e t u r n - b g : # c f 2 2 2 e ; - - c o l o r - p r e t t y l i g h t s - s y n t a x - s t r i n g - r e g e x p : # 1 1 6 3 2 9 ; - - c o l o r - p r e t t y l i g h t s - s y n t a x - m a r k u p - l i s t : # 3 b 2 3 0 0 ; - - c o l o r - p r e t t y l i g h t s - s y n t a x - m a r k u p - h e a d i n g : # 0 5 5 0 a e ; - - c o l o r - p r e t t y l i g h t s - s y n t a x - m a r k u p - i t a l i c : # 2 4 2 9 2 f ; - - c o l o r - p r e t t y l i g h t s - s y n t a x - m a r k u p - b o l d : # 2 4 2 9 2 f ; - - c o l o r - p r e t t y l i g h t s - s y n t a x - m a r k u p - d e l e t e d - t e x t : # 8 2 0 7 1 e ; - - c o l o r - p r e t t y l i g h t s - s y n t a x - m a r k u p - d e l e t e d - b g : # F F E B E 9 ; - - c o l o r - p r e t t y l i g h t s - s y n t a x - m a r k u p - i n s e r t e d - t e x t : # 1 1 6 3 2 9 ; - - c o l o r - p r e t t y l i g h t s - s y n t a x - m a r k u p - i n s e r t e d - b g : # d a f b e 1 ; - - c o l o r - p r e t t y l i g h t s - s y n t a x - m a r k u p - c h a n g e d - t e x t : # 9 5 3 8 0 0 ; - - c o l o r - p r e t t y l i g h t s - s y n t a x - m a r k u p - c h a n g e d - b g : # f f d 8 b 5 ; - - c o l o r - p r e t t y l i g h t s - s y n t a x - m a r k u p - i g n o r e d - t e x t : # e a e e f 2 ; - - c o l o r - p r e t t y l i g h t s - s y n t a x - m a r k u p - i g n o r e d - b g : # 0 5 5 0 a e ; - - c o l o r - p r e t t y l i g h t s - s y n t a x - m e t a - d i f f - r a n g e : # 8 2 5 0 d f ; - - c o l o r - p r e t t y l i g h t s - s y n t a x - b r a c k e t h i g h l i g h t e r - a n g l e : # 5 7 6 0 6 a ; - - c o l o r - p r e t t y l i g h t s - s y n t a x - s u b l i m e l i n t e r - g u t t e r - m a r k : # 8 c 9 5 9 f ; - - c o l o r - p r e t t y l i g h t s - s y n t a x - c o n s t a n t - o t h e r - r e f e r e n c e - l i n k : # 0 a 3 0 6 9 ; - - c o l o r - c o d e m i r r o r - t e x t : # 2 4 2 9 2 f ; - - c o l o r - c o d e m i r r o r - b g : # f f f f f f ; - - c o l o r - c o d e m i r r o r - g u t t e r s - b g : # f f f f f f ; - - c o l o r - c o d e m i r r o r - g u t t e r m a r k e r - t e x t : # f f f f f f ; - - c o l o r - c o d e m i r r o r - g u t t e r m a r k e r - s u b t l e - t e x t : # 6 e 7 7 8 1 ; - - c o l o r - c o d e m i r r o r - l i n e n u m b e r - t e x t : # 5 7 6 0 6 a ; - - c o l o r - c o d e m i r r o r - c u r s o r : # 2 4 2 9 2 f ; - - c o l o r - c o d e m i r r o r - s e l e c t i o n - b g : r g b a ( 8 4 , 1 7 4 , 2 5 5 , . 4 ) ; - - c o l o r - c o d e m i r r o r - a c t i v e l i n e - b g : r g b a ( 2 3 4 , 2 3 8 , 2 4 2 , . 5 ) ; - - c o l o r - c o d e m i r r o r - m a t c h i n g b r a c k e t - t e x t : # 2 4 2 9 2 f ; - - c o l o r - c o d e m i r r o r - l i n e s - b g : # f f f f f f ; - - c o l o r - c o d e m i r r o r - s y n t a x - c o m m e n t : # 2 4 2 9 2 f ; - - c o l o r - c o d e m i r r o r - s y n t a x - c o n s t a n t : # 0 5 5 0 a e ; - - c o l o r - c o d e m i r r o r - s y n t a x - e n t i t y : # 8 2 5 0 d f ; - - c o l o r - c o d e m i r r o r - s y n t a x - k e y w o r d : # c f 2 2 2 e ; - - c o l o r - c o d e m i r r o r - s y n t a x - s t o r a g e : # c f 2 2 2 e ; - - c o l o r - c o d e m i r r o r - s y n t a x - s t r i n g : # 0 a 3 0 6 9 ; - - c o l o r - c o d e m i r r o r - s y n t a x - s u p p o r t : # 0 5 5 0 a e ; - - c o l o r - c o d e m i r r o r - s y n t a x - v a r i a b l e : # 9 5 3 8 0 0 ; - - c o l o r - c h e c k s - b g : # 2 4 2 9 2 f ; - - c o l o r - c h e c k s - r u n - b o r d e r - w i d t h : 0 p x ; - - c o l o r - c h e c k s - c o n t a i n e r - b o r d e r - w i d t h : 0 p x ; - - c o l o r - c h e c k s - t e x t - p r i m a r y : # f 6 f 8 f a ; - - c o l o r - c h e c k s - t e x t - s e c o n d a r y : # 8 c 9 5 9 f ; - - c o l o r - c h e c k s - t e x t - l i n k : # 5 4 a e f f ; - - c o l o r - c h e c k s - b t n - i c o n : # a f b 8 c 1 ; - - c o l o r - c h e c k s - b t n - h o v e r - i c o n : # f 6 f 8 f a ; - - c o l o r - c h e c k s - b t n - h o v e r - b g : r g b a ( 2 5 5 , 2 5 5 , 2 5 5 , . 1 2 5 ) ; - - c o l o r - c h e c k s - i n p u t - t e x t : # e a e e f 2 ; - - c o l o r - c h e c k s - i n p u t - p l a c e h o l d e r - t e x t : # 8 c 9 5 9 f ; - - c o l o r - c h e c k s - i n p u t - f o c u s - t e x t : # 8 c 9 5 9 f ; - - c o l o r - c h e c k s - i n p u t - b g : # 3 2 3 8 3 f ; - - c o l o r - c h e c k s - i n p u t - s h a d o w : n o n e ; - - c o l o r - c h e c k s - d o n u t - e r r o r : # f a 4 5 4 9 ; - - c o l o r - c h e c k s - d o n u t - p e n d i n g : # b f 8 7 0 0 ; - - c o l o r - c h e c k s - d o n u t - s u c c e s s : # 2 d a 4 4 e ; - - c o l o r - c h e c k s - d o n u t - n e u t r a l : # a f b 8 c 1 ; - - c o l o r - c h e c k s - d r o p d o w n
2025-12-17 13:07:35 +00:00
< / style >
< / head >
< body >
< div id = 'root' > < / div >
< / body >
< / html >
Phase 2 stabilisation: code mort, Modal→Dialog, feature flags, tests, router split, Rust legacy
Bloc A - Code mort:
- Suppression Studio (components, views, features)
- Suppression gamification + services mock (projectService, storageService, gamificationService)
- Mise à jour Sidebar, Navbar, locales
Bloc B - Frontend:
- Suppression modal.tsx deprecated, Modal.stories (doublon Dialog)
- Feature flags: PLAYLIST_SEARCH, PLAYLIST_RECOMMENDATIONS, ROLE_MANAGEMENT = true
- Suppression 19 tests orphelins, retrait exclusions vitest.config
Bloc C - Backend:
- Extraction routes_auth.go depuis router.go
Bloc D - Rust:
- Suppression security_legacy.rs (code mort, patterns déjà dans security/)
2026-02-14 16:23:32 +00:00
< script id = "playwrightReportBase64" type = "application/zip" > d a t a : a p p l i c a t i o n / z i p ; b a s e 6 4 , U E s D B B Q A A A g I A F x 0 T l y f R d w B d Y E A A N x 6 B w A Z A A A A Z D c 0 O G F j N D A w Z D A 4 Y j g 1 O T M 1 Z W Y u a n N v b u y 9 3 Z L c y J W g + S q u V J k y s i a J h M P x G 2 p K o l i k x B 4 W W S J Z U t s w 2 V U I w C M T Y g Q Q A h B k U S T N + m L 6 o n d 3 r N e s d d U 2 a + q 5 2 R Z l t n 0 z f b F r e 5 l v 0 i + w e o Q 1 / w H g 8 E D 8 I D I i M 8 k 6 v K i K j A A O H H 7 8 5 / h x P 9 9 5 e z B O J v R B f D A 8 i D 3 b D y P b N G P T H / l O Q B w 6 P j j m v z 8 K p / R g e B D O y 3 O j m N H I K I u D 4 4 O S F m V x M H z + l n 9 a K u M W H c f Y d u x g R L y x 5 4 W h a w Y u u z 0 p J 0 x q c Z 7 N J z G a Z G d J i o p 5 F N G i G M 8 n k z f o d V K e o 1 f h J I l R l N O Y p m U S T t i T Z 3 n 2 W x q V s l j R e Z 5 N k / n 0 4 P h g k k V h m W T p w f A t L / h i o S d J S g + G N j 4 + i L L J f J o e D M n 7 4 4 N 4 n s v 7 H O K b 5 v F B m K Z Z y b 9 i b / j i + K A M z + S n b F 5 G G X / w P K X f z W h U 0 p i V K S z P D 4 b P D + 7 M y 3 N W U l E Q d H + S v T 5 4 c X y Q 0 2 I + k d X V P A 1 7 f u A d H x R l m J f P E i 7 U M i 3 3 l m n d w v Y z T I a W N 3 R c A 7 v B f z l g M s r 8 z c H Q Z D f Q m a x 6 W Y s / p + M s p + i X W f a S v e Z a i R 5 h E p W S O F 6 X 2 B E X e y + M z t F 5 l r 3 c S L K t S 3 a 6 J N 9 P v i v n O U W n B 6 M 8 e 1 3 Q / P R g E + m + V m 6 3 s 9 g P w 3 k a n S M p e S O 5 g S Z X q e U X x w d h W Y b R + Z S m p f w i y u Z p e T D E x w f F y 2 Q 2 o / H B c B x O C v q + 1 8 X H X f U R Z W l J v y s 3 q g / L 0 W q b d N b H 3 Z y G J U V S 8 i Z y X a s t 1 / K v r T 5 m 4 R n d r D I C r F U G X l E Z T O x G Q r W a I F f S M r o u 3 n R 0 I 1 Y z u v n v l z / k + K B I 2 d / l w f A A I U Q w e n e a s g 8 W e o c Q Y q O 6 0 Q w A g 7 B 4 k 0 Z o 8 J b X H H p / h G 7 / B L 3 l N y D E b + D / / l a I I P K b K E u L E t E 8 z / K 7 4 Y x r 9 D Y q a D m f 3 V O + G z C R R z 8 + 2 L q 1 P A p f J W d M q 2 W G T g 9 O + G S y U Z s h R G s z P n Z W 6 3 f j O c Z u t I D d z d V g E 6 k G 2 5 Z 1 G L 4 O k 5 L X u n G W l d n g 2 8 / e P r v 3 9 N k 3 d x 8 / u v / g F 8 b 9 J 4 8 f P b v 3 6 I t v v n 7 y 8 L 1 4 9 W + P f r y g m L a C b G d R O P t 0 P 8 s f Z m H 8 t A x L O j i M s y k f M 9 J y k o U x j Q + Z j p R q / w 2 7 d 5 z l i P 2 M C n Y T O j 3 Q 7 9 p A E Z 6 B H V M b c X a k B m d L N V y + 9 r e u 4 3 W 6 c 9 G 7 D d S Q 0 v J 1 l r 9 M 4 s k m w y f T g D a X + D 7 Z k Q 7 8 L X X g y S o 4 O U F 3 y p K m c U 7 R 7 + Y U T S h 7 3 e l 8 E i Y 5 R U X G a j e / + H O J B r O c T h O a 8 8 E L z e i 8 R B d / L n O K Z p N 5 g S Y 0 L Y 9 E F f q b q E a p w c N j 9 B a V y Z R m 8 3 K I s G m a J n p / Z E R h G Z 0 P B m I s R O / X q y 5 Y + t x n Q v j A M c 1 l v U w + f 6 0 u f c M k m j 3 j m L v q T 8 G W u t x r j W 9 a r 2 v U 4 5 h a z 7 r H D X x 0 e l B m P 6 e / T o p k x D o T 4 p W V 5 Y P D J J 3 N y + f l m x m 9 f X p A p 2 E y O T 1 4 c Y z E 1 2 k 4 V b 8 + P D L G S V 6 U g 6 M N F O j Y v m Z 2 r D H A O v R n G C f z M p k U J 6 w z 3 D q n k x n N C 1 W X 2 L R J o 0 2 L b K x N b N r C R h D T + z i h k x j d F t V e 1 U 1 B J z Q q s 7 x + a 1 7 5 7 J H 8 T q E o s Y A a c A F H h l L J g w 7 d 1 9 p b V J + q R W z K s V s 8 g s s 2 x s l k M n g V T u Z U 6 1 z 3 k 8 k E n R 5 Q i / 6 M G z x R N r 0 a B Q f a f E f 6 d 9 B N F K x a I U 4 f B V 9 O T W u V s F S X l Q 6 d y 3 T F W V g U r 7 M 8 X l S W 8 k s v f b m W v q 5 d s w 6 A D n m p D v k 3 L 4 P P p l 9 Z P 3 z 1 0 P t Z + i v 7 B 6 + f + F e p b e J q 1 m g A v X N V 7 6 x t l F S s x F h V b F D N r q 8 7 i 0 z T 3 o 2 h w j w 4 t Y + P G S p 8 E X o w P J A G A V 9 / D l u m w t d P H g 6 R / B m x o p j T A t H v I k p j G h u n 6 e 3 l / 5 j / s k A r L j h N 2 U O S 9 E y r J T R P y 4 Q 1 e G a 7 n x 6 s f M j a f w c b m 2 N O 0 J j W T 7 P 5 l J b M S m 7 Z 1 b w N u G Z r I d + U + y v m d C 1 o N c g 0 N T h Y a m M t H S C Q i + u r B / N 8 w o 2 7 e T 4 x m F O V 9 W R W s e j w J A 6 L 8 1 E W 5 v E h e v e u 6 4 L D 4 + 5 G W Q 1 9 z f j B X v N w o 5 F g w V O 6 h 5 H A D t w t r e r A U f S T T d h o f z b 4 9 i 9 / / M N / Q 8 / v P 3 7 y J X r 6 9 c + / f P D s B f q N 0 v r Y y 9 d 1 M k S f v W V f P J V / v 6 + X r 4 G 7 1 K i u L h 6 o d x 4 3 7 q D l 6 x + v / o m v U 4 f o U N Q g j f e h v E A f x v c w a f O l 1 T b K c 0 z c d M K L f y j D G U X W c O 1 K 9 5 W 0 f c S C x d q 5 j h y T L O h I P n O Z i j Z f m H p Y X 9 e Y e B 8 q 2 X K V 6 p h + V 3 / 6 j 3 / 8 n y u 6 0 x M a R i X z P M 5 n M X O 9 8 E o z D K P q S I 6 5 f n V K 1 N X p U s 3 g h f U p m 6 / Z M / v 2 j c A w L c 3 z 6 e 1 B D 1 j p G r b Z Q w 9 4 s W v Y Q / T r i w 9 5 M m b + n c W + w R w + U Z a m N C o v P q B w j r 5 4 / K W s N a s 1 h y X F / S y f 3 h W X U m Y m K 2 r 5 j L 4 K J 4 O 1 d u 2 S e c z B T d d p 9 b r d K S 3 Y v 9 I s R W n E 7 q E 0 a 1 F p z m q l h U x R 0 y x J C z R P U X Q e T m d o U I R p U r 5 B 0 T m N X g p 3 n W O 1 V X g e F g + Y m V 9 c V n l S b d a + 1 U Z 0 O 7 e / k b t e b 2 R L I 8 I h S 4 y I f / 4 7 b d R 7 O h 9 N k 7 I a + K b q G E c 6 j A W h j / b 0 w / / k B h 7 / h M I C / f L Z l w 9 Z l 7 w 3 o a w K j o y c / m 5 O i 1 I 8 b X C 0 w c B I P G 1 g v D M u a b 7 J d r g / x M R w 9 U 1 r 2 + / c R w 2 Z 1 A 1 3 w / 0 h t g 1 T 3 0 f t P 9 k t W d w o K 8 f N 9 / j c a m r / / I T V m 2 v a z U 5 f / W 7 N R t / 7 Y / 7 T g 3 S c r d r t c 8 2 u 9 n N 4 e p r + 5 Y / / 9 L + g 5 3 e + f v Z L x P Z M X n A z / X 6 S h h P 0 a 8 o G B f G 2 f O G k 7 y 3 1 2 w C W t a 2 p c d u t 2 s v s y 8 u S O P p e S u d W 9 C Q r N t y W F 2 J 9 z Z 5 1 1 z g N N 9 9 f x r 3 r o y i z P D y j 3 H O / U a V g x + + l n k 0 7 g + V t t d 9 t i R H r 5 A Q 9 o Q U t k X w f u X / G z d p z W l D e B Q p m 3 t G 0 Y G / + m l + S l 2 i e h s 1 h H x r z z m F 5 T Y + a F 8 w D o 1 b T E L 1 F U Z a 9 T G g x R M 9 f H K M s T 8 6 S l P + B 3 n f u H 4 k B z v L Z + L Z Q S e a G S v t N l r + k O b o 7 o W E 6 n 2 2 i K l c z D n F n + + 1 9 i E c K 1 w f F N V v u O z t S w V 1 A 4 h W m t C j Y C Z B P 2 h 9 0 m r L W 4 / j i R M F G P p + f X M L l s 7 n H Z 3 c O H y 7 N q q W p H k + H e z z 5 B Z V 9 V 3 W w s E Q n 5 9 m U n h Q 0 f U l P z p L y p A w n Y X H y i v 4 + P A l n s + L k N R 2 d U I t y c 6 s 4 U Q e e o W s O i c t 9 b T E d 5 + I U I k K o O j / D S p N M Z 1 l e s u L Q o j y W L l r 0 H o 3 z b I o O f z a b h G 9 e 5 8 n Z e c n l H 4 p i E e V G 4 S 7 h x V a O G x w L c 6 f 5 + u u n 9 5 4 8 F d + K 4 Y y f Q L h T f F 3 Q X H w t B q R x l k d U G F T M 1 B I / i b U u 8 / v e Z x 5 g 8 a V o J N X y N A u L U n y P R b N Y O L s j f x U K P a M l O w D 5 L H t J U / k D q 4 3 q v T t t W P n y u D r 3 g t l b n 3 z + u f i D v + v n i E l F 9 6 x 7 6 B l b 5 z 2 d J 6 V w g G B X / C 7 + 8 M Q f d 7 P 5 K 9 a y D 2 l a 0 O l o Q l E 8 R 9 G b i H 0 4 r M b s y v h A Q 3 G v L + 6 9 h Z 7 Q s 6 Q o x d i E B g / S I s q T G f t D r E V w U F 3 4 k B 9 Z H f C V 5 H f 1 7 5 a p / M 4 G j s E X F x 8 i 7 R p c P y y b l x T 9 Y h 7 m c Y E G T 2 i c 5 D T i T y 4 S l G Y p a o p 7 8 U H e b F U 3 8 2 p G T + g 4 p 8 U 5 G j w J x 3 l 4 8 W / R e V I U 3 J J m N 2 f T s E x + N 6 f y X t 4 R h P W H L L t q s K y S + Z Q V U / a 2 I z o 4 7 D j H e n i M B o o d e H P n T 8 u v X k w 0 5 g k t K 9 O U t 9 x i i I o y T 9 K z 5 y / Q b f T 8 h e x 9 Z n 2 x P I Z Q X X w n z 8 M 3 f / W W D U D V n T / m r z k v h i i d T 0 c 0 / z G a 0 v I 8 i 6 v f 0 f u f q K K 3 P l q 3 3 U E 6 c a u N W l a 5 e B t 0 u y X E a P 0 o b 6 z M + V Y 1 6 D e 2 f p Q 3 i h Z R q Y E t y s Q H M d B U f Z r I e e h z P o Q h P J Q 9 K X x F I / W k t z j 7 T Q s x F J r q y g X Z u K 7 I w W H f I + S H x 2 h 5 j d s W 6 l j M / O W P / / r n 1 k r m y T x N k / S s K v u S B 1 W u 9 B 2 e 6 b v c q T J 2 d k x 8 + E j P V v U 6 6 c P O 8 0 j H X P O 2 T + h 0 N k n y j s 0 u p + 1 M r y f G g X Q y 1 F Y G e 6 q c i u 3 6 y 3 5 n R e T t T n 1 7 M 5 0 b M R 2 H 8 0 l p