Date   

Re: [edk2-non-osi][PATCH 1/1] Platform/RaspberryPi: Update TF-A to v2.5

Samer El-Haj-Mahmoud
 

Acked-by: Samer El-Haj-Mahmoud <Samer.El-Haj-Mahmoud@arm.com>

-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Pete
Batard via groups.io
Sent: Tuesday, June 15, 2021 11:27 AM
To: devel@edk2.groups.io
Cc: ardb+tianocore@kernel.org; leif@nuviainc.com
Subject: [edk2-devel] [edk2-non-osi][PATCH 1/1] Platform/RaspberryPi:
Update TF-A to v2.5

This is a run-of-the-mill update of the TF-A binaries used by the
Raspberry Pi 3 and Raspberry Pi 4 platforms, based on the recently
released TF-A 2.5.

These binaries were built in an open and verifiable manner through
a GitHub Actions build script (https://github.com/pftf/pitf).

It should be noted that we are only updating the binaries due to the
existing ones getting a bit old, in case some of the ARM erratas and
changes, that have been included in the past two TF-A releases, may
benefit us. However, unless there are changes of direct interest for
the Pi platform, we are not planning to update these binaries for
each TF-A release.

Tested for regression on Pi 3 Model B and Pi 4 Model B.

Signed-off-by: Pete Batard <pete@akeo.ie>
---
Platform/RaspberryPi/RPi3/TrustedFirmware/Readme.md | 10 +++++-----
Platform/RaspberryPi/RPi3/TrustedFirmware/bl1.bin | Bin 18837 -> 18853
bytes
Platform/RaspberryPi/RPi3/TrustedFirmware/fip.bin | Bin 53972 -> 53988
bytes
Platform/RaspberryPi/RPi4/TrustedFirmware/Readme.md | 8 ++++----
Platform/RaspberryPi/RPi4/TrustedFirmware/bl31.bin | Bin 41067 -> 41067
bytes
5 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/Platform/RaspberryPi/RPi3/TrustedFirmware/Readme.md
b/Platform/RaspberryPi/RPi3/TrustedFirmware/Readme.md
index aafbbe9728f5..cd88e0345c91 100644
--- a/Platform/RaspberryPi/RPi3/TrustedFirmware/Readme.md
+++ b/Platform/RaspberryPi/RPi3/TrustedFirmware/Readme.md
@@ -2,14 +2,14 @@ ARM Trusted Firmware for Raspberry Pi 3
=======================================



The `bl1.bin` and `fip.bin` TF-A binaries found in this directory were built
from the

-[official TF-A 2.3 release](https://git.trustedfirmware.org/TF-A/trusted-
firmware-a.git/tag/?h=v2.3)

-through an [AppVeyor build
script](https://github.com/pbatard/pitf/blob/master/appveyor.yml)

+[official TF-A 2.5 release](https://git.trustedfirmware.org/TF-A/trusted-
firmware-a.git/tag/?h=v2.5)

+through a [GitHub build
script](https://github.com/pftf/pitf/blob/master/.github/workflows/build.y
ml)

that is designed to provide evidence that these binaries match the vanilla TF-
A source.



-As per the [AppVeyor build
log](https://ci.appveyor.com/project/pbatard/pitf/builds/32330098),

+Per the [GitHub Actions
log](https://github.com/pftf/pitf/runs/2822874196),

the SHA-256 sums for the blobs can be validated to be as follows:

-- `bl1.bin`:
`28d70adc6e7041582264874d342bcad992adb8d34c9de5813e661029d0189b3b`

-- `fip.bin`:
`02a8c3ea9227fbe60ecfc20999db6bb755d0b32fd757a596353e068e1814e171`

+- `bl1.bin`:
`5ba701a7e977d308a19928e19937107387677d52a1a4d628a5c2bb4e795aae8b`

+- `fip.bin`:
`0c3f8a3e8192e5dcb3bdc5867976e4277e9d948159a92ee71a54e92cb8dce9a3`



For Raspberry Pi 3 usage, TF-A was built using the command:

```

diff --git a/Platform/RaspberryPi/RPi3/TrustedFirmware/bl1.bin
b/Platform/RaspberryPi/RPi3/TrustedFirmware/bl1.bin
index
cd3038990a7c9e45d18cde6198d087281b4b4490..edfb46702e801a102c9d18e4
a52bb4ab9bd72a47 100644
GIT binary patch
delta 8026
zcmZ`;4OCR;nSSrR0}Mh8%rN}x%m7B67(oR^n}!P*qe(VVoU9~i%kX1k)MG**
##Yi9
z(9|@z*2_m?5B7x7)W(_ab`455?51_lB>mB|8!@=2-
976dnm^L6f<Ig%&OYxQhT5F7
z=;ix+zxRE=_y7BNT}X$7luGff1OCjPk5bCa!SiLx;Lo(w45?3>yDqhP8g+VzN?t+x
za3Xc?)wGPP@1f(*pvy$09YE_ui|<sE)}J}!V@0b#|82k=S84F?&D1F=)ES3wdZK
oH
zzO6NbK5~SzG$~otYl)6Y@xFm4#8T;AufR&%!7Qz|Elay*CEaFH^{}G2o|36EOj
Nvx
ze3r0cb&ahp4_vdV`o#7R4u_PQbFGUj^$RCS^DL~?*GSYEx*aJA=cxMdFlj@Iq
{*^x
zU@zv!6mqE&l?+v?eGc+f`5x_kp^RvgB#}G(kZS1*fk^mqwa;&%?=gaQaZQ?&
TU@F8
zz!?=)>err@1J@Nfcui4)7l8dfu~g3ShV82U6!1HwNggrYg7FluPgevcw!d%i%CJL
<
zH8>1@FDU83Z^ifm&qE;TlhwWhGU-H8l24|-
KSv@Nd~R+pDir)7I0>y@)#m}L9?56H
z`Mu|MVA4}vspkQ37y6fc*_xf`N?2*j&Li4e;Q+DKie4AW)()D8;i^uoPV6HPZKzi
C
zSw#9@Kwx6~zXc`~(#F<GfllD*JOM@E$iC^SexqIqgyN`oT#<q-
4rxj(UdRP9xd2ID
zB%InrCE<KkXQ?|uD2*i{Q^^uAa^sgN+8cSK@%nJS1nr~;<v8C!&ZHDVtQ{pY8
0LBG
zABPpO)*y-EAthsKeiZZJiAYKJbkY}1XR`o8OH}0Iykc8?R`yx+NzvUv+YM13izj^)
zeKtUXX_XZzI`_+pqitTbaGA2xJ7BSfjY7&3+xribiPkt)i>FMpC7)<BxfXhOKTO^M
zsSysyCKzjXVr>WIXui;jKEh#UVf~em_#e|VCd{r8tKxEIjX_vxpwE(JL)y`%2GU7x
zCsNw?;$TOi{x`&r;$|!(99Rm*G{XBj@7(u8HLw`_oY>bA+cz!BlL*H-
5+)fH3Gw%U
z_4)CI-s)9-HP!j!#7C-z{=pqf$vCciRiE8VjfaWcSWk7hqw9P+HniJ-8-@WgM?>JG
zo>cuZxF^|uPDZ~XSJms_&X=*qbBvq!N?3C`qOR_}jLmm0PHcZ~%HW`9!>~+
Xl10;<
zOpP~kNM9L8ZnpXleK{KY9y0;t10QVjj9-
9l98%~Q7}o45bfq>DamyeKv0K))w48k%
z`+DVEZ6^+NOwLGcZ@{TPuFe~O5W4ZmsxBH53Pe#-
+QK;O`V2=5D`~+uBawaA(O-{a
zUq!3n2z=anGq-$1KDPMxgml-PCstu|d}0$ock-
8_>J0|CiNWK|i}POs=CBgy8cX8n
zb;5`UOqrEn#2A_(YRogdR}d`?C!-mfOl<?Q$v-
Ol6+LWk?s33@*)Ew>3}#~c@c^87
z@1f3nG&UFVSL%mMbjAsDIW$l0L0@|tk@{1Z?a$GEh_(RmJJIH&#i>9CfdVa
Pdpixo
z2V;#UN}JgJ8$(IqCeq%AgNNYYLw1Bv^M*C_sM6?{$?bR*eY4yMM|T_Z=sOh
jfs}Sy
zv^NmK^O(SwDV!?yI@40MVaCDhxmIlt)|Uf!R4Cq>a|Up6Y81FRRl5cW8FL>`&
dsrC
zmt%8)`wD#nncu2y2QrSAY+Vv8CFVd^VL6;v*ed+Ltkf4k8ysB_w@Y};5q${yUu
vIR
z@F4SXz-
}|t_SeKC9Mdva{tdQYRq9!HV#7Fw&G|KC8^4asH!Vx8n4!IJJF<^6pr>ty
z_7VENV5QF7w_&crGef(MIZsceZjAjiG+yIO$Rhh+@yBVo_n(k8Ym0S%G_D{
@%hq;w
zAa)uFrkep{2qTC(sO+2{Cu`l<H2$A5=}y?{0dZeaq0}wDom6mF$c6+E#hW0DJx
NQX
zN5zLpvz?!%YkxtAT?grIjz_lJ+|uEdX~c(sVMu<Pn4X+2{YcD8USvk<3wpDuPk55
E
zOu3obDe-
dhJZZNGCeQRr^wWX<IR9t`=sHP0C7UQ9A=p0<&$f2lu(k6zEZg9pZ?hVI
z9WV&2&N7Ufv(qBjP1A3pWx~&*aX)C-)$=Ku|IYFF-
P%tvUJKhA1I|hb#?3mno2YTf
zMDFESw5iBQs4L3QhgMx7<klg!3pUP+S=w&QClaL%DK>;ZtLxD_;0&0<+1d`w
A$GV3
z(qWhdlQ8}}aTVlfe~v7iG}JG1w5`S_tE-r~n<{Ef9{!U=X$IobT#d7rxEyEmewnL%
zHwqt&g^yamF{5E6K3IkWA>+8q5H?kKAqtzuR+xyBx`B>#4j27hZw}P13yk(BlY
Zb=
zdj^L7@!)8`ne^Hx_Y9OD#XLew>&@K*&bN<`j)ATd`>&v-
)CUGFL|c0(b><)=;)LN0
zi8rSgdheg1Ee2cN_>RR<=XJ0%gyTr_)IP&fLo+n1pR^Jp3k<D;y+++uJ02qH<>;l5
zS)&!cD*tr<es!C3d=QzQOr?YN<ZUnzU)4dmE!(lpSH(4xY?fVh7V1NF;Q9bG3?ti
S
zbZo94qxE6KH56OEcm}ctqh@^a@LiA-
*F4c0=hssyr`V(#sRm4=q?3Z3GFhY*zJYgf
z5G&3c_P2I4$@H2VN^FwV9=}EHQ&N_nRmriWN#5FXFkbccRZz;}Ci%slrkgDt2
4MX2
zJx-j!InTV7l>!TJJI%C)`y0@YBKvMnC2Armx#DaYlI{V7N>f7V;Lb0%on0?)>*+Sp
z70KZnkm$f@lPm?B<X5^RtUGVDF#MH%;AxT@dQ9Y{G%1-
ZWpkkY+Yxs&LKy)mXL1SF
z&?Il^ISKBGP_DPk)J{W6B~aDFI3bIfZfypvca)ioiCs02f4irmWy4u7tf+#X=}4p2
zfwXMg5EA&N;2(8US`f)1=&n!c>~erJ+U+@O2iMG51qh(Oz=OUux$bC_T;KC?
kaR~%
z>EMBQRqyYB`9YMj**9>u4W>Cj2u$gQy88EEt&UK3a?O15@LLE9;&e)8$rA{hY
y>ge
zf6WN+(P;4))`;RXju`Dm#){6b6j`aWr3XZLYNm8pJe9gE)k#}NiH>k#+T}D=_ekPE
z>O<0y_&haNQboLFrj5&x=84F@G(;y(2CpG%G>fH{McxZsup&i-
6`Sh~9OE{iIFt|<
zyvPz<01wSp^_#b%^QwY*)TKj}lC}`AevB{NtLi5tI_67P`)Y_rRzmR%(+0C1u8$V
P
zg_C%plag@4g8_K*NF|ZeZG{OlFat2bKZ20JokN3C9bZLCI;?44W{6#Pt>Uw=>$
XD9
zJ}~=Z6Ji_2?7b7)e>LR-
?2kk3@qyY5I^w*n_6>`Kz@`1>z^9LMA*n6}@lEvzCtE>-
zMdOjxr3f!2;T<vrVG4wINLu(_=r0~c_|sI@7pZ~oB`gnw6J&f3;!^@cJ4l01YV(m
c
zqCWWtqkL(?+}s4}9AQS8fspuvwK6eOsh1;S$sv)Rw(QAkI1wVn5i6#*qCGdDXl
D^U
zINBOPbJ9}yWFEFIa0sry@WK4+rlBx}xR1LK6eq`QM65zpEU;O{ducNtkCr!_R$_
FT
zL8lXR1n5K=j@D|7zjYEn)Z?zTL<?IEHV!H~hajPki3e@PGdxKe>|%`rMJh8!C`h^
G
zQ##%kdu%!P|DlovtaCv^*viLj!(6$!e69nfTa$cnf77)7E|!sR5|-g`Ieer{T(ZrR
zP76!=BXdpzO)jNU^USraaCD9`>~~BIMqcG~oXD0o<iC4MXz3XR*5tF<Oc2C2^
;*dC
z#PZjlLX<w@29~BSO6A?+bb7Asckn0&w%Z(o*)MJ^em7+CRh<+Q>7}5$IAg_
vI-i`w
z!ZKlFJxEuW<fQc*8s2q)+z|G`8z0U?pGcm@eUJF3j3V!81xMv~gJf+JR30lV$C5}
#
zn%ftWd{wA`jx@E+)P9e#tp21bkNhuiFdK%1IiQjGwE@S)w?`!qxr{2=fq=(#+zR
w1
z-
#=8fKJ9;jP%#r=7QyDnL5H=&vPg`@j&V_&nNxCINkG&$F0Q!IP>^r9H<Y;GILiA
<
zu<`^<URG?UqG{h2tOSbH;+;%u$s<@fAzQIx4Jv?S0xK|Q94?fst!8K8d=AsRQD
13X
z{vQ{5=5{YGB8XDQ1G^~nCoW4rO$q(!6VNu98H*C!NePeCl6i^b|6$cml3cAVs
u;xa
z@_iI^s)SqDvpvV5Bue2JhPjj-T`Iz_Jy{)9IrNg+!%;BY?Hll!{i7k&Rwt0**&I*~
zd!vQ?E-
65Ccwnd=&jJ~w4=;kt+DZ37_N2<%1+X7`uVBH%<~JaX#tO7kV2Vo*#QDb9
zI_%FaRg-aR-
V9jIY;_QtliIRxLJxHrm2{*61X%IBc|8_c3d>QMRyyFSnQ$K%0|zm-
zE>i8<F%W`$r>;!#qCYzWmFgd}bEKo<TJ~&jeSCLUxBT+xSVnhO>kqtVsaoxG()
JEE
zbkvu@rd(@~+2llefP(-scenigQR!9RfRS7+ZC$TVqZgc5`vIsS;|F~zuTju~vQIYP
z<RDjKQk<`<Tb4Gmi#0`I#jc#WUPIf)lhjEgvQfEj;8VlI-!(+eHMtGf$?LfM>6=Ue
z9b)ZmvE_W#6c_jkl}GQJxN+}PVJ%9a6jfJd{$Ljeq%kG)R0jDv-ophJ{Jdr-
d8DbW
ztxF=Qy;+t|IT0yt<PCbe!pf3h=RJd6SFO|MHa}Y2KBUAW^gcG%PSU12B$<X?Y
T)~F
zX8R6AsC5Z+#$zH&E0A=Pb%c=|PT-
O;W27E!oucaJr*q;rovI*fI}6Q@va%Ly;U={Y
zH#u!g$qo{j!lke;yvVEScFG=k^;X1<cy$IBwKU$~$JO1(k8w*>9og=S1CZJq2vQz
M
ziV6n1!Y1l<6smps7)wCrETleaX%_WFzi=SwcuZ=KPbOqmYw(hi>l#vWf+m$cB`
Y{w
zMtT4m;G{HcD+2;}J-
g6%FzJ;uMnX5m!!vTdzccjFjiWsa>RwqIS*b_d{;wj%^}Cxp
zE<#7OIY@gbDH-
dN*vu6B4c$c_Cs=pap(7{mP^=TaQ<W#uF{b>1tOiaX3A{xTe3OFS
zdFp8EUF5EzmAFSA9$4;8sl3U?Qe#rDpzL<{Lgp@__Fjm|9Y<%5lWj!a>%RFJ*6
NU5
zx@CFfRqjJi$I+jI{<GOAJ7IX7&E_WN@6T`j&iGqN)cXm7R}#gYI?3-6c$yo=xS>-
G
zuoUW1bN`G??HqB=bW_?0sx|klNTk=a8&(F+2>=ZMsF6$~?6~0mSQ#lJW;~&
k17R)3
zHIz8=mYJhU24Y=Ca3O*$KiTmuQpU60Js5lPSobyq|BHDDBKPn(O0W4I5`{@N
?{8Do
zz^izrvXg1Vj6-ul(Jh-to<+-
Ztn1@)!iWNUsi%bYdhmQ4ybSN_&hC~?BPf*tXCAr8
zV^TJ9YX1=Y{{~uOJo%`6cTvKr2qlfMjWJFM=iu}7-;O-#mXLl;Fv<c19DX%8fTtRE
zStDS7WH+kK8+d)?sQ1M!TzpJE3ulg6c3HF)Aoec?F)#xo&j+6W##oHoi=}78eU
5d>
zoC9J}K<stge_z8gwT}zP^;M{J;nMZleEqftKR`i={2TOOTniZI<(JQXU+4};N{d5l
zgW6w5S$7+sRm^oRkzNwD&U|SLe%nNsb9&-
N9AiwG8LScSVAUi(cdnH#h;QcQr1G`Y
zzH9nm_cxS5e#Ux4Je!xFSdLkgK%F(>^}NEnPTh>``_UwZTjES!j#H-
6LFIP$fD%5A
z3zstO(7jR$f!zX^l+sOcBVln@evT-
}UoEe8h^_gH<)W0Mzs#?bOx^fHfk>H^DSb!G
zomIHB3N+$iUmmJCr%Jwo$B+O%0iO?Ho=}1{*re5XVB2>Qch#LKbOtpaKeFw
6=;$l6
z{PG-
Mz9u10N&GfM1^DB@WdC{eQ*b2!M~D#mHSu?IUP|O_Mro+D#hE$2IpNuV
-TM5T
zzithof5+Bei0{p<pW1p$d_MP|v&x`D2^EDC)xs9^W7WkD@s4Y`tlGs5*D9A2)
@TC#
z8dy~=tP9eqN`MTN4GpE7&u5|aQrsqrh>iEo_g;c-
&y&n0yPGTS0^?~{hVjRZlw*#W
zZ@pDhD&4Y|@~hRv_J2h(lw6z$ji;M@N#hW+E|*}VoB|Y=0`dvw{;p;O$xnRJ{
`awV
zzJRX05~9?d-;z=fVZ4(+-z(nih7Bd9d}n|cX}^c3;E|^BG(3o}4{!WH73UCo&d1Y&
zTFiOmw4|v@#c+TRjd&SGZN#w=uxsG$t|VyjyqvaaH@pgaHd+1M+5E(I9hsR
^yMN=>
zQW-
FxN0#x4`ljv|#hGd!C$&Z2Qc(_ZAf+HDKvaewJym(PW&=}M_&5=Y)ARDYzcuK
C
zu4eB<%E={nCYIsARWf9r6^~bC6yWyHq{h!6O#AN17O)%@>>-
pRS>y&<3+G?jE3L6t
zQ{$`PTYcKIt&S)~J?v;FvY-
18lsQc2zW~RD?|qQRRWW#9epWwL!b<L`%mi99tYo?_
zC|Ry@)Oj03>ip-
HUX{j|Y<qyTTeyH^j=kK`44;K;2Rb2FRD>?0V&B+Q8bWE>D@#dN
zk-
3n^gD1ty^E1|P_!;L|aiX}LCAbT;_+5grwgBr_!1_~QT@S2>6b|Z9`gk@D;+3rG
zs*>Yc0lyhja)Z4xB?ZK#`LjzdEg^j~FkM2Xjq%{w*j%bcA_fncNwnq?sH8#coj08t
z^Lt&C6fR2Sw@${hLo^mXV`F)gL)LD<!tPUfyhaQb&XzWciNfa|WZ6@Q*2plnn
gVM4
z-Ngv5`@SlM%T(kX4w^`9snAvD-
RR$0;&WAptBPgx=sQJ;3DfX;`Bh}!Rea)1QM2%s
zn#^Z0_;_-nW2wn}6#ZjU0GJRMbjARdnaoY-
H%|dzVl4*l7{E77=0)fiPXS=Uia}Zo
z;C@>|NyNQJM<72_)F6EKg9QZ0kMS{29p3~C=pUOL3m+x~2Awg02fzaQ%~Jr
FSc`!>
z22chT&@Y|>z=Rcpv>1TuUy3^t@(}+Z`r&88>_VgUt42dbxIytx_2hiYgVFIvBDLI
J
z9-
DQ<W)q{UvH8{i&%7r#f3&guImsIXFN#fn4UPJ>`4bOC$(){S&rP=B$@YuM_PvZ
K
zTxMpp-IgA0k4(1X(N@${2D}R0h(!NId;2HH4;yU}e!pq-
p2zQ>P{oVSZf<rgb1W!b
zR#LQVVevf2!!K@eEGTv?ELymLwl17sGUtW$o7dMit)IIrO7o82bDr3;Y0GmjZJ
A4x
z9h$R16fZB3?iJO`=N;X*{0T*TW2H-sJoI?M>hi}{RXS>$9jhxru4o(KfApv5qq`B&
XiN18gTxQDEsyMjvP3bdHzRLZ7+B&D>

delta 8038
zcmaJ`3sh9sx&F@s7#<pC1{hv4Gk^-
CMifvqCL9<NwXto)Nn)Bb3}703G%2EqjhZ<i
zY0}bkdEDgMMY6(xF*?(9#iFDkH?5;4y|(tQn?UjQrd@T=yjt3>h#EN>nfvWCGv
sj}
zvpnv-
|NZ*+|M>oYZw@lyIVPAXv3=N|{qh8*7mS{(mPR$rY!d=n>AmL06zcX8Rc=MO
zB$>K*Ynm-
*11f$SeL_T9A4(@md}kiiPGryOmb6;b_hHO&g+}i%Q8!7{E#tdk(muU8
zQ?=1Mq~vHqnxZ!n9TO7OVTCOd=J~EzNoVNIloh?BFh^??bF{D|xz>x+9VV(M
C)E;`
ztgb6oMZdJJCU9ft+lNC^!`b#ZZoU5$Y2HG&{tbb;LsOATf1aWrxImgHs>6Mfpgj
xv
zC5c>$K$U%NWynEly}D*_Yc<hkK_HKRrD7QhVH5v1l_9@{zRwqUnq3h}@{8T
N!L!4y
zU%6ild@6~-
E0PrK$LcP&Ow9B7?TUUM)^`X|9(j8c+MHL;=au_w!RuQFue@(evIY-;
z-}6#dkk2#t0?(?b4E15#K9O`HAypM==pT`Yjh~yBA4wE^3i9!ntse4%Rj;60aDLy}
zJs^5lx%EN}`~m83QLbhux)_!^atn#});dT#sYrU0lB;#d#K+b5mn9DoHhp-
Nq!$zE
z|HKA2cK&PNhD6$>bwYqEqOCSZ<43;QECswX6+M(dgOidF<l+#f#o~ipAd`Mb
d5mys
znJWE7iq0kP#70&w36U!IW75@$V(qa)(s=)YB0&=q)ZsBmAsb^ZLpvd8htC_6v
V&pJ
zKY$f+IwVmMrP~bpIncv5B9*?Gq*u(usriC44UuQCb5iD#Z4ix)6IGz^DoP(jc{Gv
q
z3Dn!c2*Jdv9g@!L)y2`Wa20dOxmmkmv7GFHlyB@jahPOU>nLO2lIIG<I%L;k2
P8_W
zsG)?K)Ov1$@v;*W_o%s=>c3-
%aG2TXf6CAPB0nsHx`M4v$eVo`!m?ujs4+>w<_;y0
zNn#g~)U_K2`vcU!o&7Lj)^Z^j*Tz@pG{)u#By@!(Ik+)4kMprT1#T2ha3sYTWl4
#1
z!1~RJ3w>3qhZ@!wO%gv+74(nMTuR1qD^?HLP1Jgr$b){fqaxbRPsa^y3gaYF^!
K5E
zzT+59;U)W75wzNTd~jt2ZN4U-
BY^I7D0&U(ju_p?JGikv3`Qbp)LN2Ao*O&g415TG
z;`A2E)8a=?Aa&R<zC6;CzyHwW`%;1{S*BwLWzvqP)5XR}#3N%2L~Losyyq}~up
{~
z|My)ZAK?JUL|fOt;gH*Q6i+?{Rlv)Vg9NU)1G6nj#lEZXwXgaocCG&aM-
59EL4PE&
z|5MZ-
!tuk{opaAc(9A!RqPuZ4E&@d~{4gpC^wk2{;^K(+$)I=gFI~~=Fi#~rvzaQ3
zc4Ci9sfy0mzp?YAff1Yst`-Az)O_}+X_oKLz)!>N)O<~(j$u*uPl$UZJ#61L;DAeW
zOXd9C*m*n<AIBxh-
GAi<1ujo}@9;*;x|V3^en8P_FNY04#CoU;MmZbxgPu7Wr2Ou|
z`N{xF?N1W<x(!zVV-
L!dabxGN4V>_|k@hxRo)Q46c4f$$+gVQ;egjlVB#)BbS+B&}
zVc3<!)UuXLVrx74j7?9cYZ6h0QQu(ZL1eGfWY!YmH1r#^*L`N~05&izdeWk8L_`
2`
zgQ=**47%5%HG^&}mTienR4f{Id82=qRl6Vkyv=P+fbGO>tsAz(qt6u}toou`U(B
@v
z+ySCj@^-
%uU_T~h2CHHnUc^KW<to}=4oOj%|9>}l*{$b(aRan@FyZSvzOsHxZ2iX1
zV_tlNs0uh#bMDoX`P#Or$bJsnUU8N-
jJn$6*7+$rK&uVsYm=aP``x<HcFY3I*F>cN
zDPCk_DfzebOPY0;_4z0=3BjvyJyo=JU4_SFb}E4|=a8z;`f>X9O>L7`MADrw>Jup
0
z-lPn6S8BHKEZdk`JmZB-V|lKij|J9~x>P7(!>Mzt-pbPc130}5inu=!A#=;FeZb~%
zm0Jh2Pac~#2?dS8{UFz1G|Zno{5V^bR&Mg;(h#SzEonLOq)mH;{V;95(869zEAZ
8T
z4*`fQ&<n#S68sajXgf(fBfvQXgcMgIx7*`}-ToPZ;P(8tDQ*hC3K%=j&zXjva&Xet
zgV+a?*keQ$YtXR6pQdZRFSZ@&+D^3B5**|cELwsFw;Q`mtz$BIO3}_#2w9BP
RgAh3
z;}E&WxNY&{hH|vcpeMuNx%&CIMPC?ajOonPnm_|0xjr&Vt1Bxu#y`DQ1r`G
c@-)Gi
zbUIJFJ2rSR9L0b+q)j(=o;v)7KpDoE3^p|*&v!asyFEHG$bpD!Ou-
0#1eBgIwy*=L
zf$RGyqqipn8Hc6BAO{;2#`PI?4E4M??7cTI5lSQ7|JqN6!>{yDgiNG+@B7KHaujs
v
zK)v?kVaK846Q5u_nQt2<dTfBq1*6PAGg(kraOOf^_AJc?PTKJuNTBXdA*9pbJ;
P5L
zOH_so=Y%PfGK)L9<r0F1u%mhM1koUmV1;DTggUjp(bV_6u%l>l1W5zQRipN
_9TN(W
z%PXq6&K+vK!$dA_U#f*$Q<m!$?7`u_)N53%uE$a0X!ZU?J|M#|!e|b6>hM3I
DF<u6
z$?AhHgXJ>VGH^o(wt*#VKm0OS=La0~w_A|K{b(Hoh_ExzZ&8Na>2)KB8kPL;
eK=AL
zr7t1cK0v#aeKfgipD|Yc-
as+f?woI0*9#>y@_<a=8IZAaF9P%iu{XCf67f|^NUG}6
zYDYM+CV>yyF~Gh+a{^_F9vQfRw3G<x`uYOxO&kr$K=&#zS(iqZ-
V$heD&lFIic~mv
zwTw9F;eAq4`|yEm|3o4-jMJJUkxGf$ho#(?C!8b&+xy*c{q(9)wS)BYlIZd$Dti0N
zr1v!u+y?o3hZ%4Ym7Qn;(!%gwg$tHn|9qprGhwFnR)P${p5?oMI-
VKFjj$hv5_j0|
zppQbb#+~*#BLGDm*~^|X&lT=rKR0I!e)b#l@)?ejuZ@t}I70IJ0b*v$O5r@a&y
tV)
z=P^q`CfC`IZ$$Q60S-
nM4xeQ#U@7<YBOC1l2m|6=|AMn*qlbGkOxFN<p56A%Rdg$6
zb2`Pc+&;IUt%=c8M2r4;i2VZMdzLcPKs5dglwf4L&4ShegX7um%Gh{LzY}!?5}$t
c
zv&jB7EYJ=!QNaKL?^iAmzcB**I!U$g5cVuI>Ae=I<k@XB@V_>lyZ3b^2AXViq&
BP!
z9bid;gU_1+hrY?NQCZeN!sY{D3WosP2(H~&=d$EQ+!K{$3e3m9N7Ve19PsZEH
2*x(
zk2k;z5|LuxPecBsx`01P#CJPBDbTlvG;bnlw*bncQ2jfD$z@5@-
3|IUn1gE`aUNmc
z$Z#hgar1Og7mu)>jOF)o|3<2E#0v6ul!N;uZ3Mo|fzH4y<Jxq}Sg;Swc_9@9{l7u
X
zo~D$jn9sSQD8<`cq3~xmFSC5}ucl=Y-
+{Yne3#2Nsh0Rop9j|exf5ZhMhoH_5;h)p
zc<k#H#YL(`d7^t*&21AE{h#dTnH8Bzng)wl>)7F)<jUY@b{u0<nRzSTaO0AIWF
OlT
zrUS%W?Vvg2no<!tR$EHn^KB`io;FBJjg95w{36|HXLo1K7v5wYS$F#0#4`D0rfmi
5
z+5srl0EQ5Nfp6vnR24c-
=87#vuX8kZqAsA$Q%D}&#B{R66CJCp)<*%0He1t1atAGB
zxx4PUZy_Z(;=vw#-
L@Vww>?&{4#wcA2DW%nGR2mb`8K@Jfz2`<qq*BRRlFXuAk}A$
zwkq)0W4mLKR~7S`z#uaDBO9>T1&oDMQg3hB@Ve6x%5_r0*SshlL@9*2!pzx
aX>Upp
z4A3c@rnRuIXWJUjU>l?{N1DX~O;mnbUr7F~{AMCR8)W*?u;cwh69SfoDEXD
U(uMJB
zP#4r^>)Y@5ZzZJ1gfYwDK|Gi6Vx2gsa9Leszs=6`@jLCOQd01$lz{8J7@R~jIgh)I
zTTtr}o`d(mFGMNxOf)QK2Hlv6INyC<%m9sNCmBIEq`3yPlcE(gYf!>mZYL{2GtT
6n
zq47C!Yrfj-HXZ`*B4W)s-}iBN>qLV6G=<*#5PNbheUu)0Pd4#&q+ll{-
C0fct&PyM
z;Qv8=Ckd|3T?+dHPTa1-WfekRvT;C4KQeqAn!^n;Na^i8HAz*Y)oBW%9(j-
l4RF{T
z>s5!_P5ueka^NIlGc3o2+rpdCME+?ZKy-Mx-
v$J4Chb5ueBF)!4mA*o+8Ark&G4bp
zip(Gm%D)2_b{?QG2&*Ea7d2%)8JA`U>f3o10lg`>sPT3aBq*Yv>xADR9zxr&%T
&@i
zq)u;!BuK_pM9fxn$$=c3GZ8A#%)h{fJVS~rGlk8{v(0*evyo3*Ltx>nY2zSUn>Y8
N
z8bsTs#NHnEq;I56+_|q;+&$4Iia}bh3^j>DkUPXBTW=3P%({GQum&r6sBB4__{
6|-
zDYTUzu0v6W`5b;<L!=Mhgy1M7sP(;~u*r-5?d)RSLcCzbU#6m9LN)5}-
;Cq_(vUMx
ztTS<&yxx`&xDJI6?#j&LhUoaC5*U1u%vDIJct)RHG}?1X%07dgeq<+cyse|7$A$
!K
zn<$>SS~%LHZ<YgDl-
1QeXS63QEe*c3F1_@cl;Csy5*OcXYbv^QSaLoVJCR85`fq_!
zSK^cIDkaKK1%_@emB>@{v=V3%v%8*tV%Ow7fTI3t!h;;%6J)YD(e{ybyd{Y|=
R{$=
z1ZAP5=nXefYb{A<YRTGF1ApY1p%Z;as}=o)Bp+UORw}w36Ayoeqyn24K~8)So
{l_W
z{w{Y576FL&L1sMwG6y6^#iKpALJoQtDnk#WE#MH13u%aUZDSu1{fq-
qSXKtqCss^e
zfXkkTi+v#3T(ZJlH79szDNjlBf`@!i&Y`7H0YobR1;QANXM+9bMC&+Rk9fFme$f
~8
z&2@q6ZMVZGe``b;A7zbi1Y<s&_!&LoQIV{C^y6*&E<lCOJZ0#Dl<VRfJ%BYiGp
9hG
zgNJ}0Sm@YXfV{5|xBJL^Wnydw#0wMlq27-
AIg~Xh8)(%<8GcrmUU!XKO@pjlY)^~6
zfpAyg_Hl(0ySNPuLV6>365^LIF3AXGjyLUHckP)}@`!wGQ5-
Mfb!>bb_0uWj^Q2}g
zLo&=#1Xr7ri=W@n{@|pXN`oH*;kHoH895nG5Hbz&_oO}hl)zK{r0u~b%`tt~rj
X~Y
zWEym1elwz81Er2%01dGkNGSwsDT;n7=2Zi8MdJaFKgwkU%cVl<4i$3!XO7q6
bfblU
znK@B=;O&t)(QBeFB~u9mNbd4c!gy%{y?Y9l<P(#lvIp%Mw1bp#ra?#>=Z3<^H
Npta
zkvz_`S^-
Z!*)S|V=OnV%<6_GA9vE0BrF7wR5S2Xs{{G%vpO`Ry!I+;s{sG#@N#5j`
ziugRHKGNQR@@4~quA?L#fIfC;eR#?F`)5$LtXjCC#OXZy=dVTl6_>+TBYc>bmk
~UE
z7AyZZaW-
Cwc<Qc1j&a662BU{Cw$`6Z+Cfw}cc);L#bDx(X!BUksvH%<x7l|c_oi_y
zi5o0?$FX8Tb1pCuKD}YNf;2KC_)xuq>xnfugj5x=Fz7{pBl?`5>>g=j%bbq%SL|8`
zQj|SNE&qY<CbrSJRCtW_Ig5nv;{Qzco^xh03_jzMR1kcST|}?IN(<Ks7uoK@Jo8
Fi
z6zosW9PPbD8s!SUg9QqUl2?FwE4~NWXyL*c?_G=Re<rqq&df!5&X?v3>2EI((
h01J
zR5dD1^$ttn<G7GZDZNl+h<&{%k8LShBbKGJH;R^scR7wu6g3GsVX60Q?^4P53
&aI5
zq-H2paFS!+X05XqE?A2#6C#m8FEyO~5WTC=4x{%an@|Rb-
TyxBq@C&XE^fg4S0DYa
z*?zI4tWXmW=>-
0&bOd$WPK|n5kp}kkJ}?NV(f`W&N*<p9cB3!38H%nmXQ^7^pY!?j
zvbmp6-
;4SeroYI3TiX1k>DO7M>(!iFp;7_qiW8~G7S!XZOFO&asuM#6%sp?lO9l@O
zFpfr8Dd)fhQA#Zvs$j+1Y<S4QPa3LV{hPy6?6r9}``(9|&mkVTG5j*tl<;gk8y}AG
zE|)j1W@iX>K)kUef2ieV)!*W+YHD#*MN`5z0%J)06EHrW7UC-H;@C4-
BxoFO?#(BQ
zWIECF8j#ql3eU@E+e^rIvEu>3+!-
QsXIV$?OPgj_@hk;5745)OWH1B#<1MH4_we44
zL|WVSq{4iOwCDuds+g7f<>%JuZ3dSFa~M#b3T=ADj63a=wHd<l@K*x=rnV{$
d@}l?
zf1OzJ#&lZGqh<xbuKWQ7e_s&;JR)+C$|ZW|TYqwDJi=yzp&WcHe?g%yy5Cu(
+4gQ~
z?aL=mHoAZ$^>ZL|`%6M=7zkoNBD6N5bmHKAY*@;1&Eoxk5L%T?^0WYb?7t
UUYw);}
zkute-
$8Ds2hWkqPrQHb5xE?~N$OK*BTjMWh1pS4RsdDfEQAoWk<+~8ogM4A6a5j5
b
zX!Rp1*gqCpxsc);)_^G;2~h}_9(zb=#e;>%gm`M-
D;P=t;cKXesMP_6a7N21_KO7z
z@fVx11vcD;^#zZzmu}8j`zm&r<N@zwMb|5+KZ!(?mzRafrMtlPb+G+HjO}j8x
ON3E
zNZGFQI5Hm0>Mu)qt{OPgB`H5RC{pS{mb`Fo=?1J4KcH94H4f;-
<G>)!mz_#$Kg14P
z2v^xd3(J#dVLqSR!TJ_H%p7IKLI=CO?9l}$akAPFt#!k$e8tpi`fJ3)6K^ho>{Ka_
zW2=On5ChFK*jSlOxNuZ2OHN{rMXOTO;lEr*OvlH}i?%VfN;dr(jpH%GzGbrM
Mbvwz
z2Y~P-
8ou~|<+ABP)ElM;fN&cc)$swh$fg3+?b8E5m;%s6@bNwOt;kF&k9eNcBQ`WQ
zFm(l3K;Q9r|E*vF_1;*UsUSRwhA%$gHn4zt!}I_UZbPFwKA;*bpl+WY0K$|G7V
sG?
zD1LE0E>MeX_bC+peQ)8H%Q&6H*Z_bZeyiq2$Nf<;npA?j82?qp=t;Ln+ozMU
dO>ZR
zY?~%WyW{kg{|EivY5Gy~qDKT@eEi&L`j^*P`W5;RE>Zk<Dpvk`to+YdITkC|^W
cr&
zu~=!!inf(l*&Qv}Tz8<fcKgOH+Z@Xsi^`T);NOz@j+*anbu3=wSX{Qaj2>Hjb9qV
W
za$c}Cb#vLay7|_5RC4ztn;&`f@kdH2RypdgyIW$8Ro`HjSI%RPtjbNHvUhH(;k&-
V
Yv{iQ4sEO@eZDOZaJtLfEYgc>z8?A1JiU0rr

diff --git a/Platform/RaspberryPi/RPi3/TrustedFirmware/fip.bin
b/Platform/RaspberryPi/RPi3/TrustedFirmware/fip.bin
index
da8a93c495a746fd1f5caa90fba45fa1610a9da8..8feac04185377c5b9320a8bc323
80b7b3b8ce43d 100644
GIT binary patch
literal 53988
zcmeIb3t&{$weY{snaP6?AtZssK*^Z|t&D9&2rp~R$pDIP4AJsg+e}EJK$J%&C;~
Mn
zfR#4Aw+yD@1#dH8ZOOFXzkCQS>1{6oYinyCm>6zvYwHAjwRl?zC>aIv{nj~ik^
vvJ
z{r6tJ@4G~Yea=36uf6u#YpuQZ+AmGjL|5EalC2VdmGRey-
dJ?ijZe&c>Ytl_Qkt<o
z5r4GGP2q&sJfD8g4W}QyddpYG&w2KTx2yZ-
JMnc(&rEmr+e@8i$2jlDJu3R9M~lAY
z(W56ko~YHYWvPz*?iWiv-TgB?-
DTREPL(ySTPZE7`sQv_S<W}}w4UXAAT7(M)U&&W
zsuokJ14^Zb%Lsi|VOZjSNPJMKHz+AgHQpf3j{hF<ckzpPa-%(-
k<mk*QPIPmyy&Vl
z)zZlCb-tZi^{;KGJSu!_sEQv0H$BfP_pRQx<@0vFoT#Q-
oyUfn@l&hzZ(lJ~<r<W$
zy;jyPq3ST>0m48eEBvSa{=6QK@=Lro@m=S;C(nW+R%allKi8^M-
2$a5c+c+eR31#t
z^lVA-
s_@kd?%eaD(&~c!{S`4!O7tyYom#cm#_LFb|E8Ggn@XJy_<$$)DR0r1Q>*rE
z7Z?Kj6zQeh6w0mjs1kWjC2bj@5zGp&HLXsM9_cO4)Z<SXD!gCmVNF@(X~5F
GDqdq%
z?(uomh?z>Y?*)$;#I=FvxcqN!Sx4HL=_-
E6<Be9w^sszyI^AF4mVG)=b_QjCDOHsS
z-
d^e~G!;CCf`{NJw5imb`b*gvO6BSw^KMbpf5teoz1sVc?8cy4wh!1Q`2s;btmo@
-
zd43h%*+w07>W~gBJy(wp0Y;|XR^Q%o$deuoYFcwTd8!sx?a>}p?HcveQdC^C
2!|+X
zr(Lr%Ra~tw+Y7zw@($|P0&T~qs1XisL+ZAkg8sB+GHs=v7G>G>^-
`BCGj1s0B;wBG
z9~HG}Zj1<PnP$9-
GPP8zb0oafnCj$lc}d`%TJ<k&hmi@J|K@6KFvfwo{MP6r!c~W|
z!f)oN_(;l(c|87mQ{iK!N+!WOF;9;F*xa(VH*<t9pSJm+sVERX^ppw*#|GlJXsV^
-
zbpPboXfuBJunPBhw6G2zZy^2{?O<wZa?cDC9=6J@8+O;1!k3z+Dq`1|?a-
wpcC*<Y
z$yWDE{$}#LL>o)FCvCp`fg>;AD>8iy{7rDyjDX!%YD^&h=4bRak@Gi^^Fx&Xaly
x<
zCby)Tai5eq%#5$m&34+PIaX-
KZ|A$ACF;ieV%`Vp_?bZ4sZ~F+>nLe^JUP+B)Kg^n
z4$|56p{_mPY5{YrE_Bw0TDofgj|AQlz67pUgJ*|zO?!|!1~o?pXAl>h8Hg8AziW7
Y
zIW{6(sMOJzXH7woQab|h(V;8#_<SQfybZY^UHN`1tzA)O%}hOh5xgL>FKwCJj
x9wa
z!a@hB>xpVlTSto8-S=L!f=-
8MpO+MM_NvLTVq~1Q5<2Ay9dtE$DtMgu|8l~Q6sfR$
zKU}QQrlX>Iiq$zfL4yuyQ%`<0Ch_ENfaioZ(4nLUo#)0c7QJ?=e{$<E6}Nc_c-d#s
z`$Y8&XzuV;mu_Xp6LdU5*a}^D!OOio3$H8qvviDZ>zY!-
35%eorp$Py(vCF2SE3U{
zj|zPd{1#hAXa|uq<yE&BLQm=|G67H8y76qe5*|~u&1&dmDK*&#P56bYXzyg
1G6&#D
zKVj>j0a<m+K+hdm8_W({kIrmY(Cs4fJou=$eVo^9t2wFKs?Zan0|g)96VY*{Ub
Sqi
z=x*w(qYqtJg0Fm+c!kUxXXpm%?RDyn&T-
^}az{V|$?xi!Q>%VBz&p|h<pN81N91Si
z8nbPb(wmj?G-
uLwPg37UG7`E(bbu`%PucPzaD>leNjgQ~wIsv)g4s3&cs}6ufyW2K
zOYR$0l)Bk89i7|;ruMEjK&}r2V%gHibk1B+)rXGr7b@?O4(R7Y-
<M{oqh<7ULOY>x
z8R?Dn*R)s8EACUm59=L%5Wcg&t-GeZFkLO%Zqr|lFxCz7i`zbj6ZP()zSZ#F8_-
Va
zg$H$>17pnie01>}e3Lk#y_73F>N6ZY{RT8k{&s5Bpq@jHY#rwXM`@SVOttL9Xc
eEG
zqAEnE{Fu6mz7rgP-
TCy2VBaBR?+K6EMSa4B)VGTI>XZwwWq*40>aJVKw|jn0cpd%j
zE<LZghB`k#uc&Vp{20_t`rF*7hjv2`MuV#K;LE@Z^6kk*Q~RFR74a!fA3*z`K=-*i
zGKDf;gKlE;e2xB1Y>8TU_&A}5`U-8T(<KyoI5aYmaiNDzE4~Nd<79fd-
@SZWCqMeY
z8auz&rkVTQm06pvr1RyQ$fnp;D(chJE+bJ7sndO8*GL@_ww07GxJ#QGu}^l#J
ceK5
z;Ag+Bql39&U8xO$9hZdXe_4-vz1sM(sVdjClYU44DE;_Tz)-W-
m&de7eL%Cy$EEKt
zcyOIQ`U!M~;<?A;^;aXy!ha%vLaSumecYq_k3kow4^w_@R)38CrpaS<77tM^Z
+$v-
zyh+=sN6~S#&+$*HcKI%Kqu*FolVQG1UsfT!e~9>i(wd=X`}{?|J-#e>-
*kB2?!Rr>
zb@Xhq4iGz_W#icJ!_=jTK5ZNIIJ_3!4{p9Iv*tbz?RtvMcJP?IRhu?-t1_n;6RzzN
zn5R}bx*(LQZo%fbT*IC+(3R@-
obXoQ6{Lv%w6fo{>;1279<is07u^ib<?wI0wAsH<
zhV&mn$}owe|8n}|r1p~b_KnG(YnaL}`32TC5B4+ZwP2)PQ<}dc0q>g$coE<|Ep
3lY
zTR287i`X_V_Dm97Dfb;4zdg2Il(x7HnuyGFY}V1e@D=ul^s6VJNxaV6_BQP#y5g
Ns
zN?Y+`Y3*NsMADTW{E1ucFf}>yNFc6qq1$jZd0!$vc7d9lpS7X9uW);POQuyW{rl
mk
zq<_u#3%&1m^JmgGhsZm$Z;GvxB5CbX-
$PPYenO+giL~a>!LlMFgnsJ4KEB)Zp)Iwq
zr?u}>k@6sM=mne3ks)gGJkn|3yr%u|S}iPa4bn<`&r77S($!>}Hztk^_mD>Vd6
Dxk
zz?YKGg&!lY<hw4BuOn4WUXXYWrb72DwX6xcyYw&$R7uC?K)gRgExQ98w#>
*1pBUAO
ztc;F&&;`0?k72;K^q{njiJfvrd8tl$pGcHpV(Yah*O%uYX)flw$cVr&Mw=^r8LC3`
z<W{Mx@aWwm!}VU(B4Y!Sx);N9Evaf*)v*K*-
<=z7qK%M?>;<Gtwh_f<iPz0+dnYst
z8F<F-4~32*J7tsMYr<3)Ke3J1mQ63*t}p93+Fv2<?$S=$G6t^ioOaqJcCz2*8{rAz
zjXm3P!&(-$bBge}KJjQGUF02L!XJj_@JFGV-
)q1l!WWtc+aR~Kz{pkYA^2MA_B!}W
z-O5fT>h_vbx1aLe#anO@9{F{m46Co-
=B1vWnD+}0HIR0Cn!2Uqc>m;mw4bz7F}hjW
z&26jLTm6%*oSE$xs!`dNnlq)JGUIuz1=Cj*&V8>o{9&Rj<4tU8&xL-ME*;?U-
NZMO
z@}5sT$By;ea%{m*!b8}aex3d$<|*)-
34ZD5?Vr32*(*c##Ey!ksftqi^Nt~^Vk@$u
znY2;5YL_~ET5R1wdRRB93%n<`tJEcyp(eYy2wkK-H-
bY9xv}dm>Fv5Z>4U_7i|@t|
zhu^n?-&Syl9W>jE(#>|o7$2UCOPn>)oW6!%G5D$c8C}K5OEG;-
b;YP~a6xcdAYEn8
zpgbc}wHxU2H7RPcerR2}TCI<kxX;lJ)>Y<ol{q%M&}0mIqQ64u5F2Hce=k8N<3x
W+
zg{1SF)7Orbv}RZJn5(;dMn{2_ZQifOJ<x@X7hRhQ4%iGrkLsB>cU7mW5z2UKvs
$ff
zL65}I{do#{nS8g3%;`<T$eX*Ayx1?~Q#<bIl0M(YKX+94fTUmT866P23S8y=N&5
TC
z2}KSsON1XM9O#44|CF^O=dnOseI9wZOtlB;hm^KrYV0zzU39g`vGg^;G{&P(S
p^-Q
z%7gL^9Bz^H^8J6(_gKhQ9=!fW0=}NBvMYa1Uiu5s;Z8rR`Jd6T4WYSj-iYv|74ui1
z=XQMcYk_!3SN`81w~-
o?O7kG2d|1qk!o)_lp79?QrRJW#6)Y9YX5GkYR8ssAM971
zelQ1Kk@26~$4hxqw^7vX*5eOs+^uWPf`^P_Wjrf=N*;OkWH9b2R`Cn}>A}vu
dd`s^
z`gDsjrT-|bL4SgW@Sz1?{0#hJw6|Nft&12}xnn4yT}ME*cT9mknJT-
mL@irDe&eGZ
zn=PfLb|mU{LVvWtPGijM5*>XHX@q`1@u-
$iwhI5=uE(A>^JJjQrC%<6kkn}|by^O+
z-
l87TA5Mps(>IL@UqN{Lq`a_OFX<mgKfj^;lPXdln}i)X$&8=$<YJ%a9?@unkWE+
W
zIQz^xhTp4>XX)E_8dbZr)1EchD%301h#!Hz;68W+okV|nVf1Ysy-
j?_$^Mcj0?@-_
zwtHw-
v6*z9dpu)ER}ej%cft7Y(FT7a{o%YD$9p`g9UEZR(<@8%M1+n)qkOgO?gWh<
zfJW%k@Xw)<z_<Ajd_>pY$2WK=4?A*44efrYYXkj!q`pw;b=xU7)=xVk8={-
Wd!6yB
z0o~LKd10aRFTlY{v9jIqTFRV9%AbB=YyH)<|F-
mwf=YB*!1zMJH?S`YRcf8U3yfP+
zaAzzxjPAIl@?_z%zy_-TnH}*2>6Q6U<!0!c^-m+iDd|raJhAj6bDtig+Sh=?i{M#J
zKE|N!)->v|;v>*b`IQ<wQK_Z^Yno~=qfYiW>??U!;34uS_L!!c=$9h(E`ONRITv`g
zERT(pH%?UTjmQbMVS6wG+qJ*7ym1)M$W-
GM{I23x&b!dK;(~1Sia$67Iu=^xrO?r!
ztROJt{gb@6+AxR{7*~)-
jhYw)PVi<YPGrKmNXEMRw~zFQy`C8BChHjZ(GY$_Z@h@U
z48lVZO-&UX=67P3ip-
=J)<<aTQsknHHdAWYMCxYiBG={(!cQVE@6cX<hK?F~Tl$#@
zdgyH3^f7#WqQ`uqb7G^zc6&GE<NJGR`z^YIXXVMXqb?m~94-
Dhq31|==nvphaq`-(
zO2h0Wu0nV(hdzigN^S`<`D5heNoctXS_)1Ku3Ds>Y#m|y?c6c@px;R3_)T<>lp
$><
zGHdG~%KN88KN3TpzB}I>e-PdG;xE-
Qp9dW=3VD4&Ewi9Y6SNciMeM(?OaDii)}3nl
z7kL)@0G-t-
cswIIHN$K#)5U((GD?wm(Q$_GeddMXhvE0(;OwD3FHXewAvARTjxy#H
zdn-xDsdP0(?D-
Se7AJ1cn`@*SQ(Nb&>DHa}b@=vP{6@lmqPCY8dQ_eAZZFTzu?kwj
z?Zw|?<3U3gSKId1NBJATxoN&R-C(S<6`!5hFUq1HE>`UV`-
GY^b#8(#7T;~$cU>5!
z9xX-=JOob~d4$=7qY3FJj6%W!LUc_;TRLSbuob*4Fz-
{wlozp&V&L*UeZrKGt+(?0
zHryKu!p{O1*;&?+F=ORc`uNCL^L`7t`98c>s2Y3oOlS#yC$gIgI*60{oX|&3w7~U
W
zdG}GK4eQqh;V02;-vgf533gn==<t)gJLAzGw(04P-
$?qVTzts%)%KY5R(NAKI$HER
zdI4Y0$mkcuH;fK{oc7w9k=rc1*!mlF)G$ZwDZ}n5fgfy}iST2jk+eQ=Bi)Egcqi>L
z#vv7yQ!d|{65qBaeXGhS8~+l%#p>)t9W0&xd(i*%)sxc4Cj3R<EdBSx^haL!OpT
{3
z=~rkE>nf`}2e>vql=IH1{!J1$j5yItDi<A<&`rToM~8^~q{?^nj_4@ifgrM_`mJ(X
zSJ4KN#?@;%(CckzX=UUzYvyfxgl`!Shwl*>&_!rM8tR&3(}8azUXiv<&_U`Y`pVI
%
z-*<d-wjV=_t^~&6cltNg6PnafV=ihw{u*6r@gV+fX*UC3Uu-
RUi~5z&HcGAQR4;wA
zw~X|@*vN1UJ)*L{)@fEodSiK_Q{cZ`bTN6Fpx2%F*PQY2k8K<T54SAwcihDo?
Nxl6
zqMMW|i<ADqk9o%zy#qf-cpNgkj?lIN2@m!6zY!qx;jdT--
nQSBGT*TE++dqw|M=&}
z`!}^_+heq73^`~WrIsPTG^eAxT)KQ7IMNTi4PQqT^LAI78-
rt2{QgAz=c&grzLmuL
z^Zp0F`}m1Z4Vu_~VBu@Aw?wB3Pe*<kh>wJ>Vv`#9x#V5u4tf~hek2he#CITb
0C(~}
zpo?r>>dX&(ApC=Y_^G#(;PdXnPdN+zP45eTkXFLqR$x^4HeibF6<jkayo+b+XX
5*2
zzK^&-
a8&p=#05J8GXJzA5E*6rL|y*sdfTB1I^Fi42u*VEGnLSOEo(gCoYgs7oIXK|
zT6#{i_#DO0s4>3EvweekQG>Bj1iCaW3ibV)uISIqIC6`B#F5Qp-
{3&sOF2UK&9qSt
za7IeoYHIf;X*1eH5vM3a=CI(|-8uNf|B-LP-vU>@Ide}=A13kSX}46?l;z+u8F+Ig
zy^d~0u7s~T(9h^AN7qF@5?%q1UqIhdMP5VlYUxuY{Z!&5J^4zico+YGA$`&v
W5acP
z6aDlWp`^WqG9+yz8Ft^;@E_p2P=*<QmeBPN4kNAbJw6IsPx*l9Tbg6bkodb
M@gDkq
zAwIU8=q+|RIZ-=JUv~IL-iPt~Ilu1!M`*N@XPJviqpef<;k)eg@{=*D&d=gEigAxh
zjdYsKWuKu-
Y~I&weNKPxKU9pr30_B+`yYWGtDG|YO6G&$cbOmR`KTHHOoD$+Y=9Vj
zZ_f-Z{4jA5-
Va@B#`oi66<eTEsUx$o3na}N`o6=}&V12^M1JTsIhHo7t(0`w#1%3|
zlC<(&%DaN_Vd(!bbu`4Uk<{;>TIJ{@kyDZHxgIO~C}9)*f(7p1!6rOz)A+jsa~dM
&
zJ<X|YHa%Z2Yd`#OTHDK8(%W9W89k`X>EKaU&Di69$`jhsw$n}Ky<%&1XyR>)t
<}P@
zOVO#Rj5R-_+WRZfm1#5EVre?RS^PY0J?Ksg9q-
3y<jB|0Y~3k({~~lS^XM{{u)+81
zfXvJ8R@7PAL}(C%1|m12%M9Wrgzus*?=aW3iTRsl(5=D*h6W5^#r0q7aY^rv3
v}d$
zxmJJRjujj6`$l!IGl!HccgKh0dv)wQzre}?))c~n`_sZ*;3fR+%I<(&3tjg?6L9^b
zg)W{CZwF}Wy?(XKOuP#(3jdhsgH~O?9G}9<mQJf6MBnsB>JvMC%@j!!VeBA
jf~WhZ
zIO_}sb()Kht$)CW_TTN$(&-
C>;L()8LugTz?aZBs%oxCwvV<oZ4c2rJ3VmHVyJ6uo
z*zfecYC}_jjAIH}PoRvZ0+qh6K$Eo_MrK%vuYx%g$&cRL5O@LoiEqc9zk&7}j2C
o!
zelD4|!jtIb4c4K6@D(~r_^b4w$k-
a<%F@fm8(#HXNZ+<4l(BEK@P?aK(xEr6FI725
zs<993Hb}D5HT)p>U`ESaxLtnCDPQw4))O3GLhonpEAW-55x$18bBh+t--
EuZ^JS@Q
zCBK<Xx0~Y_`zdA5wZLC>9^wQ1=FePny9YQb^Qi*laYHq*)EN9ez-
dCa$+$EKy@eh=
z_|0eRFVGeg?{Vhiu@!;gj#F}glatw1Aa$qSb-
S}w_N_C&db{9Q0o>4LHA3Kp?j1W9
z8MFOxK|<;@x%Clz6xmj}_~#AE8EJGEEMHWzN8+$&H#PDsdSB8xeBtPSle89
bq6Z|O
ztVa=l*&tn>Di}vy49hcm4RldnHPogB<1?v~D`)VIEoZT`)&f_i0>JTP?k|{c>7#`|
zz0{!^SOKp-w01$w9s^qRP^MBT*A?-
sl#cs2<+|X4aeD;z)&%_sZGX+{;3hOYO(@?5
zruNb|JGGZ|c!f1Y9hqT#<#r!o)0Dn}dGAdf;4zo9p+H_3AMGaHeAMwFFuptt|
7&6+
zrGKf@z|PZve+)awz>c|uw4dWyv;LvH=`)dfrPkQC;1u*^ALWSb2tMxo$DdC-
Hi6ro
z$30%wSfnQAqtaMYVXqgkZGUI}BPH6$e3j4}-
+hbj8TqWNb&_$x4B+BVZ8@ap5|>L{
zZgd9x0kK;4>p8^bL_Opa9Hfu4>u+5UmOQQwa@GR;X!~vS)e3k*Gvj_IRI0Vy8
W*XT
zxWdee-ZE%V=)Elw&U3=dI}%~Amv-
GOX(RNFLVt@;csNKXI@cr=n%L{W()GDETzFN>
zjCHE?Sf`;ZJHHvg-pq8qGk?mMeQ(=Cs^d38vsbe^e)9^t+nX-
+@<i9EwCk%>`cy6Q
zh4OXyGMZMK52Ktm6<f?nnu@vNg**3BhRWK}=~KjIt=(*<P3tbqbjI}oW$qM
SjJ49I
zr$>4_ysB+K^Z$aIJ4YOQNNZDSduLBIwl?<s;YsvQg^IobyTwRlE=O!`$3~Sgn;XA
C
z8=SwyR@o%>k@Pd}_a@=ld8%E?zniq;%a~6a_|%#Lp;r;`1HhMYm*l;OZ$g8a
^g}ZY
z`iQ~#SG%uKDnGo7a_s&*G2iz5Sz`d{e~&Y^Y$YAz`T7oUaCj#t>h=Xc0vGq$p~
DZ`
z8krLx<XO!hqAjaaTQ|4rpYJ`E*SfjsfyOR1&usUpRU1V&F?SLTjme2heM7ny-
75W<
ze(%m!ePyq<-
s+UNQ1+V5U(HbUKE6EwJ|SI2EmOX!Xg2()+v!+O2rV?`V_J1>Q4oAX
ziL`r}&l0#TsTXFq>Z!{jd<*LLQHFO}D0RioP`0&Mc;DvrBweq{tj<?~d1}?*{NqUG
z(BJZ;*mI3>XtaCv$kF0UeFs|Y{+g^wFzxxsY1BKvxO=nXQ_g=DU-
HHuFvkzhU&7yb
zB(!GDX8bM94Z8lUkG|+cQ8zeDjka9ez4>^~u<;Eylr;BvQn6`n8ZUk0eC)WIhs?
H>
zdVcd-`qxjVspo=TmE8o4R{AP|v0dg<RNj$l!ucLE{^BtFk;?mQK;<+`{R?TED!$45
zR10f}j^STb;1mnNr<25&UvOkS^HB7M&%sl<l0L%P221A2rph`V^+(a4kDyC~&`
FI0
zXRq3A;O{TyT?3X6-<?|B@Nl(K-
!kY=f?ji{#W>^;^nDqhuFOe!O_9k9qlZgbUq~AX
zuN^KWKRQul^>f5E>Ul>x-nM;BPP@3irn7v_t<-
lRI5q0pk=b#4G4J%3RDZc)qx8>J
z_<9a|M){?z{{c+FW1rog&YBLfzr=syV;m#xB;%^GA!?W4^R#ZZ?Z>Wp9Q%#B
L>oV5
z_BLIhDk|0NqaI{@X4Z_ig~uwr=Fxqbs$w_ofOEEaH?*rrQP1sFBai4CD&BsLZ}Y
L2
zu*Ht7muK2;FVC0oys!YDH~cDg-1s5ITZ)@L*Z25Pwfhxx`%sng>{H-
X&3duJyw|jt
zZ9<#shzfsQd7II9tRu}m5&(yb`ulf#zYO1jx8i#Z-zzom5z!mqzN=Juj-+GDlmV}b
z_ewS7$m8j%BB1in{duh2kTJ|C`h`4uE!lC#YQZAmhmkh?<wYtUyjb3y@)|CF?{
Vc%
zvdp&itS6E+KIzavZ249_{RqB>3W*bb*sG@<@xW8nDy_MiI_w3v!<$+Qki{c2>
~!fz
zUXpj^StK^@kEzeU(q;mu7~kVVD(%^RHS~z^p}^Frm()+zi)zdVd*R!0=s%ff+R
FTv
z$h4CFe7nIqyumdxzrj!C^IF-
`&s2#_69y>jdv;mif*ceB=LO!A{aG@GkvXCuykVVX
z7dy6hZZxz_h3|sjL?4}Hmqv5#F*9Qr`rzsG2UWJO-
0GCE&ok7w+HbZibVnoaKj+<o
zHzGPR1}?#JZTi`IYCQFwUw~|`Fl5b?z5aMUxIv4~zy#G?xx&}yBfeCnAKePAB#
n%V
zYbaOrd2PAbu9LPJ7y|og{HWNA(ID@Fo9~U!cdZov>pz-
p25n3J=Y%g5xUGYKZQ54&
z!fW8`2T%5I`V&9=PAx6a;5o{XenEbJ^o))A;VbmYjsU(gk#&`>Z85dVgMZ)~?I3F
c
z!Upe$dAD-
SX~@^EOUNU3WKgj#2%nmKdm>9cXN`M$v&u9#7G9!`&VU!xWB9;2RCo;O
zQ;-
KqZ{p|9r;mDtJR^t)=UwA&(X#NZZh8q@Y8`N7T{UgLNxq*Z4qcLquH03uKG|J;
z!<?=)LPzFZMOV+D?n)JZ$#`IBH})lbt{r(CnzpibUF!H3^R4_F^WB^Np5=LzqTA
M*
zCxEkrhXrTmlOF`<$H7_Tq8M4LvfE7iV-
WfBqR+%us`08_tqMKFJeSxwF=&{QY3_W2
zZx6CwtuR+jD^w{*(3iHHtr2-!-Lzd~?kVDCDj)rr_sBNljRvWgBlkj&nXj+jDBsS`
zBmEvSQ{lkYZP-
FLDL;t(dMRIU`_bus8@DyYIcdFiS{c7e`o_e#69308AM4z8eu2Bk
z%q?Qxt!xZqsnzLo1B9MT)|0CXCwiDe)0Ar0z5KGQ>}tja5?75(N$8P~Z^bgkU@
p#%
z&r<m4UHjGvUxkleK?mQdt6d$rN_1%n^K_eH@JkHdIqgY{QqBh7gp@FIPRJn
7J9x%#
zW<O)2X<4i_pnWv2ivQsq?0)zZ9$wZ1U5av93+)}9U1@2{L{_(f5AxD}cDzBH(7~
5$
z#$~Lfk*`XrDN31kyh0Dkcg1&EM<?HXz%5O{b-
#)2Xi=9c)&>Xoc_x_cqC2bAxD3w(
z)ozbpg{G@h=W64aZ)DD1y98PeV;<pSO4iS}`+_`^)}>X<Q)sW(b7^&Tf>y7*7o9
c?
z8KjeuF-WJSJSWkqHHl7Jg--eS1N$$VIzXSqdoo>QU7JRHlQO1i(1o?IHeSiJ5#29o
zdio2ex-^k-i1@K-uUu`6xlxT-vC+sko9*w3ab1t6khR){(V*lf&c|5qD?Gd7zOVCK
z_)vPc>{kG%H^klshq$&azgv7m0VBWLLqFglZ2hFi-
uvQZ&&w0=MT!>bU8ho_5B7b2
zW4|(czn-;jvp2B^MsPrvKj$S~CGtg^S5TkwG;sASsF^0Ra}i;qN~u%uPf(>?FL~f^
z(tD1SkzU@%EvTO6T~Iu&n)Jd0sY-
kHWpI5F`4n9$e!Fq#H%G^%4CHG%SvgHRSvXDB
z<OM|bkTJ>kjdZgY9;z5OW<^&qG+WF16~VFE#9pyH(QB|l`^TuG(!b3(Iiu?(Y~
d#|
zJ<apey;~|(>X8^_Ze4Kkv>$_y(0?nsC*Wm%hPhe6_wfbe`qmjv-
*#%%_Zj18wx8Vg
zpA~CivD-ckE{?73vDYf4rSIF^fIa$(rEU2U-(DQ2jy~9-My$I-8}S71>*QxWSWvTI
z@-
+J1BSMRxf}hOm{hYdpFZ7WI%!dzR&oLKxxzsPH=MJ^U2m^M6;{%N$_hN67_
7++H
zF_gaKMLoCf%hCpfIg!=^S$pyp{!^iMWYN9Tbkayad}>wufPb_EUX-
!?q&v*SdKhJ|
z;lP=3;P%I}!s4I5ke`e<I`F?4_!Y$0H-OU_Yu|oi`#r%aT-bu$KSovLlUL)X!!H-&
zdlMLiuW8F(gZ_nIPK2bjphIB?zNQOR1!ZQ-7zppkErs*cvh~!-{7i7ge5JC??FKwj
zc<@*B_fpPpNmt4^?&HwvxZXFFxjC7)@vApJzi~D80pm&5)T-zm-
oEcfuzUBBFXkEZ
zY(8t(4ztek5bMmu7q|fY6uSSo28>T6!?4<AKEJ65-
xceM{sFwD41rIdZu?M<?JsG5
z`Rp{nkThZw+V&G^q&+A*%A8o9l(Pajvi>Fi*ylGkfGh3a$-L-u*mU-
sp|vP9tpj?q
zPH5<H#xcj(V?jTd_ZYaedK_E?hUAxW`eZzrDCZ&S`KLrVt4Z??<vd2ZTFQCCBlf
*h
zciHo$F%N&7H8NMDFOPxWZe0y!jFh*9avBrm2n@+D<(y0^=jEv?&N`Tuml><
Mcn23X
zOf&oYZM^e`s#}CMx$sj<XHi({D0Z*3*)M4G7TT-
|*sMACWA|+g+HI!$UHruE75oap
zP4HSvUg@`mepS#oDPOzn3t0osm5Fu|xB^rB?_wtlZKTc4NCON>BlU9ANIMB
{mBF_a
zJfr_c$onlk+q?$ecKPptx8S>obfOF23rDff&nQ2E<Jsk(k>&$%6!{XF!VbMfN552
#
zQ_G%tslP&emx6P?M;|SH4r9a-
$Y9HGo(IMj_PjFlUF3U<xmRrAWx;K&x4Zs8(Sz#z
z-
+2n0r@(m%oTtEf3jAM70jqO3J|g*@iz+Zq?ff(AdgOO5$~P(hSClQkb5VYf^1n
mb
z@;evhTa^D5%9h``C_h5^ODJ1@=c4=$%D<Vi<##U1k5T?*lr6t=QNF?_JDjrRcP
`2|
zDF4r_Ym(o&C|`WizoKmUos05=l>Z&dmfyK3-
=h4lP`3QeMfnlRUqadPI~V15Q2x!7
zEx&V7evI-jqip$|i}KHxd7c92DR7<w=P7WW0_Q34-
;V;;%uDS`{~+LmvBbMei6156
zpPAu&cjJGZh|f*LKR?U)zVvD*T#yLAoCrG-VJs2WT;rr0lL(I|;$8Ub+;q1(>GD7A
zgzGAtaK~*<ID4)WTIEj29BBdsGsgUFf7yvYu)zsy?r_3K6Y=SroOf>`K9Tudftx=6
ztn_aD?DvVEcUJtn0H2TePoaR@E|;7|e>Z;GS@C^|cl}X^A2Ji+s6=Qa!Z9_@_Z
5lo
z*YlnCtZFBmmk0+dWh5RGVV3ino`@wd6OT-
x+JA0nGw{39x%};h4xh8`*8MY`heR*{
zzQc}|jSh)F(|!0bp+}wQcm8vpwj|!Kv%?Ae`!)M%DgQpI6wCgS|4jRZe+Q~#+I
U%Z
zyiykb{q=vQ3M^lEcY|?-arv|>CQrEH@@XG4u3Ns?xV*%eIAP-
D>fVW;n0!fn?cKFi
zq1y3RybFHDj2mZOKFPSVYT@0rHAdB)4Yl>gMKwl!ZA1OS+E9kFzkk5zGV+&P
{udHV
ze%}NJs5N}*qMGsSi^#~lV0i9@V~a2O_{6DKUOmToFOc^VdC#a{x^PlusAj>E
P{S3*
zoeS?=Vl*tgr*_Hmh5@vf3&Lk4YpAbU9J-
S_U48A<HyigYsjs1SR~QpkT(sisr1veX
zX;>h2U%aHj2rXZ_bV+?fZOz%KE(#gdRf{D_eQouUdx0EksA@Pn)$+vy07w^F
x@2*v
z)@ZnYX|3<<l-
2jtxB%zZQme%aLkr$rs#{ShYkBBB(O<r}Zt;@)78|wo^&c|?>Zjf#
znT_o7kV^oYR5kTg3l~=kJ=NLg@1A|m?$D+CxA<>gVYb$0+_omPX8k{IU-
iF!wXO8V
z2T#5FFHh*kzo#7N`QqFca<2J@OXp-
<zw)YS2M_$|n<xL+ef_32|5Vaj^4*s*0yj*&
z!nhh<TV7vlEL?0XmEfMLyK0TQmsHgl3#t~^+`Vw|UB)FBErcTmlf#+~OPn-
L@`cil
z?@H!Eg+o37Y_5&PMexe3^75O@uP_Wl-
E?!swKHb%s6Jg*e$%x#U2}z@uD$8%o8_aS
zZktsexOpz0RmMH{R4uKns;Q~0uf1#GlEszP3u>$DE*YN?fKLedmxu&`{Y@}Q?
cycN
z?^<BoQ+v;n`un90WQQXp>lGQsZDm)$iFdCsj5*GeJcbsotd;1MJXbX|)XOu>I;
ZTW
zYiAH)%$b3#PgtS&|NP&13Y@3Fc?z7Tz<COsr@-
G%fq98>u?vAc4ECR<=O>K#Pq?25
z+0~%WQ~7p`6aNc0LsF{0<uT=N$&{4G%`bSnBcr6xHr_+*h`$rU3E=Ff?@uo0u
YJyn
zIO9eajvMB`;=~UOnBH*S-
GNodt7pESU9K}KR4lc0@DrM_&Qxi#Vd{(v9~yNod>Csl
zde3L`vvc9YRcs*P;KD2?KEj4HbqxnpjTlS(hE5|Z(re`KJchW(M%x!fFo^3k<-3<n
zz&~Hw#b$(~RV)ZrMx-+m7~O5y3-38dhYd$QHWu-Fb`x+-
J6>l&DTfSL)9v^w@USQd
zd?oz`U(iYa8RGYvs(T;#WW!eS<q>zvVTOEn%K`oyzHe(bJQgOuXF0MEm|fwy!
TSbj
zz+o-
#NrTG20}TZCjleOWRTX9b(=gT2N%^wq^bi|`2M!2l@u@7Z)zpr9*<{Xv?R7ym
z4)qMxCdzXWi){H;F3%C3d(xbE7DQLj4jUO!=Eh1TPSrKB*w$WTo!D3`3s+6bH&
moI
z$OcT=kV09Yv7=WuP{jlu<;e3P+OKDA)lPV!S=ux9aO>@gjoPx9xCi)ldJY9(SbvK
w
zr2k{Ovw7Za`(N-bn-
_v?%=<advN?vbvt`k^#^y0OJkxG>rE_4CW^d{^%BG$|XhZw&
z(t4+N`_zJ+TJMG3hW_C;oaIB`<PB%+#L7+Hz?Q{#cLUoRXfJjD4fLua>`H{J?ETA
|
z&faJ9*n4g6dA|)o|J56&{??66vT=#SH1j0<1)+~n7J|E*ijp^A$%c7&=*$gRSzNr
~
zZoqmYYj9)H0iKgK7O^2aS2kcJZvy(DO+(gy(q<{4(^h!@FKuiRdT?lgO_zfSx(JWE
zba6LZ@$KC-
Svqo%CUbapH>FMBIf*9sC1}!%T*zTZqB|xLR<U74o=bQ>?a7X2!n2Zw
zj?j*0^RpeFO1zeJRkx1~Oj<&piw-
c5E!B7bMg!TB%YNKVlgEH@0eO4rCt|=o&a;FC
zQU}65fiHR0%AIcBAhM~kNz1rnPM48sJ}K~vz)dzfiH<Ohwe|rKXT)uA;>N4#-
7`qH
zC|x}#8>i%bZQ`A-
I(HVonf#t&gVQfPD(jacxtzo^Bzg(@F_3ayvo>!3W?#CwkwX}c
z9!7U%r~<n_8gMvJcw>OW-N#Ls(e+?f$L(J<o-WApJza3EHpGAN-
51Oq;oDze*IO$*
zc-;^cZd4gZ7O=^QjrTS^gf3E-
pKyT5rCOT*dNzK(sz%gpL#K|{vW^4@MHdcyf8gEU
zWs~H<_m%JdE*oBCL+s1YRUtQDe@&kthd8?%VxQvqm;BIC_J-
I$LyMOmGUL!?*K5S-
z=2hLr{0@C(M4NZSRoyA&S9QOXmqmY4C>I}uxfr19<z_ay)A#J9KRrcR*Ko<w-
ZItQ
z(|k*tW{&MH;&(V_PMe4R+gm=iyZ<2-
k5KO+mzZrs%=~UYzu{(C+i*6%&0&+=h;f0o
zTX-G<oiaW)qb;LsO!v_8{O-
(>nQfVT|2V&4SI%l1#s<6LkLP!1&Ahs80_npC$aBdx
zZPy+c-Mxt41=D7?UC=<<puoSjZTKzu-
4pnY7<XOU<&w4|zkBF}>)S4!F{b+leiux;
zq3r^~#r%ewH?|F*Fs6ILoH2GAaSA|K>U6Z3OHkHwDA7-DY0IWQS=8-
vet!`9tzzT9
zTx_*PHhi}pY@O<C_A7j7n7ujB6k8;ASz>eG*u>_*v5C!rW0N)qUiAT+109=5_~
!H~
z6}Q_Je%5H08<8Pt2hkbwZ7gxWZ@j(h#kJ~a1m1n|VRbY}$U)p~hlXoyFXicNm
kVET
z$P(Xo2@K!r+v%oC4`R&bO8(Djv!}=bXrc?``{YC!KcI|QnhBgT-~`(2x|2@&*BS6r
zMEch^=wJJmZS<+n@6_IK`dIn?DZUT(zZC=h?^ba5TQ*|r=myW})=p1sZ*M?(
GA=rZ
zy#>DGp4YQlRf@gguxZ_lJ}y7WDCO|qD&)$Fspo`-
@{`T#mx22+4y7~?jO~_9>Q^7Q
zs=I?to77{sd}mYKrjAUl@3bc)DtZ1QuJ5yn+ubxej01n%XLo~XE^+P#(~tA);)apl
z62MLkV8<kHq@O_>5uYm?SgCNXyHQ&4t}<m)w!SQg9#gqiK_Lg|?xW8!cTDd
t<8m6Y
zzs((vZkBS+-
ux<?^n0i?wvxR`Uv#T%=nh!c<}zqwKpTyVh<urPv$mkB&tPMq9LRHQ
z?%uXH$=AtGHve%z4LEDh#t7L=D2E9?*HdjgyF<Ru-M8I6@JaISy~@-
5BjS_ue1mtD
zCF6w$cDmyQH;>4g)OkN?_6a<2mT)yc*?4=Jjc3qjmkDlCM}__>WRq<NbTD${
d0}rA
z&#_G$Zo)VtnV(-
NoYD5$M`yPE@v>QMuTQ<Y?N6oGw7qf7?6%&UuWdX2>Fe6ws=U6f
z@2(r#-
d=KJ+sQ^VKBg?c`{aE$wMjY2^7Trg2RL5fqyQ%sIBCF12hI@SWB_L<a58~&
zLEFjuhP7pvP3!J$RPpiPSE?=S^&ziA9{Xf>2Dn#hX0Hjpf7rx#ZPm^p;OzDxmgk
MB
z==x1Bqn9}dDg5*Gj!w=(cVEsgoBRiUG@`B3Qt@ka^T}3Cg|iywbq!x#*_Bl=Jb
Dwl
z>6hA+@UIpwo%Sm=ZR$|A&i`@Y=($U-
UDOxTN)L7jzhe7CyEvBx<Vjsc<|Qs!*TE;{
zdufwOe%i^(^|Z%ieYLiJE1}S)@MP<H3IDqtWN_BTzi19^<z3y_<%3>2zp6#!R%
nDA
z{^Ad?>9Klc^@{2%%epw!q0VQlEvQ6(edsM8--
@PjiG!i}=aWbBBA0arn{a0VuVzv0
ziaYg`=CxO<?63EyO|4n2&FxQ{QD?wMGYqd^;QbUHlJ<E@nfFT>t;AWtmU5+
CTx_w
zY*bI)jCeNwhtc7Z23hqtuJo-
CS!@O7nR${gxKhyy*@znWxP8IhrCe%tEAP7xT^bH?
zU=E$mZg~5E`u422$pI)|!v5rj!%ab*L$1N82b`-o97PT|(}&^<U_2fgX4)5$73N}3
zgTIW~<(s6FjhFUD>7)amqz*pu55&@w4*=Z}`do&60O&iJVvE`bfbQ@uNDrUj
9XC`9
zD`#6Wc((B~zz?0GRO!KMiKjnJ9NN2oJFppR?`>-
mpMq@*;a9M(f371X(upr%!>h#I
ziJbkI@FME^1mQUFSw~n*SWSowzk$vQZ-
PFe=a8@R?=g;K%)6|NJbXJ~m>&-ZVwW<e
z<xnZ~TqzgVsVwJ^HIwvTwa5HFY-0>QaOmzQ8JBi&xF$N;FYzz&E{CY1-
<Mqg?;L)d
zve(My>m2+0qkP9Em>h$C)N!{P&w*AgT*%0Q7LiVY^E;`(eQ>gKC?JPPjcC<#>
V$`6
zv+)4maNv^dyBWg){*3ka(Vhl%R%3>Q{~6j21I}%<H*p7YgK~gFuAdFpb|0cSm
k>p%
zKkefjlqm-i&rZ-
=4j`)~t<WoSR+&=Y(d6TBz;F%l!M|h@<%R+y!zF|*^GAjobq+d0
zKB~T8GW-
zVMd?8~^dR|N(y#&AJ|NOP4B3WLlz;;~*<ft<jq`$iqT>eYZg2M0{J)h=
z5c5KP$ujaD>7qU_2Y7H`BpZ|I3)wuK@U0*}wlBv%aLw63EQj{Wp*-
25`;*hcn}cbg
zz0l#`Ny8!A%gXTeXqFi-
QY$w4G;@mDPG6qd)VVeP8@)>1wNY#Xl{Kb27hZyPxzcWh
znJaolNBGpeq>)4Otj#{}yq(&JG2OAoFW{RS(;b9%s%K31{MZ=!YitlTrdw>22%+
vH
zj($vCd3{%z6|wCPgFN&36&)JWeH^}%w*97DR7fb7v?7cCe*k9*9Uj}iedxRDrT
gXJ
zx^>VtciyBvH=RRQ=Q7nTz!2MAY#FhSUHid3tjReTOhqR{OF2|R;IZL7Tf5roybV
2<
zL*E&TG;M@;zJ$&y3F#bimTk7195xc-@H#71p0lQe^yNE4Z?E2Hr%7G9(-
2?f$I|DD
z>_*^s@ngyJ0-hZ>ckYw}9omqoCg1@-
TAVert4ueh8kvEvLJt1h%0X~C2NMQfU(r>g
zuh?0M>?lL*x2?UBKBTYPtoW`@u9oz+T!r+Soj7uH4Y@!8UxOU3upC+T0aFeW
)Zq1y
zzIf+T)Ww#;XNHD<0KGqsoGh1(dV=@KyMfo(YvY}0e-
pez`e%1GQQt=N#z@uFIkEtr
zNo(qi<VSjak1e1-yKCcQHBt^yj!w?{>SjZ5`*LtV=KmKyRA_K{5Lh{x^Pddq)jPYR
z9Gb|1D8P;H+o<9~3pr4|YYhju{Uh)5Rk)*5##EyQ4u_LNa`&Efh#~kL$a#KN9Jx
Nw
z66KI&`jljT2m-(9LmXs_o;lzHP8Ipl2lnBY=-4BIvyX#a#20B0FQLmrHs73i$ghpd
z6kr_$mo8wrx-
0qeM!{)c0w;@hk;CE8MSqt=e)0JZ9A+$jGnWsAP8#*2o^k#8l(^Kz
zm5KK|%-BaBW4kt8<VvM?+-`@N9luGIvmAIx4v#dbhl$K+5i1*A@+GD2-
D&&o(GPAp
z&~>BuNsE9h{hjDau_bB+7xel29A?R7pqGVNUt;S9S1(>-
Uqax>dN1GJ8;2F|ivxY=
zbe#jK0|p0Pq;sG{ra8UL)S^a^1NIVi{m)7x<>-{>3vvl{mN~u1;-L3jaEX9RKDdkl
zmkw}=fy)5B&%C74J=jnViIu}~E}}2RH{+N7UhJ7aAlK5@2LmenZ?-
;F{@ep4&Bf6A
zK0OzIR}SMe4g=)<vx&ShIV>D`dx-SGMJ0V=cde7WsUnA-
!9!@0E}^8%=t~^>@-jB8
z*g?v4E-
U!H@ZMu;*${LYha~xfh6?W{jze09GFHI`@zxc~fjbja_&dZup;Cv+1&|y_
zR#y!#1@W=T!I2z3<PTaZEMr1!rlEVu7yIbop}{sE!&8EXlrMbrMbd8lU2FMP?fd
ok
z3hR0}5HmPOh3U&T2`(ZNUzE6@3d>=mg)`N%bl&@!+juIKu^|V5ErovI85KO1l
Sc4(
z(KL?C24_PKzM-B=h~G<|{f4=6z2Hn8IgG@Ple)Y%wYA_yzQ-
PFE$BBXLsN1Id&L5=
zv6!=9aFrX}pu(Re594H1nD^2E{jKDQY%o`1Z`<^_mG1&i=upn{i_jplVdl!i*jv!#
z(rttiCom;mO&Fw);^0G(IfGE_n`GUEeIN(G`lZd}pjPoEaWEi#a!wROvqdF%={B
A@
z7_#mj>d5?<{oMyI;fpP=(zWIyLeaVIMFEU8a*=iWU`992(HVnd11{g>kVWV6P
0Hl5
zc+Gz!<yagv!$FmlF)~`jJN4$mZ?)?(aI=_OvY_$Dcn<PR8BVzz)--T{I^{a`gcoUZ
z;Roh!Y&%f{FKPQB)I<7NB_VAuJ`GF!BNLizpR&cp45y)$B2Esg65e_l{F3=Qj*TE~
z65&v~FVF__rTyWRW5kP2vkqL;>@(GKL8Y2Y&5MsHqjhtV9%Pu)pZ6MY1tu2
@*!r)>
zlSaMM<)Eoe5&Di-
sS5{BQEuV_c<TNizz_EK?|PMSo6Lg=eQdlaTk85VzKb5<F#YIH
zcutmsDsZ%*2?uG~{X!eOXa!YRE&>!fT+4Ui6Y=|(6>(AD=_l$%e##`@1{Hpibm
;k#
z*nNc)8-
=gIFUVzA1NbF)tz)1K5(myF?AC7TWy?;v3hx9K_4gMd7k?1iZB$_{k=vwk
z_>ePii4No4L{<uCaZnDpYR0zms!{GmP|iX1g0HkukWl(&p~tJ(as&Ekf<u=_fF*j
z
zvQ+qCo;%PbJ<9v+%Un+S4dx&BDeYTpC_`{6Ma~!U9HbuE(4t>??L#1|$Ww}b
nt_bg
zs+8*)%MG=ldn52f4_rb$dQ@uj8kOE0Q24((ikr8H97+2o+Ry~1wEdZK=<!#>N
A^6r
zeV9A`0N#HAy`(K8&>*CbyxuC}P)EuNEgmx${vSG;XNya@tcfc8Ii4kMl*DoQ&V
as7
z8VegT_EOkY^yk9=&rnCTdR12${jtv&A2t>^V;JzY`CsCTh!=h~GdUcSUm3q@#-
C~&
z7iuwAB^MdW*g;^Deuwevlz6gzzy;PEJnQIOxBMn)%X!XW*D26f?9=(s$UW@
(Oxmb3
z4pcn=JUO&fa4d!9&p`9P_CVE=p?}{4Rlf~RqQino2dV~%d%pu!p~D9C=m`5j)!
#CQ
zeFJ0E77m1R4^*{%pNT`!-
OC8xO6LGT>RkE%$RU65MAYR64IUU6H``;e4|f3XaAeCl
zfY-
5&KHzY6o9{iOcMoTG4|I3!DCYbATOSa;3|*6aK(zQ)f<@;4GY3T5GWUAc83#n4
zOjEhO4|zZ|`o=zRRrpptW^VM|v2>$)A-
K`UZy$ZNc4hipJ$Gz2hu!<ju%p|!1k25n
z%-iCV5nqD`|9mwU8*If_A_wXl*p-dwLBSKdXM=iuSUB)JzbtFBjr+-
A;RDRE%4PA6
zUyd{fhKHXe?n=h*>-
zdPNxs03hK0p0uw^Tv*}C4vV=x@N%t3UDiSCsHL#sI;vlX3c
z(Wj$l>g1rhGWt4KpWApW$g=H>|4F&Qq<+nX{Xv($_`uH>V_i<tr7t=@MUye
94ck;<
zLffvBGM#b<$2~HhnM9c)v-i?BF`*Eab!RgExsUe~^pE)LY+tu+j}9E-
0HPV<nT`M
zRYq0@_r$VQGvloLJBF#|Q5=+DuRpSVBThRTw6{CfbnqCoWg3wUX-
DyCbYP<&dJF#v
zc2pCz{5kC)zN_C!9EW|%x+Hg8vW<MqiTPD*wC#_2sn78#;HN?VeQ)59(1cxX
UzjH2
zyKH=+Vgnq)CblnVIIO}4@P%9OSr5-*uYU^NHfV$Y)IJzg>hK;mzs-
L_L;O)YBKOXU
zGxlVBmy13wJvf?v$d2Pei7I^FZalY|bV~Z&+x+2{@=47t`p9P1?@*uIs6`$Lzd%S
^
z?ocac$sFn~jZ4J@2E5TJuuEwF7JR4pM>ZTJY}H2{k+Gi0K<I(hT|SX3<O#gXw=Q
!0
zdamE(XI!Axl;o?GH8HLZcl>wGrHOLb|5w3Pcw!{@1;8f|@rQSp8_m*YyLFwh
@5ty}
z8)pvwq@ASQr2RgdXuHLUwzJYyiP%Ym6=&27e^4@QJ`KLo=0Wo1<%{i=<NvI
{Nbtlp
z3ApnTa0^wQJvSri<|gHtla%KQ^4MiI&_38(Zaat!Snz_Qt8@H|;a#cEN1Zl!&oR1
`
zGacAI@YE9cO-
?GSkg|kN8{n7!AZ#I&Lp)Ed8oby`Xy^8o9L{SW$a@0b>|d+yuZI@}
zFC~|i@hudX(<O5`GL{tj?Ze(PXmj;KX1J9Ly0Y-w&O2e-
tA6y}<biq$U0IV8^OQ{w
zFyCxiYP#@^$#Wsk(BQ24ITwE&Lk_r@hr?y%@-
xP#92g9*+3N%kdGe4ME<Pa61D?oh
ziQp>rEE%Y$Bik+>&LPA2V#WyFb8NY|6&lHy#g*R*_{v&2D{e40m9-
QxTUK(SjFnoN
zh?jIe;$8eFQU8!LZ(z$nnY0BL0m~f2<IqQBSNLA$8HU5_$@377jWc+NFo&KZ!(
38p
zUvA;?+n2|35wu)Z@-
}omv{noEQNHvO{ne^{0yy;$Cw%a2>Y(;b>o(J5en&0}%JF{{
zT21jXuH$_&c<u&I_BL*~y?A8!0`i^!)?U59K4@OrA_u%BwB=^03V($%ZQ8kVk
1gfM
zN1orVzvu+v<AgqNd08&)_^Hjed0Zl6&$Zd<<Pc;{XbL`(-
^HEF5?a2>MR~UZ@4Jjc
zZ9Qc$4xtU)v|E#OL>Fy58CY`IYcDu98lLV$j|-2;yhFafzfQG_pR9*Cp+haS>8W;}
z-z46KFFZh;;2~-D2`v-pxAQ#E&m<0JKDEj@lsS0}Bm9P;y6Mp4DqLn-
<vlah{c>n>
z|D~!OUr7tN`+N8{i}GDM2Dx;lXRYY=T)+6}bErp*cgE~3m+*6W72l<O0jW(VU`Y
Bk
z;1xm^2igcdbg{G%ZRY9#Ig~v4`?YQxN;^SQ_;{C;CvZjoY<;JHK#z+qFt~&TKSkbS
z<P*9G9b6yGsuQ9+5|^na=2nDPMIQ*Sa&b<%TwH!T?Rfj)$zeI{`Uc>f<h#^s6
#Cj~
zT-
~*bK7Ca&<5gWX$2llDC!Kj=&&ayGG&N#9e#OExxxAE%U9p`^F5E5U60~i|l1&
m
zE!>o9PS+M(IW737)m>$LxBCL(gLT0@;@1e6MswMO*3CNO4~;$`l#@f>knf+*
T*vnr
zlUdhIn<jo`jSCb6roQ4vF4V}gab&J5T&hOaeGxpG@Z}3FHFT7O%3=-}ct1tQj-
p;_
z_3AFE!+h!!FjyNyJ)}=m*jvnJ)U5&kv-
#+q&@AZb96rtkm+gI&yAOJo;=kHT9ZNlW
z9q=mFQb!MUY`xAm&4*9ux1{k=-
r7aMX=SW`E}o#K`zY^a;>)OmZ}p8_2C}1E)(@DJ
zYpFM;1oFOIen^khW4mVPtPhd(09)yoy{x^|R~ODTwZ18yOGal`E3f}By4Ey0xc
ppO
z6w7IK<^*U@+h2x06<-
YeGF`^>G4Rvyv73CCu{!0WHl4W@Bauha?gOTqjx?z5Gt+pe
z5A@%l;ENjSunro^WfTD}_wWcEsb4j;EX8J}jct3?Tv5D7=x*VElkc)NAlVKVnUu
q$
zo%Z6Ob)}|%OZr6efWrnKW%<Y(q&!7=#o)x+Pv*dK>(Ch$jkLpT39l=j=J3Abj|z
}q
zS2}!UPOst{c#Q~<PwY#ngYb|IAO4}9oil)232g*chlhjw7x<<r>T<T-2H`fe9GYzV
zX`8@PWJz>_C2J*APTe!)7n<69l;rbi)JN7;@lEXBH^D(<b;@z-iES#rP!s!J=q>o|
zV;p13dLQtR(Dhl-
uRaToM~X@7+Op7jLjYY7m}$mMbcA)fe=2Y~x!4an5BhmUR|xKw
z*qO7@RZluPC8GMKkbYyb-
muf$AbMZcBa|Lg{ryv8Ts&3Cykm?D<plo$*a@Fv44t<P
zeHVjo?E1iiTvnGjRNGmfAoI~Zd8VwHI8p^)13&sH=3h<hDEVf$2Ypu&cCgH+O
MRrz
z=m3@+>TVFqWr8mM#HzVKg)-
eW0m<==#P<wm+zf5yJ9#%68=TAR+;pzJD*gCq@UXx`
z=ICdGoA8MAmC{G)rqCicDm0P{F$JE|3l9oD$vh|RW!Hgxz7n}Slev7-
4bUpF7C^?G
zqKB8m)68{;?<HhWb@)l-
&*qyXKRWz!i*<X53n86xQiO5RN#VOBI>=?Z(!RfYleKqe
z$c^4y4eV;<M)>4vcz!0~I(S}mk<7u!oIxdgyHM(k&Md?(wZnuCm9du!;=85JP1y
7I
zzS*BAK6ue>Rp_-!=v#_zYl626RjMubtqVRnttu;}Ie^SbIdb@X^0*3_x9fi^xa`(b
z!_pT`1rO<qqz`(8ar8ufT&}p`vB&*ke6P%H<@slkW;8$gi1IiG_sb#ht2}u_^9Wf#
zpSyDQ{nOr}-
?*4d4$3_Fm&Rn?N7w4AxlBxW_k><Bw9M05Fr9wOr}BsPQIAs3=(;k-
zj(e#G7ipANjgZT_)CRXrZjDV2m#w&<UCIzSk09rb^cB@vs^Up_)`I4ut86($S5<
w@
z+&Gu~%eP$`mN8V>0;BIG><M_KyoGU)#hkP3Z5l`YWW1n3Qy(y@kjvsVR=M
yU`b{o?
zJGzbcK-
Ss<ef0(H#q|A;W7`%Z8?@=JfcnTpi7&!FW6on&5%y6L;W+qimRet~)4#L=
zV}>f67*HvG7f#VQE+{6yd=IF62gW7Iad}Q0JU^H&$B9F4>?dy#x?%9!1<p70&t
P1p
z9p{_FoImL`%JQjU6E*Nv(81+#x#%)JaLJrAR_?k=WpmkKNfmtSgKsAtnA9w^3
r<nf
zJFZ&Y#d_9ellLiO)ctp6sP^DQHJt<hM=(E{*VHwsIrzZphhJI31<apR@r$`&2wvIP
zRA=;wE_*3&`1pVCwdaMR!qdY0MeutWp~eL}ngJiv9zR4cv;M>$OG=um+qP~
AU_ZRF
z#B6^l@8<D`KWWAfQ{F{<`y8Rb_VIkESPxI7tz*riEA#5a-yTFRie6vc)wQT-
&%SJ}
zS@gfy@kOk65&0;h+&W;qIz&xj&IBG;8=in(vR|wRU2}-
JIqCDNjUN?o+03E{m&v)h
z-
<$TvRFCzY@^#8Hv~>>intb!H#;v*|HC#QrW*U8T*4p*O%|X`SVna@J`;n(*Efj
Mt
zVj~=4zL;^O|1S7Z`a1Vr#!WvYovb61=Pf)-
pCZpq)KT>E*9b)~3*4=&OO<bJ#K~nV
z0#n}Wu#v^)8Ao_IzkS$qJ&8Q?$m6CH7=gsQJeMHP9&1mwUAG(5vP;lUcHN
A$chwD^
zvinL2e*$b<2h)#ih4*|3|B0)MNn`sDT^h<9l*pX;N-Waji=rPDUrFh~*|fR+4SlYV
z8;NuCJ$QCLY;`x^70LOKEhpcZeX-
pKFvqm~fx@}<z?!7@O|i=Y55+|#<C9>xzD5u7
zgwBAc=#yzbTaJ=!41{B{i?4=^vJQ}XSmg%kjZ^(ogg(-
S3S5=_t@Pk4yc@*JINZH_
z(;0U=my$|*b<i)(g>J&<PJj1|?bnh%T5yxTU-
mCa9~6@dEZ3^=Rn$qsMdUXa>kAJb
z;=PCU3zGg5@SD?@|I2{CP5K2Ff3XRrkJKiZap@oWkcD`$62HXmJl40!g|%^g#
m1>#
zbE>B9>K$2g;oN(%dwd46Jd_J^M{xnFuEtyQnP*JpQZUvu?MJR39j4;{rq7x3u%
@Om
zPC4pZft<@eM`Y1R$EU;P?a--
Q=EKB35!zWNSrfp#<{5g6%iB+_dfKLg%DS@qMd)X8
z`G~+gsLLhbqvxtCtn!dP%CE+a^s`>f|1hvcHe4RM8K05#OTzE8LAKh_TF~LCJh;
Dg
zuZ#;8?L&72;7!}U``F-
R+>%z(CEFFhKi0pgpYg1WWn~>CeBWM5pC&LAIzd%rhKsOq
z9>#X~Ejkcd`z76^F<kIPdo*%!YiLw!f!I5#BBR7fd#?dUXZ)MvXTsDTyNb;!apF^
w
zaV}%jil5s4uN?nxlk)E8+2I$*{#%a@aeOF)K3w4$@o)bFcnK}ezKCVOR>Q_Ag~
vLe
zvGlK@qRY_VvPbHJFNOZ)QG2d@@~y!CXX<_SrO=tg$(TgiT6DPUYyRiAxCk?`$
HAes
zv!(^UkTrB-
2M^4*&j2U8onqo!`QVGUHTUvzJMD+Ryj<kMzBD_Qf<B==El>Ch_^r`#
z_GRUSjPa~;KYT0oka3{PBl?HEtQ?#^%w^?2#0Lito^e_E9^(F*%gW`Vo--
~Pr|iGx
zl5y51y#HnH!1}P4xhJ=69X>Fz$24!GmwvyqXr9q0JRti#TJc$lUJzN8Jjwa`;h`8h
z5*>jrA<|n$UXA$^H*b)4vxEKfw9T2m@(+K}cpLOR`=ar$6L;vWi^f}tJNu&X&B
Rgm
z0cCo_GC!59$7CM%gzYEV+XioTYKOkrE9+MbF7n$JWq*YEt$GfJU>vC0bK!kgc
a0F)
z6F<t*wD1hlVv|mG^%DMoaHIGcWK7Fm2ru>4Sr4mLd*>E$;ar6MD9-
wHN2V5I|GKoY
zWc?2~l))bwWkbjICe{H7UOKWP_y}&Qp@8wFgI6PM!&wOE)xo|b2i!t|T;>_|
woyDE
z4CL734D|7{jSr}!(wDTMxAOUxf9cS0==7{E@pm$Ke&d8b1>MJ*yew%)EBiud)
~HWD
z@)|OhOuKkeAJ9H_RoC<Sh0XgG-9OF37lf{=lW}C>NqfDSTrN9Z^u~5z@GSo7-
4=T&
zV)pv}T-I*TKI=2WbUrP9=uwZ}QuIAB<hzM61OBk+PQJ;7R=dZl>=&r-8en!%-
V9YR
zcMWAKxinIF`~gDjM?d@V{5`A-6CcxT#yE;TZZh;2eJi%!I{X{bo`20n?hk-
NvGw=3
z$lYoC(ZCbmUI%n3Eke%Nx2cd9SI&6eDC>0a(Pz87C$@&<F`@51=wpnyvKxD7
qhi0K
z@;2<0we7OU%zn-
pJFw<lrN~<PV6W(ISANyWR(s9YXzZ;|W0Oc9l&ssO|0%p=biK%g
zGtN$p_JC_HeOpjhw9DWg0f8y&mW)_yxw3ZD7iy|ba8&7PggleJLM4CG;dRy
e8?m7~
z{OdbAKKFy(4)%(7?0&FQt=QY!k<Mk%nXR4b)b`#EFV90ac1A{Q>petz0~)=kR9
lQ^
zJ&86VmqMEe<;pr>rJS|5qQiPbw`Gs*-Ve>p0h-
;nQT7jL*<%LjBx}$U>&9bw4y_6^
zE09U}*?U_eoacm@cO*iauJ*dU2)IfAV-
ebG!U$zem`UjP{|4u?#OCX1PDK<s)1!t<
z#2-#;dwENG+p9M#`Z-6As-fErqPIvJ)bV4=ddRgpGU{!Mt!19zQraOE`}8xay}y!q
zzqFZL=C1Rb#n00wwu;52aJNDm#~yL!s~C%ge@8nyb8KhY=Oy4{{hoeAnQ>W
@DY7WO
zzBR;^rI(F2xEwU3Z`%^e*tc2WxM?NbR$X0R%0=<j=s#OuB-
!ZyH(aXuC^UKTFI=km
z71B7i?BIOZ2VScAWZM6+mulWYUF6b0@!5;b{9!NEyor4O9WK=rUH4ygsb(A<
{PKsn
zRC83$`Aaq7*ER2P@u&D^WNhwUih4$xztg3fU!k3bi%t*FSFnCc`aZF5w9FXuK
(S7P
zJ!%p+Fn)7<-%;^<M6qwAkCHw=G52lz*2Tws;h&tnqw?(J|6!Y~%d-
1lXAYA&YA!rZ
zZQb0ef4=uv9^?E68oSgy*|)c9qv&ep&!V9*IZ?qUq-
)Ww^jq`UE7q#7?A6vYzerpt
zd(GyrW~h1}-
#YQjGCq%5rhHRT49i^IPRE`O>ZoynZmX^>3W6{GB|Gh2#>)b?CH2DW
zRy}oDgl|FpKFaVe3#G2u8OpXc+qOZ{dVHymDziFY1*TKCJ+|*dY}AqX7vA!u_{
9e<
z>j!qP9ywZk;qO4N-Cx5uvCeEu%-
MG47k6)Vd^Gvb;+NjY**YV@`%Bn)M?!1Zmx_<H
zLD!%4(MO#q>IRRg(Uyz5Hy_U#HooD8lI9*yD*fV3<7Mu3KJ%tE51DN%_59|
wx*7j;
zntCqiRoP9zXr&Jm7~5HQQ>yZgR1?nknDG~fsbvAyYzI_Mv(TWB_Nn4qEM&H
~FpqJ}
zQ^4LxH6j+GFP_94j4C*?{$#(*eLYtMZ6$q#eUO&;ijeh6rT(}T`aObO5~QzG<G`
7D
zcY`^nV%{}i`7XmRv%2A7#u?u-um^%(bEk#<bqGFxnM;CuJfovtQ+&1;Mh}-
_+tW^B
zFB~o<zgp8Ndr3Y^T%(?Mq~q<xxmnUSvNr7uKeXf9YNfsl!KqQ#j?9ktS45a+ul{
nw
zMwx4`8jYP|?~S-
HIuDqFhs+7v?W@lJou|OLp}^Qb%UaiS_jelIeeOzE>i6fk{MCQ5
z{VeB<1YbMH^?%?Tm;bqQT)v$9bb5;!{~YT#?*9)irvH!sT7D28TK`PPUn#g;g`ISI
zi;C|he&9T+o7GY4XQwJ&tmHf@LODmK0$l$dO#4CQ7l>@I*51c2_Rxs7L!4X2*
xx=A
zfc`&x9dk3-1xLkS@-O&P6?55)x1+H}bEl3Uql~l8WUlEjXY53D&WL#Z-
8g?x`EN^G
zd_ejBr1H0Xi1L5?SC;?gd!+w+&^#H&2i5<K_WypO{RyT0pZ`1I_Ce)u{tNW~8S_
_e
z`+xF7(0|o?;QT@5ulx(;N0Z7Q{UOT#%wJjl^7lxe+;-=m&r{$$1<q68JO$2E;5-G+
zQ{Zo*K&qByXUo+%Igh_NpK`)!rA}Cq2<?wa|J?mP@k<l&SDH@#nnbuX5hj8
7|Ml2d
z?ZE$HB78Uz{&OPyW+J>JQJ>?9@au{2^{brxxruNP86)wS2p#e;9Xs%6CZ0;q3Y
m^f
zy3vkFK<B$1&EuJ2f%8%RH3uI*#8av#V|ez+Ji}KsefouCrca;lA9pd?p3@Kh`wM
zZ
zm%qcW^3QSosFcXLovKJ_cHw{BrF~~!rZ;io2VSO^G3$oQ-
K*k4Mp;>X^@1rSA78Tg
z?)yJs%&~9WGeWfu#(Xa5t1<4pyXr1uM#a3!Yj2uy!>u!CRhE^N&zL=FVrBWPY
v#&r
zZ5f=Cd&8v5uQ23lvW#mN-
&=Jz*PPWaUo5x30jU1oh1Io2O>L;Ue&Nyvxn*oA>1Np%
zj&W~X!$Q)pl-twJ&SJxx`|(*fOq8qU?ECHJ*BZ-
1+^WVMY&P1HCVoO?+`71S#nRep
zZoT71J-Ldm;eHZu&z@X6SNn-
1q#CN~@1kN$m)uudZ`@sbZ|&X2ogfri9$H$vxW-tr
zw6?ygfjiDJR8{>wl~vHCGIVdX3N_T&;a`96+N>KUDXGEbidqP!_Em8pI%@?t7
A~&3
z+bEmQeSLB%U+uzsiC?l<uD|0xwL9yV+~ZKRc13mVQo)K;RiPz|KXuV^BXs}b8
WPlg
zN)q4g-U)bxaqVKj)-PWQL@pQv9#^-4gV5mr%p2ewIa`#Fe^;Vf68g>Sb-
v%1_&#BV
zqX#My;e-
Rj%OsDH>cqSG&kkQmalY?Kgx?N0?<?}1@Oa(_=RX_X`S<e_I8TA|6gW?T
z^AtEwf%6nNPl59k_^+S<YvB8(95>ARfn&E0jCVVnch=+Ef9AiQ`JRX#2psEr5T3l
}
J^3%N9{|0RSA|U_(

literal 53972
zcmeI53w%}8mGJjD_vS$e5RyP*NV(?*tPrh53@_`LlS>e-
FHBN(tkc|(pg@#I0u}|$
z3E*Rzc7_|%;-J&qfL4-rzF`nLWcnbWww=-
GVAAk8eonoBuS#bI;)7fT^8MF&Bp1}a
zzINz0ll-{sbN1PL?X}lld#$zCerc+vW6e!PnacgEjQ?`vbp=;k_hjiaf8F@w;<Sg|
z_(N4*3MZWZv(&q;J^kpFk9~dWg6Ds5t6H+qiLYI8X1cTAe%5_<jPw4kPj$TK(>
mVw
z=^ZD0z7A_Z%TQgpy{{JgdIw5<y(QZEZj~{+S1GMS^_MrR4CkA9TF(gHpOO(&>
iK6z
zsuokJ14^YvN(h5iAR_TE5Fb|R7$rrh#xdgT_#Y8}55Jf%yW@~=T*qPG_>LpKoD
M5R
zwQS_~A>U4|{bBnlpNhOQQpMi^H$BHH3$EMx*jMd*Ssm|;G~=h%?%%HIR`
)|ARklI7
z+Dj#!5~@9BJVY3ZW<>sDU?7Kb4@}~lgp>J}lw);k%Ia=VTJ2(`DwMJ^Q<Tas@
T<s`
z8A*@*$g0@$s#3M!ToLnWg<ZbNgNMN3U0|JByVu6+=)l0{nChP;FoVDp{FJ}
ou~TdJ
zZI|@G>^?<$!6%8bAMmLnc}^y+NvMT0BKwsddB#wY6!KDbywL<NJ=&+G>v
8ZatFbEg
z1pR7ksZyPL!F4Wa+QDgZ?o*F#ByVY|iXZm*JE~)PM7}qk9;i^j^~yi(mY+uXpHE
gr
zg1gk)PyL0qg3n0skvdjtgS0416Ixv4e~hvtb0?df)&5UqHiXs6eZVgvPbjQM3Uc-
M
ze4g7}oOR$H%GTo}z&l-
NvF<yMRcWee3TeYj!h4KIRi{B+Rg#Ju7U2jbZM5sEbl%sP
zodLhPq>H+J9lB0UQezMMQadWO5w-
hH4OGNv$3(hH{Vd9{>*+V+D#MIZmpC-H<IdzA
z)gkm&#@L9KZpLZTU0Sl$eLj5DknH5~cuC-
$TKm2BBlHKG_sX?)nB%~ESt?#mIF7Q`
z>tiEThchBEpRe$~WO!JqqD$eQm@ljFy(}~SPI*cDskP79JkVGWif?^JMZyz9@#
{6!
z(sg=ZMs$K1-*!YrbojQ-r$xR-
{5w8XXliOk+gua=waTn(ch?oef10K$qVvs8=u#BD
z!R(A?s(U2=L*#jlwv}>E+C2Gvr>}so^yhcLU+SzGA)D7!eklIl7xi}O<L}YOw^Dwg
z;Nw#>T9VCpP|6%Fbu&9@lcs3EjQ=U$4b7>Wyf5Wl>L~Sl?~5Vo_^e$=`F6;c)v
=9w
zN<Wr-c73R;1-v%!ZPSI$+DJ=Ro&WCQE#aHsIuAUf*8I*ebqs4(rnJFa;=-
k&cmegh
zlILe*V<Q2jj>mlK^9q#O5rU8QU#`a&8kv#x^a;|HZM9N56=mL0s>dh83)1hUEx
mS>
z_Ny-
#8xcC3sP?sosc%=3+TH(gw1Q4sX`4feI{Vd(=p_0#?Im=|5<2K=#?8Pxv2|kP
z?gAB&@7pG65j}}M01a|ULpv09(Wa8`kT16*M*M^DoWw(iA}2n_j<-
anof??YFj~cn
zsI$NuZPPn@klrV%=MM7KD(Doaev<YCVFPr18eZ<>S^B4fPmA;QxI7mdPFMg
vHD$&t
zm3FidzOrQjxCwn0rl}T5YtRnT&y-
)?Xb3&2ue1j|X}8PA_AA<E9dxpknh~UJ_(iH{
z@5DZ34#H78l%<Q@8SJZG8OXQ;8^W0p>(SCq1>Mdk&jXM8J16_i_L`Hby$U
%Y@=x#)
zJ`veg>{lz>M1E6W9a-
qX5`5*m#4GxIVtIDG{Z74+IZpqe+#ocN{GOaSwe|;tyz?&n
zkOeHK5BWN(*PHF*l-
{J2uW2G}_cQ9dI?XA6sDC_T_YZ;dT7o<|8&;JIOH*1?3|XG$
z!V_Es=11Wr>P6K--E5jpNNfXB`$!wmuMdP`nGuoyrE9ACk#U6q<v-
d5{Y1_eXQ<;P
z0|OO8JE5`74-
e1pth{AXzY>0U*x?7^JNw(l`JI7OwQ{>ne>K+FIK(er`}p8Dsk_um
z^k-NF4(h~(@@@UR%j8|^Ddh=o1`Shqc9)S5FS6hc@EAx}E2kt2-
+sUS4P=<aFQz_T
z|4yP_cHf?$;v?=^)c=|<sc?i}?Rt{B?WJy2)Xh&C_$srSd|x2{?uA*A&A(jN^Cmi
W
zm!8w~W9qnS&E)<E;6G$ohXN;&nTN4ce6&CEk2(||e4RcVCe71JXZ1_l$0+Lra
&D-t
z9N7p?Wv@dov2&v6wfA{m1n)|Esk6|hT7Ic!ocin%`k1;yf16Hx3&Fp%olPt6o1g
fN
z@<Z>@Z+2M;`Mf@A(~~s8T=24ODAf_vgtiX;QkS*hB>hzI5nD=d5}c)tjo9aUV?
M*i
zQ~KumaCXF})TZk2l*op!>T%PrO^rdDsmUtavx(kDA0C1>M}VQOdblj6Me9PE
RaQ+u
zt%6UaZ;9NWoVq{nfsOiv2L=XaD4q}b{DmUN66H1hq)^)P9oqVRU}B>dM$s{iK
C64?
z2-Wi4o0F%S;H4f#uF*E~ZP(|pF{mH9Vr5O5`2qT?Lik;DaESf|Ejt%34ekkM!0)ER
z??Y|o=<LLPFS@^_d1B-
d>eGlW+e%%wZBXcby)bxrM)}X6U)v<J6Fg?LX|rdwDRZVV
z?dl$Zd1|fG|Lc?0jo2BNXxL76Uwtbp(gwUwC5g<mGT*c7{lj)2cw$49fp3}3)3llN
zjqgbt3BOT>$@@Q%&(_1P{VQ!IZ63_eEjLV6C~&;|TYcEf0y7+~L%tMt@%)qvF
ABWp
zcorKrkgrz4pV+$S_XN07?uRyhdu&-K?Qs({dB?Sjy0+-xXvRgK_Cu3+t-
n1^JAGK6
z)Gjh&<2Us9q{l@r6d(MtTdp-
)&9J@^imPmFoiS?0J~zH=l$w!~v8n7tV0+!y)3Jxa
zb=x!OU|&w5(EA=Qe>(cOp1dRbXG$4HG^JDOd|2wqPiVBvO>2xCD$5!x^iv1
+@m<nO
zTWU|Fbna8pvM_PT2b<2;2sPtY(v>_lzjNCLEh2CY(n@>Z;-
(3wI(og0?;=N{(<eqA
zhbJYE2RlYS$#adHrz=^_SmNbRhUOV+Wg|5AXklinqOL8WcwnSjc^fbvo0}2I&
1uck
zHLKf)3^?SQfIPCmwfLZIUtyP=QC_lB-e=u1Ol-TqC%uP{&?Zcp3-
~VmLtw=6%zM#$
z6^D6l<GanDi^oOo_Nx{d1DMqNV)$)$GPu6u^6%p8NF(h-pUAwEbT-
epHlf%k@!Hb%
z59{Z_|39(iiO^7JT`~iiK$zm;C${j0k~x9x`bw>DphDU_5!V>Fo;>ZeN$e!HBs?Sh
zAbhcTYj#A-fCrL<zxC;TZo24)z!cul9Nq}1g?+*w!V`ydY=P|7JR@6mu7anfZYRKB
z>Q-{nt=nr(-
Tsm99^N+H$p5cy8CL&*%|~rNHt!MsSxwp#^zp8D2WIS}{iMAnA(y4S
zytazH5B^!DojGcJrll6l45X-
)CurLf_Xf&8t_^?amSwy*FvFvX^n)(&_<Q%8NqN2Q
zbL^b~yANCNlkgDsW}%KwiTTbeG+ln_>KmA`9vYU=@5F9`hbuJf&|-
AB2@gDt-uW7J
z5nfi8n{!n9#LR$6yEFb0c(L(T*&AMYCkKkwlU6fn*HqOh^}ZQ9q(77z(M{@a^J}
hM
z|1SEIR|lb`@W6w>>7ozW^pf;8y`1zW@vVGUsZJkhqfU+B9Rqejs@bW2#t%O
Lyc!pt
z*bTlKb=o@JoHI9fZci}DwnH}s7mSYt7gx^?rK-
%il&PhwPR4(o>*+W8;f?qb^a&ET
zK-wA@;VI^vntZ9Z*|RbK%ATOnl^4!1@2U2iol-|N`TicI7;Bf_(4(*^s#DciWjwP*
zt<xSuuEhThIBh~ZXhIzr>zZ?d>E=Budj<LMosdWExT{CxeGokw%orbeNuJmFC
WNrB
z1Q&UietDrAP9+@FN9Y5}*^%{lD6a0a%A%iDondrRms&G3`dMfK42hGzoi5`>;
zX9q
zdpO0)6nzwX#>(qLUs&|DiSYh07rvgYGAmzDD?MAvv2(S;pXjP$lIZ;C*hu}Fg=^
4<
zJHGzSP`qAOg)h^OqXmrHGd@)ZUKP;-
)!A}5I}#qRGVArR)2;EU^SjB6OBkCB=~zc6
zX2Azy2Z+88y?cMNlq+RQ{l-y0(J$}%v<}fL(4*sKba#A`ijODXo-`}-
yuW&&dqB@V
zdWd?4DN}SwpaxzA58*M3_WmdEW6V_;XDsEFpE!oHpj|YiI-
@h8UAoE)6seVq$!}cH
zwZ&3umRGlf`lESv8l$vFWcFR85&Heqr&?MvRpjS(J@&MlCqq3R{j$+7QlE0_vl
@Cy
zJ!V126H9X<q9bSXoSTvxL05L<{cKa&Whz=HI#cQwou%T@S!VpCFB|(j`zU?1qT
Z$}
zb-e1#I!4?&Cf4t4`TGwI)RA`j-
g@j7saFH_MmO9IPaN{)p<8o0KG0Q*#COrJpA4Cu
zVV~LQqg};*TFCPuUw+|}W74trayz~Y{r`jXPmZ~EYPC;w{wen7`D=^z4ALl9t-
RBv
z5k9Y$mSh!q0U8N>n@7P%WbgfagNJgkdw0~(=7)PWq4T440j1Y&r`*^8?MR;x
SvA$~
zj8_flrZ!HnZT^1-2P;YV+VQs~E%-*+bFZ}3T?q}hrgr63BG*F3gL&V=z6_}3T7egu
zygu*tSat-NaAW1kz{=1jE04Z9_DRw!^RLRx`lsriqwglAK9~38icgh4m#;e4gTt%f
zSxvqwo~_x`W6h_aohnpn;&i1N^Q_sbvxGX?-
|dfU4e)6HL=Y!)rg*o)_MG4Qs->o
z*?oCpw5(ye>Xb1&c4B8ZO?AcwTFdYSbcX3u4VUq|f?pZ$!mAadGLa{R;hE4eV
3l17
z9SzC~14G_Jytmpgh!Yr>kw=Z69tKYM1}9GV#X4Wcy8E~1`^0{C$GV9!2EH`FS!
Bwq
z$m1|Pq;xe)a9G%_@TI9tX`2zWRWbd7K2xC~Yek=w5U14W>D1GfL7pufhPR~
e4A6GJ
z6rMOsZe4_~aqQ1$wg+kJ;HL2ryUh=bkKCv`cvhZFIquO>{KDd!6MBl=_yssroV
cH
z(lGmos}SDHLci$PGWbfme?)(I8d~mxmV(E>frt3)q^*P|9-
fKg5b49K=)=;Vr5~R_
z9*Hd40!?IG0#DC)?{;(QZsgwHpHg?9s#qg3DTn_03Uq-
M8e;^pXT%<Sf_&0m>JByM
z&v_Pm0h!e;IQ&HVa~k?a7h6_KE2h7TjI(L5BRBF5_<amGGY-
q%J00H#V~SrT<HAbK
z6x;p~x;~&9`f^R+T2@(Z7Cf73%o5od2&*}^46QNe(BF&pe#`Z#sO@FNK2@vy
+so!;
zS$THa8Z~F{&m9>g??G_Zh&zOxp?u>C?-D*Cz7by0!{(f=`1BgFccjclcv;HoR|{rc
z<I>LJyIr?i&Wrpj{w^yMI>EEnc*0D=JVNw{HIXonP)BxYD`q|ld<Cytz+9t@nR~I}
zVzl?8`m~vjT+1!A;T}6L@(gfa)fwNU&Aqqn{Q+B+#wMEgNZ<N9crceb{D9D_P
p)s=
zbPYTicjYuvo(*SRUPR>H4q%BbWXI)Bh<u0lUyx4vkDls|yU<<P_?LxmL~aY;ya
&&`
zkE};#;0wv>h=|`9`Ti~1vMMdRN%*w&Wp&&z$L}e@-
nkTBv27*7&yYrJY@sz{$+1&;
zZ+MyUH0iSVF5ep6Z%-
tAdkuf%Hs~pQZR6XeN7~X#raHdcXSO$;6uezuk~5y$@d$i=
zindWxtukAeOIuul&l9*dK9uwBse#QBH(JWlRj0~Eez|fhT<pjf>08P29hoHZOIgI
z
z@6>=*X3H^XFKIlPM?JbfkoHf@YSPS`_DG$mYh;B}AKNeG)zzcJo22*X;PhR`e{
pK<
zKRA9n+vlNm+y{)8J{;J*n$V<8H0G!lG8WL477ye5mUc7n14{j(jO|Nl8>KdOtJj|
D
zD<OR_HZBrH#;A;McAJ&azG#lf8^%i6=vC4)hTD8QzBfm1{m35kIC6ilZO=$~BCi
UN
zXY<#Y_^Q>WE7v&Typ2v+YB}NDRU(T@>@=Yj_-
^oP)PlF|lcmh}Y#BJzX5ve}EpCsI
zI$ATGKF~T|tyH%B^<<hu7iirgI^qNPHL94;yWDIJPgL=>Zv1`J;~l<T93RLj=U2y1
zd~MLh@h7-
EBJx)F+4^ZHJ_@>uy^7qJA@4G;AoF=yZhROYgUk<nk#}j+q4^QVKlUr(
zA4KMUkN}@|5B`U4ya#{oC&C}1mDsLUXnf=b@=D(fuOA=z8=kFy62G|B9U?
9i9v|r;
zF5DdwpWBX5bbLg3%ccRk@`Vo^n#8EHr-QQaM-
|bgE$jV}taVwBNq?8VegZ$FrDrvr
zKu3++Xtu|oi@{hd3QZc9*7wtv@gTmFeS}hm^h@y}dh;rSIvKhP%^#zEvfzht
@WDHp
z+Wn}s7ww>kQ;hW(+lcRUcNTu~zvP?HTKHRF%Xd$=NgR1PEtN5IHMq<GUIp
pH$U2=q
zWzSn6m&Lv@sF!;DQ;|COdlWjSioAy8)lz3kdTd%dJ^WTw#k=?s>^!$jj4a}t$hf
x&
zC2bjH2<&Jg>~|+dM1Iz%nepdsIqJ-<jv=k^JiZKDMg_qmxF^f*N8-
!8l=u4Y2JpjW
zbzEbYlht9TF|#7fNw$pU_fvj<3ml=*-
|(D58z=L_zu7H*U>TF@{ABLRA~YBespM$4
z$^5p{e_c5O{belT%JIUjle9=1d`^27egk@}bIK^}l6fL{UFMD2E->R|E{`gSXAIId
zSBo^caTfh$>xKAr@yCj;t5oXf!`S(fZd<h$S&#0Md87y3^b-FSo(29)!g}&IBHJy>
z{|WY<^evBvPOWuhP`S^_l=+~)r0(Gl24*<^)$b0@X|y#Zw<C*ogkCA>-
1bOH`;(8Q
zwm)@)$U$=sb40b<z(;5&bHf%eXuA$eH|LnleML9uk*Lq#9^Iftq8F<8-
by9*O=k3q
z$i$S=_GpUEZyrBidmAz`j4YpoA4zaLwf3KE85u;*ir!-$UFH)u1z!ru-
0W@zKMMVe
zp-C8>E`3B~mO;FP@K}fEZ>D~mnZsELPgR(}(0~D~xc-tJm-OD)K&Ou!q8_2!)-
Y>
z?$G_tJW^sGdv^@JSiA2kd?spB7O-
Xz?p~h~=>ad{<slk7<JdOn5vC2m^=;a;Vj+Ai
zZTe~<J{9*}_)BawlfK`o>z82T+}qM^<<+Bu-
ljgW)AMIankeH3NfSOjFjM9U5^?kJ
z5jo)DB=~xG4awDy;zi%AsLDjnFiw;HVtfo9GFRGQu-=1EXz#Uw7Y2TUU5l-
uHZ|tS
zI41yqD5Eh?rS8kqWL<|bDxzeLXid0Z@*_Jpg<e61;@6Qm9@=D+@rrKG-
6hsbbO&;I
zlXW<R-
eZ1E^ep(HUkV$EGyEk}X{#6O)7l=ZPwUzuHi4H`(nWQ3O+aNGt;QCz+Xk8E
z$vF)l3BH*LGEZ)oA9Kpr{EU$Vzt@oa>HG46MQUtt)x`3G#S8Z!^J;?`DpSd?wD
DGR
zGUGy}GNn%NU9FG!5Wj_`>u>b|N2NcL$M|(qHLz4Z{vhBqBHv_O)CEsUz94*
9VC>J+
z7f;$FbM--<HJ)XTMQEV|Z%~&2Q)oc_YqQdO@^)vc%rBIF{Z_%Zf-
(ed{T4O0{_ct8
z^ur1nYlR7^-;CC8sLrlTt871g!l2A?MsMEgrA2!r4*Pa<1JA-IlFsRe4zHM`wTL?o
zK9cVgq4>*&X!K0pWa?#Dz6tB05$!zErVC>|sh`&uu^sHb7)xo*^ZH!~IKK4#d0|
VR
zun-tRs~YNYgmMJVyu~$pg812jD(UlKLPIIs&Pks)7f;?Ju-jZ(654(p88Zq!Wo}o#
zOTW-wd#YP|O^0t-
XVf(+vWRbkb}hOBxwp9sJkT$j%cZSCIru0aEwg<M&`%RvDfKJe
z2KF9$zD#@}2J+P){p~z!*4N4!zZgXYuD5N%E0DMSlo1AwH&-
G!y?I*7O<afJXB|ee
ztv6)c_`WZN^;Jo%ztB7SnbSIqP7ylGnBdQluexvC^I|)RoiG=8w-
9$&&n7OLxa^L(
z@CNv|?ANo1%j)ovSNiky#MyPXMn@!%C!-
u+*R$L4%VsO!3B8PaoKUIOGHY_QPT~UT
z6@4YpAmG2r4R3M6^xNDp+((;kk+f0tq|n|X6kZM!icB^Mg(mhou~fa>h6}H1
9KB=
z8tXQcW#>0T*q!Olcj23j_(UI4T`#{OG94TF&5W*>{i#wfU&lt3a!s)c)Ky8_M;|Q
P
zh|go=I`a{kb8EEFMJDr^YROJt#*Xg2l*L?phstQ&Qj#*ew>aGy|A&;hQ+V-
EtJU3@
z8tvPsRQrC`2?%~(TSXtz+LhYgy%oE@ty)F4U5XA1DD(%mPb?{N2%35}nY5J`zfv
2T
z_Y_~F=%FBaD5Ii)eC92xQ_41YUQOBnyk;V&<b5ISq4Qm6CcJt+@3suE$1JW5C
1s=6
z{pc>8Ib5G1vJ{+DZiI2GZBKjr_wrfe0@2%Ivpg<%<*T|baB}#Fb#t~3-
oO1P;N(3!
z^!P!019R-2EFynlJ?&be?%ugDxpm7U_c!#^>uZ}^_51qjb-hE~f*(l7E<#?tlhe9I
z>R+Cp)louO6>8eddi~y=Ur$qYLXY*P)h&6}f=|7!I>x}08gn<Ty0$dTcji#+_`PZP
z9^l26<nuCH_2iXNzJ>KK?`+lmE9;Zj?5xkUwg}Ikt?yKc)h)X8)Y`uvoTnVeJiGW*
zKZF*$*NvMXeb9KxY~TG&HFh@j5+8H!q~0y>_;Q~Ir?235JX*hg{gxbMHLue3
=T8*$
zZV_MYcs0JM<<q^CJFDY~@{Fk;_>v0$p7jE&t}SX3|7||7_9d$qqo0F+=JWF{n5
tC%
zNNj@IsrZ5>J!G~o)N`92x_4dwP3W?%#R@xzwH|(z8RWeI{k1qnRlKTeN2d@L
_*kPe
z2H&OfJs(n8O?Ka;U4ndjy4Z|Ao}wbr`Qq2lI=Y>CD|F(Elb~mSG+jyfO=Vu~bHK
nR
zX@h=SkfDb7xF+{*QLJ|g<8!-
%ca1t!;oDQ|Rz32jQr{MR67!oot$QzLZAc38DXZgk
zUrwRl6d841$5Z&FW6WtiMO!_Ee_D7<Lng*Zi!WmHt9sT^^`Sk7Z1b2so;hPa@
E>iv
zuR)DJx&*u$sPDsZ=086iD0=g&tD29{e!&T5=Mmc{J)z?^U<xkJ5dUe$FArv_T^
C>@
z6kt;fTx9kg8U=0X8x1@+^86}c31OwW>bRf&T$)k(f$&zP-#p%!?yMUT-
nQ*{mE0ul
z&)naOJ*?r8v6|3vK#e=Pa8vmQ506w8Vly`A`q3%!Ou2h`{t5GBBXiA8KfEjRYqcX
L
zKUUNDrGEcNwfimP`kgA}dH)F3W%$)@S?9B%*=&DctBP!(jB2;7L%?`;gxWoq{
MFcG
zm1^YCBgElLL_cU9A?3(?i+tki)9p27vQCUOD7<$SNZXG)ihi!>EkKri+TjIx@A>q{
zk0sN_neFY$-
_)Rzj<UA$MSNn=e}vNx#68S=he~_CQcFK7JR|9<;D=XP9~30inCs1j
z$0W~we2#ndw4)o~wT&vRiMm2J|Iybrx8^nINk@;^`9~amo%g-
UztkXoYMYAu1MMhs
zPSz7B(bchFq>VYp|AQYY=(jRO7J2cBV_}hzRrF;E-
$j3Z+YLXCwpH&9RFu9quuJfM
zi*n)BoKRFno+K39o`F9ngTqU_J2G#`KOo~9SvMKRR<^MB6J?`g!)JHY(<XlgUpi
x{
zq4i<X7qV$jk%iJubI=)8mzkXk*&uQNSzA$E=)5=Z{sQk7V}+=$cB321!e!bVk!d2
^
zoN}Mpju6RSm`6WeW61g|dmZyaaHB1{L(^1K<(goBkoaPidb|z2B57nST}>Vt*
Va(J
z$oxfR_)dY_iC<6rHetRCZoy;s_0$vB_!lPrL0=R3UlhKQ@xsPD!Id_8!icPAoKkmk
zVDl^d3aD2LG<eaapV07a-
^7lo_zn2BBZRL@WP(c79y7JdgTLS#?I!CDA_nhAc(=06
z*<twp0`iEh8CI-
0!Urecp3G1$T9cpKqSDRgz!Y_SF1(~3XWq0+MJA9wX<%Ttq<@37
znY_n<<G(>$f$ZP>8n)I(@-wfvIg4+nc}LD<qfd5CQlIOszIH*+dZ8V2wzAf4F7;Jv
z(pQZ8NA@b#@-e14x(zzEvhH2#^=tFp`#a{lJN0AB^C|T+e3DJmz*)j0f-
`f`4}kMF
za4uH9qm$@!RdzdRZ;RdUXDll=R1NFgS{1U2d9pyd*#})JlG4qcPx6g9xLtv4H9J6
`
z-beic^o{j=53Fn4F3-r<ic%Fs|M`z@CEi#i_3}XvzfF(QU#@HZxICgSErDah)@|5A
zHz_|%-
}6(x;P&k40UNjV#5rmGc3RQblD@$mcbecCWR1MeFLY;qc>(iwCHaiE)}@w*
z2z}|SLs#cb_b~^jDb>liuv5=qEuYfUB(9o%B%x12zD<&`2XlFLe1__jekSE9H+&N
w
zl68dG_`ABYMJKBw=J__q;FlP@a~i!yIh%q;a)fy;`W??vp7F0a@hPl9LEqCp8vcZr
zKV&QqZ^E}L4?&lLY}QiyCuCMy+Dhr4Tfv7u(s_2gL7d<f%r@gP29vc6Rm|HcW!
mxJ
zYmc)O-(}1w--
Ey{cHw&U@xEKs2iaW|;^&)Yc8a{KR+H0w(^RKD&K0_@OD@+YGiS-X
zzcvMWj%L2$BIakHTQJNsX$_Z7F<-!51L)D~N|#=5d>pMdr47-
_7&$~Mi{}Jd{bd5J
z+Jsi<)WZXxoi#`!_dSs|vTi~nzEK&oG-%`P%Sfb;=m<%3Xdr-V(rs_(COSua-n3h`
zmTxwz{58!+uGwVsgFE&+<O^W)1UkMXFo+8>9+dSk-
q>&}&w+<hdu7c!cpVcv96aLM
z*4$pP6+%XCuMZvIBW(Sg&)z@dXWz_|@JEss?c1o5Iv(i1uX#Y3eNSX;+~Rll(F
hKH
z(p1vlX!i=iI~6>Ai)&^}|2ZGM{p7LA+34ij7=0+LlCF_F@Hu&WM@z^f?~_^U;$J*
z
zb~SlqOqQ&)=U)TYSLvrBN8csRhnzc~AN-
2!llAPr=M~TBD7$P~rz^0wE)LILxY(F2
z{C0LZ_%7@+gr+jrB7U_bV0q&P)@$19Hg`|bB4StFEPXe1-<I!UZ-
y=HF+cAj+t=Tw
zjosL##%`RpKJSU8=g*cgpUA6irw4XtLj&e3R*IhNVQp3Y{pKUgF<r7x^rk+3<e6
)2
z9e*dj#IdYpC>)9G59`_Zg~r$3NxzddF43j+v&Fvi^Uc{8Fyz~naX}G0bLnj+K6st=
zYktP+ssqQ*fm?eDA~J>$pZj^jPx$-9Hz2-W(bFHbaUEO^;-
?C<FqX+z6*9l5@%uDw
z8hAom8AFB#c4#ZB2!qf>(#krmPs#V6X)Dcfs$wy+J@A6IvIKdaoz_2V%@ryl>p
^ng
zxsS1l8E5^B_^s_ZGMQsg@JEbwR=ag=<h!iZU`*2?a2YG-
1Y+9CD0Xq+Ep4UH&nvG4
zoZ|S|q)ve@ZKc5+aVq19z$R^F7yPpQ1D?CoN&|eTf2P>s#f<TokF0oC@1Mnd
9^=#O
zLUruE=5^pC<3+K9Zu9qlH;R3XG1n6F<v*XBqHa9GoatfeD89p+sHcLD-
_?L|aUu+>
z^FJx0u|SQ5A6I@29Hb0^{}%DKZM46r>GiYI07KG9J9}wlZ4qU69434mc&$DMp
3qTf
z$h<&Kzt~#9`wq|dgR6vs(>l_8NWC6+Y2D(peZTBabLyZmH~+40LSYH=?;Xn6t*
en@
zUp_`T4Q@FCL-GqwC*5)cry9!f+AXZ-
+3gl)4Yagd?nrebGBroqR_sfm^*_^IEzr6O
zc&tG$#Aa&_+qBjTJ$%Gw6`Vc=K7z}7@{0bIx>P}%gnXScAFv)gD_!~uT!AS*c(
HMX
z9zyFg(f~u!NL{=%QWu*Sz|St{WAGEa1Q$gg{5V{sj%SqP;&OI5XQcTAT!g2kpY
4a2
zLtW~|xyYD?$!cZlF9s^+!gKcbk-iC{AF#7z&F9!rJSX}I;oU-fxS1a^pNhS@GQ73*
zR?oj8GEoix4O3v40>cy-rob=-{##MN>Yj*iM}Fs`S_bycY1Z$^?_88`QvS~=TYl%F
z{4nMJkh0}>F3Ptk|C^L8zjIN3l=APVZ26sw^1CSiOO!3Yb5VYb@~@z5`JIdM73+
^D
zQnvigMfnEhpJq*y{LV%BCguN}vgLO!$`4ci4=G!I=c0Uz^1n&h@;evhM=Ae)%9
h``
zD8GyHzeL&cI~V20DE|t|mfyK3f4IzH3Jg<Vm;%ET7^c851^(wzU|s2jcBS`(obV
O*
z-J?X88~^NF=ermGGdDiNjXyBY`F`h>PFUlH54+*_-
S8DR49|Dc<+|Z9H{OG9x$n1Z
zI<wsH7o7L(o1M_AaKi80<b<W=PPnej36<%F9-L_xIYoG(7aw)gDcwbZ*<${-
zwX3m
zM4WKlZBF>88=tb-dCzy_-
OL{ey!1I|rT60Je?t7tXT^U6@NmQ*gaTf>TyPfsz4%#Y
z#h-BBwMQL(80m)N+%VvVW{vaxaW_1+(0QLy?S$*xaHvv-
`{;%l&MRvKyg$=@VA|CF
z^Fo_}Kbp?tZ!dKCJk!lgU^<U(;Jva4Oa5d-
g!^ZD55H09KQon+ng0h7H0_csHyM5@
z_vyC@Och$a<jz&bWyU4bE-
T{S^oxv=6?Mk+ON{B$rcYCMPrvxmDN`?#K&8#SuJn>i
zjoYi1+_|X6sJeaCqB`UJ8l!H}s=6hM>eHO>zv6QV`HL?3H3?>XVgh3dCH=|yHB;I
0
zkd{7bO!j#bCr$ax^jVi*xxjhPllLNduUoO?(#o2;swK-RZ(nlza+PLB)YmLtUcc%x
z<NSJ~x@y_7<*PuwdimYdqJCA?D)2uem1HzlExBva^3|&bE4x~%c}B8TbydsiZ
wJPe
zS6_L9@#W=pHPGZTW7?YY*PNYn^|JcaD^@J8TLty%7S*p<zN~(cvFe@`i-
KpTtiG$p
zLvi6E<Mt)Xmeem^RC9JJ4>`epb^Rw4S-
WicmzNof>gp~s1nQrBOftLrtLr}==`Sy-
zS+!W2S?D#0f0{b`_}#OQ*&VrJ|6_%>t}$B|rQNi?e*MFLv3>2|{ma(k>mE4u=J
%e|
zjeku#aOls=U&)&PwF?)dU32dhvkxBlkEc$)-
FwaE^?y~=SM=T2(n8lxzs$H2URzza
z$XK$>SRuh(Rd*~h?p$6~V=S&(R&(c)Wp@};&R+sY3?+xStCl-
yoa9TSMLv?ug9=Cd
z3b5HW7U$FI^UBI@D7(xs40Zht6<5!l$D_Krr0n{uub+RJp{~CE${XaPp>CR27P_I
F
z&noSDD7I+X^3``NHtt$<*Ydi11hKoSR?zr&ELpznvNYqSlFML}JJ%S-
0_RB{>zCZS
zNTToMxoXv_I(Zgex{IupRW&u0PWH;`#fz$Ir%ZMG)5X%p%cVo6sRbq1Up<$+
#)7$Y
z>}hKh|AzmDDKJcdVG0aWV3-
2K6!?Fj0PErGKTXe7j){J80yK6auu+k{Km0lI|LkQ*
zNcFosCjBm%67qQY1#fR8lknNbdxRbFdqUU+&K~)J#BzS?XV=f*!STY}H=Oa`;B
e@e
z^X?6sy52nV{p@m`QJiAArGuZ)B%7Zm8=KC!;Gse1f`^Ir0`+G{s}|>ihb!3h!6Ahi
zPJHzkHWkn3P^z&LiQm+1WJLRnES~d;dwha@F@$2`+LZ5pHub)+qKC}`$E#Sh
tBh!O
zG&G^tuoua5Kn@#&f@}cd_xy9fHSKskQbHKCX4~=U8LGvyH@Dj9HwD8^`ef
qwnyU9+
z^2x@k#LFVCVj*V@Kd&6%9}9j*v*G>qCzP|9_`n#I9scqV4K{oN4GKv6|4IYF{T
kpH
z&?=L<{E$ON21cvwk^@)t8n=Y|Wnt-
=i%_+~5mN3g_5F#9PY2VmX^}(E3T1OIa9Xl&
zxwJoVqZ+h0prEw_*EvjO1_#s1M&z4E$cE*i4R3b4<#VVZ?Y570v-
6gYh`dSq3JycR
z)W%yK%L>~Y$O_LRUU=!}gwhsoL3<Wl+Y904Ai44OhG-
5V28ZBV&Y?%{VJ!#h^G4W*
zwH&bX+K06q2(CztyukZ>e#?NxqFa|Y=E+9qT}l-
nl+E6kfQv_qThpK&?Ob3?VevT!
zb)>VAi(d&pHJJ^SY{Za_H1=k2_*v*68?S#Ne7SCIkK_%K*I4Y(UU*nGw4X}2DB
x1?
zuP?}o6cM%*I0tyOu<2el3bfv@j?3Y1oCs7gi|;2sJu>o*)AM>{bHEpXy<49V(KG
A=
z-
7;k(|NXT2tNNUy(8@WWLJs+nO|cy4;$0FkJFvDV+n4q2E?`>8<{YiIel{MQ+N*d
E
zoMaKR#HX=Hp9SIDfx~m0O$fU!E-;7@$|gU%?KY-G)<DbG`ANSP`o-
AP)W`uPa>(OK
z;^(BOv2y|{^Z!t1fvHoLrt-=|Yy^_BLu|4yWfAmNox|;klY<5|XtaUL8v<%lt&fG}
zf4Vq0JIF>2*#P43nX?hnJv^mjhF=aHa}Ld6L3*ZEYISGBOIc&D=#51iIUH1d1zHu
=
z>ufg8G&@Z;^wjHj@1%U5GuSx3dM6t`n(IGU*KDUtUa`{<8FNu;xzL~r8r18z??
f=#
zo9d%_Yo5g-
dfAjAheWRjW|&Rpb2CbNd>mF&k{;@jgEAV~aG}(io!~SWSHflnrIzg^
zU6D=0XGcaZfKDy^>P0TdA%|?}GO73K(*r`w&fw#VdxGkYW?xEU_qN<<UkZ
36#?J*8
zpK9#(<$bG<4K^M7wsO!D8-
cpk%VjNkA@z*!`xckIEaY+<Hj(UKKbFIx#&^g;WU`?|
z4lp^0jN<UCGs=@i`h)$~J}5xz2tsT6TjqbVk<(tB?;hU$*hkXZ2Sv%I&dft+rQMX
6
z)|M}-
@FmiyE`OwM6m)<#PM;X(^oh{8NCStja?njh)q`fgf<Fv+P52@4UD9k|@qeOx
zvf=11oPu!?XCtj6r@lv-
drMR=av&md(>p|Du+A=Se@8kt1Fa0wo|+{Gr>$uYYUWH8
zWiwWCV|QEbxB3+A<LI;eUfE29(=uD+T_Al;AG}gwO!<6|vZ{KN|CXI<Y<_R7;X
!m+
zes7q%s6+X^3uF1cN)Aa=`Mt7nEJ~;ciF^EW9GrGdPl*-
n7Wf8v7V;}NoZtH{vJkmg
zIKh^S*@ZW_^06JBOq7$)LMN33?5~Dx*&E{^Xr~`JbYRn!eP{!Hx1zYf*V{VF$H
p~_
zjrLqhgB+K%yf@1M92$MqJAeiLu=AO;%RbrkKlbuowT{hh{VSW5f7MRG)yP86
%QL#%
zgJtW1UxSOlH0i%u)DoHS6~&<tqWeDyFApa+BoE?rX8tw5GQXZsFE(r2FrqFF(u
bvN
zxuEJ0i)XaViM{)&uQ^!XFE>kDYMJ>%bxiHL)uXW-
;vt*W@N>&yc$>HWTWi@??H}sc
z&|2F_83r3H*(_%t=y5gjfsKNlY)aW2C}lI0T;A}AHFUsD0SD!re$vhxl)RJ8PBtjn
z8%Vm?G!^6EOxd_7`Q&gtMJSs*m5Yx`?|Rw6D{(WqW^bSqUF%)g(+y0~cNU
w^L}m&;
zatNI|aB0(eT{T%t!~JZ^+1#abI3YSvHbh5xmQ9l0Mm6tXBx#$&9t|?g&VM5<8
wG7S
zZ)LFYm^>zz04d-I?SsgAla1GM;n5(^d<6f!T$<$46_{+a*&KMB!(ll9<8@$%Ik;O6
z2;!ihky4f%AT<fvhS}6Bc!!jKq|{H^pc*=ck!x=f51xf#!|db`r_IRck(KDh*abre
z3>oxo*+f1lBb)<NIv$kt$oVjbtM&5C0W*aGQ?2}k!2Yz^dBBA&8>eK`n7qT|Gh
U^Q
z!}L4N*jiRKo`aGSE<=zuv=6-
@lns_bN9yMA67~2VFr;o#@ZH1nM(};2YjRV8uYXpE
zgKOTP|8iJ;Q!yJo<*>I`*^oV#u$pgoDE;||R7%qTaofN#O8w=aji_l5r;ds(uu&yH
z-
=%y_>q&c)t>1?ZI74n_3LQ*Bk;93HY}xj|9MU2iGtocQY_66K)>3DoIsIw|wm@g
S
zKJJ?OW%=cQPJEb+WDgNq93+gL(Yeu$V?)<wi$g($ug*S%#XC?(biZr_bnF2xm
17gA
z9Bi?fyiy)KimuL*jkflIfMNKVjhZ$;XCEkPnnatf*0Y;9#DIfG<UpjXju+g#$VBqy
zbS&gOytJra^kyZ`(PW3$&)gXLtSu`OX(4zi_)|73%3%%Hlb1sgklR@u%XwBVZnJ
pi
z@a@{WpgTC&--
F;Lb*|F2CN{;|2L=}i|Dms+faVI?+kK5RLw(J)w_U#c4*Jx;t^xaj
z14Q^$EuFju8CrIPb_uZ=wEEuaHPx4w^b{*!ZP3_|SINQ3LG%@UaIBPBFgsAL8
Cu~&
z@&!l(z7;jVTe!4l%_8036uKPSZ6F1H)5;4tl(ELp3*ooge}tzi*=YZSGVj?4d^Q``
ziXN;6ZUbesaq#k9HZ3Re``LZ!K5&;bB6k|@HP*;M39Z0P%(K6BZy9}fX&dE*u!l
nx
z^Wve4oI~K~tM*3r60yOF4;Ep^ayVRK`(TV6YdKsLk+!L#JZT#?M3z~)*~x)7wP
MEu
z$ELlsg-7QGeOzr7-
`M0kR^%=1S@`!{q@<ADVlyJY0Bx1Y21t`K^x4;S+IXm0=mD#H
zF5g79Tm=k~$3ARa<=VJ|bg*q&#U@uSS7ZF9EH(oxHD?xhYU|eZ2wWAN3Ou
c;(LOjp
z4t=%C6tb@pUit;FE5Sv|X!v}=>_odrksnx1Y}lVu%{So%$tU>w&VcP}LauDuXs8
JM
zz(E^k=OWS;tE5`!ZR2jPnY2gXS-
_)xBa+6kv(Dhf!V%ytvKcxY2!eMoBdMvHI#dH2
zSO>0zMnUqH^1Kl`y~ze`sZS;Cu!MdgGzjFXPCK;J90`RN8qvuz9#ml!`5P`~lnvri
z@5Shrz$I!9wBZnnWE<bs#plmHM7-
2j%8~<2POa@6JfzYcQxwYBOD<}Y&DnnnK68!~
z*&DN8O6Rgj>QGKx)mEv)gr;@WVZ$Ug!E;#AEbyHH+yQ-j?Yr>CTj-
+!Y)1|J4Gy-i
z<e<H+;6vLnZk`p<QW$?N{@m>M=<^mZByHP&tm{#WtM+JIK2<;-
n_i?1BAZ2D1*f%c
zS)DPiX`6jOQcmGk#t1LVVWQW}nk|QKZR4<{DmHRUz5-
|}HlhbZHmUytoHU<l(@%5h
zs4Ve+SlxdH57$$#Z&FWbQ*803h14%Z8zDEk!^mx9LxjVlYWE`xJY8>(F$XVV`LS
m+
zb{~YkCn$e6`OsH6(l^?uf2B{a1#X3p`cI<%folxm|FP)*94XgVTQwUR!Jlf5@Y50E
zHNQDW##J%$aS*~B6IvJ3hp3y~*Q6gA#L4(t((Xfcd+A71r1+MYCQ*N^qK+-
Pb6C@A
zo_7~0`!E4E<`;@Cxs<#Ow5iCo!8#`#o*R}!1LQz}d&7I8nb<P3%{l0;rpFmONS{iS
zIf-S-CSb2TImGvAaQ5JPvIe*}cHLTk2Hf4i6}jWty<N0_fK9|=FF}J$wZpUVhb|-(
zy=?OxvQT7-@VfB1HjRTm@G-<WK&p|==Q-
Hja<E>%zNYzRzscbjcQlWyIj<aAAHN$O
z2pU$IHj=~q#<y;1)Ya5S(1jXfNsIC2O!()oMyvS$))&ltL{qZ@K6N~}2AhXN8Wrtp
zq+(NMD#nFY84lHK(SrtKxiA+&h^^|?{cN9w%DBAu=hRo=nQXAG*C&*B=~kY
08S-xO
zxWam!!{fLl<Pl&yeR{~gJqk{H=c;@5UdRC?$c!K|x)?r$KalNQX15?cawUhwKFz
Ng
z-
w$*ulysNobIHp#6=~p*xcc#}TpE^DD2E!g5hwC~1v<NJgY*0d@wSWxw#11K$
nJOa
zdpT4~(tkf8?>h2IUA;D5$03g*GvU(%!CU6V8}UbhXPoz4qO+ivt;>XeKZ8%oJ9u
u;
z_CbG%k4_GITnlWmu?}O)h_5DkL`Ci=&Vsj`gM_m>nmL%lrnRlpoP*K~%5ZGC
p+kFj
zaqzD2iSViLiu8rn(RpjQe9MMy2p{rIalwc9=;}iYdaxhtiwcAWgEW3AJ@W7H=&jI
r
z4m8HzD>SfuJbt8~#;Z7xC+aJi6N2_8a!L5Yll5mGfZ-kL`wn$F0&V5OJPt4}jB*G_
zC-j!XM-
Fo+1(z6gNZb|R)P+AqaFxRZW>8nhzu{ao=Fw4T*w2CUUBE3TjkKH7PR`|0
z;`5NQqVT{}U<zGg_Qg^v@&@^$w7vK{pi9vtczmn8V+Tw6N5JcslntHBz&rbpj
G5hb
zl`zq+8MFbg<NguekaCcnmr#d_zs6T2x~`GFc${a!@llC`_vAo}L0RM4fKv8SaE(!(
z$X}DPIFQplY`{5`ReTO@IcA(bezXdn1!l)Dgs0&n`34`_d|806Q)pn)HpeKd3s`c%
ziQq4F^YD&VtH^bf>0R=d7(btQ!Gk=_ZDYiy+P~e{<Q&-
PrE~mw_5o>yKL(F5c!&>X
zir4|7JCR}1A9YiFjoBSe8|~jNhyMyL-n;Y{!M)(}>pC^H16xt6HPKs^IySQ;=c`=O
z#f5=fe4(wnrKeczQs4*jSM&)Dv~_{<AU17a%7i-
Fs>0yFSg|!@S*`ZiUeS)CYY6Re
z+68H9=IgYRTtF$8Pl`<wqFnGPQ^s?4UNyqGSVj)MIgEWHmqv<jz@Kt#me2az
vL}>p
zWa|QaupEvu3E5O_r9`T)s+nD*RK|vfCpCqsUu=V#?v0D@f|mGP9+7dP`1-
{5$skVp
zvG*?a^SjVc4tbVm8Ow-
oK%Q6gEbZ7#=p0nDZ~NEXZ+}gk$WnnRX=m^*hoRgHA3wye
zgZD$c3ohe@pWSrwKGl7f=dW;BsL$GyY1i#qrw#48#Xed$XxS`nCgG25*h6w$
<Z?MQ
z4c{~`u3g1pc29H28+;g5{WB%K)8-C8+i9+~d81I$sDXi5Q4XRM9f>a5BD!-
Qhwhnf
zc@law<)GZ>E9nQ5u;D%ZYPY3~ElOo<QGC!kJur(hyM>N}{mr%4Z$Q3@-
Y7AxvNrUN
z99ko~rx5udIzjZuA)akMM%ITpys>SA=#lKgKO<hoA0kJd<@o{WgD$^o9QGvf
QXhdK
z>E9+zJ+fEiq{su23%^WNE%F`&j)uJ~heIWPhX-2*VH)Td4j}X3VmHOxJ{;I3b(3;L
z?id`H`5N{7HgJdJp+o0H8;X;Q?MtYTv4dmqE%1rJXel$A>@u<Yv9p?_&#rXgEg|
%9
z|A8A<Ln!i$3)+iBj}TUP^opVrZGAx~a~^`{P1IFzyNP_`sk1zn3k+9IKIOu_-i0f6
zu;IwL!mAVVT$zw(3(tdef-
YWJqC+g?k?0mFXBHdjq(1XVFM8_Zd;*g0vwZj3MBXn<
zD64^Ik=?72C8D3cPUz^TA^!JlHYvXXp0K1JAdi7%(_khrBu)<R#kPhvj-2Kos1|9P
zma-
X5cK^Y?_u3$XJc9dp!ZYa0<qlQA@c5tzS=53beJ0^S!d89!(GAeA4c#E)h28hB
z>j^$?HXF1<@Re|L)zTUEJfSzga3L32G$#1&Mdo;Y>ptuPkuNGX!S<hCn{uXoL
%+9e
zRdjZl*dVu1_uOq$?TgLqv6(N~9-
E<mHh+j+^C4{@2Rz?K`W$}JpWerYKB12r`8pwW
zDjUad1TyN`tEy)Ue?ElotU*tyoy);hyLJD__tDwXM$cf=zp5wI?nCcRAWth7Def
EV
z@Z#N!6Am&?7#AywWX&Gc>6I15cfes{wa;X5fG+g8Mszb{8e4|I|5e{Ko24CA
Z!L@n
ztx6Uf{U_KAEwsCoLlG?IYs3$=kGg2IoABL<6sLWH>*>>%kLs+Vow=OQZs)DU
BJSl
zqx)$y(b4M(b#zZieQLV>jYDh~($5RH2pK<({cWxaO!tv*5`K{lq@SxE<`8yYp`Ct
m
zB8*%I#+1ak948L_J5*Md6NhZJ@j(6#eH-
O`D@}|`x8s5f7{gP(2EIWq@sj$9ESGlr
z=z(XBt$Oc7m1#DZkI>#l3!!C*@u``inyQGOLcY`@HD^lxx*lEAn@VP@IVHrw<
DDAg
zNg1a-0RJg2Vty)T)Ktx<nw}Uldg`}0D49NlonSR<wFbVvyuuK4KLjs{91&kc0kTD4
zX@1ff_!elNO{CFE<*-
GOL3xEGceFh=t)D}SbFQ2E#F*=WYsO{#dO6>}L>RQwWpS~G
z9(j^>Z);*aqH=1*#~H@X(7~%`X#of6t0ut}o4b$$|2W)Hjnyf4vE6ruF38>O)0x*
3
zAE;*A=yDJ+2fo{v<9>Ldipzo29rW+LqXT<BfY-%tlCi;ql<oRE3;#q8<JdR5*GzHd
zcZK)=f$y{Zsz~Gm{eF}5`vB=se4FS?TqdXrU)6K$LqbKrWaT@)nMTn=D^%q34$
tmT
z=(wn~FZ?PpMGl`6nQhA03!SRDvPR00csca>-
=UwRdyewFbmN8Y@UfT9!+k1gIP7o6
z7l5}1eu#=(M6Y4HQI-R9UxMuEfqpZAB{B%P(9(cUaThccx=8!A{zYJq*!Xflf{dSp
z7Vk+rZPV;=UoOvf8T6$naSqN|g{2AU{oo`#d<Oq=0gHD@t!L+Yb#v@p4psxEh
x2}L
zn`vLR;>bp1#*Xl<^JFf5ml8VIw9M|1cB&#?WN46ho3^yarL+@1c9}!nB(mG)Ti
QtG
zNw>Lv43Rlve?QZI=3J`dzjNjXtGza$9WBaK;0WI6hT?;7AfvoGC}f7jd2;;=XXm3$
zynHVu=0mPH`G#~|Hnz9;WJNa1TA~oJikKI+%K{IDpW?>}Fr2Y&R-
q4B0{!Sm*nHT<
zb{i!4ZF|t$9=;m#iOXiGhgD{f-Z(V?n`1}97YbaJ{f#>E4xO4sFVhEaG)Yg0JkXma
zaky{;KB(|CE3a7TN991bD(uECUnQ!6OFyQi+J4j0HPw5t;b#EH9><HHv{igp;wQ$
3
z?nf8t%>Ao%{_+A2xQ#NWFZR0lyoEmnp8P!8K1|)^o6JdCe)`+tr?@<U{$YN*P
UC=A
zxwKp(PUjK_oj8NJN3|-
Cai31#g9m`gx~)MSEc15)TLYHllQD_p+1lac_wvQubn^Y{
z^zRsT!f(^9{Lw!6tDCap9$sPIP1b!W>gM4+9$Q3onnwBpz8BnL^n2-
B!AaTt=*&4w
zeRY4d+XN;!Z&Ie<q~I0LkB9t-YWCVATSjAl1aDi>tk9{VR}U$*Tjr|+`D^+b;rC(=
ztQTMS66_0L*zF+W&=UGph@W9z6bZ!&@u#ofB6e^w{w|f_Ttty*<HM8oB?
Kd}Z7ayv
z61pf-kIokPv-
@yiq=$0Bd58Kc>xwvV`%|>lN&FsRnNwhl30@Udtf>*bu8*|3zYHDg
zSz9B1LJlmp5AT(Dkpq&Bxy_uj`B>;#h5Zp!%D$vZ=##Qo`o7wfT;qgEE1b}OrxW
_Z
zPN?68Y_zU<u`4Os-
4AXu?h%?kXkY5^gLXqj2M<?WfE@0^Pb2+M;=jhbjKczqqed}~
z-o`k@@o{9?-<R?|Dn0}HT-
aVK<ivlDLk@L4D(&7aaK_3datZz~(Q~bORxSOp!nus-
zhwVpFwCOVEB)lf;y5w?`E^N+2#S*X8#-
QWim>ymNZXbS)m&3Y(wj3^*FqdlbohIp{
zO^?Qa@e}g$-YxGs@4^qVt|kU-iEE@^8pP?u32j7{&_{AA-
8F|lf{$g4y^yxv$FsB%
zWn?<I?`>BnTkQ)rX1_nM`8vjELND=wdSgtH|Ke9jtefz~e<I624u9qm3XNE6nX-
1&
z1vFJ_3eH?4E6=2_P>J7kscY-YGM?`$e7L*oOW*J7;t=Vs-4ArDHGBKII9xiM-
rB8B
zZSU*y^E|S-J34l2-
(k{I=k8azw1j@{uC*HS1rA=|Rb&2_T;QeX7Y>g&7kHiKJ>dec
z9l>4m#GcqK?IW^6+ARzXgX%ZFz-
xyFj1pvuzAK5oGc>;)ggK1u+8jp){nnRx?Z^V|
z3}Ec;&}?}iI?3+C?s_YM+oqfURhN0$_=rCBaQb~;=0zLW^3)4|)dgPAmV?cGXI$
WA
zLi=s-oM#s~_AGuYbiXp0kKhs?8EeX=BL@5~K7mQVDc~25jgEv4@Z-
`Sk$<XxbfgSD
z<@kg}{t)-V7~3Dor4XC{it(o83w4c-h@Y7D-(l=Yic6cECFf<Fy~Fw;_69s9^i#^c
zER491y)4X4E9s)Y;bmbOIyyu-
p)Rq7e=iq=?WhLUANYc>9Tk*OjQ;#}7lb_r&82T8
zUJ%wr-
0yHfm`kJI>jhyuYN*E%@Ke8^3&M8T7ld_*JQ174A92QOLv!KS)`=H{?Wiue
zIP$A52-^$48tBxK<a?X(z}Xjs`LHcS|Ac|#={y-@ve20R^t)XUR)tPG`+~6Bh&z1N
z1z|T6clHHgWyC3L6E0SZNFGn_$(){CZ1qK3rw&~RCbo>7z9z%AWva#B5B{F6{
QX`S
zhAjE-bYU3w-yvxHkqg6!U-
_#p4CA|bi+f=h&#MzJ4C8$v^w;?=d?hk@k+jF49VWIQ
zyiGb8Gk@g5u-L^PxiD<I|IEDrVnd5;e;l6vqzl8Y;-Yv*|2r27i)<dgFl_k3u;B~C
z{&+47JAgjY6D|yUmiMj#GydP=!m!Di_Jv`4&%Q8>c-
yb%uKy7kS;g8F35PEXV^0KQ
z$k2b)g<)@H*cXP~gn#fEep~Tpv}`@|!m#V{)0|$b;uFiR=>2)atv#=9P{*T;pI?1
M
z9S;-6QdIllF<Sd;IeI&T$rkag@_m;^`rx`-apx2t9D&Uu`M;!HHS=B4V9$2TcP^H+
z_X~a+{TWL!fl~sUQ2Xh%W}NZ#W-
0eAf$65l&u6F4BfSnxjo<4Jneln}Q!fBdow3d&
zeuw{ZY`dRzSV@%eT22P*=L1{_q9PlW+4Fi6mjkk2WiR^o6qiapO}+QBkL6I)jqR
E_
zvA2NVk*o#nzOfT~{bdt-2Od)KC}SJTcWl;kl>a)gm>-
M0@UR0XgYqunmq~dCo*moX
zZK?Qt-F&)LQ;`hTMT}Wj*^`ksMlOEc^iyp{<X@JonEfwm_N?b`)-
v8+GNF9=)l2(h
zTJgcxZM)8D?qWQBm}j8@^=^*&S`W&e67f}P8PJqViL?x7KSdXK8GUnlRsTKB
M&EgM
z8u158{Bi1rPo^abZM0)^$hWdNsP5aT9Xqer&}ChR)s20bE$Na;XGuC>1=Zr68n
7fy
z6=}*pHciDDY1liH{SI(SfzyX=67ywt-~(X}BC~@FO6-vN+08bt>fW6mu3^gPBi}#C
zH_BQD|D7h!^T+~;f7Xp(O#HX`NgCF&+G+NaM#`+9-E$~cE_FJM--
@x|E>i_;f3NsR
zS#xqUWLaD6J)F#;Xvo`OI+rRfuIe{PcO}05F5;onZn+#!c&sa3>p$&Fv-cxDdyST{
z=sK>$0+!Ag+IPCO+ZWs0$6Q}pE9?JhuZqTvbNkslmWB_zR{YmiOuZ;=ppo9VZ
9$Kb
zZayvVf{)L}Njqw8+OXv#afTB&Vv5;5!p!Y0<Tu7FX&=MoQ`7j3og8Yvk#K~{>rK0
8
zZhKlue(%V#+}`w}()M&Nvic0a(U;F_AI&9KW47h?W|UspzJR#M0rE_l-
+uLh3B61C
zjhcN``>0i<4Ga9M+sE7pe12mmf4=<^N!yj%J964J?HA6?@4c4asM*)Hk0M;gZ;
W|e
z`<Q9@z0(%t+kBST|KAAs+TXgs-~RSzliGhdE4lqYic{K;%};IbyJ1B8yEmt`zh61B
zz5kB%_79eiYCrkq(e0TfvwQm*RD3G?oQkz2eatykj9|}J8hxo!Gy6<v`-
{zd*VgVF
z!9Hf`141*!_W&1j3GHQ%R6s51W6V_%+f1J!U7{>`BQO`7O2KI!I9&-
&^TFvVaJm|t
zJ`YaUfYY_$bY1(&1~Z;tlG}Uo%h$I{ImhYeA{&l3sd(Q8Gk)yHH@0UY7c!6$m+<
J
z{3-o3v5yK5eG?w_!AItSiM=KlDa!gzE;oOy1R21d5`5%ZliT)XdktT2B|q(C<-_}!
zx6s#V54RD@_rS^4hb5FT-aF-c+pnd(eBg@xkIz2B#fZ-{Zxz9J*Ah-
PUp!Q8Jb#OP
zFW<M_8~;h(y;t~pM-!iz2YH07W<00v-
|6im_wtAgX#l5xA&t~$DfKB39}BqurWZy^
zpOrl>zv+dMw~;<6;ljvr-edIT$)7<^Qt!kIBP;kO7e+pX+-XDC{Qq!a<TI?#{Haf6
z{B)eG-
x<*%^X#Fd&o^n4_iqWNn$5+j>i7}(KaIX^%X&4Zmo*B_p$rw7JZ)~z0~uYn
z{yFR5GJ?<LU9F8M{Pdlp%Et!x=h^aJ3mp9X2-e!Fw4;le0|)>^;suWI&yTsp{z5IK
z@ER_&d{d3B-
HMEws%0Dv5z4&D;P?AK`d$3?gWvD{=y&vV&Qx%ni(Ffps$Tq&`@X?_
z7db5#WKN^4B>bOtQD!Ig{@YUnIsc2F`Nw)`<_a!+WL^V%YE$r7!bOlP($BaE@
HC4
zkN?vz&5Vs1qScCwp-VFl@SJdI=FS9KwV|8-f4MZ%-bbA-
m&ocX!^kL=ZRN?l>ptpW
z?wHeCBJ<_!r8ajs_NJ|;9vVG#(I);YSzoAao#<Y)Inljnb7HTor4*UuNAEm|d`SA(
zi#CUBTd|cY)$pa6r`G<+-V^i(xim8;YxvU4;Y%}j%X$g#l1hzz*29-({`b8!GsrrV
z0Bb6SFU?fLf5Q|Qrob=-{%9yLnY|w85*hzFF8?*gP3N-
y<CzaQm*qckj_bei9G72n
zj?4cBYe>&!`wx`*de4||yFnc{E*hwKwUYJJgyL_`{{zy<D?d#xxMN-
`$S?NL*!IKB
zo3VD;KI^TLxwFHp&1F3y=Lx8aM~;#fKdkIsj5U}$b^P-
s%(clH!XwO=MfKu?pZN{t
zidX*Ita1KT<?l}@zy3EUf7EYL{$ciWoGTvi>OVN&D(#=|wm+e?|Koo^{JiqN@
@we7
zFoFJAzXARK<~QV7ul%LIru<Ms`R}~_>-
q0%zeV{A|A6#8S9~>G?l1+0DKJcdVG0aW
zV3-1byc9^5rAGW^YZu$$wdXrw_NSfj7Wdu$nDF0K?)QW!`!VLG-
{Xegal_P4fOB^K
z-~8RdPler3eb&jE;f7xP3g`R%)lT@Z8#cS)<8JsZH?%Hx(!Jt_(>~+8FLuN4yWtR?
zhWqG-
4msKGH~43|Pb{0U|Gbdt?}Yp9*tBGSWnlAh;qQF0Ua~K3Oy;;8BUmtJ&UyKB
z=FBOa%o!u<Mg8EvzM{u;`8)C^|Gldpmy%gCp$e2{BXQPcc}1UmSspisU3!V!H
OI|e
z^RB(byE?7jC@HC{UOcntGs~CVdC$ehf;$&gaSL4iqE*I1F5;^(ZojkY4r6Y`EtOYa
zKlj=%l+LRxDJh$K)uq!b%jV55m+RYrclENntM24lv%1yG<PJD;*WJCOdXZ7HsJ^
;x
z$%<8S4cH1P*S-
;q+v8R(A^p8_TiV%KZ2ZbUGw<5za^akP$=kw3#_D=*QRB`v8`n#x
zU#!x;ux!zq6^p9n>bk1i<wCku_mF@a^5pWlMHeR^wW_M_4r;Sv`Ii^f8Fwza
d(oZ7
z?I2XYx_-
r?Wi`g~6^rVsR&o7VnyRY1tFj7WRMy{Jt?F0R*x_$~&)U3eFIC{Lq!yP5
zruNlvAUbaiHxw?by3;6G$fbL7+25iicN4#SnOuU$Rcp7`Ex*fYp+#$|7p)MiNL5w
8
zeA%CzzuKt3XITvi7X67NzSFzS?=s`+Wq_?)y#k0_4G27Lbpr>X!5`U;Z%)5i;`U>=
z6RFZEPXG1$o$q&h-={k9lihIIfiWeLXU}C$yqEv%@R<8O^>a?T?I}*UD%A;#-
0<vt
z!|%fs7^c851%@dwOo3qv3{zm30>c#eW1s-
%N(~4eUU=YpjvYHVe(iGJ*{9_E{qU@J
TFWwCuD|-l@yl3;%{M!Eoed*fa

diff --git a/Platform/RaspberryPi/RPi4/TrustedFirmware/Readme.md
b/Platform/RaspberryPi/RPi4/TrustedFirmware/Readme.md
index 43a33f7b1b12..6631c05400dc 100644
--- a/Platform/RaspberryPi/RPi4/TrustedFirmware/Readme.md
+++ b/Platform/RaspberryPi/RPi4/TrustedFirmware/Readme.md
@@ -2,13 +2,13 @@ ARM Trusted Firmware for Raspberry Pi 4
=======================================



The `bl31.bin` TF-A binary found in this directory was built from the

-[official TF-A 2.3 release](https://git.trustedfirmware.org/TF-A/trusted-
firmware-a.git/tag/?h=v2.3)

-through an [AppVeyor build
script](https://github.com/pbatard/pitf/blob/master/appveyor.yml)

+[official TF-A 2.5 release](https://git.trustedfirmware.org/TF-A/trusted-
firmware-a.git/tag/?h=v2.5)

+through a [GitHub build
script](https://github.com/pftf/pitf/blob/master/.github/workflows/build.y
ml)

that is designed to provide evidence that these binaries match the vanilla TF-
A source.



-As per the [AppVeyor build
log](https://ci.appveyor.com/project/pbatard/pitf/builds/32330098),

+Per the [GitHub Actions
log](https://github.com/pftf/pitf/runs/2822874196),

the SHA-256 sum for the bin can be validated to be as follows:

-- `bl31.bin`:
`b868ef51cead73ab96b2af778334eb063f6bc8009736c1a16080edc21796dc6a`

+- `bl31.bin`:
`59c4486a0a257c8d630d8ea39d6a13d038cd50be4fc9a81985bf2c32a7c3fca6`



For Raspberry Pi 4 usage, TF-A was built using the command:

```

diff --git a/Platform/RaspberryPi/RPi4/TrustedFirmware/bl31.bin
b/Platform/RaspberryPi/RPi4/TrustedFirmware/bl31.bin
index
7ed86b7d4e2786d8ccbc9fdbcfd4f4bed7773715..c97aab3895bd3a831d1a3f8c6
759959acf2dba04 100644
GIT binary patch
literal 41067
zcmeIb349dSmGFD3y0w4=XamVYAF7tH1MLm73dgZZEwHh1yh!pA;zTVZ*?=
&MTG$wf
z)dCzdmXk+gC1kK))L=Uw>U^2;V3<MK5ZKPfB*9X|yje1|0I!M@HXF4A==-
0lE~&wu
zBr`AX<@eq|(yppo_nv$1Ip?13-dj>`m81R}{Y$(5!h-
)s!@WGz%M`dwfy)%QOo7W3
zxJ-e|6u3-
*%M`dwfy)%QOo7W3uqbfGr6M1=w8)1pJ#yCNim2q4?r`3>PN|Fuy+=x2
zy%{dmW-7H?slvnICtMk-
%Pw!Cyi8l)tuk)zRZ5FE^?$9aHg#*TTV+n5d~>&v5k6&P
zb6-H&^W%F5=eQ^jcAN6vUDB)maYav|Tb-
;?s!AE*?yzrsZwj#eO3f(bIs$mt+c>-o
z!l4$WPI$QTJNQf9QIB#xMEjRL!P!>%Ug`&xIux&e$m6%`@1lI4sd`6p%>jq8{Ko
Oi
z<rj73MEYD~BS&51BF9|0kwLd=yNRD^!B?R&f&afW3qBowV!si}uhUhIf7LLZy!
7=+
zbb9vBKqnc?KLN)8|JC&Ue~wdaqv`+r+8=bBcd5|nO07fq8-
=&0`F)VBV({AgVxDSq
zyH(~fSGJ7VD`P)hS=Ql$VZQ%sWaxuzGj@LMt2^&Z6<9y)IO<Yfffq$i%2cpIQ!h
7G
zE3M&lnu?uvB}clFRaIY_HdV@sG*!j>3b~JR-<M*SD;@r-
;FffyatyV(B0BiDjr5mR
z?N%%24GvaC!R2(C^m|}um#g})$(RfkKIPX{EH*fp+gGYhEmT^+;Zjxa#No>GP
mr6w
zwdO9lk8WsRpw^kso~Ax{c7w+$DL1K4-
&q!%4K|z>`kV>P3YA(J&27&=MVsyn)pmj_
z^vwD#S4S>iq5M6bk+nU$xPO~_@XLCWtCosfuhX8h<PSMyF0=~%Nt7RRO^
Cddq235i
ze0`frH@6f{QYXtr&YxEy)ulo+;9b(-;2ytXyjrmP26!iJf;naheeJ%M_vfvCs}KKA
zP36=ura|au&70q>?g4je-
hgkn^vM{lt9ghynQF%5Cv}iv#$Pz}e!Hf27pqVA*4}Y<
z&wASUj90g5;9c%kZzxs#w6P|QIjXk`?OuRR?dSo4ujQDX9{2dH(xA3-
JLOIpW1p#%
z*%`+nORlC%?e@6Tbe*4XX+dRC>Vf>S0+r=kms;uL>Pj~|Yt<D~UFoV*Q>s&
U^UDZk
z)hd0Yl+_|<a&^g-
cf}gl)OdM@>SW9n@&2qUv|ZW9IE%p12aeTo9Cy&J2>6$l8<bh?
zbIjP!pt0imbFLn)?{j?{KD>oKd`MTjyK+>FF-|`?IJgy=-W^5eFSt@7;Jw*n=7h9V
z6|?RQ?$hJ<iu()|+YWs-
w~9?oQaMrhtmT=VeS?Lwq;I)zQN}C{+A+7h@$p#n3({|m
z4(<54rkI@*8E>tcIMOvmb$Xg6*z{bNT&Yb|on<*HOPd58M>99CQJu(br^nAd
bsaiI
zU4<5Wq0@Gu6MY{YynfaYed5oFbm@)L<#3!XClly$OPnse`#4R)dBZdba_`W
@&wT<-
z-Y54gG&u#WbC`?8{0jJibNB6BS7`SAeC{XmyWq--
j6wdTek#wo{4)4S{hPUt=O=ZN
zsiR?+JOf|aqQ&i)&{paNvokEa=E$@<H5*x<w@aP6!Y==`E$fC=zF?Q;>gx8m{k
xR%
zJZ;45Sg_>%z~ft_OrB52$8gHhw^@-7!R69<8s2Ez1-
sANhWliG+5N5A<@Dj#kq=eU
zYdm;&kCAS^B7GErKl7p6(rKGFY?HFdYIbiqWlK`k8!3!io;SpwT|Cd_H;3P=%*S8
2
zRK_pHs@AA$L}U{3<V(7}RhxKVn<v%WQktqx9z#!#RQVPiG~g6b?#oc2iBrmZ
p3LZ4
z@K?s``5B(q^Ka8ec&}PIsxs4aAm5^+R(SaK5h~QIM)of{KUh@=3@JYn*Bd`J4&
-00
zrFiE*n%eue%52zy?wG7)^!vDq-W_`X#K+%@-
W__s=Hu^=^8PJo|7)Q)bJP94>+Zk3
zFu3(Nb95uR_nX{z@awi@BRO&wTD<v`8G|mn`zh1Sn|q7-
9sNHtJKUK!_a;@`+<QDX
z1DjWfAD}`TmD%%Vs~HnpyAQwPJbjHBgC9|*diz@M>Cnsxy+!<vW#8T5!l!X
pOz0ha
zO2xwPX2c}3V}zO4>*Y7bEbADPk=J{-
k=L6!(bsVg_amUw$ZN_wMwS)yrd8zirca;K
zk<R;T`HjA5ZpY{yw0j}1H)GB%9aE?uIz*dEw|3liXngMyexpj}b&P7Fu3zBa)-
mRu
zyxuANGAG{Naf8(D%Ii&=GQZ>M@`Bzw_>C&Lqhl1;W&FmNpY0ekrJ#4p-
36BXo@A^t
zrjxBIc4~teJMrUtI<go~24lN{AGB?|u-
1$TUk9I4v8b#4aQiHq$AwRg?tL4%$7bOg
zO$njTV%m-gy}H|s`HTs@F6@wtYddpGWWvqdd<hv%(!!@Us-(!1%+o<-
o_aB3<2HA~
ze7&$%#m)&|sjI=4&!TID52Bak-2}@1y?H^;kqzo(7}-
7YtUBrE8ck6hN5^O#$8+_L
z$<jW<jPZWA!0@bF(4$o8;StDzwEv<uZ{{)Th;ESgGva-
GpFW}~CUDAt<Li*I|2_3i
z!v6`#QxN&l&;cIh-=(1g4Cd<}wX08jvR&1g=dKIw-LB}qQ$FPyS^ux-
3Gk`=XIDnM
zO6rfIuUj^j4|sT2s`Q2$=1nlF-
jMk(zxTkY6x@D&esHUKXhN^4RUf|P(9OMF&^?UL
zBJc58wsxg!0~cH)Bhu!N;>uk8Bp*PfKHY7+w(r#W^VrPzeIIj0=8Nls_(M;3dw5^
K
zz4X&Z-`U{C7^W)^z7n!gh^`4IDaP2o%|QRlSmi2sj-
oDp;UOQsl%|L;Qnlw~Jom$|
z`}l>SmAVOE3cp7DHt9pk0G88iAe-
<_NuBg{)X`V^(Q_&%m|vKoR_=$6=F78t%iMy8
z7BOG8b-
uvR3d}94VD%Ow&$RtF;Jphz{|epcD`bGfTimM?U+U4Vap<j@$c$34YWfwK
zFC~r<zepKUZpI9JE`cq28(jK*!Qi$s_+r2pEh*UTNe9NFngOYIe(k=F)0O)=KA?{u
z@;l9Z>SIpgmmQ39T}+uj*?gm~);JiF_m%s1o?pA)@|C6SzMEaWFH@e_<|&
@-`0R;Y
zPJHIHk$EiidWAZ>1Ri6R>lgURyuE-w4j*=#@i8cLV<B_23mO{Pa=-
Xg4foNl_?g6Y
ziF4(x!t#!HJ~gM~z3b<8{ASiI9ltHTwd2IC^Eyu5bz8@o`)}{~uzG&Sz{7WRe6;+t
z9p{?OSV37{@43hB>=0Td&fT{PUBGbzCkZ&oz)1m4DsV;sXC!dafRhfKQ61+V8{
Lsr
zR?>T_S;Z!UU#YhElm}ff;`vYajs*8=%{*m-@4H)hudUrR0-
PQD6m*@Kg&o=YCNlgM
zwEo9Uw!Y86F5JK`i}r_J%k1b5s@Sc%`AWN{LK#gD^o&_o-
II|&CbA5@_Y2R=&@UIS
zDEXx-nbq)JSH^pb$5$@DZOK4XD?N<;K_-
J+pk3@++{;)+pGaAv9z{+n_Q4ZNp3YTo
z+CMlrLtm$DLZ)U2Z3@q|Z<4EyuRaC&l<P6^<I~NaCy}ui@Z(FBtG_r&Rn_3j<0
rgF
z{8Z&e);GFUsLri+w<Cv>+^VWD-8{vdtV&8ZcfG{BC-
Dyob5uzo`i6e7;qLzRyf0kW
zvQzF~rECs9klgQ}+-MSA<|0OLTQS0%-
^hIXcpH)Xpun+U>lSQlEcEZcFj(cLf5Gjw
z3xgJJ>nXGAx~;lm|0M>s;#n)+R1r74@<1#1y5=68Yt530tC@=x$6UJCM_gOGr
gnAh
zO=UgMqQPTq$ggJZd%)kryP}f9O3l!`3uz;5!LPx9MstBxx1@gcLwZu{hMQE@i-
Re%
z22;u#>egwM269wxxV-
}Jr;J7T^Qtl*mp<Al3j$mEm3~_AfA(SL5@Xp*@&6U}L+UVB
zz0GSpt7R^>1M|{0>cqZo8MnmK5^JM}I*Bzp)vw5_NNmjfRPgx%H2SA3$yJ2A
1H>eO
z1J{Q9$tre+GJlrpL~nF9KcROt=PP7RP32u@)D`abk0yRkh`Aj+J(6RYG9n~>PUAl
C
zHzSGtvm-q@=y9&r`@N~5U-
JAJ^!0ImKgzapBAb;lH)aZ6s`T*JDgO?BgVTq|Y;<t&
zkmxHJmpWl~DoxFhvT_&k%7EFar-
r*dI~$l6TI5U`F#++Ljvau%=<Hzk?<i}*K7d2W
z<2H#`*LOd~^V>XsnR)mluK0GFU*by4aAG4@;))ZsT$$r1&}pGL;3|3$copPfh^
y7+
zh5U${R{H$cgp96hL%`jpp$D<6Csjtf<!hVN?;#GC{EE=el1XwbYseGfcg*OcOxM
E|
zg8P?KRGZ{Yy0n3r2K}pnjF7xv56!ISuq*Vrk=QzZ5AiGECpj3&yU6?y_<6+tVeF<
=
ze{*IiKwF8y<lT><YtVT&DJvwo4VOm$(8%JCI~$&byDk20%MM8%Pv%GwxcC
a}cO$@2
zGs4{)p|NK4ojSHbg{=2?WQY3574@}*EBdZhog$|K>xER+X2D)<w;#<j`6b?EN5
+7g
zdnl)r<F(-Iwd;M2deZ(oahilxoF?zk59Obst-QzXbe0qEl-)G1r}n|T${JJimaogJ
zT<F)m9;JJ`e?PeO?-KO^w6|icf;m<Walhy#q4m-cp-
I3T4UJ;w@QL7Uj$dNz9Pg9p
z4zaCE(`{KULq?_Cru~7P^N>+TJ`1TUa#DFopS1T%tf^E|C<UJ@K#XqDxu_sCo
&MW=
z1)*j=r{9O(5Sgv{vWbl^J^Xv%BtA=>4d@Q1Z{fQIM~}k+-
dWmMKEnh40eSDtQ9Jjh
zdHv8tJrEdh=9tv^gnAJVw1szB<hSq<hI4HoXyy14^{b+;qORD)#Jaa7)`j*$hkvF{
zbFx}lhRxA}W~@l9-r~{BnQA9K4!Pv*l1o+(Z?SX41-;~5E1;c~!zxT)eM)qvM?FfN
zmyz4xHjn#(U0P;AZ?yT#<cJG;{m@VK74$BQ7W7(vohs-
Re=p2c_fUp?FAIjd)lKtz
zqz{8O3;7itE$BVt%0@PGyyKYfa(&FYW_!N^&dBT#&(kg$*BRz7`BLu)Xq)rEw1
Gta
zII{5^FeF|Q-
%w%_$FFj7uOEC~@Awcon*lBDJggScZV7g0qWkygDk~eGA{uVlg6uqf
zFY`E{o4bNpW~WI$D4;*OD~QfERmRMKzG_$Cqjg)XI>{?`8Im)<Cbd#@RTz0!s
p=lN
zU&Or)=b>Fua=Jfb&b0s!_>tm_IXz{%G0RBz_27H2+)fTvPXUf0I(7RgAGyRjef6
$t
z{8y<T&^K;V^8Va9see-
DRY0%X<%Uj1y2_FqlEO}}Lg#saN$y~!hO7tlWxHN=bkdp8
zp<AK%wak+|=AboC&n*RB^C=5&#v%M?Zqn`xyIL6USk=-
!HXnIOku``gt{isz`9(b*
z<Y$H&D|RO`Bjan^48iRg|InN-
z$QS08~nh^PG9&+K(F1^8&NSMqofzOF`Zm&&w3T>
z>Xx{5Tx9<i6%*R*|0>sok|!_g_~7$COZR4uwC4k`Haq&AIkLGeqJ^@L&y78+)S
g6n
zXwl8te)_;pyeH$T$ucEZxLb6h!JLP$G08_$w%J2_u6xh{R?d<({erWHSm7h;7?jI
3
zQHDNXjtMUJ@jDC-mMo14W(h6`{2oVlIrz)m-
=Ba}5WXxNNgPi6yU(junmo&#78#Lp
z6CB%h{RU)jO<Q*`U+@*5D|+G9nNlx|ZIC+nYBN8yaN8&A0TH2%<U<`f6dW
~hD#ORs
zk0%lP1S_05A@M{X`Ay%0tGD==qdNIe!IQe1jh)(TxmT%O3lgu+Jo_d-
Oksg)G{D<r
z&S>Fa7W4dRr5@d7ts$WwoPMC|7Ri^NU;Dj_)<4eHx;kc|m(Sjk9+G+K;ofsiI`
%Oq
z@`YsVE;J4%4a~CbTuvk(TUkP#yvNc*^6nMv6*}&Q8vN#L#zp&_W7D+IQPzo|
k?5Gn
zczl2;{&k-#FH#21LARO_z02$@6yK9}Gl6&b%jqGz-
MFE4qi8pScYD5>7QzpOpJO98
z(Ozt+z&;jVlafAOjpM358l36qFX8*y+Hz#~b<1y%H7pP9yUq{V{pYBaHTa|so_|
e$
zGA4Lu$(cn9cN%#ud%cKv);duxeVHQ$W?JtH(k%Zki!z~67xaMES=PLXuN4XJE
Svwl
zUH5a?UhxgOE)34H$|t5_>uq1*ff)MW!r%<6`~fM?v3!UM%1!XL%AXl7zk~AN
xxpD0
zopuTQv60i6HjS*hVdzSk1Ltw@RKFjbQ4FtK!M%-
EovvYcKalqy4bC8M%KMk?_a}zm
z?~(Vh!5OuQ?K9Gc@ca(%(fccj-4^VFj?kjw2NpelXs@AR6NH{J-
g@56LH^4P=3pMW
zz>Z<8IW4)eIgG>NW!w+H_V>aU+dn?SyHA$=)&HUFYi@J4uFTm!1ACKd&Q|
H>>@pL(
z=vNVEj{QGXNBYs}&*Rr4dWJc>D5yuY9B>JPOCGosfJ+y+M8PG!>t94>&adsfX
s+6J
zleK8(?10PVjWxJCejiBcI6h6q-ji4YnyL{4v;KOj3T<02Ym!$)NcwEu>NCh|kBdA4
z&Cr?XxBSR2DHk5dnr@W2`jPE3?{=%)`K<j`<TH<@9{kRHjk@P7`Me@R{JXWK
+-OCn
zyb>d}=o+wdB6H#Uaq1YzuC)6H>V<Wc)`Lyo@r3zoAN>T2h^_R3))};W0vmkX
Rp332
zZlOGMe7Wk3(58mE9us`0nK6Ow8bi$5G$Bj+s-2=THFT)-
S1J81$A6$t;`r(JYHGTS
zaXMopH*Jma>%dcPbq}%l{J)dDr1X#8aBQ0BhFHTKXgC)g@nbu-
pkED}qx|6tgP1bv
za(j2s)*!Zwy7Ij3a?cu)tbv~9-ES<}{;tKRSTXCd_($l4L!R%WALDDx!nY4(4*`6W
zeFP~<cDy0D%UJ#fKLCHot1(7-euwu1JO^9@Gnt=<d|m0px%N9*`?1=k*gE-
`Yn;Rr
zhkR-j{LYE|oVLfnQ*@eDev@7PW6G`PrK3V_V7agjj^1nH-4XoMYgwxfU-
0+TF-Fl3
z(MlQfSnr4BTBw?`K4h*iMXg+g{_R@h+52<s^Pc1<dZM(spZ8r$X6#*+sxpx$Z>
3c~
z8~M5-
(zRg5Ucn9D*1}!n&cVULX_Jj(1$exOya`?#S;u2+5$pYn_It4}w^8R~JS>*A
z@gG_IV_X$I7Ek{0I)8+<YUBj`E?(z%*7uP!e1Ds-
!bfNx!T0q#bMOObA^a4c3qQlj
zYKF`SnNN<cea|W%m?{3(c4B~|0c}W6W?@IqR<q7X8RMZ%u6Gn=D&6*3C*
%9?&Qh6v
z=0@A26S4-F7e}FK9&-
;yW<IXxF$Z(3IoJn{1;$tDkGU{I8Q}_%m+7xgZ}l%J*$Zx&
z)3Q}a*8hPY($73W4k0_Ti<r}yoAUhEJS#I?5j;=`zj800CkZq*ux}Dmi!QeKgY1b;
ze;EFD;p579%a9Ed931}xUn%S3{)gM5r|6^)nHTo_(7Xf86&z|yR>Cgmnl1iBo<$?
E
zZ?~hXqMuT+AbGi?x0;>W6w!5KBloMEG+#P<H%6;WA38(yhRBPhBP0j$DKjS
H`WxcX
zW48u7*F#g8%LeU5KS|E+0cZd%E*iVzKO8UCu%$Whco>(h@Wg^IdJp&l(}D#
|St}PB
zi9Qng97lfMBz97!3N5Ey;qz+c2;vRahrE76g_cmZQKh7jXZ4aVY$zu8<_C_<$Cp%
c
zn&?+@kPWr?d;Sa+`Xc3TO530ceco!T()Q6V`l<GOhwkvI!lt{OCp;EVp?`pW%)v;
s
z5I-N^SNt%p;%j#n$(kxT1|K;F(^TFfatvjD&5K{@-3||>uG-uJe0wj-Fkgqqc@?;9
z|8;xCcI~^3<XIc~Qo#3a)(I#VpIFBGS5oFzq482SN3Bfdc~Gea{J5$pvhaOygbooI
zXBKsim`1;hbsjV^^nqD^XqZm<KH3~G%r%>YCeSb?UiQwc_I#n&5#C3iYR^yA)
W|_o
zt=xoME|R<&GK_PQ<KL`8A0ZE$1_!4r<-Xd-
ypuNJ&E}e8#BoCZQ@j^gLg(Lce*_wb
zH_usf4BwF)+SNO_N}0fvay4a`{wgl_23N^(I5~>GLe<%Vujr?ZL(8McN448LRRa
!3
z;gjs|5_<K4hw#ddF>F5mDeW<2ZH4KVwjb7uqSIvm({%KLW25R=zg6h>wgbk
&COxNh
z9PcC-
^DcBl|8|R>aO|g(kF#~&SW5@3#V$uL3{DRuL$`$S#(ld;7d9CmIUY|8=UP6O
zqH+@RG!C7F4ujB&BsRK*cF>^|ny@~$z@eKG8d`k~k4^Fv9<js0F%qZ5_jl>u
N$6Np
zb8P2Wuju=u*d}LO*d=17S9cP#=K#0+Qa}EZ_%ouAxtX%B%Chx(WCije`aty20
{Zg1
zq_1(-
a|>gSBD>)V73%R#Ykft}Zmpw!;Z15~AWMaQ0*(8U#Lj0&M!*L@b2FR#e_K3e
zK0lh+Nw<8MkMY1nzKF$l%X{II<i;Fa9Y17fubY*Bamn6B?>oRej_ymeg%UT3y
_T^H
zEwI~GUN<ogIuqYBH-
oW%o^eUuGO_;=GPkf@*D$_4_@4oNY^#ieoO|d~lwCBAgg8m`
zrObQj>utf0eiXVRKTfB2piv!gWIhG)&xA*gu9IsL&qrOU*oqWro*dB<?6~;LYrr
=K
zOreQw%Vm$JJ8paOBLl9a2surQhcc#n>FX6}N^Y)O=y24Er6jH$7x^Cbh~pw+h
eQre
zlFPAtYRjgNi{xPs!{i}sKWkj%G|!Sh=)>+0>RLmY%yWEYvESdpPIX~J9-
zN$m+;u8
zzZ1iXpX&HH&ocIZ`51p~-
^8}1dgOcP4&iB6GV(?|@H24B#y&Qy?1rD>i`1#?`68pW
zTwmo~qP}jyChd0Ha{7JV6{0sMqhG_s6nlAY*Hyy~>g1@L`RyvF;Wl_8cJUQt`Y
5{F
z_EobZk1!?^+C0jbl*&HX^&iM?Sy8Z}?7~Zyt?<y#ub{j1b;gx5|9R=3J`S84tRm(l
z4p2E882^31d^IlX{m|kV?`-{=r~_>MX6^4xkol|s1ev$x#)kFgE5!ft^|eRfx!ChA
z=BA%{+$8uhe}4kr(d&bq3VTtQ%6h8UqYM>VD(?%_%AZ1`T2uTKS9~w0y_P{t
6SDE%
z*CBE)a(^FfM3w~y(f=cWCAmo@S8S!m`gl;*>8G?<YcD}puv^x-
6lLcuxfr&^Z!(9(
z-?$x^V#C7hH)Jj7>V<Lq=1?v&8$5Jnt6!;BkEz}$HLvPdM*B8rURiStxC_x;GC#4y
z&irIeSoa#pn&{Lp<NcJ3S0y*h1HP>B^f8~J><1i)EC6T7A2i{Y#JF;`$8X!U-vRr#
z%umtz+tK&avFB0l-v^eW|M$`VViTgSG0dA$UXwW`v<V7rCaRU-
QYAFokInolGSa1y
zua|g5lQ}iY>)4E6oFCl1pLZVO!~MJ~J3ly6V2j?A>(7zFeID{!z&WC+li$f~Um*Km
zM}e=zevW-
|<RTwDKgq7Wz~070yLO8485SMv@ygij@nl8Fmsq?oprzRRLh>jQV-5KL
z@Y2DbIhG~7{tdJ`%DwPKWamBL_fu~@V_Hu?e+7Nu>z>KvDz8MIlrlRPWfDi
@=Z(P6
z^Wf)AHb;0h{5<j?Ugo)1Y>6jH-
BW5<bnTo34Ge6liYABDyqc04r8107Myq1~LlJ%S
zxl+-
GBO|Grp7x07ymN!hcXPHOYxG*${61Hj_5LB=b^U&Dcj_pWnYwC1)+UQ5BN&
st
zS3~f1V0~Wj{>XyUS$BhtuPcskvFRGZw^o7gJu0+GxzaYVCLwci5xSz8IX9VWJ9
9Dm
z`@yPI#{6rGZ}yx%HZ-
SoJH}*h_eppdmb~%x<Q1%(lRZcKc$PTvZt=(9iR`TzNPy+o
zSKFSThvCWR@mDNA02$V?9kvgU6S*aBTacBD@|45Al;rB{ys6}F;QbBXMh3$8
R5qM!
zubq2PUXjOl;CG58Pd5K;yO$anjF07QWP|xPL}P`W`W$rf4-
W2rn|W~t7!$FHiE)a|
zX{k4zdg617U)+a3?H0d@vj-
_E`RX0uB>L@Y>I~v9FXmY>&QZvi`1)50FR&Z$QvPM?
z7h&tf*Dj=7{Og^_)J9Wuj=R<2|E0NU1^m<aaq*bjinl$q$HpN~IT0Nii;XkMA<6
R(
zpjR$qVpmfrH{So*Wd)U!u~oq>#1WK5?^2!bkb9PRTiW0&c(<anqQsf_vFIzw|
K~(r
zhkgRvZ^hF)D*WTnAG9m{2-;mGx@4TUK<<-
O=Sapp2;4s2ADt%gJb7~A9r{Ro`D2vV
zo|C+^%j@{giFxTDwyqyo+IDg$<jk0BX@zQB!!zi#Jb2?jV6<X$tu@oH`DV24)3Y
sq
zJWLLt=D<w$nP~mY^Qv-qE&K03U<}6?7dd#wBYt^KWE%6yj$3U%{acc2_-
;!@*S;S#
zGDd4W?~qHD@hHO{uTos|RcEkKg<b`}DDNe|;-
8>8e{RXYt;0nA#m9b~J|wRlgl6Ky
zehwN~aTBzEh4$;=jnGu~yxVlnw)V97r>fAmd2i7hTI}Q=ot5@l93Swv=;r9Y^J~
9v
z>AK^{snfUEIPv*KR_+U{Oe;S#Ud8@NccrxfuLd7<J+ut&AWtD<S1(m;fOf2ybc
&za
z8m}Yy5V6r;q>k|T1<9|E6#9(yhPmH(U{-4o{tM1e(56;=TX2@~uHo6Xc`j(~j(paF
zk?Y+eFh&cE?8r*$e3fU*uN!a1f<=loQ1P>0v+`F%cEyS(#D9_XRxNUYbvzrkEuV
Iq
z1D22A(8H#MO#^h0_blT-3tw2TvH8M0@w5IVV_bD$Mr+~sStrF8bYcz-
e9><wg*W3^
zOO(9u0X=(u#P$&)LDq1j>@>cw>}?lbH|t~j4`6dYq)ivF1!fev-Jy>=Xu};B>9_SJ
zaC5xbz?FEhRv(A|nH%vihXoF6GBe%Gqr=3F`}A@B+li?izB{yXXe8_8tiR{BA@5
?Z
zk+F#AFVPob1Cyb#$dd5D#eJf0TLW%E^wW8GAa=Ebc@y-
jP)wfZsFk<zUSbP5i<9V=
zmPtGG*YBujNUr&@!l}*Zu_!qBHwTCEEsC}hi*`|-=+`)Yg6MQBe^H@Azm-
1Gk?3&m
zyTJD|Pu`_W_^j!69Jm6VWs<KboU2wcC#p2&W(~S1(Wel6#TW2%wbw}P`C-
e0+k5<&
z;@py)Z*rj*vc2eNo95{9SIE~bv~pJHg+ep-
4R|#~cPlP)<T7#HQ1hNfm&Nt69Y4io
zP1Xv+l52z4cHYijU-
&{?hN9%_`pDhE_dR0Uh!3hv^7lh}kvZYy+sIXB){@K9<GDP~
z6q#qa5eyCfrln)N-y6VZBJXC9$CLb<_}^h&_HqR)BrcFXJjjxryOVshlb_9v?1a{R
z)R8&o__U&<Uj(M)$u<H*{Ie)N?6(=$u>P^~o-g~zt&6-
(7F!d~c^b5F?3p8%#IcsY
zY~}vIZw37l<9dTZ6?%mGE_7X=avyvXU*TKmsQpU&_Ih|Na#2d&OKhtjdCC$y
qwGC}
z_+V+J<O0jFFZC*EK6|>-
f*II$;O#>$Cm~OLD!FyNN^OmH6}Pgsd~h<n6}mY1nZUd>
zZz6j9jPTZy7u_rCM54ok&|BoQO&>eoqz_O@dk{K_Efih&Y0A+1Y4=N+rR&_b
t-C0;
zAC^mro9%pr9k<%LN{_t8Uazs(30V)>gIqT2;~E+miye1Mo+dYP6rEupGa|Qkte
F#G
z6I@#q-
%ZAMu`Jp0ORRd3oYXx5J!gInITeY+4eGL|82(=@+alLa9Bt>MUEa6x2gIL~
zIOjC7E&2Gt`N+n6_7CdBWIN3@UhqVJt_<vGUx2RvL|ZR92R&OQeuC}ijg2%Q
KSB@Y
z!EW&(BscIIYs`{o9vAr*WAj7*;F8rPtN~9KJFcaQei#>F<62vgamzdWfR!dbufRP
@
zu3F-I(cOYK`kL{|83YxQxJzQDpCDIi-P)cq$&(qAL&hTifV_i-Ry--?MU?l+xYIcU
z$FGc^nrOyqS-16Y9*mrMMD`X*yJJ>-
vaiFEd*+4c8Bbi^JjSc}y7G*aH6+o?*CIfk
zb?!=8=k+XoqKCfs3JlM>B+B%VXVGxkRq2J5qTii4DtUDF`fVj2P~mecVxRpxYm
Fb}
z`}nz3F@3nboE4y-q{wLcku!CKEQ~|*>We%j(od1JHTLJ{Sa?XE$yT35i;OrP!?+EX
z4dXUc*7U>{fj#tW;qSf(mMO7Q)!di{%?#o%g+5d1<EO%pPQgXq_Z8x`Qb$oo
Lzj6z
z!@k4#`$V4r-FGN>AN5$H%m!8sYeNBDO_jPJ(kAcpNvw%*u0!f9jF;K<9bd!F-
8*nK
z>UrL|3!9>15aN)g1-t$CCB^(ZyrC_pna{w~lF5a}*Wtf%`r`Ok+DM(me({OhtaiYb
zG5eL8rPyC9V|L)k*e~^6WIoGWu;-
vI>swjlC=>l4>$ws~9eq`sDn9LD*2lt>9a*nd
zN-
j<6&EmJ}cH2kZZq1>Y$U%;kliEyO@$uzZbcFPk=v#1hAh$+0ANNdDS*7dL%1N
@;
z&^0Dg@hoxWPUZ{yf@Vv5U(TGK1;CT~3w5(ITC_i3+OYxMg72Gid(T4NOI|lI?i
8CW
z<8$JgamonIm{-
&)e$;m0JG#q>2NUs;wIb>Js(8P0FMUhD(x1eZe(>2(8FO@t2f5c4
z%`CC%fw#aCyrurt2{7dOrZ}$uZt25|b7<Lavs3KBSa+}@kTt#%e>amD#9D`vGP
!>h
zT08f$Ze@)lLHEm9YT>2evWNE9(%<jsOUfO7?t!1zP%dlg@%rdE>ibk?0p;&fU
WTk0
z4<^NI*|B5Zx3L+bS4B@DUx$#hPz$uw9#Ea48<LpgvJY<|{Pw8z`L>TVJVvp3Ih;
F@
zF-m_PeC?VWp&@#(6kGZe##ZaKpT+0<N1lW14-
2y=$q*T0oc;<8xv<wpgm+J-shoxR
zW~_R(F`%$F60<L4{~I#b?VF-nt5<slJd~HJRQp^E_cFdZ`h`y93+y$C`U+x4;GAcS
zf|J-
KKhGY{+WZ}5EnhV|4CQL2k2ea{*nS0W8}rRh=&)HmlNVagp0#U6sJ5&R@n23
3
zZfzs}d4qnevoEQ7rO;9P61r!dHvZNTa&AIz6}geK2{mFLz(wk~$mcY(mdAXnlJQ
9X
zL)J<d!yDE3B=NcxDbU)rsIFuqb*|*vjE|yd<Htv_;RL&@IfnrstK@m&qS_MoqT
-TT
z>I+|z@l!<4AEEzp>R9;+aI()^B@MM}IaghxohvL6AKOQcS#Xwi-
y+{rgZxb_Slv_1
zxup%*C&9DUbVX`|uE?$US%U@Yr0}%-
TzSuN_Qk!F?rL3_>VB?TCHF_^bNiyJN`3@B
z;#2$N+!E(A$PZfhzOZQGz(&L7C-
N47&X!Hp7`LNO6X&=eo(HkdG9MiO(T;s{A^~{8
zncX&ft;Y6^qEE4JTkY)btHswXROn6{{?S|&J2p+ue9QiP$0r~5r)*!GH812?bY<B
H
zwOi!+b=~YZ01hu;qsf&;ny)cWwT$ANhMLE*#+}`BGRi;lGiKHuPwr1=KZnv<z2t
$}
z_wz<ol6qqwGNo^>`sf|rEo3hz`yu-`$vtwlkNZj7FGk*6tXs*R$;l&%pDS+p;=l`O
zY7cp&NSaDI_$oNnCaFD~L5bA0nXE0ri?9m4sNAi{$s4R8^!vc!O3wScpE21Z!yY
K!
z*YUnubN9FK4%~N_A~&hXQW@}&x82ohL_hoPt9&Z=Ao-
lgN_2!yZd`mO@e}KL_7|C)
z4H;{}Usa@H{;TBK?yu=8&UnC=L>nM7`Qr?;gM6ZOekT<g)FMyqdTRe-
u7$|D!F8XW
z((fX6u2m_m$S!np^&i{Xp5Ly!`^&9*sr|?0S-
F<rJ6HXP@%#{Z5;(==zMfJk2M1M}
zrSk=*#<*mBlD9@jWJxSM5#1s=zU_K23pv=VqPau+anD+D(rY_s@Er<|JD4T&
v4;3h
z)`)%d^$%8G;DSF`44i-
C`O@`3Y>@XTc~ILA&51lhtSsxrQRpqXtJBxxM}WKdw`IT%
z>}tt({94C8$$o$+bAvTUYflLJ!piH*+)&SBgC1P5Mg5z9i-+HS=7DxoYNehtAxq9I
zlo5Zvd(zq?Xthb4KjO1WKF7rwv)XjMay$Flo54+JFSID)*DPxy(Xk=lPxxg7w^=kg
zF*bC<I!htnEXfvouvxt}F4Rxi8)pW$e*eVaR%z?oJ2oV`h4(M3ux9zh4(>zODeV
=}
zhr*4H-ZG)1=qu4x?MgKSiTf3Lr&_tJwLGaOeyY{ygSl30_;dR8)6R*x9N1;aoUi(c
zy_W*oR>(dHWwhk0RQw3=^Z4B%#oC0i+V;tHBiL=S_sxQ>v=CSPyI_U%Y4<y
<3-B+z
z(|9L3;Zf`%K1qnR-iYXh$9O(l#Cdc*$2za|N%Bt)@E&5N%<vlj-
e{I;WpCo+U87ZN
z{i(sNvZmi>?PIt3Y{2h}{keEf5MQ#H`6qF)@UjcJKKEPp4x)>dAKeNcM3&A{rue
s
z_yR&ZiKlnaj(n_FMaNrb2Xc@R`l(oDoiF+atB#%9u=Zp*Yx|Kb)|kS?Nkg&XF%>
$*
zKB6FU*2lfr=g*)&hkcWuS~)ivgPp6feFCA|y~stp4@(ZiU&aR}-
Vy)6P^E{LU`wqs
z_N~^Si=1+4x2Ndp5c$!qZTQh`71LUYnXNsNzod=S>*WeBUsjvu${FO{TDlDbes
&A&
z>F~deb1pNv9_HFkK1}xf$Q<x6rvgu`>yh~+G}*qyK7%1TOy*=YzPZ3@iJz+>PJ
*r%
z$%f@ye~3JM4g5qV#)9jf3ZoSr{IbuuI<!aETZLy5Kkl$_=3Gbu@4gb}-
KIG2f+_6z
zVlHy6x@cVZ{)x1?AAE)9YiO67r#j{Su>`n}#o;!_;TEdg27_@+y+;z-EJ<jygf>>6
z8}0bY;e*Tp^e%ZQu?5*)7jcY?=TVyn!?Af>kIEd9dX>QTfTtG6@2-
Tt?xHV|(<bEQ
zeXea>CC7Ar?cZB6>DXZ6Ol$9_&`{`m7P~jNK|S7xEDBzVwFdIKp@8r1o~Mc5g
?6&0
zu^+u_z;ks?Mra@VXkG&6&A$_$9>12H`p`IquJ}ArSJ`YIXQs`dnk{l8-
?k~_9vWOS
zzMolgewuk8`9Jm<q4W8+5jg^6txfcxy<Z<%QRV_q=IeC9RmM3zK2GW1(a{Q
e+w+6{
z%LOto>@yuNLZe;eN}TzN1Nn0B>A5lZxLXmEMy<J$9U-
6E)<U_|^HA>KUk2@`L4$yO
z&dZtyT7e?RlGFc!MISrABfiv&r)*hw&XC!D)bO5Zv2WHs73MSh3%%BUP4<Aq
uuV6D
z=g|#z4rZ`cb;^F*Dd5ycnaIKaVhn13Nw1kA`!_6K-
1{|XMUr~D$k+^U+yjm`a$Vpm
z2#umGev5aXo^PEo7G7k7w_Giqw?c*X!ApyW&b*KNG59LjDflNkLF72D4;)#J
vOnaD
z=w7K800*fz7CKpVg{E<x<ls(x()KmZSlmm!zb991=_!Ml0UkJYMMrFp>j>E|I|F
#)
zYm`BkX2aEc^o2NW8f2d4dEceqKFWkP_0XoT*1rFMatpr50A(@`sk2{b8Lz*S`y
o3M
z-*fHkx4y(D@%{=Lm6_!CUtr&toUbfbk4rB3r}P8v-
ag9b(!WDTzZ?E+5Z#{RC8yLD
z<sM(80w=m{62BpuLTh;^_z4WD&l-
7KfVnutBka<B!XtR*=m7aHN8<a(9Ucmwpeb^^
z+kq?jo$ah|3vHzzng7P`2d5v0uKlzVx(FQ{-|1(+6WuYq$JklF5?vs&TEaMF&k`SH
ze|dpxW=Qt>uf=|^EmonYfhT+NWqjk%*}>*@JzctLjkyXU*{Q5ky2du-
rl`zK<P2ob
z_G$X|;5(Tvv$NF2{vGC0OR_oJqK{D$(iYuR;{WZso-
*FscAzBWZ}9K+u@_%_ld>u8
z+jM+Vjj;u?v$1D+UgCky@5;U`&L9PEFDcPD%Omh)ZB-
9`w$p)Ks>U|_6?n9;J|wi%
z&{1(3cdH<4FX&jIyIQxdXCdSB8RRG#i^e#FmI{AsAA640ga4&+WbfU#_kIUPn
#|)|
z?|$fAN<LsaV=Q&)4Zy70z*t?3vHf;WiHH31zfxzz5`T$@KFf%Cil?aA9{PKea-B2f
zWsF14zk4<^4*CtM6El6e&r}@M!;Sc^BXz!UP>t`q9sA^FFNMCYu#(*HOxL9GS
+&aT
zJ%+9|jjnuXw<Ma~ZlB+RpVmGd^r^&_$jfZWOGLp>Bfd6yFZl-
gMs3=@oe^&%b@v0)
zsYjjZm)3DH7HGa%ArE!nFLA2uX;zHO1s#2S^QRVC5@$5PV=JCDR~PRUx(A8*
q@KO6
zVR&6vY=GpdgkLJio(`pE_rot~0}h)#^i>Rw9@_iqQ_&~iM(S*4&lWnPsu@1alk
4rp
zCARF_xkn%ECD%|kg}fB+z$?>7JMk}N3^weNkjPOv@EI$41Jxj~x?JQV$m1%;l
IXXI
zJ%Vu9jG2}WkbF)TxXOGAk`pUr@7qskFEq8}C?P*Z{;i>gcjEWTnt;sJyMJT*rjlDS
zCGSBy!EZltj7i==@Q|zH+hbP`f@6O%b)oNO$Dj3~D|~b8^Mpapd;zCh&OIjTK
EYe`
zMNs_AdFU$QGSMNj2a)<)67_~v=MK^P65o^_CciQ(N~~5Wds9-
{x7lkN@%&bN-&z!%
zw*!3_wfE<*1aETU?F($*-
QMRSXNUW8O*yaGUt{}Sk<YMZWa3B3JBugSt|I(k$zhoE
zEjFVISd!l|xZ3Ao;(MEF`E~|<I(ZMrcZgEnOu5jNHe33}VE;D<*>84nURwBx{7J6
V
zJ03iO;L*%Em3iPMG9vMv*g)MBS~&Yv59~aFzoqoT!-
7wu%n84&G0?^{o$ojy*HSN$
z55faS53fR=IgcEAlq(Acp;wrHmfXaBZGk6iO2Gwzy<PD*DNLL+A6;hiU^o^Mxc
uL
z)Dz}SEpTg@FX)q2(LEwFbNFpUAIl#3Taf)CWUd;yT`Xf}4i@5<TGzM^ZNZ0Ee%
YUB
ze;@K&?+@n6o<GrRHR!c!Xk3bJYeBYUU!KhS_C=p6smVxcCAXC+{k~(#;&5Cg
G>^wX
z_&CWSu|<+scg~wV2#(JeUmY4x*|V%KUC-|rZRYZfeW*B&4vx9Td-
J$o>&i{b<tpni
zYvw&(@*#HPsuXoknJe$=D0_;Iu+~*eK1yV_%+*fpo0oQ0&rh3;?HXVlrLOS}
WyFsA
z7zcU0ikeKx_o&SdPXxBu`+L>QP+4$PXP9|TzM`QvLsh+k%yzv`j{ckG7SUG{Gf7
*C
zaVoj4D!L|Aw#XPbjz58{RJ0KX;TK1O<hdp?CJow3%y5suU|x#M6|WCgpx<K5
^OHNc
z_hoFz*Ef#pEXMY~fNxvO+<>pUed>QqmGUC|vxWEwMfgWWTy^ZpT(zlUBJ
x+R3a9#1
zlD8dL4xFNioFSpT)bpu48^)x>vRu0inIEo~ZI_`p4$!s;-7x%al>H9<GhCK#m3i*w
zj2-
ng`tqpJQ#J5a(7}=Mi_gc|v2xGND(f|TN}*Q`^6No<ryZKs>Yu4*cip_Mhi@{q
zn!KA?pdRPj9kMn&n>`(w8<DY=9_l@@?%At2ONX3nd5bfD$3D$D^9Ex;blLITF
_TZf
zCp=K>$wTKO*G0&C8TT4%Vw!;*!;|;X%i1mQfpTeAbKmyo{)svF)^fA+c<x=3k
A2#V
z9izW1dH+SOo_M{Z#d>HKypFbtuFP$qAFrSJQ1qL1Jv~c`_U_NpT1EehA78|ph
s=*6
z`fUKl+auJ>x$yru?_PplvM;9(JtO;_#s1YAujP~LUJ@oB>F9lT%86O7;NMnkRIar4
zyE)^+I~V7fYco<pwe#vqu+bSCHWjz}*++>FIn}Wvud^O3XSKvfILbaAS+{%`c@
$gc
zJWJg41L{e>Pwt=NUTliow=hQ0%kq6cd#~#Lo!j}glDw1e{mD9mz?A0(d}Q%?C
UU)j
z-+uf#dr!pvoe$8)sVBJk;?HtFo%zi9;Vf%xcd%B5ezL~4;^SjOrYu`2*B{fDrGv2}
z+mSs_Jb&WoV(MgxUUg{rEcnX2lUzxV`sAWy9`07yo?pXr>mB-
BF>j>IY4_x%?eNu|
zcE3z)$K0~pU9=u#+W`EBRZkRFHUev!J}}ej3p|ud?fGFGhMXM{8zi>K#e70vAX
C_6
z_-D<d1RsORF~h-
EV~)142bu9!7}Ph||0MJg9x8BE*1J;qu3D}^xy0e;*Y5pT?o0U9
zg<YzIZZa2ad-oG7-
WMBfoo&JPqkrxFsB%tig9_cunB=;I_6D)O$na5~t@U~8Ux&Qe
zwmflf1bY<Vh4_OqX0Z`s8|1v6HpPs|SxE8{dvf^}f#UlTF@5!xS#EQdrXD^uw(g
3`
zXOmUTV=$M~!i|sO19gpS-
`1k5$?Rq54lY!oO!VwGM$4YPyJtSDsaeD+Cq1i~<0<X=
zin+)cTrXaWrK6INKgMh2;)3TmyG4HbBE4muSA5-
~gUYz6_XzYe$+HT~!#a7}8(GWL
z$5*O}W4!@=96#lK7T7X392vSx^5NJek#~5IrCx5&?{ZZiKG438e67A@Kf1#QJu
Lt3
z8u2HF{SK*@=vPcYXAKg|N=z%?tU>Orb4&t5p%c`LV?sWBoJq)4cE7#1PU=l7U
{5Lh
zXdcPFl5y?%B4^1mM=2A2uLnmv{>}EXna7G<C7&u~l2?*Aml(C`r__`B|C-
SD0Qa`M
z*#4jFpSE)-7yB)e<1PX(p@pBlEsn2Yk8!xJ*wldUdg2T6N6=byir}D|-#}M~8|9nY
z8n`&$M#KhGy#KDXpKiu`_(r|xel7Twik8oZ8|B+oif<)eO_{_b!s{C9JAF?jc6Pqg
zCwLf-
+wqdaJLJRiFNJp^KT@Y0oGgC%CCBn={zT3g8$s9j^@|qnMZVI^iCyI1m8E|)
z*0qQ0l9Qi~uO#0VrY?4)L1m~c4?i`hWr5X>ZvsglGC#D}_H}FiB=ib=HC3o`fHfTa
z?oxahuEcu53f9<i#4brZXw%WwKRPhQ@6D$F?DU>|dmol+U~N3>-
Z@`eAUFw}D#j4l
zrZNMMPN<alRN_cK*D`cL``6i5k`=6Yn!Q-
aZN*rlH(#DtEt$UeNy?hJ%9^#*OXR;v
z-
5_O>GnRI;H_QjkT<Hh$7Y6n5GB(cCR=Vli=ho8<zFpf#z4}FUdyBZ|n@_j1PRrJh
zq}%<AChnDSv6r#I#h8davlh--
zre+~6tpiFSinKHGT9GP*%GIZANoi;p^XQa+M;5P
z91Z4Pe|C6YE@rQp<_UIV|GSGGFa|^p<a>qf<gJw84bN?w+Up7Tp0&@@T$
KRhM&?)-
zv{Jw+1CGXeiUY^bv)RRWUEz_FI~QFi`}&FTu={deIVEE2K37EK>Z~g%V#h0P;+
5pc
zGtgOgjb&X@_FIpQNDTWFWk>ZK$|Rqd6Dfxl>nUT8EoIpe7jQ(*zeE{*AChlqJ
<NTg
zUX!)o1B^rCtdDkpZ;d)@CK0{`XMVfUko`rhtr<$rtV!%;(;$<3U2-
d3DWP)e)G~H>
zY{_ghaW(u2$sQVYlge^4Zk=x#DfVX-vGyJ29EbQB4y-
}+v_q?)oI?VSGH}=EUuR5$
z2lVW0;arm7XyMe9PrPa4)eN5oEqKGWB^%rVMdPh+(2V2$a8Z5;y?n6w33XE
FEViWs
z-9hkt;%w2(ke(qt6PuSS=j;yU-9I`MxG=Xz@}lS9ce6gD{~cs0k#?~Jo6tF7ZO^at
zD_Zw2dAuY@ZU~)aomnb8ho442?C+Re$UNH#4DKa=y(c&t`_5JPXYptEs1QQ
Z_C4tF
zE%caD<UWyOa$}JeVu)YxPQIV9XM)O-
_1E>l?4rMNm0!7@K9zi%+}fw6dHeX*g^y?1
zw<dX~dBi*ln>Pdci~begkG1lU!-
J<(*T1;g1Ne4E*T1lrG{U)Y_EWpik*Tw^@R#v9
zHE#<($Tn~&4yuU6Pacys*^HOFYt`ai9`*uwGB#{8`CgQK@6u$PK4tETwquJ^!^
jnL
z$gMgKq>@8nK05u52cG2nx~N}T#GK<h$BOyl%sKA2*n3L%b&$8ulJz|CJ){kJg
sT0}
z$H=^?7yoFB8d$kSxtn&$cgf_tsn&h=grV<+sU*S8f6CF{f`dBOULi1l{=wkZN_-Tt
zNr^h%$uSg88sBK|xlWGsfole~4*iIKHhkt-#wB}fjc9v?;#)U`nraXnu>qNKFZxs^
zzSEI))&4KyQ+Ihcb$5O7`=`42etXxRC%e_^eW$vhl|Q|`Tb<u|3fjf|X<NF(nLAD
$
zrM>};jwsa;<=(};&N{NJC9`*?!4H0>a?clhYT<Da^9?#yh~5)jQ$%iXp*3ICL8;@3
z=e^La5!v@b-EQWzwLeE?tl!4mo=)sy<;EP|>2Y3&9uQuH8K-<RN-
6t$Iif%Nh^@4&
z3B3nsZw~S3u`MS2(XtAL`6Az0i+^J*nrqwE!t^S10CBwgzWDV4`<nh>{A%&hI<
FW8
zU$J{Zt};eHSK0exa<%i1_Ig@hYcf-
w?@`s6*eN>~bnMxbjyIo6?RfhxS^u`@Z7qDd
zM)V}~@ayDJ<^0J8Jv3M?YZva0=myp*u7>x?=!?%&mNKU!nxgZY%g@yzzEY5
L2lql7
z+aB8MWyFG^A0RjO8sBhyFddvEpA%ew{ZjV6F{Mfmujg5Ejb*82lMVKS1oR!x
1xD`Q
zCUBg(Qg6Gi=9jAM{#x{{rJoXF1ZO=!;w~Ap?6VhnvFuN=7LxVE`{89u>i%s_=!dt
0
z+H<e*d}N|J`D7Py_JdmHOFVCsU+~F%^jd%2q8Zkng`dJ7*~{^d&`WYAUuO?
9vH2TE
z<ojKe`SqN%A$@7Bi`sd0Iln1u7_$CE{d-
nJlOyaOcn17w(~uo*&zJawGaz2!V|dA<
zCCjN}`_jYfantcjMVC)|&>T8@E&5vWN;nUP7PwMFSMV(B99{6yAYPJqY6z!K_
+C$8
zn_3A@p_&5DO3@aZP=TGxxq|%_0;BL9ZKc?O!e`=F>IX$myYQE;V9z2pM9xg
%wcS(r
z0N;mTOy=kPtC?>Z=1%*J<4uf3`j9mP@xA!lBUNYQ8x%K7yp-
eRyVqOR>1K?)A-QrD
zdC)!Z_hI%!<&o#QmbOt>!9n>Z58uMU7Y|k}0zZX*Kf_*f|8<Elg4RBW7QXKS-
&TGF
zyrmC;FF86(cO97CD)IV7b$}stB<6SO2tVjIBDzQVSq+?X;F@>(OIw=275;a(!F!1(
zEcsj#DCvUUdpNLp##O*L@*=O&_IYq=ciFfI3~4X@42T{D7wP8=dRTO#^s|mS
zo(z)
zsaH=wFA)zqW7n)RElH7EWxoMu1<sHoJPnQ=w0(|#n&bTl3~4X@oJ;8E%~>k;
&-C@?
zEGz$P;q712RAQnp1@F8xb&t>{2U%(xnJ;Sq-
Qu?h&wdWi+u&IZu!)Ji?4R6%u7GEp
zA;YIj#IZ1r-v-+H<9w=t#tH4Lb&B=iTpj0=z!jLHE5w%*+6d1sssjwEBja-F2>nF1
z%8=VC?$Pa;@_Y~XmaKud(DgsUdkOUvGHcbj1V@SGF6uvy<E8yyROb)iDDz9
^l<HFV
zh&`#E$Qgp;taTvMf^(irA20e_e4gd-
X$<$K4_m?hEwMv|@IgzD^4<Dqx54*JZQB%&
zA1z&H@8|g(w%zeDY+u>gS9@S*-dlWkD`79C6JyKXF!g|ACp6Z{*#q-
Lb5Ct@`?hxd
zOQ$?)?UvKI?b`wc@{MNu?>z}V0bPr1hsN5bVE014E!wWHIVEL*to7TzHc~Zuc
-M_Q
zkRONyP1ZiSVsLYG>IZbb>BSf|=6buXE%7s7$!}S8_YtoP+_vN^vfB0Jm0_97`eV
R%
zuM8xw-
WA9Sa=y+Um&9Vuny@Mhc8fl;X=CSmME8%Cy?w4E@1AvI$BVv{Jq&xksWL
@Z
z{vP@LzT`(XvUd{w%DS=q-
L5Tp#l73k7WHnEoGd<Nzim(Q4kBaNCiQe+{rYW9x_+?j
zs$OuJMO>5IaVC58<fc2Ow?<R$oGk0U3t6|Vd&=xs!&%e&Q`8$9m@_TFYsY>
G9KTy-
z?PT9ismkrI<+{*i#*U2UThZ*Z^{MPup@Hlvtl?cWV0QBDD$exgM-
=!*1K8qeW{kgy
z(!Ys)is+#?ilD9353{#2D7h-;I&<v3?a=S*_$7X5r6z(e>;497Ud23Xz*6g)p2hF^
zw&!}j=OnhwZSD%<@5#CCH_>OuN>$8l%K7r~#9mj3&e?jbly43~NBLU{;yZtV
vSvNE
zzw0A8dl=^pYdsg|!R_2yJL6ppPR+X3KQA^|6=t2k_L-
(FVkc|Ho1OAqHtFX9U<w|x
zCM`Twm;e2Lh5{{b%l@Lj+`pQ?aQ|h0;r<W4W#vKsVhqs!!sGA5*8Rl>PsjWJ!u
`wN
zF}m=a8T%spEna_fF!$E~m*qinT=F+LB{mjZZpN-
&cuvLk@jUeRmG0ti?HoQ=b);II
z?BXhayCe**e-6I=q5i)lv|w+%hhOxm%#Ne2;>#-
Qd+XTC&==Y3jvYN|Vt=1x&#PkX
znb<TEZ8mr5#QkOb?JijxI>z613G1bYZ~X+E|4{#5_#^$_oX~&$pV0rO{*(QeeM
0>|
z2h9^<{Gst*#Qz_~`Oj7OZ~U2X`$PSofAbIX|KHg=?C?M7PoV#gkAGZd|4{$G{
v-YW
zFroi9*;D$*<nMp}C;Q+33H1|s_h-
3hz5CAs=f4W%a{rg<|6i4zKS#U&=JFTiZzbA)
zE46v(Z>4%zBay$G%3k}a)|oB-E~3`;?FyyJ*0c~0CjQN`BlrnX{!Zd=<?jLh7ykXB
z{vFt7|BJBy6m%~4|EKc5<1+vM6oL9r*7-}zU$T~AVO+(cnf%-
Rh<&|dnSDJMf1b14
zeqI_cx1W>>$KP*`zkeovb>2JIuK%F?SMl=aSJ*XQi(e1LuTJ~_+t-
YZgBA=Ue*Gf=
zZ~B^D;g<OI?)Y^<{8|^kQtLt-lyhZiMzOp)^v|^K3gZRNl~q6fu_omFGo711>6)6I
z`X2wRev(}y$7GGoH9SSLXJ1h;d-
iPa#H#@EhJN^;|4onT^6%K&{O62*QhL>KREv~m
zA>dMH2krmachAM2Z?~>f`0qEZyA}NR8_Kt8@zN&aM&pK(8)r<paoUt?jN4Z
&Gj5n}
zOr0|I2KDIF>t;-9tY2DR6R4kjqZ&E)jvI`?sue4iH#P-~va-h7MKh;gyL{Qw$FDQ)
zwkjEc`X*x`FzbwmmexFMlvh1aecPSocicN?Zgp8%MftpGQ>!cH-
dbsV#+bt2W%AuI
z?S>nTD+41{?ea%f)HE$#xU^nfzamh(SY5Ab8XvhvZm+%Jx+%jCQ?8pj^q>Nd)
T-JQ
ztEvO50xRm5)mit;A9~2XE>qX@E}-
h_A6;BqU)}Whih6mW>X+5f&9#rzH!WITr><|T
z57ak4T3<)OBg-2fSH(4Tb(96Jt*u|WG@yzDi`Uf0?;C5DJzO79%a&jJNX-
h>SpTpZ
zdE2r_YnCpqGa6SdYg+tBJ>zeb-i*5XKyBmV6-~<<jVo7-
gmR6I+%8_WxM?x<*DPN4
z@W+}68AeuKJNJ&MMs3Y9W7%>jS#PWg)Ys9@ruMX{*Qx7i4?6;C<h{%4SFf
nAZK6WW
zLk|h;$Eo?yawE`G(^P*Q&>ZZVY8oGgF)NloR^MnWt$(zBsqql##K~qXUs2x(@
s}@4
zXfns5no-
qQUvJbjF^C(DdTR_<)=}%0n#D`$wrRNmwT!zf%WpFh8!TI1SO3YiV1QvW
zz_1w*kijLi9jR)X9x`o)KfJj1+UZlKsKv{g=zG<QrT{Emv^-G1OhIP|IYkAU>Xxr+
zx)#}4l!(=en%ag$s2?8!(p6o909OYdtraNNb#6t)T@^PPhN14ftLnD$x!kJz%PQ`?
z?ao_oG}LW(-g1|`G}L`_D|~lV@><QkW1144-
N4;cVacMJWpzTDxvRl>S<O<TY$3D7
zXsoZTUyPI)%a<8bR$sYvwee8n@<%MuA6dV;wtj_>pISA6<;y;E<tiia__8`G)PF
`Q
zFI^2W8&@ozcB65dLkgpjaoa2a2VwRj2xT?ws75dWR$aTOzP4e~WaA-
=SJx%7?@nZ^
ze%bO>4=;iXBK5*anuCBey>X;*U)hZ|n#SGs9T*!j6{L6#_ccvTjdBlacbDCHTe(p
9
z?s7EAl+}v=%RfsUsZR~-RjbrsAxi$a-
S+$G@%NhpcKPo3HF#)DnUu_nd!f6t?e~}d
zclS8EWMllA9&ayys80TUgH4N<|6QiQWeQxTz-
0<trod$iT&BSPpDDl|bt^7*u6e()
nM>`b1p0J<UFK_)be|zzBym;thdufX8S~gsHX0Mvk+}i&Jmn+{e

literal 41067
zcmeHw3wRXQk#2SO=z%1Io(Kzt=@Hn5@ryUYajez|Vr(2gB>Az#HyR;i1Hynb!
oi?e
zBOtaD<z^XK4ma3)H4=8hjI%c^h6Lp%k$5C=LXx#5i_Og@%Lx3IHwyxc1{-
w$zk6C5
zu(R=IZ@zrrUG#bA?(?Wqr>ag>ojTQRaY(lO7y3)R|H6|0LesrG)yovPOo7W3xJ-
e|
z6u3-*%M`dwfy)%QOo7W3xJ-
e|6fh}pT9fb@O$ooRso}Gl7M8@Op5TOU4NCf?zN1B2
z-}&*<YKZI+aUKaiuBA)2Rem-
{T8ouUJ(7M)pNJB++kX@7<yL=>WK2T&)*d}QIH+gg
zJ|AVzP3#+9prPE~W3b*)*eAbS+v{}5$x4xO(Stof&&0l80ftv(&hK%}%9Yl)EF5+
L
z;Xsqf2^X&T9iD|cv_rWXK>uAXf1z2v0p)&?S7Pm7ae1xw^(gN$r0+$*%LWcP_
IRe
z7r%&>9q!k1!pF4n;p19vc#%l!GW-
k^z66R1|2v8aKk1K*tDyXj@sjObH%h0!|08s|
z3po5|>BPCL2OJ&vH(>1CG-
<sK;}^ejOP~ILcc@#dIC6gDk3;7*37krm=qXKc&*iue
z_=ZlU8qxC`5A3|CO_>rp4Ouv)scyh&&3<6k(5bTGklhZn*h-
pOeY#AzThpcW{Kow|
zUrd+mk+A^B<Zb=}lehc9TeENLn7}g`(yC@k>)!!BX`AIWIwM+^yB=^Ti(f-
MdGWl)
zYnIy{zekIMkGYfq7vIV;0kjE&H(OnWV*-
zxePhqv$$<@c4g;<mu%;=ttSpRTT*!0L
zk=KTYw;e?rn-<BLl1(`((5D9aHE|nhN^=Q*#rVk-
BU<G!qONQsDuQ(anI|2b$x{0=
zWw&8tFZ;UCS6^<?o^pO+csN&*yO-
E>egktPKO&muK8NvlY?i<l@t1mk>D(9562gC<
zOnTaU`H{stlP?mEV2z&1A|G)DFK@h3S{)9_I1U;>cHN{K>E!`EJg=n$&Sa6t2X_J
{
zc=Mx>NvEx;0aG3T^Ay)U;Juv)UW^%<Yu4{fHEDVrW!*9~7jwuYOdA&GLE4y
OOieS}
zUOC3(ojZ78c%E6lE7hbQdGn8$W90ns9JBm&mS+RctnklKuG{4k(niV;qTKu8@
SJ-w
zhrPEDeopwz1Z$oqjQZ5Tag^C`DnYNvx#2mJK|{^Iug+|9$0)oV96vfdr^Kw^Wz
{!~
z)<4Voq2W1I@%^70t$!NzPLbM(*0$uw<R#ku5ZCh?|Mx|_Ia{TL9stf0CZ-
0?d|tI^
zEu>|3cq?cLTD!doL-R;GmThrJ>-
}hd_V&~O>s|t_8xv(lu|vwUForIYy<?UVIHpa&
zT(itR+2n~s_VhzPy#Shc9Wp0)m(l4=ms$n=?gKpbIk1Fuw)&8ciR7;;d-u96dbY>t
z$u^`V+Y_g;pe1q9&kfJD*WQ`WdqQWcN}vONV(N-
^z<2`vgW#PxcDB?OpC2x_$NN0y
zMHs(~qY>%xKJ<zyU;EMmryzT0Aj4emXD3ROcIQ^kEoo@3$-
f__1r*SLIBl|VO0;N4
zKALSl<Xp1D*MdLfJ;yi83$HNCuR^)`y!?uQ1N9o#qK)HgNx=Vtw>J-
Mf+Yg|ljF|i
z{jI#ub!X$AZD|XFi&>T(_Qvoa|7>_B{4LgaU4Y3xTNHok4owM|bwR6+{QN%ZF
QVy0
zu1$-kq}T7_=tcUN`mG=@P!9gJ7EBDZs#%9gN6J~-
<8m@OS)w6D%GW{X>@AoRP}BWA
zpjjr@iz!#7V*}r~u(0<^jQtzv+N0|Hfw!Tj%(WcjX>{@^4u#H*z1dpUi`{_fPc-H$
zHNL_kk(xz#c77<e$t+JX=EGLk?gSj%M|DN^`o|j42(DO<VN=KNx+0Jdo%<F1r
oi@5
z&qhRMgRbGGL?fDm^7%=UG2bbf|BN{kri!r?$t&Zyo@~kVh~i$5FPR;x+KkhQ
Oz2uS
z=GL=WlvJlouF)<Gm;cRjSE0)xfe!$~)sO&ksR7sW$9tiB_fbc=8XPE_9&oLSFB@
%F
zuw0L|W0}M3dvRIf#bx!6w}_+%M%#?Sx696N><S%+UZ#G19kTsf$WehQo0^
+8(xV^D
zQ>7p!qB+992i~mn==<}I;@*S#5`I7WtC$<-
FeS}d77vrQ;}?Kg$$k#WButlnD9?kR
zh%2QZHU)AAU6By}4Pa8|+qyp6;V;c{7@gGjX8^~SIkC*QNiy2htePtDmi4?p7<
WHe
zjmb;Qj##=s+pWgrtQGxV1U~<Uv8a!a9aLsg{#r97V-L#Ti<P52)-uXHlCc}*?_7c#
z^#FX6Fy%W(^uXLj1<j4>_<{B~d8HlW_?4>hm}`n;7Bxui7){E#HakcYl=FV6YIL&
R
zv*7k#;^swpJIY|cTU?;AvV2aV*$#5YKA!9ay=?zN91K2x6VJX(3H*zR>kmihNIW
5n
zrIt=pO<E9t_>!g6Wwq!>TWrxHJG>XPU|H8D=*i*Xa<-d?-
=nwBZ9b}I4YY&a$Fw=7
zeka`f(e_xJEw{#k4mS10p`GQxC!PjV!6UtUT!sK==grpIT#C7Ij-1;Xz+-!xE|G%$
zd3#mZZ_vl21L`?X%A*&$q~GZ;mDvlU0$)dQNT=&F{!&GxleA|&>lD=K0-
DxO%9ON;
zGxb>gi2n!w%!jt#xoDeiMAfNiD@OExVJx!@_v{aN^F+k#Z~I^zX9N!PU_IdY0f
+sw
z(5LdzNtr%XW)i1GfX6z*=QwP$GFE1_mrmP%jEAeBo$KwpI_VP=Pet+fc;_ZW
y&cm6
zYBuaD@lN#j*f^cfviv7|EfFW`Z2wIbUR+ZmMMs+OjJ4&~9mUgBhrH@bX@A
z2(!Jf6
zC;_`I+XYow?3Ap5D#*j7zLoMN(7!>M_&WKFarB!LqQqUn`do@<j{)4$_UE}~O
NOg{
zQdz<BrTbu$Y9w7UUHHj@rX|LdZs-
HaWWQsm!)_$ggWu8xo0e#RBWVZossO7Buq0nH
zz{j#C=;$Ko_HL{>_H#iN3-kkd>hj6^J_If<+$*?`;yzxlWC5NE*fG6Qla<z+2bs^j
zcfm7Dh%aH5V;tXh$?!cosmy@97Qtus;#!P7UfVYyTbcgS1K^vEF?003JU*{mIe
Xua
zP}YbmeNVQtcxmYY18w~%I|+Q)?>w$0u)U)+I+!;F^V0p=#7&@)I3(4iOR_~5>
Q$4U
z7=t#Ax-
^p1mdCk!07pwZkmvQQ6PE%8X|)V<IF4}$$EA1YdGTAgeAzyiB;2lxqzJCY
z@+qcGX^+to*K)33>Os<zdjZ1t0-kcHt4A>sxEI+fh6KJGtFviq=@$vlfzGBsz<rsr
zz~6H)OIophGqW;o>5BxLxE8(&A8)o#HFo<mjZQ=Kc|P^g-Tp-
0r_c4N>vsDdH(Gq>
z8d}VDiEDT3+;?A>T*i4<0!N?v&~69(P3~oaYFnOvcz6zdq91)YyloR;f>+^^^aZ_|
zDszg{JiX*!Qv&upvVJ#k87V6UPeoSmM!VUd$q6|zHgM%wX?+4e7w|4lgWjG
hwFd0>
zx(mazn}DP1x#hhsdALPOYU<fBAvl-
JmSksfQu$gJzCzk23^>9?eCDNE4{F<dy_<u
zVV{b5M)!Y9qD@P&$HhM7z^05)1b&;E?C+uPO1trRwq&0<cky@wp!bNLvG&
Gc7ijIm
zx|xM}!<P%&>mPfBOWH~p`Vl%!GOxO%?bi6V;2ZTsKH5mPBXAshP4H{>EYQ
YRkRO<h
zYpW+e(5Pk)cwh%ApD>05evU3hN9fnYKeNr|n7*+0hb9~~1_$uYnqymXJ^TS
|PO<c1
z?-F2~fbvb*8<}$qw=-
ymeMhYe{8ao#v_RIkxD;cq1fl;C3u<R92>h{PJo$Zyo0LMi
zWOIM-Oj|z)St-}2-rg(z%3g6iuv;?n`y!1`Aik5|=fzy4KfiBjB)?AtGAH?cL0p5l
zsxFj0_vyZ3f3QbxUffIgI{GZdui#jI-)Z>LuutxZh{5oBmwC-
{hp=94KbmwnggHwB
zV1LbP#u_5I)*80gH}usuXTH=$Am>E|T3_2dtq*ImCxZ24(*(~g)N$;iz(=57fP9$!
z4De+?)|Z}fbDuOAEizQwB98jq#8uBi?2Gq^Z`rWSxW}Ksg)j}QUnS^=&!>D<<k
8)X
zhy8na5hwUfBRE~$fBm2Aug2yDztDscjN!mF%&{5k>xUgwGAH#Nz<iC7`F^p5
yi_vt
zN9Q;a&*%!l_L%Vufo*0yqvQ8&r5(x->YSq1G+_)q+vq&aF`;X2qpvc-
=sdya1yZXk
z*snb8&$DUgDS%&l;RUm=i+!gUoo}!$_TSxtwpsqXGvE{Zog&|HrT({k<QN{w
MknV8
z|Jx1Prg9IH3_meJ)YLBA?*I;7tX;+>_)P!F3mgw~90NWj#w|eGBH+)xj~6&V#<
o?U
zE#o|{2IFa$F{RlnO0$hO*DUSNyV%nn1D>|*y$#x6U3b0%pMDe8%@M%yitN
1x_62$-
zn>71-
l)VL94a}wAA@^LJAsIzFbR_z{3_WS;(O^<Q7F8BPSEuVw>CKGA9!A`!05JQt
zM68qKa2Mbh=ZE(I=KMFcRJTBH9*{AM`?WD<{r6e_;qacHrb)(6;kSJj@FQB1xi
6t!
zAbvKi@1QMWDumSuyR^+ULo(n;xD!E7$uT;y=C{$;Ovb*yB428M{^2lex-sa-
^{44*
zYx2a3JGMKevk9>c=mOBiifbJMJt`c=U?p@%hff0B6Hq?-
G2fum=zRY_*q{EtGwtL1
z{{cMsSMa3^c(lvVJnqSYxPOoGp$^Ua4#p!65p68uENSk)B`nxCKX~t)0vUyT5V!
rn
z?Y|>#7*wG5L3^wp&@T=2v*z?G&^}go59`2-
xr9xf%<C^fgEp7Us05rYMNWP#qiqS+
z0YbL^%s<4<w*&FO3d90m0Un6I&1*;BB8)H6w!|I_@|H<?vvv6(=J;Lo)4{{YuN
X&E
z+>BEk)5e7(T4tDjlqfM+SWACTT^OVHM`4cc8DYE7AF)R4%VtCFc}9>4|Csa7!E>
vc
zbGTm3#$GLZ;2pq3oCA6lc9ZeKnC+!(VLt=fjt8u)@YfOhjllNPCmxK=;W);jetR7{
z`3=}~`sMFj7~V$PsVg#v>-
9LEosv*96?~yAVy_E$j_}_S9&Cket2tg7=tKKy$6Y0@
z`?r?u8=YHh&*|=XNk(F2>Eu1+h_-^ff9Xc-
D==Q8%Jt~a^zHWNjoKc|4`u8vf^~qo
zXI|<XlYXR|<r}Nv#eg4#9NbGeQl*ph8UsDxO))zAP}l0wn|+|?GpP5%H=+!%-
3U$N
z_Tkhqpo67*(~Qoape=P1b&_uA&4x&`HRrf?=|<=OMmy?8+8Tel(#&`T+rpoT
evdE^
zQ!$2z_cA_h>o?mcwfs={KG3n0iMgB`Wa3-
sM_zG1xe<KwYBC4>HlHuxIf8ZOA8&N_
zdS*30t!6cEM|<iI?mMYd`x79ykd0075xt7+$pQ|f0m~jm*+n#nlPmHho|cyX6C
amV
z+_oRhxY=3YI)r(_5jXKQAX}&4TVyvHPj?~C7hG&~lGn;kV*?0O?!;R0b+j$9d46d
u
zlzKsdZRtSF)ru{S5AVg?7+*0|+0)M0tfthwXUZ(kmvY0uh7X82&IzupFNBVmeG
D{H
zk~#m}@DEYvhkan3Q<PfhYcsCeF<F6r8XrC!!y9&FWbIq$Iud>!b<`JJ_olqW&U
fHH
z=f<xMTW8q)zV%1?&G|^bQM!_*>%jZ>vHmQ&3h0^;j@CFrQPBAR#N>gpej
oVQ3mN8l
zTP|dsF;$CJxnYd4jqA{_;XDR1WyM{IKhED!cMf&$V|_a%XQ1DtA@#_W;fR(O
ZUC*w
zKg8VkWNBO@*4c;6qiD^7k(jkT-
hRM@{?C0Ha>Fav(3|!eqMrg<P%htwOycZskB)ZW
z2mE~4_n7~jfcuD+X!?#=OMr2)PO<eR&uHF<j^a7ZPcVnqF>mNO=w$1xhIraI
bC2@-
zI9M-0C)xa=ZSzBx=x2GchA0DOoCov>-
sta?=@M|l_Ud@np(hWr9yU3IIq29|TD-S(
zm5#Rbb2*=LapT$R`r~l_#wWnN=OeI`F#MYnu7+_qgW`D=&zM#Bojgy49m1I
d=#Y)G
zCnHLEMLd1PZjctSbC#Y<V<YD`UL1#`91^Z|h9Kbw&zth(_9wt*sK)$`$Bn1gA%
^Vy
zA?zpYxUFZ7AqI`LeUf{;@#)WOr@S3dvli1Q^qS`@w0pVX0^kezbe{t68r7VE9iV
9r
zWSF+A3$Z(_@p6ts_+I)lh|$|){5&=W`OPsHA3caM2$%4VfKP-?KY{xj+h*EvKI-
n)
z5t|Y_!!_do#EoaPO87?b#<GQ3D6{0B_8fW~ayd#XuCY<xDlvMgVJG_Mz?Q!cJ
obWC
zh`H9(jI6V4lLj4_hmJk#Qq;p{Ku=|dTTm8(o`M{eejMJ|ZXX7X?tv{^oDE(6F7VO
O
z_DsB-z{c;OoMWAU&ad#i@<Gr)Nc{)98!xw{VLQr9A00ZGd%U4|STVX-
x*j^8ItY7i
z(<ULtq(Z)Id$a*E!gA=!i_W<0__F1zSZ8N_zy~^h#*5%P&NgRTaI)O=*9e3Do9$
y<
zv<HEm#roRje9nqdBW~~Z(q^Iz@uF1PU+DK5#@D^D-
T#Jik2q4f7PxO>Jf1!e_j}~8
zS2sG}#Jw((%6&-
WnzoTW6X_c73)*_)o0vcNHitUnpU{_k8|XUsJA{3;(TO!{!d6uB
zG%HMBgZlL70?0DvtLPo2mE#d}i^~(BKBWHe;%e!Si)GA?;oldOj5Dya0y=PQ{*
$Vu
z(zj@Wf8&AO@OB^{12QD?LTS~3xy{~8>BKpZxffy^u3PvY;R%#8_z~YmUvCO
^e2)8h
z+*ci#*X+F-ea0G{!5CbBfzkPQxF@~XcZ}IL*Zn`(cP!eX{u$i2;%C|j#M8Y6c1-b5
zEH=^=vd`xQeEAC6l2<{{{|Vf00sWuvp3+>P4b9^`-
ozSoiP~Hwj)AAZ%cGJoP=ad}
z>K+#L@RO3%JdCm(pm`AdTn89I_-
4Z*1Ke9~k;KE@qBU<q+ux5PJ;2MDo$<zed?V(|
z#@iX{)6<}D%&&Blmy{hp_($HtFJHU_Wl&YA58z5#c|ogtaqm|pwTxw;3HJ#f)v
-Sq
zIqR_WE6!+5-
$`>1X%5rIpTqk4z?Tqu5;B&Bx%N7S<^=)&Gl1I({?R@s!#+c=goB{_
zJd_i^V<?Zne!oT8gr3coD;H-
cp)YuU1KRk|_xM=JXortjg*__PTWQsF$>7<MqDho{
zT&_FHsiGm??+un>P0;qcC!tPH=6$YvBJUl%xAI5geS!~s3*i_1)Z{mDJCZ0F<Iw
&?
zz~vm$aPKbx9+10sRho$d$A1jv)YpFG8nEAKE#Ix6tQ+(khAt06mJUE}`!Ppd%W
tj(
zKYwoOiEOuZhBWFwjqnfl3+Lj{SMa0Eb8t007BIb7x5r>7c4X17q#vCXeiM2tc#T
9m
zZpHo+XZaP-
OVH`=eyr8!;U69c4cNzS|8>AIptmp9&p$Eey%{w2AP%6wA0VAQ_;HMf
z*$1>GJ%52YwO@mC8qhI_EB%b1%5x5XDPm)})Qc{j`{O>|)|}ED?&pt-
Y4@Q6;PYg;
z>35NK-
O$A^A+|(Y!dxrt^`p6<6UQ5sLwhZb((5!}+OkNW%92L~@~DOn08h$95PJ^N
z%gUF?1<i88-;B|W{w3+g`Lg_etP9Scvc|cS22+6};dn8B&YN=d6~NwctG{y-
@FgAS
zKY_ks<o`6kgP8WE@@1drkMe`L8x}5Z8~z2z58xA~2@5d))uiF*x}&{@E{)Aub9
26&
zE6@C&psXdz9Lt9q%?&w#H5E)8noGX4BbM9Yv-
c#~;U$Rie!qfo4(=n&eTe&Blu4T0
zgZ8!4;Jdtpb4u#q_kkDAX)<reI7hG^eFc*7O?5ohLl)0E5hJ4iogMxi>M5t92TMD
!
zhGrd{W$JeN2>z9G_kq5F*;x|soPNB8?Y|Ftb(nLWVD|qep2Y~3dJiyOkvr=DAlJ
mo
zOR(0cKH>v?jGt}#mR2s*dyu1e|C(ct%GAM~J3pSrW*ncg6{E46G)~3b=o1mf&
&~~R
zJBxckt_`2B1D$c7apkJ~GVW;wZE0KI!9LIr-
TNVBu0lG$1$u*4CX8cRqI(GC24Fxw
z-Sj&NYd?5E*g9lRU~j#!w?Xt9KwIkU2-?2Q`$S8xjjZKMXtZ~;66pH1b02*d!fgkP
z-ve*PFe<@Y!t{SIJeOn9ckx4iAz--;f%ptvlhnP?VO{Ekny<ko(GT>hIn8aVm}e5-
z@L1>6jPG=#yz)R{GklkUui*K9@aDIG_de!x9CJK|`BJ8dLlp4i<33lB-#=(7?e6+f
z9puKG+dstSX3t#&G{}Rko@8`}Q5RzUB<Y0yfQ}jUfvG<aq0ZFDkU{FMpMsXA
uLK@E
zi#iW@M0xOlPZqti!mkk?bo|q}(jIw1hpo7$U-
fm?nRK>vksTKs8P_}`lCX{(OBZC^
z(a?x(t-
rK#<&^c5`Qy;V9J6Xe)%vQNi+hVit8wX@^C}P@a)Adf)FB6{w4l&grs#@$
zDf&6lM&K_j1FWShm#wc>9nGGbk@qs31ph)QD^O(iGF^4Uzo_{+=v|>}eb0;
W*cQOA
zK$#zKs{pqVW3)pTcYRvxi}%+q#r<R|@?X&=g1I+t(AT#i=HCXG@qG@ob(O*g
UD=ND
zJlMl|mMx5Wt}}2>={&-
<$bCsM_jV|E&E`426K6`JYqOkZTIw8A|0BLt`WnXMnYdp?
zEJU)*7&_os`-
Zr97WP*)l^7HIh79=0xzw%A=qorcppG&yS3$o))EOAV#6h1IP>s)Z
zmY^JUJ@kzi0S0l@kV7M}{Gbs!So;L*=ajI499i)j^TGT1FJc^}p`n*>MRx~qZqQs
n
znDE(~a6aqO5tEhd8m@r~;KDH)Z!ak1dbH(4&>ygxwduzED%4RH*q``n7s1w=;
YV)W
z0+_6aO!QQvZ4qLdptp&;v3~MC!UJyue!yfqE4CG%%Pa0L0dMXtELynXQztZ&
XPW`P
z3h-U%w*b#uK&Q80H$Mwnab6YR!wRf*(!e<Zv1(rZGN0EboB>fD#47>L?Z>H-
&7368
zdpY8T&KWWvG(l`E(ZsiH`BjDeDCc}R9`-C)tDP75kkqA?epSNEePNvFZ-
Cc)ZBBrG
z<YLU@1GFhaS!Ds|F|qkM%wh9n37pd=hUWn8F!rXWAsaYTDIdmpr2_nQ&F
HK^enSWF
zQId@L7XRi2l;xi;JcGT0AN||^(9p~Fvb=Jil4#}}oN$32F8JXE=+FI@YkJ%Eb?G_q
zTXWqz=E28GG&+BaJVseOuaIYlJLVbDO5|6P&d_b{0?^T-
`MiKr#@A5y!yh&2r^M(8
z9nm9x39QE4vhX86eVCgMKIJCN%>({;VQ-
;3dY~HuM^&Zf0Cd4cIvz1B%U}JO>9?^h
zV}ECX!(Q}d{E2I$9rLfy)S9KZYM{ep%-^|Kr~GH&EG$>6sVwC9pbz9z=2M=Iqg-
(q
z^LdsZA^mV}WPmqCSVNebxz@Ojbd)h~fo=E0f3w@6&1^wke4BVbupYE(Rp
AH1w$4Jk
zb$H%eAOZThraWK`GTuPFHZtc}juT-
*7vDo&5ZU0}7tF*OC^Y8#$4c{au(w=O@j54d
zEc$TvSj;(vzd6T-Z}0ILo9JHRy9n-Hz@^@?&+ZO@|4zgj%y>HVp6qHfb3-
o8`vpy3
z5$HmD?@KvXrW;ZE5sZa4X|gvLXT5@)g&}o)%l!^xo`UoAoMl&*J)I~~(EFrIM~
+o$
zu<lXtw|jis_9j)PAtv18M^3}7kRA9+*hAkv7Xg@gP7UqXV^4xy6#;*-
=Wzo&#wbe@
zu;HUE)TQVMa;Rqu_UZQA&yM&E)*e98Z|>v1gzyZUM|P|JJfAwTOt}eqZ%U5
arz-e~
z`)R<o*7T^3uSkI%DUrvzu9Z%{Yv6*8E`l6FKFW3Ewn%VX;MoLeO-
4@d4z#76X1iJW
z@IiM-pfLq;_3>?ajLUX{?(Ha}zF!L;xqY*B|1`=?9Sztl<Cz@SUNP4FIMwpKe;C)d
zf&R6rkF8i|19JYUGa;w1xRx)BHX)u1JfnEtLz@M9nYN6wrlc^x>-
!@*i~a@kZR~TK
zjes45k7oHZ+2P=E2|SK6KV+*N_oR6X-Y+m|ZQ8V-
o9k7_7$2B2^}P|;dp4_PzBlFM
zEXJT;-!?XHJ@aR|R&>fC=q1?C(2w$Y?(T*EV4g{G-
Hgz9YI?u}8h;nR+d*UaRBj!<
zkS&i`r_oC6dxBc=d=F@EKrc})Y+a9i&_zD?`HjCYaXy7P(bs2umV3z{_LiNXH_q^L
zV|%MG%WeTq-H3@1SMFctV6NO3p5M4{WUe+H>HBsAZW-
E;&laCvHpioH#<7AsB!GR0
zxd)4Ij|85ZdtO{|F1!tNnLQaY&ht^`xw8G!z>B$6pmQnk&hBTPMvSk##``rRJ^=i
<
z!;lT=%^B1cm_vCj-d|{<zJ|?HK}+Je3T5;?5Sts-H8CHMV>8b%g7K(-4UEO}S!+B?
z{+Q>|o@;P@4^%>CDI+}7G$2Q;gB+T2S%CLRNCN}BVLY)Lu;`-
`f6mRuJ6I)w&tXj4
z--s{273J;Yj3{wIzZQL~fBU8F>=-}yl|KU>Uf{vJAD*XDX1Erq$5exR-_cmI?e|$c
zv(CDSd%=Rw!FKI}uc*`*uv>mPF}FDPYo+~aunzg#DN6kVy+!m(0pFRwc91ks8
k}V=
z__WTc6YIdMaveEz^fe<{ZRYzi0zT5#;A+MhuSt=)JQME68u4JvH^46s#>E^<Mg
NJ}
zSH?&=bvDm}tuy2V$gUQ4B%PS2`M+EGylAOycOzFJS;{9vH&wlo6sTIXtZ*4}DK
<Yf
zx!DU{5ZNp<?YP?`pe6Ero@Shr`DOHd(ox2BY(LX~=2_AEDC7N7)H5H2_l)t8k1e
8
zkA(Y7td8+X>QcgF+c|hfeoO8K$nlf-h4I`U>ocD69BW4y(_+uO|Een4c-
JM<oZB51
z56!tvPyWc<K+6{DI9`8d!XDM*WuPf_v-
ct7lrA!&LB!*!BY1Ad_VN1EY;%Vx8*a9d
z;o*5f#N=rsVT-oYcJ4>)-iVFIt4&kndmOI7I+zR}o_w@zthu*Xz`aG$5kKA?!k9gz
zW4vuAeh2aHMX`akk99|z(+=Ci^AtDq3T*=IM?daO-
3MLob;#cK&D6`;?*E2z>Jsin
zxM%z_*C249tSiZwGwL`W!eIM%(Z&beYx=@5op2uG^VtO$3jF0Z?4jc8GoUL
*VCt|j
zIK#H#!f%SUf52QCE3c0_NB>}W_Uo8uBjAqeLrZVO`%ta$#qGG46(3Z>&p}RF
OZ8^L
zF~`Jy1%4KM*X;1Z7`)HmYU{IK$I1$Er9Sf~Vf`_`CCOU%0(u2u6HR-
8E8}CN$9<S9
zadV^Jc+8pi*Tliy7lT_6gG)bHxAdI*Q*nLr;`+RZ`w=>UF7{ZoA%5s1o{w`J2ow1l
zz7p*(vQu&XA=_!Fw|T<nVZ38w&wDHCsJquem(V^vgR5nqM&-
X8a$x&yCJtN&(8qvf
z(jWye{3ui5H^8?BZ7e-
~HO>XOcD(TC$)ncNIn6c?UN_(K$qv7Zt2tMjzG<+>fMLtQ
zZ0Mp^<Zfc2?K*;Mn>v1AGw9b2+u(W*`MQ9;_wj~a*YCV7I(SjJa*p{fCS%$3
W50f8
zIJYS-Uz9q>URR%n?@Ik5k%?x`-lvi-_HVGJ!dwrOE!gc+`XUctJ`*Op1KgYCq73`9
zSLSPp=KkzKJbwUx;ce)rDEu6rnZFMo`mCCh`Ub9;Q)v!<W1yoBEvhP{Y(9yYN~
4-o
zQ*s4jN~$9jaa-
uTEca10q2?g`dgfELB}wf>^xL0d$>O8fBOJjVA<MX;lQ<B^9GQc-
zvzeDsb1+@XUjlvju2tp#L@p-
wG^7u8iU;d}JXu$8ZJ>C$K6DoGAkxjs<;@BEktci*
zxGUfn<qr0s)wRiAN**Z-
uIQ`;p9`Q5$mb4}t0*ggj2^%<ZS*EwRoEVnd}^jyhxZMZ
zVx1S{BWD&@)|H5JriOl#5f|Bv_9gOEsYf)o*?vkqj0qNusqtmGRvGN?=vY}+8F
aIW
z2lVe~-4#~dg7~sDv&?n3VfwoYaB|7mnVcVWIr;R_vk=Qy-
7rZq4dlUm0Q<ZYeDGj@
zYNSi^RP?DtUGi+1KQ+IhS5?&J;zF5UjPmg~Z&9$H<US2~g1PcuL+`h9ub8H2()|
3m
zvD3a)B+<ES16!cf=tDRca*qe^`XN7zLkRq>0_YaPQV?HPbi@|GpLVoS79duJa`q
{H
zxc%9GIx)QM+qs{c_WZaz0oRCf|9Ug(zksXDY?tNkn5+g~0N>l2u^*A#8lG=?;b
*A8
zt9NC=zHaOzi7WhWx9TuDJ=i~~7<ak3b}YY@YhtekAKlE4R@|rIdswjx&CRv(!L
<@a
ztRg(goJW?sYpfM_MXrkb35?Bi4a)gv7$@Fe*k>eJ@5Zt02dFP}$ZYC1d)+(H4u)
^n
zS?GW$U>sF*2PPwaPy3RUZ^dSsXouEH;PV)h@;aikA+OXaI8!rivROyF7SlBxhq
^q1
z7|PwJsZ+0X{{-W)9o~B{HEkf|*luUzJ`HWYhgkK!z-
u4mAxOOly9VD4V_7iw$LXG4
z&~Gl_Q3w43d%i}*6!(CJ^eM@|wy%>$+2LDE`Y^8`%gwy=_8mNr$Z}7>y*UQ
fQV?Yp
z&ROmSaqS(zi86eV{9eoV7p;8+=CsT9iOv1E8SBG46M$*s{0-
oC8uruHjnEgnyek*-
zJ;pskI+(P~4wFxnC}%qt%83v8K{=g;*o_aog8tr0{jGpU%zxYwi(^pd(D%Oj^u_u
6
zR{YM&&9Aa}u#0^3V@v^#z#q1u=*XvmALqh32y_O^Y`uQ(rTxGYyWjQk{h(K
@extT7
z8@@O7vbCpG!XChyjq^csEZ`xCQ{=~BaG%TZ$v+Lc1oXo?g3kxP*yKT6+_o2X
+s0Rc
zerhsvko~1P+Uv+|fzD~6Pba`t%(|i@$Ysa{omyy@u?FukKr>te$h&TyoNW{~A
_nE1
z?$5)!Nts2W4phQ#?A9t^8W1=0CkGfaU9i4tAAI;ZfMf3C+t7#c(qhJm5kq&t7O8
mO
zMDQMHLADeIkq=FOoiT69C*j$2{TJ8;mNN(5@4#9+&^1_$n22J$Sf}#+CR`Ok9
<zr0
zc+}~FbD#P=?D<rzJMbUyh5_4#hkTc93gED<UB*5gVGEYsFM@V<eG1=y#(c!(
?}424
zV7#b}lNZkhzPllqlimKRLH6ChGiz`-
HxEC%JR81=0vHA8Q}BR3WW#6!j$+ED^&W_-
z1181*{#z06#+nnzj2+Ko3`a4)^FUoK@JCz^u5A(6TH4!wk-
g6R^@EW8%qGZv5prf3
z6aVJ~!SEwz1iL(tW9~^k-fIJT_jLi0P21@Y7a`^)>22FB9{e~YC%SsLcjJDN`72J)
zRDs=)*YN!i2@ZO>Ht;?j_l7?PuM7$HlmWKyz;yw{38Uvx=0%*!i@0s$<7%iek8
_ck
z)_G2_2e}T>_*g*q@bC$nUUCAwgbcH+L<7%<j7~K<*yGw+)51Kf8CVmOAq
%Q(0#6_t
z_+5uG(ybD9(j^i|@>56PoWNncn%H37Cp=|c9b2rcw%)p`^<0~qdhilyD_}ua?B
974
z_H*3xM6{qu2il&{DQl13k1|ya!VW6oSB9X&m7%#j=VCd>l+)>fZt&c^_c{VUJ2
|{<
z7k+<--`DVq-@_69<NpR-
YsN{?_iGt}e?VWpL&3VksPo%(Q!)e0XVw&qk2zzWTV0X`
zeI4wXg?ryOvI5Dl$)E}BG}h$=tM1wNQKkob_#V8X_YdyC{>rRhloe>ld2N4Fu(T
a}
zILH-
jL$K%MS>{9mcD>bqA^LOA2fGmdB78IlY&5@bVZzvx1)IX}M+AG0qaUy5KojP
2
zT||@DvjQ72FV@q}mppiPZ}H8GdaE9sP*!Ou?vjQHWlO!P8@W5~R>aT#!Cbp
P4joTY
zW>OA$E@$OYC5HWoZM+QGwqqUGr<8+lEooSbF4<bzKm6S~te;fM`6B2Z;vF
w*254u>
zu!?vv#^EzWcMxk}z=n<I9zJ(iurmoeQl!jenSt>mo2`4q0n2ZX#if}8r=lHYh<X{m
zd2U7QJ37F(mGO!WtkZ+IXRe%%bxHk)@iQ6Aqx{Q<ZKa&=SN|})Z3y-
N>+YiWAZ>eU
zu1UmfPHBnZe$Zk&?4uX+xpb~Ln{n%rwo>u$s&gt*V{ksnlEHhlFPHc_m2_zPE
n_6z
z?x%XXzwpDs?lg&Z@BMO*tnV7^PL`-
Qt*uAS?;PxQ;6AmbCz#POc+8qh&ry+3gndmt
zJ{n(bZ%zzBR(9=pIw|zRv&o@v-z8DcG6O!SF~0(_svW=sb`U;@;)bl7-
<<KQIQu~C
zG>F)27tZd3nj;k4tOSDa^&*M>%;4uymb4%gOj7Y%h@Tc>e8G!6(C<NSTWid
UpYDN=
z){1iOHH(3V>(D~_XnV;g;!2)+K|_}qQRdKrFQry4-
DsXZ&NrBMSQ|t;127c80IaBb
zC;@tAG)K&ZI(?@ypKu}Pu-
A&)^Wb{yhm^1inpw25d;t2jj2{yo^~)Sw_lA`~7GR$q
z=g;f~j<oZ(k7b{gw1YNY?45x3yOe#rTORemUpneG-
%%=O?2<WpEH|X+NSmt8@Mjtu
zT6=h&U_@aHb0ZgSoy&GX=mfU$UKpNBS)|S*K9oT-J_$UC4}BCHzl-
pS^E=}4g8nYA
z%*1=3rvGN`-
7m$1at0olzJh%%PV|>LU&h(s)}}n#d&V+FZ_1NoykAY7q$dOf{)xWc
zJ49L<p#2UL?~8H~ut&i6uMC{=q^V`xzw;du9db4qFsQc}Z}A+;33y-233$Z6T}PR`
zmlG%jpRG817X65=(mmdc@%{ki_hOy1uV+tAz*?`PXTK+)ce{b_AzTT&3^c6r+
z?QW
z{{dYbtW(T&_thT#P}d;!b2fCG4jaeZ$s)j2{QteQ>GMJ8txY|GHV>elI>HMWm1
uA4
zuNrf%R*om-hk3P#<(c~-
`UQBGB3uGI&T0wBwNW5nNnzw_A$KV;T!pozYB`6kJw;Bq
z1aQBAvSVsC%D4x}4wt~U`WuuX_ZnqcVGXdTQ=nj5EqWvb*vFPho?)HecxdN
;gWl60
zv(}SLZ!3*F6s)sky(?t)dmz{R#?d*(xiPLChjgZu!>>a;+Hqg(`hay!doXtO4l<TW
zSV8D%`Wt>+&74<UxlSPiJ*1VSgWt(&8QXHLDru1(NsjdB;IAnw9=wwZdEosP_
@&gh
zMdGY`Qo4Ujd4DUt`?n6f_rX}o7D-
ynoYhL&ncx$pTkyS;Ezs$&fnQC232W)Qdb%)%
z-
w@=RuGnpUe=5CcdvQ`>Us0MdXrP}*jNSch{+_1fAbigKJFyl*2cSbaz8zBxKB*u
E
zu(PMVN&+3Z62*IP^jmfbe3%`xV3R>>(wBY6U%ReW8TC7V0h~BrtdCt7qZ~3
CFdjf|
z9IhO99okYR4cID{Ed~8m)RSiM_Jn&88$S0L4(P9HwneN>)6IPi@VYSo+YCED`h
M5%
z@xA&HIFLE&a<0GUh!@W4yMdD>U)FnQ+>1SnZ--
er+B(0uIKGT?PViJ7Fc61$bax}x
z?$X4z?N2}6*xROlY0#%`Y@t5#sVcrLg1r0Ow(XpMS-$z5vGQ`6j(6-
g?0zOi>PU}G
zhQEhxd1mOtd-
LNUs|wz4YEzY!UevFPm3QF`v>me8ns{Yqo0?b~M4eat;_f!pQR_=w
zzuTAT$9oB}cj@Bvo)r6gs8j9pO0LTsobxh|f^ms_%w=yw&P4q;hMCh=h-
bvo5X)CW
zd;h0oSnud4;R%!bwx2EN+kQ%$aCp3o$9re;Rh-
2P_%?0YUazW$Big)h>(zbR_b1A$
z=d=X(_u+>HKP}Pc%hIRS-
!Z$n{Z@&#Yj;n>JKd?U4K>q{12OqYBeYbV(0m_!^(Qwp
z40Ry>Qz=SwBffRvLRrKinadG(My|uaR9p*?!&@;9x>2;l9?5Dp*Cy!iLfuP<@jR
C#
zf#9t;*FyiDcozz>n^&Pzv#DRZ5hIE4obc0t0o&9L`faE03R=mOzU`7Ad%ZZHco@
$L
zaF>Sqr{5BJvGPX5RG^z94r8}}!_7m-
p|kjY!MBn3@rIV`b{KY!<HRuY&cBV^56YMV
zU5WQ)!`O>%<9A!+gP5;(X-
vY*FScT8jWT{<1@LObe4mOAmm>#n_FG@8Z(;1}IN~CV
z%eW>Qoeu&gaXE<cs}a+AB2)HU1OK1^v4`R7jKO}yP$y%3G~&Jq_eXIp#<fBg
opfM5
zFGyc-
j<SV!YEL$$@jNU}XG>zU$$QYQS2V`IULD5!R6I{uy0z@wQ>loL5w@xhOyxbs
z?ZW-
bDN>$_^8yECR|QTrW2QX2tmz9wj#SzEHtfJENjmHpV??3b_A*Acxy1;5xkCb*
zF$VVGuaf5;z&JEU_LiVO?7^N2NgX(jGM;<G7r~jHWefc1_bJ#VHG%JG@C+b3
oPp==
z0`fj*z=OH<6+o9=ZOH<kd#}cx&Zd3bxj;&e5yHm@A#(`>(-
P!W#C$>jF%}<C_7tAO
zl5)60Ni)AM#CDaChoj;caN(-
JN0<N^W1j<jS659L*bG_QA}P(7D`@8!czs)2UZa{Y
zaGboAF#~Vlxl0@?b+k`zmjLW{?p4rb^uYytM4519pk4K6-
gh3cN{5w`VV9fntQh{(
zk(F4>yq<<leKB_ZINDa887^ONW_S<rejDRLR&zZ;3A}(SaXSe4oB|wvgJ;VIjQT
8$
z|MT3#3!ljkzb{@lTK-
&i7;)8YKJdkgTaCt%xE8X(PwGVSX+CU5<xSW_L(fnTybStQ
zxvl3$JpU5Ue)xt#<gCLsmhzo1Z>cih)@}4Np+vHm=3yPL*M|hQlD^tf;09jwc&1
Bp
z#d_C}3*|+Ue6pSK9o+LAwF-
T>H?{TsGT>2NYIHKEggD_$C+tNV*NHFn`cT&Nbp!r^
zhId`%Rmv6p#w~fo6+HS~ZeSDq)qll4XbH{$&tQMviuu19qaSJ5j(z`yjS`(ydQ0E
G
zG%o2qx>-
&J0psY?a?*=yBuPTY#wnrKbJftxpbKM)sNbWYy{lnKuSn66F_<g+e?eI^
zHw9yWCOxc&oiM*mdNb^2B*_4rV!-
i)E^IWS*z;`TxEBaB)*kUKv;B0mR{>MO?~Nyo
z=t8Ws4Zu@{KROw|V}F|wav=XG0b{(Ln~ryeoqP{5utkjCH=425@okVU+HP%
9_;$>@
z3*QXsZ@wp_7?b)6@H?J$cSy^a)aNLj)HnPjd<M|Lubr6p&lvv=z=Ho0_~la;oO
Fyg
z1HVj+_sXG+P>)}tx2ncVZHffakq<Dgp`tfEZ(JDf0dD=ZYfj)FSFA1kM=6{);8)V$
zT`{q2&21}(A_~5Jg1KOxE!`r~A>5M&e8x8zkMR2)jMFLbzg$CKYEjayZ&#2%`r!
ON
zktMqots6OYUie9_uj+$Wn(bLHX8oew5-
a05?nu9($6DCdd<KpES?Oj!#?M%G67)&L
zoUvZ^D1hS<?`{R{brs(vLwneuZ1dY6@2&53BED4#-9X-
&<HoM10OKCO7=&E%y?pEu
zkxLFgF|LnaQ_}g3T?^OSMsWom*8Dc?w&&!<*n@!iBf!~@-^=)M%-
xWy!??eIF@6R4
zWt%;C-iIIGp<$a4+TgupQ~nr>VmaFbPA>5rk1{B)R@#OOu#eEWdko}Ca6Sd-
PhY{~
z_is19H4A+JAE(EarZy|fD~EKn`z+$+-6#)2zq|{0l-KSwW$1#I5+;l-bxQhG^_VMQ
zsn|1V7utHXNY@~Ifs{7rWbnScX-mlvzWI}a7;p{jZn-
}qud=U#_BvuZdYbW)jgMyH
zqzo8aH(UNU#z&rGlt1#r06YO+9FKj*Of^Ddj0t^i{Kgr@p>gRG`ljQTF~t+Q2iGx
@
z*Ozi#NhqZ_zc00PLSNeK1)(&3Lf`fHjlFqcXlw`i?U>M)zTmT=yHOT+1%0O88oK
S3
ziG3^ayP|MW=!$x@^%DMVp>g*BK7JWfZV%01+wKW{snZvSt}V&$y92)~3hx
MAf$M7g
z#u=Xrjhmj|H~sE>Q}*KZ%9~Ct^!7E5(7QJ#gx;H%82Up|Qs~63$)Ul!#)MAapA
ve%
zA~iJha9ZfxnkzydesOFlv$(Ktuu-DZ@U5C6WyPQidTI>5yOV-
7TA>(&q{}<oP_Jy<
zJqF)r=Gr2C1ocia2FVA0=f){31}W2#ZJ;UI#p|dyoh86&0dQIfoIVSjZUs(@fYWW
j
z>2~0>7&zSloIV%&u+fO-
7f<N>@QZhbIL=Av59*wg%@Q5lY(!7|?4D32^i4W+&kX$j
zg>s4YAHVh~Pq#pxH2jQLCiNK#WCHn;_-
@*>#n3H?>jjv@9g~gHE?w)Zz)$(G;wi}Y
z9JN7tsvTF>J3nlDidXK>PL*|qZo_!_fJ-}vJy1Xq1-
`HZ8c^m<G+ynm(honw`m+5y
z?R_QtcHN@&jYWBUpJqIp`$TzsxBY!=yASnBBXCN?I^%p&(6#`3Di3g{uPMpOv
z*sE
zsDnSi*jzxzGjqqN>v68tBKhlE^a+MJPnOHgMhj(~u|duWIXT+|woi3|HaJ_MJ
w@NB
zNelRSMTi%I4&|b=obhSr5uVlbV@%|pZHvI47PBwbP_mr#pC870ZA1J5@&Q=
9avVvv
zVh#PU2edE0BYr4zA-0eT`()SayeFP%4Zu^a^}-
*JY=52;d1Ct^TgI;WeZ@R~LHx?t
zHLACd10O%mg}l%~JX<*r9K9Gj0X%2j3+eKzf67m`OB&`sRZf-
wmOO|2`fl_4joT9N
zJqxyf6K!!&!+GsFv{;!=Sg#{iu?78c7PajNei!ikZQzf+*`CSr>AtEv?(W@$x#HWM
z+aU|hCGZ_YCVy3bJQcPE@0N=)fS6FZZ72R@zYTw8zekflcD#eg@%*(W>A%il
4$zn|
z&+9!2w>K+O4s3TN8!biP+i|S<6zDUqZAIqyA<v=3lP-
ZN(@T24oZh|UE6Alwcl{*q
zHf4<a>Qz^iWw;LHne$PcM{Xa3d|gQySdRBgoPfb{!Xe*(hHnC1t0cJ>1Gl#%qo
xCN
zn5Lu;cyMKo_DKEXAFbyecBFp8N9!5qod#SHH|klLEU*4F_Pjavd;rfX_%R*4;`K
Or
zm1gvQ8TC8Bt0K|NbM#8n*Hhm0!nb!ot{971hIdcf1p6K2^gGjxLC8aSLYlGr1=
M{R
z^mO99&<Ps^U4c0}1~#GI+0e9;_t>MAFMwac`wo=r_2j1pIdGVAu;4w)_DB2B
Uit~g
zgsqyeNkfkBh5zor_{8ndg<%u7O(?V4I?T4D7u!>3@T~D!%p2c3$o)Ki25@$1GF
!!u
z?>iMFAIK}l*_@{#xs2bH)$lHJm0USfOT)Pu&el}qJgDjZ%qme+SXKp@;Z@@m
b(0Z?
zLvEE-
p3c}#EY=pgzJ+!4CgN2O;ky*w+1%sH?4w*)STp=K#s%z?G0s+3x)#7W9{hOR
zZ^b?0`&PLl0Lve32d@;wsf*7cMvV1|wOiW{8WrGM93IES%nH9!Oa0UVe4raU
FD=(m
zMw+;gpTjdO<Zg9Vip&+9wXz&K%8K`*o@XztcL8ou3@++R&33VRKjwqI;A{_
m+H|9n
z`==_IlA=wQPV-xvq-
#TBnKA`AEBG$4G8Ob3i*v5)gzqSIy1ckYTbo`H&FLn5n_i!d
z(F^C_AElK)X_Qv!$)mJdi~BfQy&oN=RXb^gJ^HcX8|RJCDE1sr8`yzd1?5fnHYD_
X
zC(k}Er4RR<Y|}sNoEJ|Q?qQuzj_rF3_7E^nFeXP^p>#~@qi^WZC-rIYu{2!iPg6HI
z;G4ey-
X<u)!7Y*y{xbaZVfYfyr*GNri1XJ~=ua2qlWPNfgMViEW*W|F8bzrIg7<<o
zLEIdutH8R7wJS}A{A<gX6>`m7h5h~uCn}IPkWdrBy75ZFV$Kipj6T{xF<|p~%JQ
m0
z$MVUARp`T5F1}}W_;t+dD8{GFV4Ph8PFLXvxrCnQxu<p*IJ{aU$m2#E<{1-
K$8vAs
z(&c)gc}9B4IQUMgIR<HWe&gtSy$NV{O2d2mh}rS1W-
s#S8Hc%_YczTP_U|E1<@GDi
zI!F`Pu}u#u8C$v~W6ShSdC#xBs*o{a>ZlzThW9q&J4M-
$PwuaK`K}D!+eAM1jQx1_
ztK(BIj*a}(jOp_ICY()Wz$W8;f$YW1*<1x0GjAuj(pSjXkOOsA-
ts8k%zv5<*@&GX
zncq5|^`H@AED_&=d}T>$UVz^jXAH6%=S8sdb1ur;<hv&$?=o4qI9sI_@7@R6
^QC+O
z`YQM#uQJ>DyiyxMyv4aosjbA-
1)8uObC*8F`qz|NBS*@YL!Uc;snixjhi9h@&0Bv9
zzHNi^s|lyR)KZUqJaPvS7szsBP60o@Cm@iI$QYTkS5;E^?mpt4VZud>J=YmgYJ-
TU
zIp0=lNk4nMV&KG_EY8W<t<>tsAx}me(z#Ws?S?GuJcs*kob>=7<UeLIeg~hb
7P&a(
zr}51zFL2^{HGHs^2H=D^HO9qvY8*q~3nH#IAxZAp3BNC*<sUwdcYXQ(Y%z4*
eVC^}
zj!)xTIo=!MVffAW5t{H$HsrAu-
=iz%7=+LBUo)n1V0JTe$}egI7;Hm6+ijS8gK@*O
zv(Euun`Xfy9ZAFQqI?MZzEgnr9o#<-
Jb5Kf4QTTL=Ji~R)^Nmmc8IuwH3tRX6oC)0
zZ7<#{KCMl}ob$tsOFfHm8e`)S2Ky7I4`bsHC*<_Nhqn0URr5@~dEu**Zxd4G9_
9{_
zw~R}X*1rP3T0!edz{6RZ8?l}iuSsisM-DNrc$_{J!)X)x(&ln5m7q;rKl6RfO~A7v
zMqk1uOzhR+7hCiotuJZ=7;MA2*ljo$Qx<@qInE!!kGKfd;K$*@IbJkQ43|sCxv0
$_
z!G$u-
b#?%<?CF+!N}yvJr{KMacZSPLAaiDYsy30jmiwx`&=XhSe&nnLc{z|>H*>OT
zkaK~3My(g$MzhZfZGEdk$5PKiSJ!wUpN2S0T}+)@06s#emhwCe`y}La81t8!Ib3
p>
z{jt`q@A+d46+G5rcEFSF-
(JPNNUWaUGGcqV{CAlGmnm?W0+%UpnF5z7@MlqAG4_*x
zR>%KGov!^WkDvNi9)BxxDgPgl^3MWuc<8Uo{}=zt<2V16$4~z&^Pm4e&Wp
~p??P^V
z#&G%33Y;UP50~@orQ|P2BYXT?qgV$xJ9gn0c`_q(3}@5GQ!xME71)af#vm^o
c|Z78
zg_Q3&j<$$3@_awiXzW&TR#lAiZ01rP$N580EjqID6RvA}{A>Qi`0wDIRD1l*pJ4
pk
z{{!QX`3utbPbmd^{v$aJ<i8T*zgYY~c=j)+Bkb{ihCSuK$N#Uy(SPzMp#Qs{kf!$d
z-~JQhuZSC8`vl|v;y*C{SN?+Z{Zsr$oawJ>|1Xb!nf`xLM*orx{)@{$b4#pTs>YFA
zDi?CenOD`1_m0eWB9J?#biY_CQoNxFF}?U)44(He7vv8(hx~Kc^zV&t!#?|G!u
}-q
zTps_E@;`K$|DQyl{)27)+VYpk6g>QuXIO|2O|q^?d@%oZ;?RwMk=S*1tllccfiR
?k
ze=nC=*F&+Z^)&kLu0K-
lkCi_VyWSDIekTTZ6vBV<&YC7N5n^zVIBWi4Lt*~e<w5IF
z(zgtocY5p^EB<4bPd{VTER0?6ie3LEcCCtC(dt4BhJ97}jPq>!&#-P{3=sQj;mQB8
zXY9|gZ$8m=O!k<6!yodGMH01?ahW-
}x~pLR{44Y4&!6v}g0ok7RXy^5ey2uM{vCe{
z|D0A&a#ZBkNP#FO0-kj%R@Lh_=`*I^G<*6@b7owp7q6|;XU@=PPM<kl9-
Vo^tf|v(
z;zhDOcg&h`lYW&iMN$^tF+=yQTf25mUA<2)F0QLuK6m!@YgVs%><0brRn?W
gYTZ{|
zuP+7cW%@&_Dj(KM${(n>?aq=r?p?63qPV!UWYMgd6{QPrEz>`vPfwAmHIJ;
VtY5Ko
zRkhq$wRW9PmQ_ExqN=*0{;{>yf&!^tU5U!;AE~ZizGj)+xYk#-
LT;4Gx<{_#?e#Nm
zm_GV2{f3z%58`{IiU2Bn>wIggS1&W~*F5x)bzLnt)>Zqe>mIFM2GEbJse4Q&S1
wzI
zGT-
%8)vH$dWU_C?hU(aTUFGVBt9`P1&GnB|u9dp#hb85<)sI%LTCq&8TerG?#Uq
?_
z9r4zeRr{*yR;;aGQ>S0GmgK6d!|jUIE9zIE{e~5*AO1)eldNUeFT7)>URAkTU%d
w8
ztJc@~s+XakMdDdAZ;%_&ALR8(%Dt<r*RQRvsz-
y$haMvA$I$YjHM+09vcCETjA~<7
zUs?AsxUqK47pv>^Rn?DHuhJg^Ix&*yYt~lRf%t1y$8}j?(qAvHtFG27>oJL&^lEb
s
zS1m)U&sMHjg<<R0=%AK<cUj48dVGh~YnD}id@FE5w^*rLtn_hmaeY&yvi>2
%V&=mu
zs;-
|seY&hzU5~NXt*!S#IF_&RRj(G%8HAiJzWQZr*41AR*;yWs)!NFcns}%modP7
M
zq7qVD;d``-
P|WMX($c$1Z_;&L?!2q~wvvUomHUfJ@4W5KTW`|kwmUz27b|tSZ(*tD
zt};~1!aHW+H&e*B8Dz=w%GJwAnuY6u^Xke~dht>$5xuUus(J;aOkcBFpT7R8R
qOSK
z>ef7BEv4%9Rn==rezdCety%q<tJdkh$5t;xgX+()@v8M8X5HEqvu@IFvq_=XVc
r%C
zfCHI*Cj_Q?^_q1LF9&HU%481&6;K}r@S9Tf`-
*R}#@6q)?tq3)`DXD3+*j7u*YTd?
zJ%X+k;BJN0y`pM)bydyOY5GGZ>u-
pYhP#XJysd;3zPki!Wcqr+f99X5UgYXgJ!zIE
z-*44AkeI^1S+V+|Sb6>fR=xj~amBn_^|1APN9<}njsDvmD}Oz9{Y`;Y_xxn*x-
51b
z?Q!|;G6gPE;4%d+Q{XZME>qw#1^)k{0Ny1q_qq1<Hv`uEM)sp8tY^HxXZ`)*l4r
X-
VcD1}TK}w?qm(O_VM-+$he*qMCb-Vxo

--
2.30.2.windows.1



-=-=-=-=-=-=
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#76525): https://edk2.groups.io/g/devel/message/76525
Mute This Topic: https://groups.io/mt/83558386/1945644
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [samer.el-haj-
mahmoud@arm.com]
-=-=-=-=-=-=
IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.


[edk2-non-osi][PATCH 1/1] Platform/RaspberryPi: Update TF-A to v2.5

Pete Batard
 

This is a run-of-the-mill update of the TF-A binaries used by the
Raspberry Pi 3 and Raspberry Pi 4 platforms, based on the recently
released TF-A 2.5.

These binaries were built in an open and verifiable manner through
a GitHub Actions build script (https://github.com/pftf/pitf).

It should be noted that we are only updating the binaries due to the
existing ones getting a bit old, in case some of the ARM erratas and
changes, that have been included in the past two TF-A releases, may
benefit us. However, unless there are changes of direct interest for
the Pi platform, we are not planning to update these binaries for
each TF-A release.

Tested for regression on Pi 3 Model B and Pi 4 Model B.

Signed-off-by: Pete Batard <pete@akeo.ie>
---
Platform/RaspberryPi/RPi3/TrustedFirmware/Readme.md | 10 +++++-----
Platform/RaspberryPi/RPi3/TrustedFirmware/bl1.bin | Bin 18837 -> 18853 b=
ytes
Platform/RaspberryPi/RPi3/TrustedFirmware/fip.bin | Bin 53972 -> 53988 b=
ytes
Platform/RaspberryPi/RPi4/TrustedFirmware/Readme.md | 8 ++++----
Platform/RaspberryPi/RPi4/TrustedFirmware/bl31.bin | Bin 41067 -> 41067 b=
ytes
5 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/Platform/RaspberryPi/RPi3/TrustedFirmware/Readme.md b/Platform=
/RaspberryPi/RPi3/TrustedFirmware/Readme.md
index aafbbe9728f5..cd88e0345c91 100644
--- a/Platform/RaspberryPi/RPi3/TrustedFirmware/Readme.md
+++ b/Platform/RaspberryPi/RPi3/TrustedFirmware/Readme.md
@@ -2,14 +2,14 @@ ARM Trusted Firmware for Raspberry Pi 3
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0D
=0D
The `bl1.bin` and `fip.bin` TF-A binaries found in this directory were bui=
lt from the=0D
-[official TF-A 2.3 release](https://git.trustedfirmware.org/TF-A/trusted-f=
irmware-a.git/tag/?h=3Dv2.3)=0D
-through an [AppVeyor build script](https://github.com/pbatard/pitf/blob/ma=
ster/appveyor.yml)=0D
+[official TF-A 2.5 release](https://git.trustedfirmware.org/TF-A/trusted-f=
irmware-a.git/tag/?h=3Dv2.5)=0D
+through a [GitHub build script](https://github.com/pftf/pitf/blob/master/.=
github/workflows/build.yml)=0D
that is designed to provide evidence that these binaries match the vanilla=
TF-A source.=0D
=0D
-As per the [AppVeyor build log](https://ci.appveyor.com/project/pbatard/pi=
tf/builds/32330098),=0D
+Per the [GitHub Actions log](https://github.com/pftf/pitf/runs/2822874196)=
,=0D
the SHA-256 sums for the blobs can be validated to be as follows:=0D
-- `bl1.bin`: `28d70adc6e7041582264874d342bcad992adb8d34c9de5813e661029d018=
9b3b`=0D
-- `fip.bin`: `02a8c3ea9227fbe60ecfc20999db6bb755d0b32fd757a596353e068e1814=
e171`=0D
+- `bl1.bin`: `5ba701a7e977d308a19928e19937107387677d52a1a4d628a5c2bb4e795a=
ae8b`=0D
+- `fip.bin`: `0c3f8a3e8192e5dcb3bdc5867976e4277e9d948159a92ee71a54e92cb8dc=
e9a3`=0D
=0D
For Raspberry Pi 3 usage, TF-A was built using the command:=0D
```=0D
diff --git a/Platform/RaspberryPi/RPi3/TrustedFirmware/bl1.bin b/Platform/R=
aspberryPi/RPi3/TrustedFirmware/bl1.bin
index cd3038990a7c9e45d18cde6198d087281b4b4490..edfb46702e801a102c9d18e4a52=
bb4ab9bd72a47 100644
GIT binary patch
delta 8026
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
XiN18gTxQDEsyMjvP3bdHzRLZ7+B&D>

delta 8038
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
Yv{iQ4sEO@eZDOZaJtLfEYgc>z8?A1JiU0rr

diff --git a/Platform/RaspberryPi/RPi3/TrustedFirmware/fip.bin b/Platform/R=
aspberryPi/RPi3/TrustedFirmware/fip.bin
index da8a93c495a746fd1f5caa90fba45fa1610a9da8..8feac04185377c5b9320a8bc323=
80b7b3b8ce43d 100644
GIT binary patch
literal 53988
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
J^3%N9{|0RSA|U_(

literal 53972
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
TFWwCuD|-l@yl3;%{M!Eoed*fa

diff --git a/Platform/RaspberryPi/RPi4/TrustedFirmware/Readme.md b/Platform=
/RaspberryPi/RPi4/TrustedFirmware/Readme.md
index 43a33f7b1b12..6631c05400dc 100644
--- a/Platform/RaspberryPi/RPi4/TrustedFirmware/Readme.md
+++ b/Platform/RaspberryPi/RPi4/TrustedFirmware/Readme.md
@@ -2,13 +2,13 @@ ARM Trusted Firmware for Raspberry Pi 4
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0D
=0D
The `bl31.bin` TF-A binary found in this directory was built from the=0D
-[official TF-A 2.3 release](https://git.trustedfirmware.org/TF-A/trusted-f=
irmware-a.git/tag/?h=3Dv2.3)=0D
-through an [AppVeyor build script](https://github.com/pbatard/pitf/blob/ma=
ster/appveyor.yml)=0D
+[official TF-A 2.5 release](https://git.trustedfirmware.org/TF-A/trusted-f=
irmware-a.git/tag/?h=3Dv2.5)=0D
+through a [GitHub build script](https://github.com/pftf/pitf/blob/master/.=
github/workflows/build.yml)=0D
that is designed to provide evidence that these binaries match the vanilla=
TF-A source.=0D
=0D
-As per the [AppVeyor build log](https://ci.appveyor.com/project/pbatard/pi=
tf/builds/32330098),=0D
+Per the [GitHub Actions log](https://github.com/pftf/pitf/runs/2822874196)=
,=0D
the SHA-256 sum for the bin can be validated to be as follows:=0D
-- `bl31.bin`: `b868ef51cead73ab96b2af778334eb063f6bc8009736c1a16080edc2179=
6dc6a`=0D
+- `bl31.bin`: `59c4486a0a257c8d630d8ea39d6a13d038cd50be4fc9a81985bf2c32a7c=
3fca6`=0D
=0D
For Raspberry Pi 4 usage, TF-A was built using the command:=0D
```=0D
diff --git a/Platform/RaspberryPi/RPi4/TrustedFirmware/bl31.bin b/Platform/=
RaspberryPi/RPi4/TrustedFirmware/bl31.bin
index 7ed86b7d4e2786d8ccbc9fdbcfd4f4bed7773715..c97aab3895bd3a831d1a3f8c675=
9959acf2dba04 100644
GIT binary patch
literal 41067
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

literal 41067
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
VcD1}TK}w?qm(O_VM-+$he*qMCb-Vxo

--=20
2.30.2.windows.1


[PATCH RESEND v1 2/2] ArmVirtPkg: Enable PCIe support for Kvmtool

PierreGondois
 

From: Sami Mujawar <sami.mujawar@arm.com>

PCIe support has been added to the Kvmtool virtual machine
manager. Therefore, enable PCIe support for Kvmtool firmware.

Signed-off-by: Sami Mujawar <sami.mujawar@arm.com>
Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com>
---
ArmVirtPkg/ArmVirtKvmTool.dsc | 35 +++++++++++++++++++++++++++++++++--
ArmVirtPkg/ArmVirtKvmTool.fdf | 11 ++++++++++-
2 files changed, 43 insertions(+), 3 deletions(-)

diff --git a/ArmVirtPkg/ArmVirtKvmTool.dsc b/ArmVirtPkg/ArmVirtKvmTool.dsc
index 01ebc903e077..3bd1cc72a1eb 100644
--- a/ArmVirtPkg/ArmVirtKvmTool.dsc
+++ b/ArmVirtPkg/ArmVirtKvmTool.dsc
@@ -1,7 +1,7 @@
# @file
# Workspace file for KVMTool virtual platform.
#
-# Copyright (c) 2018 - 2020, ARM Limited. All rights reserved.
+# Copyright (c) 2018 - 2021, ARM Limited. All rights reserved.
#
# SPDX-License-Identifier: BSD-2-Clause-Patent
#
@@ -60,7 +60,7 @@ [LibraryClasses.common]
PciPcdProducerLib|ArmVirtPkg/Library/FdtPciPcdProducerLib/FdtPciPcdProducerLib.inf
PciSegmentLib|MdePkg/Library/BasePciSegmentLibPci/BasePciSegmentLibPci.inf
PciHostBridgeLib|ArmVirtPkg/Library/FdtPciHostBridgeLib/FdtPciHostBridgeLib.inf
- PciHostBridgeUtilityLib|OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.inf
+ PciHostBridgeUtilityLib|ArmVirtPkg/Library/ArmVirtPciHostBridgeUtilityLib/ArmVirtPciHostBridgeUtilityLib.inf

TpmMeasurementLib|MdeModulePkg/Library/TpmMeasurementLibNull/TpmMeasurementLibNull.inf
AuthVariableLib|MdeModulePkg/Library/AuthVariableLibNull/AuthVariableLibNull.inf
@@ -175,6 +175,17 @@ [PcdsDynamicDefault.common]
gArmTokenSpaceGuid.PcdGicRedistributorsBase|0x0
gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase|0x0

+ #
+ # PCI settings
+ #
+ gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumeration|TRUE
+
+ # set PcdPciExpressBaseAddress to MAX_UINT64, which signifies that this
+ # PCD and PcdPciDisableBusEnumeration above have not been assigned yet
+ gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress|0xFFFFFFFFFFFFFFFF
+
+ gArmTokenSpaceGuid.PcdPciIoTranslation|0x0
+
#
# Set video resolution for boot options and for text setup.
# PlatformDxe can set the former at runtime.
@@ -322,3 +333,23 @@ [Components.common]
#
MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf
MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf
+ #
+ # PCI support
+ #
+ ArmPkg/Drivers/ArmPciCpuIo2Dxe/ArmPciCpuIo2Dxe.inf {
+ <LibraryClasses>
+ NULL|ArmVirtPkg/Library/FdtPciPcdProducerLib/FdtPciPcdProducerLib.inf
+ NULL|ArmVirtPkg/Library/BaseCachingPciExpressLib/BaseCachingPciExpressLib.inf
+ }
+ MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf {
+ <LibraryClasses>
+ NULL|ArmVirtPkg/Library/FdtPciPcdProducerLib/FdtPciPcdProducerLib.inf
+ NULL|ArmVirtPkg/Library/BaseCachingPciExpressLib/BaseCachingPciExpressLib.inf
+ }
+ MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf {
+ <LibraryClasses>
+ NULL|ArmVirtPkg/Library/FdtPciPcdProducerLib/FdtPciPcdProducerLib.inf
+ NULL|ArmVirtPkg/Library/BaseCachingPciExpressLib/BaseCachingPciExpressLib.inf
+ }
+ OvmfPkg/VirtioPciDeviceDxe/VirtioPciDeviceDxe.inf
+ OvmfPkg/Virtio10Dxe/Virtio10.inf
diff --git a/ArmVirtPkg/ArmVirtKvmTool.fdf b/ArmVirtPkg/ArmVirtKvmTool.fdf
index ebc82c5bd53c..076155199905 100644
--- a/ArmVirtPkg/ArmVirtKvmTool.fdf
+++ b/ArmVirtPkg/ArmVirtKvmTool.fdf
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2018 - 2020, ARM Limited. All rights reserved.
+# Copyright (c) 2018 - 2021, ARM Limited. All rights reserved.
#
# SPDX-License-Identifier: BSD-2-Clause-Patent
#
@@ -195,6 +195,15 @@ [FV.FvMain]
INF MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf
INF MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf

+ #
+ # PCI support
+ #
+ INF ArmPkg/Drivers/ArmPciCpuIo2Dxe/ArmPciCpuIo2Dxe.inf
+ INF MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf
+ INF MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf
+ INF OvmfPkg/VirtioPciDeviceDxe/VirtioPciDeviceDxe.inf
+ INF OvmfPkg/Virtio10Dxe/Virtio10.inf
+
#
# TianoCore logo (splash screen)
#
--
2.17.1


[PATCH RESEND v1 1/2] ArmVirtPkg: Add PCIe host bridge utility lib for ArmVirtPkg

PierreGondois
 

From: Sami Mujawar <sami.mujawar@arm.com>

PCIe support has been added to Kvmtool Virtual Machine Manager.
The PCI host bridge utility lib is used to retrieve information
about the Root Bridges in a platform.
Therefore, add an instance of PciHostBridgeUtilityLib as this is
required to enable PCIe support for Kvmtool firmware.

Signed-off-by: Sami Mujawar <sami.mujawar@arm.com>
Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com>
---
.../ArmVirtPciHostBridgeUtilityLib.c | 218 ++++++++++++++++++
.../ArmVirtPciHostBridgeUtilityLib.inf | 39 ++++
2 files changed, 257 insertions(+)
create mode 100644 ArmVirtPkg/Library/ArmVirtPciHostBridgeUtilityLib/ArmVirtPciHostBridgeUtilityLib.c
create mode 100644 ArmVirtPkg/Library/ArmVirtPciHostBridgeUtilityLib/ArmVirtPciHostBridgeUtilityLib.inf

diff --git a/ArmVirtPkg/Library/ArmVirtPciHostBridgeUtilityLib/ArmVirtPciHostBridgeUtilityLib.c b/ArmVirtPkg/Library/ArmVirtPciHostBridgeUtilityLib/ArmVirtPciHostBridgeUtilityLib.c
new file mode 100644
index 000000000000..90962caffd04
--- /dev/null
+++ b/ArmVirtPkg/Library/ArmVirtPciHostBridgeUtilityLib/ArmVirtPciHostBridgeUtilityLib.c
@@ -0,0 +1,218 @@
+/** @file
+ PCI Host Bridge utility functions for ArmVirt.
+
+ Copyright (c) 2021, Arm Limited. All rights reserved.<BR>
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <IndustryStandard/Acpi10.h>
+#include <IndustryStandard/Pci.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/DevicePathLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/PciHostBridgeLib.h>
+#include <Library/PciHostBridgeUtilityLib.h>
+#include <Library/PciLib.h>
+
+#pragma pack(1)
+typedef struct {
+ ACPI_HID_DEVICE_PATH AcpiDevicePath;
+ EFI_DEVICE_PATH_PROTOCOL EndDevicePath;
+} EFI_PCI_ROOT_BRIDGE_DEVICE_PATH;
+#pragma pack ()
+
+GLOBAL_REMOVE_IF_UNREFERENCED
+CHAR16 *mPciHostBridgeAcpiAddressSpaceTypeStr[] = {
+ L"Mem",
+ L"I/O",
+ L"Bus"
+};
+
+STATIC CONST EFI_PCI_ROOT_BRIDGE_DEVICE_PATH mEfiPciRootBridgeDevicePath = {
+ {
+ {
+ ACPI_DEVICE_PATH,
+ ACPI_DP,
+ {
+ (UINT8) (sizeof (ACPI_HID_DEVICE_PATH)),
+ (UINT8) ((sizeof (ACPI_HID_DEVICE_PATH)) >> 8)
+ }
+ },
+ EISA_PNP_ID (0x0A03), // HID
+ 0 // UID
+ },
+
+ {
+ END_DEVICE_PATH_TYPE,
+ END_ENTIRE_DEVICE_PATH_SUBTYPE,
+ {
+ END_DEVICE_PATH_LENGTH,
+ 0
+ }
+ }
+};
+
+
+GLOBAL_REMOVE_IF_UNREFERENCED
+CHAR16 *mPciHostBridgeLibAcpiAddressSpaceTypeStr[] = {
+ L"Mem", L"I/O", L"Bus"
+};
+
+STATIC PCI_ROOT_BRIDGE mRootBridge;
+
+/**
+ Utility function to return all the root bridge instances in an array.
+
+ @param [out] Count The number of root bridge instances.
+ @param [in] Attributes Initial attributes.
+ @param [in] AllocationAttributes Allocation attributes.
+ @param [in] DmaAbove4G DMA above 4GB memory.
+ @param [in] NoExtendedConfigSpace No Extended Config Space.
+ @param [in] BusMin Minimum Bus number, inclusive.
+ @param [in] BusMax Maximum Bus number, inclusive.
+ @param [in] Io IO aperture.
+ @param [in] Mem MMIO aperture.
+ @param [in] MemAbove4G MMIO aperture above 4G.
+ @param [in] PMem Prefetchable MMIO aperture.
+ @param [in] PMemAbove4G Prefetchable MMIO aperture above 4G.
+
+ @return All the root bridge instances in an array.
+**/
+PCI_ROOT_BRIDGE *
+EFIAPI
+PciHostBridgeUtilityGetRootBridges (
+ OUT UINTN *Count,
+ IN UINT64 Attributes,
+ IN UINT64 AllocationAttributes,
+ IN BOOLEAN DmaAbove4G,
+ IN BOOLEAN NoExtendedConfigSpace,
+ IN UINTN BusMin,
+ IN UINTN BusMax,
+ IN PCI_ROOT_BRIDGE_APERTURE *Io,
+ IN PCI_ROOT_BRIDGE_APERTURE *Mem,
+ IN PCI_ROOT_BRIDGE_APERTURE *MemAbove4G,
+ IN PCI_ROOT_BRIDGE_APERTURE *PMem,
+ IN PCI_ROOT_BRIDGE_APERTURE *PMemAbove4G
+ )
+{
+ if ((Count == NULL) ||
+ (Io == NULL) ||
+ (Mem == NULL) ||
+ (MemAbove4G == NULL) ||
+ (PMem == NULL) ||
+ (PMemAbove4G == NULL)) {
+ return NULL;
+ }
+
+
+ *Count = 1;
+
+ mRootBridge.Segment = 0;
+ mRootBridge.Supports = Attributes;
+ mRootBridge.Attributes = Attributes;
+
+ mRootBridge.DmaAbove4G = DmaAbove4G;
+ mRootBridge.NoExtendedConfigSpace = NoExtendedConfigSpace;
+ mRootBridge.ResourceAssigned = FALSE;
+
+ mRootBridge.AllocationAttributes = AllocationAttributes;
+
+ mRootBridge.Bus.Base = BusMin;
+ mRootBridge.Bus.Limit = BusMax;
+ mRootBridge.Io.Base = Io->Base;
+ mRootBridge.Io.Limit = Io->Limit;
+ mRootBridge.Mem.Base = Mem->Base;
+ mRootBridge.Mem.Limit = Mem->Limit;
+ mRootBridge.MemAbove4G.Base = MemAbove4G->Base;
+ mRootBridge.MemAbove4G.Limit = MemAbove4G->Limit;
+ mRootBridge.PMem.Base = PMem->Base;
+ mRootBridge.PMem.Limit = PMem->Limit;
+ mRootBridge.PMemAbove4G.Base = PMemAbove4G->Base;
+ mRootBridge.PMemAbove4G.Limit = PMemAbove4G->Limit;
+
+ mRootBridge.DevicePath =
+ (EFI_DEVICE_PATH_PROTOCOL*)&mEfiPciRootBridgeDevicePath;
+
+ return &mRootBridge;
+}
+
+/**
+ Utility function to free root bridge instances array from
+ PciHostBridgeUtilityGetRootBridges().
+
+ @param[in] Bridges The root bridge instances array.
+ @param[in] Count The count of the array.
+**/
+VOID
+EFIAPI
+PciHostBridgeUtilityFreeRootBridges (
+ IN PCI_ROOT_BRIDGE *Bridges,
+ IN UINTN Count
+ )
+{
+ // Nothing to do here.
+}
+
+/**
+ Utility function to inform the platform that the resource conflict happens.
+
+ @param[in] Configuration Pointer to PCI I/O and PCI memory resource
+ descriptors. The Configuration contains the
+ resources for all the root bridges. The resource
+ for each root bridge is terminated with END
+ descriptor and an additional END is appended
+ indicating the end of the entire resources. The
+ resource descriptor field values follow the
+ description in
+ EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL
+ .SubmitResources().
+**/
+VOID
+EFIAPI
+PciHostBridgeUtilityResourceConflict (
+ IN VOID *Configuration
+ )
+{
+ EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Descriptor;
+ UINTN RootBridgeIndex;
+ DEBUG ((DEBUG_ERROR, "PciHostBridge: Resource conflict happens!\n"));
+
+ RootBridgeIndex = 0;
+ Descriptor = (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR*)Configuration;
+ while (Descriptor->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR) {
+ DEBUG ((DEBUG_ERROR, "RootBridge[%d]:\n", RootBridgeIndex++));
+ for (; Descriptor->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR; Descriptor++) {
+ ASSERT (Descriptor->ResType <
+ ARRAY_SIZE (mPciHostBridgeAcpiAddressSpaceTypeStr)
+ );
+ DEBUG ((
+ DEBUG_ERROR,
+ " %s: Length/Alignment = 0x%lx / 0x%lx\n",
+ mPciHostBridgeAcpiAddressSpaceTypeStr[Descriptor->ResType],
+ Descriptor->AddrLen,
+ Descriptor->AddrRangeMax
+ ));
+ if (Descriptor->ResType == ACPI_ADDRESS_SPACE_TYPE_MEM) {
+ DEBUG ((
+ DEBUG_ERROR,
+ " Granularity/SpecificFlag = %ld / %02x%s\n",
+ Descriptor->AddrSpaceGranularity,
+ Descriptor->SpecificFlag,
+ ((Descriptor->SpecificFlag &
+ EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE_PREFETCHABLE
+ ) != 0) ? L" (Prefetchable)" : L""
+ ));
+ }
+ }
+ //
+ // Skip the END descriptor for root bridge
+ //
+ ASSERT (Descriptor->Desc == ACPI_END_TAG_DESCRIPTOR);
+ Descriptor = (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR*)(
+ (EFI_ACPI_END_TAG_DESCRIPTOR*)Descriptor + 1
+ );
+ }
+}
diff --git a/ArmVirtPkg/Library/ArmVirtPciHostBridgeUtilityLib/ArmVirtPciHostBridgeUtilityLib.inf b/ArmVirtPkg/Library/ArmVirtPciHostBridgeUtilityLib/ArmVirtPciHostBridgeUtilityLib.inf
new file mode 100644
index 000000000000..80fdd2b1e55e
--- /dev/null
+++ b/ArmVirtPkg/Library/ArmVirtPciHostBridgeUtilityLib/ArmVirtPciHostBridgeUtilityLib.inf
@@ -0,0 +1,39 @@
+## @file
+# PciHostBridgeLib utility functions for ArmVirt.
+#
+# Copyright (c) 2021, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+#
+##
+
+[Defines]
+ INF_VERSION = 0x0001001B
+ BASE_NAME = ArmVirtPciHostBridgeUtilityLib
+ FILE_GUID = 22A8844E-2AE7-4BF1-91FA-6EFDE3FE540C
+ MODULE_TYPE = DXE_DRIVER
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = PciHostBridgeUtilityLib
+
+#
+# The following information is for reference only and not required by the build
+# tools.
+#
+# VALID_ARCHITECTURES = AARCH64 ARM
+#
+
+[Sources]
+ ArmVirtPciHostBridgeUtilityLib.c
+
+[Packages]
+ MdeModulePkg/MdeModulePkg.dec
+ MdePkg/MdePkg.dec
+ OvmfPkg/OvmfPkg.dec
+
+[LibraryClasses]
+ BaseMemoryLib
+ DebugLib
+ DevicePathLib
+ MemoryAllocationLib
+ PciLib
--
2.17.1


[PATCH RESEND v1 0/2] ArmVirtPkg: Enable PCIe support for Kvmtool

PierreGondois
 

From: Pierre Gondois <Pierre.Gondois@arm.com>

PCIe support has been added to the Kvmtool virtual machine
manager. Therefore, add a PciHostBridgeUtilityLib and enable
PCIe support for Kvmtool firmware.

The patches were re-send as the devel@edk2.groups.io was not included.

The patches can be seen at: https://github.com/PierreARM/edk2/tree/1413_Enable_ArmVirt_Pci_v1
The results of the CI can be seen at: https://github.com/tianocore/edk2/pull/1718

Sami Mujawar (2):
ArmVirtPkg: Add PCIe host bridge utility lib for ArmVirtPkg
ArmVirtPkg: Enable PCIe support for Kvmtool

ArmVirtPkg/ArmVirtKvmTool.dsc | 35 ++-
ArmVirtPkg/ArmVirtKvmTool.fdf | 11 +-
.../ArmVirtPciHostBridgeUtilityLib.c | 219 ++++++++++++++++++
.../ArmVirtPciHostBridgeUtilityLib.inf | 39 ++++
4 files changed, 301 insertions(+), 3 deletions(-)
create mode 100644 ArmVirtPkg/Library/ArmVirtPciHostBridgeUtilityLib/ArmVirtPciHostBridgeUtilityLib.c
create mode 100644 ArmVirtPkg/Library/ArmVirtPciHostBridgeUtilityLib/ArmVirtPciHostBridgeUtilityLib.inf

--
2.17.1


Re: [PATCH v2 2/3] UefiPayloadPkg: Add PayloadLoaderPeim which can load ELF payload

Ni, Ray
 

Marvin,
I have sent out https://edk2.groups.io/g/devel/message/76429 <UefiPayloadPkg/PayloadLoader: Add more checks to verify ELF images> to address your feedbacks.

Can I merge the 3 patches first? (we can continue discussing the more-checks patch.)

Thanks,
Ray

-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Ni, Ray
Sent: Thursday, June 10, 2021 7:37 PM
To: devel@edk2.groups.io; mcb30@ipxe.org; mhaeuser@posteo.de
Cc: Ma, Maurice <maurice.ma@intel.com>; Dong, Guo <guo.dong@intel.com>; You, Benjamin <benjamin.you@intel.com>
Subject: Re: [edk2-devel] [PATCH v2 2/3] UefiPayloadPkg: Add PayloadLoaderPeim which can load ELF payload



-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Michael Brown
Sent: Thursday, June 10, 2021 6:43 PM
To: devel@edk2.groups.io; mhaeuser@posteo.de; Ni, Ray <ray.ni@intel.com>
Cc: Ma, Maurice <maurice.ma@intel.com>; Dong, Guo <guo.dong@intel.com>; You, Benjamin <benjamin.you@intel.com>
Subject: Re: [edk2-devel] [PATCH v2 2/3] UefiPayloadPkg: Add PayloadLoaderPeim which can load ELF payload

On 10/06/2021 11:13, Marvin Häuser wrote:
On 10.06.21 11:39, Ni, Ray wrote:
Maybe for some context, my main issue at first was that the checks are
all proper runtime checks with no ASSERTs at all, so I got confused how
this situation could happen in a realistic scenario. I needed to trace
the ParseStatus data flow to understand the idea is basically the same
as in the PE library. Code in a way is self-documenting, and this
personally gave me a hard time understanding why it is written this way.
But thanks for clarifying your intention! :)
I assume you are ok with the ParseStatus.
I will send new version based on mail discussion. Thanks!
I don't need to be okay with anything, I'm not a maintainer nor an
authority. But I gave my opinion, which is that it is dead code that
makes the design/flow harder to understand for a third party, at no
obvious benefit.
FWIW, I strongly agree with Marvin on this: having ParseStatus in its
current form is a bad idea since it adds no value but does incur a cost.
OK. I can remove that😊





Re: [PATCH v2 0/4] Update Node to 14.x to resolve cspell failure

PierreGondois
 

Hi Kun and Sean,
As a follow-up to your patch-set, it seems that the spell checker does not currently run as expected. It only runs on files that are 'one level deep' in each package.
I.e.:
This was taken from Build/CI_BUILDLOG.txt from the TARGET_ARM_ARMPLATFORM artifact at https://dev.azure.com/tianocore/edk2-ci/_build/results?buildId=23939&view=artifacts&pathAsName=false&type=publishedArtifacts but this can be checked when running the CI locally on ArmPlatformPkg:

-------Log start---------
INFO - Cmd to run is: cspell --config /home/vsts/work/1/s/Build/ArmPlatformPkg/cspell_actual_config.json ArmPlatformPkg/**/*.c ArmPlatformPkg/**/*.h ArmPlatformPkg/**/*.nasm ArmPlatformPkg/**/*.masm ArmPlatformPkg/**/*.asl ArmPlatformPkg/**/*.dsc ArmPlatformPkg/**/*.dec ArmPlatformPkg/**/*.fdf ArmPlatformPkg/**/*.inf ArmPlatformPkg/**/*.md ArmPlatformPkg/**/*.txt
INFO - ------------------------------------------------
INFO - --------------Cmd Output Starting---------------
INFO - ------------------------------------------------
INFO -  1/22 ./ArmPlatformPkg/MemoryInitPei/MemoryInitPeiLib.c 829.48ms
INFO -  2/22 ./ArmPlatformPkg/MemoryInitPei/MemoryInitPeim.c 37.06ms
INFO -  3/22 ./ArmPlatformPkg/PlatformPei/PlatformPeiLib.c 13.01ms
INFO -  4/22 ./ArmPlatformPkg/PlatformPei/PlatformPeim.c 16.99ms
INFO -  5/22 ./ArmPlatformPkg/PrePeiCore/MainMPCore.c 25.68ms
INFO -  6/22 ./ArmPlatformPkg/PrePeiCore/MainUniCore.c 19.50ms
INFO -  7/22 ./ArmPlatformPkg/PrePeiCore/PrePeiCore.c 20.86ms
INFO -  8/22 ./ArmPlatformPkg/PrePi/MainMPCore.c 18.98ms
INFO -  9/22 ./ArmPlatformPkg/PrePi/MainUniCore.c 9.86ms
INFO - 10/22 ./ArmPlatformPkg/PrePi/PrePi.c 26.83ms
INFO - 11/22 ./ArmPlatformPkg/PrePeiCore/PrePeiCore.h 15.71ms
INFO - 12/22 ./ArmPlatformPkg/PrePi/PrePi.h 16.49ms
INFO - 13/22 ./ArmPlatformPkg/ArmPlatformPkg.dsc 21.03ms
INFO - 14/22 ./ArmPlatformPkg/ArmPlatformPkg.dec 24.63ms
INFO - 15/22 ./ArmPlatformPkg/MemoryInitPei/MemoryInitPeiLib.inf 11.12ms
INFO - 16/22 ./ArmPlatformPkg/MemoryInitPei/MemoryInitPeim.inf 15.85ms
INFO - 17/22 ./ArmPlatformPkg/PlatformPei/PlatformPeiLib.inf 9.89ms
INFO - 18/22 ./ArmPlatformPkg/PlatformPei/PlatformPeim.inf 9.14ms
INFO - 19/22 ./ArmPlatformPkg/PrePeiCore/PrePeiCoreMPCore.inf 13.97ms
INFO - 20/22 ./ArmPlatformPkg/PrePeiCore/PrePeiCoreUniCore.inf 9.92ms
INFO - 21/22 ./ArmPlatformPkg/PrePi/PeiMPCore.inf 12.01ms
INFO - 22/22 ./ArmPlatformPkg/PrePi/PeiUniCore.inf 18.06ms
INFO - CSpell: Files checked: 22, Issues found: 0 in 0 files
INFO - ------------------------------------------------
INFO - --------------Cmd Output Finished---------------
INFO - --------- Running Time (mm:ss): 00:01 ----------
INFO - ----------- Return Code: 0x00000000 ------------
INFO - ------------------------------------------------
PROGRESS - --->Test Success: Spell Check Test NO-TARGET
-------Log end---------

As shown, in the "ArmPlatformPkg/**/*.c" expression, "**" is evaluated as a single directory instead of any number of directories. This can be fixed by:
 - setting the globstar variable (tried on bash): "shopt -s globstar", run "shopt globstar" to check its value, or
 - modifying .pytool/Plugin/SpellCheck/SpellCheck.py to add quotes around the files to check so that cspell evaluates the "**" by itself. This solution seems better as it doesn't require to modify the environment.

Regards,
Pierre

On 6/14/21 7:34 PM, Kun Qin via groups.io wrote:
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3445

This patch series is a follow up of previous submission:
https://edk2.groups.io/g/devel/message/76419

v2 patches mainly focus on feedback for reviewed commits in v1 patches,
including:
a. Adding "Reviewed-by" tags for applicable patches;
b. Adding "Signed-Off-by" tags for myself for all patches;

Patch v2 branch: https://github.com/kuqin12/edk2/tree/node_14_v2

Cc: Sean Brogan <sean.brogan@microsoft.com>
Cc: Bret Barkelew <Bret.Barkelew@microsoft.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>
Cc: Leif Lindholm <leif@nuviainc.com>
Cc: Sami Mujawar <sami.mujawar@arm.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Supreeth Venkatesh <supreeth.venkatesh@arm.com>

Kun Qin (1):
Azurepipeline: SpellCheck: Enforce Node dependency to use version 14.x

Sean Brogan (3):
StandaloneMmPkg: Core: Spelling error in comment
ArmPlatformPkg: SpellCheck: Switch spellcheck CI to AuditOnly
ArmPkg: SpellCheck: Update valid acronyms in ExtendedWords

StandaloneMmPkg/Core/Dispatcher.c | 2 +-
.azurepipelines/templates/spell-check-prereq-steps.yml | 2 +-
ArmPkg/ArmPkg.ci.yaml | 19 +++++++++++++++++++
ArmPlatformPkg/ArmPlatformPkg.ci.yaml | 2 +-
4 files changed, 22 insertions(+), 3 deletions(-)


Re: [PATCH v3 3/8] SecurityPkg: Create include file for default key content.

Yao, Jiewen
 

I don’t think it is a good idea to put it to security pkg, because it is a platform configuration.

If the goal is to create one include file, you can put it to other common platform pkg, such as https://github.com/tianocore/edk2-platforms/tree/master/Platform/Intel/MinPlatformPkg/Include/Fdf

Thank you
Yao Jiewen

-----Original Message-----
From: Grzegorz Bernacki <gjb@semihalf.com>
Sent: Tuesday, June 15, 2021 9:40 PM
To: Yao, Jiewen <jiewen.yao@intel.com>; devel@edk2.groups.io
Subject: Re: [PATCH v3 3/8] SecurityPkg: Create include file for default key
content.

Hi,

Adding edk-devel group back in the loop...
I removed it by mistake.

greg

wt., 15 cze 2021 o 14:16 Grzegorz Bernacki <gjb@semihalf.com> napisał(a):

It was the original design, but it was changed when RFC was reviewed.
Please see:
https://edk2.groups.io/g/rfc/topic/edk2_devel_rfc_secure/82139806

I think that having an include file is better than duplicating the
snippet in many platform files. If someone wants to use 1 key, then
the include file can still be used. Of course, if someone wants to use
more, then they must add entries in platform FDF, but still I like the
idea of include file.

thanks,
greg

wt., 15 cze 2021 o 13:59 Yao, Jiewen <jiewen.yao@intel.com> napisał(a):

I think it is platform policy to decide how many keys. (it could be 1 or 3 or 10).

I recommend to move this to a platform fdf.

Thank you
Yao Jiewen


-----Original Message-----
From: Grzegorz Bernacki <gjb@semihalf.com>
Sent: Tuesday, June 15, 2021 7:07 PM
To: Yao, Jiewen <jiewen.yao@intel.com>
Subject: Re: [PATCH v3 3/8] SecurityPkg: Create include file for default key
content.

Hi,

Thanks for your comments.
The idea was to allow the user to specify more than one key. One can
use not only Microsoft or Canonical keys, but also generate new keys
and use them.
I can move the include file to another directory, but which place is
the best for it. I thought that since the rest of the functionality is
placed in SecurityPkg, I should also place that file there.
thanks,
greg


wt., 15 cze 2021 o 02:52 Yao, Jiewen <jiewen.yao@intel.com> napisał(a):

Hi
I am not sure why we hardcode 3 items for each.

Can we move this fdf to platform pkg, instead of security pkg ?

Thank you
Yao Jiewen

-----Original Message-----
From: Grzegorz Bernacki <gjb@semihalf.com>
Sent: Monday, June 14, 2021 5:43 PM
To: devel@edk2.groups.io
Cc: leif@nuviainc.com; ardb+tianocore@kernel.org; Samer.El-Haj-
Mahmoud@arm.com; sunny.Wang@arm.com; mw@semihalf.com;
upstream@semihalf.com; Yao, Jiewen <jiewen.yao@intel.com>; Wang,
Jian
J
<jian.j.wang@intel.com>; Xu, Min M <min.m.xu@intel.com>;
lersek@redhat.com; sami.mujawar@arm.com; afish@apple.com; Ni,
Ray
<ray.ni@intel.com>; Justen, Jordan L <jordan.l.justen@intel.com>;
rebecca@bsdio.com; grehan@freebsd.org;
thomas.abraham@arm.com;
Chiu,
Chasel <chasel.chiu@intel.com>; Desimone, Nathaniel L
<nathaniel.l.desimone@intel.com>; gaoliming@byosoft.com.cn; Dong,
Eric
<eric.dong@intel.com>; Kinney, Michael D
<michael.d.kinney@intel.com>;
Sun,
Zailiang <zailiang.sun@intel.com>; Qian, Yi <yi.qian@intel.com>;
graeme@nuviainc.com; rad@semihalf.com; pete@akeo.ie; Grzegorz
Bernacki
<gjb@semihalf.com>
Subject: [PATCH v3 3/8] SecurityPkg: Create include file for default key
content.

This commits add file which can be included by platform Flash
Description File. It allows to specify certificate files, which
will be embedded into binary file. The content of these files
can be used to initialize Secure Boot default keys and databases.

Signed-off-by: Grzegorz Bernacki <gjb@semihalf.com>
---
SecurityPkg/SecureBootDefaultKeys.fdf.inc | 70
++++++++++++++++++++
1 file changed, 70 insertions(+)
create mode 100644 SecurityPkg/SecureBootDefaultKeys.fdf.inc

diff --git a/SecurityPkg/SecureBootDefaultKeys.fdf.inc
b/SecurityPkg/SecureBootDefaultKeys.fdf.inc
new file mode 100644
index 0000000000..bf4f2d42de
--- /dev/null
+++ b/SecurityPkg/SecureBootDefaultKeys.fdf.inc
@@ -0,0 +1,70 @@
+## @file
+# FDF include file which allows to embed Secure Boot keys
+#
+# Copyright (c) 2021, ARM Limited. All rights reserved.
+# Copyright (c) 2021, Semihalf. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+
+!if $(DEFAULT_KEYS) == TRUE
+ FILE FREEFORM = 85254ea7-4759-4fc4-82d4-5eed5fb0a4a0 {
+ !ifdef $(PK_DEFAULT_FILE)
+ SECTION RAW = $(PK_DEFAULT_FILE)
+ !endif
+ SECTION UI = "PK Default"
+ }
+
+ FILE FREEFORM = 6f64916e-9f7a-4c35-b952-cd041efb05a3 {
+ !ifdef $(KEK_DEFAULT_FILE1)
+ SECTION RAW = $(KEK_DEFAULT_FILE1)
+ !endif
+ !ifdef $(KEK_DEFAULT_FILE2)
+ SECTION RAW = $(KEK_DEFAULT_FILE2)
+ !endif
+ !ifdef $(KEK_DEFAULT_FILE3)
+ SECTION RAW = $(KEK_DEFAULT_FILE3)
+ !endif
+ SECTION UI = "KEK Default"
+ }
+
+ FILE FREEFORM = c491d352-7623-4843-accc-2791a7574421 {
+ !ifdef $(DB_DEFAULT_FILE1)
+ SECTION RAW = $(DB_DEFAULT_FILE1)
+ !endif
+ !ifdef $(DB_DEFAULT_FILE2)
+ SECTION RAW = $(DB_DEFAULT_FILE2)
+ !endif
+ !ifdef $(DB_DEFAULT_FILE3)
+ SECTION RAW = $(DB_DEFAULT_FILE3)
+ !endif
+ SECTION UI = "DB Default"
+ }
+
+ FILE FREEFORM = 36c513ee-a338-4976-a0fb-6ddba3dafe87 {
+ !ifdef $(DBT_DEFAULT_FILE1)
+ SECTION RAW = $(DBT_DEFAULT_FILE1)
+ !endif
+ !ifdef $(DBT_DEFAULT_FILE2)
+ SECTION RAW = $(DBT_DEFAULT_FILE2)
+ !endif
+ !ifdef $(DBT_DEFAULT_FILE3)
+ SECTION RAW = $(DBT_DEFAULT_FILE3)
+ !endif
+ SECTION UI = "DBT Default"
+ }
+
+ FILE FREEFORM = 5740766a-718e-4dc0-9935-c36f7d3f884f {
+ !ifdef $(DBX_DEFAULT_FILE1)
+ SECTION RAW = $(DBX_DEFAULT_FILE1)
+ !endif
+ !ifdef $(DBX_DEFAULT_FILE2)
+ SECTION RAW = $(DBX_DEFAULT_FILE2)
+ !endif
+ !ifdef $(DBX_DEFAULT_FILE3)
+ SECTION RAW = $(DBX_DEFAULT_FILE3)
+ !endif
+ SECTION UI = "DBX Default"
+ }
+
+!endif
--
2.25.1


Re: [PATCH v3 3/8] SecurityPkg: Create include file for default key content.

Grzegorz Bernacki
 

Hi,

Adding edk-devel group back in the loop...
I removed it by mistake.

greg

wt., 15 cze 2021 o 14:16 Grzegorz Bernacki <gjb@semihalf.com> napisał(a):


It was the original design, but it was changed when RFC was reviewed.
Please see:
https://edk2.groups.io/g/rfc/topic/edk2_devel_rfc_secure/82139806

I think that having an include file is better than duplicating the
snippet in many platform files. If someone wants to use 1 key, then
the include file can still be used. Of course, if someone wants to use
more, then they must add entries in platform FDF, but still I like the
idea of include file.

thanks,
greg

wt., 15 cze 2021 o 13:59 Yao, Jiewen <jiewen.yao@intel.com> napisał(a):

I think it is platform policy to decide how many keys. (it could be 1 or 3 or 10).

I recommend to move this to a platform fdf.

Thank you
Yao Jiewen


-----Original Message-----
From: Grzegorz Bernacki <gjb@semihalf.com>
Sent: Tuesday, June 15, 2021 7:07 PM
To: Yao, Jiewen <jiewen.yao@intel.com>
Subject: Re: [PATCH v3 3/8] SecurityPkg: Create include file for default key
content.

Hi,

Thanks for your comments.
The idea was to allow the user to specify more than one key. One can
use not only Microsoft or Canonical keys, but also generate new keys
and use them.
I can move the include file to another directory, but which place is
the best for it. I thought that since the rest of the functionality is
placed in SecurityPkg, I should also place that file there.
thanks,
greg


wt., 15 cze 2021 o 02:52 Yao, Jiewen <jiewen.yao@intel.com> napisał(a):

Hi
I am not sure why we hardcode 3 items for each.

Can we move this fdf to platform pkg, instead of security pkg ?

Thank you
Yao Jiewen

-----Original Message-----
From: Grzegorz Bernacki <gjb@semihalf.com>
Sent: Monday, June 14, 2021 5:43 PM
To: devel@edk2.groups.io
Cc: leif@nuviainc.com; ardb+tianocore@kernel.org; Samer.El-Haj-
Mahmoud@arm.com; sunny.Wang@arm.com; mw@semihalf.com;
upstream@semihalf.com; Yao, Jiewen <jiewen.yao@intel.com>; Wang, Jian
J
<jian.j.wang@intel.com>; Xu, Min M <min.m.xu@intel.com>;
lersek@redhat.com; sami.mujawar@arm.com; afish@apple.com; Ni, Ray
<ray.ni@intel.com>; Justen, Jordan L <jordan.l.justen@intel.com>;
rebecca@bsdio.com; grehan@freebsd.org; thomas.abraham@arm.com;
Chiu,
Chasel <chasel.chiu@intel.com>; Desimone, Nathaniel L
<nathaniel.l.desimone@intel.com>; gaoliming@byosoft.com.cn; Dong, Eric
<eric.dong@intel.com>; Kinney, Michael D <michael.d.kinney@intel.com>;
Sun,
Zailiang <zailiang.sun@intel.com>; Qian, Yi <yi.qian@intel.com>;
graeme@nuviainc.com; rad@semihalf.com; pete@akeo.ie; Grzegorz
Bernacki
<gjb@semihalf.com>
Subject: [PATCH v3 3/8] SecurityPkg: Create include file for default key
content.

This commits add file which can be included by platform Flash
Description File. It allows to specify certificate files, which
will be embedded into binary file. The content of these files
can be used to initialize Secure Boot default keys and databases.

Signed-off-by: Grzegorz Bernacki <gjb@semihalf.com>
---
SecurityPkg/SecureBootDefaultKeys.fdf.inc | 70 ++++++++++++++++++++
1 file changed, 70 insertions(+)
create mode 100644 SecurityPkg/SecureBootDefaultKeys.fdf.inc

diff --git a/SecurityPkg/SecureBootDefaultKeys.fdf.inc
b/SecurityPkg/SecureBootDefaultKeys.fdf.inc
new file mode 100644
index 0000000000..bf4f2d42de
--- /dev/null
+++ b/SecurityPkg/SecureBootDefaultKeys.fdf.inc
@@ -0,0 +1,70 @@
+## @file
+# FDF include file which allows to embed Secure Boot keys
+#
+# Copyright (c) 2021, ARM Limited. All rights reserved.
+# Copyright (c) 2021, Semihalf. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+
+!if $(DEFAULT_KEYS) == TRUE
+ FILE FREEFORM = 85254ea7-4759-4fc4-82d4-5eed5fb0a4a0 {
+ !ifdef $(PK_DEFAULT_FILE)
+ SECTION RAW = $(PK_DEFAULT_FILE)
+ !endif
+ SECTION UI = "PK Default"
+ }
+
+ FILE FREEFORM = 6f64916e-9f7a-4c35-b952-cd041efb05a3 {
+ !ifdef $(KEK_DEFAULT_FILE1)
+ SECTION RAW = $(KEK_DEFAULT_FILE1)
+ !endif
+ !ifdef $(KEK_DEFAULT_FILE2)
+ SECTION RAW = $(KEK_DEFAULT_FILE2)
+ !endif
+ !ifdef $(KEK_DEFAULT_FILE3)
+ SECTION RAW = $(KEK_DEFAULT_FILE3)
+ !endif
+ SECTION UI = "KEK Default"
+ }
+
+ FILE FREEFORM = c491d352-7623-4843-accc-2791a7574421 {
+ !ifdef $(DB_DEFAULT_FILE1)
+ SECTION RAW = $(DB_DEFAULT_FILE1)
+ !endif
+ !ifdef $(DB_DEFAULT_FILE2)
+ SECTION RAW = $(DB_DEFAULT_FILE2)
+ !endif
+ !ifdef $(DB_DEFAULT_FILE3)
+ SECTION RAW = $(DB_DEFAULT_FILE3)
+ !endif
+ SECTION UI = "DB Default"
+ }
+
+ FILE FREEFORM = 36c513ee-a338-4976-a0fb-6ddba3dafe87 {
+ !ifdef $(DBT_DEFAULT_FILE1)
+ SECTION RAW = $(DBT_DEFAULT_FILE1)
+ !endif
+ !ifdef $(DBT_DEFAULT_FILE2)
+ SECTION RAW = $(DBT_DEFAULT_FILE2)
+ !endif
+ !ifdef $(DBT_DEFAULT_FILE3)
+ SECTION RAW = $(DBT_DEFAULT_FILE3)
+ !endif
+ SECTION UI = "DBT Default"
+ }
+
+ FILE FREEFORM = 5740766a-718e-4dc0-9935-c36f7d3f884f {
+ !ifdef $(DBX_DEFAULT_FILE1)
+ SECTION RAW = $(DBX_DEFAULT_FILE1)
+ !endif
+ !ifdef $(DBX_DEFAULT_FILE2)
+ SECTION RAW = $(DBX_DEFAULT_FILE2)
+ !endif
+ !ifdef $(DBX_DEFAULT_FILE3)
+ SECTION RAW = $(DBX_DEFAULT_FILE3)
+ !endif
+ SECTION UI = "DBX Default"
+ }
+
+!endif
--
2.25.1


[PATCH] UefiPayloadPkg/UefiPayloadEntry: Improve bootloader memrange parsing

Patrick Rudolph
 

Currently several DXE crash due to invalid memory resource settings.
coreboot and slimbootloader provide an e820 compatible memory map,
which doesn't work well with EDK2 as the e820 spec is missing MMIO regions.
In e820 'reserved' could either mean "DRAM used by boot firmware" or "MMIO
in use and not detectable by OS".

Guess Top of lower usable DRAM (TOLUD) by walking memory ranges and then
mark everything reserved below TOLUD as DRAM and everything reserved above
TOLUD as MMIO.

This fixes several assertions seen in PciHostBridgeDxe.

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
---
.../UefiPayloadEntry/UefiPayloadEntry.c | 187 +++++++++++++++++-
.../UefiPayloadEntry/UefiPayloadEntry.h | 10 +
2 files changed, 194 insertions(+), 3 deletions(-)

diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c b/UefiPaylo=
adPkg/UefiPayloadEntry/UefiPayloadEntry.c
index 805f5448d9..d20e1a0862 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c
@@ -7,10 +7,162 @@
=0D
#include "UefiPayloadEntry.h"=0D
=0D
+STATIC UINT32 TopOfLowerUsableDram =3D 0;=0D
+=0D
/**=0D
Callback function to build resource descriptor HOB=0D
=0D
This function build a HOB based on the memory map entry info.=0D
+ It creates only EFI_RESOURCE_MEMORY_MAPPED_IO and EFI_RESOURCE_MEMORY_R=
ESERVED=0D
+ resources.=0D
+=0D
+ @param MemoryMapEntry Memory map entry info got from bootloader=
.=0D
+ @param Params A pointer to ACPI_BOARD_INFO.=0D
+=0D
+ @retval RETURN_SUCCESS Successfully build a HOB.=0D
+ @retval EFI_INVALID_PARAMETER Invalid parameter provided.=0D
+**/=0D
+EFI_STATUS=0D
+MemInfoCallbackMMIO (=0D
+ IN MEMROY_MAP_ENTRY *MemoryMapEntry,=0D
+ IN VOID *Params=0D
+ )=0D
+{=0D
+ EFI_PHYSICAL_ADDRESS Base;=0D
+ EFI_RESOURCE_TYPE Type;=0D
+ UINT64 Size;=0D
+ EFI_RESOURCE_ATTRIBUTE_TYPE Attribue;=0D
+ ACPI_BOARD_INFO *AcpiBoardInfo;=0D
+=0D
+ AcpiBoardInfo =3D (ACPI_BOARD_INFO *)Params;=0D
+ if (AcpiBoardInfo =3D=3D NULL) {=0D
+ return EFI_INVALID_PARAMETER;=0D
+ }=0D
+=0D
+ //=0D
+ // Skip types already handled in MemInfoCallback=0D
+ //=0D
+ if (MemoryMapEntry->Type =3D=3D E820_RAM || MemoryMapEntry->Type =3D=3D =
E820_ACPI) {=0D
+ return RETURN_SUCCESS;=0D
+ }=0D
+=0D
+ if (MemoryMapEntry->Base =3D=3D AcpiBoardInfo->PcieBaseAddress) {=0D
+ //=0D
+ // MMCONF is always MMIO=0D
+ //=0D
+ Type =3D EFI_RESOURCE_MEMORY_MAPPED_IO;=0D
+ } else if (MemoryMapEntry->Base < TopOfLowerUsableDram) {=0D
+ //=0D
+ // It's in DRAM and thus must be reserved=0D
+ //=0D
+ Type =3D EFI_RESOURCE_MEMORY_RESERVED;=0D
+ } else if (MemoryMapEntry->Base < 0x100000000ULL &&=0D
+ MemoryMapEntry->Base >=3D TopOfLowerUsableDram) {=0D
+ //=0D
+ // It's not in DRAM, must be MMIO=0D
+ //=0D
+ Type =3D EFI_RESOURCE_MEMORY_MAPPED_IO;=0D
+ } else {=0D
+ Type =3D EFI_RESOURCE_MEMORY_RESERVED;=0D
+ }=0D
+=0D
+ Base =3D MemoryMapEntry->Base;=0D
+ Size =3D MemoryMapEntry->Size;=0D
+=0D
+ Attribue =3D EFI_RESOURCE_ATTRIBUTE_PRESENT |=0D
+ EFI_RESOURCE_ATTRIBUTE_INITIALIZED |=0D
+ EFI_RESOURCE_ATTRIBUTE_TESTED |=0D
+ EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |=0D
+ EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |=0D
+ EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |=0D
+ EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE;=0D
+=0D
+ BuildResourceDescriptorHob (Type, Attribue, (EFI_PHYSICAL_ADDRESS)Base, =
Size);=0D
+ DEBUG ((DEBUG_INFO , "buildhob: base =3D 0x%lx, size =3D 0x%lx, type =3D=
0x%x\n", Base, Size, Type));=0D
+=0D
+ if (MemoryMapEntry->Type =3D=3D E820_NVS) {=0D
+ BuildMemoryAllocationHob (Base, Size, EfiACPIMemoryNVS);=0D
+ } else if (MemoryMapEntry->Type =3D=3D E820_UNUSABLE ||=0D
+ MemoryMapEntry->Type =3D=3D E820_DISABLED) {=0D
+ BuildMemoryAllocationHob (Base, Size, EfiUnusableMemory);=0D
+ } else if (MemoryMapEntry->Type =3D=3D E820_PMEM) {=0D
+ BuildMemoryAllocationHob (Base, Size, EfiPersistentMemory);=0D
+ }=0D
+=0D
+ return RETURN_SUCCESS;=0D
+}=0D
+=0D
+=0D
+/**=0D
+ Callback function to find TOLUD (Top of Lower Usable DRAM)=0D
+=0D
+ Estimate where TOLUD (Top of Lower Usable DRAM) resides. The exact posi=
tion=0D
+ would require platform specific code.=0D
+=0D
+ @param MemoryMapEntry Memory map entry info got from bootloader=
.=0D
+ @param Params Not used for now.=0D
+=0D
+ @retval RETURN_SUCCESS Successfully updated TopOfLowerUsableDram=
.=0D
+**/=0D
+EFI_STATUS=0D
+FindToludCallback (=0D
+ IN MEMROY_MAP_ENTRY *MemoryMapEntry,=0D
+ IN VOID *Params=0D
+ )=0D
+{=0D
+ //=0D
+ // This code assumes that the memory map on this x86 machine below 4GiB =
is continous=0D
+ // until TOLUD. In addition it assumes that the bootloader provided memo=
ry tables have=0D
+ // no "holes" and thus the first memory range not covered by e820 marks =
the end of=0D
+ // usable DRAM. In addition it's assumed that every reserved memory regi=
on touching=0D
+ // usable RAM is also covering DRAM, everything else that is marked rese=
rved thus must be=0D
+ // MMIO not detectable by bootloader/OS=0D
+ //=0D
+=0D
+ //=0D
+ // Skip memory types not RAM or reserved=0D
+ //=0D
+ if (MemoryMapEntry->Type =3D=3D E820_NVS || MemoryMapEntry->Type =3D=3D =
E820_UNUSABLE ||=0D
+ MemoryMapEntry->Type =3D=3D E820_DISABLED || MemoryMapEntry->Type =3D=
=3D E820_PMEM) {=0D
+ return RETURN_SUCCESS;=0D
+ }=0D
+=0D
+ //=0D
+ // Skip resources above 4GiB=0D
+ //=0D
+ if (MemoryMapEntry->Base >=3D 0x100000000ULL) {=0D
+ return RETURN_SUCCESS;=0D
+ }=0D
+=0D
+ if ((MemoryMapEntry->Type =3D=3D E820_RAM) ||=0D
+ (MemoryMapEntry->Type =3D=3D E820_ACPI)) {=0D
+ //=0D
+ // It's usable DRAM. Update TOLUD.=0D
+ //=0D
+ if (TopOfLowerUsableDram < (MemoryMapEntry->Base + MemoryMapEntry->Siz=
e)) {=0D
+ TopOfLowerUsableDram =3D MemoryMapEntry->Base + MemoryMapEntry->Size=
;=0D
+ }=0D
+ } else {=0D
+ //=0D
+ // It might be reserved DRAM or MMIO.=0D
+ //=0D
+ // If it touches usable DRAM at Base assume it's DRAM as well,=0D
+ // as it could be bootloader installed tables, TSEG, GTT, ...=0D
+ //=0D
+ if (TopOfLowerUsableDram =3D=3D MemoryMapEntry->Base) {=0D
+ TopOfLowerUsableDram =3D MemoryMapEntry->Base + MemoryMapEntry->Size=
;=0D
+ }=0D
+ }=0D
+=0D
+ return RETURN_SUCCESS;=0D
+}=0D
+=0D
+=0D
+/**=0D
+ Callback function to build resource descriptor HOB=0D
+=0D
+ This function build a HOB based on the memory map entry info.=0D
+ Only add EFI_RESOURCE_SYSTEM_MEMORY.=0D
=0D
@param MemoryMapEntry Memory map entry info got from bootloader=
.=0D
@param Params Not used for now.=0D
@@ -28,7 +180,15 @@ MemInfoCallback (
UINT64 Size;=0D
EFI_RESOURCE_ATTRIBUTE_TYPE Attribue;=0D
=0D
- Type =3D (MemoryMapEntry->Type =3D=3D 1) ? EFI_RESOURCE_SYSTEM_MEMORY=
: EFI_RESOURCE_MEMORY_RESERVED;=0D
+ //=0D
+ // Skip everything not known to be usable DRAM.=0D
+ // It will be added later.=0D
+ //=0D
+ if (MemoryMapEntry->Type !=3D E820_RAM && MemoryMapEntry->Type !=3D E820=
_ACPI) {=0D
+ return RETURN_SUCCESS;=0D
+ }=0D
+=0D
+ Type =3D EFI_RESOURCE_SYSTEM_MEMORY;=0D
Base =3D MemoryMapEntry->Base;=0D
Size =3D MemoryMapEntry->Size;=0D
=0D
@@ -40,7 +200,7 @@ MemInfoCallback (
EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |=0D
EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE;=0D
=0D
- if (Base >=3D BASE_4GB ) {=0D
+ if (Base >=3D BASE_4GB) {=0D
// Remove tested attribute to avoid DXE core to dispatch driver to mem=
ory above 4GB=0D
Attribue &=3D ~EFI_RESOURCE_ATTRIBUTE_TESTED;=0D
}=0D
@@ -48,6 +208,10 @@ MemInfoCallback (
BuildResourceDescriptorHob (Type, Attribue, (EFI_PHYSICAL_ADDRESS)Base, =
Size);=0D
DEBUG ((DEBUG_INFO , "buildhob: base =3D 0x%lx, size =3D 0x%lx, type =3D=
0x%x\n", Base, Size, Type));=0D
=0D
+ if (MemoryMapEntry->Type =3D=3D E820_ACPI) {=0D
+ BuildMemoryAllocationHob (Base, Size, EfiACPIReclaimMemory);=0D
+ }=0D
+=0D
return RETURN_SUCCESS;=0D
}=0D
=0D
@@ -236,7 +400,16 @@ BuildHobFromBl (
EFI_PEI_GRAPHICS_DEVICE_INFO_HOB *NewGfxDeviceInfo;=0D
=0D
//=0D
- // Parse memory info and build memory HOBs=0D
+ // First find TOLUD=0D
+ //=0D
+ Status =3D ParseMemoryInfo (FindToludCallback, NULL);=0D
+ if (EFI_ERROR(Status)) {=0D
+ return Status;=0D
+ }=0D
+ DEBUG ((DEBUG_INFO , "Assuming TOLUD =3D 0x%x\n", TopOfLowerUsableDram))=
;=0D
+=0D
+ //=0D
+ // Parse memory info and build memory HOBs for Usable RAM=0D
//=0D
Status =3D ParseMemoryInfo (MemInfoCallback, NULL);=0D
if (EFI_ERROR(Status)) {=0D
@@ -289,6 +462,14 @@ BuildHobFromBl (
DEBUG ((DEBUG_INFO, "Create acpi board info guid hob\n"));=0D
}=0D
=0D
+ //=0D
+ // Parse memory info and build memory HOBs for reserved DRAM and MMIO=0D
+ //=0D
+ Status =3D ParseMemoryInfo (MemInfoCallbackMMIO, &AcpiBoardInfo);=0D
+ if (EFI_ERROR(Status)) {=0D
+ return Status;=0D
+ }=0D
+=0D
//=0D
// Parse platform specific information.=0D
//=0D
diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h b/UefiPaylo=
adPkg/UefiPayloadEntry/UefiPayloadEntry.h
index 2c84d6ed53..35ea23d202 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
+++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
@@ -38,6 +38,16 @@
#define GET_OCCUPIED_SIZE(ActualSize, Alignment) \=0D
((ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) & ((=
Alignment) - 1)))=0D
=0D
+=0D
+#define E820_RAM 1=0D
+#define E820_RESERVED 2=0D
+#define E820_ACPI 3=0D
+#define E820_NVS 4=0D
+#define E820_UNUSABLE 5=0D
+#define E820_DISABLED 6=0D
+#define E820_PMEM 7=0D
+#define E820_UNDEFINED 8=0D
+=0D
/**=0D
Auto-generated function that calls the library constructors for all of t=
he module's=0D
dependent libraries.=0D
--=20
2.30.2


Re: [Patch V4 0/9] Create multiple Hobs for Universal Payload

Patrick Rudolph
 

Tested the patch series on Intel Coffee Lake Platform using latest
coreboot master.
Everything seems to work fine.

Thanks
Patrick

On Thu, Jun 10, 2021 at 11:48 AM Zhiguang Liu <zhiguang.liu@intel.com> wrote:

Liming,

Bugzilla is created at https://bugzilla.tianocore.org/show_bug.cgi?id=3447

Thanks
Zhiguang

-----Original Message-----
From: gaoliming <gaoliming@byosoft.com.cn>
Sent: Thursday, June 10, 2021 5:14 PM
To: devel@edk2.groups.io; Liu, Zhiguang <zhiguang.liu@intel.com>
Subject: 回复: [edk2-devel] [Patch V4 0/9] Create multiple Hobs for Universal
Payload

Zhiguang:
Can you submit one BZ for this new feature? I will add it into edk2 202108
stable tag planning.

Thanks
Liming
-----邮件原件-----
发件人: devel@edk2.groups.io <devel@edk2.groups.io> 代表 Zhiguang Liu
发送时间: 2021年6月10日 9:33
收件人: devel@edk2.groups.io
主题: [edk2-devel] [Patch V4 0/9] Create multiple Hobs for Universal
Payload

V1:
This patch set is based on Universal Payload on
https://universalpayload.github.io/documentation/payload-
interfaces/index.
html
This patch set introduce one general header, three different hob types
and how Universal Payload consume these hobs.

V2:
Move all the header files and Guid define to MdeModulePkg Fix code bug
when parsing SmbiosDxe.
Enhance error handling in AcpiTableProtocol.c.
Add AcpiTableDxe.inf in UefiPayload.fdf

V3:
Avoid duplicated code in SmBiosDxe.c

V4:
Add link to spec in header files' file comments Avoid using PLD,
because it may be confusing

All changes can be seen at
https://github.com/LiuZhiguang001/edk2/tree/UniversalPayloadHeaders_v4

Zhiguang Liu (9):
MdeModulePkg: Add Universal Payload general definition header file
MdeModulePkg: Add new structure for the PCI Root Bridge Info Hob
UefiPayloadPkg: UefiPayload retrieve PCI root bridge from Guid Hob
MdeModulePkg: Add new structure for the Universal Payload SMBios
Table
Info Hob
MdeModulePkg/Universal/SmbiosDxe: Scan for existing tables
UefiPayloadPkg: Creat gPldSmbiosTableGuid Hob
MdeModulePkg: Add new structure for the Universal Payload ACPI Table
Info Hob
MdeModulePkg/ACPI: Install ACPI table from HOB.
UefiPayloadPkg: Creat gPldAcpiTableGuid Hob

MdeModulePkg/Include/UniversalPayload/AcpiTable.h |
30 ++++++++++++++++++++++++++++++
MdeModulePkg/Include/UniversalPayload/PciRootBridges.h |
91
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++
+++++++++++++++++++++++++++++
MdeModulePkg/Include/UniversalPayload/SmbiosTable.h |
30 ++++++++++++++++++++++++++++++
MdeModulePkg/Include/UniversalPayload/UniversalPayload.h |
35 +++++++++++++++++++++++++++++++++++
MdeModulePkg/MdeModulePkg.dec
| 15 +++++++++++++++
MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiSdt.c |
92
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++
+++---------------------------
MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTable.h |
38 +++++++++++++++++++++++++++++++++++++-
MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf | 8
+++++---
MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c | 171
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++
++++++++++++++++++++++++++++++++++++++++-------
MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.c |
293
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++
++++++++++++++++++++++++++++++++++++++++++++-
MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.h |
65
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++
++-
MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf |
5 ++++-
UefiPayloadPkg/BlSupportDxe/BlSupportDxe.c |
28 +---------------------------
UefiPayloadPkg/BlSupportDxe/BlSupportDxe.h |
5 +----
UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf |
4 +---
UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridge.h | 40
++++++++++++++++++++++++++++++++++++++--
UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeLib.c | 47
++++++++++++++++++++++++++++++++++++++++++++---
UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf | 8
+++++++-
UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeSupport.c | 73
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++
++++++++++-
UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c | 23
++++++++++++++++++++++-
UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h | 5
+++--
UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf | 4
+++-
UefiPayloadPkg/UefiPayloadPkg.dsc |
2 +-
UefiPayloadPkg/UefiPayloadPkg.fdf |
4 ++++
24 files changed, 1029 insertions(+), 87 deletions(-) create mode
100644 MdeModulePkg/Include/UniversalPayload/AcpiTable.h
create mode 100644
MdeModulePkg/Include/UniversalPayload/PciRootBridges.h
create mode 100644
MdeModulePkg/Include/UniversalPayload/SmbiosTable.h
create mode 100644
MdeModulePkg/Include/UniversalPayload/UniversalPayload.h

--
2.30.0.windows.2









Re: [Patch V5 2/9] MdeModulePkg: Add new structure for the PCI Root Bridge Info Hob

Wu, Hao A
 

Yes. Please help to keep my R-b tag. Thanks.

 

Best Regards,

Hao Wu

 

From: Liu, Zhiguang <zhiguang.liu@...>
Sent: Tuesday, June 15, 2021 5:16 PM
To: devel@edk2.groups.io; Liu, Zhiguang <zhiguang.liu@...>; Wu, Hao A <hao.a.wu@...>
Subject:
回复: [edk2-devel] [Patch V5 2/9] MdeModulePkg: Add new structure for the PCI Root Bridge Info Hob

 

Hi Hao,

 

For this patch, can I keep your reviewed-by?

 

I just added ExceptionList in MdeModulePkg\MdeModulePkg.ci.yaml, to avoid CI failure.

 

Thanks

Zhiguang


发件人: devel@edk2.groups.io <devel@edk2.groups.io> 代表 Zhiguang Liu <zhiguang.liu@...>
发送时间: 2021615 17:12
收件人: devel@edk2.groups.io <devel@edk2.groups.io>
抄送: Kinney, Michael D <michael.d.kinney@...>; Liming Gao <gaoliming@...>; Wang, Jian J <jian.j.wang@...>; Wu, Hao A <hao.a.wu@...>
主题: [edk2-devel] [Patch V5 2/9] MdeModulePkg: Add new structure for the PCI Root Bridge Info Hob

 

V5:
Add ExceptionList in MdeModulePkg\MdeModulePkg.ci.yaml, to avoid open CI
issue, because UID and HID are terms which are already used in current
source code.

Cc: Michael D Kinney <michael.d.kinney@...>
Cc: Liming Gao <gaoliming@...>
Cc: Jian J Wang <jian.j.wang@...>
Cc: Hao A Wu <hao.a.wu@...>
Reviewed-by: Hao A Wu <hao.a.wu@...>
Signed-off-by: Zhiguang Liu <zhiguang.liu@...>
---
 MdeModulePkg/Include/UniversalPayload/PciRootBridges.h | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 MdeModulePkg/MdeModulePkg.ci.yaml                      |  2 ++
 MdeModulePkg/MdeModulePkg.dec                          |  6 ++++++
 3 files changed, 99 insertions(+)

diff --git a/MdeModulePkg/Include/UniversalPayload/PciRootBridges.h b/MdeModulePkg/Include/UniversalPayload/PciRootBridges.h
new file mode 100644
index 0000000000..3a7aae82d4
--- /dev/null
+++ b/MdeModulePkg/Include/UniversalPayload/PciRootBridges.h
@@ -0,0 +1,91 @@
+/** @file

+  This file defines the structure for the PCI Root Bridges.

+

+  Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>

+  SPDX-License-Identifier: BSD-2-Clause-Patent

+

+  @par Revision Reference:

+    - Universal Payload Specification 0.75 (https://universalpayload.github.io/documentation/)

+**/

+

+#ifndef UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES_H_

+#define UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES_H_

+

+#include <UniversalPayload/UniversalPayload.h>

+

+#pragma pack(1)

+

+//

+// (Base > Limit) indicates an aperture is not available.

+//

+typedef struct {

+  //

+  // Base and Limit are the device address instead of host address when

+  // Translation is not zero

+  //

+  UINT64 Base;

+  UINT64 Limit;

+  //

+  // According to UEFI 2.7, Device Address = Host Address + Translation,

+  // so Translation = Device Address - Host Address.

+  // On platforms where Translation is not zero, the subtraction is probably to

+  // be performed with UINT64 wrap-around semantics, for we may translate an

+  // above-4G host address into a below-4G device address for legacy PCIe device

+  // compatibility.

+  //

+  // NOTE: The alignment of Translation is required to be larger than any BAR

+  // alignment in the same root bridge, so that the same alignment can be

+  // applied to both device address and host address, which simplifies the

+  // situation and makes the current resource allocation code in generic PCI

+  // host bridge driver still work.

+  //

+  UINT64 Translation;

+} UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGE_APERTURE;

+

+///

+/// Payload PCI Root Bridge Information HOB

+///

+typedef struct {

+  UINT32                                     Segment;               ///< Segment number.

+  UINT64                                     Supports;              ///< Supported attributes.

+                                                                    ///< Refer to EFI_PCI_ATTRIBUTE_xxx used by GetAttributes()

+                                                                    ///< and SetAttributes() in EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL.

+  UINT64                                     Attributes;            ///< Initial attributes.

+                                                                    ///< Refer to EFI_PCI_ATTRIBUTE_xxx used by GetAttributes()

+                                                                    ///< and SetAttributes() in EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL.

+  BOOLEAN                                    DmaAbove4G;            ///< DMA above 4GB memory.

+                                                                    ///< Set to TRUE when root bridge supports DMA above 4GB memory.

+  BOOLEAN                                    NoExtendedConfigSpace; ///< When FALSE, the root bridge supports

+                                                                    ///< Extended (4096-byte) Configuration Space.

+                                                                    ///< When TRUE, the root bridge supports

+                                                                    ///< 256-byte Configuration Space only.

+  UINT64                                     AllocationAttributes;  ///< Allocation attributes.

+                                                                    ///< Refer to EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM and

+                                                                    ///< EFI_PCI_HOST_BRIDGE_MEM64_DECODE used by GetAllocAttributes()

+                                                                    ///< in EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL.

+  UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGE_APERTURE Bus;                   ///< Bus aperture which can be used by the root bridge.

+  UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGE_APERTURE Io;                    ///< IO aperture which can be used by the root bridge.

+  UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGE_APERTURE Mem;                   ///< MMIO aperture below 4GB which can be used by the root bridge.

+  UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGE_APERTURE MemAbove4G;            ///< MMIO aperture above 4GB which can be used by the root bridge.

+  UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGE_APERTURE PMem;                  ///< Prefetchable MMIO aperture below 4GB which can be used by the root bridge.

+  UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGE_APERTURE PMemAbove4G;           ///< Prefetchable MMIO aperture above 4GB which can be used by the root bridge.

+  UINT32                                     HID;                   ///< PnP hardware ID of the root bridge. This value must match the corresponding

+                                                                    ///< _HID in the ACPI name space.

+  UINT32                                     UID;                   ///< Unique ID that is required by ACPI if two devices have the same _HID.

+                                                                    ///< This value must also match the corresponding _UID/_HID pair in the ACPI name space.

+} UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGE;

+

+typedef struct {

+  UNIVERSAL_PAYLOAD_GENERIC_HEADER   Header;

+  BOOLEAN                            ResourceAssigned;

+  UINT8                              Count;

+  UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGE  RootBridge[0];

+} UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES;

+

+#pragma pack()

+

+#define UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES_REVISION 1

+

+extern GUID gUniversalPayloadPciRootBridgeInfoGuid;

+

+#endif // UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES_H_

diff --git a/MdeModulePkg/MdeModulePkg.ci.yaml b/MdeModulePkg/MdeModulePkg.ci.yaml
index 45783f12c1..4c71468bd3 100644
--- a/MdeModulePkg/MdeModulePkg.ci.yaml
+++ b/MdeModulePkg/MdeModulePkg.ci.yaml
@@ -16,6 +16,8 @@
         ##     "<ErrorID>", "<KeyWord>"

         ## ]

         "ExceptionList": [

+            "8005", "UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGE.UID",

+            "8005", "UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGE.HID",

         ],

         ## Both file path and directory path are accepted.

         "IgnoreFiles": [

diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
index 8d38383915..5cee4e159a 100644
--- a/MdeModulePkg/MdeModulePkg.dec
+++ b/MdeModulePkg/MdeModulePkg.dec
@@ -404,6 +404,12 @@
   ## Include/Guid/MigratedFvInfo.h

   gEdkiiMigratedFvInfoGuid = { 0xc1ab12f7, 0x74aa, 0x408d, { 0xa2, 0xf4, 0xc6, 0xce, 0xfd, 0x17, 0x98, 0x71 } }

 

+  #

+  # GUID defined in UniversalPayload

+  #

+  ## Include/UniversalPayload/PciRootBridges.h

+  gUniversalPayloadPciRootBridgeInfoGuid = { 0xec4ebacb, 0x2638, 0x416e, { 0xbe, 0x80, 0xe5, 0xfa, 0x4b, 0x51, 0x19, 0x01 }}

+

 [Ppis]

   ## Include/Ppi/AtaController.h

   gPeiAtaControllerPpiGuid       = { 0xa45e60d1, 0xc719, 0x44aa, { 0xb0, 0x7a, 0xaa, 0x77, 0x7f, 0x85, 0x90, 0x6d }}

--
2.30.0.windows.2



-=-=-=-=-=-=
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#76506): https://edk2.groups.io/g/devel/message/76506
Mute This Topic: https://groups.io/mt/83551777/1779286
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [zhiguang.liu@...]
-=-=-=-=-=-=


回复: [edk2-devel] [Patch V5 2/9] MdeModulePkg: Add new structure for the PCI Root Bridge Info Hob

Zhiguang Liu
 

Hi Hao,

For this patch, can I keep your reviewed-by?

I just added ExceptionList in MdeModulePkg\MdeModulePkg.ci.yaml, to avoid CI failure.

Thanks
Zhiguang

发件人: devel@edk2.groups.io <devel@edk2.groups.io> 代表 Zhiguang Liu <zhiguang.liu@...>
发送时间: 2021年6月15日 17:12
收件人: devel@edk2.groups.io <devel@edk2.groups.io>
抄送: Kinney, Michael D <michael.d.kinney@...>; Liming Gao <gaoliming@...>; Wang, Jian J <jian.j.wang@...>; Wu, Hao A <hao.a.wu@...>
主题: [edk2-devel] [Patch V5 2/9] MdeModulePkg: Add new structure for the PCI Root Bridge Info Hob
 
V5:
Add ExceptionList in MdeModulePkg\MdeModulePkg.ci.yaml, to avoid open CI
issue, because UID and HID are terms which are already used in current
source code.

Cc: Michael D Kinney <michael.d.kinney@...>
Cc: Liming Gao <gaoliming@...>
Cc: Jian J Wang <jian.j.wang@...>
Cc: Hao A Wu <hao.a.wu@...>
Reviewed-by: Hao A Wu <hao.a.wu@...>
Signed-off-by: Zhiguang Liu <zhiguang.liu@...>
---
 MdeModulePkg/Include/UniversalPayload/PciRootBridges.h | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 MdeModulePkg/MdeModulePkg.ci.yaml                      |  2 ++
 MdeModulePkg/MdeModulePkg.dec                          |  6 ++++++
 3 files changed, 99 insertions(+)

diff --git a/MdeModulePkg/Include/UniversalPayload/PciRootBridges.h b/MdeModulePkg/Include/UniversalPayload/PciRootBridges.h
new file mode 100644
index 0000000000..3a7aae82d4
--- /dev/null
+++ b/MdeModulePkg/Include/UniversalPayload/PciRootBridges.h
@@ -0,0 +1,91 @@
+/** @file

+  This file defines the structure for the PCI Root Bridges.

+

+  Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>

+  SPDX-License-Identifier: BSD-2-Clause-Patent

+

+  @par Revision Reference:

+    - Universal Payload Specification 0.75 (https://universalpayload.github.io/documentation/)

+**/

+

+#ifndef UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES_H_

+#define UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES_H_

+

+#include <UniversalPayload/UniversalPayload.h>

+

+#pragma pack(1)

+

+//

+// (Base > Limit) indicates an aperture is not available.

+//

+typedef struct {

+  //

+  // Base and Limit are the device address instead of host address when

+  // Translation is not zero

+  //

+  UINT64 Base;

+  UINT64 Limit;

+  //

+  // According to UEFI 2.7, Device Address = Host Address + Translation,

+  // so Translation = Device Address - Host Address.

+  // On platforms where Translation is not zero, the subtraction is probably to

+  // be performed with UINT64 wrap-around semantics, for we may translate an

+  // above-4G host address into a below-4G device address for legacy PCIe device

+  // compatibility.

+  //

+  // NOTE: The alignment of Translation is required to be larger than any BAR

+  // alignment in the same root bridge, so that the same alignment can be

+  // applied to both device address and host address, which simplifies the

+  // situation and makes the current resource allocation code in generic PCI

+  // host bridge driver still work.

+  //

+  UINT64 Translation;

+} UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGE_APERTURE;

+

+///

+/// Payload PCI Root Bridge Information HOB

+///

+typedef struct {

+  UINT32                                     Segment;               ///< Segment number.

+  UINT64                                     Supports;              ///< Supported attributes.

+                                                                    ///< Refer to EFI_PCI_ATTRIBUTE_xxx used by GetAttributes()

+                                                                    ///< and SetAttributes() in EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL.

+  UINT64                                     Attributes;            ///< Initial attributes.

+                                                                    ///< Refer to EFI_PCI_ATTRIBUTE_xxx used by GetAttributes()

+                                                                    ///< and SetAttributes() in EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL.

+  BOOLEAN                                    DmaAbove4G;            ///< DMA above 4GB memory.

+                                                                    ///< Set to TRUE when root bridge supports DMA above 4GB memory.

+  BOOLEAN                                    NoExtendedConfigSpace; ///< When FALSE, the root bridge supports

+                                                                    ///< Extended (4096-byte) Configuration Space.

+                                                                    ///< When TRUE, the root bridge supports

+                                                                    ///< 256-byte Configuration Space only.

+  UINT64                                     AllocationAttributes;  ///< Allocation attributes.

+                                                                    ///< Refer to EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM and

+                                                                    ///< EFI_PCI_HOST_BRIDGE_MEM64_DECODE used by GetAllocAttributes()

+                                                                    ///< in EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL.

+  UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGE_APERTURE Bus;                   ///< Bus aperture which can be used by the root bridge.

+  UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGE_APERTURE Io;                    ///< IO aperture which can be used by the root bridge.

+  UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGE_APERTURE Mem;                   ///< MMIO aperture below 4GB which can be used by the root bridge.

+  UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGE_APERTURE MemAbove4G;            ///< MMIO aperture above 4GB which can be used by the root bridge.

+  UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGE_APERTURE PMem;                  ///< Prefetchable MMIO aperture below 4GB which can be used by the root bridge.

+  UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGE_APERTURE PMemAbove4G;           ///< Prefetchable MMIO aperture above 4GB which can be used by the root bridge.

+  UINT32                                     HID;                   ///< PnP hardware ID of the root bridge. This value must match the corresponding

+                                                                    ///< _HID in the ACPI name space.

+  UINT32                                     UID;                   ///< Unique ID that is required by ACPI if two devices have the same _HID.

+                                                                    ///< This value must also match the corresponding _UID/_HID pair in the ACPI name space.

+} UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGE;

+

+typedef struct {

+  UNIVERSAL_PAYLOAD_GENERIC_HEADER   Header;

+  BOOLEAN                            ResourceAssigned;

+  UINT8                              Count;

+  UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGE  RootBridge[0];

+} UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES;

+

+#pragma pack()

+

+#define UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES_REVISION 1

+

+extern GUID gUniversalPayloadPciRootBridgeInfoGuid;

+

+#endif // UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES_H_

diff --git a/MdeModulePkg/MdeModulePkg.ci.yaml b/MdeModulePkg/MdeModulePkg.ci.yaml
index 45783f12c1..4c71468bd3 100644
--- a/MdeModulePkg/MdeModulePkg.ci.yaml
+++ b/MdeModulePkg/MdeModulePkg.ci.yaml
@@ -16,6 +16,8 @@
         ##     "<ErrorID>", "<KeyWord>"

         ## ]

         "ExceptionList": [

+            "8005", "UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGE.UID",

+            "8005", "UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGE.HID",

         ],

         ## Both file path and directory path are accepted.

         "IgnoreFiles": [

diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
index 8d38383915..5cee4e159a 100644
--- a/MdeModulePkg/MdeModulePkg.dec
+++ b/MdeModulePkg/MdeModulePkg.dec
@@ -404,6 +404,12 @@
   ## Include/Guid/MigratedFvInfo.h

   gEdkiiMigratedFvInfoGuid = { 0xc1ab12f7, 0x74aa, 0x408d, { 0xa2, 0xf4, 0xc6, 0xce, 0xfd, 0x17, 0x98, 0x71 } }

 

+  #

+  # GUID defined in UniversalPayload

+  #

+  ## Include/UniversalPayload/PciRootBridges.h

+  gUniversalPayloadPciRootBridgeInfoGuid = { 0xec4ebacb, 0x2638, 0x416e, { 0xbe, 0x80, 0xe5, 0xfa, 0x4b, 0x51, 0x19, 0x01 }}

+

 [Ppis]

   ## Include/Ppi/AtaController.h

   gPeiAtaControllerPpiGuid       = { 0xa45e60d1, 0xc719, 0x44aa, { 0xb0, 0x7a, 0xaa, 0x77, 0x7f, 0x85, 0x90, 0x6d }}

--
2.30.0.windows.2



-=-=-=-=-=-=
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#76506): https://edk2.groups.io/g/devel/message/76506
Mute This Topic: https://groups.io/mt/83551777/1779286
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [zhiguang.liu@...]
-=-=-=-=-=-=



[Patch V5 9/9] UefiPayloadPkg: Create gUniversalPayloadAcpiTableGuid Hob

Zhiguang Liu
 

From SysTableInfo Hob, get ACPI table address, and create
gUniversalPayloadAcpiTableGuid Hob to store it.
Remove directly adding ACPI table to ConfigurationTable.
Dxe ACPI driver will parse it and install ACPI table from Guid Hob.

Cc: Maurice Ma <maurice.ma@intel.com>
Cc: Guo Dong <guo.dong@intel.com>
Cc: Benjamin You <benjamin.you@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Reviewed-by: Guo Dong <guo.dong@intel.com>
Signed-off-by: Zhiguang Liu <zhiguang.liu@intel.com>
---
UefiPayloadPkg/BlSupportDxe/BlSupportDxe.c | 17 -----------------
UefiPayloadPkg/BlSupportDxe/BlSupportDxe.h | 5 +----
UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf | 1 -
UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c | 11 +++++++++++
UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h | 2 +-
UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf | 1 +
UefiPayloadPkg/UefiPayloadPkg.fdf | 4 ++++
7 files changed, 18 insertions(+), 23 deletions(-)

diff --git a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.c b/UefiPayloadPkg/Bl=
SupportDxe/BlSupportDxe.c
index 56b85b8e6d..ffd3427fb3 100644
--- a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.c
+++ b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.c
@@ -99,7 +99,6 @@ BlDxeEntryPoint (
{=0D
EFI_STATUS Status;=0D
EFI_HOB_GUID_TYPE *GuidHob;=0D
- SYSTEM_TABLE_INFO *SystemTableInfo;=0D
EFI_PEI_GRAPHICS_INFO_HOB *GfxInfo;=0D
ACPI_BOARD_INFO *AcpiBoardInfo;=0D
=0D
@@ -113,22 +112,6 @@ BlDxeEntryPoint (
Status =3D ReserveResourceInGcd (TRUE, EfiGcdMemoryTypeMemoryMappedIo, 0=
xFED00000, SIZE_1KB, 0, ImageHandle); // HPET=0D
ASSERT_EFI_ERROR (Status);=0D
=0D
- //=0D
- // Find the system table information guid hob=0D
- //=0D
- GuidHob =3D GetFirstGuidHob (&gUefiSystemTableInfoGuid);=0D
- ASSERT (GuidHob !=3D NULL);=0D
- SystemTableInfo =3D (SYSTEM_TABLE_INFO *)GET_GUID_HOB_DATA (GuidHob);=0D
-=0D
- //=0D
- // Install Acpi Table=0D
- //=0D
- if (SystemTableInfo->AcpiTableBase !=3D 0 && SystemTableInfo->AcpiTableS=
ize !=3D 0) {=0D
- DEBUG ((DEBUG_ERROR, "Install Acpi Table at 0x%lx, length 0x%x\n", Sys=
temTableInfo->AcpiTableBase, SystemTableInfo->AcpiTableSize));=0D
- Status =3D gBS->InstallConfigurationTable (&gEfiAcpiTableGuid, (VOID *=
)(UINTN)SystemTableInfo->AcpiTableBase);=0D
- ASSERT_EFI_ERROR (Status);=0D
- }=0D
-=0D
//=0D
// Find the frame buffer information and update PCDs=0D
//=0D
diff --git a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.h b/UefiPayloadPkg/Bl=
SupportDxe/BlSupportDxe.h
index 512105fafd..3332a30eae 100644
--- a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.h
+++ b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.h
@@ -1,7 +1,7 @@
/** @file=0D
The header file of bootloader support DXE.=0D
=0D
-Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>=0D
+Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>=0D
SPDX-License-Identifier: BSD-2-Clause-Patent=0D
=0D
**/=0D
@@ -19,12 +19,9 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/IoLib.h>=0D
#include <Library/HobLib.h>=0D
=0D
-#include <Guid/Acpi.h>=0D
#include <Guid/SmBios.h>=0D
#include <Guid/SystemTableInfoGuid.h>=0D
#include <Guid/AcpiBoardInfoGuid.h>=0D
#include <Guid/GraphicsInfoHob.h>=0D
=0D
-#include <IndustryStandard/Acpi.h>=0D
-=0D
#endif=0D
diff --git a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf b/UefiPayloadPkg/=
BlSupportDxe/BlSupportDxe.inf
index 30f41f8c39..1ccb250991 100644
--- a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf
+++ b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf
@@ -42,7 +42,6 @@
HobLib=0D
=0D
[Guids]=0D
- gEfiAcpiTableGuid=0D
gUefiSystemTableInfoGuid=0D
gUefiAcpiBoardInfoGuid=0D
gEfiGraphicsInfoHobGuid=0D
diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c b/UefiPaylo=
adPkg/UefiPayloadEntry/UefiPayloadEntry.c
index 80f66a3fd5..8c6f7e326f 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c
@@ -235,6 +235,7 @@ BuildHobFromBl (
EFI_PEI_GRAPHICS_DEVICE_INFO_HOB GfxDeviceInfo;=0D
EFI_PEI_GRAPHICS_DEVICE_INFO_HOB *NewGfxDeviceInfo;=0D
UNIVERSAL_PAYLOAD_SMBIOS_TABLE *SmBiosTableHob;=0D
+ UNIVERSAL_PAYLOAD_ACPI_TABLE *AcpiTableHob;=0D
=0D
//=0D
// Parse memory info and build memory HOBs=0D
@@ -287,6 +288,16 @@ BuildHobFromBl (
SmBiosTableHob->SmBiosEntryPoint =3D SysTableInfo.SmbiosTableBase;=0D
DEBUG ((DEBUG_INFO, "Create smbios table gUniversalPayloadSmbiosTableGui=
d guid hob\n"));=0D
=0D
+ //=0D
+ // Creat ACPI table Hob=0D
+ //=0D
+ AcpiTableHob =3D BuildGuidHob (&gUniversalPayloadAcpiTableGuid, sizeof (=
UNIVERSAL_PAYLOAD_ACPI_TABLE));=0D
+ ASSERT (AcpiTableHob !=3D NULL);=0D
+ AcpiTableHob->Header.Revision =3D UNIVERSAL_PAYLOAD_ACPI_TABLE_REVISION;=
=0D
+ AcpiTableHob->Header.Length =3D sizeof (UNIVERSAL_PAYLOAD_ACPI_TABLE);=0D
+ AcpiTableHob->Rsdp =3D SysTableInfo.AcpiTableBase;=0D
+ DEBUG ((DEBUG_INFO, "Create smbios table gUniversalPayloadAcpiTableGuid =
guid hob\n"));=0D
+=0D
//=0D
// Create guid hob for acpi board information=0D
//=0D
diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h b/UefiPaylo=
adPkg/UefiPayloadEntry/UefiPayloadEntry.h
index e7d0d15118..a4c9da128e 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
+++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
@@ -32,7 +32,7 @@
#include <Guid/AcpiBoardInfoGuid.h>=0D
#include <Guid/GraphicsInfoHob.h>=0D
#include <UniversalPayload/SmbiosTable.h>=0D
-=0D
+#include <UniversalPayload/AcpiTable.h>=0D
=0D
#define LEGACY_8259_MASK_REGISTER_MASTER 0x21=0D
#define LEGACY_8259_MASK_REGISTER_SLAVE 0xA1=0D
diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf b/UefiPay=
loadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
index fc5b5ce9d4..8d42925fcd 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
+++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
@@ -65,6 +65,7 @@
gEfiGraphicsDeviceInfoHobGuid=0D
gUefiAcpiBoardInfoGuid=0D
gUniversalPayloadSmbiosTableGuid=0D
+ gUniversalPayloadAcpiTableGuid=0D
=0D
[FeaturePcd.IA32]=0D
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode ## CONSUME=
S=0D
diff --git a/UefiPayloadPkg/UefiPayloadPkg.fdf b/UefiPayloadPkg/UefiPayload=
Pkg.fdf
index 8fc509024b..ed7fbcaddb 100644
--- a/UefiPayloadPkg/UefiPayloadPkg.fdf
+++ b/UefiPayloadPkg/UefiPayloadPkg.fdf
@@ -175,6 +175,10 @@ INF MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf
INF MdeModulePkg/Bus/Usb/UsbKbDxe/UsbKbDxe.inf=0D
INF MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassStorageDxe.inf=0D
=0D
+#=0D
+# ACPI Support=0D
+#=0D
+INF MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf=0D
=0D
#=0D
# Shell=0D
--=20
2.30.0.windows.2


[Patch V5 8/9] MdeModulePkg/ACPI: Install ACPI table from HOB.

Zhiguang Liu
 

If HOB contains APCI table information, entry point of AcpiTableDxe.inf
should parse the APCI table from HOB, and install these tables.
We assume the whole ACPI table
(starting with EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER)
is contained by a single gEfiAcpiTableGuid HOB.

If error happens when installing ACPI table, stop installing and removing
all the tables that are already added.

Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Hao A Wu <hao.a.wu@intel.com>
Cc: Dandan Bi <dandan.bi@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Ray Ni <ray.ni@intel.com>
Reviewed-by: Hao A Wu <hao.a.wu@intel.com>
Signed-off-by: Zhiguang Liu <zhiguang.liu@intel.com>
---
MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiSdt.c | 92 +++++++=
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------=
----------
MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTable.h | 38 +++++++=
++++++++++++++++++++++++++++++-
MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf | 8 +++++---
MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c | 171 +++++++=
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
+++++++-------
4 files changed, 271 insertions(+), 38 deletions(-)

diff --git a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiSdt.c b/MdeModule=
Pkg/Universal/Acpi/AcpiTableDxe/AcpiSdt.c
index 14ced68e64..d98573d613 100644
--- a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiSdt.c
+++ b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiSdt.c
@@ -1,7 +1,7 @@
/** @file=0D
ACPI Sdt Protocol Driver=0D
=0D
- Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved. <BR>=
=0D
+ Copyright (c) 2010 - 2021, Intel Corporation. All rights reserved. <BR>=
=0D
SPDX-License-Identifier: BSD-2-Clause-Patent=0D
=0D
**/=0D
@@ -191,8 +191,7 @@ SdtNotifyAcpiList (
/**=0D
Returns a requested ACPI table.=0D
=0D
- The GetAcpiTable() function returns a pointer to a buffer containing the=
ACPI table associated=0D
- with the Index that was input. The following structures are not consider=
ed elements in the list of=0D
+ The following structures are not considered elements in the list of=0D
ACPI tables:=0D
- Root System Description Pointer (RSD_PTR)=0D
- Root System Description Table (RSDT)=0D
@@ -201,42 +200,32 @@ SdtNotifyAcpiList (
member. For tables installed via the EFI_ACPI_TABLE_PROTOCOL.InstallAcpi=
Table() interface,=0D
the function returns the value of EFI_ACPI_STD_PROTOCOL.AcpiVersion.=0D
=0D
- @param[in] Index The zero-based index of the table to retrieve.=
=0D
- @param[out] Table Pointer for returning the table buffer.=0D
- @param[out] Version On return, updated with the ACPI versions to w=
hich this table belongs. Type=0D
- EFI_ACPI_TABLE_VERSION is defined in "Related =
Definitions" in the=0D
- EFI_ACPI_SDT_PROTOCOL.=0D
- @param[out] TableKey On return, points to the table key for the spe=
cified ACPI system definition table.=0D
- This is identical to the table key used in the=
EFI_ACPI_TABLE_PROTOCOL.=0D
- The TableKey can be passed to EFI_ACPI_TABLE_P=
ROTOCOL.UninstallAcpiTable()=0D
- to uninstall the table.=0D
- @retval EFI_SUCCESS The function completed successfully.=0D
- @retval EFI_NOT_FOUND The requested index is too large and a table w=
as not found.=0D
+ @param[in] AcpiTableInstance ACPI table Instance.=0D
+ @param[in] Index The zero-based index of the table to re=
trieve.=0D
+ @param[out] Table Pointer for returning the table buffer.=
=0D
+ @param[out] Version On return, updated with the ACPI versio=
ns to which this table belongs. Type=0D
+ EFI_ACPI_TABLE_VERSION is defined in "R=
elated Definitions" in the=0D
+ EFI_ACPI_SDT_PROTOCOL.=0D
+ @param[out] TableKey On return, points to the table key for =
the specified ACPI system definition table.=0D
+ This is identical to the table key used=
in the EFI_ACPI_TABLE_PROTOCOL.=0D
+ The TableKey can be passed to EFI_ACPI_=
TABLE_PROTOCOL.UninstallAcpiTable()=0D
+ to uninstall the table.=0D
+ @retval EFI_SUCCESS The function completed successfully.=0D
+ @retval EFI_NOT_FOUND The requested index is too large and a =
table was not found.=0D
**/=0D
EFI_STATUS=0D
-EFIAPI=0D
-GetAcpiTable2 (=0D
+SdtGetAcpiTable (=0D
+ IN EFI_ACPI_TABLE_INSTANCE *AcpiTableInstance,=0D
IN UINTN Index,=0D
OUT EFI_ACPI_SDT_HEADER **Table,=0D
OUT EFI_ACPI_TABLE_VERSION *Version,=0D
OUT UINTN *TableKey=0D
)=0D
{=0D
- EFI_ACPI_TABLE_INSTANCE *AcpiTableInstance;=0D
UINTN TableIndex;=0D
LIST_ENTRY *CurrentLink;=0D
LIST_ENTRY *StartLink;=0D
EFI_ACPI_TABLE_LIST *CurrentTable;=0D
-=0D
- ASSERT (Table !=3D NULL);=0D
- ASSERT (Version !=3D NULL);=0D
- ASSERT (TableKey !=3D NULL);=0D
-=0D
- //=0D
- // Get the instance of the ACPI Table=0D
- //=0D
- AcpiTableInstance =3D SdtGetAcpiTableInstance ();=0D
-=0D
//=0D
// Find the table=0D
//=0D
@@ -270,6 +259,55 @@ GetAcpiTable2 (
return EFI_SUCCESS;=0D
}=0D
=0D
+/**=0D
+ Returns a requested ACPI table.=0D
+=0D
+ The GetAcpiTable() function returns a pointer to a buffer containing the=
ACPI table associated=0D
+ with the Index that was input. The following structures are not consider=
ed elements in the list of=0D
+ ACPI tables:=0D
+ - Root System Description Pointer (RSD_PTR)=0D
+ - Root System Description Table (RSDT)=0D
+ - Extended System Description Table (XSDT)=0D
+ Version is updated with a bit map containing all the versions of ACPI of=
which the table is a=0D
+ member. For tables installed via the EFI_ACPI_TABLE_PROTOCOL.InstallAcpi=
Table() interface,=0D
+ the function returns the value of EFI_ACPI_STD_PROTOCOL.AcpiVersion.=0D
+=0D
+ @param[in] Index The zero-based index of the table to retrieve.=
=0D
+ @param[out] Table Pointer for returning the table buffer.=0D
+ @param[out] Version On return, updated with the ACPI versions to w=
hich this table belongs. Type=0D
+ EFI_ACPI_TABLE_VERSION is defined in "Related =
Definitions" in the=0D
+ EFI_ACPI_SDT_PROTOCOL.=0D
+ @param[out] TableKey On return, points to the table key for the spe=
cified ACPI system definition table.=0D
+ This is identical to the table key used in the=
EFI_ACPI_TABLE_PROTOCOL.=0D
+ The TableKey can be passed to EFI_ACPI_TABLE_P=
ROTOCOL.UninstallAcpiTable()=0D
+ to uninstall the table.=0D
+ @retval EFI_SUCCESS The function completed successfully.=0D
+ @retval EFI_NOT_FOUND The requested index is too large and a table w=
as not found.=0D
+**/=0D
+EFI_STATUS=0D
+EFIAPI=0D
+GetAcpiTable2 (=0D
+ IN UINTN Index,=0D
+ OUT EFI_ACPI_SDT_HEADER **Table,=0D
+ OUT EFI_ACPI_TABLE_VERSION *Version,=0D
+ OUT UINTN *TableKey=0D
+ )=0D
+{=0D
+ EFI_ACPI_TABLE_INSTANCE *AcpiTableInstance;=0D
+=0D
+ ASSERT (Table !=3D NULL);=0D
+ ASSERT (Version !=3D NULL);=0D
+ ASSERT (TableKey !=3D NULL);=0D
+=0D
+ //=0D
+ // Get the instance of the ACPI Table=0D
+ //=0D
+ AcpiTableInstance =3D SdtGetAcpiTableInstance ();=0D
+=0D
+ return SdtGetAcpiTable (AcpiTableInstance, Index, Table, Version, TableK=
ey);=0D
+}=0D
+=0D
+=0D
/**=0D
Register a callback when an ACPI table is installed.=0D
=0D
diff --git a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTable.h b/MdeModu=
lePkg/Universal/Acpi/AcpiTableDxe/AcpiTable.h
index 9d7cf7ccfc..0af2d11a1a 100644
--- a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTable.h
+++ b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTable.h
@@ -1,7 +1,7 @@
/** @file=0D
ACPI Table Protocol Driver=0D
=0D
- Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>=0D
+ Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.<BR>=0D
SPDX-License-Identifier: BSD-2-Clause-Patent=0D
=0D
**/=0D
@@ -24,6 +24,8 @@
#include <Library/MemoryAllocationLib.h>=0D
#include <Library/UefiBootServicesTableLib.h>=0D
#include <Library/PcdLib.h>=0D
+#include <Library/HobLib.h>=0D
+#include <UniversalPayload/AcpiTable.h>=0D
=0D
//=0D
// Statements that include other files=0D
@@ -228,6 +230,40 @@ SdtAcpiTableAcpiSdtConstructor (
IN EFI_ACPI_TABLE_INSTANCE *AcpiTableInstance=0D
);=0D
=0D
+/**=0D
+ Returns a requested ACPI table.=0D
+=0D
+ The following structures are not considered elements in the list of=0D
+ ACPI tables:=0D
+ - Root System Description Pointer (RSD_PTR)=0D
+ - Root System Description Table (RSDT)=0D
+ - Extended System Description Table (XSDT)=0D
+ Version is updated with a bit map containing all the versions of ACPI of=
which the table is a=0D
+ member. For tables installed via the EFI_ACPI_TABLE_PROTOCOL.InstallAcpi=
Table() interface,=0D
+ the function returns the value of EFI_ACPI_STD_PROTOCOL.AcpiVersion.=0D
+=0D
+ @param[in] AcpiTableInstance ACPI table Instance.=0D
+ @param[in] Index The zero-based index of the table to re=
trieve.=0D
+ @param[out] Table Pointer for returning the table buffer.=
=0D
+ @param[out] Version On return, updated with the ACPI versio=
ns to which this table belongs. Type=0D
+ EFI_ACPI_TABLE_VERSION is defined in "R=
elated Definitions" in the=0D
+ EFI_ACPI_SDT_PROTOCOL.=0D
+ @param[out] TableKey On return, points to the table key for =
the specified ACPI system definition table.=0D
+ This is identical to the table key used=
in the EFI_ACPI_TABLE_PROTOCOL.=0D
+ The TableKey can be passed to EFI_ACPI_=
TABLE_PROTOCOL.UninstallAcpiTable()=0D
+ to uninstall the table.=0D
+ @retval EFI_SUCCESS The function completed successfully.=0D
+ @retval EFI_NOT_FOUND The requested index is too large and a =
table was not found.=0D
+**/=0D
+EFI_STATUS=0D
+SdtGetAcpiTable (=0D
+ IN EFI_ACPI_TABLE_INSTANCE *AcpiTableInstance,=0D
+ IN UINTN Index,=0D
+ OUT EFI_ACPI_SDT_HEADER **Table,=0D
+ OUT EFI_ACPI_TABLE_VERSION *Version,=0D
+ OUT UINTN *TableKey=0D
+ );=0D
+=0D
//=0D
// export PrivateData symbol, because we need that in AcpiSdtProtol implem=
entation=0D
//=0D
diff --git a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf b/Md=
eModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
index d341df439e..86dea43e27 100644
--- a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
+++ b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
@@ -4,7 +4,7 @@
# This driver initializes ACPI tables (Rsdp, Rsdt and Xsdt) and produces =
UEFI/PI=0D
# services to install/uninstall/manage ACPI tables.=0D
#=0D
-# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>=
=0D
+# Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.<BR>=
=0D
# Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>=0D
# SPDX-License-Identifier: BSD-2-Clause-Patent=0D
#=0D
@@ -51,10 +51,12 @@
DebugLib=0D
BaseLib=0D
PcdLib=0D
+ HobLib=0D
=0D
[Guids]=0D
- gEfiAcpi10TableGuid ## PRODUCES ## SystemTable=
=0D
- gEfiAcpiTableGuid ## PRODUCES ## SystemTable=
=0D
+ gEfiAcpi10TableGuid ## PRODUCES ## S=
ystemTable=0D
+ gEfiAcpiTableGuid ## PRODUCES ## S=
ystemTable=0D
+ gUniversalPayloadAcpiTableGuid ## SOMETIMES_CONSUMES ## H=
OB=0D
=0D
[FeaturePcd]=0D
gEfiMdeModulePkgTokenSpaceGuid.PcdInstallAcpiSdtProtocol ## CONSUMES=0D
diff --git a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c b=
/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c
index 5a2afdff27..34d4a1cec0 100644
--- a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c
+++ b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c
@@ -1,7 +1,7 @@
/** @file=0D
ACPI Table Protocol Implementation=0D
=0D
- Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>=0D
+ Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.<BR>=0D
Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>=0D
SPDX-License-Identifier: BSD-2-Clause-Patent=0D
=0D
@@ -30,6 +30,7 @@ STATIC EFI_ALLOCATE_TYPE mAcpiTableAllocType;
@param Table Table to add.=0D
@param Checksum Does the table require checksumming.=0D
@param Version The version of the list to add the tab=
le to.=0D
+ @param IsFromHob True, if add Apci Table from Hob List.=
=0D
@param Handle Pointer for returning the handle.=0D
=0D
@return EFI_SUCCESS The function completed successfully.=0D
@@ -44,6 +45,7 @@ AddTableToList (
IN VOID *Table,=0D
IN BOOLEAN Checksum,=0D
IN EFI_ACPI_TABLE_VERSION Version,=0D
+ IN BOOLEAN IsFromHob,=0D
OUT UINTN *Handle=0D
);=0D
=0D
@@ -238,6 +240,7 @@ InstallAcpiTable (
AcpiTableBufferConst,=0D
TRUE,=0D
Version,=0D
+ FALSE,=0D
TableKey=0D
);=0D
if (!EFI_ERROR (Status)) {=0D
@@ -472,6 +475,7 @@ FreeTableMemory (
@param Table Table to add.=0D
@param Checksum Does the table require checksumming.=0D
@param Version The version of the list to add the tab=
le to.=0D
+ @param IsFromHob True, if add Apci Table from Hob List.=
=0D
@param Handle Pointer for returning the handle.=0D
=0D
@return EFI_SUCCESS The function completed successfully.=0D
@@ -487,6 +491,7 @@ AddTableToList (
IN VOID *Table,=0D
IN BOOLEAN Checksum,=0D
IN EFI_ACPI_TABLE_VERSION Version,=0D
+ IN BOOLEAN IsFromHob,=0D
OUT UINTN *Handle=0D
)=0D
{=0D
@@ -553,12 +558,17 @@ AddTableToList (
// SMM communication ACPI table.=0D
//=0D
ASSERT ((EFI_PAGE_SIZE % 64) =3D=3D 0);=0D
- Status =3D gBS->AllocatePages (=0D
- AllocateMaxAddress,=0D
- EfiACPIMemoryNVS,=0D
- EFI_SIZE_TO_PAGES (CurrentTableList->TableSize),=0D
- &AllocPhysAddress=0D
- );=0D
+ if (IsFromHob){=0D
+ AllocPhysAddress =3D (UINTN)Table;=0D
+ Status =3D EFI_SUCCESS;=0D
+ } else {=0D
+ Status =3D gBS->AllocatePages (=0D
+ AllocateMaxAddress,=0D
+ EfiACPIMemoryNVS,=0D
+ EFI_SIZE_TO_PAGES (CurrentTableList->TableSize),=0D
+ &AllocPhysAddress=0D
+ );=0D
+ }=0D
} else if (mAcpiTableAllocType =3D=3D AllocateAnyPages) {=0D
//=0D
// If there is no allocation limit, there is also no need to use page=
=0D
@@ -1689,6 +1699,151 @@ ChecksumCommonTables (
return EFI_SUCCESS;=0D
}=0D
=0D
+/**=0D
+ This function will find gUniversalPayloadAcpiTableGuid Guid Hob, and ins=
tall Acpi table from it.=0D
+=0D
+ @param AcpiTableInstance Protocol instance private data.=0D
+=0D
+ @return EFI_SUCCESS The function completed successfully.=0D
+ @return EFI_NOT_FOUND The function doesn't find the gEfiAcpiTableGu=
id Guid Hob.=0D
+ @return EFI_ABORTED The function could not complete successfully.=
=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+InstallAcpiTableFromHob (=0D
+ EFI_ACPI_TABLE_INSTANCE *AcpiTableInstance=0D
+ )=0D
+{=0D
+ EFI_HOB_GUID_TYPE *GuidHob;=0D
+ EFI_ACPI_TABLE_VERSION Version;=0D
+ EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp;=0D
+ EFI_ACPI_DESCRIPTION_HEADER *Rsdt;=0D
+ EFI_ACPI_DESCRIPTION_HEADER *ChildTable;=0D
+ UINT64 ChildTableAddress;=0D
+ UINTN Count;=0D
+ UINTN Index;=0D
+ UINTN TableKey;=0D
+ EFI_STATUS Status;=0D
+ UINTN EntrySize;=0D
+ UNIVERSAL_PAYLOAD_ACPI_TABLE *AcpiTableAdress;=0D
+ VOID *TableToInstall;=0D
+ EFI_ACPI_SDT_HEADER *Table;=0D
+ UNIVERSAL_PAYLOAD_GENERIC_HEADER *GenericHeader;=0D
+=0D
+ TableKey =3D 0;=0D
+ Version =3D PcdGet32 (PcdAcpiExposedTableVersions);=0D
+ Status =3D EFI_SUCCESS;=0D
+ //=0D
+ // HOB only contains the ACPI table in 2.0+ format.=0D
+ //=0D
+ GuidHob =3D GetFirstGuidHob (&gUniversalPayloadAcpiTableGuid);=0D
+ if (GuidHob =3D=3D NULL) {=0D
+ return EFI_NOT_FOUND;=0D
+ }=0D
+=0D
+ GenericHeader =3D (UNIVERSAL_PAYLOAD_GENERIC_HEADER *) GET_GUID_HOB_DATA=
(GuidHob);=0D
+ if ((sizeof (UNIVERSAL_PAYLOAD_GENERIC_HEADER) > GET_GUID_HOB_DATA_SIZE =
(GuidHob)) || (GenericHeader->Length > GET_GUID_HOB_DATA_SIZE (GuidHob))) {=
=0D
+ return EFI_NOT_FOUND;=0D
+ }=0D
+ if (GenericHeader->Revision =3D=3D UNIVERSAL_PAYLOAD_ACPI_TABLE_REVISION=
) {=0D
+ //=0D
+ // UNIVERSAL_PAYLOAD_ACPI_TABLE structure is used when Revision equals=
to UNIVERSAL_PAYLOAD_ACPI_TABLE_REVISION=0D
+ //=0D
+ AcpiTableAdress =3D (UNIVERSAL_PAYLOAD_ACPI_TABLE *) GET_GUID_HOB_DATA=
(GuidHob);=0D
+ if (AcpiTableAdress->Header.Length < UNIVERSAL_PAYLOAD_SIZEOF_THROUGH_=
FIELD (UNIVERSAL_PAYLOAD_ACPI_TABLE, Rsdp)) {=0D
+ //=0D
+ // Retrun if can't find the ACPI Info Hob with enough length=0D
+ //=0D
+ return EFI_NOT_FOUND;=0D
+ }=0D
+ Rsdp =3D (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *) (UINTN) (Acp=
iTableAdress->Rsdp);=0D
+=0D
+ //=0D
+ // An ACPI-compatible OS must use the XSDT if present.=0D
+ // It shouldn't happen that XsdtAddress points beyond 4G range in 32-b=
it environment.=0D
+ //=0D
+ ASSERT ((UINTN) Rsdp->XsdtAddress =3D=3D Rsdp->XsdtAddress);=0D
+=0D
+ EntrySize =3D sizeof (UINT64);=0D
+ Rsdt =3D (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->XsdtAddress;=0D
+ if (Rsdt =3D=3D NULL) {=0D
+ //=0D
+ // XsdtAddress is zero, then we use Rsdt which has 32 bit entry=0D
+ //=0D
+ Rsdt =3D (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->RsdtAddress;=
=0D
+ EntrySize =3D sizeof (UINT32);=0D
+ }=0D
+=0D
+ if (Rsdt->Length <=3D sizeof (EFI_ACPI_DESCRIPTION_HEADER)) {=0D
+ return EFI_ABORTED;=0D
+ }=0D
+=0D
+ Count =3D (Rsdt->Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / Entr=
ySize;=0D
+=0D
+ for (Index =3D 0; Index < Count; Index++){=0D
+ ChildTableAddress =3D 0;=0D
+ CopyMem (&ChildTableAddress, (UINT8 *) (Rsdt + 1) + EntrySize * Inde=
x, EntrySize);=0D
+ //=0D
+ // If the address is of UINT64 while this module runs at 32 bits,=0D
+ // make sure the upper bits are all-zeros.=0D
+ //=0D
+ ASSERT (ChildTableAddress =3D=3D (UINTN) ChildTableAddress);=0D
+ if (ChildTableAddress !=3D (UINTN) ChildTableAddress) {=0D
+ Status =3D EFI_ABORTED;=0D
+ break;=0D
+ }=0D
+=0D
+ ChildTable =3D (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) ChildTableAdd=
ress;=0D
+ Status =3D AddTableToList (AcpiTableInstance, ChildTable, TRUE, Vers=
ion, TRUE, &TableKey);=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((DEBUG_ERROR, "InstallAcpiTableFromHob: Fail to add ACPI ta=
ble at 0x%p\n", ChildTable));=0D
+ ASSERT_EFI_ERROR (Status);=0D
+ break;=0D
+ }=0D
+ if (ChildTable->Signature =3D=3D EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION=
_TABLE_SIGNATURE){=0D
+ //=0D
+ // Add the FACS and DSDT tables if it is not NULL.=0D
+ //=0D
+ if (((EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *) ChildTable)->Fi=
rmwareCtrl !=3D 0) {=0D
+ TableToInstall =3D (VOID *) (UINTN) ((EFI_ACPI_3_0_FIXED_ACPI_DE=
SCRIPTION_TABLE *) ChildTable)->FirmwareCtrl;=0D
+ Status =3D AddTableToList (AcpiTableInstance, TableToInstall, TR=
UE, Version, TRUE, &TableKey);=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((DEBUG_ERROR, "InstallAcpiTableFromHob: Fail to add ACP=
I table FACS\n"));=0D
+ ASSERT_EFI_ERROR (Status);=0D
+ break;=0D
+ }=0D
+ }=0D
+=0D
+ if (((EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *) ChildTable)->Ds=
dt !=3D 0) {=0D
+ TableToInstall =3D (VOID *) (UINTN) ((EFI_ACPI_3_0_FIXED_ACPI_DE=
SCRIPTION_TABLE *) ChildTable)->Dsdt;=0D
+ Status =3D AddTableToList (AcpiTableInstance, TableToInstall, TR=
UE, Version, TRUE, &TableKey);=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((DEBUG_ERROR, "InstallAcpiTableFromHob: Fail to add ACP=
I table DSDT\n"));=0D
+ ASSERT_EFI_ERROR (Status);=0D
+ break;=0D
+ }=0D
+ }=0D
+ }=0D
+ }=0D
+ } else {=0D
+ return EFI_NOT_FOUND;=0D
+ }=0D
+=0D
+ if (EFI_ERROR (Status)) {=0D
+ //=0D
+ // Error happens when trying to add ACPI table to the list.=0D
+ // Remove all of them from list because at this time, no other tables =
except from HOB are in the list=0D
+ //=0D
+ while (SdtGetAcpiTable (AcpiTableInstance, 0, &Table, &Version, &Table=
Key) =3D=3D EFI_SUCCESS) {=0D
+ RemoveTableFromList (AcpiTableInstance, Version, TableKey);=0D
+ }=0D
+ } else {=0D
+ Status =3D PublishTables (AcpiTableInstance, Version);=0D
+ }=0D
+=0D
+ ASSERT_EFI_ERROR (Status);=0D
+ return Status;=0D
+}=0D
=0D
/**=0D
Constructor for the ACPI table protocol. Initializes instance=0D
@@ -1918,6 +2073,8 @@ AcpiTableAcpiTableConstructor (
=0D
ChecksumCommonTables (AcpiTableInstance);=0D
=0D
+ InstallAcpiTableFromHob (AcpiTableInstance);=0D
+=0D
//=0D
// Completed successfully=0D
//=0D
--=20
2.30.0.windows.2


[Patch V5 7/9] MdeModulePkg: Add new structure for the Universal Payload ACPI Table Hob

Zhiguang Liu
 

Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Hao A Wu <hao.a.wu@intel.com>
Reviewed-by: Hao A Wu <hao.a.wu@intel.com>
Signed-off-by: Zhiguang Liu <zhiguang.liu@intel.com>
---
MdeModulePkg/Include/UniversalPayload/AcpiTable.h | 30 +++++++++++++++++++=
+++++++++++
MdeModulePkg/MdeModulePkg.dec | 3 +++
2 files changed, 33 insertions(+)

diff --git a/MdeModulePkg/Include/UniversalPayload/AcpiTable.h b/MdeModuleP=
kg/Include/UniversalPayload/AcpiTable.h
new file mode 100644
index 0000000000..33ef72637e
--- /dev/null
+++ b/MdeModulePkg/Include/UniversalPayload/AcpiTable.h
@@ -0,0 +1,30 @@
+/** @file=0D
+ Define the structure for the Universal Payload APCI table.=0D
+=0D
+Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>=0D
+SPDX-License-Identifier: BSD-2-Clause-Patent=0D
+=0D
+ @par Revision Reference:=0D
+ - Universal Payload Specification 0.75 (https://universalpayload.githu=
b.io/documentation/)=0D
+**/=0D
+=0D
+#ifndef UNIVERSAL_PAYLOAD_ACPI_TABLE_H_=0D
+#define UNIVERSAL_PAYLOAD_ACPI_TABLE_H_=0D
+=0D
+#include <Uefi.h>=0D
+#include <UniversalPayload/UniversalPayload.h>=0D
+=0D
+#pragma pack(1)=0D
+=0D
+typedef struct {=0D
+ UNIVERSAL_PAYLOAD_GENERIC_HEADER Header;=0D
+ EFI_PHYSICAL_ADDRESS Rsdp;=0D
+} UNIVERSAL_PAYLOAD_ACPI_TABLE;=0D
+=0D
+#pragma pack()=0D
+=0D
+#define UNIVERSAL_PAYLOAD_ACPI_TABLE_REVISION 1=0D
+=0D
+extern GUID gUniversalPayloadAcpiTableGuid;=0D
+=0D
+#endif // UNIVERSAL_PAYLOAD_ACPI_TABLE_H_=0D
diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
index 377e868e7c..8c0885955b 100644
--- a/MdeModulePkg/MdeModulePkg.dec
+++ b/MdeModulePkg/MdeModulePkg.dec
@@ -416,6 +416,9 @@
## Include/UniversalPayload/SmbiosTable.h=0D
gUniversalPayloadSmbiosTableGuid =3D { 0x590a0d26, 0x06e5, 0x4d20, { 0x8=
a, 0x82, 0x59, 0xea, 0x1b, 0x34, 0x98, 0x2d } }=0D
=0D
+ ## Include/UniversalPayload/AcpiTable.h=0D
+ gUniversalPayloadAcpiTableGuid =3D { 0x9f9a9506, 0x5597, 0x4515, { 0xba,=
0xb6, 0x8b, 0xcd, 0xe7, 0x84, 0xba, 0x87 } }=0D
+=0D
[Ppis]=0D
## Include/Ppi/AtaController.h=0D
gPeiAtaControllerPpiGuid =3D { 0xa45e60d1, 0xc719, 0x44aa, { 0xb0,=
0x7a, 0xaa, 0x77, 0x7f, 0x85, 0x90, 0x6d }}=0D
--=20
2.30.0.windows.2


[Patch V5 6/9] UefiPayloadPkg: Create gUniversalPayloadSmbiosTableGuid Hob

Zhiguang Liu
 

From SysTableInfo Hob, get Smbios table address, and create
gUniversalPayloadSmbiosTableGuid Hob to store it. Remove directly adding
smbios table to ConfigurationTable.
Dxe module SmbiosDxe will parse it and install smbios table from it.

Cc: Maurice Ma <maurice.ma@intel.com>
Cc: Guo Dong <guo.dong@intel.com>
Cc: Benjamin You <benjamin.you@intel.com>
Reviewed-by: Guo Dong <guo.dong@intel.com>
Signed-off-by: Zhiguang Liu <zhiguang.liu@intel.com>
---
UefiPayloadPkg/BlSupportDxe/BlSupportDxe.c | 11 +----------
UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf | 3 +--
UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c | 12 +++++++++++-
UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h | 3 ++-
UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf | 3 ++-
5 files changed, 17 insertions(+), 15 deletions(-)

diff --git a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.c b/UefiPayloadPkg/Bl=
SupportDxe/BlSupportDxe.c
index a746d0581e..56b85b8e6d 100644
--- a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.c
+++ b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.c
@@ -2,7 +2,7 @@
This driver will report some MMIO/IO resources to dxe core, extract smbi=
os and acpi=0D
tables from bootloader.=0D
=0D
- Copyright (c) 2014 - 2020, Intel Corporation. All rights reserved.<BR>=0D
+ Copyright (c) 2014 - 2021, Intel Corporation. All rights reserved.<BR>=0D
SPDX-License-Identifier: BSD-2-Clause-Patent=0D
=0D
**/=0D
@@ -129,15 +129,6 @@ BlDxeEntryPoint (
ASSERT_EFI_ERROR (Status);=0D
}=0D
=0D
- //=0D
- // Install Smbios Table=0D
- //=0D
- if (SystemTableInfo->SmbiosTableBase !=3D 0 && SystemTableInfo->SmbiosTa=
bleSize !=3D 0) {=0D
- DEBUG ((DEBUG_ERROR, "Install Smbios Table at 0x%lx, length 0x%x\n", S=
ystemTableInfo->SmbiosTableBase, SystemTableInfo->SmbiosTableSize));=0D
- Status =3D gBS->InstallConfigurationTable (&gEfiSmbiosTableGuid, (VOID=
*)(UINTN)SystemTableInfo->SmbiosTableBase);=0D
- ASSERT_EFI_ERROR (Status);=0D
- }=0D
-=0D
//=0D
// Find the frame buffer information and update PCDs=0D
//=0D
diff --git a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf b/UefiPayloadPkg/=
BlSupportDxe/BlSupportDxe.inf
index cebc811355..30f41f8c39 100644
--- a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf
+++ b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf
@@ -3,7 +3,7 @@
#=0D
# Report some MMIO/IO resources to dxe core, extract smbios and acpi table=
s=0D
#=0D
-# Copyright (c) 2014 - 2020, Intel Corporation. All rights reserved.<BR>=
=0D
+# Copyright (c) 2014 - 2021, Intel Corporation. All rights reserved.<BR>=
=0D
#=0D
# SPDX-License-Identifier: BSD-2-Clause-Patent=0D
#=0D
@@ -43,7 +43,6 @@
=0D
[Guids]=0D
gEfiAcpiTableGuid=0D
- gEfiSmbiosTableGuid=0D
gUefiSystemTableInfoGuid=0D
gUefiAcpiBoardInfoGuid=0D
gEfiGraphicsInfoHobGuid=0D
diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c b/UefiPaylo=
adPkg/UefiPayloadEntry/UefiPayloadEntry.c
index 805f5448d9..80f66a3fd5 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c
@@ -1,6 +1,6 @@
/** @file=0D
=0D
- Copyright (c) 2014 - 2020, Intel Corporation. All rights reserved.<BR>=0D
+ Copyright (c) 2014 - 2021, Intel Corporation. All rights reserved.<BR>=0D
SPDX-License-Identifier: BSD-2-Clause-Patent=0D
=0D
**/=0D
@@ -234,6 +234,7 @@ BuildHobFromBl (
EFI_PEI_GRAPHICS_INFO_HOB *NewGfxInfo;=0D
EFI_PEI_GRAPHICS_DEVICE_INFO_HOB GfxDeviceInfo;=0D
EFI_PEI_GRAPHICS_DEVICE_INFO_HOB *NewGfxDeviceInfo;=0D
+ UNIVERSAL_PAYLOAD_SMBIOS_TABLE *SmBiosTableHob;=0D
=0D
//=0D
// Parse memory info and build memory HOBs=0D
@@ -276,6 +277,15 @@ BuildHobFromBl (
DEBUG ((DEBUG_INFO, "Detected Acpi Table at 0x%lx, length 0x%x\n", Sys=
TableInfo.AcpiTableBase, SysTableInfo.AcpiTableSize));=0D
DEBUG ((DEBUG_INFO, "Detected Smbios Table at 0x%lx, length 0x%x\n", S=
ysTableInfo.SmbiosTableBase, SysTableInfo.SmbiosTableSize));=0D
}=0D
+ //=0D
+ // Creat SmBios table Hob=0D
+ //=0D
+ SmBiosTableHob =3D BuildGuidHob (&gUniversalPayloadSmbiosTableGuid, size=
of (UNIVERSAL_PAYLOAD_SMBIOS_TABLE));=0D
+ ASSERT (SmBiosTableHob !=3D NULL);=0D
+ SmBiosTableHob->Header.Revision =3D UNIVERSAL_PAYLOAD_SMBIOS_TABLE_REVIS=
ION;=0D
+ SmBiosTableHob->Header.Length =3D sizeof (UNIVERSAL_PAYLOAD_SMBIOS_TABLE=
);=0D
+ SmBiosTableHob->SmBiosEntryPoint =3D SysTableInfo.SmbiosTableBase;=0D
+ DEBUG ((DEBUG_INFO, "Create smbios table gUniversalPayloadSmbiosTableGui=
d guid hob\n"));=0D
=0D
//=0D
// Create guid hob for acpi board information=0D
diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h b/UefiPaylo=
adPkg/UefiPayloadEntry/UefiPayloadEntry.h
index 2c84d6ed53..e7d0d15118 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
+++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
@@ -1,6 +1,6 @@
/** @file=0D
*=0D
-* Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>=0D
+* Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>=0D
*=0D
* SPDX-License-Identifier: BSD-2-Clause-Patent=0D
*=0D
@@ -31,6 +31,7 @@
#include <Guid/MemoryMapInfoGuid.h>=0D
#include <Guid/AcpiBoardInfoGuid.h>=0D
#include <Guid/GraphicsInfoHob.h>=0D
+#include <UniversalPayload/SmbiosTable.h>=0D
=0D
=0D
#define LEGACY_8259_MASK_REGISTER_MASTER 0x21=0D
diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf b/UefiPay=
loadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
index cc59f1903b..fc5b5ce9d4 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
+++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
@@ -1,7 +1,7 @@
## @file=0D
# This is the first module for UEFI payload.=0D
#=0D
-# Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.<BR>=
=0D
+# Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.<BR>=
=0D
# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>=0D
#=0D
# SPDX-License-Identifier: BSD-2-Clause-Patent=0D
@@ -64,6 +64,7 @@
gEfiGraphicsInfoHobGuid=0D
gEfiGraphicsDeviceInfoHobGuid=0D
gUefiAcpiBoardInfoGuid=0D
+ gUniversalPayloadSmbiosTableGuid=0D
=0D
[FeaturePcd.IA32]=0D
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode ## CONSUME=
S=0D
--=20
2.30.0.windows.2


[Patch V5 5/9] MdeModulePkg/Universal/SmbiosDxe: Scan for existing tables

Zhiguang Liu
 

The default EfiSmbiosProtocol operates on an empty SMBIOS table.
The SMBIOS tables are provided by the bootloader on UefiPayloadPkg.
Scan for existing tables in SmbiosDxe and load them if they seem valid.
This fixes the settings menu not showing any hardware information, instead
only "0 MB RAM" was displayed.
Tests showed that the OS can still see the SMBIOS tables.

SmbiosDxe will get the SMBIOS from a guid Hob.
Also will keep the SmbiosHandle if it is available.

Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Hao A Wu <hao.a.wu@intel.com>
Cc: Dandan Bi <dandan.bi@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Cc: Zhichao Gao <zhichao.gao@intel.com>
Reviewed-by: Hao A Wu <hao.a.wu@intel.com>
Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
Signed-off-by: Zhiguang Liu <zhiguang.liu@intel.com>
---
MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.c | 293 +++++++++++++++++++++=
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
++++++++++++++++++++++++++++++++++++++++++++++-
MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.h | 65 +++++++++++++++++++++=
+++++++++++++++++++++++++++++++++++++++++++-
MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf | 5 ++++-
3 files changed, 360 insertions(+), 3 deletions(-)

diff --git a/MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.c b/MdeModulePkg/Un=
iversal/SmbiosDxe/SmbiosDxe.c
index 3cdb0b1ed7..400b0fa578 100644
--- a/MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.c
+++ b/MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.c
@@ -2,7 +2,7 @@
This code produces the Smbios protocol. It also responsible for construc=
ting=0D
SMBIOS table into system table.=0D
=0D
-Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>=0D
+Copyright (c) 2009 - 2021, Intel Corporation. All rights reserved.<BR>=0D
SPDX-License-Identifier: BSD-2-Clause-Patent=0D
=0D
**/=0D
@@ -148,6 +148,12 @@ SMBIOS_TABLE_3_0_ENTRY_POINT Smbios30EntryPointStructu=
reData =3D {
//=0D
0=0D
};=0D
+=0D
+IS_SMBIOS_TABLE_VALID_ENTRY mIsSmbiosTableValid[] =3D {=0D
+ {&gUniversalPayloadSmbios3TableGuid, IsValidSmbios30Table },=0D
+ {&gUniversalPayloadSmbiosTableGuid, IsValidSmbios20Table }=0D
+};=0D
+=0D
/**=0D
=0D
Get the full size of SMBIOS structure including optional strings that fo=
llow the formatted structure.=0D
@@ -1408,6 +1414,290 @@ SmbiosTableConstruction (
}=0D
}=0D
=0D
+/**=0D
+ Validates a SMBIOS 2.0 table entry point.=0D
+=0D
+ @param TableEntry The SmBios table entry to validate.=0D
+ @param TableAddress On exit, point to the smbios table addres.=0D
+ @param TableMaximumSize On exit, point to the maximum size of the table=
.=0D
+=0D
+ @retval TRUE SMBIOS table entry point is valid.=0D
+ @retval FALSE SMBIOS table entry point is malformed.=0D
+=0D
+**/=0D
+STATIC=0D
+BOOLEAN=0D
+IsValidSmbios20Table (=0D
+ IN VOID *TableEntry,=0D
+ OUT VOID **TableAddress,=0D
+ OUT UINTN *TableMaximumSize=0D
+ )=0D
+{=0D
+ UINT8 Checksum;=0D
+ SMBIOS_TABLE_ENTRY_POINT *SmbiosTable;=0D
+ SmbiosTable =3D (SMBIOS_TABLE_ENTRY_POINT *) TableEntry;=0D
+=0D
+ if (CompareMem (SmbiosTable->AnchorString, "_SM_", 4) !=3D 0) {=0D
+ return FALSE;=0D
+ }=0D
+=0D
+ if (CompareMem (SmbiosTable->IntermediateAnchorString, "_DMI_", 5) !=3D =
0) {=0D
+ return FALSE;=0D
+ }=0D
+=0D
+ //=0D
+ // The actual value of the EntryPointLength should be 1Fh.=0D
+ // However, it was incorrectly stated in version 2.1 of smbios specifica=
tion.=0D
+ // Therefore, 0x1F and 0x1E are both accepted.=0D
+ //=0D
+ if (SmbiosTable->EntryPointLength !=3D 0x1E && SmbiosTable->EntryPointLe=
ngth !=3D sizeof (SMBIOS_TABLE_ENTRY_POINT)) {=0D
+ return FALSE;=0D
+ }=0D
+=0D
+ //=0D
+ // MajorVersion should not be less than 2.=0D
+ //=0D
+ if (SmbiosTable->MajorVersion < 2) {=0D
+ return FALSE;=0D
+ }=0D
+=0D
+ //=0D
+ // The whole struct check sum should be zero=0D
+ //=0D
+ Checksum =3D CalculateSum8 (=0D
+ (UINT8 *) SmbiosTable,=0D
+ SmbiosTable->EntryPointLength=0D
+ );=0D
+ if (Checksum !=3D 0) {=0D
+ return FALSE;=0D
+ }=0D
+=0D
+ //=0D
+ // The Intermediate Entry Point Structure check sum should be zero.=0D
+ //=0D
+ Checksum =3D CalculateSum8 (=0D
+ (UINT8 *) SmbiosTable + OFFSET_OF (SMBIOS_TABLE_ENTRY_POINT=
, IntermediateAnchorString),=0D
+ SmbiosTable->EntryPointLength - OFFSET_OF (SMBIOS_TABLE_ENT=
RY_POINT, IntermediateAnchorString)=0D
+ );=0D
+ if (Checksum !=3D 0) {=0D
+ return FALSE;=0D
+ }=0D
+=0D
+ *TableAddress =3D (VOID *) (UINTN) SmbiosTable->TableAddress;=0D
+ *TableMaximumSize =3D SmbiosTable->TableLength;=0D
+ return TRUE;=0D
+}=0D
+=0D
+/**=0D
+ Validates a SMBIOS 3.0 table entry point.=0D
+=0D
+ @param TableEntry The SmBios table entry to validate.=0D
+ @param TableAddress On exit, point to the smbios table addres.=0D
+ @param TableMaximumSize On exit, point to the maximum size of the table=
.=0D
+=0D
+ @retval TRUE SMBIOS table entry point is valid.=0D
+ @retval FALSE SMBIOS table entry point is malformed.=0D
+=0D
+**/=0D
+STATIC=0D
+BOOLEAN=0D
+IsValidSmbios30Table (=0D
+ IN VOID *TableEntry,=0D
+ OUT VOID **TableAddress,=0D
+ OUT UINTN *TableMaximumSize=0D
+ )=0D
+{=0D
+ UINT8 Checksum;=0D
+ SMBIOS_TABLE_3_0_ENTRY_POINT *SmbiosTable;=0D
+ SmbiosTable =3D (SMBIOS_TABLE_3_0_ENTRY_POINT *) TableEntry;=0D
+=0D
+ if (CompareMem (SmbiosTable->AnchorString, "_SM3_", 5) !=3D 0) {=0D
+ return FALSE;=0D
+ }=0D
+ if (SmbiosTable->EntryPointLength < sizeof (SMBIOS_TABLE_3_0_ENTRY_POINT=
)) {=0D
+ return FALSE;=0D
+ }=0D
+ if (SmbiosTable->MajorVersion < 3) {=0D
+ return FALSE;=0D
+ }=0D
+=0D
+ //=0D
+ // The whole struct check sum should be zero=0D
+ //=0D
+ Checksum =3D CalculateSum8 (=0D
+ (UINT8 *) SmbiosTable,=0D
+ SmbiosTable->EntryPointLength=0D
+ );=0D
+ if (Checksum !=3D 0) {=0D
+ return FALSE;=0D
+ }=0D
+=0D
+ *TableAddress =3D (VOID *) (UINTN) SmbiosTable->TableAddress;=0D
+ *TableMaximumSize =3D SmbiosTable->TableMaximumSize;=0D
+ return TRUE;=0D
+}=0D
+=0D
+/**=0D
+ Parse an existing SMBIOS table and insert it using SmbiosAdd.=0D
+=0D
+ @param ImageHandle The EFI_HANDLE to this driver.=0D
+ @param Smbios The SMBIOS table to parse.=0D
+ @param Length The length of the SMBIOS table.=0D
+=0D
+ @retval EFI_SUCCESS SMBIOS table was parsed and installed.=0D
+ @retval EFI_OUT_OF_RESOURCES Record was not added due to lack of system=
resources.=0D
+ @retval EFI_INVALID_PARAMETER Smbios is not a correct smbios table=0D
+=0D
+**/=0D
+STATIC=0D
+EFI_STATUS=0D
+ParseAndAddExistingSmbiosTable (=0D
+ IN EFI_HANDLE ImageHandle,=0D
+ IN SMBIOS_STRUCTURE_POINTER Smbios,=0D
+ IN UINTN Length=0D
+ )=0D
+{=0D
+ EFI_STATUS Status;=0D
+ CHAR8 *String;=0D
+ EFI_SMBIOS_HANDLE SmbiosHandle;=0D
+ SMBIOS_STRUCTURE_POINTER SmbiosEnd;=0D
+=0D
+ SmbiosEnd.Raw =3D Smbios.Raw + Length;=0D
+=0D
+ if (Smbios.Raw >=3D SmbiosEnd.Raw || Smbios.Raw =3D=3D NULL) {=0D
+ return EFI_INVALID_PARAMETER;=0D
+ }=0D
+=0D
+ do {=0D
+ //=0D
+ // Make sure not to access memory beyond SmbiosEnd=0D
+ //=0D
+ if (Smbios.Raw + sizeof (SMBIOS_STRUCTURE) > SmbiosEnd.Raw ||=0D
+ Smbios.Raw + sizeof (SMBIOS_STRUCTURE) < Smbios.Raw) {=0D
+ return EFI_INVALID_PARAMETER;=0D
+ }=0D
+ //=0D
+ // Check for end marker=0D
+ //=0D
+ if (Smbios.Hdr->Type =3D=3D SMBIOS_TYPE_END_OF_TABLE) {=0D
+ break;=0D
+ }=0D
+ //=0D
+ // Make sure not to access memory beyond SmbiosEnd=0D
+ // Each structure shall be terminated by a double-null (0000h).=0D
+ //=0D
+ if (Smbios.Raw + Smbios.Hdr->Length + 2 * sizeof (UINT8) > SmbiosEnd.R=
aw ||=0D
+ Smbios.Raw + Smbios.Hdr->Length + 2 * sizeof (UINT8) < Smbios.Raw) {=
=0D
+ return EFI_INVALID_PARAMETER;=0D
+ }=0D
+ //=0D
+ // Install the table=0D
+ //=0D
+ SmbiosHandle =3D Smbios.Hdr->Handle;=0D
+ Status =3D SmbiosAdd (=0D
+ &mPrivateData.Smbios,=0D
+ ImageHandle,=0D
+ &SmbiosHandle,=0D
+ Smbios.Hdr=0D
+ );=0D
+=0D
+ ASSERT_EFI_ERROR (Status);=0D
+ if (EFI_ERROR (Status)) {=0D
+ return Status;=0D
+ }=0D
+ //=0D
+ // Go to the next SMBIOS structure. Each SMBIOS structure may include =
2 parts:=0D
+ // 1. Formatted section; 2. Unformatted string section. So, 2 steps ar=
e needed=0D
+ // to skip one SMBIOS structure.=0D
+ //=0D
+=0D
+ //=0D
+ // Step 1: Skip over formatted section.=0D
+ //=0D
+ String =3D (CHAR8 *) (Smbios.Raw + Smbios.Hdr->Length);=0D
+=0D
+ //=0D
+ // Step 2: Skip over unformatted string section.=0D
+ //=0D
+ do {=0D
+ //=0D
+ // Each string is terminated with a NULL(00h) BYTE and the sets of s=
trings=0D
+ // is terminated with an additional NULL(00h) BYTE.=0D
+ //=0D
+ for ( ; *String !=3D 0; String++) {=0D
+ if ((UINTN) String >=3D (UINTN) SmbiosEnd.Raw - sizeof (UINT8)) {=
=0D
+ return EFI_INVALID_PARAMETER;=0D
+ }=0D
+ }=0D
+=0D
+ if (*(UINT8 *) ++String =3D=3D 0) {=0D
+ //=0D
+ // Pointer to the next SMBIOS structure.=0D
+ //=0D
+ Smbios.Raw =3D (UINT8 *) ++String;=0D
+ break;=0D
+ }=0D
+ } while (TRUE);=0D
+ } while (Smbios.Raw < SmbiosEnd.Raw);=0D
+=0D
+ return EFI_SUCCESS;=0D
+}=0D
+=0D
+/**=0D
+ Retrieve SMBIOS from Hob.=0D
+ @param ImageHandle Module's image handle=0D
+=0D
+ @retval EFI_SUCCESS Smbios from Hob is installed.=0D
+ @return EFI_NOT_FOUND Not found Smbios from Hob.=0D
+ @retval Other No Smbios from Hob is installed.=0D
+=0D
+**/=0D
+EFI_STATUS=0D
+RetrieveSmbiosFromHob (=0D
+ IN EFI_HANDLE ImageHandle=0D
+ )=0D
+{=0D
+ EFI_STATUS Status;=0D
+ UINTN Index;=0D
+ SMBIOS_STRUCTURE_POINTER Smbios;=0D
+ EFI_HOB_GUID_TYPE *GuidHob;=0D
+ UNIVERSAL_PAYLOAD_SMBIOS_TABLE *SmBiosTableAdress;=0D
+ UNIVERSAL_PAYLOAD_GENERIC_HEADER *GenericHeader;=0D
+ VOID *TableAddress;=0D
+ UINTN TableMaximumSize;=0D
+=0D
+ Status =3D EFI_NOT_FOUND;=0D
+=0D
+ for (Index =3D 0; Index < ARRAY_SIZE (mIsSmbiosTableValid); Index++) {=0D
+ GuidHob =3D GetFirstGuidHob (mIsSmbiosTableValid[Index].Guid);=0D
+ if (GuidHob =3D=3D NULL) {=0D
+ continue;=0D
+ }=0D
+ GenericHeader =3D (UNIVERSAL_PAYLOAD_GENERIC_HEADER *) GET_GUID_HOB_DA=
TA (GuidHob);=0D
+ if ((sizeof (UNIVERSAL_PAYLOAD_GENERIC_HEADER) <=3D GET_GUID_HOB_DATA_=
SIZE (GuidHob)) && (GenericHeader->Length <=3D GET_GUID_HOB_DATA_SIZE (Guid=
Hob))) {=0D
+ if (GenericHeader->Revision =3D=3D UNIVERSAL_PAYLOAD_SMBIOS_TABLE_RE=
VISION) {=0D
+ //=0D
+ // UNIVERSAL_PAYLOAD_SMBIOS_TABLE structure is used when Revision =
equals to UNIVERSAL_PAYLOAD_SMBIOS_TABLE_REVISION=0D
+ //=0D
+ SmBiosTableAdress =3D (UNIVERSAL_PAYLOAD_SMBIOS_TABLE *) GET_GUID_=
HOB_DATA (GuidHob);=0D
+ if (GenericHeader->Length >=3D UNIVERSAL_PAYLOAD_SIZEOF_THROUGH_FI=
ELD (UNIVERSAL_PAYLOAD_SMBIOS_TABLE, SmBiosEntryPoint)) {=0D
+ if (mIsSmbiosTableValid[Index].IsValid ((VOID *) (UINTN )SmBiosT=
ableAdress->SmBiosEntryPoint, &TableAddress, &TableMaximumSize)) {=0D
+ Smbios.Raw =3D TableAddress;=0D
+ Status =3D ParseAndAddExistingSmbiosTable (ImageHandle, Smbios=
, TableMaximumSize);=0D
+ if (EFI_ERROR (Status)) {=0D
+ DEBUG ((DEBUG_ERROR, "RetrieveSmbiosFromHob: Failed to parse=
preinstalled tables from Guid Hob\n"));=0D
+ Status =3D EFI_UNSUPPORTED;=0D
+ } else {=0D
+ return EFI_SUCCESS;=0D
+ }=0D
+ }=0D
+ }=0D
+ }=0D
+ }=0D
+ }=0D
+ return Status;=0D
+}=0D
+=0D
/**=0D
=0D
Driver to produce Smbios protocol and pre-allocate 1 page for the final =
SMBIOS table.=0D
@@ -1451,5 +1741,6 @@ SmbiosDriverEntryPoint (
&mPrivateData.Smbios=0D
);=0D
=0D
+ RetrieveSmbiosFromHob (ImageHandle);=0D
return Status;=0D
}=0D
diff --git a/MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.h b/MdeModulePkg/Un=
iversal/SmbiosDxe/SmbiosDxe.h
index f97c85ae40..a131bdabec 100644
--- a/MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.h
+++ b/MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.h
@@ -1,7 +1,7 @@
/** @file=0D
This code supports the implementation of the Smbios protocol=0D
=0D
-Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>=0D
+Copyright (c) 2009 - 2021, Intel Corporation. All rights reserved.<BR>=0D
SPDX-License-Identifier: BSD-2-Clause-Patent=0D
=0D
**/=0D
@@ -24,6 +24,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/MemoryAllocationLib.h>=0D
#include <Library/UefiBootServicesTableLib.h>=0D
#include <Library/PcdLib.h>=0D
+#include <Library/HobLib.h>=0D
+#include <UniversalPayload/SmbiosTable.h>=0D
=0D
#define SMBIOS_INSTANCE_SIGNATURE SIGNATURE_32 ('S', 'B', 'i', 's')=0D
typedef struct {=0D
@@ -121,4 +123,65 @@ SmbiosTableConstruction (
BOOLEAN Smbios64BitTable=0D
);=0D
=0D
+/**=0D
+ Validates a SMBIOS 3.0 table entry point.=0D
+=0D
+ @param TableEntry The SmBios table entry to validate.=0D
+ @param TableAddress On exit, point to the smbios table addres.=0D
+ @param TableMaximumSize On exit, point to the maximum size of the table=
.=0D
+=0D
+ @retval TRUE SMBIOS table entry point is valid.=0D
+ @retval FALSE SMBIOS table entry point is malformed.=0D
+=0D
+**/=0D
+STATIC=0D
+BOOLEAN=0D
+IsValidSmbios30Table (=0D
+ IN VOID *TableEntry,=0D
+ OUT VOID **TableAddress,=0D
+ OUT UINTN *TableMaximumSize=0D
+ );=0D
+=0D
+/**=0D
+ Validates a SMBIOS 2.0 table entry point.=0D
+=0D
+ @param TableEntry The SmBios table entry to validate.=0D
+ @param TableAddress On exit, point to the smbios table addres.=0D
+ @param TableMaximumSize On exit, point to the maximum size of the table=
.=0D
+=0D
+ @retval TRUE SMBIOS table entry point is valid.=0D
+ @retval FALSE SMBIOS table entry point is malformed.=0D
+=0D
+**/=0D
+STATIC=0D
+BOOLEAN=0D
+IsValidSmbios20Table (=0D
+ IN VOID *TableEntry,=0D
+ OUT VOID **TableAddress,=0D
+ OUT UINTN *TableMaximumSize=0D
+ );=0D
+=0D
+/**=0D
+ Validates a SMBIOS table entry point.=0D
+=0D
+ @param TableEntry The SmBios table entry to validate.=0D
+ @param TableAddress On exit, point to the smbios table addres.=0D
+ @param TableMaximumSize On exit, point to the maximum size of the table=
.=0D
+=0D
+ @retval TRUE SMBIOS table entry point is valid.=0D
+ @retval FALSE SMBIOS table entry point is malformed.=0D
+=0D
+**/=0D
+typedef=0D
+BOOLEAN=0D
+(* IS_SMBIOS_TABLE_VALID) (=0D
+ IN VOID *TableEntry,=0D
+ OUT VOID **TableAddress,=0D
+ OUT UINTN *TableMaximumSize=0D
+ );=0D
+typedef struct {=0D
+ EFI_GUID *Guid;=0D
+ IS_SMBIOS_TABLE_VALID IsValid;=0D
+} IS_SMBIOS_TABLE_VALID_ENTRY;=0D
+=0D
#endif=0D
diff --git a/MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf b/MdeModulePkg/=
Universal/SmbiosDxe/SmbiosDxe.inf
index f6c036e1dc..c03915a692 100644
--- a/MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
+++ b/MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
@@ -1,7 +1,7 @@
## @file=0D
# This driver initializes and installs the SMBIOS protocol, constructs SMB=
IOS table into system configuration table.=0D
#=0D
-# Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>=0D
+# Copyright (c) 2009 - 2021, Intel Corporation. All rights reserved.<BR>=0D
#=0D
# SPDX-License-Identifier: BSD-2-Clause-Patent=0D
#=0D
@@ -41,6 +41,7 @@
UefiDriverEntryPoint=0D
DebugLib=0D
PcdLib=0D
+ HobLib=0D
=0D
[Protocols]=0D
gEfiSmbiosProtocolGuid ## PRODUCES=0D
@@ -48,6 +49,8 @@
[Guids]=0D
gEfiSmbiosTableGuid ## SOMETIMES_PRODUCES =
## SystemTable=0D
gEfiSmbios3TableGuid ## SOMETIMES_PRODUCES =
## SystemTable=0D
+ gUniversalPayloadSmbios3TableGuid ## CONSUMES =
## HOB=0D
+ gUniversalPayloadSmbiosTableGuid ## SOMETIMES_CONSUMES =
## HOB=0D
=0D
[Pcd]=0D
gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosVersion ## CONSUMES=0D
--=20
2.30.0.windows.2


[Patch V5 4/9] MdeModulePkg: Add new structure for the Universal Payload SMBios Table Hob

Zhiguang Liu
 

Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Hao A Wu <hao.a.wu@intel.com>
Reviewed-by: Hao A Wu <hao.a.wu@intel.com>
Signed-off-by: Zhiguang Liu <zhiguang.liu@intel.com>
---
MdeModulePkg/Include/UniversalPayload/SmbiosTable.h | 30 +++++++++++++++++=
+++++++++++++
MdeModulePkg/MdeModulePkg.dec | 6 ++++++
2 files changed, 36 insertions(+)

diff --git a/MdeModulePkg/Include/UniversalPayload/SmbiosTable.h b/MdeModul=
ePkg/Include/UniversalPayload/SmbiosTable.h
new file mode 100644
index 0000000000..94c4aaf7ee
--- /dev/null
+++ b/MdeModulePkg/Include/UniversalPayload/SmbiosTable.h
@@ -0,0 +1,30 @@
+/** @file=0D
+ Define the structure for the Universal Payload SmBios.=0D
+=0D
+Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>=0D
+SPDX-License-Identifier: BSD-2-Clause-Patent=0D
+=0D
+ @par Revision Reference:=0D
+ - Universal Payload Specification 0.75 (https://universalpayload.githu=
b.io/documentation/)=0D
+**/=0D
+=0D
+#ifndef UNIVERSAL_PAYLOAD_SMBIOS_TABLE_H_=0D
+#define UNIVERSAL_PAYLOAD_SMBIOS_TABLE_H_=0D
+=0D
+#include <Uefi.h>=0D
+#include <UniversalPayload/UniversalPayload.h>=0D
+=0D
+#pragma pack (1)=0D
+=0D
+typedef struct {=0D
+ UNIVERSAL_PAYLOAD_GENERIC_HEADER Header;=0D
+ EFI_PHYSICAL_ADDRESS SmBiosEntryPoint;=0D
+} UNIVERSAL_PAYLOAD_SMBIOS_TABLE;=0D
+=0D
+#pragma pack()=0D
+=0D
+#define UNIVERSAL_PAYLOAD_SMBIOS_TABLE_REVISION 1=0D
+=0D
+extern GUID gUniversalPayloadSmbios3TableGuid;=0D
+extern GUID gUniversalPayloadSmbiosTableGuid;=0D
+#endif // UNIVERSAL_PAYLOAD_SMBIOS_TABLE_H_=0D
diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
index 5cee4e159a..377e868e7c 100644
--- a/MdeModulePkg/MdeModulePkg.dec
+++ b/MdeModulePkg/MdeModulePkg.dec
@@ -410,6 +410,12 @@
## Include/UniversalPayload/PciRootBridges.h=0D
gUniversalPayloadPciRootBridgeInfoGuid =3D { 0xec4ebacb, 0x2638, 0x416e,=
{ 0xbe, 0x80, 0xe5, 0xfa, 0x4b, 0x51, 0x19, 0x01 }}=0D
=0D
+ ## Include/UniversalPayload/SmbiosTable.h=0D
+ gUniversalPayloadSmbios3TableGuid =3D { 0x92b7896c, 0x3362, 0x46ce, { 0x=
99, 0xb3, 0x4f, 0x5e, 0x3c, 0x34, 0xeb, 0x42 } }=0D
+=0D
+ ## Include/UniversalPayload/SmbiosTable.h=0D
+ gUniversalPayloadSmbiosTableGuid =3D { 0x590a0d26, 0x06e5, 0x4d20, { 0x8=
a, 0x82, 0x59, 0xea, 0x1b, 0x34, 0x98, 0x2d } }=0D
+=0D
[Ppis]=0D
## Include/Ppi/AtaController.h=0D
gPeiAtaControllerPpiGuid =3D { 0xa45e60d1, 0xc719, 0x44aa, { 0xb0,=
0x7a, 0xaa, 0x77, 0x7f, 0x85, 0x90, 0x6d }}=0D
--=20
2.30.0.windows.2


[Patch V5 3/9] UefiPayloadPkg: UefiPayload retrieve PCI root bridge from Guid Hob

Zhiguang Liu
 

UefiPayload parse gUniversalPayloadPciRootBridgeInfoGuid Guid Hob to
retrieve PCI root bridges information.
gUniversalPayloadPciRootBridgeInfoGuid Guid Hob should be created by
Bootloader.

Cc: Maurice Ma <maurice.ma@intel.com>
Cc: Guo Dong <guo.dong@intel.com>
Cc: Benjamin You <benjamin.you@intel.com>
Reviewed-by: Guo Dong <guo.dong@intel.com>
Signed-off-by: Zhiguang Liu <zhiguang.liu@intel.com>
---
UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridge.h | 40 ++++++=
++++++++++++++++++++++++++++++++--
UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeLib.c | 47 ++++++=
++++++++++++++++++++++++++++++++++++++---
UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf | 8 ++++++=
+-
UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeSupport.c | 73 ++++++=
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
UefiPayloadPkg/UefiPayloadPkg.dsc | 2 +-
5 files changed, 162 insertions(+), 8 deletions(-)

diff --git a/UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridge.h b/Uefi=
PayloadPkg/Library/PciHostBridgeLib/PciHostBridge.h
index c2961b3bee..3eee1fbeac 100644
--- a/UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridge.h
+++ b/UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridge.h
@@ -2,7 +2,7 @@
Header file of PciHostBridgeLib.=0D
=0D
Copyright (C) 2016, Red Hat, Inc.=0D
- Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>=0D
+ Copyright (c) 2016 - 2021, Intel Corporation. All rights reserved.<BR>=0D
=0D
SPDX-License-Identifier: BSD-2-Clause-Patent=0D
=0D
@@ -11,14 +11,38 @@
#ifndef _PCI_HOST_BRIDGE_H=0D
#define _PCI_HOST_BRIDGE_H=0D
=0D
+#include <UniversalPayload/PciRootBridges.h>=0D
+=0D
typedef struct {=0D
ACPI_HID_DEVICE_PATH AcpiDevicePath;=0D
EFI_DEVICE_PATH_PROTOCOL EndDevicePath;=0D
} CB_PCI_ROOT_BRIDGE_DEVICE_PATH;=0D
=0D
+/**=0D
+ Scan for all root bridges in platform.=0D
+=0D
+ @param[out] NumberOfRootBridges Number of root bridges detected=0D
+=0D
+ @retval Pointer to the allocated PCI_ROOT_BRIDGE structure array.=0D
+**/=0D
PCI_ROOT_BRIDGE *=0D
ScanForRootBridges (=0D
- UINTN *NumberOfRootBridges=0D
+ OUT UINTN *NumberOfRootBridges=0D
+);=0D
+=0D
+/**=0D
+ Scan for all root bridges from Universal Payload PciRootBridgeInfoHob=0D
+=0D
+ @param[in] PciRootBridgeInfo Pointer of Universal Payload PCI Root B=
ridge Info Hob=0D
+ @param[out] NumberOfRootBridges Number of root bridges detected=0D
+=0D
+ @retval Pointer to the allocated PCI_ROOT_BRIDGE structure array.=0D
+=0D
+**/=0D
+PCI_ROOT_BRIDGE *=0D
+RetrieveRootBridgeInfoFromHob (=0D
+ IN UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES *PciRootBridgeInfo,=0D
+ OUT UINTN *NumberOfRootBridges=0D
);=0D
=0D
/**=0D
@@ -77,4 +101,16 @@ InitRootBridge (
OUT PCI_ROOT_BRIDGE *RootBus=0D
);=0D
=0D
+/**=0D
+ Initialize DevicePath for a PCI_ROOT_BRIDGE.=0D
+ @param[in] HID HID for device path=0D
+ @param[in] UID UID for device path=0D
+=0D
+ @retval A pointer to the new created device patch.=0D
+**/=0D
+EFI_DEVICE_PATH_PROTOCOL *=0D
+CreateRootBridgeDevicePath (=0D
+ IN UINT32 HID,=0D
+ IN UINT32 UID=0D
+);=0D
#endif=0D
diff --git a/UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeLib.c b/U=
efiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeLib.c
index 512c3127cc..a0d7cdc306 100644
--- a/UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeLib.c
+++ b/UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeLib.c
@@ -2,7 +2,7 @@
Library instance of PciHostBridgeLib library class for coreboot.=0D
=0D
Copyright (C) 2016, Red Hat, Inc.=0D
- Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>=0D
+ Copyright (c) 2016 - 2021, Intel Corporation. All rights reserved.<BR>=0D
=0D
SPDX-License-Identifier: BSD-2-Clause-Patent=0D
=0D
@@ -19,6 +19,7 @@
#include <Library/MemoryAllocationLib.h>=0D
#include <Library/PciHostBridgeLib.h>=0D
#include <Library/PciLib.h>=0D
+#include <Library/HobLib.h>=0D
=0D
#include "PciHostBridge.h"=0D
=0D
@@ -48,7 +49,6 @@ CB_PCI_ROOT_BRIDGE_DEVICE_PATH mRootBridgeDevicePathTempl=
ate =3D {
}=0D
};=0D
=0D
-=0D
/**=0D
Initialize a PCI_ROOT_BRIDGE structure.=0D
=0D
@@ -145,6 +145,27 @@ InitRootBridge (
return EFI_SUCCESS;=0D
}=0D
=0D
+/**=0D
+ Initialize DevicePath for a PCI_ROOT_BRIDGE.=0D
+ @param[in] HID HID for device path=0D
+ @param[in] UID UID for device path=0D
+=0D
+ @retval A pointer to the new created device patch.=0D
+**/=0D
+EFI_DEVICE_PATH_PROTOCOL *=0D
+CreateRootBridgeDevicePath (=0D
+ IN UINT32 HID,=0D
+ IN UINT32 UID=0D
+)=0D
+{=0D
+ CB_PCI_ROOT_BRIDGE_DEVICE_PATH *DevicePath;=0D
+ DevicePath =3D AllocateCopyPool (sizeof (mRootBridgeDevicePathTemplate),=
=0D
+ &mRootBridgeDevicePathTemplate);=0D
+ ASSERT (DevicePath !=3D NULL);=0D
+ DevicePath->AcpiDevicePath.HID =3D HID;=0D
+ DevicePath->AcpiDevicePath.UID =3D UID;=0D
+ return (EFI_DEVICE_PATH_PROTOCOL *)DevicePath;=0D
+}=0D
=0D
/**=0D
Return all the root bridge instances in an array.=0D
@@ -161,10 +182,30 @@ PciHostBridgeGetRootBridges (
UINTN *Count=0D
)=0D
{=0D
+ UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES *PciRootBridgeInfo;=0D
+ EFI_HOB_GUID_TYPE *GuidHob;=0D
+ UNIVERSAL_PAYLOAD_GENERIC_HEADER *GenericHeader;=0D
+ //=0D
+ // Find Universal Payload PCI Root Bridge Info hob=0D
+ //=0D
+ GuidHob =3D GetFirstGuidHob (&gUniversalPayloadPciRootBridgeInfoGuid);=0D
+ if (GuidHob !=3D NULL) {=0D
+ GenericHeader =3D (UNIVERSAL_PAYLOAD_GENERIC_HEADER *) GET_GUID_HOB_DA=
TA (GuidHob);=0D
+ if ((sizeof(UNIVERSAL_PAYLOAD_GENERIC_HEADER) <=3D GET_GUID_HOB_DATA_S=
IZE (GuidHob)) && (GenericHeader->Length <=3D GET_GUID_HOB_DATA_SIZE (GuidH=
ob))) {=0D
+ if ((GenericHeader->Revision =3D=3D UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDG=
ES_REVISION) && (GenericHeader->Length >=3D sizeof (UNIVERSAL_PAYLOAD_PCI_R=
OOT_BRIDGES))) {=0D
+ //=0D
+ // UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES structure is used when Revis=
ion equals to UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES_REVISION=0D
+ //=0D
+ PciRootBridgeInfo =3D (UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES *) GET_G=
UID_HOB_DATA (GuidHob);=0D
+ if (PciRootBridgeInfo->Count <=3D (GET_GUID_HOB_DATA_SIZE (GuidHob=
) - sizeof(UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES)) / sizeof(UNIVERSAL_PAYLOAD_=
PCI_ROOT_BRIDGE)) {=0D
+ return RetrieveRootBridgeInfoFromHob (PciRootBridgeInfo, Count);=
=0D
+ }=0D
+ }=0D
+ }=0D
+ }=0D
return ScanForRootBridges (Count);=0D
}=0D
=0D
-=0D
/**=0D
Free the root bridge instances array returned from=0D
PciHostBridgeGetRootBridges().=0D
diff --git a/UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf b=
/UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf
index 7896df2416..6069dcc0ef 100644
--- a/UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf
+++ b/UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf
@@ -2,7 +2,7 @@
# Library instance of PciHostBridgeLib library class for coreboot.=0D
#=0D
# Copyright (C) 2016, Red Hat, Inc.=0D
-# Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>=
=0D
+# Copyright (c) 2016 - 2021, Intel Corporation. All rights reserved.<BR>=
=0D
#=0D
# SPDX-License-Identifier: BSD-2-Clause-Patent=0D
#=0D
@@ -39,3 +39,9 @@
DevicePathLib=0D
MemoryAllocationLib=0D
PciLib=0D
+=0D
+[Guids]=0D
+ gUniversalPayloadPciRootBridgeInfoGuid=0D
+=0D
+[Pcd]=0D
+ gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumeration=0D
diff --git a/UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeSupport.c=
b/UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeSupport.c
index fffbf04cad..b0268f0506 100644
--- a/UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeSupport.c
+++ b/UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeSupport.c
@@ -1,7 +1,7 @@
/** @file=0D
Scan the entire PCI bus for root bridges to support coreboot UEFI payloa=
d.=0D
=0D
- Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>=0D
+ Copyright (c) 2016 - 2021, Intel Corporation. All rights reserved.<BR>=0D
=0D
SPDX-License-Identifier: BSD-2-Clause-Patent=0D
=0D
@@ -582,3 +582,74 @@ ScanForRootBridges (
=0D
return RootBridges;=0D
}=0D
+=0D
+/**=0D
+ Scan for all root bridges from Universal Payload PciRootBridgeInfoHob=0D
+=0D
+ @param[in] PciRootBridgeInfo Pointer of Universal Payload PCI Root B=
ridge Info Hob=0D
+ @param[out] NumberOfRootBridges Number of root bridges detected=0D
+=0D
+ @retval Pointer to the allocated PCI_ROOT_BRIDGE structure array.=0D
+=0D
+**/=0D
+PCI_ROOT_BRIDGE *=0D
+RetrieveRootBridgeInfoFromHob (=0D
+ IN UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGES *PciRootBridgeInfo,=0D
+ OUT UINTN *NumberOfRootBridges=0D
+)=0D
+{=0D
+ PCI_ROOT_BRIDGE *PciRootBridges;=0D
+ UINTN Size;=0D
+ UINT8 Index;=0D
+=0D
+ ASSERT (PciRootBridgeInfo !=3D NULL);=0D
+ ASSERT (NumberOfRootBridges !=3D NULL);=0D
+ if (PciRootBridgeInfo =3D=3D NULL) {=0D
+ return NULL;=0D
+ }=0D
+ if (PciRootBridgeInfo->Count =3D=3D 0) {=0D
+ return NULL;=0D
+ }=0D
+ Size =3D PciRootBridgeInfo->Count * sizeof (PCI_ROOT_BRIDGE);=0D
+ PciRootBridges =3D (PCI_ROOT_BRIDGE *) AllocatePool (Size);=0D
+ ASSERT (PciRootBridges !=3D NULL);=0D
+ if (PciRootBridges =3D=3D NULL) {=0D
+ return NULL;=0D
+ }=0D
+ ZeroMem (PciRootBridges, PciRootBridgeInfo->Count * sizeof (PCI_ROOT_BRI=
DGE));=0D
+=0D
+ //=0D
+ // Create all root bridges with PciRootBridgeInfoHob=0D
+ //=0D
+ for (Index =3D 0; Index < PciRootBridgeInfo->Count; Index++) {=0D
+ PciRootBridges[Index].Segment =3D PciRootBridgeInfo->Roo=
tBridge[Index].Segment;=0D
+ PciRootBridges[Index].Supports =3D PciRootBridgeInfo->Roo=
tBridge[Index].Supports;=0D
+ PciRootBridges[Index].Attributes =3D PciRootBridgeInfo->Roo=
tBridge[Index].Attributes;=0D
+ PciRootBridges[Index].DmaAbove4G =3D PciRootBridgeInfo->Roo=
tBridge[Index].DmaAbove4G;=0D
+ PciRootBridges[Index].NoExtendedConfigSpace =3D PciRootBridgeInfo->Roo=
tBridge[Index].NoExtendedConfigSpace;=0D
+ PciRootBridges[Index].ResourceAssigned =3D PciRootBridgeInfo->Res=
ourceAssigned;=0D
+ PciRootBridges[Index].AllocationAttributes =3D PciRootBridgeInfo->Roo=
tBridge[Index].AllocationAttributes;=0D
+ PciRootBridges[Index].DevicePath =3D CreateRootBridgeDevice=
Path(PciRootBridgeInfo->RootBridge[Index].HID, PciRootBridgeInfo->RootBridg=
e[Index].UID);=0D
+ CopyMem(&PciRootBridges[Index].Bus, &PciRootBridgeInfo->RootBr=
idge[Index].Bus, sizeof(UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGE_APERTURE)=
);=0D
+ CopyMem(&PciRootBridges[Index].Io, &PciRootBridgeInfo->RootBr=
idge[Index].Io, sizeof(UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGE_APERTURE)=
);=0D
+ CopyMem(&PciRootBridges[Index].Mem, &PciRootBridgeInfo->RootBr=
idge[Index].Mem, sizeof(UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGE_APERTURE)=
);=0D
+ CopyMem(&PciRootBridges[Index].MemAbove4G, &PciRootBridgeInfo->RootBr=
idge[Index].MemAbove4G, sizeof(UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGE_APERTURE)=
);=0D
+ CopyMem(&PciRootBridges[Index].PMem, &PciRootBridgeInfo->RootBr=
idge[Index].PMem, sizeof(UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGE_APERTURE)=
);=0D
+ CopyMem(&PciRootBridges[Index].PMemAbove4G, &PciRootBridgeInfo->RootBr=
idge[Index].PMemAbove4G, sizeof(UNIVERSAL_PAYLOAD_PCI_ROOT_BRIDGE_APERTURE)=
);=0D
+ }=0D
+=0D
+ *NumberOfRootBridges =3D PciRootBridgeInfo->Count;=0D
+=0D
+ //=0D
+ // Now, this library only supports RootBridge that ResourceAssigned is T=
rue=0D
+ //=0D
+ if (PciRootBridgeInfo->ResourceAssigned) {=0D
+ PcdSetBoolS (PcdPciDisableBusEnumeration, TRUE);=0D
+ } else {=0D
+ DEBUG ((DEBUG_ERROR, "There is root bridge whose ResourceAssigned is F=
ALSE\n"));=0D
+ PcdSetBoolS (PcdPciDisableBusEnumeration, FALSE);=0D
+ return NULL;=0D
+ }=0D
+=0D
+ return PciRootBridges;=0D
+}=0D
diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayload=
Pkg.dsc
index 37ad5a0ae7..e9211adf86 100644
--- a/UefiPayloadPkg/UefiPayloadPkg.dsc
+++ b/UefiPayloadPkg/UefiPayloadPkg.dsc
@@ -323,7 +323,6 @@
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialFifoControl|$(SERIAL_FIFO_CONTRO=
L)=0D
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialExtendedTxFifoSize|$(SERIAL_EXTE=
NDED_TX_FIFO_SIZE)=0D
=0D
- gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumeration|TRUE=0D
gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate|$(UART_DEFAULT_BAUD_RATE=
)=0D
gEfiMdePkgTokenSpaceGuid.PcdUartDefaultDataBits|$(UART_DEFAULT_DATA_BITS=
)=0D
gEfiMdePkgTokenSpaceGuid.PcdUartDefaultParity|$(UART_DEFAULT_PARITY)=0D
@@ -363,6 +362,7 @@
gEfiMdeModulePkgTokenSpaceGuid.PcdConOutColumn|100=0D
gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress|0=0D
gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseSize|0=0D
+ gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumeration|TRUE=0D
=0D
##########################################################################=
######=0D
#=0D
--=20
2.30.0.windows.2

9541 - 9560 of 85992