From dcee0314580bbdbce5fb275c5b59787869b083e6 Mon Sep 17 00:00:00 2001 From: Omooo <869759698@qq.com> Date: Tue, 23 Apr 2019 14:46:12 +0800 Subject: [PATCH] =?UTF-8?q?add=20Android=20=E7=B3=BB=E7=BB=9F=E5=90=AF?= =?UTF-8?q?=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Android/Framework/Android 系统启动.md | 103 ++++++++++++++++++ .../Framework/应用程序启动流程.png | Bin 0 -> 28022 bytes 2 files changed, 103 insertions(+) create mode 100644 images/Android/Framework/应用程序启动流程.png diff --git a/blogs/Android/Framework/Android 系统启动.md b/blogs/Android/Framework/Android 系统启动.md index 0e74ceb..5c5a6d1 100644 --- a/blogs/Android/Framework/Android 系统启动.md +++ b/blogs/Android/Framework/Android 系统启动.md @@ -2,3 +2,106 @@ Android 系统启动 --- +#### 目录 + +1. 流程图 +2. init 进程启动过程 +3. Zygote 进程启动过程 +4. SystemServer 处理过程 +5. Launcher 启动过程 +6. 启动流程总结 + +#### 流程图 + +![](https://i.loli.net/2019/04/23/5cbe5a6cbb114.png) + +#### init 进程启动过程 + +init 进程是 Android 系统中用户空间的第一个进程,进程号为 1,是 Android 系统启动流程中一个关键的步骤,作为第一个进程,它被赋予了很多及其重要的工作职责,比如创建 Zygote 孵化器和属性服务等。 + +但在这之前,我们先要了解 Android 系统启动流程的前几步,以引入 init 进程: + +1. 启动电源以及系统启动 +2. 引导程序 BootLoader +3. Linux 内核启动 +4. init 进程启动 + +当我们按下电源时,系统启动后会加载引导程序,引导程序又启动 Linux 内核,在 Linux 内核加载完成后,第一件事就是要启动 init 进程。 + +init 进程启动后会 fork 出 Zygote 进程,为了防止 init 进程的子进程成为僵尸进程,系统会在子进程暂停和终止的时候发出 SIGCHLD 信号。 + +僵尸进程与危害: + +在 Linux 中,父进程使用 fork 创建子进程,在子进程终止之后,如果父进程并不知道子进程已经终止了,这时子进程虽然已经退出了,但是在系统进程表中还为它保留了一定的信息(比如进程号、退出状态、运行时间等),这个子进程就被称为僵尸进程。系统进程表是一项有限资源,如果系统进程表被僵尸进程耗尽的话,系统就可能无法创建新的进程了。 + +**总结:** + +init 进程主要做了以下三件事: + +1. 创建和挂载启动所需的文件目录 +2. 初始化和启动属性服务 +3. 解析 init.rc 配置文件并启动 Zygote 进程 + +#### Zygote 进程启动过程 + +在 Android 系统中,DVM 和 ART、应用程序进程以及运行系统的关键服务的 SystemServer 进程都是由 Zygote 进程来创建的,我们也将它称为孵化器。它通过 fork 的形式来创建应用程序进程和 SystemServer 进程。 + +**总结:** + +Zygote 进程主要做了以下几件事: + +1. 创建 AppRuntime 并调用其 start 方法,启动 Zygote 进程 +2. 创建 Java 虚拟机并为 Java 虚拟机注册 JNI 方法 +3. 通过 JNI 调用 ZygoteInit 的 main 方法进入 Zygote 的 Java 框架层 +4. 通过 registerZygoteSocket 方法创建服务端 Socket,并通过 runSelectLoop 方法等待 AMS 的请求来创建新的应用程序进程 +5. 启动 SystemServer 进程 + +#### SystemServer 处理过程 + +SystemServer 进程主要用于创建系统服务,比如 AMS、WMS、PMS 等都是由它来创建的。 + +**总结:** + +SystemServer 进程被创建后,主要做了以下工作: + +1. 启动 Binder 线程池,这样就可以与其他进程进行通信 +2. 启动 SystemServiceManager,其用于对系统的服务进程创建、启动和生命周期管理 +3. 启动各种系统服务 + +#### Launcher 启动过程 + +系统启动的最后一步是启动一个应用程序用来显示系统中已经被安装的应用程序,这个应用程序就叫 Launcher。Launcher 在启动过程中会请求 PackageManagerService 返回系统中已经安装的应用程序信息,并将这些信息封装成一个快捷图标列表展示在系统屏幕上,这样用户就可以通过点击这些快捷图标来启动相应的应用程序。 + +通俗的讲,Launcher 就是 Android 系统的桌面。 + +#### 启动流程总结 + +结合以上过程,就可以总结出 Android 系统启动的过程,大致有以下几部分: + +1. 启动电源以及系统启动 + + 当电源按下时引导芯片代码从预定义的地方开始执行。加载引导程序 BootLoader 到 RAM,然后执行。 + +2. 引导程序 BootLoader + + 引导程序 BootLoader 是在 Android 操作系统开始运行前的一个小程序,它的主要作用是把系统 OS 拉起来运行。 + +3. Linux 内核启动 + + 当内核启动时,设置缓存、存储器、计划列表、加载驱动。当内核完成系统设置时,它首先在系统文件中寻找 init.rc 文件,并启动 init 进程。 + +4. init 进程启动 + + 初始化和启动属性服务,并且启动 Zygote 进程。 + +5. Zygote 进程启动 + + 创建 Java 虚拟机并为 Java 虚拟机注册 JNI 方法,创建服务端 Socket,启动 SystemServer 进程。 + +6. SystemServer 进程启动 + + 启动 Binder 线程池和 SystemServiceManager,并且启动各种系统服务。 + +7. Launcher 启动 + + 被 SystemServer 进程启动的 AMS 会启动 Launcher,Launcher 启动后会将已安装的应用的快捷图标显示在界面上。 \ No newline at end of file diff --git a/images/Android/Framework/应用程序启动流程.png b/images/Android/Framework/应用程序启动流程.png new file mode 100644 index 0000000000000000000000000000000000000000..77fab5f47538756d5b1572726c6f8cde369f88cf GIT binary patch literal 28022 zcmeFZ2RPS#-#`4*qG1;@3(-UinT5!RCKZuUME2f_jI6Y@P*f7Kl4P$CkrgGovR7n} z=k@74uj{_<>pHLhaX-)T+{gd_9M63o*LBDbzw!NkKJWKyy*~j*)Rkygv9F>~D74Cl z6pm3SRPz+dl1Q2rcqB=oumfLKS{*uVOQEc0CjY0R+<(YMp=_WiD;zlC^l+fX`NWCI z0+|uNu>79n9=6A(N0fDVSHEhJApg=~;sy(G>>|)r#IZ#C+U6 z@kfK<2b1K(XZcL>mtWyeuid#>6(=h)8ezv5-<={fZvj@gclA+z#pw{1vw+1EjR zp`xPsst8x}Wd|7cD<~*vY6v(`czJpI*tfgmOTf8aW=2NkWvWsB{)c!^&EPkf3Tg#; zd2i6%kzr&EQ%D{U@b~Ax@>D}XfuHgJPk*AFvXtTU3)OHT{kB~9H!i=ns;H_yZZItg zF{*j^@L~IpAHMoUz8eJuR`4l>td(R6Ye-?lC6-(kwka+lp?Kz3zx9vG^(ir@_Ii4H zCY;S;5fTzIP}-P^%O353n^su+RMon>ifg>Lj(T)-bYybU@4*8OJach~am}kUJMd~@ z;o;QjXM*qFXMgkN&4wL2X!#U_7$mvFPU4>3i_6aDT)A@P^Z0oA6DQU(F*9!ruP6yQ zf190yBkabFD=|u;g*7#drs?eSvy-fnEMX;v_@l>}nd`^8t4pu0W)-php_ZVN$+T;I zwYU3yI|(k)OHE$YvWuLC?}7?mn>U{`tEju~AGyrajPaiSaBI#RtBxg7Qc}qVC97CG zSg)5Gok}rSjt8t3=9~vwva|*cDX@ep%_x|^aUAA;rXF#vug~;JY-~|W%h`cLH;x@U zcBQH5)aKhNoKj8<6B82#O1!D3q;xi#7F}LS{iw!-ft~$*A?xL=EJ-;zxg#e}UR_E} z=g;L=7M(I4@a1|~7!}1oG?aB;fZd1tdskDg-@CWPhKaZ0U9I4*12Hv^9zCK|RaK3Q zkFS*sF>-csDJ(Bv*1|a31}W5r-8ub%nUhk8^XmDedj;A20S_vanFR za6#b8l`BEq8ft1jY69|#iYsdC>W&^c;d$L?Dn*}4oerMmY0`Pys%UaaI+FywKP;zuBgY#F2l6kJ&@Zu8B*{NfK&Gp@Y(LCX}A8s4U+ruNz4 zJinNjn2zn!S&qYaBIc=INuIQsIw2nOGy3=|U;D;}hK~BUvC7B_+!n8X5#*@5LwDV-0nE5Nj(QY|iLFX<3+`mG?}k;_;ZGl8C74VacFx zn^TOb+0U@7NSij_yZ?u*8~3u|{fFwMQJ>YUtgQCi+wWy(XOHaJ{44gB%BIe)F7m-h z-Ep58r=pxVae{5tFY+0W#qHVmLFd^gl(Nwu4=fGv)=+z>DRW~{i^W=c?#n4o6Q7MY z-YmD8oiJa+DbA4ZExT;oWpap?B5v2iz{$l$MM+OjH@SH6z~RG(sUstlvRo&HysF&e zuO2cL&(<(1taIVXeEgWobGEr{4eOk>jm?#)C>~MsFFx0WRow3~Wjj;% z?6ADMyY!74H`df0KX%M&xK$dvi%&?1uC=w*X)wJ}O`SvBYQwt_uE3EItD^2k+`LQU z!y2A5H_Pp%W(U$py=(QDHGh6$E5Cq%!NT11^@{Irth-iF&Y>pZ7UbXBa-4yOr>)N? z`_`?s_@rw0_pHRr7PS|6<7Pw)dQ@>gYonfVms1!l%^G05cm2*C-?Lc`9k}m%bQU9u zM?V`!ZQQ$eo$Zgx0(6Ix5P738rzg0g{)~JS3aha0+I=f~CksY8iVmvF8D)}>I5jg< z`0m|`%*;&R(8i;Ub-i|FA3j`F6Yx$-N@}w9-_D{MRkrNuv6UJc8ugz(ML&A9e?a`k z$sHQ<`yTner3WM9rm6R$)B6ed2dyj&eNHh@yLX zEFd9a`>k8I{JE5DUh3tA3=CWvA8cl=i`8I7g*}Mol3vi-%5B?Sb#(*HsSJyV4uQSn z<9o%#__l0Wd1b@7p|6?A85ykTljL{rZIqGW#=ck7*WY;T_;KfBdaNIN?G7D2d=L-3 z3tI2}=8bp?ALD5$5A~=rweR1*A3Ahs|Jk!#(b3V@@7|@!)Dd#n9$(+oTu!e~pMJL4P$hGdp_b%(dOdRr?b) zW1c-*f#!TjRdu(H@MZtVHL6k1Berha7WVLAP^=!^4FGa3uPCF^A>Y!8pnQo@Q#l+(<$%$k_@{YR&GQ?OKWbM`|;xu7MZZ(k#!nI zS1Y&7CnqNh9g=!5aeTlegJrJ*3vIIv8KNZq;%(H#dbt3JL~TCa1Tc zur6D%;D}O(y5U!UC@V zFYiwBOLujIl=koU>M*;la(-Ni!l=9&@AbX3+hcB9p)c|Zp90ZtzjMpn8$K#H!5C&Y zBIK%|ss8xL1`!bkQBl#JhWK!7p+gGf=ArR=2L}f??esrnl$|bgl=|#jyOpyOgGCMT zT3AV|5;eCu@CW|*_HCJ%nAjQ)(KS1F?qu6%^Q0-vKY{Mg^_1c<@A7b;t>VCD%@1vD zJXkna0|Nt_j`}C8z;AF}yLK(vuJ_p2Oj~M{>;rCYQgie3=mi&kzI3P;P1Fpmtv&Yb z`}YI?xL}J=8Hz)cjMkwRT-YistRyG5q_3}!Vcoi`#l;F9KjybwymU!HMP*e8xAZC{ zC8g&LrsKnHdIP6`)$rkc@$8jRvOKIpI{B6NcBj~US1B`^EAFp*QrDZTU$nw)VY-`b z_k}fpgDbSPBVEJoiP{ zsYWY@TCxOHd?!8*dvDWvX{X80Tdt29XZ5S^B&BDZc?zE*?B>n7xc*C__$1qP-Z04f zt|VPZ6n^c`h~h+bue;q1&7KmuoV;(_=kkN z>#d8`{t&zPrL>ef-&+z3_R+rUOR8&&~Y1P~h8tYvmZ+Yyb{>0XGTeohlJR`7kCu5t(?2cBaE?Qj1b#yrCcw{c!1)*Jn`r-8Bo-sb}!(Vo{s%$234J(>OH%R=Qf_3A$M;wMUxq)}6&G#U&++s;lWAh?>g*m7!y%xJ}y(wB}@;Z8I}Y>^}OoZ*CQ@ z8DU`h?fI7}UfLNJ;7bJA%}mD1&X*6IM=>XNDnT!go4}yEI}O*=$;|Zd;mT}4|6g@= zNxWuaA>lL48I}*yE%fyCDkG&il$DjS5#&*|_OR0m9KP>!vF@4vNPEGlS0+cZ^4hA- zRBQD9xoJjGvIU+zeX8I1@~qR?2Qk`4PeE%p;8#G264Y8!P|1Gg=f-|~B+IeTSrW)A zxN%;FO~&m_nX>gsyIgkI%CDhK7w>x2_5Z2*4IGC{0yCTRWt#t_TJPZ2wp@z9!Gp zGsO_t3vWgei$ni&>iOph2?{9cJIy|ApPHU7`0#-ibladb%>>YU^Nt-Q*nL%vHBl?^*;dXe*o5h1z^QXJ0~S1s14AV-vF1Oq4C;4Q&wF~ zXk$rgRhxlA#FIaP*5sR2#gXl#;>-EkZ-`Ozg+urSmcyqbCT*e8e;3F_hV@pkDjBv(v!I)sd{{mu|_9>TELbBX-Z_U=*tJbYsXHe?Qi_S+;jp|W`c9U>7ceA;< z`Qy4?1$Ft~qzCW&n1zW6!@iX*Ij*c;=W`q6>dz9DCwXEr?3ZI=nvbmM_UXA*(L)gB zjSBNGFQuYnShO(hE3eyW)xJN7OOmCdqeI+tA-l<1t@a61nJP6!r_|DF~$KfBZq=-Q=4JE%MkQFs|#$Cj1%Ifbo zBR4lUIVI(Qg@sVH2WuF_JNyfX&CT7N$QLOD2to99a&d`%{h9^1+@Lfp;mVaICh2GJ z81Vl!XuJl0B|s35LIEmXY7rPjbkj^a`BV5r2Dd? z*U&;&zANb{wCq6sTl@ZxwY9ts{N*MPD~}yx!ed}o`j(c$Xe5CIwa9~EDTZdX9i-b(XN|{q`upOO(AbGQ=osXG5d>pZFOM|DWUj6lxAo6zVg9^po9ZCzRA( z!6|}sBgHJap|xi5vM|~&{qtT#SH;xz62&T5(a=T)+7t+3nGxp*-;GtdUjh<>AV@C0GT{X*^n>j!WLnDR;1_-wkQd3Z9p(0|& z=PzG)#l@#m>b$+ZYamj+T#cVB!B14~vFCPwlnL8I#D)5)(XPiwHlLAxd1P~YR~Mfg zFE0}Z`6bBI8%0Et8@iy^1Nk#=WMm8gYc(q2-Wyc?*qyf*Zp7)7mCOSBg~B;CIj@7^J+SYLMrs@*CV{)Y2EmR^U)c=XM z<7d898 zS@-nm(?1j|He3TMTiYVgeFkP`?=U{4Yg_?kruc-B`%&;dCFzAiCG+PhF@>jKIQS(U z3zU&)U|31^N66|HI(tphap;jolnfjizq~wItZuc|j*y^>>1W`S@Cpml|KrkTR}5m? z=pe-#4^yGf>*r4!et!N(FJICfJ$m$zn%cMSHpv4pMnFTX#(R#6OGwB;@9o?PJxlrC=J#=FOr_Uw%F`jIPRW zJE1W6%5hj%=ZzH=H#avCa#!cwEH~Pfa4Ka99zd;>niy(ChpX7cX8|wdYe2SihVg zX~>im3h??tbzWMOfh8293m2|E^eK}-X|H@zV{!zdtg*2%s^T>+B_=6p=?-9E$f>Zm zh!56@J5qV;Zywf$fSZ%=-@h*oq5QLQA>~2mTc-AR1M9Qs$*m{jOYc8;P*Yob1#DF& zeellj&bq?c*;&J!;|Kd*)3v#CKUH-yZI;*6)EJa*Of|tG+kFCMRe$>jg&2&fkOH|F2ZVr$L@OU!|?~3{S?2a8fPNkc!!^cQ* z8a1HggX_SRG`Oo2Tene4iu3B#s}wKrQ(|i|3#u1GIZr-c!7?>9#r7j9F0SCk$#{mf zYkiWF(Q7*V;58Hsd`_d1V!KH6c9^4@NxH$09&G^hKL_#Q?1X!N)bP-V!_u&)r18i7 zX;p1_KOtuEl?Dp~dVG<&4eXt;h=}0X$zjObt(WB<&h1+XCxkwB5T}wF$>Ot!7WLbPYFwC$^?Q~Z*MPd-?x@USa(gP4xN^k zR&hy52MmIk4U>mTMR*?CZxEO$1^C`eU|+&*1vyHkOI86cflNfkn`uh z3wu&gi2OJ?+~yY_AFsaKaw4;xcZQtC=?)b$3`y1r3f#N^`! ziWgWliZ$el4t0CSp|3l)H^yr4P(v8(pgvinv}FbNE@Gv>0|=ILY?r>hwm7)F|$QD~?@M=!O!ZRp`MhjwyT z+?w}K9|~%uA>>=%UX(vr1H084P4+b9x=RYc^m!A17B>P;0qqzX@?+qZig4jlyj)bP z*aAaJ_0tWh0%V8K!W^Sm^?ynfYW@Ke8*a{u+bRuxZAEyJAPAfaii+&gxekM8_K1q| zV$oywy~C|ROQA0s$BO)#gcWtz*l!Nwz*q%M@?{9BwO4j%8Sak*V zD=g?I`rK%lvU45up*r0FeL=ac$@=oHU5?lArYZE1p1dx*pxo}N`w!cx+_S#1G3L!1 zHh81&DunaCn$Eypv6>puha>?_6S5Eo+8rODJo}X&>rcZXAv{<%m8BvDNbl-7UW^X+9W#V5PEpER_ zY_1bqJ9>KqP#zy+ck1fu8YmU^)WjUtX4pPt#vmV+Pj=`v(xI+$6oM-?9kEWS2p-_T`8-*6&}vFaU&IWwEwkhas~#x-)u6QQnu@&8{W8ilejW}2>3;tt_1Xy zqr^x&2XCslvqPQ`lgXjr(`gq9AlO-0SU~({k&G;Po|t&>;>9gh5BDwo#~8^6EAwT% zeVp*g1c^ZgaCwvGLCnPH(iJAk4 zSm5-mB$DgL$MTFE9D%HQZbuRR(1c3HPX#ZPQki#0mhrUUf49ShzWHAdCXq1D(e4+| zpXW~uHuLNoM0pXLacRwVhDbbk?UX`2?VtC-Um_H@$;gNwUP1XZILEGCyEfdk&JR7b zb;?vQbr*Qt9;}*jP|R^PtKc8Mas`A)E3tYrXGVf?kD%y zYJvz!RcWmI$cb zrDW<@Oq~%5FKTPkE5Aqqa-WznS=R?chZ&|wv{u{BFA;>dH(lG}3liRGXuMfD%D7k_$ASmP0rkQ}h zh)F5P0>S*N9kv}vx@R%|A0tvnBnhqgJGMNU0eZIN$cYm^0IZ!=5t2R7rGcC}hKK3l zuHAHu=d%WX{P);0+5*?%hSoppopal>mj63Dtc6K6ia+tM(owSIrWgM*9W{0(Ai#}vLA=B-<{9Jq98J60PVw-k-5t1G;3`)yJQ8_OlE+9^=M<>cj0PiYoH@YuL< z^y>$c$Ca@rcTp&aknsvWuG#~Ima_lCg=Y}A-}2m%QN96Odf)&Rx)}=Q z76;Bgg~-TAE09A7$%tK%CrQMU-1s>*wvh(RW6Ac;Z#jrIrSP3v^H12)ep}0823O5- z+?iz*w!Nk&ViVKQbw~vQ-X#tbE2|%voAjtl#ryYQ6Ll+B21_Sqw_Ntf)6KLwh&tP{ zTDDB(hTU&t>=pAAVCm>gf07|86gt$>Nar8xb>ORFFqu`gfp- zokKc=Wgx?P!`_?x4ULUJo}8Q#=iL!@Dn$ny ztAoa11OcedHl1UOhb~P&~Sj3!-p8)OrNY39l8McMd6~gDx%-scC7W zF!R{2S;GpUcmcGp;g({9m4aMFS!HE0&}*{iq6ep>!x{=n_MjWP{c6yf8eUwm%$}cU z?)jW1m^;(At@42wJ%^aZ9!X)!&1P_zLeN|Sn)liMXh#_9quxXpvQbVjhG~_){&=bM z^qBqog^$Bp^Bw}x)Td_nm1lOrIM<3z&=9z(4{YT0{k9g;b)neGy!`yjK-Y@tW#=dq zw%<4y*f$*5cP)qq#mhL-c?AF$Nf}wRRe)YOzhLH;4) zM&muOvaRhq9jBTefV0+k1D)Wuk}y;r2)AZ- zJMYK#wkAL?qNp?TFH2A=l+J6d#y_lw1)cwlE~84Z9U!=QonBPTG-Tu z6%`dDE0^%Pcqz^BpPpgvof!DcXT#K|21O^|d-VcC*iO8MPslKXm4@BEeg2K2)alp# zjY)ixk{oCS=~E9@FiO*IcfYY6U9B=gk`+-fEIcrJMoA{=%gCSbZ`yQ#VHx?+AF1Fz z2UL-ZXlHEFE_;BL!|vbza$fM)(QbTK-p9nmbOi4I^XHop&XW@g z59A80{O5q!pUUjf41lcP_~LxUoyV!EOz_v=VQI8?cT)pj!1oU13iTj*HB>Tj+aGH{ z6tF4UJ3Fu7ju!1@^MAhgj!ey>)*s;6BcW=^f0kw6k{@g6ED1Tl5~MU!{~iu*Nyz?)OC5z*zb0vV z&0ddOs~UA^iIbhlv^bMe#AU&sDBk~X%_X#2`T0M85clukztQqbi0&8D9cb}h5Yo+d z7YuvzSD85P*GAk6Pk`8W|0fm@>(DWht6)8K{kiLETG|q*D{58D-~$IQmYuP3(u)>% zJ5-;O{_52RXaHvtC&EZb&U&C}C(>{+fj7f8by?a3bdGF1I(gwA*ujO4<5{B_nLhW9 z&v44{Glj-A^5{LN#{kC4F~rf4CNhjgHjbmJM=<)On8%#c=C#)}L$|G6g&OUD-G4im zs$Svm*Zo&D`n1HI+~VKw*0sL>deY&(&42s;fr$PRkj@S>NJ$u4U}O&4WZ0|9=|>;% zRt!OC;FzMut+(Izgi@j>z=X-;nSQbt4Xa`;{JH&}YT%9b{ov*fcC9bt3`0D%xI;eL z;?F=GKA;`ao36?c*T2^pya9sNO=IFp? zqY`*NdW$n!a|Gi&5Od>oVN!X@l$0~Uj~z} z8!33lR#P8+03SDsin2h(Ll2WgfNgUMUziUfA)TywQ_B&;yo}0BGCTPD!=b>&{3-Hw zD2x=vKMX0KmMxnGWan3%W&6os@*=)km4UC6xx?(qX( zKoo7nf041aw$^I2^WgR~uV~O;AtndFM!OswObdQ7+7&8GBKmmQ;08DKMTCwdiSoRL zO@spJ^_%O}`b|J`$+q3<bDpOxxzUK{ z>MmYZsEgMUCO!hLR`@tix8~8AD36&fSZT>t9dfx^hoVPDM)C`~BWF-fl!*6dEBGKQ3{>&2N_ zS%yG{n}vj+wu%*p@U03IcBkVy=2*~C^l1SYo{9pcENgCAsi6CVtCn@Ac(9HU?p{J6 zs5Pw4zo=6+O5U$N0yntn_BJgF1s!B?L;`a^9sT`*xO{hW)UZVi3=AlgO`A3W`I!ri zjkwVZTdIJ&K!n%{s3O%@R}DmzTz2!Cs)`EHnQ_}TAX7 z^QyKj3D{?MXnZrL%pT3tr&m&X+VVX8?#Q}Li4dK7YRYMD(9%=h);6tX977Zdx;gB~ zM$)WYSpa2w%>f4DQv7!FA><>8OiMYHc7YbFa!m!K& z$Sh15BHhd5=?h6B;4uNC#p|#*juvj^oD0(hgd)jh1KBohCc(lMQwZ4OzTu^$QOT4nBzefgMIqLCOOR3nq)7{zBaG*iKMM z-Z<_p=FO?PfFj`RdN1 zyy2(C(W-fT@_tB=D;8PFE==)}tw*xlaLRm37e_-q&p{nPa?mN9UiMz0esM_edwqpC zdL9|I#lUnv!Osi*dW&+HQULd(qQEL_%5qH7cfsY(U6?W3uA9wJ+B_Gf5#7^n;WI)Q8k2e0{9s=qW}hJ-7@a>)0(^wtN4ig( zMr!tB@+G`S^$3ac<2smbBW{teGlY(F#>Uj>@*tF*x3zQ+czDPVYZt?03D_vIb0hLu zjj_k#Du1s=+tvc5h`3T)PTv$&LS~aEpfn{z1D2&L(TK<@0Q;3(q zjybnyuKv@AHeMKS(HogpwMePV2705zhiNqv&s>F<=X3RHM-jcO0vITv_b`7c^eQcl zjg3~Xnvs6Y&);7Z7**uo;>mWjugEXrI~p$sP&rZn0ibD@TC>*^tqnYiA|-ymzSoXK zB=qlrtdW#R=-F7L^=8T;Vdm23o{|oODk@a1b zu0vnM$0_T3cuCN-V}-GS52 zeAw;$)971wcML2GTvDP#-+%e%1RB!XNW~TcNbJPqlW2x{RVpyYu6vaxM(rKl2N!j? z5Pc?>3&h>J=i^4eyOf64q|?V7T>=mchG97U^E+m0O($n4W0AJUXVY?;cYpt_Q7qiK z`82JkcDUzbN0Iy-=A>W_E%Bx2p+nwVC)C_kxwxn(}O^I?gORXXLWQ$ z90pEhk5x&+Ix@8{Ey1&p!t%*|?8o6tUtX;wGlc#NN57o;1Q(SoOb8ht0f5m#u@+mB zvtd-ABqd+06WH^gEKhB7vwy4W)DHck`tiGnx@H((TQEMlNF7&y3iSXn1s(zmG2sGg zzlKMK6LJ!{?gRu5X0#QywJoMp$l`J%`|YJ3>y1GN{an8`2iVKL8)y`ZEdQ{Y-+9hA zdctj?f{UL|1krFkkM($}smZ*>VDN%3&&R3g_-xo}Y5t? zKoRl8gmb5sP(~27mqQoEC&3(9{Z9OcdejX%HHGLQDQ3YoDX^9MGW*&jk3@25fRF{{B<#a0USSXc>Q;gs+sQc;@`3We<4^sYw52u>)%Js zohK`qnp0Y{xLsy$CVXwdmBaV|;lOf?cwxe(W22N}sMe4>2Q2bl^E^Q`D-Ihg6p2&8QXc%nfF zMDa8d^UD#i?*MfXz0{8y;@kTyH}v(L2GjIH=%_)tp|D*!o;B9j(|}Q2(Tv}#h6D(s z2XY^p&GRseg}0wde$=oqjhpBL^UEPg18@8J^Ft8fS>a7y-K2Vl%{_F+`B(qk!t5|@ zokpb87F49K-zF-b)|lY)3hU#>Ul2A-#Dx0>CuirCC~J(8@0ler2Rs7%A&{#pY^XJ7 zo7?PQMj>=~+R*bxMufibKI@CDH%)K<{(Te7a!&@yYn!*v9LkH4_amVxN5@i7{h(II zv9YltKyotf6LT}S5}`2CltN`@fRSk-90GvE*NFZqI*z10`8L-*t0QL$4UHr&3LvV( zAYaPE!$ayTW^%5V2RSnPF=kDQMA!S#^N7Mtr{v?#A;)TsI4YqKs8XXpD})2Nx>HEF z5DN_f4Kxz{$)T1+#g)CXvVk*EhvQOy*S(D+?e6m+2yE`zrO0TYB40-A1!8w|P8H_D zfdr|JKU2fJnOl7I)z~Lb+F?-EmB*G0)P}zTbIRRlCURQ>^B3%lL~A zu3lr4*!}S51G|m&eS(Q2}Lyia-|Q zs)wU)O+B9yIWQoe)yb3S%b4THRx@7Yw^$7em%cutdFXBB98+#PI#>|f&MVOWW+n#B z>>gIEqNUv=DCmblr$9_SaC=PYV*$y$3+1u2+mqC3lPN`gc(EdHF0kNYkiPYFpC0c> zt*S5?alyn1QZdhJtknuEGSc9gfKy5FF(6EUz20W~?=+wr|YPp6_LstZPLg$I35DyTOSa=2o5o%iE6Ez^m{C?_e8%qe)sH1hpdg~$uTk~ z)6Q?;FvP_?DSA;+=IqP@5}Rgwf}HHxWwPrLlc8C&#;D=N$zT~hy(e)^gAST6b(A4! z<1X%$2+_Y1L}w)p*Py39j+vUC`x~wTyF|7!CbpbE2LwK`2w8+$fOZ^k?b| zA(DqQG>l=j5-=0QzW064Ap=J8-qdST!Tss2%Bm~7qx?ICMx=?xd=OTsod5R5E*tkl!O&#vd(h>3)4b&UKgH{zgGDbQB zg+FDz%PI>dHsdq3dvaht(6+u28>dx=y{yA(1ScgB3`x)iXhL76(W|m_+>x)&-4S*@ zA1{LudjQQEBHsns zV+A$2r}&8h(^hvVvp0|Q2KxKo^-I6=PZ*8tyf{j}+oZV9Iv{JR zfw;=~^XE~@)^n-Oor1NDXfOZPt=BLNgwq!MN(^>N-0}DK!(U_u(bd%Bn1~Y0=S`s) z28ZwpOce1fT!)Lpz`t(4Yxu>k2_ey&sNG^DvNzBQp*|cZ1_=3@^!U@XKvF zE{TsXPHv0o3gCf@{H-jE4~LnA!$~`?tE-NU1}Dl8`$DmlnJ2b3{8_u!(?u|v-IlFV z@XFbMGU%np8IZnJEM;PT0S(~$``ZK(#MYGq`>%&lQ+5oK>SV-JV+;fQ%cl?aHV-<$b5_Co1$f}yxUrz;5HAI3 zSwgJPRqp|@IApcpK?4JiqchXf)988+ks0${v);gtGt32F0eP6pRO>8u%+uyY;fJTSwJ%YxAg!>~y(?S7393f7yp0bx-xqp8bHd z4Q6C(mTm6*WngHCf0AKQH;ktKemg&VYuhkE0R)URls;L(d^RUF<8PzC*&^Q?VYY+U zcciy=5w0xd4TdCX)p=`0hRlCKSi?N7;1wwS_?@J5Xc#0 zfYUhP;-zG$>$KPd*BqEJIu=(-;K0>_&Z@rYMRR?PDdGz03 z7C0-Sn(*(n=r!sCJtqB_DuCA`4SqR(1}<{E@SWU4MWW zgLzKgef#cVL_;stZ_r8{Q`)FsRi3s&o zt5%T#(bHKDI}mRe{~8q;Sw-e+i#jNM0zzAbgf2i3|8-}~eV=-y6leksBGjZ2Ae6d7 zcG5)`8P(;mC}Q8dxeHCf7PN7+m|5d`csSA6lbZ)|0U9Kw(;ip20uq0IV;vKl4GGCm z!oJV$bCU1NiP`zwwt`7(%XnmDX+1*x4;^2*OCtZ5RrMtnPR_5-yMIA`d;Va{4t{7Hm!ootLvs`{_ zAmuS9PQ;D=v*X>S73s}`FxgX}>q9q(M%sZsVg&Vee+%`)!w*D9Wf#X}BY$1Ea3K{T z8OW>D`vJ2u2VXZ&Vc=N}!`fSfgaiZxe6=kypSJerouSJ>p<-rW*pGA~L@}|!y_lSF zsVXk3s4ztD#2GeYezJ2^v31H2sqRTR?=t`L>SFy*h}6yoQ6r!4NwxsQ(y zgkR#&nw{4*C(#$nkFUF1H4$!ZepDLhzh_gF&^$Dv0S8IEAHF?%UKLc&;vKm)%tE#% zDPCN31bA+s{5wxDAe(L_5%JZfKQXd2D|Cxhcq=b{Z_B^YeyH@)Lb$H>e~uod(4n!W%Yt!624_RE9FylxZu7TyFL^ zW83sL%ZnE;dV5f7buBz%XJV>t@AmiKvko7Us45PUSQ5co=i}pEydd@n=#CefIt9ns z97b5l%Q$Horw&EhG($GTK@B6EPk!NL$50c0#_P>rBN8yqadIEF;p63nuF{Ua^UAET zDveHT(xov`yL(#qO={{5oFP^1N9%>$SSn_siS44Iq5?Mj-0@@67W zp&61GwT-Qw+f!)OZgXB&{lpfS`zJ2>LYbut$nH|bPqO=|2!u)x^iI$4&+To0p{w&T(>&-*v zTBuZLSB}G{!|&V?{k#izqsV6^GZC86bueq~jq}17IXMSTS0hS*h+Z_bBPmb>$PCxV z$H!eNQqCl*MM&Ikn;&xI1THvGF%Mm_06YQ?hb$EKZ{Q~{wZ7m8HYw2u!8mnlC$s`A zB$V>XO-W<`o{$RUf=V05XI^$2*PTehfTXXMuJcv=%|p`G(D*zi(xPfo43#2XhcXp~ zt9M9CM?mDMw&n^a%h0fKGW2VV&>tTs^^K6&gTTz&*~SfzhSE+UL5OobChx_kP8XTIsUaFBI!PyMbHZ1hp*oelSJQOpL2&Z=UuIEo z=8fN95Q+cew>H)9xSt|=Fq|jyTw|+q60V|0F@uMrc2dz zhKn?Vy{gAYdSfPw3JZ~_H$?Oda!iG-LS|AQh$K|IJreKi$!o{p@j%4=Zd||qsF0OW zerkL~Wcf>yRuJfN&02MZy;#9Wi~rs-M@RaI=PD=4u7(%1B!Y(e{y;U9Vfzxep3yZ(ooSi5X<5jfH)WHz~V3|(n2KH{={%r5MRe3h>@p(fviGY3l z>E&57g3<6*75*FuSr;h59`bZ|^=^4!k_gHbFK{Jnk!1UR%^1D_3i)bdV?!7r?2E&q zXJ7f3rH=&GQulmG-v*x_QKd+r86>8LGDC98K47-6;^+5@^7rpMVI#qFsY^H0`U6~! zJI{n;2kDFx?`H>p$>twe%$CZ}J&AB_0tge7Im(g{N;}Gg4or zQ0Fe%t=*Y|mFI`)1J~AsgD?FErO>-0Q_rb)DELHUsilct>6<}vva2xyoCG{BHsOLGKUc*T6_CW==vLw%W zvlu>q`r}|KQ(l;mqySp1QRmH71CQxk`X$4X9;XAfzW)B@Vm}zoe+So5xL!kL@dN{& zpzY=Ocm$75VV?(u@XNe}ee>12lnbssJT_&(BRtAmd(PwZ3?@y1oUUV;=?I0_SQm#9 z#7x>5sNo2R>-8HqY_`Y>_M*7Q zY;1hjYi9!!2}5H|I4%Zc0UPIM9^^u>l_&%W*}0A?e0wqXVqA89{5T2XqAvv=H^wm-c!bWcr~p4s{(K3<)s#;x=w9p z!RxNX7jDlvYcl8Z;Q|h)TrUx#ppbn>@74nPIhol(coZ%d=!x29;A2D|Vfy8f`9H!> zbnaA#=i;D?-rA=Wsjfdb+j$#w2UxEhk{;9n0m8P# z4Gch7FtwD1p-G3KuNUn&8N*bkz<1WJrHlY2^t-z4Jh6X21;l{@Q=+DQ4=-;xX%Z3< zZgZoh6vRE7n?!i`qk~b1Y}aeY{!mfji3}P)Fppu{=bqZ9s{xUqrJa4LVHDxGo(ZlJ3`S%3#KZsbNB2NmC-0+J1MBn58+F%K$Y{2|M%tgbE~BNK@U zJiPFl{mRNK!QQgxepc`c3fAF(5>bnkQLvq{kk&k zA@~WA^1wX)Ge@BefqOv*)Ehqc%2((wSV}a=4RoSvcO0L20r6KP6mb+>C3(5-H+mP{ zTdQ)UO;vOmM@6C60lV#Q*;|zp0n76ZC5;45v%r$fYNb9+6`)Mb70@ zNO-2&FqBKu7bqw>`8q-i4{^K=4!M#8)?1v8S}cdNBo!L5&sIP^_9iZTtJ~ONbcz0b zw-chHub_q;*U_m&N;Pvhch(8w9Kqgz!;l66ci1HCOk%<(dtyRUt-BO8oISA&?fU9_ zQ~7oQi$1}G(50qia%LB%P4lV2_Hz2iF2G^QFBv?pP^>*=*XxN&lV2is+R_0Gl(Ntp zwb1(_^ucapI&v(mL5kJflr_QZGEu@Xnn`eX=8K zx-=i#9tY}u+?165_U(Ouf(Gpiut248=*`EO?Ax>Q&mll%2kV_Z(})9vTG#_iNC5X?{~B*Xr=s!gv2+jsy|HE<&p5=LeY1d zod{r5k3Cd3&dC|X0(M!*avu9Zv}KrX?N;J2^@Wk?+J$qbz9T7aUjGw95THO8EIXo9 zA%C$8Hm0hF01kT)k5ISB`K4KHPGUkBSn(Lf0n1OUv9q;bnG|HSc?7mtOs62sU^FZaB9N-ak!-_HayYO(eSh?onYfuQ$NPd zBIDHDPVJYsy{vA|RC)xogGR}FEJ}lZIIHbMi)Cu-P+V-JLHUhMbG;g#od`rBU40pB zE(*|K4E4X$O8j|T+{Vq%htirbL=MDW(rYK`;*jxgpt^mz;q0&eQW$FQfIW%qNg+G{ zQ3dR9F&AeFu!tDmBDE#(|?=@5*}0KyWc1pUDnrv7mGgV_%P zz#;7$tlNh9@la@9K<|i9--Vxmj$>Qi1?WIV8K&mOs@F@{ZN@ZIr?KqpdhG6Rn0PiD z|M?YORNTv#6KaQD_W@c(Lt+7jA0-|EPUXN4lTbMd;s0CM$tx5eVhN|$TWW_Tjs(+v zIKlOj?{$g~VNVO;j{%9i5tw1;QkpBqL7=#wU4*&Ay@zbZ^S#b>#<9ho^@wBS8~+S4 zjBaH;yOwd31?31LnJ~o@?lq(`n;Kl*75UPWUk$C87{g|8eP9FOn1f}Qd>y+t{Hr7{ zLc;zUT2b9wd$Zs2`JZiPDOR+K%94?5fuH=}WE3GGxMYdjOtq@Q-1X|bZ8-RD366oj zrYexan0fD^y5Mm37##&qBPJf~U-lG@l*g%^>aATbIq2%K)(hs(NZ>$6vg@ra*`0aa z-(PHWx;Ep~_Q*OdWDJX^$GU0N`7hWZ&wy{2<-_~o*kcw=G{mu|^dHlVHIN6{yk$$A zqq0`mgY!6Ej_@EHqegy&7SDsjsh&hf7mf|XKqCiizHS{HI=$y0dtt0#_w?c=Q4W+J z^i}8^rG}x>&vJHTcIXJP65=N&77j$3h9j*%6bl|Ehhz}1rET_&AGeD?(gtll3Z3+G z1{yql&!i%xT}2^HLI~T98LR5=mkwI^pr(r88_-aYyKEe)veoV4E?Q}}S6Dq_;sI04 zd7tYXn^7IF}nKzCI(#OV1QB~L}8)X zGBY!iQ<$NTib&j;O2HV655!{K(FI`qd${ypixoQi=iU;S{TWI&80_NtPz}@1shc3K z@o(N-=4I3wKYkGRI@}bT4(C~B4!A=w(dcgwl#0sx^OnQS8N-Lwc^CE*Kwbh_ zb0sZpqNBEn$@AQbaIQ%f_N6;h+=QTk=I_(ksyApQRmN9`3?KO?jDA?*wW75SwUP2nMcSr`uO@1 z?i>^2Pe0awk85FZPj;Kz7%fD;2)IwBP=c;V4!x1D8~MN5JJYBr&nu2kMMo2(#vO}b z)fi)oqq2h$8rcFO#O7GRvIsF?M3BXZI0158Dq6rqO@Ocrgb=i%XsnT8w_p_&P!`b$ z17Yca3WysZGW7SD)W+1)4?X?ZPaHUc@4U;s|LxxQ;>ziIdXM#Ek&L_!^$y1)U zLLzS=#LcG6{mR7TTE`onr8$nnH7-`|iGHbPzYh{yVW8)@yrveP_aEUl7HL+}^@wDfq2CBcWVM@HImKSIL`LMZ3JQ{OwTYJe zjj(QPoO&v5RKU+4KX2Wqk01Ju1p{5IYTXg03g5$Bo$+4yX*yyO-Il;u2_HMWBYh7o z+K6LJj_H$sIcX7v3r;G68pGY z8ICzRA$iRSzbZXZ>Y3{UY1h4G7*ZP0nD?1t_=&o2yje&l*YLDPO8eqpvEoztoR}eBZ2P!578v{)( z4y02HJ!I3FXB^ecnNR1VN#{>8+^8xrXB&jpI!K9yf13fZ7;|)69LQH@7?i;~=D@IL zBj*F`#F};t=8NhTQD~vUd*!IQ%%jukWDpf!RFgXm%9;){Poa<%KrrD;^!cMXR&8H@ z z;ohKEaUp9(6k;+pSTqHg0)JP0>1a?I@^|SRI=G{(WH<#JjFf6iVkSmmr50Y#dp7^WHX{zOCEX+_Lkab}1B#+=?`f3jya+zMbi%7*wYfzuPPA z?z)m4rQlqE@+6Nfy$bfp<$t-cNjkrGJfRKg;;vPLFEVUOGUe^G!qnTQjD!k8z~&Ao zD4Uk_mAh|FXodhgB^vCe;ev?W3bq9o4$N+-5_`!(HV+#-|DEO(2^*%&L9_kD%?Xir zwVGSDe()1oVq0K~lmt95%I6`Md>FsXID9)fuE%~~ysV?TQ1^?6J%$%LBy(Dt8cr!jjUKI&T&B&{5aom`JaNVh2X3Wb8m~Mx zXuX~gpI`SLq)Pw}A(Er&;O-okqM=8BX!cQ(1rfV0Ya`kjmw9R;gga-QQuR*LSk7rx zjYo~~51RBIZ0Zc1L(F^RH+G*Lz zLjFHR{!vkC&8xT!KH?A_+$|bhS(klKKRPVL>)eV=uk#)i^cp~oLuDi6u!G11YB z&Gv=`#YbBA`9##gpl=U}Z1W1rgGdZwzt4pY0+7WV3#VM?@_Khy^(KAU ztRiU#z|oCWH3;ojl2t9ns)#-hP?N2lofMX5Y!UZ8gF2US3vHa8#}hB%CkYLFTZZx3 zS)Vhjm;sL1xX_w`2dNs5u*Olfx^K*FStv&N-5V?`Du+TDY5wG_gN-ck#}g9flGR^d ztf@o(o*scsEoorLNR*Cl(=~mk4QyiCRO6unfj^X>V!9P^IdbBw;@~Ch=D)+j%yD-(t7(ZME^y@FE6*Y4rj#TC1i&A^Xl@Wc7_5|!H5(XBj z{fAk2$Qz6XI1z3|ADIJ@iDTX4HWvd?8Li=?ihmO!mcK2EqIZd#KG3t=J@h;JN^M*u&8YS literal 0 HcmV?d00001