From 3a55af8d8510cde8b4ea77e24ca09115b4946ddc Mon Sep 17 00:00:00 2001 From: Hubert Chathi Date: Wed, 8 Oct 2025 14:04:45 -0400 Subject: [PATCH 1/2] add devtool for viewing users and their devices --- .../devtools-dialog-linux.png | Bin 52350 -> 52728 bytes res/css/views/rooms/_E2EIcon.pcss | 4 + .../views/dialogs/DevtoolsDialog.tsx | 2 + .../views/dialogs/devtools/Users.tsx | 356 ++++++++++++++ src/i18n/strings/en_EN.json | 26 + .../DevtoolsDialog-test.tsx.snap | 5 + .../views/dialogs/devtools/Users-test.tsx | 361 ++++++++++++++ .../__snapshots__/Users-test.tsx.snap | 454 ++++++++++++++++++ 8 files changed, 1208 insertions(+) create mode 100644 src/components/views/dialogs/devtools/Users.tsx create mode 100644 test/unit-tests/components/views/dialogs/devtools/Users-test.tsx create mode 100644 test/unit-tests/components/views/dialogs/devtools/__snapshots__/Users-test.tsx.snap diff --git a/playwright/snapshots/devtools/devtools.spec.ts/devtools-dialog-linux.png b/playwright/snapshots/devtools/devtools.spec.ts/devtools-dialog-linux.png index ad239ddc04aae5c47c036ba642ea35cc0ed42d04..d4125008417b974efb746477a5d97c6fd2cf21f7 100644 GIT binary patch literal 52728 zcmcG$byQqWyYC6Xf(N$%NpKR}5Yvn-+SJ3 z?%Z|e%vv*R{sOvd*RH**>XFa$ErR7`#W2xG(cs|VFeSvlDZs%Yyn=&!k@4~c@W~Ha z40AZRS8x*FJ}bJU94sPf;O~;5oMiIlL=i%8)#Y)T5YU^{N2~-c_~l0UMvjiGx_O%j za5{wXMUZlu$nJ%jvhS9^&T7WRYMxxhj@%x>hFdw#56)ZpiVHII2UycdK79&Y=eUXj zKi=P%s~!n;28V>$**mK^Pv6GH85!l#ZYhNg6(yONnXv-HfvcpZqT+bR&dbir%+5>8 z&wu87Ji&+UVQ+ul8vaDO>hY)$cSrk9?;}oBN{XK>*U_tnvh|O0^<&Ymk4e99HQV)+u)jPym z0m1?E*LBG<_3rHNG9_^7F8qY=@9)O|t{3i(Pfcy{+HajqcA}%E^}>wYXpJ#m>rt?K zvW#9AmGZzdH8B}X;WWGb5oKbF00-yOPbVOtf3dY#%yZP=*SCUoJ&tk3WwgficUO5m z>@iyXHaa-Es?5s$ww)HmoevqfN5&bN+xc+SQ$j>$`pl~xDUR3LXcB2WyVG7$+R>nr zWS-LoFWfO)prxXlEY_rFX{v)Y)aUL%>Km*k1~@vTYkzJUP_pfQ{fCK6J> zk>*@?4-LQPWpuLsnyA>qqqN=GQ$vZ5243AQ&j_WWf`Z<2TQ9+zo0}2=6rq#TJ2`J! z*VcKogk+_QCdc7X`3QKR!L@34FCCZ3EYmyoknb_5PO{S)1X?&HK|2)V22K{SZ zcbE51mW>1(A5&XDc_wVhQZAPn6Ft9=m3(6}3q|?wF59gv^Q>37*fA9qtLDqayu5SI zQv$~-Eh%YMGsgr5gGsbv7E%h=Uok!3^<-ynZ!nQJkZFKnXO5JNq}khxtSuiM_@I!hxY_J`cfjlGksmX%g(5t@h$TIhFrX|vt2Z%dhh zO#k$UBaiT!t1%dt=@g&9bGUz)iGJuqH>cTmv8Dd;(B}b0y51}tNv1al9Vx3NX3^xf z{_>-7HJ3tvesRLJ1Ox=2te*@BNiF5#DQPSCAO0p2@BTBtl}uF@W4Kbyk=b#4 zvGIOK_3%_)71(l`1Pp>aUT|y_V3I&AL5nC2G=gNjhfc0AN zGXf?iY?D42CZM-~_!=G$XxLYs72P(+U9QbCZ#Grtw{#%j@;mYuns1qZ>T5HMz3Jkd zhOX<<*SD;|bNfh34fGMdD&5#7dd=&!H@UA9MCz2DIMQLgJndkYVIuK4vrFB5U|_)1 zw16$w*9R5o-$2dGEp7#s9!VrPce>-aKzeL^TiHFYV7W$}S`90c@aQ z&!9rK;n^{-os3r4_J%ywiQ|cvFI&vY%Y(c5cAyT^wYAR}0^@1HJygFzrY>TgQFMc(Q>&!TF6PC>>S z7T=73aj9zhJXp>w_4fY$^hB|Bh41a{ZC)O&tZeuqf0GNRV|;vkaOBa(-wAO3NY)pg zkq+8#K9pye_B9uNC-khF&-W~h=IGRqzy9m%A9%61D8x$}_&n-#3d02Gq+$Yl#%#B2S6^3ZtCEr; zDd+DIo5m)N)z#H>L6P##bpF%*nZM^}-S&BTc^E&tTO{xZVxLsXpin3|-&Of$B1hht zoP??Xu!4mHLFP$;jgrdBrNkxrq-KmEA#2N+8niEHzfyH(2VtM285tT1oVwr6X9+E} zJw--FessJ&$PT*tWgEfpMkbj%Q)p=-A~Unu$8--O0jzN0fUJUyjNHPw#8ma~^n3AJ z^gl)wRT%W?C{^#7J~=vGYz^_tzUEt~bZmk`t5L8imKr_tl?Di#fmPy z2^b9Rnj+IfHRg$Y86!MU{zytPzacNd@82IN7n+nTRz2@9-A+z$2nd-{gxp{+omOtn ziCDB6U&C%?6b&Fz6;S~Vu5DhPZVp%YjfEf(s5d;_<75TYcXtICUM@4JjlJb)ew|8< z8F#a((QuMGjCgxVHJPWh7@U9kXPK}K6-!n^qGa~~TB@1+)*q#)kl?AqAamY+t*g+K z!w9Uq@l)3y1@n8G?nJg&MB&ZZ?1f>@04cE2*{$Gml9J=oW0F}MB$Wtg z3~5lm@m1cfH;IY{b_Qap)_GCIwv1?RAW2^x3%%y^dV!?S%m7wU@blBsZt~K9TGFgB zYjD_u>OT63?C$RB>aIcyrpt8^mLR96sMwUYjTG0t-6VQ38vt}(Q7EeQXfSu^m}Ch53z=sIXSkxx)+J7^!blGE~f99_-ciDi#|MNTeY(UqW5=I8R&q<5SW$s>j~Je|Wm zj~MLr>yIj$nX4RwSyo$2{_ug2jmh#-Y9lW%uy%Y{8T%z+D)QgI71E-mxoGRfAADOa=cg=uvtHE-v-SRv0MD8fdN$P-t1#yiXNlMkUzHb}T8&2H zn40buF){+%vV20j@t)=B#fWRVv9rlMcge-YMPa$)yc0Js8xK$NN8N>Ca`m223Lpj% z{)$B|*k}t5US`SuFx>~zpEU{2yE@zZWTNAZj&ARk6cxqh^@sXV$FIihf>(`?>&M|- zL+n&{X@J%orBvK$9>d{f3g5QO7%okCu0J@o4sL23s!^>)NoBY zR6}Ql%*wOx@o3_xiJ90cQ*__eYLnIK>FLo!Ga_vV;tqp@gEzd^@XSV zu{YYP`Q+s}SG}+J{d>LpNGobvXtvZ{-MnZa3)*nO%8rir(Sd}SXb$@jyUht}zb`0j zr>sroHGg@KcidoTXz`O4D>t`Z{g~GI){xs3iLjxW*8OID1^3jHo&~n0|7d9V&*4 zy?V@5G|yF_oeo&SNCEa#-8Jh1Ng0{kgx!t835>d!iTaA{>-^UoTLTm7b=DKv#pVdL zL?8!gjCtf#WP9x(w72Aiw45(zjbV&2@aIoe@0S%Kr`)m199ny%1y4@|CcTf2hI zV-Adr2)R!sGdxvY|4AG%~uGhMyYNe0+;$-&o zWl|4TSBIZ{97Q5l!cOA=A-zaWcJ|lRFBTTBI}fciIy<@-#^bK0OFfO9`cKN`EHdk+ zXoo#^iq*>36fty5 z2TKHhF_w^g97k$$K2EccS_t?RU&!_gji^mj7OHdQxMq-vzHzKM9CPNFQCb?l#?$6v z(SB&xmH2@s*1JA0P_%-frkb-&Hu2r_n5@tbxLH$@OZExK40TS@Rj6+v%j{fir-JT9 zhQGEB;=t#dt5m&lPgT)=`GTG(qN1W~z{{)@%e!OMY;y8vs<&&~%~RPN*qj|6zPubN z_S@!Sxf60!94n(pc z-O{M1s1~2o%T&V*j0_3XW$&jMX3GMDTLf@*O>~4m@dw&hUF7Ix(`WY(&IEoL%fDwf z6Xh@W<`L1vXA-!$y1KYk$G%5 zT51_-b8WghKzDoC8i=#8&UkZqDgLd=N!x0z-2AGw&U*PYuuQX#jX!0=v`{jZ@j!+_ zB>hYs)^l+vR4*$qjjcVeE+J!VT&n^+jgLiiFm1zi{k0bY@_Cx5h{$qmDk8BdwR-yXI4ul;MNsR-ZU{W(G-TEocV7S;Iuzkta8<3WmTO*&gYE6?>=nP zmY085llVK~biF4B2KJs%pCn(^_E^Fc-< zNnQunfAyRU7mQ6c286dY=!L;M|omkUYK0c2;t*Aw$6MH`6w1j zdUdwxOo~V+cWZe0nTR>Fy%T?A6%;?E3E7?vKHOn1d0z{o5);KI)o5tkUY=Gy zSf{_;+Q&?s@rX@Jqj&Re&i zW-I5vk8cThjC&ms9zJ}U9kex=>b-p=fL4@}3Z$^60tP3-n61_$v4-yb!%!#;8cdaS z|0QJyO!$?>W?&05?MbV}asM)zr{i;(_V(7+7}<22b~=bE=xK-OB@hNsm>MN`;WlGT zq)QQDle7PP&ICe`DR+RMa6g3GpVO%~h%ab?A8>E~$%Nou`pPap|M}%j=YRX{Kk1$D z%YV{MpwU06&Z`&yB$Ym|UOwk>|F<3gx0ik~g9oh8Xqtd~D|u-~#>v&PH%D%r$IaR8 z#eSXXM9=c_)Ai~48q@P&R@4>H6MmPJ^oEjj#zjyFn3_3*w`44^%4duY9?W$*<=yuYjRW+4j&^c>u7H; z9VcfsU=Q&1Yb@uLWn>QLX%JCRw3}Vn*w~_mG#l#c%R8$oD@(Q89xo5)ArSn2J1(n* znc3N!^X(Bb9;=)RJUZDNd=*hqWUdn~%eiXLyUXXK{T{YKG8+>UQ)M_1cW`iUwAkc) zFvG^dVLy>4!x<^s;{D_Wg!_Skfe&|A`QHJ5KfQeTQtA75m&*fH9v+^g(6u7qo1mbe zs%(>6VDR-#O%wE{E0ku^0ouG8xd>FX2c;Hc6=&(s-M zT1rFXGM|zb7q53dUTXJ6pnCU?o(uTo1GlzFLoRTS`8sPb?k~T5X3a*8dK+I-6d|ws zkDj*&*(Q6cdotEVDYtblu zpwA%J^ex{I3Z+TjJbEZ-XuPf|1o_X^p}Srk zk$Wc&5syJgNJuz|p6H$aZtP7KtE#F(iJcGUxU|ygp5K}(MnV#&X;w~7we|9|w?IZg z0e@CiZLnSM;Vjbc4KLGfYxTHcN8x2GDgoz*1Nl$|jr@BG5g`B`Eqso52nBb31T8Rzw$FyP%KBqed1jINxlb~ZFLJg*iX z3+}qGpGJVz@X{(MdcI`ydez>G}@GpdxRId=WT=>;5y>p5*r9+$;Txk{PVGV^B; zDC$qfdT#{yG1!Qb-QZ_T3?5&R_tPVtY)XdsuYRQ>MG^rwPNo>W?5{yspp=cB9q~>9 z0RffY-)*-B6M-1vdFPx=#N6HAa6Dr$IGWCgcZjN+MQOS9P#jmXuM7 zeKv`a@MobP{`U2Gke!|Gg*6Q*TMZ5k=|4Z5fsZuj-!L*ZaT%GK@&Z<7=F{%t>Ce_n z0JC+`Zk%coGyaF_%^AGYDY7!o&MoX<_{7eX%%xTDV5s4dbv$9*?6V902Axd4`Xcxv zFE2Nllx(VKcP7sejOpn381OR9Xus6|aRlM8NcC!e@?xVwDsvU5x+iWZsoHdm^Zom~ zl?o2)uY&l5gr7bsACI>J-WKP1zD{BX9dF}eVmLUsGJS&A(tuS6L=@N*l)PSX{RfEY z@3MCzkcX4lhr4DX$?5w!srmSfJ8N624H&mKHYkKVKdVaYZlwl+*eVVX<S{d8kLhl!SbVcB;;R_n3!Zj;-aI$;b~`izJx}3cs&@JH5R(dX_~RIvEv-< zSLA|!hu`&ceo(WsB+4g{0y4D6UtzIGn4jGCn*IFl{ZwNfwfN(4WjU!i-VbaC3;k>O z(gq1j0UnCrbq~7mNDukjJ$cal;wh~zv*PoRw{BrUNm>(?)k>iw)a&WbwiQv{snJM=IOg$1{|~_|g^7L-&Yg7OiYwL^Lzvwz-~+2U1C6ZOV=R(&5ezM5B;3aU!huaA#ro-aJn ztaMR-{s=D7@4pQM{^y&%b+8N{YaB5BtG@?CS#>U&@6=pg4#RUcJ zpL}8=`1l(nKK%vd<@7A+cx6DnqKA&QmoC?&pfD+!l!R=LO$a%h{krt5ECjAnju0X5 zM-C)%w2zTjjaKxQSB(^-eT0!qfP- zNn#>8NEa0svct8rCaQjVn~4LkFf1qKQ0f(Wgj4ZmpyeBOeAY3Ndt2d1drY!h=m1>1 zH%)#HQoxUfNk;`md7Z9+Y>a-{cS<-Jf1+Z202j2=5ffkPn7UJijsUkD6O+76_6iEE ziED2D=oxAQ@y&r$0KI+#R`yuF7G;|XMVJ`}+?zqobYmIPM#yESKsbBk$J3&B!bmiD zlvo8}?KNqDtA3Y(k3-Hb&9F+35R6v_bRa)I!rFp`%E1Ml5Q#v8i=v^)@1~*Qn+cga zB@`pMf0J7h0!I)J;gCj^U;q-=j}Zuv5G{hkg@yaB4Mh-b4+vREwh*{W0PUs^12yOP z@LUSKk3wY?H#%zAD?`cGh9_TxwFuxDIZctJ$4({O8rACYqyud3hBfV_<_SyY*o3rP zON-aWWE#CpwX zF|zc4dyv3o2mRRSay-`(9~H>c(P2Jq`O#y8_38ughfs{?9rifI z|uEk12Hxv#R|{yY5^krBEO{ZdP$gVq&7Eyq#q{ z6hv!VW7agPZed{1=kv0Q4;!*Q`_)7Vu>djW5&?P|%z%8`D4m#k)d~Pw&8E149!zsg zOiZn241PD*M}%nQI@v>j`Lh~s9WDKM+^J&OBu=1gE=`9g|K>oSNa`sRL|vF2y16-N zf4D~wO8r}_A%(&_@nZmcIEEscU-3I(nm08VU{Ryms5C^`P21BH{_^Z>|FE!{ygZ|r zp0KGh^^$^XnpZg~6ZNNf`#cs0idC`zPNKZwHwwDDy#=WY>tAh|PnBBl?8zcMj_5kz zUYRU4x(?J5u{;bwdU{7k-+mRFDmfN4PvJLo8{OyOWMyCowsZr$d3HXB@lYjQGh_lCTJf}cRh`9?-m1)uTm4y9ZwfzKMAk0^K4q%@DB#H92{ z;0_T;(XsMl#|IKwZOw+%E_QRrdg`H8<(7A{9mz~Cnm{17R+Dye^`6&d=OrIWiTOc2 zs`o>S9~yws0Yk4t_tER#py@Kz{A2y7hBq@^btucfS%7+4YUt52!=Go<4a#Vq8X6`u;FkNNnDa{M(};nDHSNoc}wkKqiu1h7YYBGOrB7qe+5 zdrH#;%BaBK8%|1?O1YuFeic=zY0J{J;QZ0}{fMZ}L0}X5hQO^=X zb3Qvi_a+gVT53hMRzmkRlk1^PMS|eyk-j}`sO8d(ufg;VfsPD zokbhji|@EirF48s!9aqesGuO_)4qVmOeB!Yj`MxVd@BR+^QT)G*2BpwO2LDrhAUBpM zo#pO4BU2^nXL++##_6@;+)6@ja$?~W&QC`&G&G-u2EPPp9Sb7Nu0(4*UiHsAAD3!2 z^tCl<@q0_8yINTMCOY7)sn{C>1L+ z@e4G`uR?dLO6Hvo7IN=^65uQ-DB^W4o=I^W)4d1fEr0V@B0JK0&tB%GW{2n&ht-2r z_352v(M_Erl9TITu)~+?ii%e6<1OuhxX~aZoH~PtTN!*NE<1Yx`@Qcoy>*{`M@V^` z@OY=GD2KbRVSlrijOAKA9vy(1)qypK;}O(1DVJ83Sk91-kB@O;d4?@}XSX*Z6SA0T zzrVD|mv$|X}$%^W*t`JN+MzgSd4Dv_5VA!-jgOY5STYQUp z)frs0&hR38gQlg*Z(A=>sl@I0D9qmYBdSzmAPDYrfF@tv_v}4z*x6c} zgPS`mdv~gY@5_|k9!85ZP%3w@&}y-ZT9e`pxw&HPym?!-@Nnm}*kr$cTO$>Ob)ft0 z;|$WBlkW@euP1~dws7ovsVFbI^B%nf9rCj3Q)HDnH=u>Un9UQPl z%Dpf#7pe{4gN^>}hVZr(OR0UqpHh{%Ex*q&w?pm-BIwl%f97U4WIaGcY9fmo*%kd=0|L8nJ|lZEN7PO~Fp0umxn3 zU{aldm<7V|mRGc40mFvI#&;XR+E2b;?=DaGmdmhPUS(EY3!Y}Uv9rd_g0(v}80eGz@5d64w0@5^@$-GQS(K zn)i`6}cf#^XpeL>fX_-)ESow9=(qrp0!CdoBMr^u=%~+)t|BD%3=u_IQs~~au5kGF8Q(3d|tAH}zd!#K=^q?}4Z9arId}n#ZG)11ocJbH{o91%wHxX#tDZ zSy_Kbs1Xm9A(bcH5c zJnzCEUGOFn15~zXZW>g+2U_+SvvlHrsmR_zsQw9$xA}HwY&63`rPt8=kgu*Gpi7?{QGD6fV_*bi z5Vew?C5o|MB~n`%AQqEFG@jox%WDeVWAyYLTeSj<6;~CZ*Di0h1tWrkGsPC4h6xBR z(jT>yitvvUXka=-2lGg1GZ>)Sa^g&s4B~CyuC6X8@<#jtO~8erYT-1=nUv~r^mO;c zvgy1ifaMUff}}ocd9^0_p@F$!V_|k=7PCD)Np@p^uQhCIuxz(H%Q(kMPA7_riXyfzs<2MG=*j=Gy?%y&?z5rQ; z&Pf(XY&Ja%s@0l^!cVOC%FSR&TQ>aV&$N$i)9?+mistP{M8|%rc16$cB@QU@{-9cG z+e!LZQCO($#pxf$<>>fCnM7}+o+{|gyq3N+lMo{qdPBNjZn^fQ2{**K9Q}=H#gqShq(d&pa^2w`4nz44iOPiKqH2P{J7oQQl{DTnN9oQ_976IT)NOD z(Ec%OBWx17*5wDwj1&Tm6-2#fiX4uxklmj-je*fidNXviHZh+n78`wKiiV+H-(Dmi zylR9f*kc^xT^6>sQgjZrp75qT)H}xJcs(>?)M;bgLAbY;T2Pwnnvm+0j@G&ds$=${ zrQQ41)Go{&GXk%Pw5K@9ghGN8fgLT>8f$R5pv`c_ZTsh=S?F`faI|=LuOE^AadUsa zch}GJl)ZEMB4M;UjY7Nm<-Od+)+GU-_oE)+^bI=EZXua-2HYC?!HbtO7^k)JtZc&w z7DO-T=ulLqk@0)I-RV7@OVw)3#@7LE?W#R4Eg=!rH^hYWAAXsZ3G?Fq#ovX^P|}s1 zh%3lA93a0?(1jJ?EG-cg4z*g|4b#&095|PWh7*gb(!)!U@w>c96{MFTASLY?So^8B zl%ncDn)TyHwmrF1ACw_xA(=C;3tQ6`s5?_$4NzM$l>jl*$;idF_5hWj2((xwUXOu0 zvBSw%PpPgddv=$~LS-b);nsXM>jrSc^s!tfqdo{ISdKe0lYhq77Mos~q3QCu#C1DQ zi*)Ylzt_Z?rND(Ajas+sFuFJ$zS99Y+-kw*{SvFT!bv&O{_q9bgFGZ~qyc+4i&{X? z3G6Xk-^E7vh6Zj(Ogx{14ogW(j^pW-Hp5|~WTnnyvmgty)pEtaaba6yBWbS0jx`|Z zIGE`PTToO|v|4JE*)&?X{0Q2@9qedDuGxIJxC*gf+TPvG!!#dQI_7K35N_JIQ;vH5=#Wr~5_*y!R-Dk>G<8 ze*QZi1LnQvy2~JMu+eFk(+z6Fi&G^Bln3f8XH6^yO{*2a;3kjVg>jm;2~^HEE3Ueq z;gP<688L@KE1iZU(In}GHjb8ZRPC`vIjb>&;A%`Yn3=*MZEw6mKR^6%79z%bDU`T5GAsWAZ)S&tK(p86c^ub{r6O+X$;EXI-wakC(1j ztyZbLZ7gc-PCkb9Ly-OHlFJjD`~k*8W3@MTZ?DCE7gNJTmm3^ona`o(w+FN6Mbuzg zIg6PLK|W=mz~FjrWYN$)?Kj$hn9Skcli~Z|=ul0`ztX$`1aNtSYj|MJ$w^7l_l4QN zyJ~vrK0KUTGfF4(s%mPcYLQRA3wiUTT9L$qsTrKiZ3!p|;#Ec_=ps&+$uoe0I-sDc zTMZnp{`#&yY#<~gBwzOR?o6ft61)TE(P-;pA)Z*klHccMe@!^}X74tH7+5e!AA{|vTrE4iSG;0X>AxK~n= zYRH?Bh#FZokk2=-)Btb;Ux*~#HQ2>UizQ@(`6h3t9+3l&s$*h>-rw$xBmgINHgeq4 zi7B5{n6YX}_lhup5`?Ic)98Ezz^;DC24`b<(T@ReA%J!W1Fxcr8yhuD2QCA$(_T@- zP4vI>AqEs_WH;Xaen|-iQ()ksSR`CZh7XK$S<<0EA1Mk-B0gv`{qT6U)m3ifxN$M> zeapTh++$SQ+b#e2F*~moEQk((Bb=^+XI=$Epj}g*{>$?QD7ND8W4UZ9Pd7j~0OSk}xjG=HBLl`NiI2)*647Jc?RL126rj;tYK7K&OqM@hSRn~#qjb0>E zF)}a|>+TZkr3LEE#AJ$~Tm*>wwyGfw4RXex{(%wWg4tgmmd)JRE5PK->*94Yp@t}aMHaxdtFo(a=Y-P}Gz zpZIS_CZffAK7~jykAA40Ns`MJEJ~D z!+2wE@LtF5ff+)IZc#Ew?2|rzH`>?i_d<;CeV&C4y|1Ep5io`~Bxniu2+K*NyAzZM zCwRX?WPVDCm#%B1;t*lcL}pd0=)lcVzlX<5T^o`Cm_!jPoREOo;?HoI0`)3nup96! zd;JQ&@CI?xh|*AxjN@GNd7@Gi-z(giQh74#R`cnmHkO*tzI%i;%6%irHcY*U# z3d02IgMuR6A%f_@jmY&Bb>K+o0A33$6Mpu*Bts=+xW|FvIsOmtXjz1`A;GrvzP}li zkdPxi6|fS%e4*OO(1TlX-`RPI8io(-S;;s4-^$tnTAl}G&)SJ(P2f9N6u2z@j?3x4Ans+E3FiZ zO5beK$#kwdI4bHb0)d#3(Nw>Z`7TSF2Cww%k2VQY7pMC4=j*$>W)o5G{^^yOnM+9# z0tg7ccK(@p`}uR(ZiVcjTC?fK=ElxwhLEA5A##_YuI}f%Q6R{;`ScT*Ax1R+K^XJP$*I= zo{FLK@@3IhRkv+LqaeNxq1cBO4kZV!X8awL>24{VU z5%h~7=gIsRQV*v%m-_PON$8X3Eq(|0M(VlXG9X(dQ%5n5Z?wSm<6eoN8Q@Q=YAec!>2uA|xanf3chU>Equ^h%&uB zJS$anz#H$i^d|6Br&qf;tSTfVWIHsudGVae3PB2~bIh=7#-9`P62Xlb(aZuOwpp6puJQ$rr)Koma!dg|1ZN}~ry-#Ke1bUCkG03MARt-)y}P2Ml}Qtw zj18}h%I+cO^NQwSWMi{kxDLJ`;{Kb8$9Xw|!RJ zQmUFT9v+*p5^(#~BHW=)4@ZvG?D_pSc8nvJJ88XsuT@c_Vy}tVnC}M%Uv|5YSCTeJ z$OZI3o|$WGRCvGA^$5h`&xt;5AfVR^A=FhOOixgE37rg6h{w42~$hbJ=@87Rs ziS{9yTx}wBNlTu{TFo#P&7xg?_nYPSEpAtLwG)G(B=&miYd|={!OjlIa7_9JXU}Vo zX9ym5V;UMrQqus@6d-A#5H(n4w(0n@Z0ZXer>8$Xci)?ATAr^vo(V<@4fz#;?Q;1+ zK)`cy&(V6hWuU)b1CS#k+51f&?cZ&*cXR>*R4lB^s3;InU(jkXBIgVFGYan?IF?J# ze-BnuyG?Dnaypu$a=>pP0-z%h7$<0Wa;GDXBt+iN;ii?X&PQE*iEmp6!%zwK_ zx(96^>l=zqZEum#ck5q{RK%UDl}WA}SHD^5==|&-1e6%hL_I@(&Qv<`9r6?j&Cbp` z1d|I~5;@@`y{h&A$}5c1zjp_hztQNFvMVToWJmfwnEuYeqUmR4OX%_c2Oc+^x? z<2XAi+nzEtWzzcr(rW+EBO_`sE+F!frv4urf}UV^eg=t+B}TnDqSI*%Em^BA1LRYV z=W&*b*Y2~pfc$+)<5NRJzAQzP{k|H&P9SHQ)j=yY@+%_oD0FnaQbfbgSgRAFhIXMeCKeO&wv!FR}a73D!|v|>Xdmle5mf`evyT)Uh%rUPQz@f+37-| zeWDl0I3C^qCI_ZmH)aoO*Y6xt>gZWC8&6+4clhd3E(4PNFDLYKfs@6bPNx<=RcZ0N zvp-FLQq-#R%Kk~WDND{bDyY$Dz!vMTWvlQ8(6~cot6eADoctD>YR4vO%$3nJp;6hr z4d@n6gUfY}#c|cyF4?dPm4X{QUuS!{C5#eX@E{1)!+ZLF*@Cl$dh z?1%txW8;e5Zqyi*f#pZd9z9+K*-fQW7$glQ@OhRuxD~ z^{&7E@I~Yu0ShrJf4wI>&!DF>NKo<8b4_KOJ}xg0*$`R)U|8XFcBHZvQ}C7jb~CU= z#6hN?-_rfg#G_9YWf(Zy!O4Hfl1taJoUb*a+ai!8CBVVCVdGR(S2zE|qQ5ILMyN3U zv$PPPf({IZKTJ2KA}M5~LwDJLx+D(KVQ#yyZ0G2P1Re$k%y>AVr$_FCr0=MC&SedN zGUR#Ra&d*NB5!h;y}T6woo?YGZM(&&tX+sI1Vz`x#sad(T%H{Py*8%r$@AiL#Oh7| zMSMRU=457OS`4$?gMTyzA|t(LW2*q_1`j|$)1Bu>WMZToD>y0tZM;YZg|`yWwXTuZ z9>5dhkbKgEerGIqPcXxJI)E%?!vXBJm%;N78^GyV!|fRN%=X^CJuX%(REVGFk!l9G z@WQc$Lg56J-s0CaVA z6$9we#dRfZPSpFUrV4cFToUoCOVpdpR;}B>4mGfmHU@t#@1=td|4*8;GgLpLo$g)v zYKPAi3$yMH*#Y^lj41&nr8alNB%pAwMGLMIhFAYCD!I^pWq!dd@({Pi@CD!RJ*%+D z+Zx)2-@gy+>J0@`GraFSQPs67VJy6D=MlNZwCdv08$TrPjYW}MhtqEE8-9Ab^*c`J z4^E$(8c^rkzjyB@5Y|q|<8;^^XLxrn@RU9ij6y|4wPn81F&p}FILrZ{xI4GhI`~v^ zJiuuY6H}mu50q7`{nCK$l~DudhtHnhubz;=grLEl*O+M%X35NApLZestIUbw8G2=- zX&}AI)$;NZ^p065UA)_|h4!stA1$I`dy2VAg5nsKG_o>YD<~@m*FDCpWOjMc9c>P% zuxPjD@PeD-A~Eo2)Mkz}pkIcx>v*ibXXoS?XlJ{9zs~2e_H(~H5RIwuys@+l2j3wy#(a(~l^J#x$6Qhk*>!KL%c9TyXlHK1IkRqzieo{rY8TZhtqoSWgWcp~&e4^r7di>VPoK?z)dnR3nVEVZ1wS zu6YN{Ct&C<&0}>y>jH6!#%(iL1Zupx1_synZ4bIYku|RupnI;`gAGoHfh!=wtu2Uk zMqe!HN`_?YzgfVGo!vx^?E=SN@~bmWBRA(FG^qjqHYuLzb&4ZQ(^nH}1WufdiDyzaxvf5aqN zPMxpcOFY~QMf1A^e> zI;;1Lj0$|yp}SxWO|nsTs)pred)rmTB6K3=)1z9Efi{<2ZP5ha1gD8_wJsD{%-XX! zPCE&yTOBa}5S&fdkXIsB4G!&a*JC+T)cIMzr78J{F-70a$SybMulI%}KJCBey{f<& z_q(wNHZSuGlzX~LjAtp{0kDtTEZ@80c40gYeQ%aYnR28_j@6!Fs(n zT2UO3+uh{+7Mj9o`^TjtyG!5Nx~#A;5jfaqdHVr4`Bbc2wn@onBiy!5C)?sdvNLus zB}T)|O~4u=*f*TOW(Wl6fXrmE%2{Y$B~UPL;xXT^Dh7|Hda7jE;bQIrI6*@kHI|$D z;!Ptm1_^ic5(}Qbe&$1~7zP=;^`kYk+-_}y!7M5hQ(v9NM2eKNK+aP7y>h7pMU)3{ zmKAL`WN2SU+n@G&|Cj(DXM942Y-(?RA3asdB4s~JGI*K{l|s@YpN5;|`!DyG<&UZr z{X#1w$5jX|o=_LX#o=%}4)m>&{d2t)AkVo^y9KYm@x0GyvsC99GpL;`a&_0vh(N*I zn|A+RwG~&AV$C%-tBlu-sW=-5$CxVU^j@$!xqjAe_uxNGNR)GhCQFtu@SmF`D1=cNUwvA33^%D4o46GWtUb<+M8|AdkhJn-{DyPJ$t_6pPg?UuU4b+ zn*5-p*-e4e2l*^olq)rrp*rimVU>}LTsr^W!9iDY%YT4SpcaRSs`-biKG?hwlE!PB zqaSpMhIV#?ghW19$LF{Ph(ZOlPDiwxoUP2|+XPd?8IZ;^J?BlqbZmy@um}+#9N=bS z3l0y@+=ms$^txbrybulc)$2#Nb8>a5*KYJMoYfu(!Y2PC6sL7}nvDV!b}Or^Gx9OX zxQW^H3PwTro(c$*EmYOkfWSee^g5YVUua6N4 z%!}a8=-L^Rg5TyK0VFBe|M)lpoPxeK;zb$}A^vDGJq!=M80pH~c5wQ*x1#HLx8uK| z;)rn~eW*C4-%Os(FDxt^#Fn@E&pBS$u5?Ic@`qH1V(Ug-XdIB3estOCTX03+dF^&0 z%y1Nh_=Z4EyBVOlEW4tA#|0p8|BfsS6C7%|fd3tVhW?8fj$ZZiXI&%ZaGzh80Ch6_ z@{f}oqFmT>pvmpM zLgjJUsf|e)EWcO(t5u>dAQ_w-myZZ0dh!~Ai&Y2cPIz42=s)+8d8hm@=7R@N=6{Iu zGrh{t{{~?I&=v-63jpH;O}YP808DIiYio9PCF8|)L}UaGATu_~3w$RV@fFoT()2y6 zPiTx?VDNWEu6~vep&>Fla4W@q3D^INx3`X}s_nafMFj;xln?;{5s(H!Lb^-3OG3Ik zH!0H6-LdIzP+D5LyF}?tZ@SL4^?u&xea?8#8Rz`Y_#OXZ+=F}VwHJG@bzSp2=V$sr z+Z41AvL5V77C6$o%?DB)BZD*yr1(5B}N}x&bYM54nr618T~?* ze_2yssHyPmF3r{aMiz&bg&Efj(@IfM^oRK(-^-M8XaV4108qV`*$@rI$T)=ZXdT3rk3ltWaGkR;dp2#e2Cla%~_2 zhV~;%kpmT&oQ0X5rz%NVnMcb~1Q{76BZ`KKO6tAD?Gxh6tQ=Ew%hKZP9`VPIDb7Yb zO@QV{jS!eCEA3xFf9bDav9gSZU>qyO#wy3eZpf;u2O;H`A08gsfAa!6!iob4;C9XJ zLNR)c!neET`ERv#1|z{mVT?ISVQlOzv%NisSV4Wg*?Tk2dvZvdTPB8vt2QgRxD@o# zjyyy=hgb3n;H*VQf#f=>jPzGf-V}60a6A6rMHhM?tugUB5fL#_k%_Tsks_;&jaO~Z zS11|x(GCxL=iSuIP4mso^6|GeX=3}VSu>z24|NIyqM&iPD1`yKqqC}am?fR8Kj0H3 zKfzB1j!*rJJoEfAU?dg~U?6He#- zMhDY@dK0Fo&%qj~8IZu;?j2enR|4UA%9>BXs&#VqgAftl>O-vP#8@IM0tpfrQIY1` zDDPm6MDW`(E0<^)&!ax%9Ml%aF(5Yw6i-RzHG5`E-A@>ITS-oW47wQMOx3i3(iCg zz$7lD){fwYRicjg-gdU#>*~=ctdf^MpW_}=e%d1CJUGGS7a_+^N2mI{qcW6;M8z0$ zFGHg{28(7(_U?p`!wPsq!QvPAxf#xxul*sA`i;kTS813y=y^$h2>cEMSC-ToU-7-*~GV941)|&7!Y5rQY0}n3^9w0SZ@6(jO(d^xM(1 zH-C)B3Zvt4W0T{7L6SJ!>JAn@rD1UvD&r~h9}4fm@rZ~9#KS`@{0)?Sw&bmZ=T-0E zCLt`z2`W>d=0-UtJ|N+ideqZt2uHfY$-vn3yW{ ze_LWcwcFH>dGz{SLhb&3q<%=h+sz8a4o3VehOf-b@I-1Z{P1eADM|Pw-~fGBT#F?orAn%G|rYN(*j& zA-2xR(pRKvxbu?krlusZS?ZbS%2~KbS-^mH%5hOnoWdJtp361cKhWQ(%K|ET{^Q~FL(GN)OwINg`gI8jiPcb=^nvB4?$hs8 zTvft@Wj31c=5J&>9fh2A;N0_&xFHw;yby$sLVPfa@0o|Qi;@8j&(`MVLgP(YO3H_d zia#28?uVH5dK#vCJgL6f<58XpETq&T3Vg{T0&G09YMNf?7&&$eoHdEeS$9@9e%|X3 zH_+3Q3O_)-l_1W}&Q(}77K@8LkrH0b&4W^cTUWzgPUKd5l2eEY)3xiHA%Z{ptCX-1-3P7@L@w$U?0NWK= z&CVu&M9XzU$2s?|=f-2MEU+|E$Um%DbE(9$y=y#0;0KD+SrB$!muv!TcVu+2LIrpu zC}q=(0><=AIa;Jr+B6w&^^l8;%FFkGET06awzDZ*XfjUsHXd@#0*3c7I0&xgK9d5m zKW=>K{xE3DgMo=gL(QZjpechj>(iV8DxkUl&bO`32c(JIyc|42H$ba#+Tof4s{F+D z-*ETsG&}?jV&7wp?P6gPmz>s@VOpk-%04u8?c&p%ZgNEsfl?vNcxNRxiN`(p<4oF&b{OK zaIqtXTVo2Ye-wC!>|r&H1+w&Rn9cWqoqv>ijAn;&#Tss>D{?Z_RTZB5PxeRO&#LxM zk>w)<`koQgPrcRcGx94$dxEHo;QN#cR>hl%>Rl+x3C#NT+*+K@v$YE zL^oh$`+eA=y4dXIywfXk!SbOAa-1tYmLE#S%-lOV>T_dqS9@D?p}uCIzo^+AA7m1{ zTKItr!_1*ad?eLmms!V-B zl<&UPKLg%`hNk+=jEdUuI8)^Rpl}Zu6>~Bc4G=URBlErX17# zIGDj`ELSEf9uG^F@ywEma6X0Gajjwx`$m2|MEvO;T(B9?X+h0p8~evA?Zst!Szxm> z8;bl0uSBO#W4~UdRHI#+azk4EY;G^)Hx&&{wsDM0T%Nor3M7P_+vQA7Kp@krg%<~( z+Z`UrAP*zXZSxjrr=l~WY_LBCN`@zhcILxo%LR;7jQCrR`uqEnSW|&j{J9lp0I{-? z61cAz`vOMMVVQ`u^uR*XkI>{gcX#&!?U5(x-Ocdn#%~YWcW|frima`yh$mbxu53##^yExa((zE8yur2i|4}mIKj|S|H?$P52cy`TM^nB7!^ryu$A#dGyZ0 z-p&q0{KLa#LHxO{`b~?+x(oyYS>n}}N{rP!rV8?of32%?VB~dhMIo{d?zMm9{t6iX zL6~#q{XOthmHEd|ZAc+1IKM!+y}hmT)h5X6rB>(W;WC&iY_`n+xX$RY{~#SmIuE2U z#cDi308~~7Q#ln9Z@9VVXYe;yq-A$@%yBdyb>g#J)%hJ26swAarxw}gJ%&x|bcN^S zrD<__HMnk1Swl?p`=Mqfuiv@ z&52KOz{lo7GdD9+u}#2b6tnC&Qu7;3A{~h58{E3FmmcuAIb;QV?zJ0S@y%X!$GhSDzIY1c(&W_djwtak`x6n90?s;W4Q3{`#VYg5 zhGqUj(k!u1T`>eYXwl@6{h;ck@jybC%DuuZ_;^oGL@!*%qk#bcbcEE7Yh>zysbO@OkhqXGe zPo=(OP4*EwuKYID07GX6XDh9_YFql-d~ib^wVefGKi^USFXkRP37ap%zxL&+ z%k(H6j>2;Sg5eMAO|lP~_tTkO?}EFS;-9hI_P3@$%XvV z!tpr;t2oLDZwU!KBy10xy^)2Zl^m~`4(4PhJ;vua_;L{cQ4SBtDKwAwc0e#TJRsbC z!*(=Vhl*Mx`TfXex9BcdzLTY9I)_^rmgMz=$C+vY{=Qxp9f5tPK_oSj5Ee)4vE0~# zpdSF*!C~&T(awkA_S3*EeZLI{%rqc?B(*Whcbl94g~3`-He+wGIcqy5Ep4#_^;e-v z38z!P_+oyhyklrSqr%xWdiuy3teZOz;;$f zJ;l{D!k!3G>u#X>^W`r+yy|s`A0#T^NKbm}A_Q1c&j+2^9j5av(8y`tqn!qQoMUdj zZX>d^nLA01r@P(;Y&!s#aru6|rlg@kKvp`fCexd0`4wTRX5;{bx+&ElD%+twi~H@{ z$2G7aKB{wp1MJjD&1y4t=f%5ddiTp{g9t6;-7wq=S=ryx*5c#HR9N1Jce7b_b$1@+ zW(xPkhZeVO-i>;~xbf(R?ff?9UP-p(L&cGDp5}s@@%d4w^-`Wj(*7w<(|zgVC&{6q ztXfa0jW94C9j$6BCbR$gowA`JX-nB|S!B3`S1ZBJt3AA9PgNv5Q`X_z;Y><8E(~^# z=U_@gU}a%Jr_1m@v%-}uxb7=9;Xz$Pg?0YP6lbeUdvIu|{#R5Er$+^bDd!ql_cL@M z3$w~Gy9mDsGE(S*Ca`$~7QDm3#gQbSTFwcoESvsS^qeWo`A&oe$?HMm$SZeNWZYbf zX-Qrlg#Lnb`hP3CtQQv z%~|-n#N892Drgc&l;g}jYzvS72%UTexvJ&TP_MQa32B3Oho_elCCt|TWYL$03JM94 zy?q<4kw3%W@QV2@`=dvX^pkP4KA7?9-g^zKYE^Osv5V3W+L>U1Dg7HK_7jZIYmEnb zU-3MjX}ZQ;RRmhC5+syUS{X^}UE!1%?Tp!iTkz@nIH99eQ(VgXt{^osKtcB9N^v zqMp(5-}5|vma%775{bldSS+X5e_xsE02r@pUopy_Aa9j+WR{g zy=HQ164oo7U*hp)WY0$zJhjT_8{Kh{RD~%z8?P!CHT>=F;rx~_e8~;h5AYlq z-Gm%7`}>%kF(|0wDJ$woN7&=XIHncWi4{Q^=-3lNwF?2E)9yEfjFpV%U^!`LXTPa@ zdFY|v>gQGt7$8CMM;T3GB|D9%&2H19k&Z``mhb)L?I*xIV8a_)5{h$z%r74!bgbKq zBDLPgILsvYl%9wP{WR+_*?tb{f-1$+UoLol%V76BB0=Atos*fSBiAFYG*zm_W-;I9 zHd|!u{Qg~wC$^M?1;UEVI`hYh9Lfl~ zSHr&AUzG1YcHcBL+@Fux1Js@)JiFbw4$q_Qu7NpNT^T}U2GLbldm}(*NiTf?d|uO= zc`}K=7qe}fASrnc^qB)HauIosxSAG@TwL$-<#47aswlNsHET_H!2tUEHUW#t9YYwG z1I+BB>A|kn!=f8FRCf|7sC=#xI@M;DFH5%IW|yc;ml1^m!IwsoJn^qnPX{13rL zDXFQ`pDajTBPBEGO-HyMd1->BHl<7&)QGI`M`P|sPV}kb1^ybS^7aY5LO}cG_Vg_w zkC|`XsmQGUxP~Rz5Ql!NHU^geu1lv*XH3odD@=UOD5o!3Sv>S_z_7tDFD&N=G&cK1 z;e!L%tl_o)fI}Ra4YoFIBbe0mdwjSa=jOO&?k*$cW5}lO#m2DSFoe; zgP`V^mzi-Q#wm)FVGgk2G`&b5N<7|~OXakU;oH~*OOPqos)E?>Lqp-EW3ZC*e4Z~Y za~PePu(4O4IMPD;rEX+MV`R?ipA2F|QVXnjoZ$Fzp`cti%xwJipPRaTSsPF(`>+f9 z{nc(F>8WT{$~ve&ojtkqfy0*dL}lmUYTxuHFh$EerTy2G;kH_4Foh{JF1MiIDIQ+8 zr+j3bC=-&RkrHMNizIiS`Fki7jJ3~pm40}R48;@TD5P?G!e2IV)?NoPXpxDcucmwa zoi*g?u73Y41{YmlwVkc?`OLwi>Y}rjr#w8SDxlNsD%O{+LRdS$V*cqTF&S7urgEDK z3J4%|7CXeIGP~-vqa5RZnl5`NM-xMA&dKFPWb(@8Eea;F_(4-t6f^P|;9AP5-rmaO zy8i?KF;ji259W)-rrnQI9&yjn73JnSosWLYk@U=qMY+$-NJo{iy6-i3zWY(ql#;X9 zOsUT8nlnKmS&7%qgrsatQytuYUc%LP$A4tuoR3iZJPyv4PEL8}6o|rnS0`!MLmBJe zdmEXKTH>IrhifBatwvUk&+j}Xr=%S7^WFI^9MqoUb%RL2gM4fvbHgv}<;9FR=*nqB zCcq9tQb%TP?T+`1{E}>|Df^0%~la%wHu3j2J8p2+Rr#HWQ;RI5_g> z8;5jKT67~3cl|{BIR^s4&~T~5oa|ghG9Pcn#;7PLr}B6;`jvKqL5AOWQhukK-qln5f9pM&pvNN6ZX#lGNZYqDTkLJ>Pc$zH%iLBJPcTc^~KI`|#K z%`&JIq0k#&#IY{GvA$-%c!R&ONkdEhIwza?&MGYvhqAJWdP}glPPU-P^$fU5rApwf ztVG?&X1!CX^SoxD3)o|5y~C&BBxALIY4d=KcEngfWtK0eCXo7HgM&w(frC>SFzCJl zBbvSTR}R%I(&)zyj@8e-nE~1%JXlg{s0Y9+qG5QhKr}}Jy7cu|@D@pX^jbTDgCv7P zLWlbM*@nlM#>=4j`5DmS?BZfybnh?cfTQ!bN8rsvIW;w~u}qI2dYYbql^z2v$h0!j z)78r#x_X|Uk1Hn!8@pvLnT^)8dZwK{2gA~f16u4 zutLqF;&M4tmo}?B&ab}W(wO;qgU_4k4(**pivKTm{Qm_~-2Y#In8b$(chg!RE4NpQ z!b*B}mHzeh6_FpMDc!ffB$4n{y&Tb0_L2j7o}=@dE6o`L7p`nw@<>UaP_BYqvm5FM2NEKe$B05wxVShttejpR{ZXEGaD zM`c#dWq-4j!M?}BGHyOS<6t&5I?SKW&PL6#3eZ?AY`moMnv#9Jqy0si#zOaaoap9C z#U!iBKDzxH{ESJ`-W~Q_tuF2lEv%JdzFVLk1qBhMs)K(KO@B*KCVZd+GoT zb)S)vk5ge@D*cW6c{~#;{Ej)16`Rw{per=4BCc1!7(Pibj>iPV2VRV<) zZBbciuIPZ5(1R1BcO@=C;InY}Oij4aVT#5r0~Dit9PF9w3&;^_OOSKm(~N-EBN zNW9e@otOvO;JF2u!n`OGv| znLFugrC(Ek%-Y)OL3q8xv5J8MI_^Bdq`aKmGRbiwHL|8TEhKyGTf(%R?}DTnL;WcTdL83PWh`Mjx5o|VJMxWz2Cd8R)CQMWe{)kahwbsO zR5eY_X!_v}oQ*&ip}r)U6V6!;rRi!962eco&z=E<+0PB?y;bvC@;vZN0sq>>zm1)G zFD`)T@4e4HS^6tZFs?SfU}#Q|zJEbcQH88@NGSZcko+}8dW(DN4Fuw}F`Vl+yh=+= z9Y(}tGj;;J38-IgHTw7p9qpYno3aoGeO~ZDiiV~)x*G#;wc8o@_bO!=5oGNuHUcv< zM*F?&5RNS_xPV@_jqgk1G)I&%>w8!J-Dlt+5KXE3K>43>L2zYk7P$1yqDJjle^xlaf zc00)EPML4~>YEJ@p~Keqc#AD0?Z~>;%};cbD3Q}F(%JRztd+c|M|Ad~myp0Dcnk_p z9C(-rgV+!2mqO)26IvRoH+P~`GKBojcr3)Us5;OE0$9`--|3xd2!D!n65w=fM}5}#>N4rDQ2yjlIdCf`{p5-t)! zF=0v9_DT;J?nM%xJ3jAyhWcO0{#^krlIU%mYhBcMa z%Te?M5W9F=S!uiXBtjrp^uiQhJyCtehq5Tc@f{^Q7;nejK(n&&BamVnny(-B-KtCA zy6iS0he%-^VE6@#fcTSvlsju*q14PgD1zWQKDq@%K92u@UiJ3(e`v6}cMU=jOgX1l zoszRd3^jy-%(nPb${K8OxseEJRwk!~zWgMolshqy<=?iBe3MZOSNTOL)$F=m8~An? zOsJiDz=T?oweYauet@OxWL-*13Wek?7=q4zFK{|d^H3>MPftndzq-%s?>~C5x;vr( z9}Alnb`{Fhi(Cue>*}EBUA~?KAuXmi;~+1f_2C2ey*2|QqmmCbacDq(m%I7S_gF4% z`xT^q_B-iM)~cAM-G!)V`1$JO4wuEu&>r>mH#Un_m7riSX!Bv4 z?&_)s3-&o@7_Zk2v@kdrsNG3PN&VsEz2GnR1q{=Fk2}!QV@O=DMf&-jXFYI!E}_;G z6`guvxPk*>yXaRPF*vxa2Esa6@ zkTMj3!-{=?LEL;6p5wUnO~L=9@dI1rocYp(GirZ3IlwKRzQq$K87JUR`OO}BFP;_;X6d;BOk!ndW}T#+v;ET zmrBdWUq2LcK@tmOc(h_o-rozfegPw;=t;YSxI<|Q!Yq% zfop#NB@E@f6|HX_`GeNhik7ouSVV(0sR=h#Q#kh31+#j-~Qt~vgn zA2sPzE7TrK@7KRiDuMwYQ2+=K_K>Doq}CzWCK8n_W0p zB4!O>^o!HL@G*=c7di{#L=y%{hbO5GuzW7(yI0vvyI|bQf|T=h_4n!qgwa9%k*B8n>J}@_@a5t3DPIAO&Jty{AAtCS z{krwy{j#OHV!2 zxC4@-qseL{Mi#dL#4u&%ZGJ7)zF~6dV{P9`e>F?m*=8!F|tns{qG|;Wex=>sfLE2vyQV)Zw{p#=T^~b=0XIK5`hQj z&k!5cQz)}75`g2_84=FG$cQ~pt6c0A8Y`&hSZ+yjokdpLQeRwtVd3Fg?~ef<$HQsB z_ex?v%6RKpfiqaQfi4q(oodCP_0H|MSEL?iw%$h7)5+;==W1o7P z7v|^TPKa|>Y^%@yJ!|7ioMf09v&H!|jItRManiHxIB;)CF?S_k{ z;3oQ((gU2y>?OvO(@o}tV7hCRvkVM9xoLburYwm(=3AMvN&nIU{L6-#Xq0cF4IK*9 zkHCZ)NtVPdo#%Xy!kWO&=Q8)9wyK1EERpg^W0ZAnRC0XTs~}EpplH|s9&=nt$1S2p zW;TK`Ho7>2d>EWf9^DpT+q_!DVz4sm2UNZxGG{X7Z`R>=Q~qSm!ZB*^hd{UQ$DZyi zsE>9f{1+CCq>@@{XlT9h3XEk(^g)N!RT}pT9#?9%?@rvt#?b}fj>ET>y zTG0f=Y`J3WKW586;fyn#;+y3;hX0-&L;Yz$9u?#wY0@u5A1wGFA3fi7n`#*Hel4w; z!g;;g@oMEq;WTxrc2j+|RAC|@FQK2_L+2T7AUgp!s9VNg-3mk}Fb%!;d*Cyb$nN}X z0F*7gHg;?eP)K}??N2BR7-?Z>@Tc3IRg|DbMrhS>n_WRKg!=8j?pUi58_RgbV0-Ss zI$N7+?+UsUyecr8W4;*iF*@x{#wOwVXtz9TWMLy(nJ9WNAnwQ8|9dOd17i z6hRWXe0~z2&4VkyFK{&_rFZ(z*5wSUMq=nQh6Pl`#9FszYb>SlZl;x+?c& z)2HRfABu!WzrG$VC#5WsO8-r@`N}0`51X&P9(0Hqml-3XYQM)oR4v4W;2UeU7&i9c zw-8<^(+cGDghmx1bcO1Yl?FDhw4 zR9vJ!9BT&od@9=YxcPc9N3~Z1e5+lJL#fa&2f!Ovz;QgfO6%t*0-H(k_`E^Zur!v} zKh+g8JS?{sP@tH{CPIk-hvk)ef-0<>0k`v45ouvBcw;IdIGYMr9bXcsiC3!!09GxR z44Q0=Ctn!?%f$It#B72K)XWfR-UL`4Z#gw;pTG=!>dLeK+&~EN*&J*@*~et*oXy_u zbx#kK*^9c0TIkmRj|o9pl};JkY{#N!IG-=h&J;vbr0>-&ueEh*>#E0W8G!Je!~>#K zO3EwdxY|!LAu$&=T4a$9Mu*5o7`*6Li z=@6#OZFZj59hA&>J3Bgt$@bnESCPrfckUS|(wPhXe0<6jc5@cc-PwiuFaZl2d(Lq~ z!6L4@nsH_!BH|QoVzQsQBuZt9(|~WWjc!bK{EkqN#vX7< zbcZGLOUK3FWSV2T)#pjwx$QV;qcKybqOl!9oo7$_xvOoq6tXtyZfR)=QBqWV`{qqX z5giv&%~M5KgXJZI*{`gY8guqy?V1#fNn~Bx6A+i)2)ACo)vW0~FE3FLsjJpJTL4#o zev7a`tIu$#bO-)TuV*+CXA(Bw&GV3!B+2PFI z9CDmUfsBg9!ekM&TShkg;sW9@FOLx^+)BQI;fE$>CT*v#KI3}M$E_-1Iyt%Vb>YFj$G zMcw6gxM`!{>>Q@}3IC!0y-Y`ri{MtRK887EaN*<9pxP+#9LnrHIDxg!oCS(QSXh~W zN)ho(iwJ*kM&#AEjVKdS+ft{Q8J*qrxYX-g=ik!%nryr34G`oSk!Dl~L+{yf} zMtNAk6dvQ<^OnI$kXR=kLd?cHYiqvQK0uQzdX_hFwb*poXiW}QLoaykr1n2ZNTf)G zL`Q!HHCdbmJYEM;UKY{-i8ha*o^h_P2*f`*;ik}4$`UPg5OsrZFeUqN0zV^9jm)uZ%0#*2N`s_*Mah53M@7ZU?fmI~WUmw3{H$@$tc)M=-__ zHMNM2Dz#MMFg2KbLg3^4nZ)*_wZSF5{3ANTzNAFk+1FcBWqmd+ZS67=H3xuscBP{| zHooGn&%toR#ii4lKU%1qJhtd?GVcoEcHZUoBFS~$6TF+o!w%A`<86R+RPf4{K-8~u zo?%`C^0O`Hsw_Qe!$*3CwU+KtK*=)wl|XM^GmqN|)NP1&+(y(bXt5w*{^&D)9lcaz zG;TW&n-(G4vP1c=$%$tJ$rbJ3p7X8Z4Li6sh{6T zEo?mLcRqpbR7b%dMG@i5fK2G=?1k<;8Wy_kab7B5`ZHR3yI1 zwnb`maujm=^Bx&y1IJ*)T@io@K2CV zg2XFNI(_x$h{MEI4YXKt_KhjM-eBI@QnhdXH!ec?9G`bm>;F43jju*e zF^1o3uGVTrdJ{z82w*oCZk-&~GAvc5?HY^mux73;u$sBLmv+z=6cn9HO-+knz9|KJ z)4yPLS)M4GqL#|M6JNs7n6PQMTm<%qW1sj3iV>-7j9fL}u-Bp)|HRpzr2x~+nAjEQ zo&;nKF@T~&Wy9yNK(-(~YLAiiAOqA~uq7Dc%Qha`4f#q*`;0YhbhqCAl(>nSn0Ob~ zT1mIx0BX11c#*CzmzwWvOp&>`! zm{cY%(VKxJRvwST{HiK!>yzDudYPnmiwN2yX^gSa7^%ZUFz7~P-*CQzxCm&~+8qzd zg3i;rcJg`cEPg8yxV~^0%z=pqoLGXcIdYe07lESbQ-6VALL`u2k4ICzy`z^f>Rz|8 z&d;?ilIx(9wib`mY?I_mS11t}-(wLGjb#X2Bc|C{zYr`oQn;R@gM-PlT$WmkMbH&E z2P?Lil^+ro-@mGXVfMZtCnq1>dUo3!!Jfi)*4nJ)PzXvUdn;SwFiALtV;qB+m>AWV9I+jX>*3rZ>NsShB}^>kcpDeEEM K-Vd)?w`W~CmJ$!-gqn^H-TgpGRkf`t4Y>#&K)hBi(1C z$!~v2jZh`2fNVfF+W*G1u*lS`u)E{BwP7DAkdl*4KvPq3S2VeB<110ns zcugr&utucHzQq8_a~EjqmajlX_eKv431S4B=?TP3cK9RS!hye_2r0JCrgO0sQG5gr zcDTQ5MCHb`uWvTag9e3Ln!8(X0+A5sb_p()z=gCOH_|8TPz*Sj+XE^SKMBUBf$E&Z zRXVZ=5z0s=P?!yY^xXv%W?}6BUm9wv=}b%F-i0~LpCTgZeK#Xd9G?q+0>MHa1aoqs}OVOZ?5NiLS&=N zm4)g_DkBpr3Nf>Lb^H`@pm6|XxWGq9Q*&&vSE`baCX5rkGe*;6tO)vfNrw6X9~=XD zhWrZ>HtkzlF6P&yuNmZpv?iwIWR*n{&B%H3GqiowHlR_-Vuw}sM=LAQ%vE+$A@F{w zP|x{+Rk;8!qtRke9@~YYv=k$^M4o>I)OOZN!Z!!m*@j?!x;iKrmzPu&QWP4HlU0>K zO{V~jWVZ&VU9lq-sF4+@Gcz10kb3`%dcat8;K?c?@O+I*UYb!Jp=TT10~A&)EX9>* z1<=7fAccNlo(rn0qB^~U7*xUEz@esQ!!GCZ+|Xy1>|8_PZi?J&!)f(o`5sX5**YZs zH<7o7hcl~@Y@YuM4@00AaF9UmlDcG5Z6OH>6lEm<8^ZX@6~ZUK4XjJ@vIg$_q=10) z`|Atn3CaFlJw=)cu!u1@;AHPCQ&P|(DGCUDZ_oQ=<(LZSec;;xdOl94Z(|$GK~&Qf zbk}(Df`Sius~_u|eMX^M%y*b!VMA4~G0a{K-M_Ps9TgPbH;%QANZmzP#vtX?_aaVJ z?7wI2>h9z6>)C0z3r5|$@VK;Z=&5rBm393AFu_?xTy^WVYr0c1>zHcWnbO1`WIJ*r8Xv$ZA@VUfhr7_64kp$T7w5x++O ze(#n3igfSQ7&d^hWYd~dwD85#GfoI1BwG8O*(TMPAnW`u?9og0i{8M`)E*_Kwvo3BhY?C3Cc@B~8w^NcZ^o zjf|e{XkUP~*ITFJurL`=_yra~o#L@zKxSmbHt`X0fX50ASyJwL!JnEtJfVGUZC4|o zxd8hT^xgA9&hC)iLx($HMJXI?H{Q9!hYGxDV9FBexo@2W#4~wK<$pI?_+@p=>~}%j zboT$N)Pi>9Zo$l#XJ4&v1!$~i>QgOmxIETgaMk_~sVot7BVf52SRE;@(ZW~>6;|BDJ0gv^%Lc@0uvKytDmIr;X4GufJ_9qM}{>>h{Sj zmOquM23rN%fvPe{C?c7K@4Pp&KGDF}WJ9PK0O)JsBzzM0H0ySHl8ZIN7hwiUxu-r0 zp{WfHdFlWZkQmi_J_;fs0xXSy`Uayr39C74piO;e8$9*e_oqbKPR{~@RA;Cr2B<9pm)UMEUwVJ{LsxO6LUon?G5$IhJz_Q;S2x}fDoc_^hb15j3zfm$Xu}LE-y(m#6bctEY*#G)y{mW z)KXr4Bv4+zy{*j@RyeUu)zB3v8sa#@udx7vLs!@LrcHO}o5Vs5cV=sT>Ks-Y_O0UL zym$dyYDAThlG>W8JM~$5rl@p!AzhyJ*~7wOek||C&dx4Pt6|?rz0yD(um(X(+;|5E zm;!-{%tG^gMSD#F&rd`8I!Oq^7>6qdKt?!0gvf*l0PgDK&``Hx%5kmu6a;~$50jU5 zgLh1{fLZY1HQFD`9YI-ebv*|#)DT~Hz~fumP=U>D6;Z#j$`>P`Kyn*nYvvVlx(Z z+h22b>Zi((e!4aBx%bnjlsT!TdXE4og)(j|@Kr<7c@opoz6bI*I!1yzW`%0uPkm`% zhJyUS-@}~?G9IY+$a=W^=8LhciGJFHGdAlrfIJ#0(03#7TB1Id$B*s#T#(6myms>43`K=Q~KN0l*-CTmkThz(}7 z0i2f!;o2={Krh&b(k*Z6ju+@ZfcyYD?HVjVwG3ZEPF|&VpbyOa|9ncZDRmX1)LO~C zD=MBQuVt!{{;MNErzNvHQwRlA(2Xns@&>Q_Sx+(rXq?=ixb;G6|1mN$Jj}nZ;hugb ze-!tp58&O;abOfJDA@he2N09+GqxxxNd@FH{JNWEpUa@-*>uqj8m3v2NQ#SRzor3% ze5Vyrt5Ud$UYkUf#Tbv+zU?7P)Y4DSsSF z5J$-Qpai;l5=OI5V~nOICzJO3)HGi1xb{-|1$d!hVCdKRUe*&FYO5+JV3DEX?5>jn z-_x0?QdIg=+~G}4b@fF0o*%ZvGum7*}J7Yb;l#kzdtpqTL;GH=mPQ!H@^#F+o?d3jhltAk4{MG>SLEy-Wcts_~_0P;x-@ zFRSbLP+8DBp=eGa-a9Usr`K0CX0pDC0lQ+=;1x2-JR;|77i&Lkif^V6Y3MSwNZ!q3(u z3@TG4!cTV>)*b8LOGt2lsw=XH*jQX1-eb%Re&0j>@NZh#epuF8*+$aF5bkx4n_t~> z{&U8GmU`HQV$QPu$)#D{45^&Y2pc@xjm)I8y5!7wvk>wV%*N7+uFnRt{RQsG_Q>8I z!VbcT(`B@29QF)v-;N;|N3+4_k-)d0j9A=Vv1G@6937P#Vx%%4_uYXHxN&;UKd(Kq zmOwa%E7|}_QwTJ2n36u7nVZu6y3`*W7L+5JhWe`;09rIP)iDTImRmmw5pg=zlvlf) zGWZf?0$H5VMgBh(5kBTN_s<9v>X3Bzt^5xBQkHE!#*D9781!h#&Jzzr{x%qg)?hZDTB zP*vqbkB1f;6BFANMl^tUv@y-g=yrz_!{)lbG=&O+S`*Qb=e>cs%0DOw6>ZR|8(MpGbVo%Hn`E2JwWNH>P&<8DOMxfwPn+Y7(K)P@6Hq zW=rt=-aWvCnT|B#Te}FUI`?j+^1Ake*pA}Ig#%O@YdJ}I`A>+YvNu9{qn8kpW@Y86 zdUccX;$d83B8MIP>-6+Hv!rYTVzg5ap~X5P0f_SriUCA%wS|l0 zhVqnoZWR7n!}Z@NEtt;bmlbs#pcWaQ{MtL{>pvdo2up+q8oG@IUQOaZoX=7_MCjfj zne(H+yk7#)INBle0X}%~-o)bjQs}2Dae(3Rc%lUEI3jT00D%Or>5#XQkVj(I26t%* zumkOYU}ME4#~Yg)mKJ<+!|;wVG%)h>6$Pw3F6a_?Im9;QbyP&m1uvbTnB-Uo*dvL3 z0d{df*_O8r0+?^`zRzS{0Jq`)ouAq0X~b8bwl)Ay0Wl{tJQ;DRAldgL<8th8ncgss zBW!dA9J+e847w5p`Gcmihgzu6$-5#TyzKPB>Jjb9=r+97qnLU=`IjFfdnp zDF>D{ixK114i|2Ohd;Y^E?Yu~_4Ex%FGjJjq8W6WM1Z?fl1=v&@M7Y;+1vvCkKmtP zq+P4S@82A38qCb&Wr}^@l41?r_4M}VFj*qna;4`^ubI4no0@=(0nidej&i#w$O#Au z{@8r=B8{Tw1BUloRIPJ;V*O_Nsr3Q%$2E)LkE2R%d)HQ}b2Gqx3*I+>4jE_|=zL}Iaf6@n#v}+Bst+r4 z_@yiw%a*E|c^aswsLI=q4v(nq&@OR)@a8<(a$Vj=%?cQIs5BNnVuFp;4>VL&R?Xz$ zppPu+w-}QJz;iN!y?V(go2(Z+dg4AWHRZKHhtjF<{^GqZx1C#@Z{!B1?2xZ!?I%I{ z0TXsky5KA_>>`a?aSlmih`}GezbNS$Aq6F+*v~#cul0A*;7jmV3$T_mznQ@T=?Yc|ZHy#>bD4&^g_1-dni0-H_$IFq<|tyJ|^x-Jd(H$_sn@meqCTHpM3o z*x0t~b}Nv^I%(OdG!>GjY|`le)VoU>q*o%rt91_4)pk$;XBRzD-OF3j{n8FLtL3 zbGs}^sj2<&-b8{cRVkayZmFaMKkxZrKf}RsGjw->kX6^$_4vY4$$<`VUSXphCA_#> zQ?^XwQ=0X9LNYSD*J84q)uw~VU+n`_fH${*pWZem9_6o)l_CH-^yUD&X3?$en*LOv;{M|F=gI4pw9ysQ_sB^X)WocZZorYYcK<~O7mK#wjhWn(p>c%A3&Y~e15rKy{RA9v{0zzM3CEByM4=|lm7KII3n z%qc0|RK0jlAg>Q9g-~w!Ihw^~1hhZ>AH}_8KvdoTFN*qz0wU54D$?BzN(|BsN(<7Z zARU7sAT8b9E#08f2t(J<-3;9@cfs@foqPT-?tOXAOV~4e_Fil6wZ8EQs9I+=v*_%b;z9^qUA^ zmCeszS7jkkZN0(nxjgS!oH)1_HNq8`K?Hs(PbVw>1MoL2vuu)TzKQy%Rc&V!dr}M% z6}lP;af-{&L$V_(W5ucshW0zc?iq?GxNo` z5A8200u`Pd9akgxdr32%vx*viq6~~D+9litKy;GgH7(AQCj3 z2Wu_}icTp6_L07HbWcdvjX&n~fA`ABI4MrlZL~WCIR5t-H_Mcx)zOcNy@9i`SC3@R zy-45yxBR(P_IRlw)9+{sa2mGepK)`m!;+h)YRcJ=2M#>wDK!5JyN-vGoonhT*r3b3 z)!w4O>X?fFXHQHZ3TU335vbwh<;->zhnr}btE(C@%G&qX;Wr$Esv?To)1fQ#D3uRT z5?>BE#u(TgyuBwJSoMN~DCJoH6V;x__OB&;)Hq1FXbcRhe|B{x z*_#_Cjke*!ANSk85@ps^VkA@bU23S0t77KB$g=HPX>$<3RcMF#Gl5 zAaiq#9r^)rxAKq3t#_F*iIP>W>c#5_&cjJjhTt1_QIE!}6Ui66BFgG&2@`pvfuSD6 z=HkCVjECYKELsEYAHIyR_9@h8-+P@pD9^OhEO_$4xodt&P~=r7=X9L8b5l-Y1Ext9 z`rR)^eUA|K2({|&`fL2kRL#f4Qs8u0O#`1z9-;?}!ti$zZBjJGG>#sAKvP+$7a2}* zw+bu0%=XQEHDzm_WEsRf-F1_c>Se-u#X#F-BV;hR zk~oY?q%k1KFiRrg-Z0Ry>SeZ`Y=OupgaBjMwKCSj2W_3S0}P;X%Z{&OVnWmO1C)Mm z=^di)40Jwnkf(f0IP4ky|HEC!BKDdTW__Q&&tF*Ln+939V@*X zy)_XxK+O4;oAnyrs4p71&AUYMeuBgBgJ~~wR|C;iQaBDhk}I&J#0C^F^5$o=_J5}P z%uJKOE*(AqN-fZ;xg}oxNb$;JgJkp&u<05tFJEPd5z~hki^%yr!Ze%s`FkO=b0W99 zyIU4{)gVr*2xO^RA;HZ~h8ZVtA<92liF2aIN8#kv1`1$$f+k3zq+8W;I0GmEPCgHLe&1t2SjR6GF z@=O^mJAhEH3MUt_3+5T>$w9SME;`2`P_9^7WuBTQajUePJ5M@wu^=Gha<0v^Pj)1) zA5cwClz=52Q?QxksrCs7yB>R7aCt$`HB0m|XT${k32p%U+uVEuEbCt1B(kVEaYnmT zro94^_Yc?hmL(uEA4`UvR8MITvwlBU_Hk+E>g;1V6fHGND=UAd)h>({rrFF01qB8I zN&Gg2$kbGX$Bki2vqxUz=iwM&d!792;hjAn8${NZfEOd zp`oyqpf#YP%&FaW8Xwzu*0^FlTJXri(!D1@IMB9k@!>XaGSYyo9VhDPW8 zp*iFva1Od5Z~YtWyY<+_3&C&tGUH@P}ycA1~1T$7F! z+YIO6V*)1jLty~H{P$^(?g@&Gd3s9XrDA9H63?XkaxQYD%`#qbYqThn7{xvZHY^qS` zIJX#3zvAqCyk-(;YoJ95y>txr@w$m^VW~LrpdPc?yV+RLrzr*4hrr(Kp z&-Q|$QErhmjR&ewB*44?Q^rTgO|jNLw>ycK1Q%CDc(K>U;o60IF?cEK044GI5fA~+ z19aH8`vdh3g=d`>mga*-0DDWqU63l|Vlwa5Jo2d;ieMpmr`A|HJ9sns?GwG4RfM0zZkw}}_uDS1> zXI}jggNQY^2`|C`Id>r4Z^V;avig3GZo}!txo|SK&+w+id35cWv!J#%RVM3sA`s0M zTEiW)zhH11>2g(1U0g63;MK^DJ{2S{m#=i7)buC-t z^xt5|mK~dgW;HuuOWi8#)Do7AcRb2vNfK+L zhZbR%i-?Mfx)oeP{BD)PfND3cpHg$0$~ic#{qs5svbj2Gyqs4C-W^#5h1qJ4wLNSj z3K7>{*!pN;XCm+KPQ@h9+Q1^M1=iC{I(u7)pjZl^fTIQM)0K@n5Hn6`6C}CdbzRv! z2EvsCGNt-0{GNZ7XPeyk?d`Q*F$g47e}(8aI2w&@yOfk*ZjR+MFGjS}7(}9CkvL!U z)&W@VP#(}2CkL+;@A#FAJy_XpOxp_-Q(x*eI`iMeN&~x44Z6C1@Qm+8X0B(IV7w%9CH^Kr$#nQF9aXzceu6xaz&<0vjgHin&^<69LKZ;ck(ua1=Y zVUq53l;|B}`LY^yD5UXu(VW?DEGm#sRRB|tW5F+GQtWLp@>|ZsK=dUyFK->O!noFl zl-Ja(snHD6U+bfNC&NsQsQC}COs66RS+)pfZ}xJs(9EI^;Sa4Uvx?H# zilqfNAhN+vJY}DPZ+z?l!A&$C9?!+JTz}t(SFgCJ%T`LD7VD(E6=k+2x;_*uM5{LI zQw@|p8|-{9{F3EV-x~w}>UQgT&LKY*kjhyrL zr$|9Be&D61(8fCoFdL6rxcXJeGYgS#@{z{#6G`tpy+7ysACI{&7ofq5^6dYQgGuLG zd)9W=mK8VgEshVSZ=%6Ng+{VzK?6Ze5;YPRzh;2=T?8}zu2}{rdabs`GV`{-OHEy! zo1MpCiBulb0fGZ+hZB#PXm~_uX%)3)TPuthAtraB70QB$pCp-}Tb;ONm;g6<93|`g z%9dpf#mUCtZ}^|!@OyV9sMp^c!mh+xsV*H6c^MfxYHD~ycvtMcUCm&k|E&dVt4`#0 z?J0(XMq>hsUyDdN9az==gzE1r87XMDI`K;MK*5-@ZPI^WLxFqMrZOK8?tN?QYh}g)8 z+7y?q`^}v8|B6VzhbYSZ?J80oUN~IqZ@?n!|NEEFLoXrDB;24T)wL=~MP+yiHe2!2wy?tA5>-^YfCihTYzkl_LCO^M`BMDHg zWj0rsQToIaaOdT~T2q;kejF4-|O~`&j~0m;3Ic&_UVD&}abS z=Ij{>?7QSPaZ3;n4Gl|5IF9)ZR}Vlox*cyfFNaBP58I^Za#oasIAwWdG%}n)T-?X! z(FxmLNL8UGo3T>IWDABZ0m?5d9NgIXu{0ih?>P^Hwu1#DzG3fhJXI=jeIy}>!8uzc ziNtPu4Xwh({=3K7ggELb?Hiq@%#9IkjLsD*Y9;4MHEJ~5`)_n3$0Qmuc z1v5pGq&Lw7kx5C7z=%cg%R!cPW_7OHDaF8Rt;g0AGYzLMk;$Ua!JZrl@KlS=e;=5W zwJ}wNxcWChZXCDUI!WH(TpP(>gEtya0p`l!9`H-!cC=M^2=}Mx(^7rGceXRIkV(R2 zwFm$fKzaG)%a<)P40=>FRq8&wVvS!?arSla&~WYL2G76lIv zfZS(%)$a&7_ZYn2BNRe>h(W3)eBvQSXiiGH zpIkkx`Xb`FEt`%b+ysmiA5w$H;*}%m$&Tpy_I9P?agXB;e0#D13JmVsY0{L8hL+7) zxGino)#QMNVEwBg4hCxODj*9COaOuinB%zZ1+4Mg)sF%v${HLI)&ps??T4lWEOED@ zRrStLfKR5C%Sq<6S~r06$YNk5T!U-_h|-eO)uo8Ih4N0u+t2R6t8XodCO}m3xl((q zR9C)XrDt@@ezk8+zS?0c6tvrcQnPJoim*xl`SEe$e2Q?rucumru>inFIn=T z7ArOX)zuX}WFgfngLsxpLQ2Z*Pg}m2R5G7u&sa4))H)GFGVA6*F_g5Hr_S}bKG&4+ z#Jn(uIq$V1vdJ~1oC>dRuk;8o4uEq7#cYeUL0Z2Jsj&tf=h50wJFo-K$QntN^&B4< zcq=EDc-CxK9=Kl>3^1`TfkGr`g}ef zKxN8wu}KMeE!sZ8QS934zdP^q3hR0o~Mfzi?IgOU75IyVrt!K_uiJBk^sF8W!HcRIY%C_d*-~con_CK0*g2*Sy%~U+Kv62ux1CKF~FzTO&o+ZTOO* z=?W;Ie#1qp@^#dKkMpla=Ac{ENDb1w9biBx4K9VIx<+A4G*`+X4bs?}5KDpzrd^=;{gs>?U?KY0KZP zb>wACgtiqhE61XYh=`zL@17C`VgbYlH^N#gC@B8`F-V4Y2|+GF)@7zwCF`}$)wuO) zU@K|MEGn9AN~FD3rZMPmz6QAVl_x7XkY-6j{yJpnqOkR7#`zz~AmEakKWVenQ3Y&L zNO^3YqPZa1xuWEm-DOL@RqX-t`GI1qXq}g`q^~btXD~TuAXItPB;#h5qslryA+AWf zCJ_4ESK|q9T-s`j{VZW)qic%b+RkVp?Iou_;JN`9?bAK89?_sCkC4V`A#6<<46CVX zOzJg-Bq90Y$VUKG_j#Kw5gs1Hu?uNl`Q#d4JzER=rDP#Rg7Vte$k6KSV#m!dk`9M+ z7u&4^5f~6sy74YK9OoAI$H{43D7ZU)oQmL84iuAo|9&s{-*j(P*aLYZE+O&J=OSs2 z-DWTYK-S=2eWdcv1MY{KQ0xM<9zCyWje@nRDtm?ZXyMdB=`P6oGJ-RB+Sb?OfM{O= zmyHB;L?|jL35c}ze)ls83ks{Ls4_OqZAnTZ>***nx;)wk<&me^dMU!t!CWU+M}xiu zg{b^Rd0X=jZ@%KO`ck1=>}M4z0>sZL0&v^r_4M^cUD1NoqCfK+6ES?~82;y^gxXGeZ`vth*C__Ss0QFD;mqz~h6zh9n zU;?0X2glnlN;JFuBZ)dA)DTR@eFCi9qS&VXo4{V+B#ov!4`iflfTDULzUu?<;s&yXyx+)ok?KH#?y2((_CC3Z9GjwZUnkDi&%Y`eps` zj+~=+d7etPjH|1FWF=k*d$wlBOqY1H^@6uPRKM{E08vJGq}&`v;`ZH6$qhgg?;`~D zLMwsf9;^Paf3LFmWpqK`R~iaVcdznt9I6+JsVxN=h1O}BzF;Rm`2b)Q2bJcLVX1th zHFIez$f90Y&&}zOiwy1Kl)r#LfJh++exBJFS6zck(>kOj@0x>otF05qzPvGRIR2qg zto6+wYB3DC@(O^r@D%AU9ZooP{lK;yvwru}AcZcI4$kL#_F6_J5C|cRLnsy&7Tg?d z*RsD$l(~+I0@_J1vEc7)#|P-`H#+sTs+}i|Ww&yKe)&!a@v4Q z5Y{EetIt%~7tZ&{lk(f{7MTy5Rv`w|B_)kJLz(yY_kpCs)=0LSyVxSwROn#_J$_o6 zfL%9`C(Vhj5jVtmX|udBSBj-x4b>>gSI=DlQ`q3N)wA^+3k8LGe|usRUhEG#gC^?o zt`1vt7r|Vg)rVDhA4k37WV{?}>ePkT7-UI3z19PjfV5ZXsV@=JP>xEd6T_Ux-dS6G zP@RjnYbQ`RI@wy8oT#Fp;&*$RY%`NlmMzg@uc`HKKK0`=>>6Md1#6b3clp@qUHX6H z+KM+r5eO2;(Y$>HO{v82q(e=cEzLpmMXlIyhP#6L^EQvv+!vIsAPako_R7zGtNB|E zLbMU%{EX+@;e#im*47pilWH{;>SBi<=`&>c2Upq2W^I z5>AHEqP@L+;riy=nph|HyBkWw1HJquoQR2eKMKyemOdp%ke^yTGqEr<%PTcaW33W= z>`r)>WTCwHxR|R9vNDv9#Q*un|LEb!ykHSw7h$KT;dwz5dPv)?Fb6@UnYNuJ-qd90 z7%}~bCg1@|6JB{B)(;1**Mb5IL#tmMyb+DXD7^QB0z&$`yNAby_O>Si!-@YL>)Nmn z*dPG}P5n#-`A4gr7|!PxV1_+hzx=Fzw#GY7{jYM;Xq^wJ`rVeRnC z+c_Jx=F_gzvwVy?7nl1vn#vlxYbzVGdH29$6qaN@InvjY!9XR9^EVMZeXm#Sx3`Tg z0y6(3Uy1;!|kg-9-TD*noQmBhhnx5!A)KLI@ei2oP`P)^!M3!sJR;dwwn zs`}xTguHwecpBD_O`rhtZxS3jan@ED+zW~UfHK*5`D?$i(H(%lKpu?dc$u&Hm!6ti zScE;`F8l|Wcea|!6=X%>m*9PCPtBo_z{q&+TUj#QaxbxrYnu^Gc;Qx~q@Qj_AEvJOSwPqbCimLXzE=lGdvu z;PpM*Y(%IUsuX!I?bZKR;`;w~Y~s+(j`9`&pvpht2?}*Ufb1trr9|}K2oW~J^F8(? z^WSd)Cn>!Yi2=G7l~}k{rGsnRK$XU3EJI#g^VGM6nT3JDP%2q?Z3cukk8GcfthhW8%WszGO_GIKK5pfBvi@fS8>@RYn3;@k=iax zOSlBr&25=3mReN!K%xi%An&*KCjUw21}xM4!a##aRT}|j=so2(6iwhR33IG z>a;N*#RB~BF1#t0_v+#}F%uG2`o2&kB>Nh&mHl;gmQcrnm(P9q9Z*ZE{1u_W;N1V% znYBcxY3y%dD(C_2QZTPw*RzQtk*rt0#Zv)8z+BMWX%N-DA-Pf*%BmlpkN|nG2Gf3B zsGz8rt1E0jrt@2N6=>$11J&T<`Y*ZTe6GE$jWxk~4l@@vz)t+O%2BRSNemQ`;t=P% zuw|$zS`$@cj3FF9k;nGhh8&kI@Pwba(H8mp$S!YFC1i2ub%G`E<$mx8Gt-*S?ue-A zDl9#nixrR`Dn-tZ>PWZ4B@_9|K&Uo=+6Ka z$H_+RKJJF^@~Y>#E5?oe}58n1<)QI%)nHvfOsks

78O)9BLUvH9a`7MhzqzoeH}S8KJ{i~>hPAbfGNbu~Bfo(|n*e{m(e^^(_G zOLIuZcQ+o?Ci8 z2OQxO?@F~B?0|_TukGxO@t=<*H>dit<3$%zva*aXudaLWp%{7`{by*AwsUo|mmhW# zfS%u~xPOT2L0cHPH%v!-_|*zv6-wdc5~{-+#2T-5Ma7KEVbpWlC;MHjA+n#R*u)ZX}ZLE zf{8hyE1^D!$cHBKv_rF`8x!Pg+mZ#H{4vRaFSv|rL;h-`EB=wSe9B!N0d=$$=u0cb zi5QLPprSA|TzTKmDgR*?N#@~|gEick3(OjGEorrPN6LU7Ds$fa#^lOe;W%K6_&p_- z(7fmj+a)F?EgP=19)`~$k=+ks6JStg?LRSv>J{nz13+{e)Bv4vlm7Q)d_tY;leO5w z!(wk}p;nEJH2d$xIYO1Ty}fiST_ng=gzY=jF0QV(&x7U&U~8#yegoArO&-Z(U9hQU zam`t}`iZ$ZhY*dPNqBWJed_PfjHvEi;Y;2k?LNKA2~AfJQP*#>QD;ir=Qa!_W0zA_ z{ygvHIg%hfh|-E?b~12m{`-nm^Eo3U07aKhj9_Q;uEOG_?a}n|=YvnbNM3d;2!+SIGx)Sn<$$Re!v&kH@HLu0n={!n=2Tf-A_0 z2HaY@o?5K=e(zoH9=pen?={osp;>s_xuED7P?#+!=S2Gknk6JW$_jXI5f>A^f^ET& za2ow6?LJNHOaH(aZt@s&$RnC>HyyZ%;ORNAGXv9E%`{fOpbi{EmL zHZZris2D%2xTpv(?3{+?K!k=yknhI26INb+0F0)Wqtt9!`%P63kCcQQ5wm^YJ2P9& zR(?grCnu+P?n2>}ntFa)ycPscHr}PyORghsim%+=+ypIb^9)pVblf+ixC)hvC0&-c zw-2kUs{=dYwBFd-_9w~4;`uCFKUw(1H>*dn_7RO00q0J59<3ckE6MECI`@lAXdRPb z?+lA!=V6O>9un3ShI)VMYt#r2S>!3pPwmwFCpJvdq65jPTYeL z4==B4Fw;M_RMEEGj68(}MZU#Y7DL(Gd}k$#Ua6W-_I-h?frWFAU8Qlfrr`d;fzC}| z4?Gnf)t?Jp!5D~(p8Sb=QYP?-U$6yIDC@$S{Sl)3L(|@#9;Iw^tJ=?=n7Gr>aJ)#j z^lI^#lvjpA39}@tgUj*}%_3qh^$)QypNByAOlCuFuHdoQkZJ*sa$C{9i@ud2tha}S zk#TEtHC-qlJ{8oP!o5`S5Sw;!X$nB#>K(I>`%zw3(BD_JywucVV!NFx`x>R^qG-Cz zmD^beP(ycba(}2U0k5(@INp(O;(;PPblIbBLK(w!x*1Z{SW#~-m(j?16%&Yxt}>c* z`=*|&`ug>}_`>9QIK~|Kg@AxyzaB9#9oNw;vyeEy%}h2y7UFMNL;DGijNa{ zb33|jpMBHR;*h=qb;cu92jb8*GJ08RdJacKCRq5cqB@O6md`qrr`FD&*lnZp@34<6)XGY0G({PCbFGl70P7JztkE`&8&HZ;ZWgEA zM{~G8Milw90TA0FV>OR4?^}rG5h~tHbayMeJmYSn&sUdy8z0=yo4!r0k8`o`xo%{S zYdT>l{i;~|9PB6wyiSf6lglv{*T6&!>vXNwLD_?G z81Sf+VIPMO9hwc_-#)l}m+X^7Hl?Dk9ypXMk{o4aY%Hx#kRy|;0L#t}!y_%M@_Aq_ z$f>Fd4~^oC%8l3QpVZ{Cgh!Q?eFnyC!y?n=#EnCw>ik#b12O9x? z0fv~!8%-76>XSbMWti$Weox68&&TuDixXi<(z&{!_q|ePGe9J z3`;C7D)gq{t}YDDRBdhbP$^Ahm>BeQrYc?3*{{KR71xILoj&LiI;6>ntJw9d{Dt=P zAEr?`SX597IZsUGYKE}8o$Tc_M-Su=D<%c!zK06X2FqXszF}d3aeasL$e^aeQgY2a z5_xT#4LqIOGFWS@0&=K48M6OTOlsU1XXfgf)`7=L1S}x7#w~j-EssuqExc&}Ej)_& zImhh_(Dgqz=jAk!3kndvnJJ(&y9a8Z=Al65DPI}Q(m5wYpA(&sW%X!BbnlW zE-JnCm0Qb$F|u9bm~PUZ6VX^p1GWb$&$a8V`1`)20ye7Y zMtRrIx{9sBqJgpgzP<*xQybrRSMMjLfk4+##K5dV5EuWE(I$OP-$;gJ5IZ9H#-h7i z*zI(fYrHs2C22>G^dZ$|apqfQL?++@A!74Fgxy?K_X^logLb;{y8IqKJ*RWV*-@yZ z885jszVgS71PV&W!smmTQkjqzLHjYXi!Z>vG_z(n_eU5C3dvu1dA4-WYCIv!@Swxq zrLCx@bQ~mw&+|#_R8-TewQ~F3zB2%Tl9L}HiyML^Ws7F^h(>f`>bfMu-2`A1Bxf2e z_iUAX4VJ$@UrDzOqmY)WK?J+lZjArU_c0eAsV8|zdO>33 zmxF2K6Rf7{^ZjeqlK2;zJT8?T)@IldbhBr$sm#2uVOOhDEV?sb39~)>nSL3DM!~DKr~(Vm#RuoFAKEbQXJT9a|df*-oNXmE@N7_k8f%GmG|EsBTq~ zh)5GChpvyd`XA^3bbj47Bgvu9KCYR?BdqIY7uBe%qO{w^`010qR1xdV`d$KUb`%s$ za%qV-Y7WZ7Iek%{xHnB@J%|k5l4g&h<~Nnvuw>!GL*F1XeyZlPgNi+uOh`zcZN5q0 z#qxUDJEwj@9Yip48aIGBTTW^{k63*6sRt;h?d)jk>MRYW#-6}?_=vwlo z{+=6$*KED#mgC|^1)_zjDQ+%5t5Wy!X%KY;Y6lRFauuW-m}(7a5+cn!JvltIxmIbh zKW+SUID>pP>VMz=p*->>QXWoYE^DrH+OLkna~l1*l4Fha9fr@};+_ml!q<*Lm` z8Qf>B&a3QEDj%PGL=hhUJG}G7q64@CKw9|ovVG5UhiPURnd&2)b}V-1H0`qWo6XlI za+*{V9TltroN3~(s)k0h5pwY94*cYkCbADQNc{+u^$KQc9sCz%q58HpEUbqOw#WRj z$+$=<_&V?0CnYCq>8D@Oz^7h6{L&37SSWd3cfgLc`}c9dUtZ{s?_l2y&jA?k|LDOq zgp7=gp#P@#u(%M=!(Qz6@tOWBpvGgNuu6Z(lJk@MV3tllNCk3&3O!8zcc< zJ3#KF#e%4{!DQzGv=)@K=?H>|^B#nCE`55JsHu;MiRohR{CxQB?OmmX-R>$#A+eV( zOwS$@nV~W=${HChwFeQLY>oSy6a51K?E`|iwDSCkDJ;+M*aw7oc#7-m>WXy_sfJ(O zok0p*qx%&qSioy5E2F;VSPW+PhGQet{-BA>eKSYBI|HGyv2kgG>-Y9WDDpb?s|k?l zo9D4kuxF3#Tw=#G_yvab2xT;;{)+=EE31^&5PD@iL!056g08O^_ApA`EeKL?ePnXy zcdP%CN_78Lc23TQAIY#0O#IvH^Z1QRqiP-SwK~0AVKP$+m&T97LHxGFNKQ!T^pc+c zeXymn1ugtjZe)Z)2Q6EbSS(=at@AmBr8r@r6Pa-eHfRp1+!$>7po8gNF9(Q54K+2k z0Xtx&eu+h9_}~9~KA1f_>~G;Cd-{NRZF`#iWC9^4uk-=@PO>@(`mZlAcVuLRE`Jve zA0F5;cyg$oAj#M>s8XBg^g0JJV-IX;SdObc!kJhR2_&rScaN9=Bh863(AJ34z%gmt zo-B9hFME<6oe16Qu~w#Z9QlsHSAZ2e1^A_*`DnM#;(F0`(c#N*$JzVYFA)f=vNa#g!oSCYLi7_Ylo7?+Oj*ge#DXdOydWF3_N5Emyw)7W){l|%d ztc;&$Nk-jvW~keTys&<&_N1AzXxg1_MNID|y7wD-xKY!#g(OqS(m>Zgn;Q+!$Tth< zYs@VhgL|2BXtcEQ0AOE9UWv}2NTrYyxBv5}i9gRRY2+sHV`)DMUEagqYN1?t4wIk2 zrDFTMe@scZYRuY5M&=Q+#w~2&@jWP_GxxL6OO;glzF8-jBBOT_ z1IsmsgR5E&WZG`I4wOVV{&Oel2lMxaRUjn`oh<&E!q{sR!8&$yL7Q@NKk8k_DxVZi zv6sES&py6C6T&Xrq|+#gwg^ zUuV&jRSrMP%bk95WC%%mI0#AEn!34aipk}0X|hYtraxR-9%o*3h`KJPBp?uLLC1nX z$m(-K%%z(?J-wYmCJ<)kWHWrL%m2(?_W4ofI4r5&V2#;ilh-7vFd%w-TUV;a<8ly% z_OmBs5ux0`B8-saFTNJfskPWTe%RYPQvC)y4y;wC?<*?@ZX%nB!)#w7G;xFKPCP|m zIU@)j5rd=U_=Q58e-x!~*0ObaOnV1ef4z4^=Nq4e-o*5YN zf7SlyD$W=~L(nE^k%z`m&t$i#$pt>fIo{nKpO40HyBbvp3DpDdAGn;#FmO4-| zF@EG^{|OFJ%_)(=mN_ttmD=uM`m#q(SSHk)N-aUl(9A>ASn09)t^JW*wk;X=P;6?A z=|b&3c7S9LE;IAF1L_-(obsXn-0o*mrOOzI{De zva6enHw@$Ssu{&D|&{CWVFe9hXpyQ!?B6Re@w@QIHM)S7~i)N*X@R$IbvV&Rs& zSY<@9L<2NBET@a-_6bVl61Q)=#|wfWU4aG-wRuziZ=_p)}|Fdo1ZZaq+__t>S z$jaBZqk*Dy?|&YALLq{8ORz!7d*n;)_B5(Kq*TQs6pL@ymSi6KuvZp&-TC}3~pWN=#iP*Z;T^p#(i-WPqx7F}?hrA}rt>?j~D@2t2i z9fWANV}s(F5BhIsaX&IH+sjSKTvRx?*s6aBuXO1%)N0bvF%Xjt0A@c}>rzi?U;>{R zq)&cOL48{nh)9Uu53p)Dkkf2<*}o@5;1gi34-XFv{J8t@qW}pGmk#e@!Bg2F8TBe^ zbFGLQOS3Tzo~KfdJ2IhHFRqt%26ui{b2Dpe-EpdQoodq9%yi7OTyu`3vm2|`=w)Sx zbUvmLAvR>y%jj3+{M_bvIs4b{KAarmv2W+p@&Vj*xv6@zPt5yKBFX|4XNFSVsp0@PklZ*F;4Ly{kQHK%?}>@D-cH=!a<+kciK+n&y3ZfA9Ql zbU)0rAPULD$(<9LK8kQyeF@sb~y-F55ECWcO)`r j2;K$0hI*SQJwS2pHt&%pu8IKvL6MeJkSGx|@cw@QHEIAj literal 52350 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 diff --git a/res/css/views/rooms/_E2EIcon.pcss b/res/css/views/rooms/_E2EIcon.pcss index 7dd0aa476dd..97db1959a48 100644 --- a/res/css/views/rooms/_E2EIcon.pcss +++ b/res/css/views/rooms/_E2EIcon.pcss @@ -13,6 +13,10 @@ Please see LICENSE files in the repository root for full details. display: block; } +.mx_E2EIcon.mx_E2EIcon_inline { + display: inline-block; +} + .mx_E2EIcon_warning, .mx_E2EIcon_normal, .mx_E2EIcon_verified { diff --git a/src/components/views/dialogs/DevtoolsDialog.tsx b/src/components/views/dialogs/DevtoolsDialog.tsx index 094e685fc92..e7c1092e6af 100644 --- a/src/components/views/dialogs/DevtoolsDialog.tsx +++ b/src/components/views/dialogs/DevtoolsDialog.tsx @@ -18,6 +18,7 @@ import SettingExplorer from "./devtools/SettingExplorer"; import { RoomStateExplorer } from "./devtools/RoomState"; import BaseTool, { DevtoolsContext, type IDevtoolsProps } from "./devtools/BaseTool"; import WidgetExplorer from "./devtools/WidgetExplorer"; +import { UserList } from "./devtools/Users"; import { AccountDataExplorer, RoomAccountDataExplorer } from "./devtools/AccountData"; import SettingsFlag from "../elements/SettingsFlag"; import { SettingLevel } from "../../../settings/SettingLevel"; @@ -46,6 +47,7 @@ const Tools: Record = { [_td("devtools|view_servers_in_room"), ServersInRoom], [_td("devtools|notifications_debug"), RoomNotifications], [_td("devtools|active_widgets"), WidgetExplorer], + [_td("devtools|users"), UserList], ], [Category.Other]: [ [_td("devtools|explore_account_data"), AccountDataExplorer], diff --git a/src/components/views/dialogs/devtools/Users.tsx b/src/components/views/dialogs/devtools/Users.tsx new file mode 100644 index 00000000000..258264c7ba5 --- /dev/null +++ b/src/components/views/dialogs/devtools/Users.tsx @@ -0,0 +1,356 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +/** + * @file Devtool for viewing room members and their devices. + */ + +import React, { type JSX, useContext, useState } from "react"; +import { type Device, type RoomMember } from "matrix-js-sdk/src/matrix"; +import { type CryptoApi } from "matrix-js-sdk/src/crypto-api"; + +import { _t } from "../../../../languageHandler"; +import BaseTool, { DevtoolsContext, type IDevtoolsProps } from "./BaseTool"; +import FilteredList from "./FilteredList"; +import LabelledToggleSwitch from "../../elements/LabelledToggleSwitch"; +import { useAsyncMemo } from "../../../../hooks/useAsyncMemo"; +import CopyableText from "../../elements/CopyableText"; +import E2EIcon from "../../rooms/E2EIcon"; +import { E2EStatus } from "../../../../utils/ShieldUtils"; + +/** + * Replacement function for `` tags in translation strings. + */ +function i(sub: string): JSX.Element { + return {sub}; +} + +/** + * Shows a list of users in the room, and allows selecting a user to view. + * + * By default, filters to only show joined users. + * + * If the `member` state is set, delegates to `User` to view a single user. + */ +export const UserList: React.FC> = ({ onBack }) => { + const context = useContext(DevtoolsContext); + const [query, setQuery] = useState(""); + // Show only joined users or all users with member events? + const [showOnlyJoined, setShowOnlyJoined] = useState(true); + // The `RoomMember` for the selected user (if any) + const [member, setMember] = useState(null); + + if (member) { + const _onBack = (): void => { + setMember(null); + }; + return ; + } + + const members = showOnlyJoined ? context.room.getJoinedMembers() : context.room.getMembers(); + + return ( + + + {members.map((member) => ( + setMember(member)} /> + ))} + + + + ); +}; + +interface UserButtonProps { + member: RoomMember; + onClick(): void; +} + +/** + * Button to select a user to view. + */ +const UserButton: React.FC = ({ member, onClick }) => { + return ( + + ); +}; + +interface UserProps extends Pick { + member: RoomMember; +} + +/** + * Shows a single user to view, and allows selecting a device to view. + * + * If the `device` state is set, delegates to `Device` to show a single device. + */ +const UserView: React.FC = ({ member, onBack }) => { + const context = useContext(DevtoolsContext); + const crypto = context.room.client.getCrypto(); + const verificationStatus = useAsyncMemo( + async () => { + if (!crypto) { + return null; + } + const status = await crypto.getUserVerificationStatus(member.userId); + if (status.isCrossSigningVerified()) { + const e2eIcon = (): JSX.Element => ( + + ); + return _t("devtools|user_verification_status|verified", {}, { E2EIcon: e2eIcon }); + } else if (status.wasCrossSigningVerified()) { + const e2eIcon = (): JSX.Element => ( + + ); + return _t("devtools|user_verification_status|was_verified", {}, { E2EIcon: e2eIcon }); + } else if (status.needsUserApproval) { + const e2eIcon = (): JSX.Element => ( + + ); + return _t("devtools|user_verification_status|identity_changed", {}, { E2EIcon: e2eIcon }); + } else { + const e2eIcon = (): JSX.Element => ( + + ); + return _t("devtools|user_verification_status|unverified", {}, { E2EIcon: e2eIcon }); + } + }, + [context], + _t("common|loading"), + ); + const devices = useAsyncMemo( + async () => { + const devices = await crypto?.getUserDeviceInfo([member.userId]); + return devices?.get(member.userId) ?? new Map(); + }, + [context], + new Map(), + ); + // The device to show, if any. + const [device, setDevice] = useState(null); + + if (device) { + const _onBack = (): void => { + setDevice(null); + }; + return ; + } + + const avatarUrl = member.getMxcAvatarUrl(); + const memberEventContent = member.events.member?.getContent(); + + return ( + +

    +
  • + member.userId} border={false}> + {_t("devtools|user_id", { userId: member.userId })} + +
  • +
  • {_t("devtools|user_room_membership", { membership: member.membership ?? "leave" })}
  • +
  • + {memberEventContent && "displayname" in memberEventContent + ? _t("devtools|user_displayname", { displayname: member.rawDisplayName }) + : _t("devtools|user_no_displayname", {}, { i })} +
  • +
  • + {avatarUrl !== undefined ? ( + avatarUrl} border={false}> + {_t("devtools|user_avatar", { avatar: avatarUrl })} + + ) : ( + _t("devtools|user_no_avatar", {}, { i }) + )} +
  • +
  • {verificationStatus}
  • +
+
+

{_t("devtools|devices")}

+
    + {Array.from(devices.values()).map((device) => ( +
  • + setDevice(device)} /> +
  • + ))} +
+
+ + ); +}; + +interface DeviceButtonProps { + crypto: CryptoApi; + device: Device; + onClick(): void; +} + +/** + * Button to select a user to view. + */ +const DeviceButton: React.FC = ({ crypto, device, onClick }) => { + const verificationIcon = useAsyncMemo( + async () => { + const status = await crypto.getDeviceVerificationStatus(device.userId, device.deviceId); + if (!status) { + return; + } else if (status.crossSigningVerified) { + return ( + + ); + } else if (status.signedByOwner) { + return ( + + ); + } else { + return ( + + ); + } + }, + [], + null, + ); + return ( + + ); +}; + +interface DeviceProps extends Pick { + crypto: CryptoApi; + device: Device; +} + +/** + * Show a single device to view. + */ +const DeviceView: React.FC = ({ crypto, device, onBack }) => { + const verificationStatus = useAsyncMemo( + async () => { + const status = await crypto.getDeviceVerificationStatus(device.userId, device.deviceId); + if (!status) { + // `status` will be `null` if the device is unknown or if the + // device doesn't have device keys. In either case, it's not a + // security issue since we won't be sending it decryption keys. + return _t("devtools|device_verification_status|unknown"); + } else if (status.crossSigningVerified) { + const e2eIcon = (): JSX.Element => ( + + ); + return _t("devtools|device_verification_status|verified", {}, { E2EIcon: e2eIcon }); + } else if (status.signedByOwner) { + const e2eIcon = (): JSX.Element => ( + + ); + return _t("devtools|device_verification_status|signed_by_owner", {}, { E2EIcon: e2eIcon }); + } else { + const e2eIcon = (): JSX.Element => ( + + ); + return _t("devtools|device_verification_status|unverified", {}, { E2EIcon: e2eIcon }); + } + }, + [], + _t("common|loading"), + ); + + const keyIdSuffix = ":" + device.deviceId; + const deviceKeys = ( +
    + {Array.from(device.keys.entries()).map(([keyId, key]) => { + if (keyId.endsWith(keyIdSuffix)) { + return ( +
  • + key} border={false}> + {keyId.slice(0, -keyIdSuffix.length)}: {key} + +
  • + ); + } else { + return ( +
  • + {_t("devtools|invalid_device_key_id")}: {keyId}: {key} +
  • + ); + } + })} +
+ ); + + return ( + +
    +
  • + device.userId} border={false}> + {_t("devtools|user_id", { userId: device.userId })} + +
  • +
  • + device.deviceId} border={false}> + {_t("devtools|device_id", { deviceId: device.deviceId })} + +
  • +
  • + {"displayName" in device + ? _t("devtools|user_displayname", { displayname: device.displayName }) + : _t("devtools|user_no_displayname", {}, { i })} +
  • +
  • {verificationStatus}
  • +
  • + {device.dehydrated ? _t("devtools|device_dehydrated_yes") : _t("devtools|device_dehydrated_no")} +
  • +
  • + {_t("devtools|device_keys")} + {deviceKeys} +
  • +
+
+ ); +}; diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 00ac3eb1168..c2616ecd943 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -806,6 +806,17 @@ }, "developer_mode": "Developer mode", "developer_tools": "Developer Tools", + "device_dehydrated_no": "Dehydrated: No", + "device_dehydrated_yes": "Dehydrated: Yes", + "device_id": "Device ID: %(deviceId)s", + "device_keys": "Device keys", + "device_verification_status": { + "signed_by_owner": "Verification status: Signed by owner", + "unknown": "Verification status: Unknown", + "unverified": "Verification status: Not signed by owner", + "verified": "Verification status: Verified by cross-signing" + }, + "devices": "Devices", "edit_setting": "Edit setting", "edit_values": "Edit values", "empty_string": "", @@ -821,6 +832,7 @@ "failed_to_save": "Failed to save settings.", "failed_to_send": "Failed to send event!", "id": "ID: ", + "invalid_device_key_id": "Invalid device key ID", "invalid_json": "Doesn't look like valid JSON.", "level": "Level", "low_bandwidth_mode": "Low bandwidth mode", @@ -831,6 +843,7 @@ "notification_state": "Notification state is %(notificationState)s", "notifications_debug": "Notifications debug", "number_of_users": "Number of users", + "only_joined_members": "Only joined users", "original_event_source": "Original event source", "room_encrypted": "Room is encrypted ✅", "room_id": "Room ID: %(roomId)s", @@ -877,10 +890,23 @@ "toggle_event": "toggle event", "toolbox": "Toolbox", "use_at_own_risk": "This UI does NOT check the types of the values. Use at your own risk.", + "user_avatar": "Avatar: %(avatar)s", + "user_displayname": "Displayname: %(displayname)s", + "user_id": "User ID: %(userId)s", + "user_no_avatar": "Avatar: None", + "user_no_displayname": "Displayname: None", "user_read_up_to": "User read up to: ", "user_read_up_to_ignore_synthetic": "User read up to (ignoreSynthetic): ", "user_read_up_to_private": "User read up to (m.read.private): ", "user_read_up_to_private_ignore_synthetic": "User read up to (m.read.private;ignoreSynthetic): ", + "user_room_membership": "Membership: %(membership)s", + "user_verification_status": { + "identity_changed": "Verification status: Unverified, and identity changed", + "unverified": "Verification status: Unverified", + "verified": "Verification status: Verified", + "was_verified": "Verification status: Was verified, but identity changed" + }, + "users": "Users", "value": "Value", "value_colon": "Value:", "value_in_this_room": "Value in this room", diff --git a/test/unit-tests/components/views/dialogs/__snapshots__/DevtoolsDialog-test.tsx.snap b/test/unit-tests/components/views/dialogs/__snapshots__/DevtoolsDialog-test.tsx.snap index 9913c2cd870..0f577eb5017 100644 --- a/test/unit-tests/components/views/dialogs/__snapshots__/DevtoolsDialog-test.tsx.snap +++ b/test/unit-tests/components/views/dialogs/__snapshots__/DevtoolsDialog-test.tsx.snap @@ -83,6 +83,11 @@ exports[`DevtoolsDialog renders the devtools dialog 1`] = ` > Active Widgets +

", () => { + let matrixClient: MatrixClient; + beforeEach(() => { + matrixClient = createTestClient(); + }); + + it("should render a user list", () => { + const room = new Room("!roomId", matrixClient, userId, { + pendingEventOrdering: PendingEventOrdering.Detached, + }); + room.getJoinedMembers = jest.fn().mockReturnValue([]); + + const { asFragment } = render( + + + {}} /> + + , + ); + expect(asFragment()).toMatchSnapshot(); + }); + + it("should render a single user", async () => { + const room = new Room("!roomId", matrixClient, userId, { + pendingEventOrdering: PendingEventOrdering.Detached, + }); + + const alice = new RoomMember("!roomId", userId); + alice.setMembershipEvent( + new MatrixEvent({ + content: { + membership: "join", + }, + state_key: userId, + room_id: "!roomId", + type: "m.room.member", + sender: userId, + }), + ); + room.getJoinedMembers = jest.fn().mockReturnValue([alice]); + + mocked(matrixClient.getCrypto()!.getUserVerificationStatus).mockResolvedValue({ + isCrossSigningVerified: jest.fn().mockReturnValue(true), + wasCrossSigningVerified: jest.fn().mockReturnValue(true), + needsUserApproval: false, + } as unknown as UserVerificationStatus); + mocked(matrixClient.getCrypto()!.getUserDeviceInfo).mockResolvedValue( + new Map([ + [ + userId, + new Map([ + [ + "VERIFIED", + new Device({ + deviceId: "VERIFIED", + userId: userId, + algorithms: [], + keys: new Map([ + ["ed25519:VERIFIED", "an_ed25519_public_key"], + ["curve25519:VERIFIED", "a_curve25519_public_key"], + ]), + }), + ], + [ + "SIGNED", + new Device({ + deviceId: "SIGNED", + userId: userId, + algorithms: [], + keys: new Map([ + ["ed25519:SIGNED", "an_ed25519_public_key"], + ["curve25519:SIGNED", "a_curve25519_public_key"], + ]), + }), + ], + [ + "UNSIGNED", + new Device({ + deviceId: "UNSIGNED", + userId: userId, + algorithms: [], + keys: new Map([ + ["ed25519:UNSIGNED", "an_ed25519_public_key"], + ["curve25519:UNSIGNED", "a_curve25519_public_key"], + ]), + }), + ], + ]), + ], + ]), + ); + mocked(matrixClient.getCrypto()!.getDeviceVerificationStatus).mockImplementation( + async (userId: string, deviceId: string) => { + switch (deviceId) { + case "VERIFIED": + return { + signedByOwner: true, + crossSigningVerified: true, + } as unknown as DeviceVerificationStatus; + case "SIGNED": + return { + signedByOwner: true, + crossSigningVerified: false, + } as unknown as DeviceVerificationStatus; + case "UNSIGNED": + return { + signedByOwner: false, + crossSigningVerified: false, + } as unknown as DeviceVerificationStatus; + default: + return null; + } + }, + ); + + const { asFragment } = render( + + + {}} /> + + , + ); + + screen.getByRole("button", { name: userId }).click(); + + await waitFor(() => expect(screen.getByText(/Verification status:/)).toHaveTextContent(/Verified/)); + await waitFor(() => expect(screen.getByRole("button", { name: "VERIFIED" })).toBeInTheDocument()); + + expect(asFragment()).toMatchSnapshot(); + }); + + it("should render a single device - verified by cross-signing", async () => { + const room = new Room("!roomId", matrixClient, userId, { + pendingEventOrdering: PendingEventOrdering.Detached, + }); + + const alice = new RoomMember("!roomId", userId); + alice.setMembershipEvent( + new MatrixEvent({ + content: { + membership: "join", + }, + state_key: userId, + room_id: "!roomId", + type: "m.room.member", + sender: userId, + }), + ); + room.getJoinedMembers = jest.fn().mockReturnValue([alice]); + + mocked(matrixClient.getCrypto()!.getUserVerificationStatus).mockResolvedValue({ + isCrossSigningVerified: jest.fn().mockReturnValue(true), + wasCrossSigningVerified: jest.fn().mockReturnValue(true), + needsUserApproval: false, + } as unknown as UserVerificationStatus); + mocked(matrixClient.getCrypto()!.getUserDeviceInfo).mockResolvedValue( + new Map([ + [ + userId, + new Map([ + [ + "VERIFIED", + new Device({ + deviceId: "VERIFIED", + userId: userId, + algorithms: [], + keys: new Map([ + ["ed25519:VERIFIED", "an_ed25519_public_key"], + ["curve25519:VERIFIED", "a_curve25519_public_key"], + ]), + }), + ], + ]), + ], + ]), + ); + mocked(matrixClient.getCrypto()!.getDeviceVerificationStatus).mockResolvedValue({ + signedByOwner: true, + crossSigningVerified: true, + } as unknown as DeviceVerificationStatus); + + const { asFragment } = render( + + + {}} /> + + , + ); + + screen.getByRole("button", { name: userId }).click(); + + await waitFor(() => expect(screen.getByRole("button", { name: "VERIFIED" })).toBeInTheDocument()); + screen.getByRole("button", { name: "VERIFIED" }).click(); + + await waitFor(() => + expect(screen.getByText(/Verification status:/)).toHaveTextContent(/Verified by cross-signing/), + ); + + expect(asFragment()).toMatchSnapshot(); + }); + + it("should render a single device - signed by owner", async () => { + const room = new Room("!roomId", matrixClient, userId, { + pendingEventOrdering: PendingEventOrdering.Detached, + }); + + const alice = new RoomMember("!roomId", userId); + alice.setMembershipEvent( + new MatrixEvent({ + content: { + membership: "join", + }, + state_key: userId, + room_id: "!roomId", + type: "m.room.member", + sender: userId, + }), + ); + room.getJoinedMembers = jest.fn().mockReturnValue([alice]); + + mocked(matrixClient.getCrypto()!.getUserVerificationStatus).mockResolvedValue({ + isCrossSigningVerified: jest.fn().mockReturnValue(true), + wasCrossSigningVerified: jest.fn().mockReturnValue(true), + needsUserApproval: false, + } as unknown as UserVerificationStatus); + mocked(matrixClient.getCrypto()!.getUserDeviceInfo).mockResolvedValue( + new Map([ + [ + userId, + new Map([ + [ + "SIGNED", + new Device({ + deviceId: "SIGNED", + userId: userId, + algorithms: [], + keys: new Map([ + ["ed25519:SIGNED", "an_ed25519_public_key"], + ["curve25519:SIGNED", "a_curve25519_public_key"], + ]), + }), + ], + ]), + ], + ]), + ); + mocked(matrixClient.getCrypto()!.getDeviceVerificationStatus).mockResolvedValue({ + signedByOwner: true, + crossSigningVerified: false, + } as unknown as DeviceVerificationStatus); + + const { asFragment } = render( + + + {}} /> + + , + ); + + screen.getByRole("button", { name: userId }).click(); + + await waitFor(() => expect(screen.getByRole("button", { name: "SIGNED" })).toBeInTheDocument()); + screen.getByRole("button", { name: "SIGNED" }).click(); + + await waitFor(() => expect(screen.getByText(/Verification status:/)).toHaveTextContent(/Signed by owner/)); + + expect(asFragment()).toMatchSnapshot(); + }); + + it("should render a single device - unsigned", async () => { + const room = new Room("!roomId", matrixClient, userId, { + pendingEventOrdering: PendingEventOrdering.Detached, + }); + + const alice = new RoomMember("!roomId", userId); + alice.setMembershipEvent( + new MatrixEvent({ + content: { + membership: "join", + }, + state_key: userId, + room_id: "!roomId", + type: "m.room.member", + sender: userId, + }), + ); + room.getJoinedMembers = jest.fn().mockReturnValue([alice]); + + mocked(matrixClient.getCrypto()!.getUserVerificationStatus).mockResolvedValue({ + isCrossSigningVerified: jest.fn().mockReturnValue(true), + wasCrossSigningVerified: jest.fn().mockReturnValue(true), + needsUserApproval: false, + } as unknown as UserVerificationStatus); + mocked(matrixClient.getCrypto()!.getUserDeviceInfo).mockResolvedValue( + new Map([ + [ + userId, + new Map([ + [ + "UNSIGNED", + new Device({ + deviceId: "UNSIGNED", + userId: userId, + algorithms: [], + keys: new Map([ + ["ed25519:UNSIGNED", "an_ed25519_public_key"], + ["curve25519:UNSIGNED", "a_curve25519_public_key"], + ]), + verified: DeviceVerification.Verified, + }), + ], + ]), + ], + ]), + ); + mocked(matrixClient.getCrypto()!.getDeviceVerificationStatus).mockResolvedValue({ + signedByOwner: false, + crossSigningVerified: false, + } as unknown as DeviceVerificationStatus); + + const { asFragment } = render( + + + {}} /> + + , + ); + + screen.getByRole("button", { name: userId }).click(); + + await waitFor(() => expect(screen.getByText(/Verification status:/)).toHaveTextContent(/Verified/)); + + await waitFor(() => expect(screen.getByRole("button", { name: "UNSIGNED" })).toBeInTheDocument()); + screen.getByRole("button", { name: "UNSIGNED" }).click(); + + await waitFor(() => expect(screen.getByText(/Verification status:/)).toHaveTextContent(/Not signed by owner/)); + + expect(asFragment()).toMatchSnapshot(); + }); +}); diff --git a/test/unit-tests/components/views/dialogs/devtools/__snapshots__/Users-test.tsx.snap b/test/unit-tests/components/views/dialogs/devtools/__snapshots__/Users-test.tsx.snap new file mode 100644 index 00000000000..99af0c04ce6 --- /dev/null +++ b/test/unit-tests/components/views/dialogs/devtools/__snapshots__/Users-test.tsx.snap @@ -0,0 +1,454 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[` should render a single device - signed by owner 1`] = ` + +
+
    +
  • +
    + User ID: @alice:example.com +
    +
    +
  • +
  • +
    + Device ID: SIGNED +
    +
    +
  • +
  • + Displayname: +
  • +
  • + + Verification status: +
    + Signed by owner + +
  • +
  • + Dehydrated: No +
  • +
  • + Device keys +
      +
    • +
      + ed25519: an_ed25519_public_key +
      +
      +
    • +
    • +
      + curve25519: a_curve25519_public_key +
      +
      +
    • +
    +
  • +
+
+
+ +
+
+`; + +exports[` should render a single device - unsigned 1`] = ` + +
+
    +
  • +
    + User ID: @alice:example.com +
    +
    +
  • +
  • +
    + Device ID: UNSIGNED +
    +
    +
  • +
  • + Displayname: +
  • +
  • + + Verification status: +
    +
    +
    + Not signed by owner + +
  • +
  • + Dehydrated: No +
  • +
  • + Device keys +
      +
    • +
      + ed25519: an_ed25519_public_key +
      +
      +
    • +
    • +
      + curve25519: a_curve25519_public_key +
      +
      +
    • +
    +
  • +
+
+
+ +
+
+`; + +exports[` should render a single device - verified by cross-signing 1`] = ` + +
+
    +
  • +
    + User ID: @alice:example.com +
    +
    +
  • +
  • +
    + Device ID: VERIFIED +
    +
    +
  • +
  • + Displayname: +
  • +
  • + + Verification status: +
    +
    +
    + Verified by cross-signing + +
  • +
  • + Dehydrated: No +
  • +
  • + Device keys +
      +
    • +
      + ed25519: an_ed25519_public_key +
      +
      +
    • +
    • +
      + curve25519: a_curve25519_public_key +
      +
      +
    • +
    +
  • +
+
+
+ +
+
+`; + +exports[` should render a single user 1`] = ` + +
+
    +
  • +
    + User ID: @alice:example.com +
    +
    +
  • +
  • + Membership: join +
  • +
  • + + Displayname: + + None + + +
  • +
  • + + Avatar: + + None + + +
  • +
  • + + Verification status: +
    +
    +
    + Verified + +
  • +
+
+

+ Devices +

+
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
+
+
+
+ +
+
+`; + +exports[` should render a user list 1`] = ` + +
+
+ + +
+ No results found +
+ +
+ Only joined users +
+
+
+
+
+
+
+
+ +
+ +`; From 26cb5cb3412a82a20f7d2dc094ad165425b6e9b9 Mon Sep 17 00:00:00 2001 From: Hubert Chathi Date: Thu, 9 Oct 2025 10:05:57 -0400 Subject: [PATCH 2/2] show number of devices --- src/components/views/dialogs/devtools/Users.tsx | 2 +- src/i18n/strings/en_EN.json | 2 +- .../views/dialogs/devtools/__snapshots__/Users-test.tsx.snap | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/views/dialogs/devtools/Users.tsx b/src/components/views/dialogs/devtools/Users.tsx index 258264c7ba5..1bca92519fc 100644 --- a/src/components/views/dialogs/devtools/Users.tsx +++ b/src/components/views/dialogs/devtools/Users.tsx @@ -190,7 +190,7 @@ const UserView: React.FC = ({ member, onBack }) => {
  • {verificationStatus}
  • -

    {_t("devtools|devices")}

    +

    {_t("devtools|devices", { count: devices.size })}

      {Array.from(devices.values()).map((device) => (
    • diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index c2616ecd943..ddc22f3eb1d 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -816,7 +816,7 @@ "unverified": "Verification status: Not signed by owner", "verified": "Verification status: Verified by cross-signing" }, - "devices": "Devices", + "devices": "Devices (%(count)s)", "edit_setting": "Edit setting", "edit_values": "Edit values", "empty_string": "", diff --git a/test/unit-tests/components/views/dialogs/devtools/__snapshots__/Users-test.tsx.snap b/test/unit-tests/components/views/dialogs/devtools/__snapshots__/Users-test.tsx.snap index 99af0c04ce6..c1b9071fb64 100644 --- a/test/unit-tests/components/views/dialogs/devtools/__snapshots__/Users-test.tsx.snap +++ b/test/unit-tests/components/views/dialogs/devtools/__snapshots__/Users-test.tsx.snap @@ -336,7 +336,7 @@ exports[` should render a single user 1`] = `

    - Devices + Devices (3)