From 3f72005fc038505a54e1d07ace65377e1d6ea81a Mon Sep 17 00:00:00 2001 From: MAHDTech Date: Wed, 25 Sep 2024 17:17:15 +1000 Subject: [PATCH] feat: OrangePi 5 Pro Adds initial support for the OrangePi 5 Pro. - Add OrangePi 5 Pro folder - Add devicetree from Armbian --- README.md | 15 +- configs/orangepi-5pro.conf | 3 + .../DeviceTree/rk3588s-orangepi-5-pro.dtb | Bin 0 -> 244556 bytes .../OrangePi5Pro/AcpiTables/AcpiTables.inf | 58 +++ .../OrangePi/OrangePi5Pro/AcpiTables/Dsdt.asl | 55 +++ .../RockchipPlatformLib/RockchipPlatformLib.c | 332 ++++++++++++++++++ .../RockchipPlatformLib.inf | 35 ++ .../OrangePi5Pro/OrangePi5Pro.Modules.fdf.inc | 18 + .../OrangePi/OrangePi5Pro/OrangePi5Pro.dsc | 122 +++++++ 9 files changed, 637 insertions(+), 1 deletion(-) create mode 100644 configs/orangepi-5pro.conf create mode 100644 edk2-rockchip-non-osi/Platform/Rockchip/DeviceTree/rk3588s-orangepi-5-pro.dtb create mode 100644 edk2-rockchip/Platform/OrangePi/OrangePi5Pro/AcpiTables/AcpiTables.inf create mode 100755 edk2-rockchip/Platform/OrangePi/OrangePi5Pro/AcpiTables/Dsdt.asl create mode 100644 edk2-rockchip/Platform/OrangePi/OrangePi5Pro/Library/RockchipPlatformLib/RockchipPlatformLib.c create mode 100644 edk2-rockchip/Platform/OrangePi/OrangePi5Pro/Library/RockchipPlatformLib/RockchipPlatformLib.inf create mode 100644 edk2-rockchip/Platform/OrangePi/OrangePi5Pro/OrangePi5Pro.Modules.fdf.inc create mode 100644 edk2-rockchip/Platform/OrangePi/OrangePi5Pro/OrangePi5Pro.dsc diff --git a/README.md b/README.md index 31b9752b4..50eb4e41b 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ This repository contains an UEFI firmware implementation based on EDK2 for vario - [Radxa ROCK 5A](https://radxa.com/products/rock5/5a/) - [Radxa ROCK 5 ITX](https://radxa.com/products/rock5/5itx/) - [Orange Pi 5](http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-5.html) +- [Orange Pi 5 Pro](http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-5-Pro.html) - [Orange Pi 5 Plus](http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-5-plus.html) - [ameriDroid Indiedroid Nova](https://indiedroid.us) - [Fydetab Duo](https://fydetabduo.com/) @@ -146,6 +147,7 @@ The paths above are relative to the root of the file system. That is, the `dtb` | `rk3588s-rock-5a` | ROCK 5A | | `rk3588-rock-5-itx` | ROCK 5 ITX | | `rk3588s-orangepi-5` | Orange Pi 5 | +| `rk3588s-orangepi-5-pro` | Orange Pi 5 Pro | | `rk3588-orangepi-5-plus` | Orange Pi 5 Plus | | `rk3588s-9tripod-linux` | Indiedroid Nova | | `rk3588s-fydetab-duo` | Fydetab Duo | @@ -306,7 +308,18 @@ The firmware can only be built on Linux currently. For Windows use WSL. For Ubuntu/Debian: ```bash - sudo apt install git gcc g++ build-essential gcc-aarch64-linux-gnu iasl python3-pyelftools uuid-dev + sudo apt install --yes \ + acpica-tools \ + build-essential \ + device-tree-compiler \ + g++ \ + gcc \ + gcc-aarch64-linux-gnu \ + git \ + python-is-python3 \ + python3 \ + python3-pyelftools \ + uuid-dev ``` For Arch Linux: ```bash diff --git a/configs/orangepi-5pro.conf b/configs/orangepi-5pro.conf new file mode 100644 index 000000000..344ed2761 --- /dev/null +++ b/configs/orangepi-5pro.conf @@ -0,0 +1,3 @@ +DSC_FILE=edk2-rockchip/Platform/OrangePi/OrangePi5Pro/OrangePi5Pro.dsc +PLATFORM_NAME=OrangePi5Pro +SOC=RK3588 diff --git a/edk2-rockchip-non-osi/Platform/Rockchip/DeviceTree/rk3588s-orangepi-5-pro.dtb b/edk2-rockchip-non-osi/Platform/Rockchip/DeviceTree/rk3588s-orangepi-5-pro.dtb new file mode 100644 index 0000000000000000000000000000000000000000..936eaa5bc538149dff12995c7286bfcb08fbecbc GIT binary patch literal 244556 zcmeEv37lj_k^Xx%Cvy)o3?irvj0!p>eax+B3yP?qc;EI^SJh0H)7@26b@vP^+MpsR zARgbYLBO)Ur zBaip$z3Z3%^|!&iPn{M7!Pa2j_*ICH!?haMDqIMs{Ugfvnsn?p)Z9G8y-e4u#ofh` zN^L`Z_rRvDTO0Xmy)eG3T&v_aecn3oPq6@;d+YJ*=Dx< zc~QAEvE{p>@_rxBnNj(GU;d(~e4}6fil}^(Enk7eYfdONDuX*q<^Em-))-z{_Xb-x z5U*QxR?qzHRFw@ws+Cuyv($yPs%XF@w*a+qw)se`)Iyd~!_w_X+jg#mdh7SOueMbgCrA zj&jQQP+WgY)~jJ_eYh%FFV^bXhes#t#cECcIt;OX)K8Vl#eA_^FGB~#0d@|A5lDkD z+mkRG(=aCyrabQO3@7AAJdaDll;bi!3@}eV;RUtwuCirk*b|xXLzrhJVQ6;3vEi98 zJCZOF%MQ=3Bn<7r!vp<<<0mxA^-5us=INor()-wE8!Wu}Sy+ z3dc9wc9xcp%hLKZfP~gaadh|4RJ9N0v8C9%wOnLtL$`;C#5&1HHovPdQO=K6#zi2M z=_;TT!gs!S@o(4;0cFBJ<-6SiYuRFyoq{xY$d$B=yq%7;x3)^@4LS*c&+uLl-b=N~ zq0#D|p_({(c4F8JM)K8zYbJfTitP|O>_bR-THETN58-D3@5{eeLN5RiW}}141ViUK=+ z=mPsx-=2zdFs}E521BR5l{|GbCcXgp*totM^nv!#O&`8!`ylqj{g&@t&8m+0dT`BT ze(QEk$9+*Z{C^4X(fmgKeJe7%g4yuj?Vh06CI4Tx{MWcAC`@_WZ|j@=7&wHs&(P@@ z=++;71-K*m-}U@=J2!vT@-K5jqg1Izeso(uwK=Of?T`(Ep|$+yLxkK@(oT6X-^pI= zI>3tT#dfBuy+ga|I}gBq4E#90$fwO`?T=BHx%cJ04WHLOkJq`}yIbB6i%hxarcArx z^(@Ql7{+8}JYVT=$VeofWw<&%t063cw#yw!L_-FtEhnEmulX7ZL_QJCJ_|Ejnte@Z zemzYyc3)*S{p@c-^BZZJa{4_NvK?qb^Ln3Vb#g)!igB`OYjL2@+xz2e)tlp>`#gYI zhCu${L-nlanb+J)N~5vhoeKrq6h1i?)}Vc41He5rQ5~vO1rzZTM*;CdTo1s-GTMiM zFnJW^&h_eOJKtm>u8_8){o}dV0qS4wwGsW;ShxK%_LlCS?MtZb$#$|YH?R;_x-UEl zM+E}q(uJ-rV;ct0m$sg+n)U_vD@0d)V_Ch4>xTNWx}rY*9rsuO!2Us|R=%12GvmIy{^5+dY5%^Z{gXZxYkI=(c#t!G zYs0ju2jgN00h=Ey)J%GGvN2JvtI47c_wqdZxlWY#<_nuPvBcVm@za{;+`q5ZC{_d_g27rbcc{WxpCEWWJl{Zim6yK> zY5E>J-v1B;)5zMq44FYMPyEwf{(cGg4X7LR>K~5uw3mN8(w0Z)eBN`Br+k$DyxmBb zy!O!ggMdK31t-d9>@syeQiHyAR`$!{P}ygBRo?PlackmoErvl8@po}ZIQc@4i|C| zYg;>VFup(Y{6&ubjL#&g|H$2hbljiGkhb-rm%#{r9(<7-^B^|wekSYSGyGW$p8kw$ zXQiLz&qCs`_4H>)c==1>dGTk_d<7ZffewJ!_N~WiTE;Lx)3${j{$0rU-kuCNR_&ZE zc8G^sY(LSNZe_&fuE@7r8BwRISFyt*z5Go`A8b23Dx%+!9p1--ryY8EvBPMM13ScH zDFAW(Z8@)|?U2jD{}VF4uO|cA;R;;zM`5Ler)L@ycpjsHtnKT(w|VO{Sx+}c%jFs& z42)a%MeSW3LEfWq^i7{g_@?VoSMutAiZsuqtgrb!k~c?r(J5_`{0h&b{rO^{ID#ig zoNi?>NFjg_tbPAcTDbf?wjYe@=V86UA`3r{ei3U!n-|(#_a*4|p-5m3BwenB5_J0y z23@W%5_DxpLzy1P{&LQa(=|8HTGQnU(djEoziytOEoSML^I(E*2l|~oUCs>&x*h0u z_H^lQ6LdS!@9gQ)2N}8pX8a=0&|1GT#O-*@((fvZ1NxQm%JEA&LaV6z|9rJp%TE-B zN6Q2kd>mgvwN|bdCMx5*^0jJZe4>$`aymfmeBvN~n78M1Ug^PgG_GTCu{@9RBSy=G z-GyCc;Hu>-<2$QCqgKX)%atM!SI39UQ?f(jlVii>I@&O>EyDZ<;m4*2HI07Ee+;(r^i4&$3ywzqR=r3Ax>~TU zQ7z{AZ-B7^#N%i$fGmS!y?g=b^_uTNyLzyE>GzNigQf316>%6x9C-kIMf|+p+8!NC)?N(i<5O_q|Z|eCa3q zy5c3b#L^Lc2=X5X0S`McH07b}`18pvX&!qG*_j>9t$j+Bm^$cZ@8ugT+>HB)vl(Bw zlv&GuK5Xp|XHQce?smd$OY<@3U6`Qxla0X=T%u1e9m)UfV9CB6atVx=j$khC0OrzQ z$=MgmC3w7agy*W5P0`M*twk_bcK~xk8yNVPg(*Aj+ZZ#Nwz7QcPI1%G*jW0`mj}Gq zKR+Guezy21`YC}yY||0U#lh0SAIc>#UOIxgG+4T7v0MVM=)mx%f9$xxdg^bM=%!$ z%ij1Nxdg^bM=+NL%gW!9OJKZo1ap=6U;1EyL2T0z%+(#h+z>3Azd-CgdVL zKOMnb6)gYMWpW9OmyTer4wk>_I=KYKOGhv_1k0awhg<^Vr43A`EMJfxYc(HY-P6H* z$nk5(u%B*2x5b>8NjEho`n3FX8@es##Z0=XdC{lkr`ynNF*jz?P0fuyEkE6kZu9vu zlWuB$^lAC&mUR32x5btp;>+wfg)OG->hwpH;^Wk(<);l@u2Fs$EdBRq%0-*^(-92j zo0fA@({a&aF3gl$dM<1^E)4&z{U2e#f7?D{zU;V((kbSsw(}w8C~pq*(-9ubQQjQrrz055QQjQrrwvSV``OYf{{qaI zr!wVPzJ%LCZ_fAU9X}nxV4m{k9X}nxK%Q;qAk0(VyyK@MJea4vdB;yjFqo&jdB;yj zFqo%2o%(45la!~-`+7FfH%Dg^_lKMxfQySPj)%EAn*i^z^N1bD>v_aNJMP#&o-5(J zU?I-q7jh$uJ}$)lvV~7T8gL7rhzo0T?x7cs;d&L)I4@ZEYFzI@8uqjB3Ozfp&xPy& z_<5*9SolzlABHq=39U1b9zmM4z!Px^Eo_Ds;><&6y&vgsAWd4=zUhgibeMhj{X2p z+kWEQ;>bONUVirH7BT#CZozw>b9-*F@}xnxH)PuN$L$BLt=@z>8Gk%CX|Z0*JU2$I8BY`#Xzq?uZy&4lKx_xifGratZ7IEaTuJ5>@#O80^_BPT@nw@M7(l89l>B9ujeU($4f^r(V2+A=-CR>4rbAo z*x2ypYGCM-)8{6$-QU~w8+q~5jxVf>>>5~LbZr^qeId?7^sGc+ymW*oIuj8XPlpjq zbS6R=UxyJ4WVx@6-YCnKFxj%4?f%}b4avKoj(CsGN(4sNiA+Z@(OHSW=sGbD6P=X^ zjII;oFwt3w!01^?90u!9J^K(CFCFo7gWCrX#_kDXcpz`zcKo!#lPT~1-tNx)_8$Ln zh)L!^j?L%0H7I$pYtR^9*u&U0D9inHga_+XU4sgYmyTetPSrK2zwev15XMhC7|7f1D+DHGN7?f3@9r${WpCrM&6D@a)uVx2;LA@( zFxVH|_-47tm!FPcaDMgvYvmFcFCD>L>dwgohUZ+kn2uns>HyEx9pJekW;>a71bO?m zlMGFdBIZ$ zQ8Zhcn{*XHRD#Rz=c!(q^z*{r_gXkJjvo&DX@4bZ2zt zXXjsnR-v%Q?hFg^6#e|Z(IYlJolm;u;y%gu8B2g+jC8< zIoqCVV$Ip|T$B7@4W#Q;u@f)t`o%Snu2%)dOBmcv`o}Z3junuZ_&Wd$s+jCZ|JKLVK;(WB-IV;yeEzen#GMDodJwxrEqchaw zFpnRP>lmHS^Ed~bi|4z*`#oo6hKe|}V){B`kPp=mfXP)+KGg=GYbM|RuE@z*3?^3=tHVKoK^AG+PP~OFa z@~N$?nR5T@#j}Qsc&`-CXUcnra1T}5^dS2buj~+{m*8583vJ}PQucX8oQd$+z3|&8 zH)pT4N%^}g^7JvQaYgT@#fw&KrPc$V{D=0z$Zx=v*K&-d`A1Yr0bkoSRjxPipIJ#4 z@j7LID6ROXtw@jmpN{C6?{MYKC$R7-D^?o5(APyfkp}O<30@ihmZj!=aec9{(-n;ilxt1Cf`9>Si?K88m5x`p|1Hm$_T43)>7EmyRurgEsvMv z&&sXaFFGIe`*9IJW$YBEy|brqTmdV2W$6{Ek*sjJK56rmFI|0 zdM+dHyAz*3NbxCC?A>l`{zr;Wdd9n-Jo!g?87pqy=IFiq@%bamC)NP9(ZX5z#^iA0 zEWBBCOxP9u^L|{k9?1r@bJgVl-HOZRuRwa6=DF7RSP5&p(dw=$$`}+b$NkH8&11ci z+dfhntKd@sBWDe{kC|Cm&h0-2Y*@!TS!E?<)A>@(Or?Ui+1iHXUnLI@86K+v4+C+p zLiu-CKD3)(+Z?sktivBy7X7SP9>*(J2`=y~`%R(@zG~5(sONure13m|yx4>AoX3Yi z4Wop)EBVBKj$(Y?nBp_?t9K=zCnos(X`IipRs3Bo&xa@Y{8@_6yIh{K*SRUqmy9+P zi7nifdVYlRpmTos^EjXNUBl$^uIF=5d9Zx`0(p*adxfR3BC;aSwM-*nlOU3?f|9;tBH1Bw4!>9u9qcF-8YE89_Q+sS(oPm1!3*CTy| zm#0@EzZ^$9u)QJ;?yblZaLUC#vJCzb(z=(eNKgYh_&3=a{qn7=7#CwYI{@6Z9fAl|CaXzB=2}ytS ze{pe`M1S^~|60Xi68(wwIqHx7`va^5p>2Pj`{$2ZIHMoZ$B@m{}%ZKvi-P1+x}es%PXg~-=;srZ7+LID$XmOZP4d%36~9n zXLa>CT!G2#GoIDubGR?-5qfdEb^YOaaEmdtFzfmL)EKfnrumK0X<^%$bker1`fo?4 zxy@zLnZ3EihRt=>rxtdX*{6eJcbWZ;+nw#7={M~`Y+`4nKDMV&*X<6z z@mw6MaNr|wOf6@E-z#8wzF`(0T8BAf@kK~K#>>C{+}L*qnx0V-H`>d*`d>(gwR&}; zTC9!^_Q}TE*7FR>t{VU^-_fvhImYqgx1*lx69&fY6JxgLg*kWeKHdwqmzFDS*T$nS z$D}^}by1te*C1`_TmILe%*nG+Drd_N<@vsc81HL%WBZS&NG(0?L2p)km{%vtsupv3TYZzddXdcQ*G@bH6`1`c*0_bX0C zp6lGl;o=$nX}C_u#XcOubzh775x)k^!9Sag_H48T8lGoca)!$Dc&lI7M!>=0^m&l( z5j-)$1J~1*2OEq2`|djZ{YH5bKJdD0Yao=}!L*~_g5KTHj?MsIz8&!l-0AKh+0l~{ zJUq+e!STZJjn^IDRr>pHj8#2*xKG=&PUeAwU`%zPXmrN5qj^{Cr-B>VR?)BRNB^eMq+eKYzFt{pxbymac`F}q09q>Qn@z7}>{;Yf?{j$o>Ip%Kdu~YhgX-|Jf z?me{scrc}x}0NKVPERe>YI^`45`f8*$D0#95B7@ zP#)}D$URG1Z_>Z6?XuJU;aR4nEW5UmPHEx(Y?4;jHqt3A=+&d;ITDm}tQ?8U_ay_H zwryVYiBP!7l_6|Eiz7R-!0wY4(Tq9=uVZ#i|!@@`+5{EzpqnyK;XX! zb$lDl0urv(dCwP7ul<^um>kDbaztumxsD0vm!~SFay6fXX(u#-J~%&DA&I|B%B0Vb8QM)($x#3>MNBiIaKUk6^XrQJ$l&IqvVL zWja1{Jljg}C{Il0$ExF%iKX5f7uk}I;ufbD!4bFr z{jg4P%eUDCH|12US0+dtLFp6k)wH54o?*ASE7%4fzf+U9a3Y&S(T=zUf3aG{?Y~|5 zv4Ry9?zZ@b<&7yZy@#BA5mi40*b?11CU_C;(# z>GaLAKg6Z{Nq=}InAIQL+H;0I7yY46kM(D?GBGh)rix-cva~wY58?g(h;R0N3+M=u zs5=&ZR^yaDIo2QZ{PwK+f-!1&6W#FKGNv1)VY^~wH5-3(?_@uA;gNv!cOhH)et*1h zE$!=r>yua?h~IV~f}NEvxE_h=VtjUe;9TwZ;XcVe5dR$a;l7DJus`8MWz2pMmHcqt z^!~rxz}MCHgMR`!0<&ol9d~DQTh8s29ct`+9fk!*#^Rb!RX(R;l79 zU}20IBNOnT|HE8$iz$uPI;2Tmcs?_Du$M>M@OEv4-mpDEvECs4Ua28%u0gzKkVeMz zPb944oWGg%+LmRY%kd)5C0RQNVP}IohxvU-eM_<7pX&m_jqjdT^23##^=iYPzrmxy z|7QX+^vEyitXCPcfO};2mx1R4HqCPhrU{R^c=3YAobj~a^wXafJno4np-9SmK;smo z*-wra@Ep<)Ggdzt(*F|&=GNSHJbOJvegh`Zu_1c2UHAt`&6VH_<;C3%n?*wewuijj zGgIE!T)c1TuRrI(xHT$xmUifaJmbAH%4dChe(AfTdU*z%c1*fxznB`O9Wf8uSeG#7MQCrP~JqCR!)k=Z7daKF}r#pDK)w6h=pJ zf1MpeAaAX7PM)Y!((hEBm>WdD)ThqlG5rz`^bEa1jX|VK)gfvPEz;hNznWVaulMZF z+8JSe`?GdQ8e)Ghs19QsPX>@3VOb8mqT3P8b4(SGUWm);AM4as&rjvJmyzedqfbT) zZuYm;H={|LW0ka}{eT&wc95!!%{$pw|MYUA)4q7mjPp5NAhI~(uOqj5GB^(Z?#nyE zVV^Fh(IUk7xX;&Ug6;We@~xa_u(9`E9LTtNU$(T6$MK(dV1kc*`h0j?9`V;2$NO@^ z`=M^XFYYNSt@xqN3WY+CT13cRGnEXN1q9$ehlV4|D15!Y!*qfhfr z$3>$8Kl9*<=Dh@I;F5HkAs{zr*K`2 zG;zKrfs@6T893IVi)+eK8}8bF!;ZY{r?Th{j{+m!bJbqp)TWkwRocMe>aDTzW<$u z!5A_&*u?iY?Xx!@m_GaSfuD~0ga7^5|2LsOema7|e=zKSV+iA=BN)iV{s)S3@zN0t zn^HClJM!oL`0>*TIxT#9 zCY_W|_i_8_1f3RsJ(Et#ulu=Rx)ZkL(z|Np>mi``5% zhD-I*z>v3(e-LalbuLueQyhpD4s6?&mqJ3zILG*P=Qx+64EV!$YWxm`S%u>5_43ZZ z-d-M_l)IX=Rrm)v4<%nV&+|~5M^es1S%>{z*7+Fs7r7n+qF;kMi)K5GJOkS;VWKf! zYix+~PQEs??l1gd7?fYO!G286idpbOT;!AG7{Bfui2GM9TS6M(IrlCt!`aZ1)!=6! zU!CAt9Rp#}hb8wJiJzwe=OW(79>q1LaJa|0Xb;-==lL2!K@@u*A?Pi+|K!A2WoQrX z{iBh#L$rivN2G{i%Cn0zqrB*n z`eZ%qz|$iN5LljNM@{4@@}q3PtCO89hmdC=KGvsXSM_Bl8A1tsB)gYOSu@#v548tS zb_YUMq6=SEVrbgSrn2hD&dzTsD~^{eSzU^9@DpB!n2v8Yb~b_b>;veC?DQ;a&g|@1 z;Pz!F-V|jFO=Z`Son2^Oy2ysp9SdW*)N=lYUZG=%2Zd z)8M)0a%NB*E1j8doHbqqECYE%o24fr#`&n^>8D!!7d*EfaIwCc+lDB0x@^x!Lm!Ts6w8B zc-yb3t{2!K7?hZ8{PF%{#)?ULhV?ELO({cb4#UC4`M4;g@US)Vz+ja`)zU z)v=(KMnR*(_m<_yc9sY&?N$NpW@heu<}@RO9{x}Ukh`oYjzc=Emxrs>2|OxkR*|e< zgG*886VfSO0G0iQD4; zF!J=LHvbvq7kT+FArCup_1{5$g_r*Y@++gf^#6F|v*cg!gO!l%ivKogj7t!TEk(`WS%2SSP_^~V1CG`Z&>FlipkM6#duIl_211>WoDAe$nj zXcA|Vrtb^6-%imiH75PBK@jri(VJ!&LW&;cmY~O>@A{ZYkN0R>_V3w3EQ=oR*Cy%t zdd#H9=jd9~>rsNK{(Ulop0C49dQ;U}8+wCEuZJ;Z%`r+l~#L*yh%>U^XYWUrVURyQJzX#QV^mh<7A}(>mW-|GJ%`O1z(SlJ*XW7<4g2;Km#@4{ zql81NBsu9r)W7Epk`6+WUWjKhQuKJAfxwi*4C$T0_6R9@m!L4&KVN^?b9na4bvGB6 zsqQ8Fx1Y@rV)nzez-v*MpjY(eIWv0C9V9V?6usA>FiFoJADQzA?6Xu$cQbCI&z&Yg zghBpzHX2@te1fLzB`h4rZOW&EW`BZY>ow2wh=pO0KT1DyjX|OK{Jk1^?s4Rt)mwMm zi-?l*oASjf;=uaItxaf5EW;Yr?cXmz9==h^QLlTPW%e1|`R8jL@GM!4{sx8GFp3;* z`WVPA_Yp0_dN;QnaQd2Ifm@EUBf;0kt-WJ>gL^L#AZQ=u-GE+x8P+=i{RZn>oHqvJ zs1I>;jlTueW$~wN(4S>8?potmc0B62Uspb4ei%ibwqP%BZBg>=aE@$Z8l)Ho`J;Sv zViP&;xgwjeoEaQl*u^yIX4%CnQJ!TNk3~6TGyheH$?sg+g;^0hImGOul^yVWDdZO1 zGX#}oM|OY*4T2YIf6!;K1D=gr8({3)f$wkU$PV^{1j8VIy0L=|fRF6Ja@MsS>?hqU zJK*@wvV+H=oOVFpG}m@80GtdehmP%l+qb#41D;(sv4gU|4qs1(lfHPQRGZkFm?Qwk zenHlH_VIkSWJt}09AgRFE8CGy9Pzc2S<4jDxxVdggcTAk}|DSi}px~)r5;=Im99a5oL_l>rpDSilg`=aURE5 z6ZPuoXc>P%C~aXUg{r}qdFD{8(-bUDdA5~n%{YB}5rzf(`O7+t9kE|;PLI8d_RVmi zZwDNCwBx0+byI^y|_$=m-l z@F|C6%r*-Q5?zU7KLK7EI3;0(0<8k((~3;#C;Sl&t~L&97V!^i@7jI;o@CITQ~Ri4{p>6 zRpk+rAptBt&=X&DlHx~x*&xy{)%;TAA1^rf;;eNSN}U{+?U*W+hVVhdA)Fue4mCt= zYWK^k!QxU)VTtpV!Kww9c==0VSAX&HA4b~t8Odee(K@DY)--vAuaa+6;9Pju7AGU+>rGT~mV8<~h) z@cPe6VU)uzc1HLB;EIhez6WEnfOWP$q>_ihngT+)ab?c)FOV|)P@PiekDte*40?2J z>{#4~GVqjpzt*irdi!u;vc#bXazlwR2^`B0Gi|JnmUB+@a4+A0{4}nG8q=3jpRLC2 zISK<`(DHsG?NDS`+cQQ1x`PdEe;neJ3;`P}8|cRuOi`w7;G}e2z?GE=C`-xknJBaU zq#XJbhJ8aHm;Sy`oY2=PSlP&#__+#4I#%xgj55moU0NqTkUS;i-A*1S7(6&1ck<}# zMHvJ6nyox22Zp(n$IF0^yd4O6u?{XrSN0Gn~=r8 zT*|`Y0^cHA?19}GhaD@Z3ZI3anT(rPDBhXKrQNvU*fp}L?!n7<#tP$wUF9)6B0;C( zP903YGW{~Yjhua()!DZ3%NI?96az&dbx6p3`eWpAUyJmkwK0JZXsbsvkz9kdfG6J5 z(ZtT@Bsjx0jreZmtyCQ=RK^Flk{icA`v!k*^G)f*acmvgIt*!t&}B$H5f<~_@`oWl4;R;(=i`d=VO%6(DKqwE2`=Vg!!7A(8^M18;5{2s zIrWh(+b6+|wOrS@?LL(FGiapNk?3=Z2KQ8yi_X{b|9J9`@g)3nw!0A5MYt};l|d)9 zHd_ujl|fT|C1kx3O>7&H#|q73ZgR4I4a&&tXEpw`#+PVJ{(RXhd{VEQ0A}HY)=JIy zc(mStvMgHv5VaNgDD5N-8P>{+(11KG&89L@xx4;et2}&O+gh7_E%L9!#l3Svj(h~h z(h<6=HQ(d)?aL@*-+cVce??&}9m;_HeWQUF-2*N`vp;3aw54|XXFX)+`f7Fh8AB_y zy8SoJ|EtDVX#8G{->30Djo+{FRT_Ul;}2^5A&oz*@kcb)c`*Da^5m^Y?f*?kzZnrl>F3O#KS9ys|VgDtvj^j>$$H$J5 z9#4*~#)wa&+p*#CA7+gWA9wbc=ui2hb=q%?4QB_RG<^?0p>^=RB9qHZd4^p2H=@eQ zPi!8%+I-8g=JhEzZt&;EG_ENQ%wIzP9mu~ES6nCkn^0tF3GE{^zt!v0Z78FjZ`b&b z8vjA#|JL}oCKeuid0uYHv--XnRWbVa*1SjGp5^3DFnHuF0{rACC&si<#t+uGgqZYg z-`|C_?nRRQ--4}?=5BD3wn00{wdl}K0nj=CmR1)<6mg}bHv0Adl8+y8|i<+ z^&VXG3klso1dbQc%~6`~@n|27GSWtw#6B;+4CsHZG%!gzvS86Z3mxwFnfK?e@0hmX zw>AF0#^2MJefR0nzo~B{UkRFKiSE<9ueSHc(gi4E-?&atSdp9h$|TN|ALpK(?L1ow zcPdVf2jZq}Fs46bOrOYDeOP!I^2A|vM*n;jF8XEl$w@v^K9o8l4%n-+8Ouin<)rrl z6DM({e8Vv_$Ca}6`ztPA=5JAc2DNU!+N#bwN&Zqc`hYaf;9&-5aH7U>JKxxgVyj=V zKiHkki@tTPqnzXlYf}?E7%A|90cmaEX+x>KgnRysjR;_1*=KP+chUkRg#1-IYdZD~ zZ9`OH4IXVvyr&=yUUOeCv3ys9u!o?G?`rbTKT>^?Ka&C&fo)p#sW0EGPxN*Yy6BS( zAKQQF6C0BUzfWI6o;=g%cHAfVzb_hS8~T@&p6v5;QI{NTqo;SX6+;(&k|{gZC-R=` z(^pW&a_jp$(v!QRWbkp`O!bM+uQlxtJ&A-a`XjC-)*tpI(VtM~!SHyk%j%D|vCp2% zckUsB@Q2!F3GW}&CmKPWx4(r?krCx&$KSC0|J~FPU#1NB%wSU)(5p!3LI&azV={n` zlKf(*QO8~gU+Z9G%xNCBZ2LUF7iH+re6B0Vf6G2YmvlMFv)FZLm(qKEH=tQz@Pdx| z8qUBB(p@~C&RLSd<~d_Bm^^t}ADuS^T;s8?3{_kF&##jM|d^%}hY>NScJ=M@XKQHP25U#)_z+y)rh`hzq+ zLEC^2c~*e?P4d-){OsO?wdftdVf(ne7_2;LFv=g0_hNBOw0g(iDX9Nb*1ICo@5S1; zL*DVj_geVx`Z4{%80NR)+rEb>`nI~@vEP9Q&Ir#zeOHsLZ{urR_)2-VNTys;?|t!Q z;isei{9Ve$zHkMOoq_h>QZA|Y)cCUS(|_l3Y4Kj2OnXVaSI3uypZ+_SON;jaWy&S> z9w1*9emas1{6bs*^7r%(H@r`%>AS%=-sn^DJ|XYDZGJkE3;OK6x6MySF!#KlE&dKA zE8lzG&vwuI*<^jsciZxPb1mjQtg+MY)Jn~JzMc7L-A7nDE#{F-I;nZY$L*&RbXxf3 zOgbsQ?Bn*+2|9eZSpruJ#_!nmLMEM=yo-$b*=7~gA)T$4et%l|p+9|ou*`e+p`VU? zCEk_jz5CElM=*F-qWA7YKOMo~U5T6U6ag>3o6$>0FnCvD+jrB!M>Tz4C2d#iSKkqW z(-S@mD8iwSJCrH+?1up13sF)nYq~)+-^}ctS6*UD^Fwmp4bQrTH3mU{z<`b-o%Pmp()pt;a* za(*E9%y`Bi@}DZp;ni^BY#BD^$$ttP(C9l|tRj!AfWqj2yEO^edYU@yTkW$@@_$rT zuno>h7B9f@(-7$r7{TJQvf7U_%Is>b120AvLsR@zSW!-jY+7M3W|vPLyX)iA$TJWp z%ItIQ;eIUxAB*=XoYJ*tN4YNn26S^@R#=>`<7{Z8P%oE;w40iePnT7IFI z=4l@BgPxq}d@9N>{{qsV_VWLZG=st~|Fy~5KDaZc!xW~4UUNJJHhL{ty<(?m5E6e{ zuMntye~nNo6RTIzCyFIzov+tDTEX&2ub_)OgT-}^UPXYj(koB4MX%OhV!&eRa&m6x zFTJsfVPV1`qNGlzP)235e7PH|(5drm?e&VYPcvSPg90Yg282_#3|bxgERG?OL1C&< z%GX9G8#r|z-o*D=IvRXNAeuJ-C~$c-ashL8slE%MkwDZbd1Tr+>6pX##cb0ru*NGqS`rol1pp1MQ zk*$L1M=KkVo7k3T$}qT-cTFT@+DHRc**0QsoUtYG`8M(@EZDax!)<$Fv1U*J~Q`7cAi=%yf zRAXW%KX~pT@*(EFD6OO4+D1QM7zpdzMki~+t!N{%ctNeat3Cbv%SW`1W6Jo{c5D7? zh(dzO#;y5@lVxBKYkmXAJo@0){5K#Ex;d`FZQW|S*f;SAs-zB)TjSfY_-|T=eC9kz z$Etj#);_Jq?>4j(ojD)BtrzdIK&ipkxsU(E{Ao5q7{oy_4n6eca&~D23k4U{tfC0V?^B7BJcEy>`_!)(y1B0^EO=VdiOm9h`IXuR z_+`DZKgws?FXgZNte|Y{p1fNhv>k0lm(HFGGu*#?5~NKSL`2?vdp-+!t3z4WMLKi_ zZEeEZb5f57%AWUww=8@1-)+>TJr4pU1G}7(#f!Cq{f*mmw9fGDc^}|t&+k`Ub79ZK zsrJ*b6-=~+1T^vB6#`^=zJC5O&;GTO?YWmx`fBxjD(g;6;+Sa${ z7ojZMo|~_+l6pK)_DosBUhsf&+&^=zg<{crm-al(b_kjF{1UB5+p}36CCBwufCqo! z2N1JvF6@~&+u8Hi4PE(8rt&mn|9nkE?||C#!wk>9J@cIyDDB#w&zDB{8PvAEJ)e!T zY}uNc+7)<0}!97S?HcUd#u9g9d*XSO=Uf@9PjJ;lM-8enHpm@xG0E z(9L~I$~yM zhN9c}xff)jp7e2M;@K~Ny?d0>i1i4zAI6?PV+w;{hpqF+a~Xx;U)ngC7(RL}yl>OW ztNXw47qsos=t9%;3!Vwf_q&PF(ON#G&twGNGX@xk?mWZNvNRyq#rxRCgZJ(JkHAg4 zzg6Sgl-7}1{@a{&IIbu&1ZV%&el2a}llCtA!!M!{+p?Z#DvP50iq%NdAX)F*1o~*( z$eQU(nqR9&RBh!ytd|{LC#9 zBgvS&LZM5^vPcOd71`4O~;;>F<}nG*t4`O4cKq1u{RGgCQtL&AI1xnx7mz6_LKbs&N&-< z9FvN( za_l{n&)p>MU4zW5#-5dPtFfnc9E39K#Xnlley+t8RBPpWVWKk5HxO6GCmPM`g|F%NQ zTG_asjqu%wMtjC`!;Kjr+3R+GoE03i}w*%1|Ia$*~ZI38-2{Z zOydhQex=6eBW54BMz&K3?0qwDO{q!gkXFZfNE`^hoymU5o(V%QnR6cPiEUB8;`Ojf zYnRN^=c1psUe==+Gd92C-AI2!^RVL;AO71d$gzciIRj;1KpK7A!7}uHKjVvna0lZH zHUH`$x1ae}X#PAgO?megSqNSg1OtpO4(2x)TYkSMqBVKY?`9n39tk|qOLV@05rpR; zh+gn_zW%+2s+2Iu-#f2)rNl@wCa?Y&*?~M{E9H<>Y>YJ9H(mmG@G9ek_&CRk-kSr}V)`)3t6VzKFIZGEDd)9^@NIntpcYi>^)hqHCu?hJmIja_htw6##4H4Eg(V z?z4D~1N)~SL)rd=#&6L0%^JT^<2NCu?C%O+WO-}G6YZ!IU!=Y)N56_b=M-N~`H>JqH7br=-QUPXc%{Ws=ocXN!qqb_rtu>Mr%4C~f==O3fC5n?W*48kCIfu;$M^{>$d`yyu`1}RTNEMmfWda>_|llRB5 z?q29i)AKXb69%1IKE?kvd;e_)PP_I^;RO8ReQ9{R)|sz%Jpa*(AGn&{=Rm(@eR6}s zBA@gLvfhAwSzg`zez=yk8dE0&CO)RzV=sbF_JVGYVa~Ti+=`pBHMZ~-lt@^}U&_s& z&&QCb4q3k3*PETpwXT(}nvEggZ8|@9AcKIi6&cibR~ohaV;Z&tq00JI?u$?}rDk&e8d1y6(Dp4q?WVK>=#Q1Y# zfI1`Jkfn^Hf7d+L=PjQPe-z*%n}}Nj@vXxZ`N{h3$QD>(Xhvhh+JSs_K=@hj>HTGZ zx4M3Xm&W?OE4?2Fmb=kA`vLe!pXPyb2s@^~SVol@FB1g-83J+o^2a%3O#a`}d<&lx z@QgWroO6p7w%8}o4c^Z8A76bb&@!08c;|JoJo(1ha_8?aN8ak>d`%Mu^kn>* zr_*V!kpp9WPYWHOPR10+7-4bdWn`~^w6m`)(tq6nA}vqPo?|`_pzhqTjco@U10r9y zjv97S)joQ*ZG67}pGeQHQ!?~@zLg>{B<|Zt$)uR=X2%X{c+x7_z&Cp?E^i|J-ZY?`)%;0dT-@tgCWDecfL@Z zp)IDzvu}(37`C?P4c(M2`f_DII9>Mp2?nfYOHbn zFl#cNJV@ZyK1UjC*^A*H=qk~rQ~-Z z%B=jvrXauQUrPqQ6B*J6`sY;k(iZi105SQQseKWT+D^yzWo^2heGMBPJ)c$DYF8zs*=|ijeQyR_ zaOc-v!w4bMzAi?Em7le*q|fs0tC6{ zWWy782{0W~2N~dARb}Up++Q)3#OeFAw;>;s8Q}A{e_1!+LgP5FX#LvHQBJ%2g~m5& zOwY-3d+v|zh59)%%jd_2nBeD|BvE04-|56!&L(wBA~a8p?sd%L7z6Hk(4EBVG~TH3 zCXHz$gxjL=R*knIX1~!V^IREaQjn+0m@?0oF;$Angfl*UCJ@N=#p?QFxq(=2V=PDJ z5J;b6+WK?Kjb)I1^8TOmU*29Ic5fGL#J@j9aX_DPfB6{XY14KrKM>_dG-_pZ0h`B( zN_9M_6^gs@L7Ab^>K>OKsq7j-E5lE#wcnEg1NnO6xZKtAZ#`&k#_`u73JEffgFC+t zQ;qVJi*KW6B5!S!GF(8N@Xa0wgyk5>vQO4^vJSCw2DsZ3fL?6QXeAfwLFB@Nh2DIz zQR&Z*?7>(r@h|Ybs5N|YK1!`cUF4xi-M#u#yX zGCE7jjo}hpR)+8?kYS@D;~ZxLn(8MUX+y?Np5M?i+_%BEoMrT)d!$Tg2XD{n=B?K< zOmO=CR?BG3!MBp-sep2_?DJ*WKL@hBL3q&Vqbpgy7A>tTU#DrxsvB8e4|uleRF?Nw z_?gP`v1spP+3(BJJr*JS%*-yiD`qf5nEmS1E?*B=E6X=%x?5RtRCFWD2PphZW%)R? zcd{JtWf{HDp8U*Amfu24hVEtg4`^j&`9@85D@%@wZe)phMc`*D%g3X=ljTNVmeI?O zW-iNb13N?avV0R-Sy{eW)7{FFqoNyG9;fg#mE~z@?_{~jmu2*Zj+x8yJHXD+y)55? zR#uj8)pWPA7#k}LjZRJo22 zO5;5mk88}e6zl66HxLsyHWa#EXNP3H&V;Pjr*Pjv6MZ((ZxaLZX80io+^83aTmzHQ zMkdn_VhE(kwVbYpr9Uh~U(GWI3e)TD19U!{r)z|Hs;_yF3;Q(hNg6*{+iu_*q_DRV z6h?+EyDfX7?ZCszCEj}&nST(!YaP|gGr4xpje1#+|A*G2Uv3SL^_cV(Fv&IiN{-zh zM)fP7hxCuUJazVC&1bEdP_^9Ij{- z6`POXS6+xT^kLht777_$%^p9L88JpTyzyOK|)&f#VShBY3EX!5ANH^^o9GWJ&tU zgUE7;m!~Yfeu)h{hGkvI@@Ek~k;6lgkINy}2hoQ|Q{-?{0>|G{INHnd=LsBtRveKm zV>mjJCEHSVzOS)94`nMquQXssPR6uf)VVzDHyrfxl=;FaFET$B`EF$Xi+KCsHsrgN z`F|#GJUoRXCNI&Ol?VDOdi$>gj=!XE44}lxLU2%?yey8JqrBM9?~sr8Wg|*l8^Php zTln~;SN{;CZ^1bUZ=lF;22aKR-S?n6ZTBLKLWkUSrg|O$`|7#`X7Uq0S4cq;C}%O z3}zGeUxxdkjG+hD23+(bd0afBBVXHb(GPpN6Px-0%H+QZ_I179xe9nN|4s1b>}4p! ze-rGx&NrdC;AAl4_rL@={{?q`|0RqNXdcYJRASB3HqZ}u&gHL>VGD~Fz_y#556U_de9F3+c$%FL z!iHn#e*j%+*J?_$ zZMoKtOAXJP0X9ET8e>&lZq%lPOu3Pk?H};U`V_Q7U6Z)@7QhkjVSo|24MCWc-%x$8 zCqgR|E2r>J+OCP5L{I+>7zX0U71I;irDTaRcMf}zwu3yEte)7L7XfG)qE$y~Iw^nX zw$<|oxyPZM=)kw>=$4i6I(wV`F{nt$)XlZ1vbsT^olV>MJ1MJ9Z2B3%Nt=EOV#*tM zt*&xUjmlcu^t~0XTba7^Ftuy`X|or&7|2U^cKs7+ho4N@eF7C$cAi~Z`*!iEfFtcL z?K*d|wuAhftgK$Fu4vb^A>zl?)UK^O(azcR&DyS+U2}Crya=lvjUStCX78>1%{$Rv zY~AX`zHmnIcBz;BXvUDKm(QRgOD`v(96aP~%r!py)U93~q3wLVpzngq*URBrCVGJj zV<0`iIDeC&m-%ZHPV`bw`rx{jiOl3!jg2>c_4Jn)w>Y&-oL!QJK0ilGMdCV4!1x z1MI4xb6w24Q`>;C%XElbnW-)TowR6AsaP913k6yR7&*(c>p}8*6fX8gaRd)Wnt}OtbLtZS z)6JQkz_vakYsnAzmHq7#NwtBMt3z0 zpWWN#O~A^KZI|ys4RuW!_&$K90bX)1(z;IV@@WbWoE_UGB}w`R!!FMNox8#=pG3OO zb~qAEpJ}(UKaBEnc65v8+l;f|mw@ZmE>G+b_pcSVwMn5f0>?pz8Qmfl-O;b7{3T&o zj$rM}?1g`B3h_Iwb-u5>6lIW$w1K4TycGTxW#A#yv$#;#T;XrD{P!CFkG9w$~-;SoeOMgd( zBr2GQ=^@gy1QZ^=-1+Gvvj~mz8E`G$7u>oYNy!7o&4K4fFfzYcy*HCB)(&ny!`dWu#({QAe_tx^ zEKH8_)}y7r^lwQ2LGzH!s+S;rD=wrZD4(2vLheNlmVfESpZpPgk@xQGL?U4B0k+kEmFgH`9F z-r5b|#rJR5_K?q_Jyz*j2AHv#Rj{L#$ z^&Z_E*VxXNwcay{e}07WP1!Vg$6@eOz{vRO!teiC@wOSe!Ov5;+xz~%bcmbYm3;eG zST+lyZyU|CH0!Ye~Zmg*;=G~}uSW_)ojkdbY7kJPYyT4Omz(4l%(iN%4xJ!*i zw2`sojU5>m^n&bv8$ITp4w!>w@7>t|xM2bYicJ;=xLb~D~?#nf&>47oj*C+9IrMKIf>g^3Fyj{uRP&Aj&gI`|`|A2f<4t-t8VXYv=PY*61?;DYi z;RU;0*aOi?=)td#_ch4J@badLKpME#_IsNJP4Rn45-%Na=XeJdG==xlB;Kyp54Y`T zhWAY=yj|JDa5KDbPT}p!9!kydaz7r^+vaZk?`=Dq;eBfgZ#Vw;wvlFd-rto&-A8udY4Da~~yxx&;2YTblqX|8Te7#+cysx*dUFq$P zrh0o<3U4>^y`$-T{Le|eUD?AOJ!meW2fw}?-hq5f4*gy6+teQ3Y4MhJ;wZn|n_TzF z0>OXAiO=2u7R`h|2-uuO{M9b8LsnVdS7E;;1?)?!GtWn&Uiw!nR`9aNa-U~FY%3i| z@0rI(lNZcK;EL*7@abS(s0F`HS(Totx_ukoDg?Wt8JV9qnG9`lI6sEIJ&q1=SD$otQd?nb_Jv5U4`OVLAh>RuhL$1 z9bl;-=Ap|~JdgAP=SkM>K;12V1=462vTZU@UMx@60gsfUJ{G{Ul#>oGgZ@$ zjFj*QtIxuZwv{o>Le0nQ7ku&m7EYJo!Hp%36RTsu$vq?H$s4bb{iNUV{*+A`$KXoc zrx2OU&hHEY?Gtg42K9UjV(<|@S>tDDe7eTZ(|B0pa}l%cf$%$b0xxCB@E2S*&3jBX z&3lA4{U=S6pM&LhNGlmAKbBLken6R&qdpeEzm&5LFXYAVuwR;=3%@f6bo4un#YtG) z8Ga`uZSqN&j{J^2DzdTfcW&(g76co6erJiP32ZFfp^S7RzXLBK!ANw;BQp@KVbKrME_$2w35hB3}xr*O;Hu4A4?{J(@dhD0-;B1k44ks&B zx}D_x(L+%e`5ge|ca7l_F%pOi64$xmC{w6buXI-9zDLLv8S}KGb4ry)VR*D$QfP$} znb4ODFXf4ma(%o!kzk0h4`93G`b$_+KM3yf8z0i&TOgpJ+loibXwEnP3h=ahhF{`h znl#sP4FkMJND7&uJR{T>Vw>XxC!Q{|EBGAvBo(Z{(q8$+ywB*hM&2s#F2bKt5#z zd#be6tOI_TcRf3fJ%5gRu_Ij@2chY29%N?YO!r4h7_Ksydy<;-c)c za0$LfVWNOB)z7`FAtiipo#l_Id|?C|0aZfLdDFD<9h89@0syoq^|2u5o<0Rz6DCKd>#8rS~vC`!h3H9*dR|GG*C76=hh{ zSoZ`W_irqpMoii>k>wh+>p+$PY5Fpn3t2uNIKe+;S>v9+-}}q3^k+HhBD-wtR255I zWQQD45(fE8Ie4}bd>wh)Ken;#i|ISJ>^7vbv9&tdvP6o_d%B0!C z*DX9T{vPAhvv0t~XWv4ufrtxv@nb_sQ#SdXqlL!EU@x+^z9la!2>60BK0~vCt;egf zi*aqu_>FKKTJiV;?L%LLI;(5uFGL=((8hYE+4Ew#9c))C)F&!@2Pdu8wBdLSc2@S5 zOZh~t<0-R0Ad2DuRZjiOgS+NUl{YIUu=XxyYjDaY^+EdORjH3sLAyN zPI1N>BgM$}@H}rn&zrOyxT&Ye1~(ulVUWK`8^oOHmO8x=02a>E=^CCCY55vU3;e8k zDCFVcUPD>g_MYxVx5KFOb?g28UfP_1`q&tiGvPhO_}DF(f_$UIRSg5_MPv6NQU(623vpHa_b@WV84i5(P?MjwK( zSU;;a!ENe*yB$Y3`q7jf7+BT_u1McoqzpejOt8JL?{6Y+_1y!q)>p$vimwK&#A`J^ z3^8$F9i{)ZkiRfB_%GesZuZL5Lmt#o$n}=>X}}2`NT2d}1-FB3v6c{dlmIF6z(3VQ z7`#UztzBO|dGJqWQ+=!^pPn41S%yGVNjZdL2@<3~0Z2JOzw|)N!2w6W7Q1EQO375)0_Fs6`K^C@7-tjSwJi|0DdL@;i zygx$!9xr9o3oQ)tm2(lrZ+$_q2j#^7LR_qqGXQxbXzG>SG zY>PQ0T0c}uSbN0(hYs1vT!S{@I$Ri&A<9Ddu<+iB19D#TA>@zLJosOOH9?4Vb%?o8 z=l~}6zl?TcVJF(LkD=O%ce_sTb!RK50+WPHTlom8GHfMxAePwt!>#JdQIsZjH!N?1rGvD4&IBalP>j}x*q~vMEX^H$Ei+nk1NE!HtfN5G_GTC z9gAx{uKVM90ImmWn{M^D3+;UUdAB{JPv9YQtjETG@8->X{}Dkc2gpdzC?3lqhD?2O zt!nkjHm4v@Uf37L=%?U=?dP@wzx)x3vAB3tYCUA<#yeypZBP~)=gOCRhY#ES7FW09 z8%^9;Z8s*-CmEBFVR$?)*h~0eARsU3w~WONng_o!78TaQ#Kt20RI|Nb_%FcY>oNLT zq@f4Av(V$?*qR|zj~_!tmL54S$P;X}YdvyoQBIIcOFa@l^+;G=Sz{JBQhpks9qSS8 zMUUuD$ki(8Sp9JgtbB_8dI7^ZM`2?6Yv)Tx&`xw%D~(}Yu`zib!#N=~?zr9tEQ?8x zV`wuoe|_%IWg?Yym-_uy$=xwS=lk-7pjGO-^#!ktazNhi8 zPap;cCnvwZSEIuA*V@=L${;7{BY23tCv6Gk*ZMt;!6VU@{jz7d!0T+>+6~IGY&>PZ zfJ?1|z_0kxv+#VWva2#t7=_WBSIDB);N8kZ%(^kJ#o9!* zvEqEzzWNMeV{m#v!ukb1CnG%Bc^h*w{sYW=xbgiIWSM1~Zg2N;;Gs;g-bn4OA*a~= zXn?J`Q{h|L_el!Vt(?cvPUJkY2lpGsc}7JcyCop`jQiOL5LMC-%E+u8p3Nc#E{(0; z*RIn7wF5aPsG>~hW<9tC4&)iqUSctLaNZIGh5FcrU6o>f3abDFYggB4TJv&0g1Bv- z>t>rrQqI#@hv1$I>v4V9!EyxY0@gz#CTmPWa9W>82-tudn~**GCN0A;e6cEe6pcON zze%J=q`eZC*PnbvKZc-utzD05<$o=EOIplFvMwRVz@9l+(&uwRMz(1l+@ra3!^2LY zoxww{raX|BuryYP%c9`!Vv`Tq=To<}(SZScFqx@3&Pj{qQM%tmzu&y$YdiE2tdn)|Fy4PcH=Cg^v~|Aq6M!f0AJ?{^ zhjZG(ctAGwg$pXPrfY?hwJq&n2h!FKn5Vyl-xj_gPw(EcX6!N9g{IM*y% znvp!NU=f3p2kWfwy9gER_bYI*PvXak$Mw{d`+k&j74&EO+tja-262L(l~ZsP@}x&C zSsAV-JGh$O#msXx`aj7(qLmb(YzJHB8`0M(n^88n}X2_K1#i(Ha z&coHIJh|`eM4sG3CFS`6l#w2_JX3itXns~J-%P`IzPE1f?H}BT12G2WAtplt*gB4F zj>VG{7Wrj^NWWC`SX(c9yx`oM$7h&PYH+fA$5g2_G+vt=YV^8twyy?@hl0leN{ykPpGgVoRjL}h~l zFptm)KU65;7K4QPUa}-*3sJUx@08orTet%1Q5PJkaA@09e~(od^d+{RhaC8yCi!o{ zBET>ZKg!p_?xkGht>vA_3*&U{=T1KT@%fXV+S}JhX}i9y{c-yJr)&QPI+QKxs;qN+ zk(PIXA!cyz)G}EM%lFTPk4KrxWYL=mi;H^l@C9@}EVEZw+Ous--^Q3-$)GA#$9L_i zR>$%8O9G&Y;K5kx%ARaH^yjc8$na8r4!b|nPxJDFNW<==zLou*1{lx&Ho^V|jC4)g zr2TCIJOk;rL0!^=u}`y=$j7czT4t zsSWbn#M+6thRv0gFBhe5<~mp)jE5=EM)7jPy8DlNYpK zGS}l~C2PrG}5D%50pG# zq%=Z#7?L}z=tdT4ZorkYPxIiUZ?$}?+dWRncIb!hIrkBRgdY5|ZW+e;sZtVzMMT#AC?k#CT8DWpw|#<3lW0Sj>>uvSy8bosZ^HlCid+A~Axr08 zlra$JS|)sn^I09-C15e@qdr{4A_f$hI$z%GiEW!Sz&a4;~MD2GZn( zv@ixU*Cy~i?!1b;6BcbV&#PX7IKWPxpKE9 zAycmOB{PxhKcgM_y9^ik=|rx-1srXeF_~ezPUQ-l6q|k~WXgL6zD(^H%<>VwEt6+$ zmubt>sOOnP@8(8jeAj5%{^5sh$hYr90K^iD@6bxH@}$8iZ~S+Zrw^N~LcbxS`U z)gLy2HN}Nq{xwKn=H)qqH@y6pk+!lWzV9PXyR@?ZMI!(EM4tD1J@|F-H?chThkpIh ziF`hh-Zzq#_onnQ;oi%@yY0ZA?AQ}`*zhT z)gdrJ0{s9+V0*}O-G@MTXy@d3uaw5{(ngFA5uOb0#%N6-**=B4&mc+S*5Vk?FU!CU z4ol+(g}`=-U%TYv52-tmtH-z2mHoqKr-cmJHp9Ah%UcmGgJnK#jAmdsy~ zfxE5Do8Zrod5-oUmwEqCOPM#poh5UgEhcfp*imY1Hl@!dxHn3Rn4Ra&M_Cd#hfKG) z{c{hDRT-NXq;L#TygCDaOIvAz zTZ?1klXFy3E-h`P3GOUgxhMm7OIvAzJIhusR@{bnd+y&rDg67RPJYzMLr;G6V>};= zVt4-l_SVV0h~96Z5p4_W33E?lSL&X|x=(}LB?_l@9PC2An|l$CUvC@&g}cYW^mif} z>%JH8JLhg(cGVZGtxR8v=*wtjB5{v~<50dEHY5H${Q*rg{=x5()4a73?gPd9b1D9Q zm6H8vbypUzj{>1ic%>eppLM^NZ@U|t7u&J6q6SPjgciKFyoUwd@Z0f`Zv4J1x3Zrq zmB)*=Hx5>OAlHeV^oP91_}4+wp8urmmw)QACj2_PFO}++Ta}~O$;ln^s%;?qWp|vR zeE&b@z68#(qc~sM0UW@9*T(q5_Soy&D>Ry8cXl!M*v7X3bA@natdTS`Vn-uc(#-Ax zfrS80xbGv}A>4%fCc#_*0wj=d1`;4Z0^tlt2nhlIzpwhL*RP*ucD?+5|M%Njz3#61 zx~jUm`p{FqjO=E5FMSQgN!w$cEq*&WFT#kYDOu#VSR2^wIM`oomZ^IuGI0?LSF&ys zFHU*F0T9?a;jt@GN9( zAWP7>1LsKe?HJB75jQ*C`VVW%z6-dHyAIg1VdH`v}z*Ij$h`y|Gx z?^${9q2oT{W{}OaX-JD5>+5J#5jM7C`HdUPnzf^oZF6JNNZGP>6w#c$#oxH6xS2NI z(2koPe~!M-0n{1VJfy81@c=_@9jl4hj$59yNm+Akyy@{J^wZJ(HfP5z&plMxHa&I( ze~V=^{kYM<;(5@_+fB~#*i0Me?6!%qfwGM18(6y^c|GIu4%dr)+e?gj-o|zt-H-2m zu>CkYN4QbV8C*P^pIF~HlOIR6JpZ6&HFbHrI$1Z}ug#bp`btRqxg>|=-pWd1j-}e#4>4w(0)8X}^qR+w!7=l+D?XpYFRP{}4R#*nW4$pWX+aD*P_#9i-%S z6#pYHZ0Wzdy9#O8+WEw$zt4CLcqrd1Eib?~{66DHpxuf;ejaW4ZgY^|B`v@t4g57N zKV(0s?=$`ke8#RgK3RSMwUGH8$yq4R*p=Vqui+do|D_`yc(b8;W!#5kqtAyO}J%!nLAl>C2e>eic&WG1oA1#KM#Nl68$JMKDI0zn`ILz>`NM5P#zXqysCdZ!eKY2?9sI3Y8RBOTC>Lax`QfW@ zFE;G$<=Ht4n|i(zw3&G~4w%=NBPUcvR5kkDM?6g~h@18_ph?-(8%8 z@{I0smeA(yK|Am|oc8Dek2?P@?D1;gM*cB5fjnNU^Oo9UoItn^r#)@}-l5uKR9|@w za3fpbC;R3)9JX*+&KAcf`U+|*<5{jl>NkDx9jaY6ip8%5wzf@ps`+sE$p?XME@vAZ zM;?ZvLy02;@Wu9c5b~(U@7uCNjU%tKI4+LB9)~fGe9&wVp^n38kD=8Wm_Du^E_=K_ zZ;!(mM?P2@2R^UEX^%DF{jU7u4Zx22%VCTqACz-nwLNq!as375d>-_W`p!D|epj}6 zBe1n?)Xxf}&RaI-aOcEaDPQ69RfiHw_JS|A2j@4`d2hv!?NGQzn9^YGLw&as0_b}Jmm=oY#M#a{|4~G$Rq8CRM}R8 zE&uCte}Hq`nV{o>*5V#__fq)_j+f=!U*YA-+a@V#=z9B~%7c&HVXwQ!>4Kw^b=jjr zT7FmXXqz4}r!F->BkeP&_iY3Dp94{b!Pa zT$h*qTBB2MuPk(V0oIm@R_rXrO)I~;nYi)Z+U~wK28)~YzC1NxNePJx(D)T zGhP?s&)r|7?&s{iwTGWOUW!)R*~Nd6 zU@;GmUAVI?SJEz*p~%_da&>=&y1&xi$9B0F@(;INxbG=;!Ec%AEB=cCTUT<pg!Nv_^l)B<2=Cf zAN22@3;Lq$iM<`T<>mdI*_jRm;nuK<^KGcFv@47!~B1ICd?D8{Ps+u znM&<n0&d8`lo2OZxb^^KHv9gaLDCtr{_dhqsZBTpLfNdn-?>EKK^)7PXPG&m)m>)b5*v{ zc?CZPE#~F&eIn;I#6%1~sIww&gm`~~zdyD7ka1Jb_o0pa8ke%OZty05U+>ztj3p=M zwf+lU%a^k~*YBW3v9}ZZM(MYo;s3m7N>^vn#?I#B%Er$J5B=rq88XLamaU3@5BaN2*D-L_mYc<-7?M9vNXw7P1 z(6h3q@B!t|K6A34?(o~qxt%1yrR6*VX?9jE6WdGlWjo+#tN|pNt2L0D<<~MALjVaL7uCBC9v;8c82$a z1n)TVgcrYS46JqJW_eFUI+mMpUwH9*)WEwy)=a%8AszF!kte)3pVRYB8jZES)Gg+H zuj4f@MR4|>6opZy`PoNfevW`rH`;%t((Uys?bXHZ+*A|!yfi=ePw0!xbM1W^?j8Ta zL@gjpPoX5se<{*2|5?cM{F76P-)Nxgzbe6R<4&neyL<7c7eShl{XPlaMd*`++BR$-U>Gnc2r>+%a!A*vxwl{(;oI=J+3F2EVt#Ly&g5 z>SrMsc*VT_-4G{ zoAk}K!9ufF5t>y^)1-&xG$recCh*!wTkct+LUcf9K;QKb|izBxtKrh+waKIrASle3+*SrPvSda?}<;+VqJH;t(|$- zo0j^ErGcbuIc&ITJG0ko`^4+_gSXGufXFM;SHwPy9h6_&2lhB<`&?#tyq#zl+J`nj z-1gxlO6=1Zv?nV~*nFb0yq6vxT@TSN2LzzNE_bll8`<%xHX|S<|ks&$euVU)4x`b_u&H_6%udJVZQ}XbibSjoXCh6lY?m|cBH(UN1 z<&dHLMEl7&L!M)i%{h}jCzT()<>-4z_}}ln%1kWcN6OE#=@C9x25rW+@fn_nX4`K8Rjy6h_9l?h zwl~_(L$xh&HnJ`ES7=+#K1h40wtcqcN8CLga{|$m|H+Ll8)5g-I%psVe#70b^g!dCOx4&7oiI988|8!++OY}#P!P-IQCzOe4$SUvS!)>V~ z{25-EWBe70aLyx6T53qm`g~EwQHimoBMuP4)*P{BXrQ~q-RFSR$|bfSo=dxZG^TO+cN2n_I+UNwOg?Wkx7eIjlN!>a zKPeeVR9UF6?qROr!?wmYzv1deE^!6&V$5-C$ui;v z?_hNu2M_-?t1J4q@k`ULt%f=*;ox-rD3Ihz>dN^-O4r9CpSm8v-@)oS2cGf3w^6&g zG0ORHtKm;CFm-RfT|b6eUuqR#sl9*y2`s-SeN%iRc8kt?Yy=Q}A~{}}nK{|WdzSX~c*XFTw2q-*IHpcP$vjm4!3_JCI^YZ5>M#_`;b zqa2V``uLyad79n5TmgG|kAIlGcRY5Ef;GOcXSHiLaIB8UGveubo`-ZK8+j_t{yMhF z*IO%<2~dPO760-3q$Gp4<%7r@jVDt|XLBu&;IR>vd|T|?BGyUC7rxU1YYvaHD7^AZ zHj-baugjb~;A)CpG( z?>5NP`hFDY2yd;YTElotkWcw_(qBHd0iN-eV!X&-$}iaf&v;8Q9(7atmY=@?p7EAq zJYp%lEsR#9>}R~C7%%phk8glyyrmc~_Lom=fM>j=7%%dd@{99$jAJ>Ep^b3qn3nXH zPl712Uxb&9FDgbR20x_~jRF zDF5V!_^y8>@VETqhWJw(;?r)XhWL2J zknI`H2C@IR{*}Pr^2H23exTD^8_Lr?$miuSUt;fJ3(ifqdkbEl9Pj2E~Yt|{&^&pH%SsJw#mOZEF53g9GFe5vbnEdJ7<7m!I^^` z@38lbFOa4DJe#IoI!$}%H16ZHtcNZ^K6%A13&UE?{(`e??sfeeo}u5W z($?0rr+-&CuDC>TcXEWhcLtx9@7O5q}z~Q z#sez$(3Tp5w$$mnL}~5;>T>Rr=`{C}bo#_7eNvRRZMEgw$j{gWGS4E97j-+J?7}=( z2knCUOj>Y|#dykc@@sm_ydjy~E`_+g_*H_BxGwpVo5x2l8`r*Z}6`m@JlqW3H|T@hp?3kLYstb(hw1d>{Ea zIn44o*awfo*r`XZT^OSrF73gwK&Lqt=rqSNm)3Ip0Qo_Vo_GeHfxb{UXygx)$uynkrmfn z`Z+R{9mF%ChaP@2Sj6Rclak{n7EAa?*nu%SWrzRN{3Gl@Tcqm$spS`2v^t#z(!9#N zui!b6ReN9o^0a+O&vYtg{tWpZuM&bh=?~a=!E!gQJm1p0amA(GxZ=`oTybg6kyyV= z)5bb|N|ZiTr6~*ASk^eMJ&n$GphtPEFKy`XHUBS=AM|Z>#F-NO$V&46SBAe?AJ!{_ zVZXc3A_J~i4yg-J9Q(8!zeJj4Mwa2SpBuJtAHqWhkNkQp)Oi1`@fPh%e34h?z3TMj zxn8v^l9a)>3)?}b+3q^+#wXW~Yi}iBuXNh&4k(NctscQpR!*Uq1giP8@L*T@gpoYA&@bRdqiIqx~9 zXiSIke_4$FKE?+-rjl<$$%Qc}gTe7sV{$yzX;;T@kgw##W97wl#PjQTKF_f-RmX3$ zb@Z2DT|LJiS9;KYB8)gKap>k0CPYWJ_}!es6#W3}+Kjf-b&yA=ai2+BTaiuMs@EH& z;~xpP7GMxt*&7(cetQX-xX7pd0{2Nd$geSmy$YU2a~93xaE_w&bNaA8g)`jO>LVx5 z&)AXT2afO?3_HK(?|uC2DvL#I*B@P5I9b^4UN8T|KI-K?;wPNH(P|JOi%A*icZ?Y^ zCS$e87BDb-F{==5YhthurZCvAA`G-TGI41PrWuRTM{;u5{Uoi+pjjtJ9)s~cg~9%- z@P8fGYI)yOvbIOP1rvppC049 zAcv9gX=1Qlh!Oep80QjMjGA|lSPr&J${u#UWn)dPGTfK$7sPY@Gme`!MrSZm_8`Vx z@JC;d?ZNz57Z>!jF1%-b#E9*2Tn1yZu)i=~73p$(9wXUbh*2~KurCH(L=I<;On)H; z=kKY$&-RKjQvHP(oP(z@?A+eA%Ou)19eZh0+Ah^D^gS(yU?lvM7_?ogUAT74Vx;|) z81%=KE_R)xbiwz|c3>r+>vOaR;zd#yyH?3!By=GLF;lvXBj4*%X|@*DmL`yuYgf(# z@Ry4nr{(!&B@yeO_qSN)V&Lg{ewpFN{CYo3^KZ-ZPa!KOKgYV1{Ac9(r&IhKyHfmT z=J{t*{2aGZ{AcC)ccl24m*PL$@=F`yJUD4Q_V~)dD z`i`BS!JAIvvH!C@96!^Hr7o@Uwj*D+k6ms{`|vxsB71WDad^08{PJmqU%mqQuI(o~ zX?wDqJPyyvGcLQd#=9HxgM7vIB!=VXJujEmcva*(`RU^l zoRBB?1@c2CCSKK~YKH9TLzFCXs zWR$@idDMSLfjv>2u^-d1eVzWhQ0B1<`a9+0TFSLI(_Ejqv}&KR-N+AkY5i$G@Oplx zIesSa%8x;Qz)Sll>!(bbAIVJG>3etN6VG9?y?D`{I}7YdZ0(Os7sQkD0hD>{0)L{s zdi-R%X#Bh&gI8=%&PSd8v?u3dF0I?=9v08ZNdMwR{bvjGC!Us<=>mDnPePf;F3_L$ z<9fx($28X-F0JLg5cvVGSbshKP(D50X}pUvc*Xt{`?vOgjW=iUtc>Qx$;g8}2NRWc zbESm@F7k}SjoyJz>dW~9E?NIDO?+JOdZZkk({<2@&O8tXodjf>G;`*(eIsIv;pg;II0l*dWTRY|W zIZkExIpE`p`RU)F%keXAX85Pbo#$sfNbxgnX#Q@2{;Y@gd!EIH56d%g7T5aIpxG_Z zpY^2ptzLn@K!4Vg;2*mL`5E~O^k+RO{!1;t!?5CuJY1hSkJjzM{!4n~<^0+2bHJa- z?>su@2YZTt?4A~z{geF8qho&PlHxD>Jrc)nJv!#+e30_T?KvLTZ#_EZ=X@i@e_Ebj zS~TY8{3OMHdY)feH0I}coZ{b><2N21^COlg`OnDni%Z1(9M4kqpPA=R>d)~n#eY_w zKdC?WS5o|Lf5i9?4sNs&S<4Srna{C5yvX3V{fe>6koJ86^R1NslArq%DgMhN{*?cc zpYzKUzgjQD|FK7y@L%#X?vg+9-!Zj5bo{yYBR}JAivKF)YyDAwuKmbg5D&+$&hzKm zkNgGkaO|2Kf8Kw|Ulb3o&GRSqFN%lv%JV1n=XjX1-@WtvN&PwQrugq;`CS`G<)lSC zn}k2O84LY++|Dm}Pk+MY{ek|e({8+S`#laX)ju2_KI8sTJ_n#)wu1gae%C*v{#ADR zx%yN6gZz{~RsXqB{qRrZ2(6zlk-sQDorf|lKSpe_v#tz(QG7ZdbmVs!(zr-dpDEuu z25(%o59x9F_Cecc(yo1~$o1GhdgbLKP0Bu;z65?3z4H95Ji$M9U54MaPM)9gC-}?k zY@vSFI(dHREBsOXDpw+Y(>i&6wioM<`R``=MTSQV>q|)UD)S!m3HPW5`NwVhP!`4m z%n1aKY0g(&nzXik#_o%Ij}8AX!ee}M{KR9ta%qiszYJdXIkRyqA4sG>pk9%WY4&%Q z)_C_f`9{W-_7KPElDt$l_ZfMQQux#tZ5rEi>;cH9zM^xdAz)>EDpRr@GPY!Fbh=V^ z#yXeQvOW;`4p*5ngGYMeVZP;MBc4vXw)uUFXE1RVAJV+aJeLmwH|m{Mzm8A4NFuhg z0p+|cX;nQA_d&?_m>vh;0VZ(3U)VN(ki@~Wd<8gnGW1?=C(nbEI8%i@I1Hw@Domzf^JE#@_17d?x;VW_tI`j+K2T_>|`wB_Y@A7>DW%Lo|dgc)stR09X;uD3ElFR_KwooO9+ zn6`f+Gw*rf)2CUFPSbuat!3gIBP&yO9KYVmM1Jb+FqnppnY8u;mh;l|I##iqf3951 zw2b_WOqGcZeXuC*v~yUs4Y4@?PRaEMi=}1rYaHXx`{Lhzx;_b3@n7c`Oml9a)11e- zw6@0{ks*t=mA?v68DJ>j$n5@=#7~AL^mgoR8@=?j;^{ke}5f z{J4v_t`7PI$7_edH2auNvyZv7)`Jl$Q%A0~v+;|(IyP!7&fkfp@%Wu4FB`x1@q1i7 zk9InchU158Po^2yb(-UVOY3@j$j{U{qP@ZI?Erho{LR^gY29aa9XI6aC~j{ZhlxSG zTpdgw8>LYu?cGOyR*&NL)_%(N)_suaqW(RI>)1qla}KWMck&J`mXW#HL0igI?%^Ko zTr}6EJz$4;o>1P2e2-=LWtu>n9i`$b?VIACjrddhC$tUg$0hYMO*~vVd3GRE%ahul zBR}nvl83P_;!oV(hi~wb`gv2(o@0AarsYYsC;1s?Qu6G}^C$IT+)DB9 z&-3Tn6C^UurT8D2=g+k#`HR+okFxyE1|mH2*k3u{OZ8Xub@A_nJmm{5p5o8hgZv!t zQv4T1{HgYJ^@CK}*WtM|eHnR-pXGZ*c&YX!Km9!=&#pXwQXlrW6#wo#f3AI5Kl^)% z|L%GIT>Fy0z`x2DWcbtlmGO#WV50u9N9Xx-`jemY))fCAMf|DuboGN&+SB2=v}(_> z$3%Fk_9Q>&XeoIfo99pJ!?85Qe<07FYfskCu{Op3xIBNZJ;~3pJH`Ka%a1bj(N4R8 zPhN8GXHh1eV-6(iWtP((xXOQKK8fx3x|l^9qh22`w?^rsqx3ORn(@W)tM)2C6#1;n z%4_xvdYzHKnd3SQ7$S?p8vEl6)?PKYzG%5ZkT7HKij)=T+Z?D8&JtuZ}D3-A;rH`|Z;V;&Qu`VUglaTLa z=@jdOx|94jT7HKi9RqokCtlNOeKNRns`$q z{DosvLY|UqFT-Cf5BqLHp0PjGvW&1V`&x?s$r=9aI>6bJ{>r|d;(v-QEu8hP;T!XGx3vm+h6XZ@GtjC)-RxeIr$qo@)6W2IuO$ zC=Z{-ERu(Fy98eO2IPCJ0(m(0GFB$|$DU^S9R}AjyeJQ!Wh|11V|fCv+(*908X*t; zH^D#l^bCJ-|7L7Y@jt`zI~it?=0$z@Y+_0u_Rj);EDuoTu}0`qV2`n9X86K{A16~@E7Y-#Qz-2?_{V=AOjcmsp$a{ zd9;h`G;#yN0=LESh%PGF2ZANfJ1V%;bM$GH^73$hp?up?jFnD^XQNMXFtVt85X z;4AjggKq+p`&$Xj@?MK+F-F>_0AuV$v0Qc#7EC<|C*}@qQy4|>Mnvi4c#TLWk*a1~^(*r8#;&v<;rq{XxtBiju!CFOcq7GtDtMe~H0XE6%<8|}kA^pt&G zVKKx$_T5;>!h40}Jz3r*b-S~i7jScHiB}?@Sb{geF;67KRpz}%Gk%1y?$>qH5q;0E z+c@^?G~;h4B{_ z!`s2ddCD~+&QmVNpcLk-EvCpdBF(goS z=rr_}{Ws2yEiGm8hsc?Ge9f?SsgZA#Vbr@xP#c>gP z5x3G`QvCPJ@f-Wc{Iqw9|Na^N5VEv>v=?P`{7m!GX|}0LEB(g)68S+t>{loBBOd2I zDgHO-`1AUapZ<{Ie@lixOfR&4l$~+G@iVRQm@bm5zd8+@O1yao@`HSMRxY6*@fj~u{O`>1 z=k+5$<8_MvU6$X;V7Sqd&>!{CAM3j{!i)P~QGa-ltC5?kLf-NNbNp$2Ij2tX z|9*zQ*k5&f(LXr8Iy|Q1_I2&~?g&4nANgZ{as2Pe@#pm;e^GnB*Ydmew9_tWPd)9@ z?MXb0JsJJj=e52ZFI}3vPTu$7-q%$SUy08>trY+JbNp$2!JFj&K!(3KzH0rbo7Ru_ zMf&|!gr90p@)zm%*E#;YepZ&Gejm*6r~MTqB0uab?t>cqw&#@1oEa+F#%vAjE+4XpaejwjTI(?Zg@|QnFnXhX^d@UO9Zp`uL^=179_A38LhCdx& zsVil4`Y_E)r&)(iyY~Dz@`HZq{zyFjrT9OQHbLBwSG+Va(GM^ z>G!uN3;Lz|BYBJT`;_GujNzc(Y#;+yS?&?Q2Fq(hla-khGmAX<%dO!)ZOaTsK%fkW zdw#EsawYi7kIwT~y8R{OX6NNhTifJh_zcRde5LYQy>H&!0eZQIqq~E&Eate9i@u8X z^v`Cnue!8tYnfaB9r9U+#SDk*Adht83KMPVF>ov6T>`W8IFu>OZ~zkWH75Oye^}Ru zoV;hbOKUm*9{B;Y(ije8%OcmFoO4p9=UFV=i=Lm&^7o7Q8DmrYpR@d42GfO%-M9!S zXbZM2$6==v(;RnQTIpDBAwS@A;B``FeTEp^LncP7=Rd?4Uei1V_vup@|Cq%nY(J36 z80&Oln)Y{TrQ6u&k*{<^Cr|4}432v#xxNr%6zE0_j*TgdFIo&Qi=F(7|8w$R(2m5^ z?Z!0cQwd$m{<{G7Q|`eQVA9{Uy_j~o{~7L;{mP3-2buBRQUNA;AX7#z?jt1R9Q#rR zGqeaXT#VyA_YG3E{BoAxw?@p*d3K8bE0*8uWhb`M7W^KsKu7vNkb|7XkZWtc_=E@=x++D5bm=iyE#*1>tVOKTnf1^EGgbX&yzK=%`cSzgX!7PbZD zf=pg6rk!6#eQoUP8O-9gD2g%P$nqDq1;^x6TYS^B< zvpCx`%{>s8R(2cvSL6qLv~NK?CWdRzc&zzWjNvuSjy1$^J`!VmJBv{mD=E9PmuoN1 zaT2(aEbl&VS>n`Y~w06>3Ila0@o7>{~P-e@&o?p*yLh(99MoEV-(nr zazKWp|NSJ3F)}t$SFH=>*JYzuY?Erx}bex|7Gv z{m84^%;HHu`kCeT?X(LSxWo^3755`zYTsg7`<|}j=O_#K#r=pF^jX?Fw$(3Ui~?H` zgI5aUzmTuwDC|d+UB_{z3*vaW6Jw6>gMzWMyc%N^=temT#_;l6Er#f~-t8e-D&uq1 zb0b2Vu=OuB*1~Ydj2oNeJ|I$_XR5fsH~`G@OY!O2L8sZaI?eiZns_=*44q~_(rM1g zb@~XECKmX`$N$^pleSb|>b1L-#kJK25=_h9QYDj1Ue|YohX3X5RDKjPi7B{zrlx{N zFb1s~gm`azv0Z7c))!V<6;5t(#kd^XaK*k}ehV@^?sBW%>@9a!TSANXJM{2ohM^=h z9&Jk>#g)T*Ju(B{{?6>o4q2gg;o@dktuxb{C*jJq#k-M7 z`Q2Z+F~G0M<`$c^iN?gl1bIYf?&FpE-Nv5Aa=W)(h?pZ~2f!}j?l(t$hT~iL(%+2I|Cvo6{h=rw@gM!os64~3+Ggy3Kq&1ZuVfK@ri=9vB7r8xfuPTvWCr=K zi_+Ie>0UN{^jwsV_>aCmD$nq1ef}4OqR(Rc2J@PkCHuBL(+1MszJ2mU7VG#ATO61E zf)&7}xyGWuxb)4XyL|h4o5oz_h%0fAtNdF0$5=-?eBS=2&DLUlZDok0%d*@?3k(Tt=R38f7An zZ8M1lj|IJ!4^u~{{)RH5oxO}PA7BrsoaI;N}aROq8B)Bk$jX#*|Gd4 zq@5irwe?zMb*0&@3}nqfx=}KsOzb!hzIpP^2fopA9`(s@g22iF|I4Q5P{#Jva&nOJ za!##J;Xv$)eWX#@X=1yOd7aJ7;O3%!w1YrwHUj9VcFh&tKs04*26`ZGYm` zIL}z6887`<0h|+VLYi|bOMk*=kba#_V@`JBL$35|+H3Fgzz5VyA$>nd-@n(wGN@l- z>14^JST?C>J=gek5=MPG(AW}(U_VFZUVGKOucJ)&s<&6i?}aloOvYr$xSyq9eOT}b zk;yaCxjdRkY=CwtoKwEu(!g%wQ#53`w^H9<>DAW;t;(L3nPt+J*wZ@tr7V*oWZ-gb zas%%FLZvY`IO20ivwuh*F=tv<>g&zs#QN+EvW0h4A3@oX*Bie1m=ElJ{NTMCSD**R zk|Te0oyBMR#wa}p72gobMemfHwRN*8O&v$cDY0A0srkS&LJOm zacQwJ>h$rF<2P6H$lA~kP>&xQH4j*mav9ySDqvr!195E2?$*BHd}9ThFvzs|qip>aO9QME88bg=(`dJ?9ouf)PgQ!* zr^=K~RgKD&YlJ8a^Yo6L1K*_8Z{<-`x6PTGp&ypsj1zYzbix39Lo z1RrfJ`wMRc%iHkxcKp2~)O`%@%kQ*l*6~@S>8E<^Xa2v~{JWrx7j%AS5_DciOk80OS$}*}>@M8}cTgvmOZ?1-vmtXoB zV~TDUto4q5siPNaLl5~*sxG(iz}Z5pF45WKqis&Q%+iTJFZElkRjF)}+16IRF6omt zADBnK)YBUf(r>mdsSoFbR2I!{FnOtODawP4V-G_%=}7~>KB)<_ya)HVK6;(`lrpsC zNo|{^0-!5#y!#~nZpI(^&jHOo%ZI-7rLQ0l*x$e2l>g>?_`FrAytRiO$A-tUzi0?NoA-?u(925e^*B@ zvKV?TdVM`$`Gb)~w?J86L>gT5ae$+>6Pb z&MimpWEw#~4*YdTFETAR8$E4N<59#W?GtmfS`y>cq&)?+&vmpt`g9!|7~Y+Cx$}}7 z?JFIv$WTlRf4S?M9j)lc36uh!Y@l}2Zz;oHIa-lny*n|#)L%^W71I7~L|ap|y1!!V zx$Bo4Z3nuwS1VY;i|0`vmVYZ>E`yjW|8c(Dk2~b|ejf0rlwK#_M)P;qh9Us;nwf1( z)l}bxUMC-upk*9N(T*3=*8PUFZL^cB3EIg5+zS%4QwdtkuTH+IiZ|&D_+R+m0b|F> z*M)q1SwL%;c4pawLfK?o_J^TtDlS7`adqK4z%1rUD4U7PL_8zoj=1cRfp4cSyDQ{; zoGIhctd+sAj$LbJR0b=pR?q2!xyH#)F?1{VK|sB++^Vc7*;xL9xZF&UWISQ{tKxF; zE@Lm2za=gg?+WD~h{|n9^7x;K%cJ@~AD2hf`Z+UavCb_jk^A=sTwz;mT|2@)KS8WWF48no}y(I=Q`W9sNrR=wmfVPdQ&7=sgbe-x>17 z!yNrhA>YSM(tj%CPXk))%6!agq-|jbzn6Cm^1oTd7sRrEI9OZ2mo39qnBQ$f`Oos@ z)jr~J%luz)Gg+ti|7}D+Fvpr$`cseCnBLn1?RM(X8_>6`Ko0-pjp;o;eD>6HHlPpR z=o#C>MyF11z~i1&p-i_1{e{(Lr@_X-#XQ7=Q!im&w!8YW>#B?GerGSfQ?Cvh9kU7| zAHIM)^?}*4YOmiNb{pN5xtcV;V36()3+Z-H3}07U(KTD4uA_jl8p^u8VXNi%u%CA7 zu*$h!tI}wgs6zP=hfjS>l`l*)F{Og%8#-otTIyr@lSh=pZ%=)`l=Ezw@a|Ch!7EjM zLI3sbO8U1K&=>T_Q$Hs3{LO8sm-2j8^7&iUkWc)ts{GB!^MeBVB6)rz^gIJ4)C+mW ze^2u9{;w$i7|EZ>3p1T--cucEmBn|rKcq2`dKs7RA zPBK17^HkQ`eeWZrdwMaQkG-UOeKDPn#qjOY%`u(SX5=~^I3LTE2ZgCG_OZslRzTy0 z2c4t+?-8`3K%hPCm=Uygsv@}1qkL3MYr$CWc&T(+HCLW*4$?yB(=N!-W_3ObH1{u{ z$)kGRPiq$NBo*rOIRROtTV9=@SgtLgW*-N^Sn}N+pRa`rNoVXdnn?H&g0;_W5l=6UTSpvEgThS zOhIbOhuPD%Q#YWs3VH}v8~MkVB7T@(%TyOu3w_K3Q-^H#J?a?D?ZCw_?RmFPX zi`)Jr;$6aqf-<4VL!WqVF`cb|oDSXSLHw6Se0&XQ3jg)RbQYhSS^PT#|LxTQp7fln zO)O%I$=pj%pnixA+y1%=x#kuZ_{gK)Pr>&;+dj-PJlnB4T<-Q0G~=N8yCh9Dw|9U( zzwO&Xn<*0eA>M5JX_Zg1^_x@krlV3mjM>|M9rAfMx2PV^v^tz|TU#<4=>YxCINp`< zDRcuZb+YViS0;?85SPQ;;mV}GP<9mfF00~5T0X4b*yU>^AIt9R%Zy1KCSvUw46XSnTmnZ7~7hRsO|E?d_<=Ewn z@Q-?yE>Fn!Z@N5cAIQJ;^{QMv(U{NM??<{kFW(uz*5%ltjpRG?wz@oD|Cz_B@^L|kYI%Ry*T$Od%qvFFRrv!gZYL^i*zU~xX`VZ*HKbG#PQOH ztL@1Kie@Q;1z{P+k261>DZ`|8cE`lz+_Z!nNAsmk(0o5ZGc`9Y({P9LzZ=lNx6Zm_ z6+d@r*HH^sJW!V|Mv|Zl4r$YBI;;8u?!y`0Lt61s z$yvW8HlA|e`W>n@@FlEsGx1N>Kj~?V{Eew#cw7J3xApa-)PA$dGVMad zj}83Onjd}g?9;K$f(*XY$@fr$L3}^(xUz-7*KnvTL!3W*kKv=cHI%!!m~r+X z@HTbdC-0**Z!opzeS+ehRq+PCa`w}}i@kJK>%Gj$`<%en(msxH^6Zz&p1t|5qq4jg z{P-oZZDsP4=8ZyQzL&5xocVfRC(ZkW#(YO%X}n81oKFai`98tYFp^|&z9=;2y9G<* zgT2G~w$PaG87z&D&ZI$~Kl`Uu94tX?e55q(j+lS;e`U(d!USw$XN-+!|0Yo`RCY&^ zbzslHllBjE#txTn7RGWh~i+m*Y@#ow-WXeo@O2nUYk1eJvYRhv^+YFCtOXyj8 zuH*3$J;++gloiW5Q%qMV>&2VlQL@5^%Ku#Dvz9chA6ld>@g2)4zp6H+#1AOYjqQQ` zf^+Ys%Q9-@#Pd9Vun8V3p66+7g2#3X;n@b+R*QJT7x&_P)P*+qmbXE6-i5ML?}oCD zI36b$!6&h|a_)MzEMo;$KzuxJd+uXL(8bnrJWt&ekFl2HdC{hL!dL)bJ@xo1p2lJG z`&pZj8?pG@*JR2v>cwJ4fP=@HjmNPaW-+zQMw@emYS@w%i7C(P^?#;d|Y+Bm-&bys2b1QaV-+9OQ zGVU#8WI69-U&gqbEjuTa#X6if70O~A&buU(#X6jKUso1FgVX)IKMZBL`u2pfTz&gO z85$z1!xKYUPL^kfvYcIB?#tY6M6ldU~EmGk`beHjOvjDF|u^krXul zWpVqR-wS1N`W_R?eq}GDN6s*^5G%o#FU)KmRqpj4?gS_qI@$)9?MREDQzC z=go}qon!(eM7>MIx{x1V3-uUS!83xYD%osY7aY*}@swN!8H=jn8!DYeb|c-D3A)fjeEU}L z+le|JGHBJ+0*Q68eedtef*8(cDu3Y0B0r?RR=@ zKbEj}&+qtJb=7FD?e}ELumPI?j<2%50S$C3ea_KDevQ~rd19uly56Zx@4_JhlXDF) z;-W0rZ>u~bOV?emP0h|sR3`BRj;F)-!j%^l)5(IwFGPgP;8TuQXZf0YckQfAC**ib zmd?mA139L4WaM~XF~DXQ@pbEvvB}zSjKnC65pi>jme!n<&U~D)j6!J z*29&rWXkAY6FUa&)uokIc-8>VfK|RTg070V(-`(w=7n3DK;+sDzMpNH&(uBNTp!@T zsx|jRYU;2Hk2P*NB%HxY&xj-P+#NVu4+#h72{%^-$;os2A>rU)UL_CgbGOrihQ$Hk}tbN$-y+gu*6Ge8$GbN_)NFT`hdDee}A5N+RLfGzXuV)+r z&Qzkk@C?{N%Yy^ba{m10L&C|o*G-3nlW(uTKO~%dd*KNWmnj3E{PZ9|J5zyuO4xb{CZy$^;hq53;EAINd76+Z&?5ILGs(L zY@Ge7BjZxS{xLtES39Won~CIq_(AfU8H5?`EC|NHzV`R`p||8E>5e{BCBA0&Tle>`iuss8KakL~}HgXGut=bRbOI-B~{ zVvv1vD_)h0*leFyY%PSxoEgL=m`Knwk9ep|GmY!cN`+WIMRj!sXQV!cq+`~Lu*;@%uSvf9x-!2q^6RaM-&bXEeGgS-aeZ}F7T34r%ED61>)ugiaea8gpU<(j z7Qh$Rw_la%`mpw!cx+W(asp1VwyeaQFFq0bdVQP^%R;q;6M2pX?^COtdV6J|%Ppja zayIg_{CT=uIUCDi+tN4env~BC>NOztP9|QKDXZGIk<881z{ksBaKB9iRL;mUtlcMG zlPU9i2(@SrVdAY>I=6>Vi}nyE-d{{txOS%;pUCpLJ%pSb|B$6~dkD2?4`G7)k3r|E zrYn?#_WlpYr#hy!WBDI#Op2fRV;}e)9^A)wyRGm4%vz9(00@v1V&d$87B1 zPyAPwu2*mD!Sl}*6AUV=Yn=r=6usPDTAnk}l5$~1LLjYESX_?w z*;!it7|lz&U`Rdf%d)h5u-ws3>iHsddqbAiY#e)PBe1jCdn4N3+KN1x)Lvce&P|yg zzmoPe;C?(uyD(vn$q{PvV*#rl>A#expPUNl)7EsNBkla}S$f)o&jcIrMPm@kLfW5a zY2AbNLOWw80G4*Ll%;itff!nAXh(a8EUkM`OK5l4U`SfndGf@F);+{*h=ac&Hcy_T zV{Y8RsIBMvDM7S|H+HxIg)fad9QQ4QT)FP$}oN!Tq(nY zIO>N()R#2vEX^8D(e*zrA`R=n?=1{YKITn6-j%6|2>GzzI{CD4h7Jxx#`C$Y@D!V) zd2yhrIU0%!2=O7-|9V@8m{>|e*}Gg>v4de|I5TAOJ8t7iYBY5ohx=E#eEg=AUw$@cgF$Hz(m+?U z>1t_Oji8vLc}tEaOoAN^>=NOGnXsezK#nHNhDk&J_@SriH5T#9Gi=~i)_N$!MH;sA z|0HOd-My=dX6pA6G^_TlYsA6#sZ+-l&{UfJbwtMX){6N>yrZAom|l9fqrcb2^fKf+ z`sI!3Wm)9t|9E41Sq3@!mu*ZhQP0u8Z)18H!AXzbxKDi{LBEFA+hwh3+L81>+K67o zO3+W=W+Qq#fwA&TpSlsfU1U1?*^TJ!qSDc0ond`m`>N7cjUkl(5gXBqHI04XpVO)K zrJt)BBy><7(x=)tqSyX8ooe5RUi;^Cs(mAR?Vr;>N$4BVYyX_N-Ny9VKWEO|nBMy* z=JYdj33~YFpfhCTFm}gxSu?426}c@X?M=F70*^7qA(9Sf9?xJr%lV1Wsh$z@Jbz=J zTFet-aPY^dp2?Ue)us^--os)n^ZH<%g zdN`bvixjr7k3BoEo-d%wk2&aDJ07_KJ^jPslm2-d(9_0_9&@)HZ%xu;kwhX~v_0kq zJ3drImla#+w}JjEqv@U4p8jW}>7Cd@k3O*TNKap1Yc>a+s`>CQm8IOIJKobR3~RN? ziK_X?(4qZyp5f{6e8mJGmYBecrqNadTEWT7vEZO;;mcEs1w!f-Z&k08KYZ zyvZcq^$EHd?^x)u66o5CRi5yM^L&k}Vq^Hm&S8!Qr@%#Yc&=jSfh66++Ms3z7PbX# z_w*typ_A`T7El z>luzF^f5)#F%}>V*4MLGZ`wE?X!tS^9DdyIE=UOWwhA#G&x7Kp1o+RlF!9iLW}o2k z7V(8ZmH*}XKl<$KGm~_Uft}Jyox}@$EZ_ypns`S%oGoDW&~$mcw|lxJJbPNJ%Kw#4 zyWNo{kb1HAG5gm^Iyp<+HJ8w0|7`X%Nm@Lqibk_jZcqEwBrTp&jcD06-%HZ=mmsZ= zZmu1FHG&q4*6a#vKW&3vZ(tpWbkJ+pu}MtO;b1iVtS-jgT{s`Y+CPIi?BOlZ zam+@$?h5@y(+~H#7voX}#Kc{p&tR*{oD-FaDb(jGUpIe`BpWpFIoQ9EIq!Z~=ra)= z!a@|Yci}q=t4~A=Bhi@7mTQG{&AOwbEyG$x;|=%W*V69jdgmj%o}I)bZ8m-p_mzdT zR!}P|X~P^UmSJFoRkSx1;9^rKj-k8$K0#Z9{hj`7qcE<7x=G{Ir#;c{cKv$+7ORch zD2yc$X10xX->L}Hs%`y!_t8nZWE<^1t&lcrAJ~0&n2TvSiJNPq-4_+&=GtgCp7qc9 zC=Tb_hhNvnKDGPdg|vBj!<;KCFBVkB`GcSAepDfDR$lnP?k6W`C-XkA`-Mexc^}yQ zx+2=h2i{#sm+7awKbE9Rx7Fv1Y2*I1`&$LHskZuQA#Kk7cP|ywW@JFjz5AW=wB~i> zc7v7ufOIDn(W(6=(w$vIr}mjhH&sNZ_LoSP@O>kn+E*goHAQ%8KZ$gScyI8`bYJ2v z=^7pn-$73B3q{UK_buwNh;-cq-DH9;^a()Kh{suF9`8ntXX$DQy5}V5QuV$(K{u7a zdt-ubIzjgyO*ctBxR%T7@zDfbO1{q~=u+~1EkT!(@4K3Aitw-a=!dVi9ji|v9n^##9HbOXlI!9;~G)N%7c z(A?wJ37VC@c{?V@A=2C_LBrQAX`B-hG#Di_G`fE|dGIa(zxTqrDk+?1+kYQGnw@DH z{~Z8nE>6?SFb3H25dv+0B)-D%L713qwa^XcqbXmJxnCV|Zk7m?v7e1%}uN%qND58tx>lV>P z@;yq^ab7i;?9_aO4EDP*NtbWm=OpR!?fdd1UAA9hFYUrNrsx6;*J0 zAi4;Zp+mg8@WUF9^R&T~*Ve}R3qPHpahf`sFD7W5mX0RV$823rL(*XH^uqs0;J|xD zYDe?4B#qIGG>DrQhH>r@!#WO@#D9pJSd$No0W94`M|iA27j{m4dtY=+f-c_c#5($- zQ#~CIx5u`a`S3NfUfBJj^F3Xsu~x;OlFrfW$k7DJNQ1q-i^7=3x8%ryc|dB^@%zd; zJ~Q9PkUo3|l&8mfH%Gq|WXR#;6u=yP*oV&J<3zw5{nJL^<8;6r{VNjmkh@UdcZ{G< z>HF~!^eKJ+X#{;r-ye>kkM%`=xaj6QeP!4(n*#I!(9DHBV{dcNm_SJy?A6X~^*DG` zP|oGe_62-jG;kg)-6Z>j%UTJO@V5$1#C= zKeL#=GEty6`CdDMuU5cE`92u)OHqZ+__6+!=f@-HCge-Z2`^Ut!t0AUdc0=3`1?t` zyj^}-M3=S8C0mNX>*J)#+h5vjcweyNg)L7G514;Z`4Eot6p9na6 z83*uRE+&)i^9i~*7LzWlBM4>i;uuW2A80%{;a>6g>{vj$uvRCDp-a?z=~x0UQSYT; ztqwelrT8zU@1{!8NBsOz_I z&s|}fj@P&G!}oN`hjI6^FrVWYh;rCrh6a7(vd}k3Ga*EYK6F{=8=5Ys>t&&DkPg3^ z=l}V>aarganl6tQ`UdGH1ux;tmxaEe>9TkjV=fDQ1M`_~mH%O1HWwo=Tl6*_H2EN> z{ErpXKs~2`HNs^#BjiXiyj} z#r3{Q%ZISmYwM^M?EID_UB2G;7tqD^{!M}|<X_A!k@2rX_78qZ&7ADzLQ6n#00#QOee zk}hwT=O^j1daymh*hTqly@_^va|+LEVSJT#d0&QZO7xgY=<)F+U0#pRC+YHfd^1It z(BlV5I@cOOkFYMIU8Y43M!~2(t{ThWIl7!4SB1Hv#>?q()yXNmydGDblcdY(an)3Y zZbtOr`Zv}itj#E2po{$ZsxT&H>0Hg$pRWpQGfkJbOW3!_(#7?LeTytzTyK~IYPzhQ z;ip%HeGAgz&F}m_A78EtYpyI^EMFLFvUIV0@5;1?t2Zy-M>2FfMZTR0`951f7t0ss zc9bvR#qx!H3r&}oFWWz6MZVd*UtOK;AAv5C@9J#-2y~HrS7-Z&qs#f#)!{h=>JjMT zdc&M8OQ-8aoV@y;89Q4%--~?QxcWXBx?N(IUHNvq`e6lhv3%_UIxQdk`Rer~U9R1( z{^J6=xZYd49V4DF1Fs4cO>TbU#@Q=SC(7#W^Wls z7F3sUo{QU%Asv4Ib@i7#u08V49sS2wy-)yL4l~TnRvOJJ{`jzp$Q$Ue$8+^hJSN^* zUtMoBX4WSvd>6gi!JkD z!Vtgc9JFGY@GQwS$Bn8Be0%GAT1pks88TjT#s+-t{tcducA|_Ed7iy1^;Oea%U#$^ zY6EMq8~pm3OFiF8t2vN^$MKGw=AhDFT5vWv3Ut@v94vg(h(n=j6Ffyym)#HVp;%bM z%L7oxQ=DAc9l`ep)y4J==2u2b`u9V(Ls<)t&aJkaYn@(Jrd4dx;?ThLRm_!LfGT@NNJ+S9i_cBwb@|0pFRftPR~OX2h=JpnqbH9!G3-yS)M4u>i5X+<4F2 zHF)Q5B!iO`Cy2B*9C@a#QeSU2C)Q`} z&(Q=IvR;e*flyvspLH@FfwC%(gHwGM_PBP&$xnYKF)pjywHLcG^m&(08LnkMMQ2qN z{6t^4y#23zm~3m?*rv+v4Bln*o;XH0Y}n=6M}>0sHQ}Z_w@2BZ%K2zG6|5=EBXZsr z`Ir~&?Nk;mwULAL&*qs8%7|Nl!@t||1urDD zv~AFSWXs-na6sousWE6z;+37t`zOL}&D@4e+=aYJUpnRQrv2Sa32#=N;D5D}dk0pn z#L;6y{x|oNaz7>iPnYm>oC*F{Z?+^a+MeelmGdj>P54@r zQHwJsqxzm2m+Rt4jY>WU5yQTaOFxY3}e*oyUXG(mX>V*7XE8&Zi3H~Q{(5k+=)IyUs z_+lm7rsjUJ-@+TeRvY_ECT))_TE*kIgHms~zRF(~;e>EoZ1RN^aJ}wcoWa`c;!xjJ zi>k8*r9P@_EVp~x7urK?fwUKgQ5HtJVHdB28gK$o!qe8JW^29OXw47z_gW=8FX+HI zy3JCfjx%7}!~GQ;L(m&kI?InNb$fV7dWaXj;2cNz^PsX0kL#_;^Y1ugqdtTZIL)En zSjMqfaA%)bY4e~gor6JlP-<#gmk6{jM`%}D`-b+MKB)lK?RG)CWG&I$4`cCp8!=L& z+gikFvTb%WN;p{S^;Y(m5Xs#wO8WaTM2W6wr}|1oUa|u{y1i1p-`S2MB-)_H$+WA@ z3Oa4Q0}GL91&X2xD>#XwwGWn7X^biVB6+FJr!+Tdo7DhPW?co(VUKGLVE-u3UQRblD z>0t&*gGD8D@F z)%93cRyCJ{gIQKZj370SDvPLn7KGntDwW39Zov%cjy+&D`dzWG2`J7N@v{w5`Qpm8 zwK!uk&X|fbrsIs6IAe!o*iI4`B5J#UB(6k5th9K#vvM*%3EsTyVfvY5k0%6o=&_!n(Ffd@M3a44ZLDAWi zMdA#0`x-p~?u6Ste23(Ux#xIYYM_@dwdSSJWOP?oTaBTT*mQM-Tsl|Cj6D^Ylz_nVYSo%AqE8--@Lu;;mzW1HWHKu z%g|CH+W==ZwVS2-V9;J#MWnF<|{#*C7K7_?Rg-Tt7&Ud-`st=}r)kf2`44LD}Z zL=vMx8^6L3m#MFCu#i#4%Su1CwiUb35ot{82mN{R6L_l`e+R3*!FCMJ^R3l|6}+{n zGk?QcyT7O8@+)gKScxN0oIhEZ4?k(~kr@nB0}R*^BMekwXR(9k@={EIvz*$!rFyTz zQ5nNJrZWlxgW?`(Bs-(1EN5!S6=Sk%xaI%KU{4$29@VoOV<;WMqOdBa%&Ro%HgO&6 zdCms&{e9Sym~XH4rmS^D0QSq3ZoP?Bs_`1>jOKo^J{U^Bl@d+0+NIAJsy^Pvh=bxW zN1)fObr2JHLs=T;*1c!Xq@Y4;z}{yI+pAc#mF#z%wuN0v1ws(k3ZKLj{W3A(X z8|OaEwVt$&5yLrEYiSL^z1v5RfQ8JW!oN#KD&)k`(r~Epv0vw7OiATqa>IUz?xH%O zo%(Qeu`vYUtlL*`GBBd4LdEr!z4iTrN+u6e2sAMik*O4k-Q*N^*qhqhZenSNS9Wra ziv^Z33EjWT_^c+qcCNICr?)%1xWGauiUw)ZzBZ8gUTNG84_?dABNKA0NPV&MWglik z(V)K`5+MYxGW>gf6#=sajfR@IksGsLGsO=9L(b*ztMy{`q>zks)GpwD21;4HaeRt+*Slg5oG@kgLp?oA zHP30XbtW$U2be=NFn-9A&=bOhLdduz%UOhDKl3sggmec3gm_XWs{~7|?c0vM8@pyL z;VmMS_5zy#-a3$EH=A5z!Hxv%W7Z31 ze}OsXBu3jgnPHA`v>7Y)1x#QU+l$x{XkijsTK#{0om+1kJCeuyyX18Os3kjbUUxAI z46qLa%q;eiuq8Rx9?RCzEjizQfB&i?S>0ChV7YEAve~>8tJoy&L)~=Fe|#Bo0O-G+ zr|fS*6ugL9qBx;8{U3(``i1HLv^nBO9hVtJTq3rlEd_(L|J5A$i3P#OBQDVrBycj=k=dk`CKqM@LPW#%fmIH+cyRujUaLKXM6YO;~IPVueY^o$GRM! z@Y^{P?v}4}_Soif{5iD;a^5lX)#a4SbY8;&rv+D+g}pI=n>dTLG4#cXw4_LM+|y?UuXOOs_H)zcKpnMY>v=YyJBgqXF+m{#gsyW z)EuU9WPQ@IzJzg7`Wi|bi8LAhj^(DkM$VM*g-LV=!OZ>{&pzey0Y;IxLB9RgzSnC` zT6fc5{^|sCGJ2zP;(3EP$-Kc|6a0|iZwVgpF1G|@&UwsPk2!B{!R~1|0@u@9urQ5@ zpPXQgjHZ7Y^mw+S={8+V7THE@hNf9vw=Bx)IJ?E8Kc}AlX}a*5&yO$oQ}j;fev(R_ z_O&L>YVYwV?*Pk)+Ci(aE%#H@$EQ8lqXiwWX`0qAOBv!5Clki|2g2s?L5$#s8x@z- z(OAjb4AWZsLG#v!w2E|$ujV89Y~``{6AtC4-Q%ep{oWC^_QB8?kB7~X1+Rv_?b~+- zc2-N&-)a4_-<{8Os*e%LPRkFN4%IugwT4#OxCbm-PAw+cgcRG<>!?{Y#uEdldiJ33 z8)Lb9S!g?oA6ERhy|`c6?S?hB(`Nhpc)@#U>kK?A?n7>vdl+cVr*}p+^DiIvr;vI+ zA0O92)#C2RTp$m$W;ZN}R<^wi(&zNz*N=$K1~@$BErDH+)zSZx?WQofN6UQ{>1_^= zRd0W83;wbF3lBycvC@J}E(*E^w)2&BDGGTuSJ-lY)|xdfSA0ss;Ud3$m|QC1aA3GP z-OMHW^CSJ7R$>j{pdho)!Q|+E6PCc*_EDH?Ewp?Z{^Q?&voX-GxCT=bm?Dbq70v3} zX;2i5aNoxN{^P&?@i${y8c7(*^4z|;5`XdW(m(59W`&(^QhOPhT`^%J7GM|oq<5*o zT#61SOeB2UKX-2&YOjCGyZ!LOt7n=R2Q5m}M;YQh= z4x^N{NpZ`<-_1}O0`#*=*WwE%C)O2`E@G`-x4x_rs zqrbyRo}6A+uAj&qp2h8PQSknivj^IoG=3y46A2ryXyvN7Z;8OK1yiYOtS{G^M zW>~zOw{Ye1GDsok1`^LT>b462R;t#wRaiS%xOY!~sfteP{cg}tp{Y4w0}`u`?T+xn zdAs#saFMgcp57{nrlq<|mAWW;A|pE}mm(D@xgb!|N*TK}&8Q}HFeMB^N=T!q(sv!a z50D08E~P(kiWjc=h;TSip&OoA(i+Fgu88^|Im32uRMeDtJBd@vb$6teZzT|m70$0% zt2t}DollT&W|Vjza!NcJS%16_g3HKPkH5721-Apao=3Kb*>$XTklh9dl!cD+KVT~84vAAxb(FGfk{@#d!jc9|5N6HXn7tEy)0$`KC z(cm_w-=+?j1)Jk$RTcr2&5w0pMb^)vY+u$pF#~Yd!t#aaJxKOQFF$k@j4WPOZuDa5H{IK?4 z4^UergDC8FmcX_e$+RqRIAw5z?@ci`NMS!Q`V{d80qnP!iW9+k@-bE%E5)P8kM0y z0%VU4K;I{|u?ccxMBhx+K^HaZvQt+E?zV@4KZD)ajO=WKmZ!8~BtL=naMf`|+q!CM zZS67`(~~$fKfz%{D;LHUoJ%(5`9CL_hz*4HK;pA4O+#SAF*|fmdLoP>R0)ec`%Fib z=;g;$&&B~^KFycFVm1%VXY$JP$-H7dp9`Z;Siiso7_O9tKiOAi5LMWWpNhE6bLC0+ zOQH^ks3TQ$i70ks)9P@DI?_a4Og30cqwRlm{>*7e=g9t22k&oFm@3-7gD>Zw+6{QR zD-Y|JM$+EE)4h=Zz9ruAr)@l3F!IwE-}={5V!NNGRh#TFD#3cZN!X zt-6D@-*JhMh}MxJEA=Vb@bhla^uGK#vbt>$ZSuTsC{smf;g$*a%sca%;e|}{H#Rt;4l60g9TV8bl$#8mJE38zWUms6&@r_K8_3^L6 zneZ>3CawN!Pbc=mC;(+ymJX~8;IuTRI*wo)u8)dQv9*bTLwjl+lH+Bw-t2I2obbk2 zRAl(hehVD2Y&$;laXldr-m-pKnQ}j*ehgY7Z+?-zIl638<^|NbS74o*_v78SbzwAl zzmBVi`$g%Hdi3VUx3A+}=ifK}y#~p__sBC7+5XVs#|H1)9}kN!Cme3S)`FMtREXBr^XRhW#yU+2eiH;(&FE(T!sM_B%#QWB*?z`;Nd3` zyiz=-EUy^Jd;?K&J{&M`v-#7-m;@2yTLqCH8@vD}`|(O0yNIPU5MS77BeE2K33X+0 z{d!+v6#&noWK50oNQ_E-HX()#ztMg%R)H}|`MtB>d;9%jzhCY5!G6EVGQ88zy?(yv z=c|4m^kdx7?MO2uN3$fym6)R?8}A4Ea-QydeB7{y>2dc;tOKWz15AQ{?H}&HPV;3B*T8a6WBMnTBy@f2*=Fl4rd*46Vst89p`^y9~#IVzx#lG(f^6xV6 zS80oo&(n^?_{Z$@{Jl_buZ8KRBNm+MsNE?%MGH4$Q}fsDE6e6zvNSK&45TEb(#-e^ z7X9H@EIP@rSoFAGvFL}5bvdL$7f{K4ay=^HjQ+yjQ--PD$1*ZjjP5&y>s>5-ayf9y2!c!|&M4 zHos%v{hrN4@w?Q_J(bOnj9)qiR5iv#n0CMq3{{%f;RlwUb;8o9Y}Fm278%RkdrtqL zyrnSReph(0u(IC=?y#)7Ju|m99~ewzD&R5EIp3twmx<18BSFWwR8&AtWO>jt%q}*r z#jYH%2f{SE-kJfuLOhNKkt}znb;dw0q;};Mjl3$#7^$LG6uZe#T?F01ng(i>XT7PL zD(!~mD%c)S)DYA)#xlL^R%Ju1>;~!i9N=s{1N2n`mcLzf%oexES62wv;smVIg$#^r z0v0*e3A#eqL9*Fd_Kvc8pa^^T+KRgmhfW>&$xdZeYyq?8-=q z?e<*FtX8F({&)y-*KMF3^Gh^4&h03Pt6MvR$Fd_Q6{BT(w6q6EdM9NPHx(k#P{o>!uRYuyU9G2}vbkAf~3BF6PKE13m_W7xLn;qH0 zSE%Y^71r?4;W5EkW|io74b~7-(=L zl03)KG@bWJ|9wh(pVEFw@*LgL(ter9^zwgA@?VqAuSuRGOq!mDB=azlX*%%_*b(mL zDX{C04AL$E_a4yJDx@R-jf;;=-x`w^$XtvDnP*WD-zo`CCdg{^dk>Go>06 zr~IkXyQxwfjcO*mQu!PmWEJDE^?`t`zje6D*l5$~tYwte-+u=~Ji1lTyGrY-O{S|f zx~bG~5v2^!#0A$<`iR1)fck)&OjQ~5P}xeUK>_U{-b)z+N~r9mYy*vDRZGc^-KcuL z0r7W0$dVFvxHbUM>wCiQlw_p3$~SWs-&Ai*g1e07&nmC^v%_8gig~8ed;7sbmeOi& ztTLJdJKX7->nfdN!xG%{(p*<%9+Hgay-NR2C~>E(MarCUrNdyj*+Z zn5sZW-FMZwGIeNu=j7^ylQPYf$bs{zY`y#OT66t^Br#bZwKm|y>+w_CouODlhgxM= zprL9K(w^Uu$U{hbN=GV(U`I=@gUcBYII`R#Yu3X8Vr}G*cIY~U=Um_0*y-QY6UTW6 zEL+-Pm8Qd)E@KuM9m*Y#<**Jq4YHO|2G*iVf{s}w1cpS^o=Gd*96AJsL{zCsCEtfV4m_*A( zb&!kk{;DoHt%a0ENJ}H6rTLPdP;*2pzL1tiNK4a}O;X*~N)>5o#A#_XwKUa2 zl2}sx(1kS7v=l;G3L#DLxBLJ?l2|kl#UpI+wj&1}^p>q~Ua{|-Y!|8+`tu zA4jSsTt}!8+o9efQ&mHSwet&V9ze$-iM$02r-oo;4Fnd#s% JZE5l6{C}7r$t3^) literal 0 HcmV?d00001 diff --git a/edk2-rockchip/Platform/OrangePi/OrangePi5Pro/AcpiTables/AcpiTables.inf b/edk2-rockchip/Platform/OrangePi/OrangePi5Pro/AcpiTables/AcpiTables.inf new file mode 100644 index 000000000..306b96277 --- /dev/null +++ b/edk2-rockchip/Platform/OrangePi/OrangePi5Pro/AcpiTables/AcpiTables.inf @@ -0,0 +1,58 @@ +#/** @file +# +# ACPI table data and ASL sources required to boot the platform. +# +# Copyright (c) 2019-2021, ARM Limited. All rights reserved. +# Copyright (c) Microsoft Corporation. All rights reserved. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +#**/ + +[Defines] + INF_VERSION = 0x0001001A + BASE_NAME = AcpiTables + FILE_GUID = 7E374E25-8E01-4FEE-87F2-390C23C606CD + MODULE_TYPE = USER_DEFINED + VERSION_STRING = 1.0 + RK_COMMON_ACPI_DIR = Silicon/Rockchip/RK3588/AcpiTables + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = AARCH64 +# + +[Sources] + Dsdt.asl + $(RK_COMMON_ACPI_DIR)/Madt.aslc + $(RK_COMMON_ACPI_DIR)/Fadt.aslc + $(RK_COMMON_ACPI_DIR)/Gtdt.aslc + $(RK_COMMON_ACPI_DIR)/Spcr.aslc + $(RK_COMMON_ACPI_DIR)/Mcfg.aslc + $(RK_COMMON_ACPI_DIR)/Dbg2.aslc + $(RK_COMMON_ACPI_DIR)/Pptt.aslc + +[Packages] + ArmPkg/ArmPkg.dec + ArmPlatformPkg/ArmPlatformPkg.dec + EmbeddedPkg/EmbeddedPkg.dec + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + Silicon/Rockchip/RockchipPkg.dec + Silicon/Rockchip/RK3588/RK3588.dec + +[FixedPcd] + gArmTokenSpaceGuid.PcdArmArchTimerIntrNum + gArmTokenSpaceGuid.PcdArmArchTimerHypIntrNum + gArmTokenSpaceGuid.PcdArmArchTimerSecIntrNum + gArmTokenSpaceGuid.PcdArmArchTimerVirtIntrNum + gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase + gArmTokenSpaceGuid.PcdGicDistributorBase + gArmTokenSpaceGuid.PcdGicRedistributorsBase + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase + gRK3588TokenSpaceGuid.PcdI2S0Supported + gRK3588TokenSpaceGuid.PcdI2S1Supported + gRockchipTokenSpaceGuid.PcdRkMtlMailBoxBase + gRockchipTokenSpaceGuid.PcdRkMtlMailBoxSize + gRockchipTokenSpaceGuid.PcdRkSdmmcCardDetectBroken diff --git a/edk2-rockchip/Platform/OrangePi/OrangePi5Pro/AcpiTables/Dsdt.asl b/edk2-rockchip/Platform/OrangePi/OrangePi5Pro/AcpiTables/Dsdt.asl new file mode 100755 index 000000000..e3be7b472 --- /dev/null +++ b/edk2-rockchip/Platform/OrangePi/OrangePi5Pro/AcpiTables/Dsdt.asl @@ -0,0 +1,55 @@ +/** @file + * + * Differentiated System Definition Table (DSDT) + * + * Copyright (c) 2020, Pete Batard + * Copyright (c) 2018-2020, Andrey Warkentin + * Copyright (c) Microsoft Corporation. All rights reserved. + * Copyright (c) 2021, ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-2-Clause-Patent + * + **/ + +#include "AcpiTables.h" + +#define BOARD_I2S1_TPLG "i2s-jack" + +#define BOARD_AUDIO_CODEC_HID "ESSX8388" +#define BOARD_CODEC_I2C "\\_SB.I2C6" +#define BOARD_CODEC_I2C_ADDR 0x10 +#define BOARD_CODEC_GPIO "\\_SB.GPI1" +#define BOARD_CODEC_GPIO_PIN GPIO_PIN_PD5 + +DefinitionBlock ("Dsdt.aml", "DSDT", 2, "RKCP ", "RK3588 ", 2) +{ + Scope (\_SB_) + { + include ("DsdtCommon.asl") + + include ("Cpu.asl") + + include ("Pcie.asl") + include ("Sata.asl") + include ("Emmc.asl") + include ("Sdhc.asl") + include ("Dma.asl") + // include ("Gmac.asl") + include ("Gmac1.asl") + include ("Gpio.asl") + include ("I2c.asl") + include ("Uart.asl") + // include ("Spi.asl") + + include ("I2s.asl") + + include ("Usb2Host.asl") + include ("Usb3Host0.asl") + include ("Usb3Host1.asl") + include ("Usb3Host2.asl") + + Scope (I2C6) { + include ("Es8388.asl") + } + } +} diff --git a/edk2-rockchip/Platform/OrangePi/OrangePi5Pro/Library/RockchipPlatformLib/RockchipPlatformLib.c b/edk2-rockchip/Platform/OrangePi/OrangePi5Pro/Library/RockchipPlatformLib/RockchipPlatformLib.c new file mode 100644 index 000000000..2a3984e9c --- /dev/null +++ b/edk2-rockchip/Platform/OrangePi/OrangePi5Pro/Library/RockchipPlatformLib/RockchipPlatformLib.c @@ -0,0 +1,332 @@ +/** @file +* +* Copyright (c) 2021, Rockchip Limited. All rights reserved. +* +* SPDX-License-Identifier: BSD-2-Clause-Patent +* +**/ +#include +#include +#include +#include +#include +#include +#include +#include + +static struct regulator_init_data rk806_init_data[] = { + /* Master PMIC */ + RK8XX_VOLTAGE_INIT(MASTER_BUCK1, 850000), + RK8XX_VOLTAGE_INIT(MASTER_BUCK3, 750000), + RK8XX_VOLTAGE_INIT(MASTER_BUCK4, 750000), + RK8XX_VOLTAGE_INIT(MASTER_BUCK5, 850000), + /* This is not configured in the OrangePi5's Linux device tree + RK8XX_VOLTAGE_INIT(MASTER_BUCK6, 1100000), */ + RK8XX_VOLTAGE_INIT(MASTER_BUCK7, 2000000), + RK8XX_VOLTAGE_INIT(MASTER_BUCK8, 3300000), + RK8XX_VOLTAGE_INIT(MASTER_BUCK10, 1800000), + + RK8XX_VOLTAGE_INIT(MASTER_NLDO1, 750000), + RK8XX_VOLTAGE_INIT(MASTER_NLDO2, 850000), + /* The OPi is officially configured for the 837500 voltage, but is still marked as avdd_0v75_s0 in the schematic and Linux device tree. rockchip says this voltage is set to improve HDMI stability. */ + RK8XX_VOLTAGE_INIT(MASTER_NLDO3, 837500), + RK8XX_VOLTAGE_INIT(MASTER_NLDO4, 850000), + RK8XX_VOLTAGE_INIT(MASTER_NLDO5, 750000), + + RK8XX_VOLTAGE_INIT(MASTER_PLDO1, 1800000), + RK8XX_VOLTAGE_INIT(MASTER_PLDO2, 1800000), + RK8XX_VOLTAGE_INIT(MASTER_PLDO3, 1200000), + RK8XX_VOLTAGE_INIT(MASTER_PLDO4, 3300000), + RK8XX_VOLTAGE_INIT(MASTER_PLDO5, 3300000), + RK8XX_VOLTAGE_INIT(MASTER_PLDO6, 1800000), + /* No dual PMICs on this platform */ +}; + +VOID +EFIAPI +SdmmcIoMux ( + VOID + ) +{ + /* sdmmc0 iomux (microSD socket) */ + BUS_IOC->GPIO4D_IOMUX_SEL_L = (0xFFFFUL << 16) | (0x1111); //SDMMC_D0,SDMMC_D1,SDMMC_D2,SDMMC_D3 + BUS_IOC->GPIO4D_IOMUX_SEL_H = (0x00FFUL << 16) | (0x0011); //SDMMC_CLK,SDMMC_CMD + PMU1_IOC->GPIO0A_IOMUX_SEL_H = (0x000FUL << 16) | (0x0001); //SDMMC_DET +} + +VOID +EFIAPI +SdhciEmmcIoMux ( + VOID + ) +{ + /* sdmmc0 iomux */ + /* Do not override, set by earlier boot stages. */ +} + +#define NS_CRU_BASE 0xFD7C0000 +#define CRU_CLKSEL_CON59 0x03EC +#define CRU_CLKSEL_CON78 0x0438 + +VOID +EFIAPI +Rk806SpiIomux ( + VOID + ) +{ + /* io mux */ + //BUS_IOC->GPIO1A_IOMUX_SEL_H = (0xFFFFUL << 16) | 0x8888; + //BUS_IOC->GPIO1B_IOMUX_SEL_L = (0x000FUL << 16) | 0x0008; + PMU1_IOC->GPIO0A_IOMUX_SEL_H = (0x0FF0UL << 16) | 0x0110; + PMU1_IOC->GPIO0B_IOMUX_SEL_L = (0xF0FFUL << 16) | 0x1011; + MmioWrite32(NS_CRU_BASE + CRU_CLKSEL_CON59, (0x00C0UL << 16) | 0x0080); +} + +VOID +EFIAPI +Rk806Configure ( + VOID + ) +{ + UINTN RegCfgIndex; + + RK806Init(); + + for (RegCfgIndex = 0; RegCfgIndex < ARRAY_SIZE(rk806_init_data); RegCfgIndex++) + RK806RegulatorInit(rk806_init_data[RegCfgIndex]); +} + +VOID +EFIAPI +SetCPULittleVoltage ( + IN UINT32 Microvolts + ) +{ + struct regulator_init_data Rk806CpuLittleSupply = + RK8XX_VOLTAGE_INIT(MASTER_BUCK2, Microvolts); + + RK806RegulatorInit(Rk806CpuLittleSupply); +} + +VOID +EFIAPI +NorFspiIomux ( + VOID + ) +{ + /* io mux */ + /* Do not override, set by earlier boot stages. */ +} + +VOID +EFIAPI +GmacIomux ( + IN UINT32 Id + ) +{ + switch (Id) { + case 1: + /* gmac1 iomux */ + BUS_IOC->GPIO3B_IOMUX_SEL_H = (0x0FFFUL << 16) | 0x0111; + BUS_IOC->GPIO3A_IOMUX_SEL_L = (0xFFFFUL << 16) | 0x1111; + BUS_IOC->GPIO3B_IOMUX_SEL_L = (0xF0FFUL << 16) | 0x1011; + BUS_IOC->GPIO3A_IOMUX_SEL_H = (0xF0FFUL << 16) | 0x1011; + BUS_IOC->GPIO3C_IOMUX_SEL_L = (0xFF00UL << 16) | 0x1100; + + /* phy1 reset */ + GpioPinSetDirection (3, GPIO_PIN_PB2, GPIO_PIN_OUTPUT); + break; + default: + break; + } +} + +VOID +EFIAPI +GmacIoPhyReset ( + UINT32 Id, + BOOLEAN Enable + ) +{ + switch (Id) { + case 1: + /* phy1 reset */ + GpioPinWrite (3, GPIO_PIN_PB2, !Enable); + break; + default: + break; + } +} + +VOID +EFIAPI +NorFspiEnableClock ( + UINT32 *CruBase + ) +{ + UINTN BaseAddr = (UINTN) CruBase; + + MmioWrite32(BaseAddr + 0x087C, 0x0E000000); +} + +VOID +EFIAPI +I2cIomux ( + UINT32 id + ) +{ + switch (id) { + case 0: + GpioPinSetFunction(0, GPIO_PIN_PD1, 3); //i2c0_scl_m2 + GpioPinSetFunction(0, GPIO_PIN_PD2, 3); //i2c0_sda_m2 + break; + case 1: + break; + case 2: + GpioPinSetFunction(0, GPIO_PIN_PB7, 9); //i2c2_scl_m0 + GpioPinSetFunction(0, GPIO_PIN_PC0, 9); //i2c2_sda_m0 + break; + case 3: + break; + case 4: + GpioPinSetFunction(3, GPIO_PIN_PA6, 9); //i2c4_scl_m0 + GpioPinSetFunction(3, GPIO_PIN_PA5, 9); //i2c4_sda_m0 + break; + case 5: + break; + case 6: + GpioPinSetFunction(4, GPIO_PIN_PB1, 9); //i2c6_scl_m3 + GpioPinSetFunction(4, GPIO_PIN_PB0, 9); //i2c6_sda_m3 + break; + case 7: + GpioPinSetFunction(1, GPIO_PIN_PD0, 9); //i2c7_scl_m0 + GpioPinSetFunction(1, GPIO_PIN_PD1, 9); //i2c7_sda_m0 + break; + default: + break; + } +} + +VOID +EFIAPI +UsbPortPowerEnable ( + VOID + ) +{ + DEBUG((DEBUG_INFO, "UsbPortPowerEnable called\n")); + /* Set GPIO3 PC0 (TYPEC_EN) output high to power Type-C/USB2.0 ports */ + GpioPinWrite (3, GPIO_PIN_PC0, TRUE); + GpioPinSetDirection (3, GPIO_PIN_PC0, GPIO_PIN_OUTPUT); + + // DEBUG((DEBUG_INFO, "Trying to enable green led\n")); + // GpioPinWrite (1, GPIO_PIN_PA2, TRUE); + // GpioPinSetDirection (1, GPIO_PIN_PA2, GPIO_PIN_OUTPUT); +} + +VOID +EFIAPI +Usb2PhyResume ( + VOID + ) +{ + MmioWrite32(0xfd5d0008, 0x20000000); + MmioWrite32(0xfd5d4008, 0x20000000); + MmioWrite32(0xfd5d8008, 0x20000000); + MmioWrite32(0xfd5dc008, 0x20000000); + MmioWrite32(0xfd7f0a10, 0x07000700); + MmioWrite32(0xfd7f0a10, 0x07000000); +} + +VOID +EFIAPI +PcieIoInit ( + UINT32 Segment + ) +{ + /* Set reset to gpio output mode */ + if(Segment == PCIE_SEGMENT_PCIE20L2) { // M.2 M Key + GpioPinSetDirection (3, GPIO_PIN_PD1, GPIO_PIN_OUTPUT); + } +} + +VOID +EFIAPI +PciePowerEn ( + UINT32 Segment, + BOOLEAN Enable + ) +{ + /* nothing to power on */ +} + +VOID +EFIAPI +PciePeReset ( + UINT32 Segment, + BOOLEAN Enable + ) +{ + if(Segment == PCIE_SEGMENT_PCIE20L2) { + GpioPinWrite (3, GPIO_PIN_PD1, !Enable); + } +} + +PWM_DATA pwm_data = { + .ControllerID = PWM_CONTROLLER3, + .ChannelID = PWM_CHANNEL2, + .PeriodNs = 4000000, + .DutyNs = 4000000, + .Polarity = FALSE, +}; // PWM3_CH2 + +VOID +EFIAPI +PwmFanIoSetup ( + VOID + ) +{ + GpioPinSetFunction (4, GPIO_PIN_PB2, 0xB); // PWM14_M1 + RkPwmSetConfig (&pwm_data); + RkPwmEnable (&pwm_data); +} + +VOID +EFIAPI +PwmFanSetSpeed ( + IN UINT32 Percentage + ) +{ + pwm_data.DutyNs = pwm_data.PeriodNs * Percentage / 100; + RkPwmSetConfig (&pwm_data); +} + +VOID +EFIAPI +PlatformInitLeds ( + VOID + ) +{ + /* Status indicator */ + GpioPinWrite (1, GPIO_PIN_PA2, FALSE); + GpioPinSetDirection (1, GPIO_PIN_PA2, GPIO_PIN_OUTPUT); +} + +VOID +EFIAPI +PlatformSetStatusLed ( + IN BOOLEAN Enable + ) +{ + GpioPinWrite (1, GPIO_PIN_PA2, Enable); +} + +VOID +EFIAPI +PlatformEarlyInit ( + VOID + ) +{ + // Configure various things specific to this platform + + GpioPinSetFunction(1, GPIO_PIN_PD5, 0); //jdet +} diff --git a/edk2-rockchip/Platform/OrangePi/OrangePi5Pro/Library/RockchipPlatformLib/RockchipPlatformLib.inf b/edk2-rockchip/Platform/OrangePi/OrangePi5Pro/Library/RockchipPlatformLib/RockchipPlatformLib.inf new file mode 100644 index 000000000..0c146c79b --- /dev/null +++ b/edk2-rockchip/Platform/OrangePi/OrangePi5Pro/Library/RockchipPlatformLib/RockchipPlatformLib.inf @@ -0,0 +1,35 @@ +# +# Copyright (c) 2021, Rockchip Limited. All rights reserved. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# + +[Defines] + INF_VERSION = 0x00010019 + BASE_NAME = RockchipPlatformLib + FILE_GUID = 5178fa86-2fec-11ec-95b4-f42a7dcb925d + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = RockchipPlatformLib + RKPLATLIB_COMMON_DIR = Silicon/Rockchip/RK3588/Library/RockchipPlatformLibCommon + +[Packages] + EmbeddedPkg/EmbeddedPkg.dec + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + Silicon/Rockchip/RK3588/RK3588.dec + Silicon/Rockchip/RockchipPkg.dec + +[LibraryClasses] + ArmLib + HobLib + IoLib + MemoryAllocationLib + SerialPortLib + CruLib + GpioLib + PWMLib + +[Sources.common] + RockchipPlatformLib.c + $(RKPLATLIB_COMMON_DIR)/RK3588CruLib.c diff --git a/edk2-rockchip/Platform/OrangePi/OrangePi5Pro/OrangePi5Pro.Modules.fdf.inc b/edk2-rockchip/Platform/OrangePi/OrangePi5Pro/OrangePi5Pro.Modules.fdf.inc new file mode 100644 index 000000000..8c0e57541 --- /dev/null +++ b/edk2-rockchip/Platform/OrangePi/OrangePi5Pro/OrangePi5Pro.Modules.fdf.inc @@ -0,0 +1,18 @@ +## @file +# +# Copyright (c) 2023, Mario Bălănică +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + + # ACPI Support + INF RuleOverride = ACPITABLE $(PLATFORM_DIRECTORY)/AcpiTables/AcpiTables.inf + + # Device Tree Support + FILE FREEFORM = gDtPlatformDefaultDtbFileGuid { + SECTION RAW = Platform/Rockchip/DeviceTree/rk3588s-orangepi-5-pro.dtb + } + + # Splash screen logo + INF $(VENDOR_DIRECTORY)/Drivers/LogoDxe/LogoDxe.inf diff --git a/edk2-rockchip/Platform/OrangePi/OrangePi5Pro/OrangePi5Pro.dsc b/edk2-rockchip/Platform/OrangePi/OrangePi5Pro/OrangePi5Pro.dsc new file mode 100644 index 000000000..2ab236419 --- /dev/null +++ b/edk2-rockchip/Platform/OrangePi/OrangePi5Pro/OrangePi5Pro.dsc @@ -0,0 +1,122 @@ +## @file +# +# Copyright (c) 2014-2018, Linaro Limited. All rights reserved. +# Copyright (c) 2023, Willzen Zou +# Copyright (c) 2023, Mario Bălănică +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +################################################################################ +# +# Defines Section - statements that will be processed to create a Makefile. +# +################################################################################ +[Defines] + PLATFORM_NAME = OrangePi5Pro + PLATFORM_VENDOR = OrangePi + PLATFORM_GUID = 0f734438-7bb7-11ef-b25a-00163e21ee38 + PLATFORM_VERSION = 0.2 + DSC_SPECIFICATION = 0x00010019 + OUTPUT_DIRECTORY = Build/$(PLATFORM_NAME) + VENDOR_DIRECTORY = Platform/$(PLATFORM_VENDOR) + PLATFORM_DIRECTORY = $(VENDOR_DIRECTORY)/$(PLATFORM_NAME) + SUPPORTED_ARCHITECTURES = AARCH64 + BUILD_TARGETS = DEBUG|RELEASE + SKUID_IDENTIFIER = DEFAULT + FLASH_DEFINITION = Silicon/Rockchip/RK3588/RK3588.fdf + RK_PLATFORM_FVMAIN_MODULES = $(PLATFORM_DIRECTORY)/$(PLATFORM_NAME).Modules.fdf.inc + + # + # HYM8563 RTC support + # I2C location configured by PCDs below. + # + DEFINE RK_RTC8563_ENABLE = TRUE + + # + # RK3588S-based platform + # +!include Silicon/Rockchip/RK3588/RK3588SPlatform.dsc.inc + +################################################################################ +# +# Library Class section - list of all Library Classes needed by this Platform. +# +################################################################################ + +[LibraryClasses.common] + RockchipPlatformLib|$(PLATFORM_DIRECTORY)/Library/RockchipPlatformLib/RockchipPlatformLib.inf + +################################################################################ +# +# Pcd Section - list of all EDK II PCD Entries defined by this Platform. +# +################################################################################ + +[PcdsFixedAtBuild.common] + # SMBIOS platform config + gRockchipTokenSpaceGuid.PcdPlatformName|"Orange Pi 5 Pro" + gRockchipTokenSpaceGuid.PcdPlatformVendorName|"Orange Pi" + gRockchipTokenSpaceGuid.PcdFamilyName|"Orange Pi 5" + gRockchipTokenSpaceGuid.PcdProductUrl|"http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-5-Pro.html" + gRockchipTokenSpaceGuid.PcdDeviceTreeName|"rk3588s-orangepi-5-pro" + + # I2C + gRockchipTokenSpaceGuid.PcdI2cSlaveAddresses|{ 0x42, 0x43, 0x51, 0x10 } + gRockchipTokenSpaceGuid.PcdI2cSlaveBuses|{ 0x0, 0x0, 0x6, 0x6 } + gRockchipTokenSpaceGuid.PcdI2cSlaveBusesRuntimeSupport|{ FALSE, FALSE, TRUE, FALSE } + gRockchipTokenSpaceGuid.PcdRk860xRegulatorAddresses|{ 0x42, 0x43 } + gRockchipTokenSpaceGuid.PcdRk860xRegulatorBuses|{ 0x0, 0x0 } + gRockchipTokenSpaceGuid.PcdRk860xRegulatorTags|{ $(SCMI_CLK_CPUB01), $(SCMI_CLK_CPUB23) } + gPcf8563RealTimeClockLibTokenSpaceGuid.PcdI2cSlaveAddress|0x51 + gRockchipTokenSpaceGuid.PcdRtc8563Bus|0x6 + + # + # CPU Performance default values + # + gRK3588TokenSpaceGuid.PcdCPULClusterClockPresetDefault|$(CPU_PERF_CLUSTER_CLOCK_PRESET_BOOTDEFAULT) + gRK3588TokenSpaceGuid.PcdCPUB01ClusterClockPresetDefault|$(CPU_PERF_CLUSTER_CLOCK_PRESET_BOOTDEFAULT) + gRK3588TokenSpaceGuid.PcdCPUB23ClusterClockPresetDefault|$(CPU_PERF_CLUSTER_CLOCK_PRESET_BOOTDEFAULT) + + # + # PCIe/SATA/USB Combo PIPE PHY support flags and default values + # + gRK3588TokenSpaceGuid.PcdComboPhy0Switchable|TRUE + gRK3588TokenSpaceGuid.PcdComboPhy2Switchable|TRUE + gRK3588TokenSpaceGuid.PcdComboPhy0ModeDefault|$(COMBO_PHY_MODE_PCIE) + gRK3588TokenSpaceGuid.PcdComboPhy2ModeDefault|$(COMBO_PHY_MODE_USB3) + + # + # USB/DP Combo PHY support flags and default values + # + gRK3588TokenSpaceGuid.PcdUsbDpPhy0Supported|TRUE + gRK3588TokenSpaceGuid.PcdDp0LaneMux|{ 0x2, 0x3 } + + # + # GMAC + # + gRK3588TokenSpaceGuid.PcdGmac1Supported|TRUE + gRK3588TokenSpaceGuid.PcdGmac1TxDelay|0x42 + + # + # I2S + # + gRK3588TokenSpaceGuid.PcdI2S1Supported|TRUE + + # + # On-Board fan output + # + gRK3588TokenSpaceGuid.PcdHasOnBoardFanOutput|TRUE + +################################################################################ +# +# Components Section - list of all EDK II Modules needed by this Platform. +# +################################################################################ +[Components.common] + # ACPI Support + $(PLATFORM_DIRECTORY)/AcpiTables/AcpiTables.inf + + # Splash screen logo + $(VENDOR_DIRECTORY)/Drivers/LogoDxe/LogoDxe.inf