From f57272cf42df73b851853f0a16fc9f7c8fa70a12 Mon Sep 17 00:00:00 2001 From: FearlessTobi Date: Thu, 6 Jul 2023 18:30:02 +0200 Subject: [PATCH] article: Address review comments pt. 2 --- .../citra-progress-report-2023-q2/index.md | 35 ++++++++---------- .../citra-progress-report-2023-q2/lle.png | Bin 6778 -> 0 bytes 2 files changed, 16 insertions(+), 19 deletions(-) delete mode 100644 site/content/entry/citra-progress-report-2023-q2/lle.png diff --git a/site/content/entry/citra-progress-report-2023-q2/index.md b/site/content/entry/citra-progress-report-2023-q2/index.md index 1c71f16..fe9719e 100644 --- a/site/content/entry/citra-progress-report-2023-q2/index.md +++ b/site/content/entry/citra-progress-report-2023-q2/index.md @@ -46,7 +46,7 @@ This means that the old workarounds required to get the HOME Menu to boot are no {{< mp4 src="eula.mp4" >}} -## Add option to configure to download system files from Nintendo Update Service ([#6269](https://github.com/citra-emu/citra/pull/6269), [#6356](https://github.com/citra-emu/citra/pull/6356)) by [Steveice10](https://github.com/Steveice10) and [B3n30](https://github.com/B3n30) +### Add option to configure to download system files from Nintendo Update Service ([#6269](https://github.com/citra-emu/citra/pull/6269), [#6356](https://github.com/citra-emu/citra/pull/6356)) by [Steveice10](https://github.com/Steveice10) and [B3n30](https://github.com/B3n30) With the goal of making the HOME menu fully accessible in mind, Steveice10’s work began. However, before any accuracy improvements could be made, there was the matter of the accessibility of the HOME Menu. Dumping the 3DS System NAND for use in Citra was, relatively speaking, a cumbersome process. @@ -81,9 +81,6 @@ Without this service properly implemented, Citra would exhibit strange glitches, Citra did, in fact, have a portion of this module semi-implemented in the past, but it wasn’t exactly put to good use. Back in 2017, Citra developer Subv added the [CheckForSysUpdateEvent syscall](https://github.com/citra-emu/citra/pull/2974), which allowed the HOME Menu to boot. However, doing anything other than just looking at the pretty background would softlock the emulator. One of the caveats of this addition was that the LLE NIM applet, used for handling title installations as mentioned above, needed to be enabled from the debugging menu, which wasn’t very user-friendly or obvious. -{{< figure src="lle.png" - title="" >}} - To address this issue, Steveice10 implemented stubs for the nim:u service based on their own reverse engineering work of the 3DS. All the information they uncovered has been added to [3dbrew](https://www.3dbrew.org/wiki/NIM_Services) to contribute to the ongoing effort to better understand the 3DS’s operating system. Feel free to take a look if you’re interested in the dark arts of HLE emulator development! @@ -104,7 +101,7 @@ Instead of returning an empty list of tickets, we can pretend that any installed Currently, only .cia (CTR Importable Archive) installed titles are detected by the HOME Menu. If you would like to try this out in Citra yourself, make sure your games are dumped as .cia files and installed into Citra via `File > Install CIA…`. Other files, such as .3ds and .cxi, still need to be launched from the Citra game list as normal. -## Fix HLE applet pre-start lifecycle ([#6362](https://github.com/citra-emu/citra/pull/6362)) by [Steveice10](https://github.com/Steveice10) +### Fix HLE applet pre-start lifecycle ([#6362](https://github.com/citra-emu/citra/pull/6362)) by [Steveice10](https://github.com/Steveice10) So far, we’ve discussed using the HOME Menu, launching games and applets from it, and completing the system setup process. However, it feels as though we’re forgetting about something… @@ -124,7 +121,7 @@ You can now say goodbye to wasting time trying to find the correct app name, as But this doesn’t mean that our work is done, far from it. Steveice10 has added a very early approximation of DSP sleep, so that apps will not hang while trying to sleep the DSP when suspending titles. However, some games, such as Pokémon X, may still get stuck on this or exhibit annoying audio artifacts in the process. Some apps (e.g. Super Mario 3D Land) may also crash if you try to close them from the HOME menu, due to some services needed for cleaning up kernel resources that are currently not implemented. Most built-in titles, such as Mii Maker or 3DS Sound, should work fine, but DSP sleep still needs more work in order to make it accurate enough for most games and system applets. -## Skip address range checks for privileged memory (un)map ([#6407](https://github.com/citra-emu/citra/pull/6407)) by [Steveice10](https://github.com/Steveice10) +### Skip address range checks for privileged memory (un)map ([#6407](https://github.com/citra-emu/citra/pull/6407)) by [Steveice10](https://github.com/Steveice10) The ns:c service was introduced with firmware version 5.0.0-11, and appears to be used only by the Instruction Manual applet for triggering SD/Game Card removal errors when ejecting the media that the manual is stored on. By implementing a stub for the aforementioned service, the instruction manual now works on Citra! @@ -154,7 +151,7 @@ And there you have it! All the changes we have made in Citra to majorly improve # Android -## Storage Access Framework ([#6313](https://github.com/citra-emu/citra/pull/6313)) by [hank121314](https://github.com/hank121314) +### Storage Access Framework ([#6313](https://github.com/citra-emu/citra/pull/6313)) by [hank121314](https://github.com/hank121314) Oh boy, where to even begin with this one… @@ -185,7 +182,7 @@ As Android is an ever evolving operating system, there are many technologies tha Android TV support for Citra was planned in the past, but due to a lack of testers and developers, it had to unfortunately be scrapped. Thankfully, with time and effort, we are able to provide support for launching Citra on an Android TV as we initially hoped! -## Citra Android theme overhaul! ([#6332](https://github.com/citra-emu/citra/pull/6332) [#6335](https://github.com/citra-emu/citra/pull/6335), [#6351](https://github.com/citra-emu/citra/pull/6351), [#6355](https://github.com/citra-emu/citra/pull/6355), [#6349](https://github.com/citra-emu/citra/pull/6349)) by [t895](https://github.com/t895) +### Citra Android theme overhaul! ([#6332](https://github.com/citra-emu/citra/pull/6332) [#6335](https://github.com/citra-emu/citra/pull/6335), [#6351](https://github.com/citra-emu/citra/pull/6351), [#6355](https://github.com/citra-emu/citra/pull/6355), [#6349](https://github.com/citra-emu/citra/pull/6349)) by [t895](https://github.com/t895) As mentioned in the previous progress report, we are looking to modernize Citra in many ways and get it up to speed with other emulators. This also includes modernization of the Android app! To give the app’s theming a breath of fresh air, t895, developer for the Android apps of the emulators Dolphin and yuzu, has stepped up to this task. @@ -268,13 +265,13 @@ By upgrading our macOS target to 11 (Big Sur), we can ensure that all features u # Graphics -## Prepare frontend for multiple graphics APIs ([#6347](https://github.com/citra-emu/citra/pull/6347)) by [GPUCode](https://github.com/GPUCode) +### Prepare frontend for multiple graphics APIs ([#6347](https://github.com/citra-emu/citra/pull/6347)) by [GPUCode](https://github.com/GPUCode) For being the first PR in our attempt to move away from OpenGL, this one is quite mundane on the surface compared to the other ones. However, it lays the foundations to allow Citra to support multiple rendering backends by abstracting key rendering functionality into common classes. A neat result of that effort is that the Software renderer no longer depends on OpenGL hardware acceleration for presentation. This means Citra can technically run on systems without a GPU using the Software renderer. Additionally, the Software renderer has been turned into a Graphics API, so it’s much more obvious when it’s being used. Before, in order to enable Software rendering, one had to disable the Hardware Renderer option, which wasn’t really made obvious to the user. Now, we’ve added a handy little drop down to choose which Graphics API you’d like to use! -## Rasterizer cache refactor ([#6375](https://github.com/citra-emu/citra/pull/6375)) by [GPUCode](https://github.com/GPUCode) +### Rasterizer cache refactor ([#6375](https://github.com/citra-emu/citra/pull/6375)) by [GPUCode](https://github.com/GPUCode) Looking at the name of the PR, it’s not immediately obvious what this PR aims to achieve. What it does is rework several important aspects of GPU emulation that had remained untouched for years. One of these is that it greatly simplifies texture uploading and downloading, the methods for which had quickly grown to be complex and hard to understand over the years. This was most notably seen when using custom textures combined with texture filters, where the code would just fail, resulting in some pretty messed up looking textures. But more on that later. To summarize, this code is now much simpler and more optimized! @@ -304,7 +301,7 @@ This issue was again brought to our attention when first time contributor, Polar {{< figure src="hpbar.png" title="Left: Broken, Right: Fixed" >}} -## Fix distance vector used when calculating lighting distance attenuation. ([#6366](https://github.com/citra-emu/citra/pull/6366)) by [Steveice10](https://github.com/Steveice10) +### Fix distance vector used when calculating lighting distance attenuation. ([#6366](https://github.com/citra-emu/citra/pull/6366)) by [Steveice10](https://github.com/Steveice10) Citra is often referred to as the “Pokémon emulator”, and you wouldn’t be too wrong to assume that. Pokémon games have, by far, been the most popular for the 3DS platform, and this translates over to Citra as well. So naturally, when something breaks in the game, it tends to get [overreported](https://github.com/search?q=repo%3Acitra-emu%2Fcitra+pokemon&type=issues&p=2). This is one of those issues that has plagued Pokémon X/Y for a while, so one would assume the solution is quite sophisticated. Right? @@ -331,7 +328,7 @@ Steveice10 picked up the issue and after writing a couple of basic hardware test "xybefore.png=Um, where did the Earth go?!" "xynew.png=Finally, the world is back!" >}} -## Custom textures rewrite ([#6452](https://github.com/citra-emu/citra/pull/6452)) by [GPUCode](https://github.com/GPUCode) +### Custom textures rewrite ([#6452](https://github.com/citra-emu/citra/pull/6452)) by [GPUCode](https://github.com/GPUCode) We’ve all been there: controller is properly connected and ready at hand (or keyboard if you prefer, we don’t judge), your favorite game is dumped, set up and ready to be experienced on a shiny new computer, devoid of the limitations imposed by the original hardware. You launch it and… it looks so pixelated and blurry. What gives? @@ -381,7 +378,7 @@ Using preloaded custom textures is usually quite taxing on the system RAM, espec By adding a loading screen, you can now track the progression of your preloaded custom textures as your game boots. It also works as an indicator to let your PC know that the app has not frozen, and to not enter it into a “not responding” state. Additionally, this solves the issue of Citra’s inability to be stopped whilst preloading custom textures, which is handy if you need to stop it for any reason whatsoever. -## Add MMPX texture filter ([#6564](https://github.com/citra-emu/citra/pull/6564)) by [stuken](https://github.com/stuken) +### Add MMPX texture filter ([#6564](https://github.com/citra-emu/citra/pull/6564)) by [stuken](https://github.com/stuken) What's better than 5 texture filters? Well, how about 6! Introducing the MMPX texture filter, implemented by first time contributor, [stuken](https://github.com/stuken). MMPX is a texture filter centered around the preservation of those classic pixel art styles we typically see in 8- and 16-bit era video games. Sprites, fonts, you name it, it’s been given a sweet pixel art style with this new texture filter! @@ -392,11 +389,11 @@ This new texture filter can be enabled in `Emulation -> Configure -> Graphics -> # Audio -## Implement OpenAL backend ([#6450](https://github.com/citra-emu/citra/pull/6450)) by [Steveice10](https://github.com/Steveice10) +### Implement OpenAL backend ([#6450](https://github.com/citra-emu/citra/pull/6450)) by [Steveice10](https://github.com/Steveice10) -OpenAL, or in Citra's case a variant of OpenAL, OpenAL Soft, is an audio API designed for efficient rendering of multichannel three-dimensional positional audio. Basically, this API adds realism back to game audio by simulating different audio effects. +OpenAL, or in Citra's case a variant of OpenAL, OpenAL Soft, is an audio API designed for efficient rendering of multichannel audio. -In Citra, however, we do not use this for positional audio. It is there just in case Cubeb, our default audio backend, fails for any reason. To get this working in Citra, though, a few things had to be changed first. +It supports a wide variety of a platforms and can now be used in case Cubeb, our default audio backend, fails for any reason. To get this working in Citra, though, a few things had to be changed first. Before this PR, the input audio settings UI assumed that only the Cubeb backend would be used, and, unlike output, did not have a proper selector for other options. The input UI was edited to allow “Real Device (OpenAL)” to be selected, along with “Real Device (Cubeb)” as before. By changing these UI options, along with internal code cleanup to make managing output and input devices more consistent, we can improve Citra’s portability as a whole. We also use OpenAL Soft, as it supports iOS, while Cubeb does not. @@ -442,7 +439,7 @@ On top of this, we also moved the cheats section to the per-game settings instea {{< figure src="cheats.png" title="Look, Ma! New settings!" >}} -## Add consolidated GodMode9 key dumping script ([#6396](https://github.com/citra-emu/citra/pull/6396)) by [Steveice10](https://github.com/Steveice10) +### Add consolidated GodMode9 key dumping script ([#6396](https://github.com/citra-emu/citra/pull/6396)) by [Steveice10](https://github.com/Steveice10) Something a bit different here… we’ve made our own GodMode9 dumping script! @@ -455,7 +452,7 @@ This new dumping script loosely follows the existing aes_keys.txt format which i The download link and instructions for using this dumping script can be found on our [AES keys guide](https://citra-emu.org/wiki/aes-keys/). We hope that this will help make your Citra setup experience just that little bit smoother! -## Add Citra AppImage builds ([#6404](https://github.com/citra-emu/citra/pull/6404)) by [TGP17](https://github.com/TGP17) +### Add Citra AppImage builds ([#6404](https://github.com/citra-emu/citra/pull/6404)) by [TGP17](https://github.com/TGP17) An AppImage is a format for distributing portable software on Linux in a compact and simple way. AppImages don’t require any outside installation, and can just be run as is. This makes it very easy to use different programs on Linux, especially to those who are new to the operating system, as using the CLI can be intimidating or just plain time consuming. @@ -474,7 +471,7 @@ Unfortunately, many people do not realize this. Which causes a lot of distress a {{< figure src="savestate.png" title="Don't skip this, it's important!" >}} -## yuzu ports by [Morph1984](https://github.com/Morph1984) and [FearlessTobi](https://github.com/FearlessTobi) +### yuzu ports by [Morph1984](https://github.com/Morph1984) and [FearlessTobi](https://github.com/FearlessTobi) ### Enable High DPI fixes for Qt >= 5.14 ([#6262](https://github.com/citra-emu/citra/pull/6262)) originally by [Morph1984](https://github.com/Morph1984) diff --git a/site/content/entry/citra-progress-report-2023-q2/lle.png b/site/content/entry/citra-progress-report-2023-q2/lle.png deleted file mode 100644 index dc551717ed16598d3c3576c114298dc74ec420b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6778 zcmbuEcTkgC+wPwrqJoIvrYc2x@4}`R=|~eoq>FR`krpIW6-A_nCZf~;Aylaw0s+|~ zMQOoMf&mmz0|cZ5OaM7yzvb*b-+pJ_@0>rL$vkT^vodSl*LDByD@oRt#>|X7i~s;I zo0=G02LO-|?YVZEfwmI=0AEV`0EJ#R)(7fFE)i)j^genPdI0b$o$0{+B<=moT@!~; z0ALF{en4~H{PzHWhsD%D&+eWpiC}TJpg*R6Q>ThE`TUOl&{MApdwRC4l((jY1iy0A zMRg>1fh~&_?RUugwV&%N*j~RWGM-cgUfAv$_ zGC6r>GFV!zmEH+q;t+yZUvCoNi@z5st|`pfvsV^rbk7x_6ZpQku06Wm+DV>tvhsSU z6|-_^a&!cn>5l96Y;tH~)(!Qux!mx{ogV0OBpm?_Ri}jjOMw*N*ZcBx3-rCG<1hSs zVKoJ?+u7{rpLJTTY--AavjVE;jer-rT%fyj?({up?(;N!g)hQiG)eV!z`T%c@9JuF z4xKCT>4UEdp=htb_x_pK(RM6m?E`zeB3QFj7rk>yLv*=t2(=f;J1@226K=X;U7v7x zp|ihk$MLJMT48qkdDo)Iq9(2T{Kh(Mj@m59kt&9@y1C2TJX;*w+~fS}XpF0ytQf_u z&0#1;tw}MwkD*}W$J}lWzDc`t-sXp1c3w_#fg`bv;`9y74ZX+Vk8n zjypMR+;Bz86zvv+n&rpHLGCoOUxJXh4!48ax}@bITJytezxz~cgm+0}2q%ZM;%c#& z#I~S;)Wnw}d$rhI>pND2jKr5(*NNY^MxF9%VntQ)c(3&#c2m@fyGp?h$_#T#c`xp$ zq{FH5<0QB$0P<+hFwb>s)Tef1hBU%I^p1rb<+k(u%UoX3{5qT;T4gN>i+dUun=xuo zDXH~^zrXsY*Wsv)h6p4UdKGUswkkAv5c$k}=tqtxF-F|a-Tn2PqYfHMVyyH;#8Ds> z`0^>Y7#p|3V7G@!eh~w^1Ft?RXgO?)Y%_&iQ`m0$+Of4q41~BXc_wu)Tr@rT9MzpK z=a~PMe<{)jmsfuHY;L|9)sM=~Aw#x1*-YE9lc@Q@R|mnPyM-<0d5llg$RfMlrR{3u zOSn*}*mLeNqLZl4{u6q+@6FO9t;iVB+qZ7`WSYE@jxBEmv*~jUS9Qym#=ic!%Sh&I zfW-X3ox<&Zt2!dPg?A0tNV!m%yn`<4rAc_lL0`wf5S1=Exh^bOKdaTX3*G8|iB&kn zN2TQh*7NkC0q)`_qvyPx)}eV}`71>(s%^Md_(pncG`n3FWXk>xn~ zeQhJZj$`F>Vl2l>Rn2V#%UXWiJkAalh!U=-_Faj{1cToM$EZDMXK}WU;-VbkDU_qF z9JPv@q8S4Hzew#hxh%!ijZ!|1>mvw!^!U8I2Bw!Sb_g$ z(CkostYr~zV_OStv+D0ns$?N=9y6w*-y$48G7Ko`1jWRG1;>5vhin8&l=ICuZy=BS zV@K_X`Zt~g)3uYFf>Q?8 zJ*FK1i%0*%nVbA*Haz$zuP#~cTiK6AKLgYyqpcS6c%c1NWh5 zdp>vin}oF|21}F^r#$DGkb8Tgt&cRq6UC-O7&4t%@d&N7NEMmVOLWFtzvT`}% zc!RHKH7tF`HXf|Bb!YXRdIyz?_vUcq>e|G!<`=e$6wM9eWpYUKQ?m1iyKPIH-3KiM zy5fAIJY)H=I8PG&IYA44w7<`?|2g18cW&+i>jksHZyQJJLCf<$7j;OE^2-}p8JSgj zrYx88#vRZSZ6tnM?4F#M@SQe}C`4|^RAfben)%T^BLX%(+>+WkTsV`A)sesKhh{8R zS!VE;=ChU&Yle?MrW_{h>~%^e4l7D$!84gow38vrIgI_IWobZ(?)quFtD8)jYTn{ zany;TwMk7EMe1i)d%o!4`LoC`##|CHS5Yf@`IXNZKA1p;*L^l-TDCYiIfvtK$EH2D zxn}8xk>$U(oLj0=_?%t)=aaMVJ~c_8S$dkrQgI!rNV_ED^o8&gZtLNx9+EE?dn@r? zpsu?lEc(G|!Z=v~q@f8xFKuY&y+y}Ez{1k4lS|p^ zp#Slts?3y)iZ5sSqf_Q#*(Z6%DiT=%-nlG4Lda;M7~V&eP)^S`X4t3#e?`tti&c`f!n{vTU7S13~vxmyXBO zrO?9M&D<0}$1ujVqL@N`Y-ysIf4y7`NG-MO6&J0P`#PI47YzYVjZ~~@1F6Nd#VK#Z zEZpF;i$ai6{9_v*Tyypd?%%{iw%{o{cng3>|FDI7*wUmMRZ4!@EnL|_QUSu{vgNTZ zn))7fO4v$L7qk>EQoPi#lb(dP5&)$NBGv_ryYl*w$kPF}x$>xPh5&#$>3?|0|8C)QIHKPdQM=N)|NnHrqlhT$Iy|u^G+8y!M&IaZ zYr*nX@ta{@!_QaqhSpCkh^k&}Ab<4BvofL96k^re&L*E-))!GFv;=WK%V@@zJ^Z#Z z7^${68zGvNp_=c;eE0c7_g}JXubweY=gm_xMGubIIz`>L&6TuBeenys-Q0@tg@!x$J<*vM6cx~h@VuSpQ(7=$Nf&Y| z^>$4=A(oz>Td5@`CXXdY%eMO`j1@=T<4nL(PIiaLVJV&S8?%44#0snX6$tSU)d|stWx|n&fh#ax@onz^8@8UXVjr8&3=un&AA?3x0nzq z6*v~!&Z|?H*3mnl_zZkX7*3kg;OOpJ?bGCnbQ!mo<^xX(Zy|4{DR&KzFwW9M7&A^2 zVN3t2L{jHN$UUVY#R6$-mP>&>BPNa~t?zhG)4?pSD4Ex&_L1`ugu3)SE9$hCcqOCg zefkAOC`&(Exd|Y8OZNtLE?fN5bTgMaOzZ2!z*u^<- zy*4-Y1FM^@GLZPi>@v#N>;ZBQNgke(l2%_5rd(}y)f6oG)Wz;-HV{~Ou;`9>hRtN; zLOZ6)vX*CUnBwbBAX!QhGS@$s)YnY@BoB2%oRwp0Fjn#%VN2B^`Ku{AR}2-@VjSFj zJlnnsCzi))dO&~=Of)M!Z6QO@(_a$tsEL0P&KO}?Hrn$QgA_WV#zGIBzu~Z<-W%Ca-Z055mM9&HP`McXmOI9?XGvh z?3029p9TrC1^Js*iC zT=U58o=5r73i91J!&-_n*FEsLy?f?yikBgy{P6Mniy?ZJ0|VCY`NY`xJA{Q^{n2EJ zOAYF=H$+K?qw>|#)~YL?1D@w!)q$GiJW*7nW+e-X9nBQPbw^nnSw40Ck;EvtVGV?% zWP6c8-xA&^ZM!bKw=_ALiBvn>RpXA_Pe6?F(OP^cSG@WcU#>`7NPY9+6IAR=vPEz$ z%EL$T4DlWEsOl+*xkMJ9!uY^s6?RVDt*c{46>_48T_eWRV`N!ZF|bl)s=&~nmuk5dNbJ%ia^*`*}38>h|Kf4?EP zSz?X}6ydA?rU2CF7+-8qg4e4YtO zGyImLW9x@Uz@d4WaHSI$B#}UXaD)}f$L`6%0{+W*QH+(S&-UvJaW0Q$);c8=$cNJm z1?R-`^Bk14TD4ul6HigWfJ!0S9dQk#Ay;Xho7PFJJ|t<**-dhThX!ltt(;HhOMr-M zS+y`?{8KSoMZdIxfp0y*L9n%){-G8N(6otVVkS~@^3jbd?D&dGnNlk%r?8-nWYnSl zMG7S4c*f z-BLyD;)NCML_`6WwV~t^i%?&78k@g()i(y>v#B2>DNsJNtVAzq6m{6qj0k5L!hN3j z(Y4}3Ne4At);}Xe=<_)IhP4@*8*w0bBkGlgOh>)9NQP=(t`$h~dVSgU844rIK|6Tbl#hy@!ulRR3^qDt_kXd;-47Z%(dwzk^fw0%5`;8|0LK21-N@V8I7MY}@RQt&OBy{C1N zJJ!iR*=$~Y{eZdty8_!kLoI!zkd~29Aowd`YSBwhRz?XcG#0-j5p7YVRlUS{MArFo zG-eEoUi`!Qk`)^6)2QpX(Ip!R-hXH^(a*pucTqQ#2Er)t@TBNvq3VifyMe1RFC2Xl zkd1ANE1s>9dvw-1E5}$Vof!4l3u_rnvhXJrtiu*c-;8pOlri+gq(-O&LiMSm6~eJ0 z8I-O2>ey$MyTh0EVXiUgb3KtXaNpd)eHC8@m`BFtw^~5?hHb1MU(Zwri&YCG+|F!H zA$1m5(OZ0Evsdh_Rg|$aO<-4SJ*`m>eNS5RMroP!SiFi>3ZP3vXrAo=p7@Td{|W*B z(>?#+nDB4E@egLV51)(Ca^3xmRTR>qWA>f+>*=-;kMHAeXq`5Y<@nWh^%bOv8*lu< z$}3NCd;1GCq$IflcS4&%v#MQW8e$c7%R&-wLES_iP2AcOyWp*F46KJ91>n~bc8V-a z50;8|W-Ro|>&u0CH4KQSktfK(w{`O2reNl%rs58Jm-(?XNj_gh0;fQ~RcrT(%g-xM z-R918SF14t10Sbuy4y{A8=MD`%d~rus+VKn$0oz8`+KlXO2?^T?pHh03D=In-b&mZ zfxegUZfZC5-{+0Ck_xy;y}9!7`DiofuKAx8c4uP0Vp;v~Nd9(%?LM%=ejL62^Gx+| zc)^hF-a(13AoC=f#N&#G{njbX9|Ie$tA)k|JLKXN`i@sS_WP}tS&BYp9UUI>QnofB z&}xVv^;`Ph(%S?6_X>T#wy+2&Q-6t(wNl>=A4q#?Ge{mC12-*~d$sRZaT@&eP-|hi zN%)A4veLG9-yYo1Q7qXWKZ^N{&7k}^3czI@&x1p>o&H0VOv8`_Yhzf75gs*yuJ3>6 z>g?!^FfImB>QQwSKN#0C-u7q5(vn~!j%)T6X8ZMta!kP3W+O;B(Yp7a z@NnImT7ubz?Te`4YVBd8lnTiXS)umGA7o8`4C&-P4Ie%+tR-|3SyD-Tu&-PJxS zNoPULR+V6_4!qXT!j>F~I-G){vUu=@D{yJqm#ZqC+uXEB&fs&sn890F`)6Pk(aOg= z@03GJ$=GjgcU(-e4!-clrO~yq^!?wBr<}q$=UMpJh zmY3R6P@duWO@8sK|FCt!F*0@YB8XO9nq9fu$me2PAxNdqykjO zRHZRsLmP@sBhD8O;;_8JAO0frLY=$1nBO9-XyK7(TXrig0-Bi^zg$FU_n5rOBm|5> zNd&3dS{ca<$tgGWCf-dlC~J%wD= z`pwQSTPxC?SLZcBo6*DTFfo+xpHKp&&lzsIw6r!eJb#mUnC%;T<$0uy5HJmSil+|{{6?M$4o~c+Og27D}dmg+nu~xyw8wwu