1
0
mirror of git://f0xx.org/ac/ac-docs synced 2026-07-29 04:18:19 +03:00

new DR and spec for cluster monitoring, docs updated

This commit is contained in:
Anton Afanasyeu
2026-06-26 19:47:17 +02:00
parent df726f5993
commit aab2b8512d
53 changed files with 5505 additions and 737 deletions

15
.cursorignore Normal file
View File

@@ -0,0 +1,15 @@
# Binary outputs — not useful for AI context
*.pdf
# Python bytecode
__pycache__/
*.pyc
*.pyo
# macOS artifacts
.DS_Store
# Editor temp files
*.swp
*.swo
*~

26
.gitignore vendored Normal file
View File

@@ -0,0 +1,26 @@
# Python bytecode (generated by PDF build scripts)
__pycache__/
*.pyc
*.pyo
*.pyd
# macOS filesystem artifacts
.DS_Store
.AppleDouble
.LSOverride
._*
# Editor swap / temp files
*.swp
*.swo
*~
\#*\#
# JetBrains / VSCode local state
.idea/
.vscode/
# Windows
Thumbs.db
ehthumbs.db
Desktop.ini

View File

@@ -483,7 +483,7 @@ endobj
endobj
81 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115602+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115602+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184400+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184400+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Android Cast \204 On-Demand Remote Access \(Reverse Tunnel\) Proposals) /Trapped /False
>>
endobj
@@ -789,10 +789,10 @@ endobj
endobj
140 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 932
/Filter [ /ASCII85Decode /FlateDecode ] /Length 912
>>
stream
Gat=*92jS!&AI=/lk/GLkUl+f6=Hb/9M=l^(G;:]Tr,)bg("Pk^64-/#K2HT:81k=p[(>[g*M:*6`T$4$Lfp+b8UM96F[08&Voic^4hc#'Crl$$R>h*3@H$^AstfO>=LTF9JA_*9<81[8l3b=jA-H08TnRAL+ma*-kP?K;!K?'N<1T.F;r(6c=Su[ZQt:+W$pVe;?];Oo\-+'NF?_QX>DV8/5/pVj4W5#R(P*aDQG^ra7F?XT-:iI&dT1Bn]pnccdl52XbqFM8r5>lA%(4O9Y>SqB4`oY6t<+06q[U[Z#:sV@V[=l<Oib>M*!]/2:ghcBjt3,=UJl-s,F?d]<sCQ0*mC2.iE_cBY?;^:7RmEq\De&PaC\uM`6PLa_Yh7OQ$>h5ZN]N2orcTRrc<^Gdfk]Ib)E(E6K4tiXT\fd(+_hL#_f$]nbUnp7R;)6[u17pb9$<KifAXQ)F-B_n>=]7h"uiR7SR#U5==m9/ju$7u=:G%uFBN>nrF3$HARRXQ$pU6j,dq'6srVY@t<u4m"ZV-cUZc3&j5IBa^GJb!0$XKInQJgG6)h>=LM#hTTS]k(,_9:E==sHR6X-3q!bIJX[(HW^aVZ.Q<L)Gp%:^f3s*J$_Wm0.<ZdkTXPp.L-&a1dO\.Za^U20j!>^W!$C\)C`6=$D2u\;U&+LH#<(;!#@CGoo'NZon_C+#P>+*r+Yqb=&*6Y93hEi2_"Pkdk/=nBkWIQ,f@aVs)I#Q([Q[%NnbhuS8ADe*o>J%?M@8%JoZ$^/CN&-R=7=V8*r4D&4B+t`]mr2n\@&TLAIjpl(YVNh+nJDoHO2VZh#ZaEUH/t:+Ck^#)[,UPG_9BE"Dd8P<NAS#Y-uC3EP%Rkf)'k9Ra<$G&s,.aOlD$B$2q,11,Y6`27"#$Jl1T4eGuO5K"0spa2AjH9;c>K&n(8PD7>q?~>endstream
Gat=*gMZ")&:N^lk)i]]p"f-_gX9B0.d\iVIB%rE@_/O0_BtrkJ%n`laJBF\'SmLMS21tBm3.#I6]1Uf"Sh,rh'2qe_-I0%LkGR-1O&J06p<K=5gg73K+\5oVRaZK0u=E3JcT=a@c[SfJne%'Go^$_E\p-@\=p;rJV`(cV7?c0O[B;;<l+H;4H97a%Xbe\dL9G1<U_N-4IFKRI$gBWc4!BJ/!Hk"17jtZPGAE<>ni^ObKUL+DrBIRE<L<Xpgj;n`7m9E2JFV3:gsOSQlQlWLk"c4.SQ_%W5979BM"j[[_lWH*9&6:MH&S_iX*Vc8K7fN<+:^KE^"iAbnm_J@e!s=/R;VY].il?4UV/9gFi4'U5g_YX"-`]/riZ2`:tbL>brj(0k$J-U;S\'`1dnIlW_Q#5G\k/VfYa$aItb_."%Fc?ULnIo?(inq.3lU<?f#"Mu?/^.;FTdh0aC/*L7<S;dZt7\\!a!dta(obiX:!&O?uK6sde/ltppC`EYprjkgXWG'XuNFbA.Kp,>`m`,Z$(Pf45.f3[O7Ha>fKo0E&l;hNhr;*c,=d:LA%i$KJIWkiDZ:Q1WC=2FX:p<oQ%GIW5%m$hD[@i^$A_.e/:YDP%-K6=C:'#8HZ]`R-0'-C#_U:O'[]dd"Y]]['78$^4>c61kK[Ps^<1k)Y:4#02.B5!G#>1)<I>8-fuoP2_3pV;/upcLMD&+OBNROEf)^[:"VE;oY>d\$752R3dWikfjeX`=?r2DO]@]^Nc'50?)KYUDoL0#3H\>Z7`'S0?&PKt<(@A9h*M(Z>^t)^&Ep<!/jEKPVcAL#<CCY7Rdd?o>]fDNtLEeR=kdh!q.up!:/Y9k]P4ECdWMOlD$B$15!?ASNJTn'"rM#Y'qn80+?)$"@,o]I(W$m];b78q><=+srDh~>endstream
endobj
141 0 obj
<<
@@ -1035,24 +1035,24 @@ xref
0000022050 00000 n
0000022148 00000 n
0000022312 00000 n
0000023336 00000 n
0000025694 00000 n
0000025926 00000 n
0000026158 00000 n
0000030353 00000 n
0000033686 00000 n
0000037784 00000 n
0000042412 00000 n
0000046871 00000 n
0000050668 00000 n
0000054457 00000 n
0000058450 00000 n
0000063380 00000 n
0000067735 00000 n
0000023316 00000 n
0000025674 00000 n
0000025906 00000 n
0000026138 00000 n
0000030333 00000 n
0000033666 00000 n
0000037764 00000 n
0000042392 00000 n
0000046851 00000 n
0000050648 00000 n
0000054437 00000 n
0000058430 00000 n
0000063360 00000 n
0000067715 00000 n
trailer
<<
/ID
[<11e0c9648d0e34b6b5fc15e51a46b34d><11e0c9648d0e34b6b5fc15e51a46b34d>]
[<79eb61262be26c6db7d665a52ee71ec0><79eb61262be26c6db7d665a52ee71ec0>]
% ReportLab generated PDF document -- digest (opensource)
/Info 81 0 R
@@ -1060,5 +1060,5 @@ trailer
/Size 155
>>
startxref
71040
71020
%%EOF

View File

@@ -53,7 +53,7 @@ endobj
endobj
11 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 31 0 R /Fit ] /Rect [ 59.68504 698.6019 298.635 708.6019 ] /Subtype /Link /Type /Annot
/Border [ 0 0 0 ] /Contents () /Dest [ 31 0 R /Fit ] /Rect [ 59.68504 698.6019 280.71 708.6019 ] /Subtype /Link /Type /Annot
>>
endobj
12 0 obj
@@ -265,7 +265,7 @@ endobj
endobj
42 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115602+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115602+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184400+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184400+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Android Cast \204 Email agent config & 2FA / mobile auth flow) /Trapped /False
>>
endobj
@@ -307,7 +307,7 @@ endobj
endobj
50 0 obj
<<
/Dest [ 31 0 R /Fit ] /Next 51 0 R /Parent 47 0 R /Prev 49 0 R /Title (\376\377\000\247\0009\000.\0003\000 \000F\000o\000r\000w\000a\000r\000d\000 \000/\000 \000d\000u\000p\000l\000i\000c\000a\000t\000e\000 \000t\000o\000 \000G\000m\000a\000i\000l\000 \000\(\000i\000n\000f\000o\000@\000 !\222\000 \000f\000o\000x\000x\000s\000p\000a\000m\000b\000o\000x\0000\000@\000g\000m\000a\000i\000l\000.\000c\000o\000m\000\))
/Dest [ 31 0 R /Fit ] /Next 51 0 R /Parent 47 0 R /Prev 49 0 R /Title (\376\377\000\247\0009\000.\0003\000 \000F\000o\000r\000w\000a\000r\000d\000 \000/\000 \000d\000u\000p\000l\000i\000c\000a\000t\000e\000 \000t\000o\000 \000G\000m\000a\000i\000l\000 \000\(\000i\000n\000f\000o\000@\000 !\222\000 \000b\000e\000s\000t\000c\000a\000s\000t\000r\000@\000g\000m\000a\000i\000l\000.\000c\000o\000m\000\))
>>
endobj
51 0 obj
@@ -388,17 +388,17 @@ endobj
endobj
66 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 906
/Filter [ /ASCII85Decode /FlateDecode ] /Length 887
>>
stream
Gat=*9lldX&A@sBm&?2G@p,j.34`hZR8,A+R%/Jr7`K!68-(*%IpWN&2UE9[%lP=O]r-:Z?"jnLIB[uM1P"opbSCK*+BSXO+s=CJgL0SrJfce&,g)<MJC^/cmL+rZ_\S&T/e()N>SGDN<q\V2J2,)$>;/>,\-_gFQQ-;*("F?:/X\7'ar%;DGuPPN"?0ah_f*OOgh'uX65Z3)L1QLNOr1n5>KgL[=n*k2%>:3s%BHj\q[1.q"P5?pY&?2QgZL@5$AmR(+HiJ&&Gg5]G9q8RSOhoph=ul=N]Xc)R^suk\$1gS4GIcNRQ.;319?Z`T/iqk9k!n(%O'S+olM4gR[r7:L.Y1-V]/"X'9m/(_0T*9[NDtFN]MEJ3uF<Mfd@2rJuM2*#$0?Adlk<'N.*[?1kYr,m1)Q\1]*LMldNN3&mfRHQXAg0@GW?](jJdIYlF==G4P$$d\a&eJSZ9TC`@kQ'7>_VUs[R\6A\*,<0o:'L$>HVUM[A2KE3OO4(CQm00$EI?'Ju8\UZ`EM]Cl[0Ft4.ZT4V&i1K&-%ekU$9e)XqV[^Ck)[B'eUYTlfRc[.m.'/IO5C7at0>Ju7;egg=JDFtI)t)LhO;1Wu8sWriN*kg#!Fi_%MeUg3[lG[7V='uM!r-FTO64uW8c=*a^%'mGM3:Rki#s*-Tu[#2*?@qGjR?%_EG;Ff^u3Tmpe`S$R4D%tpQm]&*mJ&]jZ9luSpnQTbPn+]`+)tA>Hd\QLS)#NJ[bTKT,m>FpR/m.1ITt"[*q`R'3eCq&@n7'4i@h@XtXN"d0%P[JG]L=G9Ha4:`Y3M+@HGX%LCoWn<R?cZZZTgHFmAk\,Y)p]g#Po.9&^/LV'W6=s2NK[,:S[9qSAFHa=FqOu&iCmfAV?,'lu*H%i]l7G<S$R/@%L#*#J~>endstream
Gat=*bAQ&g&A7ljp/Igg`,PO:Nc#aO-uqm'o[Je6d>e8k;HZbV^Fq%Vet]Z))+mSYj:#[V95tQBIB`]VAcU^T\60psK5^uBLk+t9m_[Z7)1KjFOsj[8!Es8*Gp"Z`%U1%s\28jVE(r<)>1rX(#0%Y3c%5sga%`MY\E#o"TW%R8BZU=,:p/blT#YE)`,HZ4.eq8UL:]!/;M`mNY@(MoX(2ZHJ1]o&"'P.A8I\)Bl5<W:nbs9?(C74\l`P/9Gd,N!3#!!NLkA6UJO8S0jglBT-di1_bgNn#e90QaeY4TM@$E*Tj799@cT(IO:8d8sH;5j0ik<hBD,M&0lWRM>K(?&:ek!d4@GGT^l00aC0J4qu5Su6[SjetM<nEYd4o76u*h,N3637%.O.tg*K1h$nH!YV"Y;jkO0/@"([m"(+r&S9=s$t7Uo%d?p\uVHFCmT0YQZBnph\)-Ec6SWF"@[G>o<0RuRN?Mhm;d\!'^C`]&DIT<mF`o1&[>S+SQA5io2V#FRh)hgII\Ktj&:a1dC^cpUr^ji^OR7.V!?&[gm0:eXAk"NWkYr3oM/c/IJ>p>s82oRC9e<CmO$#43*@QN.03+LBiG(A](&5fjY'4^iiGc.s5".AP9Y?.Dl-4.O7V[3kKZbkCpO.tE3_i,eYjLZ:7UD7=r-GPCc2BI-X6)R=DforO&R4),BQ`DYKZPt\(R>oiVmQk?Y75h>"Dklo\.>-[YfY1_k!DWGER;IiMdlmm/br*VQG]W.49pVc-RM@%@J^Tg-`55"W^Fd?uuXJ)hdK!<.b`&KP1q0KA\=e?!2LW$GG1GLHE08@sp=:V(#A3To](L9=-skKkJ0f?(1jlTD)qJ)'ii_o=tSXM+%"%.e=!aTo6:A#r)5]RB;7o~>endstream
endobj
67 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1204
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1202
>>
stream
Gau0C9lldp&A@sBoP$t?)U&Tu+#tX-V6-lBY-YB<Q%L[p"uHoGGQq^Ches#RMUqKe-Rl$n&e^j_YIi])D?tK3OPr!r!NtU)2'Y@7bR5PE)o2@b9]m3&(M*PV^t^VU?3!h:\XoDrpclFYH85)\&$DOX?5/#20q&4J<-a%1Ool-_?sY&^h.'8r&17!j=`KN,A?tHEe*/eFrs&)(#5]K)?G[5d?blD+GQRCH+W8XFACf@g$7hf3WHK'86#nIEl'>t1-T2rd?e;7l\f[OOrF<$qM-P7=a'g]"]TnC6()5tPoq19'b9,+1T-I#F1l)cH:`@0W:.5>#Sh$s$fC0`TV.#.Z-q%dcMYt+68H@7OhfBI!YJhX5:O?h/J^93(rm2$)3c60:mi4/4I,Q@YPcLPf/LH22I*CHlhfkF6aNj_SQi.Cf2OAI-2-pQ)WZ!5I+R[-@WlJ*#E!:OE<['>'lQlB_P^>+s9d/E35jrIM5?iboqccj_LI,mf\kQrKdX,>ie_EjL<ftDbLbum[+T_4uSEJ6KR7!8-AD\P/"Wc<T\bM.sSHZo<nCQ801:Z_`V<j\!:^7\,eo3dk,&Fb%Kdi"C%<-Ae>9u$5:ZY$"+d*kQ4A&lgCbC:a5$UE+QNEXEg35%T=tG'ST73SLbf`kX?8F%iTbSO\6[u+H.2q6<V2[3__9XLp[@/9i$F_U**%cN&EEMq/b!f7GZBEmE&#OdeV,^+cZ`s)\??;t%jr.u3mPDA?Zq>/_D!)L!l->/-4U\q'DAsrniT&MQOf6qTAemt-bV[<rYHcHhKB?1mi9cNF\.r4g(:MGO*-6qEP-&u;Y#(A(&quaUNQ79\5?RIIcGD5f^P;.@'M>%fWZBlE7=M*q>u)Ko<')%>/3+*K#X25T.Kr\Y'fUd&W5Z2;)[fCq4-ed\s*9<$8LmXr_t^d0n1E5=ls6-+[&gc;$!@t4C)4G!=]C5qLX(X?JZX5p5??%Kh,rm5.Po)ji1]>f'ZL?Gd8N?gN@nCkArW[*!KE]=7ijD300eAN2r6cLgmCTpOMK?:1N))-N8rut?ut;Bmi>5cinj>P#FhJEoP8++OH/Re:/T,'\'E$3Wc@#P$9(7bGa)qPBP*lTB!;mFd?ns`9(=4#Dd02%0YXHR'IWDt>=k[IB3B2KJ<214Vrodl6V8$aJaip7-oU3d2tE.L.!$7LnIXl:ic%H$rrBmS^NQDu\c~>endstream
Gau0C9lo&I&A@sBm&?be-;B!n5C,q,9:aA(FW/FZ4m54p+GGUsA,qjrJ):F/.&uZpOc2,e&LEUWHb91EG"EglK++A@$ZJ7aWu1q)@9rtkr!;F,@62/J\01Yr,Nd#q$R/-)`"0^9_Z/S35=fM06L_lD%[%P(K[D=pT]uniP8mt$!:ps\kT5@SM_LR^bD(YNTTG`'S^Hn6rWVFK>O9,pGRZkIIK2SPi<c;IKOd?_O[\.O.]e:];XGI>U[1t<djJJo7Vk*K^27p=oIrECqJX&F2KEYT_dP8sHm9Hr*%91olG(7TQTq/A5=_(lBU!&3TJV46Ru7LAZ;b(EY2LbLCWd2f;2O"X(&<;QOpJ#4^?-cI?`QJi+8=94!hU0.r1Op1)"&Tmi#FR%I-*9nPcLPf/LHbBI*CHl?[%j`8Rm7(bC0[SRnNRq2-u)DWZ#O5+<JBnWlJA0E!9gfBgcC;AgI:<P^>+s>p\CG5jrG'^0$$,qchC5LF(QLaL+n6CV,g<aOVfaoGh:/=<Af=7T/di2G0:^j?)$6W2'KIhI8-eiIu8Zp]K[T2F@\X]iiLl.gKcRV.9tc;lmd#.oG!2#h]6f2mlR.j7lSCA/QTE6-,hHe\L;[kj625ZuRV"6fbp`3RD7*lfRgk7:TYa'(qPXOT9gfQl)8j,AY\0l`=As+ca9$=`;h)=])]bnBTLg<s=@j0:Gd\2(T\LXS(N8#>mOI1cu/h&FMDW)K)^O(%jbCMoeGFD-lSA8gnPHkg?``Mr;&88eaI,N?3r1rF#qn]IRf"bf^b0r<m;q<$'oQMLmpp-"gZ0CrnDeBIh&Z([D8oM(DMk`S,W3D4?.k^Yg[@@eb#sY$Rq-$Er.!rBJBL[\iAi-bF!R6B5Vi+d^!"B!]WG[$ug)WGg;GVTCn):+88iiSFNRKiuM:;0TqE\X;k6XJ=U`3::J5E2O>S,WaHuG)(^K&nZpEL6dC=H;Hh,c,JL@*1eW9f$E9Ja52i1EIh`o<7#iaM`.;6UT$=?USil=5V2Qn%tr/&pCAB*(6C'onGN39gK+jE/3,34?9%HO'kfjPmfnW(c-[L,[5W8"cZVj_C?2/IQ=Dl(3,r&SgRpAc9!nj[ZVNM9fF%Uk:"cUgHirRk)lX6Jhc!g@@sD(VUsf7#/GMe)8.ri3o,,FiV&B-Fq"AqH)[iX;KNSYHq2CDWLiYn&1*j\cJDfEok4Ntb~>endstream
endobj
68 0 obj
<<
@@ -423,31 +423,31 @@ GatU6>Ar7W&q801+L&Yu3D!bD]!j?Y[V8P31i7!>kZP\d5teSe'3S9\3L>616cloC<sNH78/_rZRGl@K
endobj
71 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3642
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3779
>>
stream
Gb!#^HZ.Z[&c^a\@Z\$2jUtL>PB&:2fT)MDY>0JR;5C.A_jXh%Rugm0&)/RkIeM&>+/1/]U4a64(j@m[jm;=rIksG$<;b/)s1K!%oFAkW)JD1e9gLQM'CPi(kB@0g%^^8Qm4,-0=l;7Lr\6.t2>L5L,dW+/([3uJejRnCh1d/e817/]4A[=)>Z1"Ka=[%l%1LUjJnX`bX_&:)#aYZ@ir,#<'(3KLh2d09DtpZ7VHL@%3pL5m;8#Qn6V(;Z5#!gKOc8h/G8!?7.%7+q84N$P65hdPg6-!kFi=KBW%q::&ftE4`P^)f5<l&##p8rKqJIXi:coebMb4=$\CYj.7I*hE8CNGRHoH<pM,/PE"fH!Gi:32^<9[fhYP@"A"3&e2e'aofqrYeI@_n8XV[?k+eGsLW7]fm7^V6WgX/l!FqDPM?>-D'uTcrr0I8N3e<4e6oG[+U?O+1po_R($3[8[gAdo7:l(SX+)(YGUZQOA,!![U[3Ke&-_'fXJphU;IYSra0mY\X=`Mcc@%E'GP-SG=:L#?)]=1qA*]ghSc??;.chjY,3l73.+.bG]nb'%4[ek#BRX@#I7IJk+nhpA+gjmQTOE3tfT510's='oo-qnD`tT)G`4uOVd(B4oVE9QK3iL7qn@07rcBf);b-+r^2:q7;Z)oJ%`KEW8<T82)#]0#8%:,plP\>]mmRtIs#dQ-J/:cLEuDS(,*ad>b\o_phdqoq?E+Q]G7lHnRLRR86=JoYp.1?+W;2b0Hg%(>XspA$bga5]$dd$13_8CD_mPenAMVXgK=pXCZgrNNSZq?B(LsN5c,Dk.c_2bGf$1XQRB3Z<K013h3(XE?rMhPU&$(1pU]U^LVXFjYuGO6Hp=<=MMete9bU-W\FKRYm;%N&-E`;_*,QN=O7@t%Gf*c9ZCad:U=Snl-;M6+:9eTRU"Bq='U-I>_%t%mg+:VuJhjbdAR"XEkD;,F.7t:P9!Z_JfB*nRZaTu5$3.i>=JPsW.:cQO<??%"(@^+O"p>HW/i1NWcS9Lb>3r"&0PL&3UlgJ]Caot?;F&)l&q`#K:BkTBm6$icfF<4kc6#$g]K2;)MKnm,AZm/NIaj[94FI%Qhhc0A9_TZ*,OuCB@;B_@?AUbGSVEN"jmI&!\cO7nh`cAhK2hj*,CtCWU,GHa@ViW+!pTn>qMJnKU%JjTVs3VfIKl6JJppAE]I6Q3*\O3gMraume2DX44CZS&N8890dhX9gVYo6sX4YJlargp,0;Lhj@$n_j"hs`I3qDVZF#)#>c72IHci3)46iY!dOWsdeM$cc\;PJeq2^6qg]uO@ahWQI=>^Zg>UZZ$Hn.<,^h?`2WBR:PI_mUQI/BV@hT[2.[@"@iQ'5RUjB.4*^@eBZ&khE#=Ij)rIflFoMGTt4MQ]q-VHp:5;N*mRaNMIe="lSMLobjXem"e0J@Sk^`>\eiEF2l\q\BWg$e^`Fc&uNVKM2&6eL!FlC25d"<jt[Was6B3e5Qtmg%?bCU652sC+it;5\$5@*b&9r3eTO5H/[oO35otrtR:Ipt(9+E&[i(s_0kR_Q@Jp<S?j)\70Z@5/Y^:?Gp<`nDZjWPZ-Out0'E4##W)=/MdBEbjcfT<Ml'ss=I3r8Iq?&kM#7A7'^.1LCA_uO@CIl/i+)P4-6MpM0QTG5F+[S$XL)')hhI^1bU4b18F;Z5P/J$N@fD!m*1E;p-L4`\K9TOk/<PGj^(I$1oiuB\s7<gs%@YWk8oR'JGd'Wa?G?JG\&tfj5(m=FqY*%$ZHPXHjid:`F1`Q,Hco-i#osA/I2"S_,_85o/-!<upRYMA@$2AFk%>pK5d+\2[eq)3ASbcM@VW0)9@I(TY(=TST"mmq@Z,QM+k&`1o$MfB$L+ZoO%s%4(#=oYEO.hmD)!qB"Hmi()SJOT4[iD`&g:$;>oG2L97A@8Q8P>*8LOaYhH&_&`OAE/?$/K?[5WeW#ZG].q36c-m4WZ`hh"us=KQ`3r0HV<iOl-[rqGl>IjmQ8>T4s1a4s?/S?tE.72t8Q!>Q!6Laa5X`m!pH<o=hYoHQo!W[(S5U&65RT&*\.o&n>(K.)6bDOiLE&YhQ4jlbY$)*(ecYN\n*ZB#$ilgW/78Jh=f-"2dcE>c*UG9L6.U6M/j(*\Z4YlDiNo@Ao/a.B9EfQ2ujtYuSgJ`Nf&l=\ht$[kUTC2_([R.g$U.l5I/\P+2jGhrRM@j74K`l_<,saJkNI6&rZfOQ1.pYBS2qY%T`VIfD5pEtfEZ\-M-=#h:2YU0d+Gk&.9Dp>Pn77fF"NIht[,N38+r9LghfM7F/k=!uF16mOE_Ao!k_Xj,l`bM"kNdb@^#b(E*IZo3\SG!<rhPcI'm#'[#RBq%0or/O`F7H_Z0:GDX#k\U^3+tN1?J,"U!h=uOG$pZAXdXk<7$iPCT,h(".+emQK&I[9"E?sl5,+]K7YSMl3UFD\o=D)M1Mk.g@qD^[<k(&ing8A66$019!;c(lG(H*o/"@2%4@(T_MmFFJJG5'M2Xph4G)RH#t#g4RUT@BkYeDDcnS5!SK>&"fFR:;>sZ?NoaGF(XI_9"#mmQSo3dpS>`F7r/6CMkB?SW6O#LfZ9C5%9tTs+G)E`=b#-Xad_26>IV1rXFDIKC-h6SaHs,22![rV1,<U&"fV,->s=.nS67_]U6=_lal9I%5J1k)@u>;H@W!/nGoc$NT;t'0EX=uY:f+2FF@%88Na./lGnWn(:'5>qs'o'gcMc"FB:3ecedZu:n;pKY/LP_-X>Fl"UOSY!)f\PN$H'%Y[/Z8WZOe1@Ld_>7_Wjb)E_RY\.*s+`e902Zais\"4;r;I7?,)kg&Sdk)QWrm5`1+R_4b"g;B:8AUt]Xb(?9/.B7sl&=2kHX]()XE*JseL_AO'Bs@?4Lam/)N#&K*W4R3(XZ%9uq*Rs2N?X(ZijqVR/#sWI^-r8L+:g:g(7()%k'JAuNp7D2L)O3=D8f@P\(?R]#A`C@_9O'iNuS98*++3,2DD?^O(]J[[sfRUBN!?r^2,E5F1cR61W27(]oVcY[?ue.pi?(f!7=:sUTJ0%<q*!%Dqism6oUiNB;jM9II.qM*TS%?mRK^JhtV'oD5":A;[V)Y,nrf(#.5@(em@WeCKkufTX-*>s1qlOlfepj9h^++aChdk7!j9GOkI$&O^*CYZcWhScf+_elW$:`jkVY]'JTX60IX_JRc[_&r"SZhPQIljrjhQ:;(6SlW5^TD1QN\P8<aaj%&aFsa?gBABUQc><a!u;+/UeJ%';H$Bf;jNEl$%`kWSZ\FQ3eB3CdHdog`HVj,_BE(H3^6\<\_c8apj8c"On*o"tP@hpi/A7@L4LYs'uY=]"Fq86;O=6_0S$7#3IXk^uh(0HJTU7Kc`7HY7>U[Qe6_QK3q_;5);]N!$)uo6@t+cGUs$M1XW0:/X.:X$]gkX7#W1Tk!`5cU/kQ6[8Jar3KhT!/K!a7E8@k4;8kT*kmC!(rTeNDcr;^.tZb4To@ub*IR8DodUQak4afNK[u]s]jC9<IK]I?bWM1=W&90(V+!hUY0Umo:<-i_H-&C)V1N4nUg6r?9^q'%b$n624sWjpGiDdTKNr6`#\-_R,rA6u#c#?DF#0,i,)5*E=RXqirk7YA8L$TI?T+#bVBEl`N\PP8!(>:@Bb_j3GLk9/D;a?eHh)Jd~>endstream
Gb!#^HZRr]&cZ41@OH#&g5\G25tZ-3=gf;-Pq>Xt9KM9/EWV9^,p3];6PB:mm+o8U5S+&hOQ0)N9d0Ttm-X33\%==Z`ud\Jhd6Ar\V&jp!JUo);_W%4L:b4;]=Xia7n0c3*GN)r38f''r\:kO2>L5L,dX6O(RZW&c<)k3dtM;E817/=*9iUd/h-M`j;-mt"r8&1,$KK6W#3K4(+TGrnc$=P%X5\)h$ZO5'E5)3)31c^Sj)R4e>s=3^E>(\J>O3B8B,o(\V[/D28_=7,U<%c,E3WeD+V%m\mtjH<1@SE#nJ[ool+l2>P]ViP1MM+K')YnZ(cJk!#*iR:p)un%l>m6)GGGI8<SK-n.OTJT7bI"7T6FCn%[e1^E.)6e$C%sR_Ndt+))3I8nI:l:auq5(2m00(&+belES'P?a"A-MRN24@k%),f;aboZ),')Yi9YF;*=j-d":Xum`<dm1eh3G4C!]bBOB]ORTV3*Zj;m]@1sl"WOfTjB(;1A..i2JZ]J`k=KmT5nc_\kjFOW;d[2Rnb/8`VPNO<a-F;^Negk)+FIc7XiIYSX%B`8h3d<HnOuX=`n`Nm@LqMPM?N@mt:Nu;s`,VeOoqs0sUR_F5p$aGjVZsBH&+b=CHs7L^Em0a-FHOP_EP`e7hY7T[6c/>nb,jJ!E-\:Y:'TeuQjLrgLb.cZJV6%S4C>5*3kID=l[KB[,k88H0?B#U@[od_.cM%'Kd8%LKWSnbKEN^OFnWRR'4[LC/W<:=NOgubU<&2qT3E%9l;osuB\c0s1Ql;<aKg*?;\f1pF3=4]Vi\1:4JNLMBnhdSn;(X<@F;1$':XsG<YqO+K$f]idtFu(rJK!ZBm]&PE'n7h'jHkE88+HdU*bM,6E,h]Da3$+!tiktQ$&^o%AW"Qq%HKmL:pJq2j`r7YN3AiS7Y]i@b6c1Yp%=?Ar'N?/W<o!=e\WD7;Q2M<q.3nM*E@:8eb/qZIT<5j;8&AYQ=Y&s1u`Xj8_/<1+`2M%Q??XGofXHJd6QKe&DjC0l>,Qm%YIQB_02p7NtI2WB<"1!=>r#o[87Om]D&"o,(YJ2[Dr8^ZR$:nk`@3i_<+e>sCmQW$qsspu\9b&D8\(*^H;dj?BBVes[Yn(3^ZYoeA78FL[a,)OpssoB\=7;YkHi"T%&3app.[Z0;l8a9c#A)qpsGVUt!mp?6JMZdACYFBZ976@#$i`@>CU=RM;D?)o3k,KefdfYm9lVBf;$jfc.]`$*-%6o`8tP(&IE@J4FNpq[2N8[?+WaUInOX"<3lqk"r=r<G\[MVq!:.3L'1M=uh^#\+D=*d]JZUT^J4ob3E,4U33bO0EJH.U`:^l!9)RRrXn&."c5c5$)<G*mX55S\l\BUEMOPdJMZbDjS3;JIkJMasGBmOW_te:>5C3A<>4VOYk&s8On@>^s*N20[.Mh0os1_YH[2KSARY=3DZuF-?F[df+UA>N#%0olGF*43F;p:]P0ekQO<ieYC>1>W.6Ft5nYbHL]YRB,jAh6%TZjcq<b,lRP'DXjd+.8aCDJ6PKYVM6u"6GD8p70JsgGkY]p3^14i)nT44?dbhY?p#O$[hg':=l&r0AR$%KuL<2p2cBNP>mB61Y;FNttZ4qU!mblOC=4U#4t?Qu0[12ld1%2dugO*3)fU&E/CbPl1SNs%&@AjUju[]N4o'^nJ50#M1ui]c+dk2?ZKa+Ep6=E$pNl*2qLd]k]__L!24SAW<-&R3SuQsm(Eo<).s0T<n<GH'!l$./eVN(8-rf?!->4c.7+nZE+3Ztkq8hZf&(F>RB[2"QL-iaDPsOt7th`Bt$'"T6k_JDuP(S@7I;:&M>-O05(3m<P.7\RoJM`HL$O6*o`gmBF.53Sat,6>R#B6^nMCCUn]Z25El%_hF_:(u[eV![q)-I27CRk8Z:*g,.s:PSS=.6DBm08HY"EqiLVmH&X7JOAE//$.EUO5kFU1ZDL$#36c-e.j!K$h#@i^#0daJ@0-32,N1)!r'B-7rl6P>=ILG7NsOVg5j9#jD>_Rm(]SA4ns51S>9HM]r83s`4VL$XVR\IC&4r_HrTI1=&n>(S;udBhaC?\cfBq,E[;s5M7l$(,,P>o&=`@5GocXIK?qYH9_sPkW=)"EPUZg:XL=ph$k!E:h><+%8/A63P9codh@tA6O?/6HNjuMSVXp-8K;/L9(5,8B1CU4c%Bq)5<P+3!+ho/6uj6@r6BVX<GZ`083R>nagB&d`HVRMLcY%T`V620<Wn?`dbn,UUtd62uB<DY&c'D"'s@YaH$9;CD^$bhOp&OY.s6FNfFqUdubql;O;0d;>gYd1N.S_!L+RcE`Q8=@_R<9ZT@/D?IPebblS.`@T;AW&WLg2u^FB7%\1VP@eaNCOi`9m!ZE5`qmeRc".&(#8;MA*QSR^".8O`=(LJ0.#)mLD!HoaG?*s\3-&\ZO/$/!`ie"Gr0*=*"0sGB!Jf^"s8S4jjXg)?LtOn4(0g+Cu?bro>8N/;uh`E$1-5YYMGWPg?kK/h3QpiD%kH@&n.>ar0'`1]c)3NNO,V.=Y$VK5#][E=Qf*Qli'dY\=7;5jSk?Y1&E8R5A(LK\)t-)h!,/VLj05I(*K8I%4BB).Ft"dAc78K(0]sIs)GgCKAF]&TC*0.28h0\V*V-qpRdma-EiE@nS6*h>YWnPFmW-$)B"2/[0LqV5/:-)H[o20#4RALbWlZrbDU*_di9kaM9".8p"6Qe-#5N50/&4'Sb%-M*,.>1fi_H[\lUK9\$A9ZKSpctdGREQ)eHV%3.b@kl".^[)h9bA;pUXSm#=B[d4&86:%ZU_-:Btgc*\`5Lt7Jt/@$-\GAbtiGC0L,cS:I/jAZ1o+(NldKjnRCWrYXePQI<t/E8*>`tCP>[Q/LC-'#F2_9QsAb,A;oW`\^eCR_(r[;#)j*BHf0'IgC(e.o>t>?sVi%6=J4\YnDCY`+7A5[aNMWb8`95W2-8k3;`@du7!3$fkd5hHcN[*!?lo?@TVr0X)l7BH)?6"s_i8U5Iko2O(L-hRU/\@iUN^`Hg?-bf0^32<dS\(ndDHf!?)AGZ3P0h<Z!H\72A>fm$PQh2(>=`um&RW'\8mPn)M7CQ#&$XLCqQMV8MS4^r6?eFD,@V@Gk,,O#/XYL[mGn&:W\p4u8cA-%Kup+dl!<E15Grg7>prnkA@lgM%/oe3>V'0&pa!7$]j>c)4qFiUs':IGAjIbO7*n#?G_4YG9N$$^^s=[JjIpdH/kgd.6H=@J.tjjZJm!r,Vfl\>c]'*'bh:GH10O(=ZqM\j.PZRejIL;VPb_hk?S^V"e7$AE:kJ]]r(o%kh0^nOZtB0Y51Jd4b+8<B2J+,o1AAGFJ-b\-t,ib0Z0:'NQGH%7*TS<kXI<8'Z"Ing[We`R(e9qJD3-/rnBiB<jK&q>r#+;<R?PqqI!E\_hq9#oL"JGI?nN6Z)e^@\dj"a`bo\(o:UDuQ8:nGq*PDOWGQb7>CJBA-es&I>f'lQhqHOO*">'Hk+(lk++EKYeb2pC4SA</.MQZ7&Z!^l&^d6lShlpSAn+IG47H0rj<J[lD>d"7(MmjA^]3d3l5U6`S,sG]Sn\`$:r^`G[jd.IHdKV(KqZhs3?r\#YMg9ShpN]_W-;??8G`B@:Qa93=B*-9doHp'hFc+T?tBahkAjor,?Q1=Q\Y"I<]XX:p_3Ia5GIZl*;@lQpJ=8!)'8/8'*W8g>0>)cYn`lFbE`CO(ld+B_<%W(:N/g.!AY&0j@T<Jsm.$A[4q)bX'FR_Mp@/nlP4JJ<O8RO6#Gc*PD73L<%LPtE(,0LQjcgBN];$\kd`h>~>endstream
endobj
72 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2956
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2915
>>
stream
Gatm>>BcQ-&q9SYW0c<b:Ei1c=2cgCHgE"6a]brk2Y5iiH]Vo4N.E;bZD2oaeK>Diihi,'M*Tlr<EE1%I:$Ic.fPP%s()1L4,;2c!CC5/!hq2+beLslr9D<;g!A.W`O$(S#Kt[4<?(9!gsnWdJuuNgS0VP2e.KukRSF[b/!NR3-"FoEH%7A<0]hC'CoLeBpufE\Y@7DXb^Y2[i=].?40Mmh/;mV.q=t>_WmL]t+#VWrg_qZe_"F_u$T.$40K/LtgMk9p"D2$(;rCO4nM'r]A6<!@BqmVC!>_q5MA=[=R\>;,ND7s/6*UhZeql40`5`:D(692&W!PhcJRG_Y"\$S+r=j*rDMjU7e"QWKIgG5Gai/1fVPK&6_+OYm:U0sB-B51Q*LdBQVd>o$rp%$fe@L`V<&%DE'&!<I$&^<cb>6<WY$VRE46Ro#I3/R3o<ZYc#EpQfW>!<j>e'0Zl`][FGJMH,R#pg[rGB>fi'Hi4!bV`]@kKlBWm+Z0JeR1@%Z^"[_gmG4XYh#)WqJ:0<j5X8,ES?X$I=D@DA,RR/eQ@9SLR3B(RfA[:`I;U,1;1CiapA*V[PmE=QJrMj[;tIXONk,'e\)73I<K5:+i2f4n+.Y*?V.\'NX'di$$n4GDLHM/Iu(CLF!HE_>P;Y[TJ-UmDAVW%Et[[WCLjpJZT*6A,&/LA&3*Yn'<N'VNu*2W.$pY]YZ`(Q5?4P:^?J"P<'^\bMT?j?`Ss-V&AI8@.buYi*ANsGGP?<Rh&mU.Lk<A2F-LdF/RMeh!?nHX8)\@"c0.VfVIfeKPDpTIR5nRZgNo6"W8T_3(9a;VVle/iJ?<F4A#:LA2)aA.j"-:/(TRU"t:f+i-FhboDJDfDHmQJ<A;JL@E='$F34kV$>.q;G&bBN=K0QMdP<N0bct3\:(uAj5,#8W6KBmNbn`n"qsl5/WGW;*1\HU,]f6Uam"OnZ5"sg#^_aLIE43lch+gm-lccU-m^@0u`Yh%?)PW<</)[%%(Y@lW3-!Ls/`<-*R\l2<-?P'Ri";$Ti`;f@psI*\#'hL&p@D\RZ_-(U?'KXhiTmnt@Mrb4i[\sGHsMd^%RssF>GcNEG:ZIn<7Mn>VB[-;1c&@$Y$6d#l00I.NtmrD3Q/NJ4WmMsK.dq53ND&r:0UisdP_lA-.UX7Vb>K\?$0_qYIr.#9gb=<f#VSQR(.W_>+Lb-,YGFQ]G2\(g'h!03LHLq3LJ$]@$5B!Hg"#)BjMo`f3@?7g,PoDIM(#)Y8guHRG8sn\OHuYQ'OJF7.OEFCj8,8dF>FQ)/*;$3\<#&Q1,?-pq)G-hK[gWZRds@L&2SKV0c55)_=#:0'oD#W98Z!c_iR8-K,?FH-$8"6n_YS')oc5obDorX%iGr!aefl/IN_$?HTYGkVG*?@mlT1%sJrqSdb#uPTTss4,Y'I*O/'NkX5T&9B8$+^rpJiATbi9@/bt4HN`5tg1-61k`.WBItXsLga_1A8L1q&LXE%-1;>sqq@B*8Ml?-!<Km#JTZfmlIl:-0V%[H$nW@m/*ABc`&D)5$-UB";Jr/iK2h9N%/h6Sh^]`7nHV&WU7.eu_!h>!2L[T%&XU%dNKY43sks[]q.6C`/e9;ONW/tJH_ht^oHJt<L89eS6I,444h5j%.iuDl7;IL3LJg81Td_-RmGHfdJ>HHItqk,VAj0:Q4<e]ic-Y!VI&DL]%a58mSZJ7g+7Q48ZGD8i+bjR_i1/.Nc@cjkK)l,I;7=^9p7\%H%1'M!9N5sh,;s`i`ltHmD"ZCc=?bKR9VU:WXc]D)Ho,St+h./!P/du`&K^F>EbD&/.(%q4q'8#^T-9>[]@p_=0_HU[KZAl)n\;1@HmE_-'Nl7k0RCoJs*\^a$]<p5IgJ%#[7flX2Z=2a$Gu'F25tHu/)`CI(3Le:L=f+T+APu%+DERMEnN>2M$^(e"4@B[r&E]6In1Ge:O%?3p+JB)!8cs<>d+0GU9QQq$$n]X)BgZl]0MbWl/3Isc\B2d,kps`!4#U'5(2"9`p\BJWJ^]Xi%'=Q<-]U=M6^>$3=N]&)+B"BA"JUupbX;jl><,nP5tk0nOKVdd:-%aSiX$m=Ob6mu@)2mjD7g.4%?dGF_*SW-\!+GeCBa-Sp6nji;[na+G[X%WW%pk^SlBP<En>t5%kJ;N.<$^$=lkbUA=JrUS^TZa=:1*kZ%b!jMC!nof(323MhTKD0/7cCDZ:i@29fuOEB0RFWAI.)]$Vs,D5C1>FhscXV74T)aTZ^-]2c"G>]NC7(Fba-Ro2@b_dtWV+@t9BU_h,OOrZruT1<33HHF%6SiUVtV<I2H^HhEu41D]C^<KEEfXH4B^YCe1mMc=bj1`MUo[eWOX??R^`Qj/N`Xs!n3"(#/esr?NQsHBNZ%g:O0(1G0XU\Z\6Qb\:+[t-Rm9]7bUm'F-Mg]o]_kO9d2j-MAH4I0<E/]7%T`e^sUofdFT2V&^[Ita8Qi4o>6V5TnGTf;hU$jSe"4:IQVa0kj43ct>JmEZaDCadR'5d&UCiLY*^(j=-FM%Q7.58pPU:l0Y8HmFm#-:Yrrdn.CCR.Kpg&o]/p143o"#4C$@rA0*k6/7Lk1o5"76A5J4QKs7at>cg"RN7d;o88F4$1f9OOX-OF.:M@q@h$/^16'GN\9WnT*k>eQTr[=7^6sD4@#A*l0ID*^/+Rt[_mIUhV.&D6\dr!k5Y!2Asbj?n,1hD]sfc:?0m3[ha+s+@p5t6*N=6;Z%dRk"<gtto4tBDY`<D(FeI.'"3SQO*/O>$<S%a\*>*br7C(=`aGHMM=3AVURtK8Sh^9Mc2-nNPRkj^8-6KF&m&#XV(kl/5DQ!oa-a^R94JD,*=*Z4Y`7RhhV]62[dbb@%&*$F[HmEq^4I.*I85G8rdGmmZUs(cG5q0q<j6olXE<<O4gmlV1Od;UbT47&pG>5#b*q4KU)'-9nm%lQX\.($,C]cO/K+L+Mn%ceT6.@,JE:n]i:tL$~>endstream
Gatm>>Bei3&UsJXR$T_Rg7h.-*hW.*p=`)]j$p:rRQd[JLCtbeCQ`'jb)ZIL#GcSV/`*joj%(H2RDI*Tk52qB+QJNGrjrL;DWWX`=$Ro_?\>(E)U,t3h>H9QKlWQ[l&oK>Z3I2*9<r;JptWhqAt6"A&"Fo=m`aY8Kq(p$RgYIZ'M9'<dU=2i%Kd.0FUaY`0S737GEEQZYDg*^i,=+#GOM\B1'&<-^]\,Xi\ZL#mJ6A]6C,F,9A[Sa&"*B[$2DhHEER`Zj1h-CT1GiYR)8dM'+?(I_h9*@lQQ(ELfan.9GTR+4nkJpM9fMK.i'N%oIum<M\;))nV8@,WgXA)rMf!gU6JQ\,[3[e<KL27OA-*.;^]#N#ZF';9IFMY/J3[R0NM02'\:$l8F^bgU=uNB8?"QXlCWieE,M"I]\>=j9dKjQl50"<O76SSe[;qt;ZV(,eJW!QSkF@($].J$6T35PrD/a+\0e`^[+H/=CEZ^hI7dMsa2%6C/2Jne)FZ>AA:F:4L+E/t45ff89LsD:r[skqE6hYeJ[:,n;AU+%W)#6l_27]_#*/.h_LRA4UGXN/WX^lGL=6rn>?PY9a?:?j\4n+9qF!0lp/Xa7]?ldHKA%_S,G$MM'ebG>3b9!\:*Y8g%k!6DBeBA_.5AOsbW1Isol:'Nl@CU)jnLOIU9O??!XmuLY"--[C:W6t5-.kRE9:LpYeq(fm?YI&DrGDRT6fS\%d8Yr3/5bc',LM#^OKKZ(,7[PJbnQi`s\tiYB^-UauY&SR+1AN>eMd4h3Q60Po6L=@.gN.i)Msk=-WgaRh&mUWXRfc2F*(h\Pm/k/e4>aeU1_I!?%pn[^jC9@G'5]%MS-\R<=:t.>T*La!j(H1]uW>Eej*Jj@OZ2-)7AdY\)i8*jABZ2Fo!""H1[FkP=,NfXN9*.]8<=a,gN,k*-[6&59A'm,Na'Z.,.NQ"=Wl@G#>d3jB^f'5Hi4'X:=uZ:0rK]"6#fdBKN[VEWFf(FRuM^$lBMrU^Eu[_ro4ZV._ilr:)61TZ5@XkXCJ6Psr5,j!)Spaaq7%JhVNSB[N=E68<X9?Lr^H:4:0LrEJ9CXI>'B^=0#]G:Zt0j=JHVmf&1V&i=_B&h?B6lEK/g=n182e.`&d>DHQjr:g?WfegSV@>"U)cKgtCfQp98sZHQPDEdCZD-G'nR?O"8FPGP.4M8AlON?iV5^RJICWYrPqFr"1(;d"f*;/qR`nW/7?[>FOe&(//DRuUWDCT$&s;ir]FuP>U`HJ2F"fu)3LJ%(@$5)lHK[o(@@SKBdlQS'dQ43<IORm]^2emhT#;+QbV_gJ,h\FLF!NusABUF8O"/lsAtXF8kd8!]fA&aCiU>*IGd]b7ZR@[DJ\)W\V0c2r,V1t30'oG$W98Z!cY$&+9YtFeoo^oFLgI=0,j^pWlRVmJbAI*]!aeln/IN_$?HUd_k^r$<0quhY_sJ4j-\Yb-,mZd!cLMm$LMm_.3`/3#&ojfYGa[s+X=4u9beG@[T"qhUmMP"GqBJbj+//">[uNCM&rH&M@5=g7b\rPurW=P'+Y%l:p#J4I.&.OST+'5uapGDEprF;\%[`tBLhj\hP9:L.^f5EnCV]D\4t?:#a8jgZMV[&"&O#f\!,ocJ_0<I)<eRDW0`JMW(\-^cltGK:hatbk7#ES='k9c,_@>T=pVLJ2^>%n@d>3,8*,O,&@2c_I+iDFM]cQl?=RVCn<c#$hckl`QkUUoD_Y&MEd?\g/rH"ptDk/:Z*?[hPRu'$__kpf'\"BN8-G>"uqWmYe.1UJ4TVB15B2Pa(JX7M>nb:t+a#571Baqiq2LQ'B]NCi(ac(YoOAj6k*Pgq,F=(fV$up!7m=C"mQ9?W1%J9KAK('T!HXq>9?TYg8)e\iVMm0IrL^#LCk=\oI@ap6.T%?r&W$p;H>3t0a-MEQH!%JB@3:X5cVaar:Udh3j>:8:!bi\mU;]rS"W?Z.BSlnfN9f/o&"9PY7.A\_OH'JuSap3kM&o*XV'EMHM!3Za`HGl.A:374Vc14-P:gB7IWNqY?7uS6#q04-4,r1U!?.Ks7[UL])KR/2JO1>[uF.#OQ4QJl#["MQ(dLs>oP!qC*OBkP*$nbgI4$Q#);K%XM=T@5ugrn[`,drhf>WACm&g_D.#`B.TU,]tU%Z`QtgVnLGmX4ko;7a4T*&mB(RY"+J%VI>lgVCe2$&]j,+`'L'=Oa\2,<a,VU74kPmnI6tI)Ut#NnKGr-nKS6mg<DQIC=H^d5th7#D&gfDG,o2l'/=WK/C7`SW`)03b=^l*'0QmVd)SL6`t$Db#S+U%a"_r"g\D3MYg\hC1e(b&pFcK)7%"f#>s=?OlqO,d4fI8NiH\`RVZbPM#MJYp80ROfngC>DXS+&)e[3>PFt&+CCS."%1(7j"#+!HS3(.!0qNp%'PD1Jq5Jtn#J(slptEdM_r[WC_=N-BUYQTZB\TK?lbf"[o(m=1O8$+k&Cn?-'_94aJ7aIEnq2u,phD$jX^(mjZCJ%>#@Y./=1T@ZH8`Smi\MSOhQf3S_\MhO`,MufN4pLg'kcs#Ug1@U[Q__IDo@RCJglNDp4"_!7TDbR_Yq59_.(oG'aiijYmPTt$E6:7!/A[g*aX:<`b]//m1f,Ui(h:^4+4VP`tsoZN,L&rf,cRG#:o&(nAE4/Q1Q+#[=7f(p9V?hK^uV@fXJ2^bN@9O_YqC65@nK&fXP0%+O0]R0YJ4i;guFEnK*"\2KAH;,7oM'^\C#PPU#X@IdH:7>8cHRp;,tm6+uAi=tIi[WHU)%JU1B#+^:o9CU4j3O(bn'dV.\B<T:-F`;>@jCF)tNKO9.iXEQF?7Eb6PA`WYUC%^`balU%4Bj"tF`h$Puj,K"'a#k#4a;MU#C7+5ie3?TJS'k&2It5"n`6lOc4k6ukk`W(s<_=r6-LNHS50=2Ap`K8DYCc~>endstream
endobj
73 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 4186
/Filter [ /ASCII85Decode /FlateDecode ] /Length 4269
>>
stream
Gau`WlZ:f='*"Q<!]-C:aGipa:!0#%:[t3"c]0#M^>9+>BODIY(fLP>;KdG;r@LS1+c7HE3UMg(<@EA*@%Y3iKf#UBT9fH5>9`]ZJqiG,dW@=6,L'1]1q?"ePBYp@C$V1aV:_rIR`KJS`A0n0]Ec>h2U!6"!<oSNW[ejR/:jUWgl.uM^UQ[aETAnop^"npRL\<\:'f8[SKf,k"2_*\0g.K[5a/Bbnh]1=(\k$h@CqD3BGPVrMq&j_e^Y,P5`.;%<Q@OcA*G4:j1C3,291BpNtbmKD02QkL_2KD)+a>5ob:VGS"aHS9[ruF^LXphF:E!r]"23p#p(",1K!DXanVlSaiQfVd4(MN0H#F=-C&Y(dhO)hfrc:*@]T2dUrRK!./"Dcg3!I%nTLPE;?`B9l:YI(,XTh1"nPe0#16BLZ&1EI8S8`mkB9V8fE3%^XHJf#-hnjqLf+k^fc&s9#&*sOeFtiN/UMPFrd?MH]uXTDVK$W=*.j.qb$=oE?(pV)W$oeB5Le!M(s$Z,R5MOHh"3BnT'g`k"uO1?$DJb_m(ak>$7>d#GsEO$$mLq;k4?@r?i\G#b8nCjT]:!;\'&L=`!oJ)-aK4Mjn[t/T.Cgb&k!u*PNT_+^LX@!YijCKS;<euUhLB'-7He]@3+OZ1tfiD$&Jgc>Aqo*=Kk0#EUKPaS>9Br_'?/Vm^JEEOm(DoWma;_;dFTD6rS&,hc9b&4ppGk"p^bIPFFZ+6J5;cZKXU3^T[)?=*I>26d<s3hqp`pGU]0YZ>u#q'V`3U5coO>DLAQeo4g)8aZq,M%DYms!8bFJ!)LQ6q"WPC4;@tV\n_E;PRm!S-l3?M6M[kB_O#usX/N)`MXG/G*O\_I+Y4EC)Y/(CBWSbT`-!or?drXNeP-9X["7WY_@gte&M8W*L:L];QtF/jp0NgB!DCiN'<UufR#9A,QSgNH!!1[rGB5F0a\-LDL2U$kGK*X'7[?">BDNSuag\KR8N0_mklApkobP)1K)5j]\YWV@(19*@6mNkG4bA8s*0MVX+Q@U]Np:#\\VnR6#Lf.I48TMM_Jc#Z`At[3DZ._N*roH=;/IO@!6B%H+WE\cde<_k`i,4V2\g&<0X$CP0*&:G]_Mb(3MGDH)=?LrB%`(,W1uL(:L<);\B7W<MIqGSjlq5k.;=*+EDU5(KH.V<?>aZnAP4!Is!<+YYCtKZ#]'G]hk#36hbFEfAPNc_kPNFqFT;0rbPbR.#N]%!Ub@CH49<RLece1krOA,Hc%,RFSG'9^BTZ$QG&_YJ2]5uYA=VptOo,QS"9?^M@?,6<0^tYpA.Me^P%@XV6LN6U#o`^RU:dc.Zd8AIrELf8MIV-,073bC%30KBFR7XQK4iUk/#4I]4(e:SJfhj)cKhcpB>gR<Ts$7tdhZ)eca!`HFmkhFJYPN,`P0Yhni"-pDkK2H'#U4#]QUqj,@bS@6qa^kj_+`sN[e.FDnnuW*.UR_)h=i65dQDSC4$EN6b*@f[<$N_iUUD?]G$</,=bU2f[VT6C:Uc^XX?Y@M)YW3\\]]oj`!V_f-O]KBS[E`=[6<`Z64Z(@[\PC9G0[0Q<EV<+#f/&\[n\hqee+*48*;(`<JV=3FpDXo\ep]X&R?pSm]RZA!!KH@SMk+,7I.9&=u8G<tli$_jsInV(X:A_+RT/mr0+'$iEAV!an:KF\N,0;jt_p&)Y-`#<k/"Im.9/BberVlBCtkK0ug+N2/8PB(5$eO:?.g,E^#Q@lW3djIQl-4@Ck/8SC6uPrm'M3nQ^1@_g?2l$V6rDh)uHNaS7lnnCYRI/"o/iFbg](jO_'1,:X<T0l#\a,p9HYhC6b=6m/^pWGOMKnFXK)J;?hQXp%c=/cERG(&rfe01QBi>6TU_fP/QaTlm?T-7^`R4`<Z[.8kA(hJYtQ#,U>R7;sF8Q%\JRdbfE1FZ8#<b6k>^p*Lfg(14DX=$PSs%T)&+gqFS&5d<#.!N!0`rPu/Vd!*EER5`qL7h!OOrIU]\"YVV[N`8p\U!%[)B\40c#k-QTJ`-ZZ;E6IduTC%!?ejoI`)830l(V=8b4d8;'=(5'M7"@fQ7Z/%gho]eZp'AF-7(+HfLYaoL*$]0cT^-qTOR^-!nO777d&54V2%YWkVQ29fQ%[3b</Mc0bIe5$a.D+FPRF6j`iENX7cM'8<*MjjM7#N[Y(uK!Q[%$C=&9?@m8"`X5C6E=d[c"QL1UU,gZY.eQ$J_jEMT<&m0^-qR^499E3A1"aq=&'`etl2dRGXJd/jeNXCd)&#h^jC@<[$.F"(G%$8m6ghZn#/FuG4<L>0^_d3;`*7b!DUH'p$rIZnRc@n^bnVIIfu3"b_Vb`@T'm5q\?'R4N_c[$9-SBrbLq"XiC];jY+m3`2?tpqqd]hLL)88mYKB,SpQoj1%q*T>r.lk5i/s&:;c+8a/@2dkSuRUDWkIL%f@cpHn[J.[[eiDk[rRD]%J&5A6<WgFcSOW2s1+g$M1n(Fq[3O`)K+69Gg444HP0&TR:qV/+#'n-^sQXD39R/FA8aWMMis@ElJgJ20*V+AZM.=&l18i>!I=K`h'e[WBO.kcXo,8!7,s*9FLHgTHBB-o\g9il@PeL7TJ5F5,)U_n6mW*"f+[2;4P`(!ahJNq('qmtj%Zl^S:fSGcc7&bPOGI,P%Oc:"flklQKKEIk90o7)u15f==6n2ZgNVB:JX</)4H0e!j^%5U1'W&6;/oV<^24qerE(`'er=M9kVOTkVC0*lPB-Qd8[bB.+'QhD4,r5]Vtq'+TOu=jPBr'C?4aEfXB$$GXW)"BEH*6>:Yu.?.Z^pQg]+=S(8X[X=h\X`QOWeP]RSBL,e90NL?H<jU\!"`#e2je-/-d1?kJ`91PsX/<_`0(+^0!2bHTGZH06j_\g5h&Pj9J,FNckP%3$gD,40NlB'Q7p-N;\&7F>J#Wrh(4'V.D^%*7D]<$23?G%i/G?-@+9*5Uh>!)%/L8cWaH@gOa7ZrG6Y!#CL!q%3s]cga19q#,+Dtj`Vf.CShUL/l0;OL&kR,=gW*hu:.fe0JP,f>C;&GiV)PgGL;6E-oW3P,bJS@_qf3[Tq@67*'8V=tZj["CN=$nq^ca?B*g]>ui16T%Ij895X[!_O7pOr'"<%k&'rfs7;Ygg0D_r/+C0;VnrVRmj$C7c;@;daSKA7BRb"&mXh;-e6_kf">fTFYi;sR%XiC'i_du$YHj/WblhRZ9l`OgWq3Xh:[RhC@tK]aIu$/[pNUs]TCfmAYG1,rR-%.%Lq,:S!3iY4&CNk]:bts:n?N4jAq[2iTli/$dtO&Qdh/.&*6_.2)2dh<j(c:T]Ji\i4Ng5Gr;u[h*6fQ:NdB!Ps5eqiM/3#gS7t<ZUMWs"5N,@4R^6%4RMajJ#3GjL_aJXb[8+I.NhQ52I+;7':VUadWC9-:48D+"o@ZfoHWTN+D6#8,W3(*$K[R!cRF4WD!S*&&C'H(H`mltN86RR,ML/5>lJ33e*ihrUJ`W9@&]5gaOAsP.r:>WhkjEk!a9#VQ6()>B\"5BcHul=qQGf-rc'g04lN4Va;mp6%Dq,E8@M^^cQjhQBtF2"`K[O4SF+Va/$\:_Bt$/I$,<\B5Za(tN"US.1NU/Wh=dk:"`M$(\tNTQ5_t[r786LJ+_!3lVRsT:2<c%NR3`tS[IXO'VKS+[?rmn+5G"R\X3")e9*3547H9_mB$TV'B4d44kh71'q;\$/B)r<1e(n4p4[7Y83Peetla4,$3c4;bkVmCK=O.HFF_TsTp59s9cVD$n1IXj9dU`*<WdFnW/:`)K2?;J@HZ"bYpP7bZ;^OlMb@Hl*S.<h.%r^pGJPR79?BR,jh,-\(qc0)t"Js6./OB3Ub@:R3,#:(3Mlg2o+4`[*neO1n8b=E]9B6m'P(PUE^#^Ad6[C9`9&ut;pKH.RJ;g\Ag=l9W\LOA<?<'N5dU`*-'@K%$Ym?e[Vg:?`q)%6K+"A1U_osk=&;,@g8I.#kP25":Uj6MZR"I4mSe3%h05L4qh*(7'H-;!K(BJ=HCQ.5U(5-pfLmOLpXVK<&[">;rg06kf2d1N"]L6%T__A)6Fn<Y6C3>Z0Q_3TW*Od66CWuGpX6LDhdW0b,YPM,/I_=(GZMId*J&=-jc-5iBCK2)['j'.>p0!@oVO8r7f#fH`MXdF+V)Te=P)Yp&<N.e??i]kBXg=mfQGKcXNa/AaMPY$)emTH+BSb4KO@&]g]DhmJ<&dY~>endstream
Gau`WD/\/g')p`p6(g3efd=#]AS4m,\V[rCD:55:F1i(g$q?t$26s/QEnoHR^EI1%=I(8]g"f$"lcQ#XS6%m16Yf5H5E5^#>pAo\K)2)rV!2PJ8"-EEBQAsLP;b__BUbEeV:YlC23B[3.$cSEiB8$4(U\j\Y#oAC7%27^07fjX#)o4ts5HPu)a.-W6T@@>*.,aO&ICT5\h@_l@t]JJJPV?Rj?)6-J$k'+Qq">V;B3HEd4/G#rTg?qT?o9B[fX-9d'S#q#GXkce>FH"d!V+]@Y4%9Y,=bsV`4F*EUsqERQ,<lMHXt`Dmke9Ju,!XhC/#*c;PFn7Y$&C+<AjT`XTehj6=tUhG)X=C!Au)C0(&$Vutk[%&=_->BL-@E@cNOC2?rp]]PTcq4XNu\rBHA!s,Us?[sF!gJ"l[VC;j"B;57cjs>)q8_:0VTW@CDQf+Q,QQ)QW*%k<@a79XL)m--^'uL=d\Q1m+bY2EJfQBP_Ct1_&oI'd!`9s?h]1RTVms].*<FAD#]&Y`Y$$mr'5CYtM+$OhRQ*7GcHC/uTS^B)Ro5'\fF?./Ja[MS[0J2),akUk,CfL-deLc,p?M8e2H*^%[Oeturg@'ZT,g'Bjq,=!W@p`)tI`BlDILKaHZGN&8:N!`I,Z".qO"Pm+_OMWW";,A%qaMW'5Tfq9-*-jsGC:;V_qF[\KfQh0j>:]4"t.M+fe9R]5C([iMjQ+'U*53OBAY#ME`5?XFm05m@f2?Fou"fQ"ZRfJ$X]>L]D+B0Oe?FS%@.G2[[8tu6F;Z7PSkW4jGi!oQI7,nI]/`^EK3_8h*E2Y+^k7Nq(_E$5L2:@q`L;%gn?TbT9=q'rsSi'r^IdhNbN4+rd"D<)`U%4Gq`Tki=VX_FN4X9lM'Spf4m=L18C6GS-5)XGfg76g/eL:.3F'W?Q"BlHiQKWAH8=-!F6dZWaT*[*]@6t](a]S28sPlmY?c8Cr[tOeFYoV!0'8S1PY7SWm7NRl+e0RT_jD\#s/*BQMtBQR:=i(*W+18I6!_mEK[c?BXnr6<:o=dm!p.Z%XPjNF_15LCfJs$N1&ac/?p;@oJos8+$gnM9mbglWOp5F'#G00+/!b1@ikekE$BSslk8A4UOXm=";.gHG*Iqg`]bPiUUfnj3%;L$7k5qVc$,XYHJJSB!a&TCU]UVMN@8<FW*&ls5fFR`dUfR*9c)s"dHq'%Q:Nji67HP(==qG(;V*I(;&se(!9M<qZl`?el;5l%d%WYY0/P!J81G+L9T^R?Y-+,e>=dd#%fH>>Y?P$oCMY#,ruU!fI3.3>Hb*c`O3j6jb=csWjl5V)\6FRUX'O.2M-ZEtE8K<!a5AXcnRL#qh@-=<iY#F*)nK<[NUJ3hWuE[jD@t!o^bl+2`XahHis*6pe=q<*17##?Oq_qt-;77"NtCETh2f>+?Zf!fV^mf+=V_L_Y(hRhl[^(gWW,Z'Ad,Q'BZhsQ:[g`u.X><#n1eo3=Qmq%hR,f'lLJ`lHTa@O8:WQWBsHj?,^CEe[("DQD2I5r@U:kIXH9]q5bb*AY]@5W.u,FP['sG>>n"M?=W)afCd8*H_R7Cl:coFr0N:+I2]F@j2T'n#W&:do98-[=K;4_7[^);D>pWqk0P(I7W`;$SiQICe'%BDZS1Ged=>'qfJqtb1&!M[.Rq7i]q8Z3'k02UZ^jS.$`d@Dl)#4A%AJo%@&A!(+_CJWm9dH+FjO$cO%'_.WO:_[B,m_g?n&l(NOPrq]L!^\Njq&hP%.>ke3:jgnPQG5X/9FU5mo#TDmuH;-aTJ"P_ET-Hqm;5m0(m;tl-V5loU)F1)UI?j"!Hpi?q*IAIYiTaA&peT88sMq&<bE*5ud3$-ZuYEBGH.bMl!asB<_Kg"[@TM,06Z*L%F41T#8m?psF<]7Q?eRe'B`m59i`!&m4Ogn^Y-#PPm7/@:;CS]Z*>Ni[*8?dT,R!MI#%#!cnVrMX_Tjgoqcf,C+d!0IrAsD@=',XZSg279n3G6HguAe*n2+8W%0<'DBaX+`VR<1aY`q$sVV-rOS]dRgINoJ!6^5-shH,LmYWJ(VA?]`rPsYVd!*EER5`IL7h]cOuZ`0\"XK6Yp,UMR=!e=*hDM\c"nLJ?o;1NI$?)Dr1cMGfi%L#ZsLQK.qWX',,oW^3!I1#6BS'd`hpGbIn6O$YEnkA2^A,`J(EI:7Si*!Z!!P,VpF.J<2)f\?\F*Y6:H'=W4c60FZ<:l3b@>np$I/mT<C^sO?SjF<!i(HMF`+'/dd@lc_Zh*'[[bn$c.i'-sZTt>5ROcS/$^G@R#Nj#gOm9i]qjmf"[=Pf&I$5)>kVM,ZS>,<)SH@J&eGDf4RUS#CsCl]QRC7J(@/Y1=R4g3;1:Tl);kL'IegmID,8=e/im!78#k*i?1_I"iTL,]0"&PC-kC2H4%BsMTHm2=D&fHT-3=m#q$M;ea:E)=]oZ77+a6]II%5@RS7fDSp7J"J8$P],<0=<+W[nh%%R.M'"E9!^)Y?mQneFiBdl1+<>!,*.QcspMJ0$D=hY_4#F$n@Q@@;#?g.MjDAfg6]V_P;5CC*7%!g"Q(:60.O=,C)JKRh-%D*CZ\N"b&U8cZVc&q/ik&hJ"I&n=5RB,N(>=\4X&7rSeGW*N5_;2E`jD$&jrpAAdlOTISaUF3\<U?VpS9=DO3$dh@G*#NREf6\sE^IX1#!iG-qCFp#;+H\GOJ)Mt@M4p'HNt\hf=]9.7ko!d'.jIP&2s2WUDC\fG>rM&1B>!k<%JX)ndrb1&:rPpr/+sXPGcSlpS[^\cN8].1^>**ABC%0I[1G[R?jVMD?1W7*JHC)MCGYdSKWWZb6WkV44'%ZVW.87M-aWQb;!,:WuBn9!Q9(3pD*a,,83;Z[RK&n.V\rR',WW7>H-EG\n4C@Cq"iD[!#%*FZ`#,04V^odri;Ai074uAqI%KB:d#Z%dF;K"i5Srp(5Qu;(?[Rad5&0&W5'WV,+CkaKU#G`<:PcmT&:=-=2C:=LD>e;cU(`A3$p*&6U:^=LU$e:\hf_QFhOJr6M?JQFh#e?KU9pX-\R?.44t6DuI[0;uk$m7UPQ.fLV10f!S08PKtEUQoF)a01ju8faXR&jgrD^MWo?E2H2#d"_RKXYT)%:JS^ZQAs3/2aq$U:-;8)<&tr9ha_22p_RZ.iXs4#4,%RF0?b0#6S9D-W1^6Xh.WUTOkUpmM5T^nu)Pj2<#Q^b05KO8Oa9*+_fkf'_cgNKr1jVG:74IP-V=gS0gE?^j\!gKa\B#CQe#D]I,Lt;g`k6+LFYg%3R%XiC'i`p@$Zb,CW(h?EZ9i?R[%D3X\oS-ge`rsCPs^HBDSF&nI3Greb!MGV]=%Ce*#bnK2CEpbs.Ij]AH52G#h95V6uJ:3'>@e.D31@"P<(N2TmTVQ3i3_>b&pu.[#?jCafCC[^=BZ6IiS#MFr&Gi2\.%hUG9sZd4M$E]\gp5m^*4]pL4GkpA*u<dj#&bo<AYbY?i7b:oM#DY+trP9rUm%])>E"Fd903qX4IW6g6*DA%c*1g7\$Ejc1ZPd<NoRm+9O05Fg2PG$Z+q(qXi)6aX6mRJt0'Vr(^:7YOh^+AsA`OJdH8<S/M7^29o)"K]IX/NmY,;6N.<Hp[;Lq&^DSm,Mi&HcAZ:O?43jlNR*DO`n.Ro-C1KBtB)#`K[O4N;$uVV-<MbFP*.GK\b7/TW?F$71$T#ahr!gGG?Y^i8)a`F]9@$TYsa)U95gr&2B_Jdlgs6RWOO7C^K<)D<7G<e]rCAQMmiJiu$TX9l>2/#rJ.6NF/QOGtaPU1OH3nXt:QTBCD?Q$YW)"m_Kh,psE+E#9s8Ne(b"<osq-9hmhu]*B1ViV3Uee0=E]%>P0I!'HskVP<E$KndU87!:I+\!,Oa`\]kN>n+0aZ>_e-#ai],nm>\mQDsqn$:D>6qP12>E;FciG<LUQ)V9'd[62A^I,6<`I:R/E.2D)6/S"FE*$QK9pHka@Bnd>fh6(7/VHB>lb4V@`@nl1No/K7t\`g:%LmJ<5URF+U0.\mJeZA6=(koRf7"AQs9]ptU@*jOT5jc-r;pC%)@+Q$W@!XuAF&,-<C=kNlE+AJ)3`2C]<XhMH[#Os6Y)6q(J^`37kBDAMB+l4AO-0ArX`O'E_T^nT7<`&aSL7T#.;-2X/N,hJFrir5%?=[^1kA"pJ:_I:rk3A%.G)BC9\N6OQr?t]2hWeNPh6!]liL7GlB(jJR<V]!2e`NKPQK*^6Ak'aD=ntEKT!u!>`rno<;>mgPFn-"H:uBb`.jesJm%3]cJ94Gh1i:#i/A2)LUJ1h9[lsBGJ&Gc9Er~>endstream
endobj
74 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3952
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3949
>>
stream
Gb!;fqet4Y')p^:`;g,_eAeB\Ib8j]PrM@a9,#(glN%3A't'4g:gAaN/F3<3S)m9e`Q(kOJ1HSsVRW(cSXH&I^6qtd`ZHN*hd$8q]S#_n"V_^>k+Lq$%X7C#p"daA'."`7g6/Nd#$?V2IlKK</UbflU;]]SK6/,U_i[ne2;q5/+eg[jnO.Ckfs5b!s3AB4iu5WWVmGBE>VRbZ90LWo"&6rqg&He)Xq&4Og'M`npI>n_#Io,2]-"S^C])kB;\Vm1ELEKb>uDE661"&VlM2-'7_YDQ.Mc?\cj3_RiK=AOQu_h6)6jo>Kh!&,oBe"%CuGQ"$E9IDRBh+^19W(-;Dm9nF;]Kd=R,[@[6I0YG]cR;K\U**h.-o'Bs<pVRCceQ+G#ok&PZa(!dOIuc-6AtPV-uZ0_Z=qI3P`=Vc(#5qu&<uI@'T2ha)n6%X-3;q![00Z;jOV'WD&GH$^_QYXs&=%'+3.qf%H8Pe362?9XUWjm)#Lq([nC*fle?mfbmd0,.)MWO'.JntGuQW]HOQq!7LEI')XZAkE!5I)oZ%f?CB:P%bl@N_*!2/5*7XnXBc^FueJreL<Bp%,IZ1R6+Aep]kjg>R7*O<OWZF1*K:.BCj3>_9CfRVa'-h'X.^H^-6%X^V0Z@2+!1BCb"_A,*HcCR\>;.V+DFJ>_o/A$!L35]k!$3=gG.TECH1_`q3e]gZfMiksrfPQ!V#4I=tkMk`snM0U5#RK1YGiQk[(e46:fjh;>=no]t4h.*kZj)/$JWG<DL;kp5e$rQl-@Ec#H&Y5?,3Rug&?X"%X%MTjOR/pFdo-@SA)C^YNc1UHhNNAjLrs.%J,c_Y:=6T#U=Gil2Xa!Y*":-''&#*q8kolk6>/g2Cc!Y:fM',2+9S)EBh8QZN?bL-#2^K4.3i=Hi7%Les^0WN_ZXkQ-66-5NfU05`SV[#Se8PhA4*"bqo*!o!SNS@O<JN4S+G`")'S-lgdk'[,l?p:`sJ-OFhbRPCMY)eLl]5c(G2<:G]ID$hr&&&j-&W!(<ibuM<J^?95]G6:30MTFkmT!86`M$,8!m27n%s7fM"Ta73CuEdeHf4'da'(?9W&!Y-$!c?n+QB99\'qN>1_+MpG`N(1s,ZetjK03N+$\;hbTaRqj6]9I','4V'd9AGJtGu:7.cTS5DBmZf#5n>AVX9sks](b6kP=[S6nf&\&p:**@:dGdl^k')'L73;ORSVgr!<UK)<A8@bqMI;$a7D0^c]P8V0grQ6QjF0h68.?Ua=4\d8r"Aa:I1rB3[W$Rt6#=6hi^[!5*<OK_(((aET4GtGQ!7e`[>`Q9"f_^0kqq-L^eO8iqtK&XkBj1[Zibo_9tHA;*:".R.+^*&FTpKu$(@0dA;hV_?&_Q$E5CI\O>p?fQ/Vij0p(%Pb!0+cLt]tgNe<maS[M?UC#!u#[d+_sh'0edFM*,mG`Y[EX*hlFOM#^t.8jU+2E46k]#4ab'08(Z<Hkh>Anf7nS[C3TMO]6T(b*a7&$okfg)[t;Q%Q6`?0c;Y3NOtG?I6L_+8l)$TubDrC^a;0O=IN9el%[+D>ERnNT+G$PTj:#m9kf4(n&a;6Bcnn?PEU/nmQQL,("jC,V6.CgB+VC)NMOqZOmrqipd(&*u0<@3^DTjH;6qhPUZGhHj$Qg<3R%\7Z-*uK';2fmb<uq1?-o>(<-!(A?nUO&s1\Ku]E0ntN.!)94ob:XD-LS1qM5;AN:TndpC>=bR2Uk0'8_&Q1B#D6A(^8`oV_k!l/6-d.7*PB;p7dJl5e^$H"m*/P*h66_C\Whq\!Pf]0@_+[0.jN^A@=gRSM938b:a;O1egF;)sT0eX_gO$0X?'u,.*[5"nuk]$=l<k"?,W9M:8$L"al<G(<\_g^ZfjG:6ktO,rA,7F-8N^6IAtNS;l!rK)<1s1!ZJ:8%#TYf^Pm7!Y#e_#;Si30[2okEP#[uYT]"MOEi&TM+!eU"N#*@ReEsJU,.bFOEj,^BkJ6#8":)A!@Np,SI1a-'J\r]NbaCKHXa&`-F\/cgoOn(F,.ks$77^]*K#%j.,NXNGdE"]boQ2M17NlV.#+&`2Jj?H&#I^CCh=/K])or=rjijBl]*NqR]3`IJ),4h!B'A-R\=rOA4^rD)i*9eJ5_;V$J>$?-HH.k[g::3I#^:R?tQqKiOn6<G/hT*\q,!_-bE$'_k(@`qW:@)g\pA6QM)>E"a&cN92OM>/qB`8RgZ5AdgI.\!MN\V!:^p'V61B%W!HFl06.b(i\"pRDtto_Fc5U&B\8KuCdU'-:o3!4]%oQ(1PD]L9dfD5I[s$1=^>/?r8;F+>p+o\]_OOtr-`V9nE#V&:Pnt&f*ZMSmM@/7$#Gna!(:.56D>_@>-K/1Z=:74Q)^)Ol;<h43`NKm,Q:rQa1Ll>5>bDhUpTB35GCrP,faUO$Y&8I\0L>.1r0$c2f$e/P=npn2%OcbiMp)qdq?U2CDYHC)UpRcK-0))#4tMS"H--+hFi;Tc.LLOL\s()UFKf[dX;bAd.%'-;MFE%Pll.A`uS1(K*(q#PFCRgQt(C%&`rCjMh0a"O9.j0CpCWtC=\<@iHjd9m[.rd`FCiea8:jV^"R1X9Ua]e+^*1K2G8BeVH?nqp%D5CC7W`NrXKtO../YY0[W>8V$[sH]MH.V&21$OpH,:7hceYrnBI^u2t=E/e#U)++HNG)>Yfp?(6eG-+lhRmq#6(%<?YFkH.C8gLrXlel/<cU?GLKg+$\][&qWF!anCJ@m"rJO4?&!@A*lOn?FCYW@l_B/Pg%G!,<T^TF?dpoXSr,l!;mB5^6`:kjpJ!UbeeX@J[uLU>MW@k7-`Rb$j\fD\ZMJ#0:Jb0MUkYeel6ajVKH5KaIkhEaqkn'oDoKtFE=1OGYpPqZNAm)_@TF=9<B[@K]b`f%_5ZBK++9HL]TP[2Z@o(aNEAf^RZ,X<r\\!FYQTi8,4e2aI?,#Mrp7s2R`Nhm#l2;k;dMq(4@f.@tGV%EjL0^@-b"@-=CZ8Eibe(#/"cW_O*Kr23Ntlcgb-.!k34&A,mG!7D*/HIg5NWJbU/8Z%[q%(Fc=M#SB^Nq<:I[dGf\#`:`TgJ4\Ao2b]:A'`)I4K][Ia*iT,g;,'\]*N,In,-ig+$m[..H!%o?dBK[upIKhE+%\a'7bc1gb*(:3YBZ;F7N4iMXg=1H1Ip>,GtD7"-/4RJr5*>CXWna*reJEa>"E%[O[G2e?,;]Ba='IcNS<gefT\pN$TlS.l$D22;(ij15j#]\n,_[ar]]Ad*dH:c'diGSX925_1&$hn)L*-[ds_<d'utU&iJ!XAY=jNSC,RW3`E^6do'S8DKHaURc?%8+&h3c?b[rtm"V#,`)2aA]5gL']7C.390_8a9^:*gI92?-]18JGZ2qj!Xl@1OB/c3(jI=$6^F2j=m"`u$pn:/o9nbK?C>/,uL8Ek1-'m9CD1r0=6qooXfaq*]Y[%Qn%3-&3?'ae]p16B06m3N31f?+*rZcC)tF4o/&NOb):$)>-TRqcDgh2`R[&eLo-Pq/ki=%WEY-%Wf;1ggOr^!=;?csRkFqi]7Hg.riM=NFrL-^rr!lu9'4oN;Dlc0kq)m@ml>V+?p:ea]78R]LN?*E29G/5=)\VEhh8E3[ljbWAo&2n^)RXZj4ZfQ]8iiqmPU+7N-NeV7/P,;oXB[A#Gfdm'Qa<`VErV*0,2't&,O7E#?jV`CnF*-J9N<p]EQqF)'.55\$kr/Ni^8(9Au[I;M>bcd_Sc*)Iffi&sI50'oRVQkZZHOD8-(Ei`Fj)gjmUYl.-ce6cG*0M$d,QG&?\J^"MRXr(3Vo,PbfBp2IhQe,?bEIZ+C?UW[#[0QEqb'(_\3Z!&0EP8s]LZr4i[SqfkpE'F7V<NVHhF9'>4GsmFOPP)n_<[i9,3nBR!k5?;j0l[s(mC$VC^Dt=qX'AdM9_VU&KC_A>ZlaOj*aIh"/1PWKO)<2Q2@@.#ORifoZAHKX;KO_TDfXoiZi&~>endstream
Gb!;fqet4K')k%D`;g,_]\>j*qiT\$Y1p>>mWI9s]!hnI-to$WQ-,gNa`2]Xr=/G*-0miW/T?W@[:N6'Eb7</^)8CCj.DM6n#cXshSJuH!f@>/F&6sMLV*<MqX3G1M3@TiD+W:m""_@*092'rV60YK>+>`J8_66e*(a.0'@'Pl+q!o`:F*uF/R+#,BDrP;CNrEG8&[+V`2n&elG9PYd'RU9qemnElL9e`:4U7>+&/gYi9gX6IcR6+nS]dM;(Ti/AV-q+8QCuZZ+mWEk>R0Sq/VLr=EngP,@CP*9,>l`aO.&"`)cLE*bj][\#8/jKbq*k8C^\]Pg*^(Gs,l,Wp,hFb@nf0;TE^Wr@tU7=1^:!aAk.J9X]J>#$^>T\a't>&r<M+d3JoLJ9N*lge?WpBd/lIF)N5L-aF)-.YZ'Mh`es0G=`nR%5_2R?j$@^ruOo\>IAQ?JbnQSgCq\Z9tF87=CmuWLKj\MgpR(SntBlcX1uj>ce,#'5ApJ6#(4Q3'F[L2Z+7O<TmTX9S]h/J\U5fp2-nNbad^J/]_T.9G286RgQ6OdEiNYQMT(k<gd/?k%UZ8+Yu+qC(<+SCTn:13QpY:K(u;7(V9"f+=i`Rl7ii+OrY@]r$2:3F-1LKu)%6B0r=?"O;M8OY;>2C]agS2e)G"$MA3n(d3-lI8'h-jb[ePpfgI`#YA@\[8:DC:??GVqVKNqI?Q)iY0aOQ5U\]k@Xfd/eKe;f/QOZT=:^3A-+h0MH'Y.]Y^p`pDjL<G(eiu+1Y&s(QR*UtB+G)"#J5<QL`=X:5O6M@+o4M9crGIqSK8!M6+O@M>fCEIE+=gItgN';P?4\HlsTl@ppJ*e8KCtUl6%/:`Ck0VZ9Z*h2sKL?21E;ER2$m;^)Qg5o*6!Ps2gE6?"2780+@"^6gI(DSH?H9FU#:Tg&B.f$Q25QibFIaaE?*SH=3;%_G$mdiM?bH[+@"dPh[K(=tjGL#0oi$J4\@r"_8.RF:=R<QS03[i@26YMkLT^:BMKh>[?LUD!Itilron!?6f.cbr,hg*lFXO\#<UCNV6I?,gT)ek`o3X'T(dqm:T5NKf5GpQnW`_\:UV</3oo/qqDE</,m<V.[&@[MjGi8)k8=rE/C6<r?WGZ8__<i=_0/B)[!'aG9O=gig:6cI>7nW[r<[:c\5KB'1>3Vn#N?/X"/.sXc+^&&#[q'Uu!/OGBBYC<sO<dA2![)InCH2ai#IB531Vc7!Yfaels-=u<H?i_R1sErVaj#5KYm9P@5[9YXK-[l!+<`;3(n4m7irm9Z*LT72$=RH:P]c%5jUN3bO$XU0B>b=I"@D6tnIe%bWt>Vp,Bo1Fp7O9mliH>gf&(Ud#5e:L3,[MiP'=bS*:C5m;peuQW.;:N!XS\s)Xs^O%sEXhfOY-d]"J;ql<tFP[%USu.kr^i[i;X8Zk<JY2TlTN&d&LgWVO47>_CBNm9?aO"1k8qNShVYS:5Qs*J:N>IWTG*a.RUR+17S.aR,Zi]hmT%3H6Q?r+\f4g1j=#0I>D8SKe9p\eo>="1.>bMN2Lm\DYtYK'4>Vb8+_"V?dg5.S7q47YZB)?lkGZPmInp<!0UI3H4fQ(1+eH72nY.p^N(q'LVL$DL]F5JqV,akBWcOiF?@S_'NQ@Ruo9D'OCLd&A\cTr@+06DMhucM`g=XY=5/$.P&%raG^?Td[[:4:P#!o7R`b%Ks%?3Ot^mBm7&WA3IH(:X&7nlm*_R[!_]OS<&5QOI7,aP7QmU=KLVr8]-(RsO0BEpKF79u)D!;_*V\Kn6=7W#<4KZl5(0F(@!uaW^*^0$o':r`^Kl;f0VMo)e%_S/6eC%(_ur6HV^+TG\R0=5`hu)Q1J_Dr%Nd[dWEm<k(p(!4;uN1\-gP:li*Sf\<&Z1]j"D+SQ29/nod[JtCD#SHH?Wm=98*fsHI'tm^i:KL":;ssU_(#YpBE.ra:t$Y@ZX-V@7S-3L9>5$b9K&80+=6bFJO)'rcZ6Ud,K$(khi@iBh&cQraiiVkeALbWaKj_LWRdJ-9$.9go+V$6f"G\Vh3p!*Jud+.,Nb,N[h@apkWBmR;LEI61IcH>*I4T+DFiKGfZ@Y_8#EZP,apb/,7^jVsI4^s#;gAm[5WJNbW(U]+&^/;,@;*T$ucq5P>l/)4SrlV\4pspHP17r6ik-GsF<mNq$Y(8T7dQ/5P.c87oIu4j)3a,L:mX]OV?6S&khq1h(MlQ!eoh]eU^0b7Pj<A&$M@`!7c^<T]2Z7?k;T)T,e9,dhNPSIQ*5ZC5p7joh^6Ro7kmVf7A%[6E']ql='OdV;gT/-gXn[aZpk_aWF0S6Z%W\S?@LA*?kNIc7h(>b_*!aa+#X,n0j:=.G@#M1l^]8<0d=m9ZW(AV[iuV5Xr)/_l.H=7l$#r97"I.QUI2oXl9n-_)I&BeBd&k0pgblL/>8nOmel6,-,H=eX@#c$>#DY"]=s&Y#n.%,7a[cR=!dLpuTp.gZe=HMMh>q:.<3Dk9,Q\%*P[+d82VPN[^Ts&Y@5P[CU6W094/aC629fE[qr,d53-_]t45D^Sb2o_sOY.(WiFjiLH-SidJ6;r;Z:KPN%Y]5]si06HRB:/b]O>\4;aK(bL5g++qt\pCZkLE]gcK_F#An/+E1B;(*3/p]-MW0l[p>&An:8U\A23/.:]`:eb!*^.)ka0h@Bh'<#H4GDmC$='tU['p;Y(XL(p7oZGp\`1f5]&#e:jo\0c#G1YkI_5RR!S<YLFJ;O=2`t_Kr,(H(0e=2X#MSjX^%`Mh!IgkUG((Lk;+m\];1<-Ef4P0CLH+e:']UoL0TB]lc<Ct3S^?'T^*4ebkPf'Y\2hlPp"Y&E1eglTN\n5BU.I5Eq]\90%E_V`^^-\GGeg5H'+MpEg&[`ZfX;HJBSp!=Wo?Hl:A!S.Hc8%%^fcIAJ9,A^Il@a<fj"<^Rmi(^5GqUhCaQ0WHl%4l`Mq0PECt1.[esG'P&/e63H5]JI4eH.Jhs^nB)RP$emIr@5i8*n=?428n?g.AIJ2UM8D5RWa(*4!gra&h!F0.OnWL$Q):1kVibMf>()h'sUne>@6nHUEV^I<iMZ_fJfAGNsPHY.,Ql^/poZoK'c0l3+;?9[iR[0a1:-6upA6j?q84mc@[t;Ai@TT8lOT9AcP(F1&[Mr;5-*(`bEA)Zu3f[HKB-e.&NkW!nP.7Ye[NjE"L#%nq7l9B+%uHRYOMD\XLE=4BJgH89;2Qb?B=lW&;]smJlnFU"lZnOZ]dP92RI^j&#FP,\qi!=Xi)TYSR)BfF%QLH.fLp7'i+Y/GqZS=H36lR[0>n!=?6Vd6ZXM64jqCEEmk-ss-o+HMH*028,,JY%fnegqTE.bM6]ob*kZQoIB\%>61G?c.CQ#s>oG"PT6V97ZUMZBop(s4&ANs7uD_J;3c8]j@J>P^>rbksn52W2@lZ]TF.=Eh]U9=NP-5`D#^%m4Rq#S0h()23!7o"-86;FXb#*N'$4f+k9>1m=lo_984/Gm#U0qVs&^aSZlVDBsFm`,f3$&DLRaq`IEX/(6=Pec/Z$F#/:?K]lR.'O2II7`U4m3`H7/7^K7'@$!6G.:QUlE#W7k')L%Em_%U;?Y28lM/[,796sSNi@.^QA4BIRm9,XE3Ym0)0`7UDgF5/>((9;Z12S]`:qq35N&='WX[:I7r/CdC.2bVL4;U,XNZ,98pg1C.]V[gMi%ac:1IO[39jI%c.M3EoSY';I/$=Pr/Ni^8)uM0[I6thbcd_Sc*)Iffi.=o50'oRVQkZ[HP7h5(Ei`Fj)gdk^#/nG:GF]:"<HNh77tc8Z.?;:<Akkh;Rp]&1A,tTJ1I3J,Z-p;,XB9\qV,BBrkc'?gj]o4q;=\^N>M>FM]4SUV)(0EJD7+`D0Lm;!dU9dqha4-J6>X@\U`A"ehK&(FRX&r/i.(\2V!u`8X?M-Q3m61h0GE?7Ro6*"*;fZL8IS/k1H=FP+a:I$=u^;N"OB:C^VWj"3e-&&-~>endstream
endobj
75 0 obj
<<
@@ -470,74 +470,74 @@ xref
0000001115 00000 n
0000001263 00000 n
0000001341 00000 n
0000001489 00000 n
0000001638 00000 n
0000001787 00000 n
0000001935 00000 n
0000002082 00000 n
0000002231 00000 n
0000002380 00000 n
0000002529 00000 n
0000002678 00000 n
0000002827 00000 n
0000002976 00000 n
0000003124 00000 n
0000003272 00000 n
0000003420 00000 n
0000003569 00000 n
0000003685 00000 n
0000003805 00000 n
0000003911 00000 n
0000003995 00000 n
0000190500 00000 n
0000190706 00000 n
0000191071 00000 n
0000191277 00000 n
0000191483 00000 n
0000191689 00000 n
0000191895 00000 n
0000192165 00000 n
0000192371 00000 n
0000192577 00000 n
0000192783 00000 n
0000192870 00000 n
0000193206 00000 n
0000193281 00000 n
0000193379 00000 n
0000193491 00000 n
0000193608 00000 n
0000193783 00000 n
0000193886 00000 n
0000194052 00000 n
0000194490 00000 n
0000194633 00000 n
0000194768 00000 n
0000194944 00000 n
0000195062 00000 n
0000195209 00000 n
0000195349 00000 n
0000195504 00000 n
0000195645 00000 n
0000195783 00000 n
0000195899 00000 n
0000196031 00000 n
0000196153 00000 n
0000196262 00000 n
0000196358 00000 n
0000196483 00000 n
0000197480 00000 n
0000198776 00000 n
0000199007 00000 n
0000199238 00000 n
0000203066 00000 n
0000206800 00000 n
0000209848 00000 n
0000214126 00000 n
0000218170 00000 n
0000001488 00000 n
0000001637 00000 n
0000001786 00000 n
0000001934 00000 n
0000002081 00000 n
0000002230 00000 n
0000002379 00000 n
0000002528 00000 n
0000002677 00000 n
0000002826 00000 n
0000002975 00000 n
0000003123 00000 n
0000003271 00000 n
0000003419 00000 n
0000003568 00000 n
0000003684 00000 n
0000003804 00000 n
0000003910 00000 n
0000003994 00000 n
0000190499 00000 n
0000190705 00000 n
0000191070 00000 n
0000191276 00000 n
0000191482 00000 n
0000191688 00000 n
0000191894 00000 n
0000192164 00000 n
0000192370 00000 n
0000192576 00000 n
0000192782 00000 n
0000192869 00000 n
0000193205 00000 n
0000193280 00000 n
0000193378 00000 n
0000193490 00000 n
0000193607 00000 n
0000193782 00000 n
0000193885 00000 n
0000194051 00000 n
0000194474 00000 n
0000194617 00000 n
0000194752 00000 n
0000194928 00000 n
0000195046 00000 n
0000195193 00000 n
0000195333 00000 n
0000195488 00000 n
0000195629 00000 n
0000195767 00000 n
0000195883 00000 n
0000196015 00000 n
0000196137 00000 n
0000196246 00000 n
0000196342 00000 n
0000196467 00000 n
0000197445 00000 n
0000198739 00000 n
0000198970 00000 n
0000199201 00000 n
0000203029 00000 n
0000206900 00000 n
0000209907 00000 n
0000214268 00000 n
0000218309 00000 n
trailer
<<
/ID
[<9ce023989e289f6819633476a5f8acf9><9ce023989e289f6819633476a5f8acf9>]
[<404b22811ad613ffdf97db81a4f6f62b><404b22811ad613ffdf97db81a4f6f62b>]
% ReportLab generated PDF document -- digest (opensource)
/Info 42 0 R
@@ -545,5 +545,5 @@ trailer
/Size 76
>>
startxref
218986
219125
%%EOF

View File

@@ -208,7 +208,7 @@ endobj
endobj
33 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115603+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115603+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184401+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184401+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Android Cast \204 alpha priorities \(2026-06-08 renumber\)) /Trapped /False
>>
endobj
@@ -300,10 +300,10 @@ endobj
endobj
51 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 869
/Filter [ /ASCII85Decode /FlateDecode ] /Length 882
>>
stream
Gat=*9lldX&A@sBm*Wq6's5gf*7M:Z9IDtK@=$(M#!!i:^ql+-rd@kXR#ftRGd,R<l+MMWg6I?,l,!5pS-"'EiT_0Z"b]N6aWuO`n1C0Dcg]gcWL3AoQXGb\g^>CdBUEdHGfg-N"e$APQr,&h#fXuG3,rTN5a[]@!N;Lp+e/REQm]Dj1`jXj^Wtg_:L^hj2C1Hl@3AaU?R&Yh8R<ZR@Q3d5GOlW@IQeH(X4#n6Ge1D8n.!6-=S*KQJU;_:3MDS7ed9;Mcj7O4k_."+edZa#:nY>a\:aTQ;J_9*geV%UU29/9*mou.&WPk1n4g$i4$i`XIgVqd@Q-K^&=J/rMO4JmOFje]FCAU'8Y#3_jp8\>%]]m^%,2!*O#%%(&=_^mqA`geSC]hQ&ECEGM$`\;`"E%$(Nk&YV;udN0_n+86$;GrFl(q$Fql+C,ZMi17stm=Y@pqh!HT(EC1+sp9(_-JZ"rj?.UVeb<RLY`#'Eu/)-ehi/D>L*l>YiNE(ZXHg^j*'fd(id>kf2l3$QmH%`;"LUQVE>*0nF<h4o2*JTdA!dB+dOiQ`GKBc\YFjEZUbdk.-OJ=I\UHkFo^D,7*1AVU)q"E1RnO7pK&1[)?^l.i7tP:@T0&5J84@sQL[:+&dl3f`fu_JV7VJgZ?3C]7S82CkL!>b@[91B4qiMo*20['c,6b']8,+7t&P0jbcskf,Ak+264##6*tLrj4hWguf"clQP+*i4X$bRFmpJJB2":\jN2<F8(=T&8tE3%huAfdt=#'TmI($,%M3->D1TqGTC(<=UbG/fe/`2m62Fqmgi^T1hro8a/4*LObcKEYT97*!Rq(/cV@4`cS5!*rtUD?7)-HXc4R4P^G!Fi00r-e\c~>endstream
Gat=*>Aoub'RnB330.dM\3@nKGg*aBlP+&KK(`0C@`<&\!i,r[p#"(B-!Zat&<UAZF2%*JHu'l-C*"q`:GKX$+0KJnOFb.LjFi.MK,]=42Sr6a/r4TQje.h^eFC&b))7g;F+aY6nK_*e&1*^a&[LS^iP_9)"b(8]0L0&@0P1b"73"db1ibg6nMCQY1^`2&f];P;R"A_RIL0DQ7;3P!Ol!mkf]l82q72UOUko'7m,?q*r)`A@@FAaE!Sj/W?P!j,W.PWq4c.N+]0SDECr8LWO%C%n'/LK_An_\)/sXq7SBcS3T0E7Chu0)&q0+b*&r2a)4WYKmRB&r@RL7J#feuEcN:#]>Bhp;(&Ves`$r&2u#+]I1?5cT9<'$!+dig"\L[J9<k](5'*+F&\=.[=QO7PDF-).$@ge\F7Z:rpN]?*`-gSL_-<4C@Z[9q'Co<qX7l.+`b6@jegPijb#%T\;O0K7Cfid4!HHh"U3C`8fZq+I0I&Bbs@8Y.7_>m<m)q9[+>SHn"#H"q?Fom='&dc@puB5h@AX(lSlXtq*Z``3:s]XtOtr#K[J5)=R`Q@mX?Z\O%#L=%c&)A9i)9.'nYLF59V"D)`A'DAG&h=I4j1H:POIb3_6r&AS43-VIAW/,dUKS)(faA6!eiP\T&HA1uOe!j'm_h1nW216r`S`Gl^XAA>40`O2_P>&_+k%MjojQR^!5Ks.M6sQV!0`=RUS:<=H%/eperGd6Cg!:Ba8eGnIBPX%p'H8M,LhuD('X=+Np'4;(X\iC4jOG*tJuBS2>6n@VGRM?'K[W7I%DUV7<=%Z#]4_thql!u;5Lcc+PXM7(e`J08,:X#UZ#b8<7"/I7NLCE=,3YKeQO+iIh6P!>,@!P3>_:?f%>TUp~>endstream
endobj
52 0 obj
<<
@@ -408,17 +408,17 @@ xref
0000210167 00000 n
0000210263 00000 n
0000210373 00000 n
0000211333 00000 n
0000212289 00000 n
0000212519 00000 n
0000212747 00000 n
0000216613 00000 n
0000220302 00000 n
0000222986 00000 n
0000211346 00000 n
0000212302 00000 n
0000212532 00000 n
0000212760 00000 n
0000216626 00000 n
0000220315 00000 n
0000222999 00000 n
trailer
<<
/ID
[<c9bbbceb6da4cf0561df83389636ce40><c9bbbceb6da4cf0561df83389636ce40>]
[<b4a5459a21f343b61a7b0263c08d166f><b4a5459a21f343b61a7b0263c08d166f>]
% ReportLab generated PDF document -- digest (opensource)
/Info 33 0 R
@@ -426,5 +426,5 @@ trailer
/Size 59
>>
startxref
224840
224853
%%EOF

View File

@@ -203,7 +203,7 @@ endobj
endobj
31 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115603+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115603+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184401+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184401+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (BE services & infrastructure \204 validation map) /Trapped /False
>>
endobj
@@ -385,7 +385,7 @@ xref
trailer
<<
/ID
[<8dbfa9f2eeb85b942477caa11fa4018a><8dbfa9f2eeb85b942477caa11fa4018a>]
[<c8888297d0e8b40c8bbd955e044ea1a1><c8888297d0e8b40c8bbd955e044ea1a1>]
% ReportLab generated PDF document -- digest (opensource)
/Info 31 0 R

View File

@@ -137,7 +137,7 @@ endobj
endobj
22 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115603+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115603+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184401+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184401+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Stream dump \204 developer debug recording \(FR 0.1\)) /Trapped /False
>>
endobj
@@ -193,10 +193,10 @@ endobj
endobj
33 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 856
/Filter [ /ASCII85Decode /FlateDecode ] /Length 877
>>
stream
Gat=*a`=.1&A@rkqO")$MHX\E@qNh^:$%P*b/kI>a9a9t*XkX%n#+"</7W1/@9Z4'p\K$5[30F7YkhYE!8i16]gk<grYeTg$2t&)oOiYdpbbr!VHq.e(h4D,4@qLf1[YT?3PZV1F5m<X8pCslH^PHn*o%V%@r`^m<Tui+dXfsPk<bBg&)h8cB/YPh/E/64KeO(lGIpGU2PYbOMAOA#.a>gYH%G)-r=a.)bNis5hn[!XH'aJs5LOUH^IG(=rJIAJ&c-?O^VePb!\?^4*:^>p!PWZkY,2*W2;2/7"hU;#f(oRR.DpgS.REG&g8-o1]!N"Rqd@:)'':TOp6\+f`152BL%PmpQ;9Y5n7,s174=keegQ!=ft2piSEJFhnB1@8c:*R,k,jr4!4Ss@nc(YE:1leV]^"c`R]':[<G11&a<J5&:KA)XA<N_%K_[X\'Xl';7[F9C&.3VO35i8C]-;`!ZOsHI5b6tM!dErQ$$MrL35+mu)j@00pQL#dG#=]u(OcBD%S/I@e*roOU7A#G)!(Xp4ed/3"$sQcSC>M!d&e[niINm\Lsn%]8#n'>9_U@n!'*44krboEgQ#C:b4PFT$-qU&(3DlT;>tjthfS;=L/ANnA-aPqBT\@EdHSU(FI-ppA0CE,h5R27dT$n6,_u;=4$rUNrnOY_'<:`M&anQKI@Drm(oc_"dVGJ(dDZ8Q%OZ_\S4Mc-"r<J\[gg"!c!(9S6V\2X2hnb41h>^UTP`Ztb3OSj#%K\*di``;Tc8[O+Cp+D3XDX[X"15?TJZQ!.WL613nD>MG;P;JBlpUdZcks.US6T=%S`#KY>_c-%*C:5?.sIU@LCMb/s]QE\"Gg:!4..b=+Tf~>endstream
Gat=*gMWc?&:Ml+b[Xg*Y/g;=O6uWbX]fG.cotI0fK`W?!*MY"lJM%q9"8\(+<lYpa61[7nb@^Ol+uA'*W]NVE,ged!o*sPA.m[E\8b#g7ef,E.].(%,oC,/[i@t!1,EeU93K%]7rr/B1J0V>+ak:A-gob,E$KBH!*/GRLtmR4"Qr+8h=Y2=bL41a^u%O1GS.fC+++:9A/1p4n+YrRdU8ZBIMfi9bP65fSDhZE)7UdHT#7?q7bSsKfr&1%;jDgNdEr6e[]SFrC)[39ThpbohJj(dgGFaPOC,0$rAo"t2jY&Yf1upl?E\:MT'f_AQO5f".DpgU$;'mkg87PB_R'k9HY:L]*+gX/G*kP;`IuTP!/kpXbb&p7i;:NuJl"eG/Q)F*ZZ?JY3R4[$iK_H/XcjCFc!)_G!Hq<fir>93S^qs6H-t0F2,UNAU=,QKR>&KJE$_2E-9:?iR%M(R->5-cd<WiXKYm*t%^GHkEg+0aBoc@kTT6?(L<G8eHg@kCF*QetdjIp#mV2/.Y/;MK0)Piim#YrdVr7mJUDZW,hoj_P]1;=/#Pig-iUjB:FR-bW\G+Pl7#<!<_YK8nL3r2#J/k0UAE"?S*V<I7b-^ni$.e$*AopM>@J4j!hf/!3nA@uMOWb^7Tior^7Y_Y\P'+3*if:rUG))5e-hC%H`#3)mWue8Go4Po;4f2Cimc".:hiAAUKoq8\-*;?:7opN%]0#PXl9rd%QS9p`]PcYeDI+8a)fgHW^G454U*@da"a(K^:eh,R<#F)7QjTN+#[JTa"!K1JeNd4o>tnHJ!i=Sq<fYqJPd*Cn\t`uh9V[U/RUnr4)@c)BF_Eg0J"N1;@SiA!B[aC?'N9g2EO?c2>_$]+!f[*Z'>T.+~>endstream
endobj
34 0 obj
<<
@@ -269,15 +269,15 @@ xref
0000004408 00000 n
0000004495 00000 n
0000004591 00000 n
0000005538 00000 n
0000006205 00000 n
0000006433 00000 n
0000006661 00000 n
0000009980 00000 n
0000005559 00000 n
0000006226 00000 n
0000006454 00000 n
0000006682 00000 n
0000010001 00000 n
trailer
<<
/ID
[<cc05b2c62200d6b1af79eff88bcbad38><cc05b2c62200d6b1af79eff88bcbad38>]
[<a125ae6b7447084fca4feeb4ba295cad><a125ae6b7447084fca4feeb4ba295cad>]
% ReportLab generated PDF document -- digest (opensource)
/Info 22 0 R
@@ -285,5 +285,5 @@ trailer
/Size 39
>>
startxref
11278
11299
%%EOF

View File

@@ -275,7 +275,7 @@ endobj
endobj
47 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115603+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115603+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184401+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184401+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Android Cast \204 exposed services catalog) /Trapped /False
>>
endobj
@@ -443,10 +443,10 @@ endobj
endobj
79 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 862
/Filter [ /ASCII85Decode /FlateDecode ] /Length 855
>>
stream
Gat=*9lldX&A@sBlnQaAMH6?gFOR&7NXq+DHg6;>E^Ic2$J94pI0BcF;&b.C!=`5G[nj&18I3g0=FSj6^aBY1*tXNb[fI12J@C&UDt\O4mj!N3b)oYRes]G'$B)6&664&l#Jsb8[0&fijpHe6BkBBqi'r>8=VhKC(+pFS*$AgG1WliU$fGb@#AFeTE9Cjor*i?Pq>6Uk-@j=9qf$C-=SoYD9qFP!pB'2/giOF8i(*Ya'<RA;7^SuT.YN9*(X7f<A7M=j#)3m6$b3c4TrV)iA%BZE_Yj:4qq_/(0_"ZfM(9O?9\iNVL"CA_&1obJN\3c0#:RVFJ;p=5lsLo?M7A(UBpi8DO=;,-$)rL#[H/s2H46Rh`fQ?[5ejEuoK9I,$*c\?X"N?GkBZklJJdN$CQ*gCAeP!U^hbC%QBIP>rG6"e$'i'bQAPAJRVd"!P>EG8'\+MR5Q0upoU+CsU*p5C6Ce\uZ0cMEbFau?`*=pfNcSESo8OjhfpgZcXup[D`2UYf2#Au5jaCJ1"l)'[<DO+B?#$C1aDOQIV*1Ps\q;`,)lUke=;9paPQ]ql>Ygd'FAJYY+JoB-\adl02Bus:lMc5cJ5;cYb3Vh@k&9G]:$7O1&FQ9D#iXhMXn#=>3h86hiAF?$;NkYoJgZ?3F0aXk-I*caHQAf,14O2mc`tagm1Jc)p3i>@LM7q!h5/^U^Y%i]r&L;C;0+'!^KXg*-JCB):,d#!C^iBj<88AF-J"7n(PB/Q2CQ$:EZ9u*5]hWT*JA/=U4X!dJp.d=V5l,I7\J,YC)+7r:Hd=M;n"T;MC<SNY$.P'U/oWZHcN!VeGHf08d<Bp6-!lU9G33GPh453KNiCVM#al3G>="D~>endstream
Gat=*a_oie&A@rkk*Q>Y_r3'c;qEI%jH<Wd.6o%YFJ?R6;FsWQ^Fq$+el#_<%)O@0RJ5i`3*[#nD-6b?&qI.d>i-_JK4#-:Lk+Cn(;]A3$pQn/,g)<MJC^/cmL+rZAjSZ#,mV;87C<@g9BHV8r-;m7E?@Y;OOt*Q:q@3s\H#/<iJ_em%jJNn8Y\D+,FF6T#u?Lo0Rquc_F.4fr&nAS!`i_IDR/FY&A1>K$!1C:/,7u06_Y;.fnbq.I>-&:qk?*545&iigVcoIE!I2gH'SH*9MpN9f5gENpg_$?OsI&]%4I@-0MbbBg()93=gc@KN:$"bktN1W9?ZZ8L.p928B;7A0.j);[1B$fHq6[ST\n?LHCEMOLKL22<Tik/e%GU[6k&Zf)i&uGPm@29f@WC'>=r'.oh17oqk>PoIofp\fc71@PXkpGFUn"Q\Cm;lEuXKrI:+PS)\EY9!H5F.99tX+b8JfDRAFl/%b%ZW0\bVL&,\/-l>StTpUH$coX+*D\8ad6St(O\DSjgoKd\ML97&qmoDn<H];!Fh[0+"jj>>Z&6U&VdGTEub9ON1B;%jMi';&Qa<HXcCHWBA1GqX\DT#oEnRli;f:</jLSX:h^-3G.&aVe9JUK2ItELamMSiu86-jBfM:;ODU[7s=u6M^.06MG$id]?bQ>O@m^gct2pF[eKjKsVAR?N9NN^00C?rm"<.43;ng?s/n2gH[j<[,oq\3C;f`$uHYnaP=\+D5%K^mst<?UH9%C+B/T>)MI;s7"aD<"E3Pib,Q%%oPV&VDZ<S[p&<So9q`a<4fiiZd/m/qkkDc+djOGPhJ<pZjI2`S%pgT>7.dK<jTWLYGb%0OffpCGHaE~>endstream
endobj
80 0 obj
<<
@@ -579,17 +579,17 @@ xref
0000010727 00000 n
0000010827 00000 n
0000010937 00000 n
0000011890 00000 n
0000012947 00000 n
0000013177 00000 n
0000013405 00000 n
0000016973 00000 n
0000020036 00000 n
0000022964 00000 n
0000011883 00000 n
0000012940 00000 n
0000013170 00000 n
0000013398 00000 n
0000016966 00000 n
0000020029 00000 n
0000022957 00000 n
trailer
<<
/ID
[<82e09bcb7eb13164861aeba124022201><82e09bcb7eb13164861aeba124022201>]
[<843860012c1ff53a10f0f6db06b7b5ba><843860012c1ff53a10f0f6db06b7b5ba>]
% ReportLab generated PDF document -- digest (opensource)
/Info 47 0 R
@@ -597,5 +597,5 @@ trailer
/Size 87
>>
startxref
26415
26408
%%EOF

View File

@@ -203,7 +203,7 @@ endobj
endobj
35 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115603+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115603+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184401+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184401+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (PostgreSQL, TimescaleDB, and platform DB adapters \204 comparison) /Trapped /False
>>
endobj
@@ -432,7 +432,7 @@ xref
trailer
<<
/ID
[<b40b5ca66a7183c90ac1aea1bb523033><b40b5ca66a7183c90ac1aea1bb523033>]
[<2b4ea795a3eafae8f0a1687ff9addffc><2b4ea795a3eafae8f0a1687ff9addffc>]
% ReportLab generated PDF document -- digest (opensource)
/Info 35 0 R

View File

@@ -183,7 +183,7 @@ endobj
endobj
30 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115603+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115603+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184401+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184401+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Android Cast \204 alpha release & QA) /Trapped /False
>>
endobj
@@ -377,7 +377,7 @@ xref
trailer
<<
/ID
[<b351513c4424db373b9ab2ba803fc31a><b351513c4424db373b9ab2ba803fc31a>]
[<a1bb3528715575395984a9e56cac3d09><a1bb3528715575395984a9e56cac3d09>]
% ReportLab generated PDF document -- digest (opensource)
/Info 30 0 R

View File

@@ -122,7 +122,7 @@ endobj
endobj
20 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115603+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115603+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184401+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184401+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Alpha soak checklist \(LAN demo\)) /Trapped /False
>>
endobj
@@ -240,7 +240,7 @@ xref
trailer
<<
/ID
[<62ff1d8c69f4e2aa7b4e34c69a669dbd><62ff1d8c69f4e2aa7b4e34c69a669dbd>]
[<56ba28bc6bce8a5575ae2af5af849659><56ba28bc6bce8a5575ae2af5af849659>]
% ReportLab generated PDF document -- digest (opensource)
/Info 20 0 R

View File

@@ -244,7 +244,7 @@ endobj
endobj
40 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115603+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115603+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184401+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184401+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (AV quality enhancement \204 Q&A session notes) /Trapped /False
>>
endobj
@@ -512,7 +512,7 @@ xref
trailer
<<
/ID
[<8790530eb11d5413e4389657b86cbd98><8790530eb11d5413e4389657b86cbd98>]
[<807be605cd332c3cba4a4fb32bee7229><807be605cd332c3cba4a4fb32bee7229>]
% ReportLab generated PDF document -- digest (opensource)
/Info 40 0 R

View File

@@ -137,7 +137,7 @@ endobj
endobj
22 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115603+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115603+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184401+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184401+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Android Cast build ecosystem) /Trapped /False
>>
endobj
@@ -278,7 +278,7 @@ xref
trailer
<<
/ID
[<bea06f961b571b40c7cf4c938ad3324f><bea06f961b571b40c7cf4c938ad3324f>]
[<782b8b6b2e2de5a5c890646ee688b252><782b8b6b2e2de5a5c890646ee688b252>]
% ReportLab generated PDF document -- digest (opensource)
/Info 22 0 R

View File

@@ -97,7 +97,7 @@ endobj
endobj
15 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115604+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115604+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184402+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184402+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Commercial features \(developer-gated\)) /Trapped /False
>>
endobj
@@ -192,7 +192,7 @@ xref
trailer
<<
/ID
[<d086ae4cb3335d3ad3b7f0baa24fd954><d086ae4cb3335d3ad3b7f0baa24fd954>]
[<b8a503515f47fea35addb78e473ea3db><b8a503515f47fea35addb78e473ea3db>]
% ReportLab generated PDF document -- digest (opensource)
/Info 15 0 R

View File

@@ -102,7 +102,7 @@ endobj
endobj
16 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115604+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115604+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184402+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184402+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Anonymous crash reporter) /Trapped /False
>>
endobj
@@ -198,7 +198,7 @@ xref
trailer
<<
/ID
[<8fa35525e151cb86fcb8749d7347816b><8fa35525e151cb86fcb8749d7347816b>]
[<9e6c7b1c8fc2af2d3a466413305bf053><9e6c7b1c8fc2af2d3a466413305bf053>]
% ReportLab generated PDF document -- digest (opensource)
/Info 16 0 R

196
DEVELOPER_SETUP.pdf Normal file
View File

@@ -0,0 +1,196 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 10 0 R /F5 11 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 12 0 R /Fit ] /Rect [ 45.68504 762.0394 116.821 773.0394 ] /Subtype /Link /Type /Annot
>>
endobj
6 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 12 0 R /Fit ] /Rect [ 45.68504 751.0394 119.045 762.0394 ] /Subtype /Link /Type /Annot
>>
endobj
7 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 12 0 R /Fit ] /Rect [ 45.68504 740.0394 129.277 751.0394 ] /Subtype /Link /Type /Annot
>>
endobj
8 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 12 0 R /Fit ] /Rect [ 45.68504 729.0394 99.48504 740.0394 ] /Subtype /Link /Type /Annot
>>
endobj
9 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 12 0 R /Fit ] /Rect [ 45.68504 718.0394 65.24504 729.0394 ] /Subtype /Link /Type /Annot
>>
endobj
10 0 obj
<<
/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
11 0 obj
<<
/BaseFont /Symbol /Name /F5 /Subtype /Type1 /Type /Font
>>
endobj
12 0 obj
<<
/Contents 24 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 23 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
13 0 obj
<<
/Annots [ 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R ] /Contents 25 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 23 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0
/Trans <<
>> /Type /Page
>>
endobj
14 0 obj
<<
/Contents 26 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 23 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
15 0 obj
<<
/Outlines 17 0 R /PageMode /UseNone /Pages 23 0 R /Type /Catalog
>>
endobj
16 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260626184402+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184402+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Developer setup \204 org `ac`) /Trapped /False
>>
endobj
17 0 obj
<<
/Count 5 /First 18 0 R /Last 22 0 R /Type /Outlines
>>
endobj
18 0 obj
<<
/Dest [ 12 0 R /Fit ] /Next 19 0 R /Parent 17 0 R /Title (Which repo for what)
>>
endobj
19 0 obj
<<
/Dest [ 12 0 R /Fit ] /Next 20 0 R /Parent 17 0 R /Prev 18 0 R /Title (Local PHP \(optional\))
>>
endobj
20 0 obj
<<
/Dest [ 12 0 R /Fit ] /Next 21 0 R /Parent 17 0 R /Prev 19 0 R /Title (Lab cluster \(cast01\20503\))
>>
endobj
21 0 obj
<<
/Dest [ 12 0 R /Fit ] /Next 22 0 R /Parent 17 0 R /Prev 20 0 R /Title (Mobile defaults)
>>
endobj
22 0 obj
<<
/Dest [ 12 0 R /Fit ] /Parent 17 0 R /Prev 21 0 R /Title (Tests)
>>
endobj
23 0 obj
<<
/Count 3 /Kids [ 12 0 R 13 0 R 14 0 R ] /Type /Pages
>>
endobj
24 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 337
>>
stream
Gas2E>>)mg&;B$9=.I;\36gMBl)SXt<,gCOP9@0c>nBZ\HMRLdF^=>X&kL)KcM8eqW3gg'f0+'j;)Sj6Lg.)0MqFbaMq8+S.]jp;S?`\<;Ppb!0;VSl+126V#CAh`4-T)P"0Jn-fk@V5g8'<Y.7pE-8chPRXt4)<TicK1h93%k7_Em4++$+`/JqCJ%.Q>lQu&uqn[+khnJi?dZNPZHemHdqaW7(s.BYenoGi)HH'3?B.)4!ebUNj$'[8W0=P!4hHaTkl*cL@h\"\?CKCob1'@K/nNa+hYRDn4Yr$KP*+WFMD%j1A#cP[l9kmb$F`uHGWJl0D/5d:"bPhTr-~>endstream
endobj
25 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 504
>>
stream
Gatn#6#W5H(l%MT(%3m5_=_GN)g\#H[6pgre_Mj?.RK\[Q/E(7jmUNWW7orF:_d-M')qClI.f&r4:W:%eJ@pnEIC>"!P8O^/:h(L\$OsJ3`RMaku@0U`Yc^,QGi7O1?5?q8qP/YF-D1n-*i3NrLChikljEoFrM=Y`"6B#b\an**;g_?DgU+0i<o8pm"^/j23)a*c/6@(7m%q84/A#<@oHGJFDg9Hp)OX4ZCep.Z:j^(^+('9T*d.4Ib32c/XtkP"9k3"9VG^bCA+?F?'M;1cuW@tTt-[=,2SN;ZQc%?WfBr$EpIc'9ZdD#9<kT,dtjMc_eC6b/^RY?dSiG2;OfL:GWif=@d5?V$)81V?::oB^[EXrKA6<N^A(Ueh]D6-qbXNa'B0`E"BQ&#5uY8=!=.LFUM`rahVh8t%^$3'A"jS/]:JEe\/$_X-4FHiD1!/PRuWn.LlB@>q.T\HC)PKuhnq[,-tsNpn`5C5MC9KlRL<@frl;kA09]QD$3~>endstream
endobj
26 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3264
>>
stream
Gb!"sgMYcep"`tpY\86GeDaIB,o>4NG2sp&f5W?Q(I_UH,B>%a+Z\<qd^&bsDsnS#6rBaJBiC[D*-j@skC+e$d-sP$s*"NpWu7ip3p6dl(8)2&!R,Fi1->C39[?KE/7gfHZiSgSO^aa=!T(_2]Vq1$%)mg$!4jLAD\8]E,7.1>J+sY&f01K("N4Gg+oU.7R!h^!VPe_oN<tYSmDUSpR3U4NLWT2+e)]rKVsE)5G7u9AiN\_V1;Q^=rC>s+@R;A9%GKh]-2hHL<\j4`J!ub0L*\X*^?9USGX18U](^lAZ\%T`QWD,'UgY\O>Y'g_cjRRu*f#1I)k,^*+2Mrj7O4/H>C&"`4prh3qf>M!B*BH,M/aiSE9Yj290@ElWXJ4U7:CS#&Fa%Vc1j40&VktD"]-K9J@UM4+c0G:9A!S78YDS7#oDGS/^I@.`S`,[&rp@KpsW^[JCE\17(A=;`JUep0oLGU9`<!j'(;@aUL`e>:7heXA!)41`(H`^o++(%cT`YPMYr&f>I&13r'2uQh3O4B5%#5hJNp6)NO8H'Z]kqLXmu9&d#'mA=;%M=4&u9^E\TC>e')g4>__Hl`IXKXl+1E^0FI!,l`0^X[dqe>UaZ@;'@nZH\%9WlZ'`*+QEF67.GDis/JAh>4Oi^0.(3]G#J*l&.'M;+,]p+)\hSlPDB^]8]LA4YV`6K^S'EE2^]DqLMd(g2jVG/S"<"[DJ;a^Dd]@.WfFL6U7gB&*XV3+kN.Z(H?cU'$(>lPCp<+p[,=WH:F^leSR&GBg1Sbfdc($_J0MYpJP#KeDV1r\46Z%&\i!8n,a.@O';hJD1+OeFRDChml;LOImd,iKhi"AI!R-Fh3XMW#N'sP6(q1E4F>-T2pdls)qO$Y*kJ-le,-k?dq"iG"ts5CZo2o_dRArX-YQ*[cQ=HX]PpJS)(Ia8Z,3RfO0/3e8@)u1bF3Mdh"UAFD3RH=lm3o;;b%%>3T7=l88$HC=:I/2D\O9LAE^jG-uZ6>%%K4Ldr>oL^hr47qbbrD$8pRFW%d=K+8oMH#@fujhVK8-\e:Q,UTnZi#:4QdYa7Ha/ZFa8BF/q*F5MG$\HL;a.4E7KO<O`mIk`#8Pl.d$=pah7@Yc:960OapAJq\="L(pJaY`W*5H.<"tE@sE+&qXSS5=N0iuL6NdGH\(*WX%Tt[haXq\(`Sc8;<W^1<g5[[Vol"s30r)*aW)PH4Rmg.$`d<<qfXrNXHIifmlEiCee.b`4Ph['n-*\VlI?#*kXA?Wl[)bdn/TD^)=+96Uq8+YZ+Qa8M-*RXoAQEm>#sAG0q'kPV!li[OWV2.jP:OVlp_&.\dpo^BX*=1q63OR@B.ooV+f[Xl0mj&G>%'8.O1S!+uA#4\g[6I%%&1uW(l4SWoGHNVHd&8Vt]NGB_=*XMm?+)Q.l`Cn+ceQ9Gn`A^s\qUq=+@lHffJ(aT\/;?S6boVH[5H6ehH@WuS2\B`TJ@_<Mdgb:RQ)W`uta[r>X/_V]AA4-JkE0$>h`Rga.$\@mU=hI+4_XKmDX@KRRRap,#+%;`X+)n7@U[V;n-]M3B3Y[NJHj\)Vs73T=iD<!0?ZPD47)Qgo0_:VeIr4o#bSR*Dph9mTh?6N]"oAtq6ju;tT9%JJS3CLgY6(]N^bP?gq\)?W11rN"C\:#.hYOriqL1,_X+Cm3M*C8W&&?dL[*G0\OU".0STn1<;F,2K])iPC\P/3FYHU>LPV59H'B_C.i<0d&W#em2eE1N#h2H)d`JBZ\f-Z7=6lkXK`!t$pt1Q,QY13s]seZI3^PBgM3l3\7Va_s"X<LNj!AcACM(D9,"<N?!tY0D?2eMr%8XPrm#EiVsa2Q?rqBRV(;%+EP3*nK28KRKiDEa8>Hi?!8geO?5/piN,_'t@m_(^%nL_t/`l>fCi?ZFQu=B4KcUBQGB];a`+KgpU=CF"3$@_@<=X5"1uiV,",CHK;r^HDo):NUg+%P[@U5Z4*tK&Y6r/k,:08*-=WN&ouGg8gQQfN^7*PR9^f\[#NNTnm-#.e:j9bJ67UnaJInUi98[l7,rope)j6[f'oeemWW';f/sApJpZ5(oFF[u41.%Po=Fh9i]D9@h;M\H&3IAt,eSGQrtM\9,I:CCWR$6ulh+FFI40`\qEJ_+[\$u-$K&U7*`q\IK,ic!<8#/o*AKk91.QG):0P3XlWdn2j?@k.@)RZQ7$/,/Qe<jd5nWL-e?OR=jgPM]*V_b2;\CUtWD%(o?n$[jhh!R#%p.8A.,V)D@mugifX`ai9MNtsG:_RT]uLg]@*[G/;#'TY<a0s^.1qJ;Znm#a'&UaLQZL/jkP3(T4KZU%hKGeZfA,ck+7ot%$*>e3WEI@Ds(lNi0M,^:+#Pt3#Kr`Rf$IcG/1L2iJ#<WGX+-^o1AU'u8]2*4Dl3eE8FO(#R=]YmSIY=L0cH:n3;VHc.<RV0jhh[**>t#H0Br\:D`(39f+4(uo]br7h:':&qU;X3LOZ,'2Fo/>+p:AO=.DY%0Nd;sD]YhF'>iRHGaM5jFCE'F:KNr8[.6Jgn1Z`dkUtJQMVP()$&C7!pncj-mE>`lCEaFUJcT#g2R$D>2F[/iV4tFYjcp?dBV)Beqm8s#,Qm+Hq6?9SfZaQ3:rL;mmVk\\2-*at*!pGGM;rBoVH_n]WjcW)%9o.G=m%k_Ab#N"LO=Mg#*rRHo4"Ibf)Yhl.EQfYDW$6Kg)1c]3sO5CJ,;Yk0KNuua":-,=gQcqbI1S"F[=Q=GLP7,m4GpBpMYI[)EV[^BAlQ`k8Xp8b(-0WEe\>Bs!43qq]>.UV&>*#78AWLZsV6ocf!4T8c1`(g_,r;[S@?5pDg587uh0=@5=C)ClESf;jqJ9M=9YHqT(_RR!*)ec&_8,X4^`h`U>'o,<:hsb/`c=b@LHkFZH#Z`_j7.',(dqT.eMV-8Y)#nuX72&N:/Ik`7,Z3F[iYE%0ju-%4nX$_KO;hSIG.@;E/332sJ__f#:kj1IQN`!Cqt8L7_<!3&c[jgBloi]IP4Z_G3$&p!89ZlU$NHu&tS1,=jm"P?r&.Ah6%,'[`!.Rg,,c/`#sphTFM$3A6GjWp?tR`^U.b'1i`pq+ViC^j[*>]N;&-V)\RAk0e2[t@!4[LL3f/P50F4)V!qW%6JtCUcX;>f91`4$$0'?gt9FZ!/5fcqfOCo/[%9?*g#sg7@EmHmFD(jt0o#X`LgQ:M<EtkX\9uSLO4.RmCV>0sqM&hp9+ZZmNa5TQZ)es4e#Ad[SlCjO9*G,V7DFoT;:/?`hg4kXhK?9I.[6_?4HN"i$/5QN~>endstream
endobj
xref
0 27
0000000000 65535 f
0000000061 00000 n
0000000134 00000 n
0000000241 00000 n
0000000353 00000 n
0000000458 00000 n
0000000605 00000 n
0000000752 00000 n
0000000899 00000 n
0000001047 00000 n
0000001195 00000 n
0000001311 00000 n
0000001389 00000 n
0000001595 00000 n
0000001843 00000 n
0000002049 00000 n
0000002136 00000 n
0000002440 00000 n
0000002514 00000 n
0000002615 00000 n
0000002732 00000 n
0000002855 00000 n
0000002965 00000 n
0000003052 00000 n
0000003127 00000 n
0000003555 00000 n
0000004150 00000 n
trailer
<<
/ID
[<d72e024de97560ae08ffb08d13dcbc2f><d72e024de97560ae08ffb08d13dcbc2f>]
% ReportLab generated PDF document -- digest (opensource)
/Info 16 0 R
/Root 15 0 R
/Size 27
>>
startxref
7506
%%EOF

View File

@@ -279,7 +279,7 @@ endobj
endobj
46 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115604+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115604+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184402+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184402+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (URL shortener service \204 design review \(DR\)) /Trapped /False
>>
endobj
@@ -553,7 +553,7 @@ xref
trailer
<<
/ID
[<875c6f1c7edbf45055101437d8ba9dff><875c6f1c7edbf45055101437d8ba9dff>]
[<b881146e81a0400dc0faf4d7b18a637b><b881146e81a0400dc0faf4d7b18a637b>]
% ReportLab generated PDF document -- digest (opensource)
/Info 46 0 R

View File

@@ -498,7 +498,7 @@ endobj
endobj
79 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115604+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115604+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184402+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184402+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Platform scaling and multi-environment architecture \204 design review \(DR\)) /Trapped /False
>>
endobj
@@ -933,7 +933,7 @@ xref
trailer
<<
/ID
[<b9840886073ac09ffa3aaf04613fddc4><b9840886073ac09ffa3aaf04613fddc4>]
[<e8d77b162988235e9282c6a48d0eb653><e8d77b162988235e9282c6a48d0eb653>]
% ReportLab generated PDF document -- digest (opensource)
/Info 79 0 R

View File

@@ -324,7 +324,7 @@ endobj
endobj
51 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115604+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115604+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184402+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184402+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (RSSH routed egress \(dev-only\) \204 design review \(DR\)) /Trapped /False
>>
endobj
@@ -663,7 +663,7 @@ xref
trailer
<<
/ID
[<8bb82ad74cbc70e21b326c36bdc6d400><8bb82ad74cbc70e21b326c36bdc6d400>]
[<519e375ae3d00c8c0855ddd359ee5e1c><519e375ae3d00c8c0855ddd359ee5e1c>]
% ReportLab generated PDF document -- digest (opensource)
/Info 51 0 R

View File

@@ -319,7 +319,7 @@ endobj
endobj
51 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115605+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115605+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184403+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184403+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Codec2 / ultra-low-bandwidth voice \204 design review \(DR\)) /Trapped /False
>>
endobj
@@ -657,7 +657,7 @@ xref
trailer
<<
/ID
[<46cf1dfdb90851c909d86a9cdac2e0a3><46cf1dfdb90851c909d86a9cdac2e0a3>]
[<067f365549c6352e4507032702d5c987><067f365549c6352e4507032702d5c987>]
% ReportLab generated PDF document -- digest (opensource)
/Info 51 0 R

View File

@@ -520,7 +520,7 @@ endobj
endobj
85 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115605+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115605+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184403+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184403+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Repository and microservice reorganization \204 design review \(DR\)) /Trapped /False
>>
endobj
@@ -1072,7 +1072,7 @@ xref
trailer
<<
/ID
[<d2f7142333d712b3c1c2561068c30494><d2f7142333d712b3c1c2561068c30494>]
[<e9227d6d82ddd0becfc6cb9795cfdb6c><e9227d6d82ddd0becfc6cb9795cfdb6c>]
% ReportLab generated PDF document -- digest (opensource)
/Info 85 0 R

View File

@@ -82,7 +82,7 @@ endobj
endobj
14 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115606+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115606+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184404+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184404+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Live Cast Control Plane \(P0-P2 kickoff\)) /Trapped /False
>>
endobj
@@ -166,7 +166,7 @@ xref
trailer
<<
/ID
[<c4fec4b99072874c8420e5c9ea80366d><c4fec4b99072874c8420e5c9ea80366d>]
[<33f3e1c0301273f67e72a0a82caefd37><33f3e1c0301273f67e72a0a82caefd37>]
% ReportLab generated PDF document -- digest (opensource)
/Info 14 0 R

View File

@@ -0,0 +1,332 @@
# Infrastructure health monitoring — design review (DR)
<!-- doc-meta:start -->
| Field | Value |
|---|---|
| Author | Anton Afanasyeu |
| Revision | R0 |
| Creation date | 2026-06-26 |
| Last modification date | 2026-06-26 |
| Co-authored | Cursor Agent (project assistant) |
| Severity | high |
| State | accepted |
| Document type | DR |
| Superseded by | — |
| Specification | [docs/specs/20260626_cluster_monitoring.md](../specs/20260626_cluster_monitoring.md) |
<!-- doc-meta:end -->
---
**Document type:** DR (Design Review)
**Source draft:** [docs/drafts/20260626_cluster_monitoring.txt](../drafts/20260626_cluster_monitoring.txt)
**Specification:** [docs/specs/20260626_cluster_monitoring.md](../specs/20260626_cluster_monitoring.md) (normative implementation doc)
**PDF:** [20260626_cluster_monitoring.pdf](20260626_cluster_monitoring.pdf) · Regenerate: `bash ac-docs/build-pdf.sh`
**Status:** Accepted R0 — implement per SPEC
**Scope:** Passive infrastructure monitoring and alerting for the XEN-based VM cluster (cast01cast04); Track A only — automated remediation is Track B ([drafts/20260626_cluster_orchestration.txt](../drafts/20260626_cluster_orchestration.txt))
**Related:** [INFRA.md](../INFRA.md) · [specs/20100612_1_scaling.md](../specs/20100612_1_scaling.md) · [specs/20260618_repos_reorganizing.md](../specs/20260618_repos_reorganizing.md) · [orchestration/sim/cluster0/ARCHITECTURE.md](../../orchestration/sim/cluster0/ARCHITECTURE.md) · [20260620_postgres_timescale_db_platform.md](../20260620_postgres_timescale_db_platform.md)
**Documentation index:** [README.md](../README.md)
---
## Table of contents
<!-- toc -->
- [1. Executive summary](#1-executive-summary)
- [2. Problem statement](#2-problem-statement)
- [3. Track A / Track B scope split](#3-track-a--track-b-scope-split)
- [4. Responsibility domains](#4-responsibility-domains)
- [5. Monitoring topology — cast04](#5-monitoring-topology--cast04)
- [6. Tool selection](#6-tool-selection)
- [7. Alert channels](#7-alert-channels)
- [8. Infrastructure constraints](#8-infrastructure-constraints)
- [9. Relationship to TimescaleDB / business metrics](#9-relationship-to-timescaledb--business-metrics)
- [10. Risks and mitigations](#10-risks-and-mitigations)
- [11. Non-goals (Track B reference)](#11-non-goals-track-b-reference)
- [12. Related documents](#12-related-documents)
- [13. Changelog](#13-changelog)
<!-- /toc -->
---
## 1. Executive summary
**Question:** How should the VM cluster (cast01cast03) and its microservices be continuously monitored, and what tooling should be deployed?
**Short answer:** Deploy a dedicated monitoring VM (cast04, Alpine LTS) running Prometheus + node_exporter (per-node) + blackbox_exporter + mysqld_exporter + Alertmanager + Grafana. Alerts route to email (SMTP relay) and Telegram. External availability is covered by UptimeRobot (free tier, no install). Automated remediation is out of scope for R0 — it becomes Track B.
**DR decisions (R0):**
| Item | Decision |
|------|----------|
| **Scope** | Track A: passive monitoring + alerting only; no auto-remediation |
| **Monitoring node** | **cast04** — dedicated 4th Alpine LTS VM; paravirt XEN guest |
| **Metrics stack** | **Prometheus** + **node_exporter** + **blackbox_exporter** + **mysqld_exporter** |
| **Dashboards** | **Grafana** (community dashboards; self-hosted on cast04) |
| **Alerting** | **Alertmanager** → email SMTP relay + Telegram bot API |
| **External uptime** | **UptimeRobot** free tier — no install; HTTP probe to `apps.f0xx.org` from internet |
| **Status page** | **Uptime Kuma** on cast04 (Docker) — internal, access via SSH tunnel |
| **Log aggregation** | Out of scope R0; Grafana Loki planned for R1 (Track B) |
| **VictoriaMetrics** | Not used at R0 — not in Alpine apk; standard Prometheus sufficient at 3-node scale |
| **Zabbix** | Not chosen — batteries-included but inflexible for future business metrics integration |
| **Nagios** | Not chosen — legacy, superseded by Prometheus+Alertmanager |
| **Kibana / ELK** | Excluded — log-centric, heavy, wrong tool for infra metrics |
| **FE / router changes** | None at R0 — monitoring is internal; FE nginx config change only if external Grafana access added later |
| **DNS changes** | None at R0 |
| **Data residency** | All metric data stays self-hosted (no external aggregator) |
| **Track B** | Placeholder draft created: [drafts/20260626_cluster_orchestration.txt](../drafts/20260626_cluster_orchestration.txt) |
---
## 2. Problem statement
The project runs a cluster of XEN-based VMs (cast01cast03) hosting microservices at various complexity levels — from a single service per node to multi-node DB master/replica chains. As the microservice split progresses (per [specs/20260618_repos_reorganizing.md](../specs/20260618_repos_reorganizing.md)), manual observation of each service and node becomes impractical.
Key failure modes that must be detected and alerted:
| Category | Example failure |
|----------|----------------|
| Hardware | CPU steal time spiking (Xen overcommit), disk SMART pre-failure, RAM exhaustion |
| Software | nginx 5xx surge, php-fpm worker saturation, MariaDB replication lag, process crash |
| Network | Egress/ingress saturation, NIC packet drops |
| Provider | Uplink outage, XEN host failure, VM unavailability |
None of these are currently monitored in a structured way.
---
## 3. Track A / Track B scope split
This DR and its SPEC cover **Track A only**.
| Track | Scope | Milestone |
|-------|-------|-----------|
| **Track A** (this SPEC) | Passive monitoring: observe, record, alert | R0 |
| **Track B** (future) | Active remediation: orchestration reacts to alert signals — auto-scale, auto-failover, DDoS response | R1+ |
Track B details and prerequisites are captured in [drafts/20260626_cluster_orchestration.txt](../drafts/20260626_cluster_orchestration.txt). Track B MUST NOT be designed until Track A alerting is stable and at least 4 weeks of baseline metric data has been collected.
---
## 4. Responsibility domains
The infrastructure has two clearly bounded ownership layers:
```text
┌──────────────────────────────────────────────────────┐
│ Anton's layer (SaaS — contact owner for issues) │
│ • Internet provider / uplink │
│ • Router (Debian; config-only from project side) │
│ • XEN hypervisor hosts + VM provisioning │
│ • Internal network (10.7.0.0/8), git server │
│ • FE VM (Gentoo HVM; nginx TLS; config-only) │
└──────────────────────────────────────────────────────┘
delegated cluster boundary ↓
┌──────────────────────────────────────────────────────┐
│ Project owner's layer (full control) │
│ • cast01 / cast02 / cast03 — workload VMs │
│ • cast04 — monitoring VM (this SPEC) │
│ • All software installed on these VMs │
│ • MariaDB, nginx, PHP-FPM, microservices │
└──────────────────────────────────────────────────────┘
```
**Monitoring responsibility boundary:** The project owner monitors everything within the delegated cluster. When monitoring detects that the cause is in Anton's layer (hardware fault, uplink, XEN host instability), the action is to notify Anton — not to auto-remediate.
**Hardware guarantee baseline** (from Anton's SLA commitment per draft):
| Resource | Guaranteed value |
|----------|-----------------|
| CPU | Intel Xeon Gold 5218, 8 real cores @ 2.30 GHz per node |
| RAM | 8 GB per node |
| Disk | 32 GB non-shared per node |
| Network | 200 Mbit/s in/out |
| Cluster size | 3 workload nodes (cast01cast03) |
Monitoring MUST alert when measured values diverge significantly from this baseline (e.g. CPU steal > 10% for > 5 min = Xen overcommit alarm → notify Anton).
---
## 5. Monitoring topology — cast04
```text
[ Internet ]
UptimeRobot (external)
HTTP probe → apps.f0xx.org
┌──────────────┴──────────────┐
│ FE (Gentoo HVM) │ ← no new software
│ TLS nginx, 134.17.26.161 │
└──────────────┬──────────────┘
│ 10.7.0.0/8 internal
┌────────────────────┼────────────────────────────┐
│ │ cluster │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ cast01 │ │ cast02 │ │ cast03 │ │
│ │workload │ │workload │ │workload │ │
│ │node_exp │ │node_exp │ │node_exp │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ │
│ │ │ │ │
│ ┌────┴─────────────┴─────────────┴────┐ │
│ │ cast04 (monitoring VM) │ │
│ │ Prometheus Alertmanager Grafana │ │
│ │ blackbox_exporter mysqld_exporter │ │
│ │ Uptime Kuma (Docker) node_exporter │ │
│ └──────────────────────────────────────┘ │
└───────────────────────────────────────────────────┘
```
- Prometheus scrapes node_exporter on cast01/cast02/cast03/cast04 via internal IPs
- blackbox_exporter on cast04 probes service HTTP/TCP endpoints from inside cluster
- mysqld_exporter runs on the MariaDB primary node (cast01 or cast02 per deployment)
- cast04 has no workload services — monitoring-only
- Access to Grafana/Uptime Kuma UI: SSH tunnel from dev machine at R0
**cast04 minimum spec (request from Anton):**
| Resource | Minimum |
|----------|---------|
| CPU | 2 vCPU |
| RAM | 2 GB (Prometheus + Grafana + Alertmanager) |
| Disk | 32 GB (90 days metric retention at 15s scrape) |
| OS | Alpine latest LTS, paravirt XEN |
---
## 6. Tool selection
### 6.1 Decided stack
| Component | Package / source | Role |
|-----------|-----------------|------|
| Prometheus | `prometheus` (apk) | Time-series scraper + TSDB |
| node_exporter | `prometheus-node-exporter` (apk) | Hardware + OS metrics per VM |
| blackbox_exporter | `prometheus-blackbox-exporter` (apk) | HTTP/TCP service health probes |
| mysqld_exporter | `prometheus-mysqld-exporter` (apk) | MariaDB metrics |
| Alertmanager | `alertmanager` (apk) | Alert routing (email + Telegram) |
| Grafana | `grafana` (apk) | Dashboards |
| Uptime Kuma | Docker image `louislam/uptime-kuma` | Service status page |
| UptimeRobot | SaaS free tier (web account) | External HTTP probe |
All apk packages are available in Alpine community/edge repos. Docker (`docker` apk) is available for Uptime Kuma.
### 6.2 Options rejected
| Tool | Reason not chosen |
|------|------------------|
| Kibana / ELK | Log-centric, heavy (Elasticsearch needs 4+ GB), wrong tool for infra metrics |
| Zabbix | Batteries-included but less composable; harder to extend to business metrics later |
| Nagios Core | Legacy; status-only; no time-series; superseded by Prometheus+Alertmanager |
| VictoriaMetrics | Not in Alpine apk repos; standard Prometheus sufficient at 3-node scale |
| Grafana Cloud | Data must remain self-hosted (PO preference) |
| Netdata | Good for quick bootstrap but adds another agent daemon; Prometheus covers the same ground |
### 6.3 Future additions (R1 / Track B)
| Component | Role |
|-----------|------|
| Grafana Loki + Promtail | Centralized log aggregation (replaces manual syslog review) |
| Alertmanager webhook handlers | Trigger ac-deploy scripts on alert (foundation for Track B remediation) |
---
## 7. Alert channels
| Channel | Tool | Requirement |
|---------|------|-------------|
| Email | Alertmanager SMTP | **Required** — primary alert channel |
| Telegram | Alertmanager Telegram receiver | **Recommended** — fast ops notifications |
| Status page | Uptime Kuma | **Recommended** — visual per-service uptime |
| External uptime | UptimeRobot | **Required** — provider-fault detection |
**Email SMTP relay:** Alertmanager needs an outbound SMTP relay (NOT an inbound routing service). Options: Gmail account + app password, or Mailgun free tier (10k emails/month). **Note:** ImprovMX and addy.io are inbound email routing services — they are not SMTP relay providers and cannot be used for Alertmanager outbound alerts.
**Telegram:** Purely API-based — no software installation. Register a bot via @BotFather, obtain `TOKEN` and `CHAT_ID` (add bot to ops group or DM). Alertmanager calls Telegram HTTP API from cast04.
**Accounts to create before deploy (PO action):**
| Account | Purpose | Notes |
|---------|---------|-------|
| Gmail app password OR Mailgun free | Alertmanager SMTP relay | Gmail: Settings → Security → App passwords |
| Telegram bot via @BotFather | Alertmanager Telegram receiver | Note TOKEN + CHAT_ID |
| UptimeRobot free account | External HTTP probe | uptimerobot.com; add monitor for `apps.f0xx.org` |
---
## 8. Infrastructure constraints
Constraints discovered during DR review — all accounted for in SPEC:
| Constraint | Impact |
|------------|--------|
| Paravirt XEN guest (no HVM) | node_exporter works fine on paravirt; Xen steal time metric available |
| Alpine LTS + apk only | All stack components available as apk packages; Uptime Kuma via Docker (apk-installable) |
| FE / router: no new software | Monitoring is entirely internal; no FE changes at R0 |
| Data self-hosted | No Grafana Cloud or external aggregator |
| 8 GB RAM per workload node | Standard Prometheus on cast04 is sufficient (Prometheus ~200500 MB for this scale) |
---
## 9. Relationship to TimescaleDB / business metrics
The project has a separate PostgreSQL + TimescaleDB platform plan ([20260620_postgres_timescale_db_platform.md](../20260620_postgres_timescale_db_platform.md)). These two stores serve different purposes and coexist:
| Layer | Store | Metrics type | Retention |
|-------|-------|-------------|-----------|
| Infrastructure | Prometheus TSDB (cast04) | CPU, RAM, disk, latency, process health | 90 days |
| Business / app | TimescaleDB (PostgreSQL) | Crash rates, session counts, graph analytics | Long-term |
Grafana on cast04 can query **both** data sources. No ETL between them is required.
---
## 10. Risks and mitigations
| Risk | Mitigation |
|------|------------|
| cast04 itself fails — monitoring goes dark | cast04 is monitored by UptimeRobot externally; Alertmanager persistence via local disk |
| Xen host failure takes cast04 offline | UptimeRobot external probe survives; operator is alerted from outside |
| SMTP relay rate limit hit during incident storm | Alertmanager grouping + repeat_interval configured; Telegram as parallel channel |
| apk package version lag | Use Alpine edge repo for monitoring components if LTS versions are too old |
| Prometheus disk fill (90 day retention + 3 nodes) | Estimated < 5 GB for 3 nodes at 15s scrape; 32 GB disk leaves comfortable margin |
| cast04 RAM insufficient | 2 GB minimum; Prometheus + Grafana + Alertmanager combined ~500 MB1 GB typical |
| External UptimeRobot free tier limits | Free tier: 50 monitors, 5-min check interval — sufficient for R0 |
---
## 11. Non-goals (Track B reference)
The following are explicitly **out of scope** for this DR and SPEC:
- Automatic horizontal scaling (add node under CPU load)
- Automatic scale-in (remove idle node)
- DDoS automated response
- Automatic storage failover
- Any orchestration that modifies cluster topology without human approval
These scenarios are documented as future work in **[drafts/20260626_cluster_orchestration.txt](../drafts/20260626_cluster_orchestration.txt)** (Track B). Track B DR and SPEC will be authored once Track A is operational and baseline metrics are available.
---
## 12. Related documents
| Document | Role |
|----------|------|
| [specs/20260626_cluster_monitoring.md](../specs/20260626_cluster_monitoring.md) | Normative implementation SPEC (this DR's output) |
| [drafts/20260626_cluster_orchestration.txt](../drafts/20260626_cluster_orchestration.txt) | Track B placeholder (auto-remediation, future) |
| [INFRA.md](../INFRA.md) | FE/BE topology, hosts, ports |
| [specs/20100612_1_scaling.md](../specs/20100612_1_scaling.md) | VM roles and cluster layout |
| [specs/20260618_repos_reorganizing.md](../specs/20260618_repos_reorganizing.md) | Microservice split (monitoring must track each MS) |
| [20260620_postgres_timescale_db_platform.md](../20260620_postgres_timescale_db_platform.md) | TimescaleDB for business metrics (complements Prometheus) |
| [orchestration/sim/cluster0/ARCHITECTURE.md](../../orchestration/sim/cluster0/ARCHITECTURE.md) | Lab cluster node layout |
| [GRAFANA_vs_others_graphvis_pivot.md](../GRAFANA_vs_others_graphvis_pivot.md) | Earlier Grafana evaluation for app analytics |
---
## 13. Changelog
| Rev | Date | Change |
|-----|------|--------|
| R0 | 2026-06-26 | Initial DR — accepted; decisions locked; SPEC generated |

View File

@@ -0,0 +1,393 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 20 0 R /F4 21 0 R /F5 22 0 R /F6 23 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 24 0 R /Fit ] /Rect [ 45.68504 762.0394 124.373 773.0394 ] /Subtype /Link /Type /Annot
>>
endobj
5 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 24 0 R /Fit ] /Rect [ 45.68504 751.0394 121.717 762.0394 ] /Subtype /Link /Type /Annot
>>
endobj
6 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 24 0 R /Fit ] /Rect [ 45.68504 740.0394 156.389 751.0394 ] /Subtype /Link /Type /Annot
>>
endobj
7 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 24 0 R /Fit ] /Rect [ 45.68504 729.0394 136.381 740.0394 ] /Subtype /Link /Type /Annot
>>
endobj
8 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 24 0 R /Fit ] /Rect [ 45.68504 718.0394 160.405 729.0394 ] /Subtype /Link /Type /Annot
>>
endobj
9 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 24 0 R /Fit ] /Rect [ 45.68504 707.0394 103.933 718.0394 ] /Subtype /Link /Type /Annot
>>
endobj
10 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 24 0 R /Fit ] /Rect [ 59.68504 696.6019 119.295 706.6019 ] /Subtype /Link /Type /Annot
>>
endobj
11 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 24 0 R /Fit ] /Rect [ 59.68504 686.6019 126.8025 696.6019 ] /Subtype /Link /Type /Annot
>>
endobj
12 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 24 0 R /Fit ] /Rect [ 59.68504 676.6019 174.7275 686.6019 ] /Subtype /Link /Type /Annot
>>
endobj
13 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 24 0 R /Fit ] /Rect [ 45.68504 666.0394 105.269 677.0394 ] /Subtype /Link /Type /Annot
>>
endobj
14 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 24 0 R /Fit ] /Rect [ 45.68504 655.0394 142.613 666.0394 ] /Subtype /Link /Type /Annot
>>
endobj
15 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 24 0 R /Fit ] /Rect [ 45.68504 644.0394 223.517 655.0394 ] /Subtype /Link /Type /Annot
>>
endobj
16 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 24 0 R /Fit ] /Rect [ 45.68504 633.0394 134.605 644.0394 ] /Subtype /Link /Type /Annot
>>
endobj
17 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 24 0 R /Fit ] /Rect [ 45.68504 622.0394 166.613 633.0394 ] /Subtype /Link /Type /Annot
>>
endobj
18 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 24 0 R /Fit ] /Rect [ 45.68504 611.0394 127.949 622.0394 ] /Subtype /Link /Type /Annot
>>
endobj
19 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 24 0 R /Fit ] /Rect [ 45.68504 600.0394 97.71704 611.0394 ] /Subtype /Link /Type /Annot
>>
endobj
20 0 obj
<<
/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
21 0 obj
<<
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
22 0 obj
<<
/BaseFont /Symbol /Name /F5 /Subtype /Type1 /Type /Font
>>
endobj
23 0 obj
<<
/BaseFont /ZapfDingbats /Name /F6 /Subtype /Type1 /Type /Font
>>
endobj
24 0 obj
<<
/Contents 50 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 49 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
25 0 obj
<<
/Annots [ 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R
14 0 R 15 0 R 16 0 R 17 0 R 18 0 R 19 0 R ] /Contents 51 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 49 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0
/Trans <<
>> /Type /Page
>>
endobj
26 0 obj
<<
/Contents 52 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 49 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
27 0 obj
<<
/Contents 53 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 49 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
28 0 obj
<<
/Contents 54 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 49 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
29 0 obj
<<
/Contents 55 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 49 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
30 0 obj
<<
/Outlines 32 0 R /PageMode /UseNone /Pages 49 0 R /Type /Catalog
>>
endobj
31 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260626184404+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184404+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Infrastructure health monitoring \204 design review \(DR\)) /Trapped /False
>>
endobj
32 0 obj
<<
/Count 17 /First 33 0 R /Last 48 0 R /Type /Outlines
>>
endobj
33 0 obj
<<
/Dest [ 24 0 R /Fit ] /Next 34 0 R /Parent 32 0 R /Title (1. Executive summary)
>>
endobj
34 0 obj
<<
/Dest [ 24 0 R /Fit ] /Next 35 0 R /Parent 32 0 R /Prev 33 0 R /Title (2. Problem statement)
>>
endobj
35 0 obj
<<
/Dest [ 24 0 R /Fit ] /Next 36 0 R /Parent 32 0 R /Prev 34 0 R /Title (3. Track A / Track B scope split)
>>
endobj
36 0 obj
<<
/Dest [ 24 0 R /Fit ] /Next 37 0 R /Parent 32 0 R /Prev 35 0 R /Title (4. Responsibility domains)
>>
endobj
37 0 obj
<<
/Dest [ 24 0 R /Fit ] /Next 38 0 R /Parent 32 0 R /Prev 36 0 R /Title (5. Monitoring topology \204 cast04)
>>
endobj
38 0 obj
<<
/Count 3 /Dest [ 24 0 R /Fit ] /First 39 0 R /Last 41 0 R /Next 42 0 R /Parent 32 0 R
/Prev 37 0 R /Title (6. Tool selection)
>>
endobj
39 0 obj
<<
/Dest [ 24 0 R /Fit ] /Next 40 0 R /Parent 38 0 R /Title (6.1 Decided stack)
>>
endobj
40 0 obj
<<
/Dest [ 24 0 R /Fit ] /Next 41 0 R /Parent 38 0 R /Prev 39 0 R /Title (6.2 Options rejected)
>>
endobj
41 0 obj
<<
/Dest [ 24 0 R /Fit ] /Parent 38 0 R /Prev 40 0 R /Title (6.3 Future additions \(R1 / Track B\))
>>
endobj
42 0 obj
<<
/Dest [ 24 0 R /Fit ] /Next 43 0 R /Parent 32 0 R /Prev 38 0 R /Title (7. Alert channels)
>>
endobj
43 0 obj
<<
/Dest [ 24 0 R /Fit ] /Next 44 0 R /Parent 32 0 R /Prev 42 0 R /Title (8. Infrastructure constraints)
>>
endobj
44 0 obj
<<
/Dest [ 24 0 R /Fit ] /Next 45 0 R /Parent 32 0 R /Prev 43 0 R /Title (9. Relationship to TimescaleDB / business metrics)
>>
endobj
45 0 obj
<<
/Dest [ 24 0 R /Fit ] /Next 46 0 R /Parent 32 0 R /Prev 44 0 R /Title (10. Risks and mitigations)
>>
endobj
46 0 obj
<<
/Dest [ 24 0 R /Fit ] /Next 47 0 R /Parent 32 0 R /Prev 45 0 R /Title (11. Non-goals \(Track B reference\))
>>
endobj
47 0 obj
<<
/Dest [ 24 0 R /Fit ] /Next 48 0 R /Parent 32 0 R /Prev 46 0 R /Title (12. Related documents)
>>
endobj
48 0 obj
<<
/Dest [ 24 0 R /Fit ] /Parent 32 0 R /Prev 47 0 R /Title (13. Changelog)
>>
endobj
49 0 obj
<<
/Count 6 /Kids [ 24 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R ] /Type /Pages
>>
endobj
50 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 985
>>
stream
Gat=+>Aoub'RnB330.pQ34A>\*kQQc2YEmqg/Fi*JWinVO;ZNIqt2bP$'uqP,Eu;<J)@g3SE")\fKQ,1O*:S26<N"U+;D[-&;D$TGOR2SrL&e/Q&HsHF3HmAM6IdMMmLk<qpaXI+>4:.qLBih!@+8h1Wr@M@O-Ug.tRi]PmBu4!Sg3#QVuK30S,-(fh+bgd:I,dX^IouXkCKBcVftm1g@jBV%OD@V!AGrH:cX;4C6eo+"o8jI"q+tk$:Gl^qG.k)'K:FN=d.o5S3.?I3Ukmhp!:/4k<K?qJ\Aoo9IW$WXNd2Yf$d+#?9as;.%m([MK5,]&.gr#P9u?\.;^G'AP>JL_;1FDUDM.eWo6tT#2J,:TZo?+bTc=5^=TAkp0m=3HHm.=FSOGVXUn;H+ce0)!7rAQ\&R7,lKrI/`(gb&mTqO7l<H*Af]>d*RM9pg*UHBP]23k-=R>RY@q.?*ci9+-.dYrSj,OaBa_R+bpM$eCmdPZR66,f<KoqkRjubIZo)HSUH7I/>MtAqcUMS3JUF*jfu.t*`)j&bA!M`n1B$#lV6RW8MQ)tQ0rJJGo>'#kGID>B6CjpQ1j6.>?.(,'Uq>g]GuR;D)Nh3:kY#4B)Qq[A1\S'/lhjo)#,7h_$PR*K3I=P(,Fk=sTO*jXc.hEY\8uT:ok$Hlk3SQB1FcAZM5*%2HS_n"$p81oDt:En<P)r$p*6r9+CI3/;r#&jmZfD(U([5a+s,MC<'AorLRf1:X8#dd7QB%c5KVqp;-5!\U8fMA;"56<bJG\+e?kZXG:IEXg>DK1q,B+eqqKu;r,,_HGWg5-];FJa?FTE#:Z;!MmX3$VKrlY6LoO4V4iJAGWh!s%GqB`tU1apg]-uI-Jds2B0X:eC%75.JU-Z!nJi*h;KCE&jFk&Mq#a=^3:uREf#7oX_]+K!h+@1Bq\.Kk*#dJTErn)"^![KrjWE+gp:EnfQo71l"$1[>>blrY%FH7f:r<%J,)7'~>endstream
endobj
51 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 849
>>
stream
Gatn%>u03/'Sc)R/']G7R^&F%8Tk=@Ue1Go\O8d#EEgo1c>3a*^Y_U\fEOn<:_Y?#XkWU?q0Kr/ik_Luli9d13'(]f3)j[$.7p60#\V]Qa,97cVATt77T7D"SC"'*nTXacT`n5t"@uDtRMS6[N0bsq[oq[>Z:>d%U$>I,mkm'H'b78?\lE.i+KYsm"Fg^-%9.78m;I6^UbCp^oTNFL5r%bg:$R\QfhWoLTPkS?U$HH;*s%Ih9*&u5?_,.IFPoM,</2WQ!(`!D!"o?uX5shOiFm^b!aaS%j3b=s#)9mi*+":i$!\n9>N>Ca7e(h=CfbBc;\VnV7?J2WA;q)MBsW@uHe[9!4^<$!K<0KoB`npjQGO6$+_t<OW`:ffC]:Fgb5YOU.<(G5!9E2-H>;.?J\e=K\l$^SVK*K(:b7UAiCcCQhh+id(^\_\:uk8J,]Gr#_'u=P7aF&\#8c`No3<>+@#9!)lGs8O\&nl9gY*Lp7^S&oP,6Y9![#Y?@8j[%:1:snNXsdK0p>k<Hmt5!*$&lZARqigCg3i[VnB*8FaAZ(\K8CAb'W>OE*C9.-#><.TnoWFc9lFekcf"a1MR$r?dA&cmQOkHG%9i]/DGr"n'kN$AYb3`?+QF!0tpF%Ng7W,To8OBXBa!J(u!koCn-L%&Kddl8Wm"1._iWh@&2F.5dZKU;D<?AI>7GLDA(%R@5E@_Gi.oHUj<99E^9jF=0`io;!t?1oI&'EZSVF1*2(gdbO!Nc*G>O^:XA!#X#oE*KP_b!-)^2`NXKZ"j\4K>6-?<PSikaja]$3"!DfmTrF7*G,5/3tJ*\UWEl&1-#1#i[=>B43J7BOU^N<lV$_IE;cN~>endstream
endobj
52 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3955
>>
stream
Gau`VD,]IS')p1[d)WA@Z2C%!+0Lu^fpSC^@mXdCl\[/aZ'@_8hc@$+gonJYr";)2*'8LK<tkd-EiZgKmXD`O)!UOBeR'stki3(WI`;X4BXU1YdO[6PNc&JWJ">M,VIaPgf[_Y8:)qO*/Jm8*q9_63ChmoCiNEofN2so+bso#N@9n>2LF!BdQ7M7cLG.'=-MFa,7O^se'DgZ%c2L\$WECHf1IY*7)_0Jq6<!a'khFRcRPXh0Er0>W6`s^74IDh_39)&K4su81LEAbS`2+@bQ\KB;\mm_G?BC#.o&h]e=;l5r/[]\kp0c@SNn<#q69Vbb*_BKS[IYhT8iN65&*f-`*WhU.MHH5K<,RF7.Z*fG[V[%gm>%1W43VngSG3KaA2l33L*_g--Ro"E$3J##+ttBRKnsrHPVCEci*X98RTT6E`A7J5Q@RgIYp7Q%kKtQO5+:cP]&@PVN"X:\j2:8^*fLuV5/sgPLbCE!0s([)K\H'3_21^.k+rrnBVT?2+s2qtnl.e(@ZJkO7=X+L?\!_oSDWd3YsE>b4<U>-&C45R=\kqsBZ>o'K!%rj"n0"_,YMW,C[a(a"o(c^ZVpQ1'?)IDJ`&^:Mn-<k^ohu`g0(U(WoKk^2l2)dGXm6jmlsUOPm,:i=P=\EFU&l3pfVhe-r$d,6&L<8c^Z>eJA3gGP)0(K2R?:O6deWD_TP7NqW7DBe!I8EgJ>/Je(\Vk6<3k<:em@IMW^4X<:W>IrV:L9@_a=F0`SAoSB4kPK@]bmHj>7TDVE\@$/jU]$/6rM;WWX1.U50h23'P9];Ao3I$2RfORVuc/6`e4DI9V%h$[N;*=&(<JT"gUrZ_NQ[s?LWnJ`+A3"(+F$=*jD5+O2#@AuL8o6;f7Iq9Z9BMO[+7po7uS-^m._VhABY$Q?W&Vu-\/.YOe(qekW,`(?Ws,U%i\eLl+)gK"krJ#UMPHA;c!^#D$o%f\7=@!(7nn%_"CT]Z,:eIDilPs18$&^5.5'mETn19IXN!CDZ'_I^uFG?OBVpBIU^j8V4i"7X'G;0%*bldG>o6=P8W,1K&L%"$)^u)eN#)e&5$;!XOlL@qp+Rl&ch[@B_/>]"B6pnfm=R,Eop&KOi+Rd9Uc"KA/S:pJ.!Qg-#LqLT011pV\h\#W207Kb%<G5\ZaO/=%Rb9Nha!hR*E!hLWb0N@1n?!l\61At'>dV%*8J9ZBnH'$]Um7:K_F+_Mmt%Vk\#Au(!o9t]6+Nbmk"tGlGn<Gq[X:=T!]Ui9b>`sPrNLK;7ij@#,LaN;'fCDUR'qi.ErrG%OlkB;`57[m81s9h_!=BEYi25_n@]BQ(;BiDq,>Rif3@BNMP,[35KgMer@hg0l=LMcTRN,Jq]KH40ok00]9>.%RZq[`(s8.eQtI'STae(Fk';=_bO/f!SRWKp-\p#:l_-G:Lt5L.d8^L=OX!b?lss0E*-8a@84sUr'ILsd^SWjCCQF3aBFt3),(*<kr>+oa!>tkuKX$K0CFW<;6^h>GELh-$4$TC6J@N#VFLFKB&sciq0.g&c7116o@1'M!-:?n-gFOrZ>7ZS620MPeb'<;3j)lD]X$E5R6$X0t"DKAleH.K/l75[B-a*qF4eR,.Pd%&YG3fX'SYhp&!^ROm?@#/F[j#qL-2Ig?Cl<dDk(Uc9UB]:/34g2YeDDYXg:X`q8ii2n-f#rWbt'"[S]?E\iija[o)6m2JX:Nid0LjcQphVfq%X-98C1aaZ%>XO:)3ht1@+6=H&RN9HsPB>%tRC5r<9@a`GMT4B=lI5P@6PtH271<T\R=S3(kQ^6kU5@5CDirM_cESQ3s3q$@DKnNnrhq\db]pCU^]MJ_]&"Ck1pgqD&.),WqYKW4c2u+\<lbKt^l/OS1Sh.O_t1>6[u'383JNYVk&Hjg>tFGfr;9.d?[l9Y%UY[k-=>TZT<+.5U[(.#30p8,,rqO-'0_O;\Juap<<@r.7g;Q"\O@!Ri$gJa`+AOl_bTATs6jBVF#r%9*%74dVT%=(N#!^;hl8,ln%Or&i*;TT(.tl1Q$M5#ftfR3r(h.ABTK8TCY@b3`_4e9`n99U<L;>q\"B#ejeG).Z>0E[;r;jFbLSB>#Kn/==Ig!K^:$Ht97i(TD^TLH[&;]u@b-I*U;u[4q$%2LC_I5nK\dY(/N(iC#IO/m.0<R4gAX9^6.#co%9tH%NZL<2FT+#uHhap1G'TBL/*+Oro9bmU.,U:R3R"E?':%maM=uJ)\/6_bMSD_]_klKA$nsgPJ)\1-1&ir#;+uHb2\ThnL1tZkn/G$pDSDk&SJb$P1N;CtgsR;=Y&L^[W/6Y,l$1buWq;'HSqs'A8#_r:;LrWN&!!PY\#"mBO.O0pXGOH"5sDCk@MdLL24_-X*fh/^&JK[Oc[GX5@_jST7m<n'X-1^7Y0uXg6O5FWud\k'qIPfO$eTaR@MOQP1I4Ockq/RM*iBOgi+%>=1A;)8?Z5i`H8bKuLi+^P`;tQ)uc?D-%T:A)8*,#3Wfk&F?Y\6R@,1%#1qE^]ss=m1eW$Wd5P]GB]m;Xl&(2cP(/3\<`-%p?2)"'?s!b<OFL8<(Z-qi++^@f*Crff6V:CD9<ndZ<C?PK#_WIC;+7rekpTq)j7q:*7F5o&3Q7GZH?5fP)n.T4)#,>@l7dUerl*EOC^;(i3=1UEFT7qX!,0eQG-L;gfS=(=ikM3jDNOg)Tt+0<QrH,k%5'4CK#""2`WJp$tGGB@(@6,6b.t:p/SCm'*pVdrbDb9l"HAsmdF#@\lDHAfRbk8)6EqDK[MNLW`sh[phi'$D,Msqa&($dqMr%bn$<aoRF@eX94b:0,!sgd!_cng]8H<2PB:"a.Q.)ti1"'[B5o91(UEYFQDo6s?YLYRJ>UaIE.IF1+LL,sfpf-RQ9qI1c\5M`Z5fe!Hpf-?b[#7X"O&)Ga?UZBTkg@5@s'DcJ17I^:A,t;'mZ^T=&\bUoGgnh1/d4$UNeEUjrG.4%40l2@Tta2'SBucKS9_WfG$:RHLsuAHX&WgHa[nN%Xt2ABL,a^pX+C='`mS1@2&5R?4)$0;hhT_?FH-2qCC4+CE+AYYDg)Od`N6e7hj@Qn\Lt"s.tP>%M#t?^m^U07mhQc"q7AW]-btAatn!Y2;R\!A8[(s09BYWOe!e&V!>tQXT8.F_b]cR'JPWKEJT:]82p,sq?-:/fasD`6C(52opL%jO*B4))&PHK-kpZ]VUp#L!5'MD30;samSFW\`f%3r$G&N@WsWlTDm.cSdd\UhPcU%+71u?(R(l0^7NeO-%d=thJ[Zr`*Xf`]]Mq.^kEQ+a%4]<bERJhSknm*@:K,B^rrOh1.aNML)_XDp!oJM+KG"9i1^.,%-XBm3E"'qM=3(F9VaSSCj.EP=d>RA+'=jmD"X50>WXeFbG:8C72ZWgm(`kW_dFddjKr]Ld8@V./D%*on6K#Ik"7Ys?"`abSHZ:$K9as0)2heI<46Z=LZEP?i<Vd"=!"ap9i",@qb;]a6<khc^MfLSh/+0qCk`*7L^]G?00K/V&#S\4q2.7WC1puUpggtWo/[(WnXOMkaChdSZi]C3Vnb*-Yfnp)]\[K/F,VL>'QWl@bYl)(.r=\#=9q_G7/?t-#-l2\gQhH=I%?/\`X5VD/JGQAKGSl;mL,U'9cLr^mK3!(q?DA@o`TZZVS,,Oj(3Y`]I)c:Zqn\SY`[k]-TRY.\3*Ej&a&F*TGp5<W/X6s(2^oekD?YDQGt%fuT0q2Fj]+DLcOXf;q!+DmZEi(:</D]@Q'`B@qe32qE9_;:1J_<$XBh4o%G!%"0E`hkO==[,OX#.6T9OW!\p'kE*U!7u1@e$ZFH16VilC=1!$"QMM&lo:=0JR5*Veu>7J180VcMO9N9\s+p8D:Bdju'\l9ihe:fSOQ[[HTa,Zm3/"AR^o2'n$YLLPLH#e)B[GDsY>%"t'b@I-$gqfCdF<.Ft!:cO?d2V=n-iA#S,_q&X_a!suH9Se9q@jB@BIfOmWERO~>endstream
endobj
53 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3020
>>
stream
Gb!l"lZ:f='*%C7@_["[DB+N:+-P&dkF@m0]/WeBV<uLk-3I,,`0_ea!4&a+os`jP&!N/)4-$M,CeH%h`F=%rq!B\MJVe:qq<LNN0Dj+DCOnpI56f:c*9b.m2uTL)7on3iE=K,=RLZ].D8W_B%R,ZmB$r4W7nCHGLfu_/UP*)<+_Vds-J7Mil<hA#(bnI3:]cVH0G@-a0CqF5MW#Sl^o&tG(Mj4?$mS'Y8iDMt4OYP3-U4+o`Pa,Vr$dh%:_iKP:q+StSG:(D?6;B/g4pihJRgHkOjlKo6'udT4birKkl1nt)D\"<GQNF!WTZ$H#tn5`aJ`(r^^XdT')3;u<3e36)+7/T^kWM%'W+jh-nGRpLEZ7()]:YQ']*d'/et$p&CY?-!L@qKm%VCa%Dc4OY_6\(2W'\YH47=sT]$`,alJE$1)L4(TGB6@&Ii3[#@"!@[#.`(oh)S49,0O"W3*<iTo$=`[?ns(h/Mj\PTjAJOO)r!C4b?]9ZUp%K9._TgPamhH)=`Kp-Voc0c(F%..&W%[)rN.Pr"=$o[gA1=c:O/]5GOl^(S.=WT-,/%T(lc!H8r-*reU)Jq-.^7qiJ<K]#7DXJi=#@0+Xi/QC#`*#sT[AH_`GV\Vc)X4;fG0s7aJ.9r>>3Z'"B9pj8Rpog@Mol^)@jE$U-k;=1_2#^'>B,jU:o,,_e/9ms.rJ\o1,]]B3kj*9]kF2u9?-J\G%OC=Ob,(9j%">r^74-D0Bs7)@&kY#N6U7d0E,gT;_PPp@9Z(\T#KJ2G#uEV&/rK1=3-tHk94Q=.@qamBc@<V($0"MfhdWM?RKbR3IL(rTGTf!Q=cHP)-57I1AG]0fc)=b*9Y9Vl%#E[7Apj'NWc#7_&i[/VLrT$?9RMr[iDMn$@lZa@+f9rG-i$+"06ZUt[<77pNmPAuj0IaA$q.V4'c21A-O-`NL`Lft2m49,:8b$7aiE[96RLUI'h&C[gM73)OV-=Zd+@IDJr5)mIX.)/o+U>ZGFuY;?CX7ppk!;E'DP6b-pJ6TD@uqI!^GI8gMlLo]]QY+H2Apn95nj1Ou-Q^YN*$KV)=*Pgm1$h(E'\"ibF!u>-lb%S"$2VLAlUP#)UiI!r])miNDc-i/]<reeLhI4HAJ6Y>#W*i\La'p?<Pk#q[-2D5*:E'r/_B`cN9%P7/Y*UmiUsLoF7Ke'WN(jomIKmZ![.iXg/GN#*r!FE-7[h*C.\58Pk[UB(,H"&cb&B66a'O<N1,.QGbP0ps8T`/Tur=FX9AkSQ22a9Bt<Iu6uVM?4OO/dDXedVrc:>`EG\*B[IW3:6F&A&E*rgU4l%4.b,?K@+^2a0@IuNU\I1j1$+^=N#jTBMr$p59`PpcFS7<=Vi;+kJ64mp5hpjd^;.Ad)E`2ki1E8?'9/k5V%[GaIQG_#&ejUP2cJ"5UUOe(`)YPn6)T"LeS;:0b9t+Q<VW?Y%]lQ*+P7q[\i>(\QbhDP/glZ6bho8gc_G/A2U"giD519o8JGL1_m'>K$-D5Wdt3I.ekBo/_brbo=kp]O85_X[]"&D/dn#D(V=<\T55Il?LG]bC"K3Z3fmFT3Nc00-CX%`a3Q'C>dUb!\47'.F-I2LjKNt4ogohGKSs93RX,oe@PG8cm'RWp#0:BFf,e_>2L0Y+346gRmK"b%`VmqPJa)+&ADD[nn)kpj9j3Qm_<0qBfb*XB2n=-nQHg&F6Kf^)k3@A9mC'Rl\'h%A$uQM)%="-sT_i)1^oP*KSc24`?KDW@[F0RiGlrB^Pm4ln)[P](@b87-(E%/+<GgkngG:sq@oqYAa)d.K3rkVT"`Pc5_B]3h2[LO7<$l>"`.pu&"UM"Q%!2\.(^E6NpcRGqJGp`;3+t!U@K<uK5Z:&Uq$V646^"kQ"]5&OSUO%8)?WK].:?9"5Z/1GK?3_e)FfkG3X.%%f"fbmGRoboGf4:MN`Rf5gFPD89KTfiX9_ks)%ZOROeo@Hi+Y-"\=ST:pJ1:%m.)E/"%lo"=_>,A>:?/Giuugl-D?JV'h%DO%h[6aJ_[+/R\d3t1[o\)hpoMkaJs:g?:=udB/=7\c.cHTMojS@>/c\\`ETt=<X#"3hlNZ?ejJnpZmpds<'1b&jMGelfXjQ,2*'m8n)ZjAANPXs12n[ET(O?dFUqDc^bR?q80D1MCZ7F3l.QfMWLiu^)N(?LK.OsYbe%&S:ZoQ4/sM7]=[qro"sK$^LjeIoG\W*bOSO)^a:hR4Ng)`4gY)<_a>[2Ep[-iKg8,>;h]Lk"-XeO5+][RWF2(Y^H1e>F<k:BN,fLFgCfg+^W@=<0J5`#eLhKI0)KMDU3l^W<T;`;fl<b"rX`hlm,d9=5a=lLcji61gWbDqDr]Q=@55i@s.jhXZk.=MPg]+V%4uIP*aK''GWX:L)No>:jV_\!9/B9HN%cuqhMc?=_9Btsr/jT8bcC!Ck'-:eK9J_YcdLWsXq8_fO(-ssnlgAb%OI12GWrnd(]9mXlSMV-0+Zh]GjN!_f=']5(BZ?05RH@t2=J,H4A*i#Vl^Zos7D7r(`&s@=_2J4."EGSPqL"CU5uBH=0(M7\W>;gCa;;F4>ZsMIA@tY)/+-*:qIjKbQ^*QiE5om(QfNPF*fRMJI3j4)j7(0aJ8Du8Y55knmp88_G7J@/a"0p75%<+T;1GSZn5R6#\Heau[6oHp-X=atS!iK7+:b,k"EMM0<3&3nbbTjP\U]*cruEcO_qqHj?XDGnX/;4"non'tb=h_JFNY'f46YP1[(f\IqS:O.IG,L:^,JUO?dZ&aT\c`D?_8m#lYVjs.8921Ts%6M.<c:@/,S#+!l[?-6ap:4jrnm4r<i>ml.XgL3[TgL6K\;6+IGLAYE)&Es0CF-gYOujg@ac=H[D]i0%&-eVVQ,\Q1fXpqn3Z1;*hAfU%ITQOqIFALKBeB\!FpiIc]\\-W'K]=K&<IG8u6W3lJ%OL`OZX4NH8u%'d/*:pYW:):7P/6m/0&MZliGNXCc3@p(Ao2F!Nl0\J'uZC)A2);hi+L=O;7NOX^Y=m]aTD)flFDf$IRqB'I*[LN~>endstream
endobj
54 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3911
>>
stream
Gb!l"=``=W&q9SYkXT1sd6&\39O?:OS8@3'@r##B/QYY4,U@G)&IJQld6?o8hZe=]P^(>Gm;-WbAipd#DKN54rUjS$FSmlCJ%[/DknK08)do$eSV&ZF7POcL(Xo-$7n1(21tHJUXH-cK(n,?Q,Q&T8itm]FQD9FJ\cfp5h`cL-Jh''QX*#HB"Uo4lJ90uZ54sI7i]Xr+l(9[.:%J-$J%#8k#It[]YjEVr9m99HCk63/[Q\[rRuC'cA0C978:JgNi'CYn1e\jCL'9;cq/8f&ra^@PL5J-_+uk21hs%UTUQmMSVa"I6ge)d,*^J=t>Nt->J%E.nM6=-/'.1k\bWR2V;#>G,-8V,>>EC<$-`>lp!eW;;>d9)SU=NA(Z*!7(h*$Gf2&[W@:cJ[)f!._\R97&$)'^uB".7lJE0kP6bOXrKX3@t4YVSm,`GA,b4^IZ&Q"AJ>M7Ue\*[R&[GBd,bT(=#=h12RJmU!<%YeN`X?qH-D`W>2:]pPm7%'O)cH[]/E%33&7Ru$n4&,L@d@R9$tj^ei1;;P.?)O>UgU<<HjINYoq7.B3ML9J(:VhkM:K2h'DWs3.hPJ2uf+l9==qq4?1)3][eRdka=;Z"Z6@62(cSt93ig?<&);7NML'_d-uS'h(JBYerCQdp,oItW7]V2hTcF]YCdgn(^trc2>-3$@C^R>!Q_&-5$lg*\&'`KEXQq)]uYUYf@.A=*9=.Q^HXLtPr7d/k35,mcp&-YZ*f0j-DS"k2_ZmP6,1Pd+MF)<pPr>SK^NU:^EAS.g?9A*=l$/.DVo:U:"&#n1,/Bt`l+Vi6#*Sr?r<SMT^84a4,p(add6Wm!cMec?<'np%:^0RROp_\V,$(@a;*GmNWQ)C#P0V9-pke)1\)Ymq&D2t^BADIFSb$6h`(h@6(?%#F)OFX0!c>$m"#5LGH[,Qnu?P5%kijmW!5T1>>[:.A^qG(8CS*ar[RPik0P/LZsH+l'(D]ss`%51U)\$X7?Oadf??KTFe!-:W\(I**3Y*@`Vu;mq3*:LO9rZ3<pD$4HWn/RU>4=MUhN!M9],peQ?HX)qYu>qj9!@O>"$r*_+TV;'*rQ0\65[f6/a%HJtC4a+3S`)*,#HGdhOb]Lbjm7q_7?2dU%\5U-$-Xd;Ep$c:e9SJ,;DWDBm4.1d:Jd>,g<=i$sfQ+N_!jOb_5'hjKXr,b5oal>"*UhpecZ9?W,S!kc<sX&%_48J@n7#SgS_/g8Np=RM;BdgR/$`Xs7hP`rStLOJQ!iYg3OVoobRRVSUKAfrc&Pd*Zg(3F.Y3$Kh,.`tTg[M4/0qUL24MqHT$84f;rK08@I<A;/Q8uuq]Na7P].C(_ut>ZN77"KK\Ok#Vl-/=)57j*L5XBMg8/j0Z*7Y90_ij-6]X\L$,;V5`T%/@oL2<\5\Nh_m+k#sWR##F)D4hS?G1ofQluYJW,?a1K4l=hd=9N'WL_o(o:KPO$\#NW5A:OoQ-u9;+]Rko$mI?0bNe&&/KgjZ9<X,":3rpaE0'JtI@Xb21!2u"r4gpRUN>LD=*=j@;tbm4RG1dF?cXF!*6qYk%tJ[XN#NH)C*TAZibdPK5\nH8&0E)#@Tshg`AOO`S15OrEhTrgU">iU*t,1,3UjMn'+ArjWtsa<<R@AW(VJSYJ1%+dMK2<8OcOE&[Xt5#k4?@rnC@RO@&\_cE0'A9i_&^IGFk786#_R']09-S6MG,3:'?.0RU]qW'=nH/%Hg+NE>TS@$XA0M'M7IEVNF@f1H_H,Sc1s0O5)ffe_?HE)=s,+qQUOC#FI4m\;87!h/))G.jO9$n*rH6U#ITp$!jk#*UFS$#9J4[P6_!s3'iq;^^N3&H5/S>[95uLAlhrK[\2me+c.pGJ@g?392O9s6K(Lmg18BU<.`l"/_md,E80*`D6q0ub]oMPS%MY@.=]Fa?&O8(Y,UZsjjmo!Oi2#!L'']7"n1&P/Wm7*#73H()r)8IEi1Vn@lS>0r#@#OG2W]Y..OLp60VA%kh/5S?K9n\T@MZZ?Yd`Qm:Z,(^h`$?"=>T=&7oc\B+f*E0_cH1foRf4%4u#t^s_r'oJ#]d`5?C",O$,QH+r6X;bS88qUAb_HVUgYT'5O4Ym5qCOcQ,YLpF_i:#fV)=V5T9UQfR>4"e?AE'VNFAJ=0t9,F'G6TXc0'$:JKrBPd;WJ'[\\2NSioY:49CA7Uag-N,R9F9:^7FT[3Q>P3b78qfC4\9iI2cu*(Dtm0E=%tJlS+=,R2(':f'k%WT-)+h]Z"+p(1>Dr;((^6@f":A"_C0cf7.8r91bY(`pZoEWUsY"=j=T3r(Z!nns2N$sZH7sl2.@'fS[V\LlgAVVg*42?>D,dpk3mFC9LMUU3*;>gP<)IB`?Ge+_dqSomX:H)op7DMS)_oSYpk+VmDJQnVQ=9:nm8*;3Pe+>XgkJ)"IS)G=S&g]S(eF4N4kfWGOf$C6@8*eQW)gP^a3Akd<M$9X-3b894F4"bL&ZQnA\1h[a8oYk/FJ[HOP;Ohjgc8bY5"/T!Z@IiLS]280d!5pJp7E^Hcuh5=0L6-!dYW:mNi`Co\__1``B&<T]R&]lohpk&,6/"WeBqd&D_0o6.Sd;K@:ZM3UKEem]s,E8d:BM8+G/b/GJqf!7JeHHY__Bj"s+/R0d>BqGtN)7!G>^Z#*I`Vu@>Y^sUd$MQ.';5luukRX=iqtt]\,&o7bVrpeYP_Cm(-d0Q,[+q_NGXu3(d2OZFWgf6D311T83B'`m?JO"hg+4c@"gPDWYV!mdl5k[?gc%UX_J)p2.;:P=TF-Ui6W;+6a*$hg/[5%&B7Xho,M-]F@KS"0+,;Wr&#r$W(iVAL:Pihr+CV4CN!;4_&TAn7,='"rY*?`Z:76?&A>/8tYaLUG\XcLMo]rE507/[:P^R3%fnYdU+!8gQGMWeu<@N*CWPBn)>:X*,oGsH/8IHs2f>BE9D892cAs<qQLb3V/$[pMnkMoEgq.b>!ElW4&B<P`_Or--Ea7`t7"@[As6_KNQQ)\pt]HgR+gR=TKY#RGT>AhkQY?Tg^CWfH+F.VPQeX@EZ<L>r"FGD]J2efoI/&jYE`V(Z2?.:KEl^hVYmiA2V\):rYlV5L9[O\RHf=_;4ELZ>&4]&r'E(bn,h`Ps5j5QXlF)70t:%C;nb?N#<f_#'l8O8h?(qb@I,BmGjI^T?Gm*4tOGtr:<delCb"q:N#fDea^RfYiMci`Ot-Mm?!2Up4WPU@cZ\nSW!R>@\1)C@K5,_uJS5_21J1#GI=D+qq7cF(4^o;BUf`UiSEC!as[3oY4U)4qj$hnZ4BiC5U32k"0bi>S.rgI<b'2]P=,>=l8,]`G5cgX*9el"KQ`N\>>`Y<CD=ndn3I(pTC*pGuO(,;VUs>u6KbK4<-7SA5ZFC,I21o[-ec6pA@W/,fio,[l_t;p^G9nFl_<X<$,Um(sWE^l;Q$r@EL2Vm=n,!cG#NPPuppPLH?8ZdTZ4?>OrrV*B)r[1M"4N,G(sA1IWALW&7.L]r1HJ?i9U/t4\baF*c+e^0<@30_ngV_Wc&i.8dN:1^X8+[L.9GOV.mJ-clY#$(7eAoG,qKeGK9P>6gZT&-K#q>oZ-bV'jPOX$:ZcPMf0,M?9Q:.u:,)VBF=*1rHtAt-;AZ^J=OQt;^WTs9+"*uM`,J7Fkpe+g%=DBndT=b?N$VKAu(Lb'QW^]B]6W%8mkRK<e1AdQd/CZ0$"<PXUnU>SmCbS6pbI`5:3(C$_X+&'c+e<tnS=g+2M9j%(D=Un]._Tg2fqJ.[.j[)FaO>l]29^(84bZ*Q_:9"Qibn^MbmKsV>n8D7W0co%Y4b'SdX&B`D`P)2@SABM`He9nb-XF>'*6\(V_m'7\Vc;\uXF0!A21^s_XhN8#BbT6i3#M_F-6pEqfWb7")h&LJ60`1^.2^"URV7G.[*5d52@N)aUVRe\Lg>=@E:b5`/uS+~>endstream
endobj
55 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3387
>>
stream
GatU6>BAO[%Xua-^tZGuM'D4slZ?KSm<0lAUlN'n&"2rA&oI5.&lhePlLV6pI6l[?]@P5t:7E`/5S*o[HiQT#a$1jHf*_V^B5i,lJ/BtE!3n?gAe/i>48X"eMOBd43>5W+@-fqCTj)#Sn*JfV$'&"[pi2%O8[TBY0FP]NPk<.G,C<a-UH0Yn(qCPY=[5n<,.Z\fU]P-jAC@4R]=iqlG[3r`0e"8VBu3%/!G6htljorX[g$\C\#)m1e:Cf#;G.m8P3lW.Co-*([UKdqi\0GjYbDaY8/B[-V@9&L9U?'4rq6=6pN2?krImd/oq)Lr7YYe?\mssq3.F<@drP0;J";qT[EsF!TE22D)5Q^&A1DP=\\F8;abGAm(CQP5."uo:TKn5m76YsJrT#a4ZdB]:7+4k>j%lF^$r*?2VJUos\rJtGJ2XhFf-8@"&\_k<d>DU"@Q8=X-;#++r]lV2:GKhoC/`K]q%PCoB>NQQi[(+=jJ>Id(5`<T1J\k&`1[L'e)j:JG@_r5c2@?%[k)5M%O#>!K'#'Zn?[.5UL:tr2"^_q)F*BC%I#cgQ>]r:c-fn`"Sku^@MIcU3tP_bT[#p2(JM0UR\[[[QY;LXR3l]&?+3q<El[YaSe?UaY[VASZY)CY0-^uDe?,&Jh**Tq<eMScQFhG=ILai-a)aA0o'IFd.'q"LSh&%S&>Z>D]4*Tf=5A<F^114LT5L-,cr?GEP^-PDlm:"<me5-!($^&>1>5$.00]ni'1Udb'Pbg4"E5eElk)#);2W]CKZ99i7PpjU2JpVfQ*5r2qE[NmMj,OH&`Nc0^OMeg'4Yk3":foV5G)@RH7r,Ugu0VE"n8#kkk3j!Hb\-Uo4g(AMa9n;%H(/FJ4Nrb^o)R1+Buq(5RFM5.Y3?5k'g7HeO)31>#oN92-`9Y_r$o'\heLef5,%ANoOl?H&R7j.^On1L9FMSNe2XRkQ8X%</bAGJNk@RZ"D)n1<1ghc/'>OMW.H6@RbS\;e-2DSKIoGn5Z-F+5iE\mu0\cckHPJR.5X,H,=s2S%^kBK-ndXl1bD1W[8-b>A+2-,')cj,311[k1$Gq7p$F&>I9#Q&BjGd'#\le?kO;oh3)o$K&j2kb#*V]7t'KfG,JU#7baLqkn,WtK@p5/5r\A++S`4!WKVT31$kT!>F\oh8ersc6$XU3`@qi_7Dt=nnRr5%J_\qV8Y:Ep<dJmFkEII;E_Y]6lP@4TMYp6R+pY?EQjYV*"PZ^k'sJqm&U'I%SiVa3,*CD#V-pOd'EWh71SYk*l!>IU+o[D@[)*fQ=ULQ7V">+U;f"`N('2j7*bH>)nhG26o(:'iY*0=P0_l"Xg4>t%Pqf8D':Nrm6k@3sQ/$;Oa5H5M20s_A4lM5*kVaXo&9*:k=Q*V:S])&!4BrO-0NF_cbN&n/RC(CqUTm`.#37.@*NOlYU09:Hl't7WW!sZf'@DCbd:*#%R'D/bPmN$0=Jr/uK7Mq!'oaCQZl$sMF0bP)V"#DBe9aP/@A<l=o4:1Rh$1.?Ta&'S2;Q-<FnUh-K@TKlJ-KGtHs@S,+oprlqU,")(lJZJ,_7W,@J3qUM".77>DQ0M4d.;r^Vr%CC9+3]6lf<1n/subRo=IZ\>['eUF&CGB<i'84j%AWCUkaT)=OKt4,KknWoNYGYi51rAuB*0TICFVK(P0)Z;4jHC-ne8_!%ZHGX-'(HRX@P(ka_Knj=h/)lpZ.C;FYdU@;j<ojYa#NqV]<2m$fQkeYF8)"NK<lgPS;h"21Nf(X.pMH)(<@]]Cp5?l_iP<</]2K=P9L@mPs<,OM6:lF+o5ZgOs7D^a!3NA;e;DU]+=!o"mpV'nl:U'N_4CNqS?_GLP6^[TP(%u2&FQ]eX[&3\<'fLpred;iYfW2C49fub:e-.:i=WbN$C5D3k53fBk64-j;_T-\1]Vk@G[o-_(L((:EJ588_p/Pl[TZTtdQ:MdW8>_f-=2P/2Z^XIi'XLRa.>TI"U5Pk@MKFhi$0DN'7b#WXQ6'hX]%uACIT#F-g9h;#"QE^`!JU45B,k<4VSOpn)j1H%2McjWBX$$%3#0[%$L,Rt1olS,TC-TcH`K69M6"%7'!g8$$bnTg?c[I#=6ig.??6Y1=Mk(R;2PTQ[7Skc?:NH=1[Kj=j<G/i4FK^h8Guj!eQ\4)!55\0blq0cm=^1&_gqWO(6hjJe1f_#D].d4<]gK/[6[J]R)D*?RgJ"jiCOEl)7"`[6q)>7;9%EN\!2(eO2o!O'@@R`K&A0.,cd[o0JR^*_WM<08:%M[$3A%E`$,c9/\L[sV.+eZ`Z1lPGDXtZjJSQC[WDA^S)&i03LTMA6k_1nMWG4a*F`2;-W(2.[HdM']1>m&3BW*]B&6Kn(=shW]\(VZDqA1h1Hdjs't@fK-3_]E:+Vh8H.QgH*[?W6<E=n^<Dhjr>cF_IY:so54E'NP=,M^,U6rnG;mn'b6)Q4Ke>$_fg8=!lG&u-P1e9K4.)HnA*>rajZu^H/`mFD4JmAg)dXC^SoV8OTNqS6$3X)9>_rWq&Vd.t96*Ans\MBZgjSj=`7j!-=F'HRTT0e#%Fcm"?@CUfB`uWqoO>6?e5fTr2eAC@2Y1i(.Fh_D-O$KE0?5No@R55*0$u]HA"_mae<5"-5S[Ke4'./@$'>pKK]e(s`nIf9jJ9l$c2)Aj8(PSjJ!kA=&H+*QpJbH3-G?QZ[O'WiU]q8X(Ep@VspNMtUG?"]-cWXaZp;C)*[b\";K1k#UC5K)T`0ca6_<lR9C\VrMH%Z<]AatI>_%Qm]`R&F:G7;4:WZO\cRB)@,`.(4]U_3X=n,A'FqoHH=W6ZYIAoiek5K.lK[=L["0r.t%1?u""n[UM*NPR3Nra0j@W7D3W?GAj-"j>kk1$\=6PUIhnh2YMd[!,N1l*1IWQ]d,j7BGa?=4<XgI@8pIbe?mAH<F\Ol4<NpMX@K)l4!0uI?Dk)X8As$=7_EA$T)68kLlErL<Fkd2^7YPhn`S@RKTYH;`:KiZM8R6Cm;DkfL+D)omjIY)=R;_HJU(=-8r5:C4[.&ghWSLH7SDiCW3Du<[N0aPt<jklnqV0>m&(&]:cTl?-?f_8Rq1W1r`i\aDao@`K6,GC4^T3l&M6[0uUIWgG,2<*O?_-=tQ*[goP1rA=2.5Wrum6]6-/l"LFS<s6bYK]t2;jT/CJS^K85Y=!-br$"@hXg1l?Vh:7=80ecjMm[;P-7L/,#UFk1%o*gtc'&eQ4>Sp3H,7X(pJ&.)hYqjAJ53k7.cXUsp0"lYpnbc]@&DioQNT/ns]t\*?WpA=mGj^WRNW%R3FKFUF#KN:#VU'!n1Nu@_=\\]g]k?V*DU7[]RI[$gD?_<&cj\O/J4:J^#[Ru\rnIZaen[RA/#'60/__7\A:h=!+Ee>PagtS!#;0FL$K1:NB7$/:~>endstream
endobj
xref
0 56
0000000000 65535 f
0000000061 00000 n
0000000146 00000 n
0000000253 00000 n
0000000365 00000 n
0000000512 00000 n
0000000659 00000 n
0000000806 00000 n
0000000953 00000 n
0000001100 00000 n
0000001247 00000 n
0000001395 00000 n
0000001544 00000 n
0000001693 00000 n
0000001841 00000 n
0000001989 00000 n
0000002137 00000 n
0000002285 00000 n
0000002433 00000 n
0000002581 00000 n
0000002730 00000 n
0000002846 00000 n
0000002952 00000 n
0000003030 00000 n
0000003114 00000 n
0000003320 00000 n
0000003647 00000 n
0000003853 00000 n
0000004059 00000 n
0000004265 00000 n
0000004471 00000 n
0000004558 00000 n
0000004891 00000 n
0000004966 00000 n
0000005068 00000 n
0000005183 00000 n
0000005310 00000 n
0000005430 00000 n
0000005559 00000 n
0000005710 00000 n
0000005809 00000 n
0000005924 00000 n
0000006043 00000 n
0000006155 00000 n
0000006279 00000 n
0000006423 00000 n
0000006543 00000 n
0000006673 00000 n
0000006789 00000 n
0000006884 00000 n
0000006980 00000 n
0000008056 00000 n
0000008996 00000 n
0000013043 00000 n
0000016155 00000 n
0000020158 00000 n
trailer
<<
/ID
[<e35c791b1039d8a464ca82208c6e5ad5><e35c791b1039d8a464ca82208c6e5ad5>]
% ReportLab generated PDF document -- digest (opensource)
/Info 31 0 R
/Root 30 0 R
/Size 56
>>
startxref
23637
%%EOF

View File

@@ -314,7 +314,7 @@ endobj
endobj
48 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115606+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115606+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184404+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184404+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Android Cast \204 Git flow \(green `master`\)) /Trapped /False
>>
endobj
@@ -450,10 +450,10 @@ endobj
endobj
74 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 891
/Filter [ /ASCII85Decode /FlateDecode ] /Length 870
>>
stream
Gat=*9iKe#&A@7.lnL1^B_?']JJMiY>UZ28\9MI#9OjPQ%[;HMahdL;'?ACC&ri`9Dr7^@/Kmsf@.h9.!NlO7]L>'i5n#/tJD_K_#I?WNr3@$"-r3_A>&-I80.bC$>9N@D1^'f>i'^K1g%QTj`Z3Ih/H_5tRo#/caanD<3?t7Eo*%JN%.gMN.e4j:RrDZM'4VsKOqQbSrW,gdkJESpc6.A>CtuRY@@gXq;g_<j0'5rBeP'olMlmm9d"?c?"f7=%>u2;g^-_%E`H*tEbO$KsRB,s&FVFL'^FmB>q-qnkOI<lF"VbQ[_R8&$'c2-&Bit:nnrKkQ3Zq.3_E;*qCE"\JDM*pN0t(;qdLYJaQ8oeKQJ!VoRBkM.<Z/j=QIA")%AWf:84=r"5Lq6/SCp,\=<H^+VsoT(]_nQn%.dMj`k\Y?L&Kn@Y(*la8ZSh>c*;-)Z#.JU<Opp4Aec>f,a:h&7<Jt/YAgm(4m"ZVQ2X#se/R?XgCCDFj\&p=Lued)XNWK1MSguMJ""X@c3&PiSiYXkc$Q`ko#'k-'7L!A%S5-6dr86QYd@:O$HrG"ma4,P!M`=?W*D#?TNb,c_nA,HdQC.]A2trdl(1?J+JpMM?\DF%Rh<=`FoQeAJ5;3ddCbqm.6imjS'IRn.+tBu)8aK5H7VSRk]GfqT"_=#3KSKTh5R4-o&V2U=UF3QgBc>nq+J&Aa_\)_p2L&9^Xj@nQkn-,:O;'I4*u[4O55Yb2CFZ7?,:$Y7,&*V1JM)./X$9)m`*U[@L\a;(:9EAKCV)H^VT+D6oPD%6)Xu23XF+UGR)&h]"51^":Diu/Vi)oe?M1W\t^]R7%oBYcOqf@[=\D14#DA[^.upR0hBTGk.V'o&rGgP=3N\A-"-HiJD!/(<Ja]~>endstream
Gat=*bAQ&g&A7ljp?2W5_rXfXVJ.'X0Mj#,g.Qr_YinK+-)HKh+Fd`r[]Du9=Y^8P+Ls9i]3L4]TXJ;)^J"XA"E64g5R,%3:_3ZD!kni%^D#C*$;$I0W;s%XU"gG"B9t1]pKSVg`,]f@WV5[<Lk%5#F>[]]dW#rc0ePHtmOMp<Zt-m9aIcjdSORl?7rT-U(%B;3L>04geN3SXa6?N?9F;RI]N@)[>chD&=A+kH-7]n]a,=sb\:e!hN",!r[R3>0,]XukKqPU\\paS-Nn8<`LgB.84\4DI!iGQO9AoMjn7TK1q3rX,V5Hh6e:`+Y'[S[5SkZYQ9/3k^[fVV&EKW@"Q^6;P%%4C]OH:D`?!:"T.N:hffoV@n5e!pnoJEn(%^A4BX3TZ=Vg8)@M<O+ScP$DaX:"\$@</8V]9Tanl;e\TeeQrjQ+noNfW:-8&kXF$U,n)*=1I+S%W`<N$G7`#l4%]g9o%>ii]50e`,Z')>%B'eYJN,Dq_Xf&-P-+uH"q?VS+l\0cI11YceueaWHrY)DK6C+<[pLGdG<LYHH/*TPc5Oc1WFc`X3kW`\8Qk[7I_j6NX9++Va1?>nVPS(@9MDu^fcr6qn3f]7n<,XhG#%-T;VXIk>"\bDj$\#iTL\5'SCRN4Rk1"?Iu(<8\E=9=OOD+Eg)ltJE$0CJEkP[KipU;[as%8\:</gbCk+6$Y`rkSc8W>5#gHMJ)_pLNT>h0GUSnlF+LcsBu@/`EeMNI(n++!-?ILbjq=dnILG5g(u9f-)PL=?<?jm>+_h-u+a?@U>?6GCTsqYqE;Mp9leSg)RR0FWH<?_@U'78ld-Wo]VGG_0enc%QjG[d?Hb^nhLgKn=S0D2=[P%]Lqu[8gJ%#~>endstream
endobj
75 0 obj
<<
@@ -602,20 +602,20 @@ xref
0000227373 00000 n
0000227462 00000 n
0000227597 00000 n
0000228579 00000 n
0000229825 00000 n
0000230056 00000 n
0000230286 00000 n
0000233490 00000 n
0000236177 00000 n
0000237626 00000 n
0000239527 00000 n
0000243954 00000 n
0000247347 00000 n
0000228558 00000 n
0000229804 00000 n
0000230035 00000 n
0000230265 00000 n
0000233469 00000 n
0000236156 00000 n
0000237605 00000 n
0000239506 00000 n
0000243933 00000 n
0000247326 00000 n
trailer
<<
/ID
[<e92ab2784f1d9b47bd66d5dd1205e8ba><e92ab2784f1d9b47bd66d5dd1205e8ba>]
[<27d85e779fba00f29f028dae9147e035><27d85e779fba00f29f028dae9147e035>]
% ReportLab generated PDF document -- digest (opensource)
/Info 48 0 R
@@ -623,5 +623,5 @@ trailer
/Size 85
>>
startxref
247812
247791
%%EOF

View File

@@ -153,7 +153,7 @@ endobj
endobj
25 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115606+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115606+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184404+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184404+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Android Cast \204 Graph Visualization Pivot) /Trapped /False
>>
endobj
@@ -315,7 +315,7 @@ xref
trailer
<<
/ID
[<1a9859941ac21a0ffe6521926edbbd6f><1a9859941ac21a0ffe6521926edbbd6f>]
[<c268bbf3393b6d9be5c109ba2597e046><c268bbf3393b6d9be5c109ba2597e046>]
% ReportLab generated PDF document -- digest (opensource)
/Info 25 0 R

View File

@@ -183,7 +183,7 @@ endobj
endobj
30 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115606+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115606+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184404+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184404+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Android Cast \204 production infrastructure) /Trapped /False
>>
endobj
@@ -270,10 +270,10 @@ endobj
endobj
47 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 857
/Filter [ /ASCII85Decode /FlateDecode ] /Length 842
>>
stream
Gat=*9lldX&A@sBlnQc7MH6?g9[]^mSK+)cl)>K=a9`^d/r"KGmjm@)5&+Ts0VC_[Hi(2(Pnnr)#HR;K!OrNqjq.V3"=l`'"9_Ni&Bt-tn8kIg7!Xq&crq+*I:7,=Qr&i`aanD<;=+D3P5,/&J"9_;4IFM-,h<)#Pg0DAc2^a;d&5ZZ#8(4sVGWr(&_r/r!e)r&@?Y>$\Lc_kKfEB"[Qh79AT#4In.*8lbe"Qin[!Y(WE)Q#UKURf'gf\&X6)h<Fe`/koaGs`:N6!5&QWG3Cn89-p50q6^;?Fh2d'I'CR#"-UaF=7Q)sZ^j]N[0="2-!j+GWP*K3Y7lk>+I=jKX[%BQ]aVgI\hN#nHU.RF17[RS[9bl/p,qE1smKNF],jVKpdR(#[4#$r#pm/J'2SUA2;[-Hqs)lp<@MDi3V[E$q$UQ^gn&rE9[/n+_oY"R5RDPLLi%kNE\,7J&9i,)W0Abh.i>X4hq2A^:5@2a$-VECDpi/dD,L\o&<`*8_rkCm9YN<<)OA2i<,-EKt=-nP4!HUR=E",numVfL)4J8R6t%8ZE5:U2BT`QK\<Qu6Wf!lT3$BCi?bDDNJ<V='uM!r1iA/Bimkj'm5hhK82(6ueV'GR,[DBMj`BdHSShlKX&Sgh[3J>aXl0DqVEi9Nj]dgPjKBRD1H!\(!nEq?Zg+qnCC4a0^r:3pF%*he`ArIh-aPdbIF^G7BIFLpdP%Vjk+A[\fQ;E]$42Lc&_G0PD!E#3C%oIY6#gLi*d(K2<"DF:b04n.(&ZFEM0F#S_U">7PlPWRpuoW_-3gLdDX<X<h$mC'FREGA[1EIGUHq@$"V,o^'E;,a!mh<FB,Vgjneq!mLWE@g7OJ~>endstream
Gat=*a_oie&A@rkk*Q?,_r3'ch6\e<(^1N[4nU"$FJ?R6;HZVS^Fq$+el#_<%)F:#]Jjb`6ZNa:rNQ.U,QOG=\6C."K4#'8Lk&k:?\@%()1JY$Osj+(!Es8*\M#MZ:(unI/iaL2/#k`T=u'G-jA.STM+9??K#F*cJC9inbS`[g$2Tn@q&k9Y72k8j*5R'50And!)IE"d.Q9edV%BQZglCR+>NY&]">:>A_RrNM'gL@>P\Pn?2QA&l?Qo'r^1pF(5rUh0Ch0I`=M`6;cP$$PF8<<g8Q:TcYV%eAT!#0((F[UadRHVZG+9Y5C$K)2>%XB\ABG*A6>g1XCH:3PY@7(Q)H%.SkdNF,?=ro7+kE!*eMY#!1,$Bl&Au02Bjoq".Dc!J.X$mq[ZXZYrNp&,@Ao@35@d`0G3:Xf,n`L@?,QRjgm+bWgd\pB*cQgZ,7J&9i1_coZ[@EZ=&>fK]aGV10FddFVEBA!^`O5f%el`DMtcqF\LdXcDB+b<-\pYE2dphZ7Ua^%g(Se1)dno03L+Z_#'?of@9C(04isFC)fMT50\t/*#K68MBCi@MDDU:R9&78N"n9X*XNd6Vj5U$C^$4=/M;g9.L_*=Ad(1(%UXP([e<L,3\_6EV"A]NDQY]SI-7tm8IiY5014N^jc`,1_h$NKkp@g<e*n*I0,,EgSI^=/(r&qdi8b4:>mLIgu'Q$Xmc7j)eCb7Y7jD'GC'Pkcp@F1U?%Ee-ir!&oX&D\I.#GE&hkTE9Gi#Mr=l0?Ek&Ld9[[iFhgWI91S=/@?F7%oD/W?k^jC'FREpMB[oICu&OA<:%0o^'Q?,a!mh<Cbmggk"l=!mLWE$$pmL~>endstream
endobj
48 0 obj
<<
@@ -367,16 +367,16 @@ xref
0000006431 00000 n
0000006540 00000 n
0000006643 00000 n
0000007591 00000 n
0000008486 00000 n
0000008716 00000 n
0000008944 00000 n
0000012295 00000 n
0000015841 00000 n
0000007576 00000 n
0000008471 00000 n
0000008701 00000 n
0000008929 00000 n
0000012280 00000 n
0000015826 00000 n
trailer
<<
/ID
[<6a21447e613b14d0d348f555435c2451><6a21447e613b14d0d348f555435c2451>]
[<6c9de0b8eae69d3f13c0b3c1e6685a9a><6c9de0b8eae69d3f13c0b3c1e6685a9a>]
% ReportLab generated PDF document -- digest (opensource)
/Info 30 0 R
@@ -384,5 +384,5 @@ trailer
/Size 54
>>
startxref
17880
17865
%%EOF

View File

@@ -0,0 +1,751 @@
# Installing macOS Sierra 10.12 as a XEN guest
<!-- doc-meta:start -->
| Field | Value |
|---|---|
| Author | Anton Afanasyeu |
| Revision | R0 |
| Creation date | 2026-06-26 |
| Last modification date | 2026-06-26 |
| Co-authored | Cursor Agent (project assistant) |
| Severity | low |
| State | in progress — HVM-only; CloverNG/OpenCore path |
| Document type | technical guide |
<!-- doc-meta:end -->
\newpage
\newpage
---
**Document type:** Technical guide
**PDF:** [Installing_MacOS_Sierra_10.12_as_XEN_guest.pdf](Installing_MacOS_Sierra_10.12_as_XEN_guest.pdf) · Regenerate: `bash ac-docs/build-pdf.sh`
**Scope:** Running macOS Sierra (10.12) as a XEN HVM guest using a `.dmg` source, OVMF UEFI firmware, and Clover or OpenCore EFI bootloader
**Documentation index:** [README.md](README.md)
---
> **Legal notice:** macOS is proprietary software. Apple's macOS EULA permits installation only on
> Apple-branded hardware. Running macOS on non-Apple hardware (including XEN virtual machines)
> violates Apple's EULA. This document is provided for research, testing, and educational purposes
> only. Do not use a macOS XEN guest in production or for commercial purposes without Apple-licensed
> hardware.
---
## Table of contents
<!-- toc -->
- [1. Prerequisites and host requirements](#1-prerequisites-and-host-requirements)
- [2. Critical constraint — HVM only, not paravirt](#2-critical-constraint--hvm-only-not-paravirt)
- [3. Architecture overview](#3-architecture-overview)
- [4. Bootloader choice — Clover vs OpenCore](#4-bootloader-choice--clover-vs-opencore)
- [5. Tools and packages](#5-tools-and-packages)
- [6. Step 1 — Convert .dmg to raw image](#6-step-1--convert-dmg-to-raw-image)
- [7. Step 2 — Create a bootable macOS installer disk](#7-step-2--create-a-bootable-macos-installer-disk)
- [8. Step 3 — Prepare the target installation disk](#8-step-3--prepare-the-target-installation-disk)
- [9. Step 4 — Obtain and configure Clover or OpenCore EFI](#9-step-4--obtain-and-configure-clover-or-opencore-efi)
- [10. Step 5 — XEN HVM domain configuration](#10-step-5--xen-hvm-domain-configuration)
- [11. Step 6 — AppleSMC and the OSK key](#11-step-6--applesmc-and-the-osk-key)
- [12. Step 7 — CPUID masking](#12-step-7--cpuid-masking)
- [13. Step 8 — Run the installer](#13-step-8--run-the-installer)
- [14. Step 9 — Post-install: Clover/OC on target disk](#14-step-9--post-install-cloveroC-on-target-disk)
- [15. Networking in the guest](#15-networking-in-the-guest)
- [16. Known issues and limitations](#16-known-issues-and-limitations)
- [17. Troubleshooting](#17-troubleshooting)
- [18. Comparison: Clover vs OpenCore for XEN](#18-comparison-clover-vs-opencore-for-xen)
- [19. References](#19-references)
- [20. Changelog](#20-changelog)
<!-- /toc -->
---
## 1. Prerequisites and host requirements
### XEN host (managed by Anton)
| Requirement | Value | Notes |
|-------------|-------|-------|
| XEN version | 4.14+ recommended | Older may lack OVMF features |
| CPU | Intel with VT-x + VT-d | Xeon Gold 5218 ✓ — SSE4.1 present |
| OVMF package | Installed on XEN host | `apt install ovmf` / `apk add ovmf` |
| QEMU | Installed on XEN host | XEN HVM uses QEMU as device model |
| VNC or SPICE | Available for console | Needed during installation |
| VT-d | Optional but helpful | For USB passthrough of physical keyboard/mouse |
### Caller actions (request from Anton)
```
VM request:
type = hvm ← mandatory; paravirt will NOT work (see §2)
memory = 4096 ← 4 GB minimum for installer
vcpus = 2
firmware = ovmf ← UEFI required; traditional BIOS loader will not boot macOS Sierra
VNC console access ← required during installation
```
### Preparation materials needed
| Item | Notes |
|------|-------|
| `Install macOS Sierra.app` or its `.dmg` | From Apple or Hackintosh image archive |
| Clover r5xxx `.zip` or OpenCore `.zip` | See §4 for which to choose |
| `macOS Sierra` base system `.dmg` or `BaseSystem.dmg` | Embedded in the installer |
| An EFI config for Sierra | `config.plist` — community presets available |
| AppleSMC OSK string | Required by macOS kernel — see §11 |
---
## 2. Critical constraint — HVM only, not paravirt
**macOS cannot run in XEN paravirt mode.** This is a hard technical blocker, not a configuration issue:
| Mode | Works? | Reason |
|------|--------|--------|
| HVM (`type = "hvm"`) | **Yes** | Full hardware emulation (VT-x); macOS sees real x86 hardware |
| Paravirt (`type = "pv"`) | **No** | Paravirt replaces hardware with Xen hypercalls; macOS has no XEN PV drivers and the boot sequence is incompatible |
| PVH | **No** | Hybrid mode still lacks the UEFI environment macOS requires |
This means **the macOS guest must be an HVM VM**. If the project moves to paravirt-only nodes for cost/performance reasons, macOS cannot share that pool — it needs a dedicated HVM-capable slot.
Confirm with Anton that the XEN host has hardware VT-x enabled (`xm info | grep hvm` or `xl info | grep virt_caps` should show `hvm`).
---
## 3. Architecture overview
```text
XEN Host (Gentoo / any Linux, Intel VT-x)
└── HVM Guest: macos-sierra
├── OVMF (UEFI firmware) ← provided by XEN host, replaces BIOS
│ └── boots from EFI partition on disk
├── EFI disk / partition
│ └── Clover or OpenCore ← macOS-aware UEFI bootloader
│ ├── injects AppleSMC
│ ├── patches CPUID (Hackintosh-style)
│ ├── provides fake SMBios (Mac model)
│ └── chainloads macOS boot.efi
├── macOS installer disk (hdb) ← converted from .dmg
└── Target disk (hda) ← blank disk, macOS installs here
```
**Why OVMF + Clover/OC (not just OVMF alone):**
OVMF provides UEFI, but macOS additionally requires Apple-specific firmware tables (SMBios,
AppleSMC, NVRAM layout). Clover and OpenCore are bootloaders that inject these tables into the
EFI environment before handing off to macOS's `boot.efi`. Without them, macOS halts early with
a kernel panic or simply refuses to boot on non-Apple hardware signatures.
---
## 4. Bootloader choice — Clover vs OpenCore
### Clover (r5xxx)
- The original Hackintosh bootloader
- Loads from EFI partition; injects SMBios, AppleSMC, CPUID patches, kexts
- Mature ecosystem; many pre-made Sierra configs available
- Some quirks with NVRAM on OVMF; workaround: `EmuVariableUefi.efi` emulated NVRAM driver
- Active maintenance: [github.com/CloverHackyColor/CloverBootloader](https://github.com/CloverHackyColor/CloverBootloader)
### OpenCore (0.9+)
- Modern replacement for Clover; cleaner injection model
- Better NVRAM support with OVMF (uses `OpenVariableRuntimeDxe.efi` or OVMF's native NVRAM)
- Stricter config validation (`ocvalidate` catches errors before boot)
- Supports Sierra with minor adjustments (`MinVersion` quirks)
- Preferred for new setups
- Guide: [dortania.github.io/OpenCore-Install-Guide](https://dortania.github.io/OpenCore-Install-Guide/)
### Recommendation for XEN + OVMF
**OpenCore** is recommended for new installations with OVMF on XEN — it handles OVMF's emulated
NVRAM better than Clover and has active maintenance for recent XEN versions. Clover remains viable
if you already have a working Clover config from a KVM/QEMU Hackintosh.
**"CloverNG"** — if this refers to the next-generation CloverBootloader (post-r5100 series from
CloverHackyColor), it is functionally equivalent to standard Clover from a XEN perspective.
If it refers to OpenCore, use the OpenCore path below.
---
## 5. Tools and packages
### On a Linux workstation (or the XEN dom0 / a Linux VM)
```bash
# Debian/Ubuntu
apt install dmg2img qemu-utils p7zip-full
# Alpine
apk add dmg2img qemu-img p7zip
# macOS (if available — easiest for DMG handling)
# hdiutil is built in; no extra packages needed
```
| Tool | Purpose |
|------|---------|
| `dmg2img` | Convert Apple DMG to raw IMG on Linux |
| `qemu-img` | Create/convert virtual disk images (qcow2, raw) |
| `p7zip` / `7z` | Extract Clover or OpenCore zip archives |
| `hdiutil` | macOS native DMG tool (only if macOS workstation available) |
| `fdisk` / `gdisk` | Partition the installer image for EFI setup |
| `mtools` | Write files to FAT32 EFI partition without mounting as root |
---
## 6. Step 1 — Convert .dmg to raw image
The `.dmg` from Apple (or third-party Hackintosh sources) must be converted to a flat raw image
that XEN can use as a virtual disk.
### Option A — Linux with `dmg2img`
```bash
dmg2img -i "Install_macOS_Sierra_10.12.6.dmg" -o sierra_installer.img
# Output: sierra_installer.img (raw format)
```
If `dmg2img` fails (some DMG variants use encryption or non-standard compression):
```bash
# Try 7zip extraction first
7z x "Install_macOS_Sierra_10.12.6.dmg" -o./sierra_extracted/
# Look for .img, .hfs, or BaseSystem files inside
```
### Option B — macOS workstation with `hdiutil`
```bash
hdiutil convert "Install macOS Sierra.dmg" -format UDRW -o sierra_rw
mv sierra_rw.dmg sierra_installer.img
# UDRW = uncompressed read-write; directly usable as raw disk
```
### Verify the image
```bash
qemu-img info sierra_installer.img
# Should show: format=raw, virtual size ~5-8 GB for Sierra installer
file sierra_installer.img
# Should identify as: Apple disk image or DOS/GPT partition table
```
> **Note on EFI:** The user correctly identified that converting the DMG produces an EFI-based
> disk (GPT partition table with an EFI system partition). This is expected and correct for
> macOS Sierra. The installer image cannot be mounted as a simple CDROM/ISO — it must be
> presented as a virtual hard disk in HVM mode and booted via UEFI (OVMF). A traditional
> BIOS/MBR boot path does not exist for Sierra+.
---
## 7. Step 2 — Create a bootable macOS installer disk
The raw `.img` from step 6 may be the full `Install macOS Sierra.app` disk, or it may be a
recovery-only image. Determine which you have:
```bash
# Mount on Linux to inspect (requires HFS+ support):
apk add hfsprogs # or: apt install hfsprogs
mkdir /mnt/sierra_check
mount -t hfsplus -o ro sierra_installer.img /mnt/sierra_check
ls /mnt/sierra_check
# If you see "Install macOS Sierra.app" → full installer ✓
# If you see "BaseSystem.dmg" only → recovery image; need to extract BaseSystem
```
### If the image is a full installer (preferred)
Convert to qcow2 for efficient sparse storage:
```bash
qemu-img convert -f raw -O qcow2 sierra_installer.img sierra_installer.qcow2
```
This image becomes `hdb` (the installer disk) in the XEN config.
### If only BaseSystem.dmg is present (recovery path)
```bash
# Extract BaseSystem from the installer structure:
# On macOS:
cd /Applications/Install\ macOS\ Sierra.app/Contents/SharedSupport/
# Copy InstallESD.dmg and BaseSystem.dmg
# On Linux: extract from the converted DMG
7z x sierra_installer.img InstallESD.dmg
dmg2img InstallESD.dmg installesd.img
# Mount installesd.img and copy BaseSystem.dmg out
```
The recovery path produces a minimal boot environment sufficient to run the macOS installer,
but internet access or a local macOS packages cache may be needed.
---
## 8. Step 3 — Prepare the target installation disk
Create a blank virtual disk that macOS will install onto:
```bash
# 60 GB target disk (minimum 40 GB; 60 GB gives comfortable headroom)
qemu-img create -f qcow2 macos_sierra_target.qcow2 60G
```
This disk starts blank. macOS Disk Utility (during installation) will partition and format it
as GPT + HFS+.
---
## 9. Step 4 — Obtain and configure Clover or OpenCore EFI
### Option A — OpenCore (recommended)
Download the latest OpenCore release from:
[github.com/acidanthera/OpenCorePkg/releases](https://github.com/acidanthera/OpenCorePkg/releases)
```bash
mkdir opencore_efi && cd opencore_efi
wget https://github.com/acidanthera/OpenCorePkg/releases/download/0.9.x/OpenCore-0.9.x-RELEASE.zip
unzip OpenCore-0.9.x-RELEASE.zip
```
**Minimum EFI structure for Sierra on XEN/QEMU:**
```
EFI/
BOOT/
BOOTx64.efi ← OpenCore main loader
OC/
OpenCore.efi
config.plist ← main configuration
ACPI/ ← DSDT/SSDT patches (may be empty for VM)
Drivers/
OpenRuntime.efi ← required
ResetNvramEntry.efi
Kexts/
Lilu.kext ← required base
VirtualSMC.kext ← AppleSMC emulation (replaces hardware SMC)
WhateverGreen.kext ← GPU fixes (optional for headless)
IntelMausi.kext ← for e1000 NIC (or use AppleIGB)
Tools/
OpenShell.efi ← useful for debugging
```
**Key `config.plist` settings for XEN:**
```xml
<!-- Kernel → Quirks -->
<key>DisableIoMapper</key><true/>
<key>XhciPortLimit</key><true/>
<!-- Misc → Security -->
<key>ScanPolicy</key><integer>0</integer>
<!-- NVRAM → Add → 7C436110-... -->
<key>boot-args</key>
<string>-v keepsyms=1 debug=0x100</string> <!-- verbose boot for debugging -->
<!-- PlatformInfo → Generic -->
<!-- Use MacPro6,1 or iMac17,1 SMBIOS for Sierra compatibility -->
<key>SystemProductName</key><string>iMac17,1</string>
```
Generate `MLB`, `ROM`, `SystemSerialNumber`, `SystemUUID` using `macserial` (from OpenCore tools)
or GenSMBIOS. Use random/generated values — do not reuse real Apple serial numbers.
### Option B — Clover (r5xxx)
Download from:
[github.com/CloverHackyColor/CloverBootloader/releases](https://github.com/CloverHackyColor/CloverBootloader/releases)
**Minimum EFI structure:**
```
EFI/
BOOT/
BOOTX64.efi
CLOVER/
CLOVERX64.efi
config.plist
drivers/
UEFI/
ApfsDriverLoader.efi ← for APFS if upgrading later
AptioMemoryFix.efi ← NVRAM fix for OVMF
EmuVariableUefi.efi ← emulated NVRAM (important for XEN/OVMF)
FSInject.efi
HFSPlus.efi ← HFS+ filesystem driver
kexts/
Other/
Lilu.kext
VirtualSMC.kext ← or FakeSMC.kext (older alternative)
IntelMausi.kext
```
**Key `config.plist` settings for XEN/OVMF:**
```xml
<key>RtVariables</key>
<dict>
<key>LogEveryBoot</key><string>10</string>
<key>MountEFI</key><string>Yes</string>
</dict>
<key>SMBIOS</key>
<dict>
<key>ProductName</key><string>iMac17,1</string>
<!-- Generate BoardSerialNumber, SerialNumber, SmUUID with Clover Configurator -->
</dict>
<!-- Boot → Arguments -->
<key>Arguments</key><string>-v dart=0 debug=0x100 keepsyms=1</string>
```
### Embed EFI into installer disk
The Clover/OC EFI files need to be on the **EFI system partition (ESP)** of the installer disk
or on a separate small EFI disk image.
**Recommended: separate EFI disk (simplest for XEN)**
```bash
# Create a small FAT32 EFI disk
dd if=/dev/zero of=efi_boot.img bs=1M count=200
parted efi_boot.img mklabel gpt
parted efi_boot.img mkpart EFI fat32 1MiB 199MiB
parted efi_boot.img set 1 esp on
# Format the FAT32 partition (offset 1MiB = sector 2048)
mkfs.fat -F32 -n EFI \
--offset 2048 \ # 1MiB in 512-byte sectors
efi_boot.img # note: loopback mount preferred
# Mount and copy EFI files
losetup -P /dev/loop0 efi_boot.img
mkfs.fat -F32 /dev/loop0p1
mount /dev/loop0p1 /mnt/efi
cp -r EFI/ /mnt/efi/
umount /mnt/efi
losetup -d /dev/loop0
```
This `efi_boot.img` becomes `hdc` (or `hda` — first boot device) in the XEN config.
---
## 10. Step 5 — XEN HVM domain configuration
Create `/etc/xen/macos-sierra.cfg`:
```python
# macOS Sierra 10.12 — XEN HVM config
# REQUIRES HVM HOST CAPABILITY (Intel VT-x)
type = "hvm"
name = "macos-sierra"
memory = 4096 # 4 GB minimum; 8 GB recommended
vcpus = 2
maxvcpus= 2
firmware = "ovmf" # UEFI; critical — do NOT use "bios"
# Disk layout:
# hda = EFI bootloader disk (boots first via OVMF)
# hdb = macOS installer image (from §7)
# hdc = blank target disk (from §8)
disk = [
'file:/path/to/efi_boot.img,hda,w',
'file:/path/to/sierra_installer.qcow2,hdb,r',
'file:/path/to/macos_sierra_target.qcow2,hdc,w',
]
# Network: e1000 emulates Intel 82540EM — supported by macOS Intel kext
vif = ['type=ioemu,model=e1000']
# USB tablet for mouse (avoids mouse capture issues in VNC)
usbdevice = 'tablet'
# VNC console (required for visual install)
vnc = 1
vnclisten = "127.0.0.1"
vncpasswd = ""
vncunused = 1 # picks next free port starting at 5900
# Serial console (helpful for kernel panic debug)
serial = "pty"
# QEMU extra device args (AppleSMC + display)
device_model_args = [
# AppleSMC — macOS kernel checks for this device; OSK must be set (see §11)
"-device", "applesmc,osk=<REPLACE_WITH_OSK>",
# Cirrus VGA (simplest; QXL or VirtIO may not work during macOS install)
"-vga", "cirrus",
# Sound (optional; macOS may probe for it)
"-device", "ich9-intel-hda",
"-device", "hda-duplex",
]
# CPUID masking — hide hypervisor bit from macOS (see §12)
cpuid = [
"0x80000001:ecx=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0",
]
```
> **On `firmware = "ovmf"`:** XEN must have the OVMF binary available. The path is typically
> `/usr/share/ovmf/OVMF.fd` or `/usr/share/qemu/OVMF.fd`. If XEN doesn't find it, it falls back
> to the legacy BIOS hvmloader — check with Anton that OVMF is installed on the host.
---
## 11. Step 6 — AppleSMC and the OSK key
The Apple System Management Controller (SMC) is a coprocessor present in all Apple hardware.
macOS checks for its presence during boot. QEMU (used as XEN's HVM device model) can emulate
an SMC with:
```
-device applesmc,osk=<128-char-hex-string>
```
The OSK (Output Signal Key) is a 64-byte string specific to Apple hardware. It is technically
part of Apple's proprietary firmware but is widely documented in the Hackintosh community.
**How to obtain the OSK:**
- From a physical Mac: run an AppleSMC reader tool (e.g. `smcutil`)
- From the Hackintosh community: the OSK for common boards is documented; search for
"QEMU macOS applesmc osk" — the value is the same across all OSK-based macOS versions
- The OSK is 64 bytes (128 hex characters) passed to `-device applesmc,osk=...`
> **Do not confuse** the OSK with Apple serial numbers. The OSK is a fixed hardware key, not
> a device identifier. It does not uniquely identify a machine.
**VirtualSMC vs hardware applesmc:**
If using OpenCore with `VirtualSMC.kext`, the kext handles SMC emulation in software and
the `applesmc` QEMU device may not be strictly required. However, including both is safe
and the hardware device takes precedence. For Clover with `FakeSMC.kext`, the kext similarly
provides SMC emulation.
---
## 12. Step 7 — CPUID masking
macOS detects hypervisors via the `HYPERVISOR` CPUID bit and may behave differently or refuse
to boot. Additionally, XEN presents XEN-specific CPU topology that can confuse macOS.
**Mask the hypervisor bit (XL config):**
```python
# Hide bit 31 of CPUID leaf 0x80000001 ECX (hypervisor presence)
cpuid = [
"0x80000001:ecx=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0",
]
```
**Set a clean CPU vendor string (optional but recommended):**
```python
# Present as plain Intel, not XEN-modified
device_model_args = [
...,
"-cpu", "host,vendor=GenuineIntel,+sse4.1,+sse4.2,-hypervisor,kvm=off",
]
```
**CPU topology (macOS prefers 1 socket × N cores):**
```python
# In XL config
vcpus = 2
cores_per_socket = 2
threads_per_core = 1
# Results in: 1 socket, 2 cores, 1 thread → macOS shows "2-Core Intel Core i7"
```
`-hypervisor` removes the CPUID hypervisor bit at the QEMU level; the XL `cpuid` directive
masks it at the XEN level. Apply both for robustness.
---
## 13. Step 8 — Run the installer
### Start the VM
```bash
xl create /etc/xen/macos-sierra.cfg
# Check it started:
xl list
# Connect to VNC console:
# Port = 5900 + vnc display number (check xl list or /var/log/xen/)
vncviewer 127.0.0.1:5900
```
### Boot sequence
1. OVMF loads → shows TianoCore logo briefly
2. OVMF detects the EFI partition on `hda` → loads `BOOTx64.efi` (Clover or OC)
3. Bootloader screen appears — select "Install macOS Sierra" or "Boot macOS Install from ..."
4. macOS boot sequence (verbose if `-v` set) — expect ~510 minutes for kernel load on first boot
5. macOS installer GUI appears (language selection)
### Installation steps
1. **Language selection** → proceed
2. **Disk Utility** → select `hdc` (target, ~60 GB) → Erase → Format: **Mac OS Extended (Journaled)**, scheme: **GUID Partition Map** → name it (e.g. "Macintosh HD")
3. Back to installer → Install macOS → select "Macintosh HD"
4. Installation runs (~3060 min); VM will restart several times automatically — each time it should boot back to the installer progress screen
5. Final restart → macOS Setup Assistant (user account, locale, etc.)
> **If the VM reboots but boots the installer again** instead of the installed disk: the EFI boot
> order has not changed. In the bootloader menu, manually select the installed disk. After install
> completes, update the bootloader config to default-boot the target disk.
---
## 14. Step 9 — Post-install: Clover/OC on target disk
After installation, the target disk (`hdc`) has macOS installed but no bootloader. Move the EFI
setup to the target disk so it boots independently.
### Mount the EFI partition of the target disk
```bash
# On Linux with the VM shut down:
losetup -P /dev/loop1 macos_sierra_target.qcow2 # may need qemu-nbd for qcow2
# or: qemu-nbd --connect=/dev/nbd0 macos_sierra_target.qcow2
mount /dev/loop1p1 /mnt/target_efi # p1 = EFI partition
```
### Copy the EFI bootloader
```bash
cp -r /mnt/efi/EFI/ /mnt/target_efi/
umount /mnt/target_efi
```
### Update XL config to boot from target disk only
```python
# Final production config — no installer disk needed
disk = [
'file:/path/to/macos_sierra_target.qcow2,hda,w',
]
```
OVMF will now boot from the EFI partition on the target disk → Clover/OC → macOS Sierra.
---
## 15. Networking in the guest
XEN HVM with `model=e1000` emulates the Intel 82540EM NIC. macOS Sierra includes built-in
drivers for this chipset (`AppleIntelE1000e.kext` or loaded via `IntelMausi.kext`).
**Expected:** Ethernet appears automatically in System Preferences → Network after install.
**DHCP:** Works out of the box if the XEN virtual network bridge provides DHCP (standard
XEN networking with `xenbr0` and the host running dnsmasq).
**Static IP:** Set in macOS Network preferences if needed.
**No internet to iCloud/App Store:** macOS will detect non-Apple hardware signatures (unless
correct SMBIOS + serial number is configured) and refuse App Store login. For pure testing
purposes, network access to local services and `apps.f0xx.org` should work fine without this.
---
## 16. Known issues and limitations
| Issue | Cause | Workaround / Status |
|-------|-------|---------------------|
| No GPU acceleration | Cirrus VGA is 2D only; Metal requires real GPU or PCIe passthrough | Use headless or accept software rendering; Cirrus sufficient for testing |
| Kernel panic on boot | Missing SMC, bad CPUID, wrong SMBIOS | Check §11§12; add `-v` to boot args for verbose panic |
| NVRAM not persisting | OVMF emulated NVRAM resets on shutdown | Use `EmuVariableUefi.efi` (Clover) or `OpenVariableRuntimeDxe.efi` (OC); or save NVRAM to file |
| USB mouse/keyboard lost | USB tablet works but real USB may need passthrough | `usbdevice = 'tablet'` in XL config handles mouse; keyboard via VNC |
| macOS updates may break boot | OTA updates overwrite `boot.efi` and may change kext requirements | Snapshot before updating; keep bootloader kexts updated |
| iCloud / App Store blocked | Missing/wrong Apple serial; Apple server check | Expected for VM use; not needed for testing/dev purposes |
| Very slow boot (> 15 min) | QEMU Cirrus VGA rendering overhead; slow disk emulation | Use `qcow2` with preallocation or raw disk; increase memory |
| Stuck at "2 minutes remaining" | Common Sierra installer bug | Wait; may take 15+ min; do not power off |
| HVM slot unavailability | Anton's XEN host may limit HVM guest count | Coordinate with Anton; confirm `xl info | grep hvm` shows `hvm=1` |
| Sound/audio | ICH9-HDA device available but macOS may not auto-configure | Install `VoodooHDA.kext` if audio needed |
---
## 17. Troubleshooting
### VM fails to start
```bash
xl create -c /etc/xen/macos-sierra.cfg
# -c attaches console immediately; shows QEMU startup errors
```
Check: does `xl info | grep hvm` show `hvm=1`? If not, VT-x is not available or enabled.
### Bootloader screen never appears (OVMF logo then black)
- OVMF did not find a bootable EFI on `hda`
- Verify: `efi_boot.img` has a valid GPT ESP partition with `EFI/BOOT/BOOTx64.efi`
- In OVMF shell (press `F2` or `Esc` during TianoCore logo): run `Shell → fs0: → dir EFI`
### macOS installer kernel panic immediately
- Check AppleSMC OSK is set correctly (non-empty, correct length)
- Add `-v -x` (verbose + safe mode) to boot args
- Check CPUID masking (§12) — remove it and try without; then add back
### Installer runs but network is unavailable
- Verify XEN `vif` is correct and `xenbr0` is up on host: `ip link show xenbr0`
- Check macOS System Preferences → Network for the Ethernet adapter
- Install `IntelMausi.kext` if the NIC is not recognized
### VM reboots after install but shows installer again
- OVMF boot order still prefers `hda` (EFI boot disk) over the installed `hdc`
- In bootloader menu: manually select the installed macOS disk
- After booting successfully once: update bootloader config default entry
---
## 18. Comparison: Clover vs OpenCore for XEN
| Aspect | Clover (r5xxx) | OpenCore (0.9+) |
|--------|---------------|----------------|
| NVRAM on OVMF | Requires `EmuVariableUefi.efi` | Native OVMF NVRAM support; more reliable |
| Sierra support | Excellent; many Sierra configs available | Good; needs `MinVersion`/`MaxVersion` quirks |
| QEMU/XEN compatibility | Mature; known-good with QEMU 5+ | Excellent; actively tested on QEMU/KVM/XEN |
| Config validation | Manual; errors only visible at boot | `ocvalidate` CLI tool catches errors before boot |
| Kext injection | Flexible; some ordering quirks | Strict ordering; predictable |
| Long-term maintenance | Slower; fewer active contributors | Active; new releases regularly |
| Community resources for XEN | Fewer specific guides | Growing; Docker-OSX project uses OC on KVM (close to XEN) |
| Recommended for new install | Only if migrating existing config | **Yes** |
---
## 19. References
| Resource | URL / note |
|----------|-----------|
| OpenCore Install Guide | https://dortania.github.io/OpenCore-Install-Guide/ |
| OpenCore Legacy Patcher | https://dortania.github.io/OpenCore-Legacy-Patcher/ (Sierra section) |
| CloverBootloader releases | https://github.com/CloverHackyColor/CloverBootloader |
| Docker-OSX (KVM/QEMU reference) | https://github.com/sickcodes/Docker-OSX — useful architecture reference even for XEN |
| VirtualSMC kext | https://github.com/acidanthera/VirtualSMC |
| Lilu kext | https://github.com/acidanthera/Lilu |
| IntelMausi NIC kext | https://github.com/acidanthera/IntelMausi |
| QEMU applesmc documentation | `man qemu-system-x86_64`; search `-device applesmc` |
| XEN HVM OVMF setup | https://wiki.xenproject.org/wiki/OVMF |
| GenSMBIOS (serial generation) | https://github.com/corpnewt/GenSMBIOS |
---
## 20. Changelog
| Rev | Date | Change |
|-----|------|--------|
| R0 | 2026-06-26 | Initial guide — HVM+OVMF+OpenCore path; Clover alternative; known issues |

View File

@@ -0,0 +1,879 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 50 0 R /F4 51 0 R /F5 52 0 R /F6 53 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 45.68504 762.0394 183.077 773.0394 ] /Subtype /Link /Type /Annot
>>
endobj
5 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 59.68504 751.6019 161.4 761.6019 ] /Subtype /Link /Type /Annot
>>
endobj
6 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 59.68504 741.6019 175.9725 751.6019 ] /Subtype /Link /Type /Annot
>>
endobj
7 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 59.68504 731.6019 158.0625 741.6019 ] /Subtype /Link /Type /Annot
>>
endobj
8 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 45.68504 721.0394 207.509 732.0394 ] /Subtype /Link /Type /Annot
>>
endobj
9 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 45.68504 710.0394 131.045 721.0394 ] /Subtype /Link /Type /Annot
>>
endobj
10 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 45.68504 699.0394 203.525 710.0394 ] /Subtype /Link /Type /Annot
>>
endobj
11 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 59.68504 688.6019 106.35 698.6019 ] /Subtype /Link /Type /Annot
>>
endobj
12 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 59.68504 678.6019 116.1675 688.6019 ] /Subtype /Link /Type /Annot
>>
endobj
13 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 59.68504 668.6019 177.015 678.6019 ] /Subtype /Link /Type /Annot
>>
endobj
14 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 45.68504 658.0394 126.173 669.0394 ] /Subtype /Link /Type /Annot
>>
endobj
15 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 59.68504 647.6019 244.3425 657.6019 ] /Subtype /Link /Type /Annot
>>
endobj
16 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 45.68504 637.0394 186.189 648.0394 ] /Subtype /Link /Type /Annot
>>
endobj
17 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 59.68504 626.6019 166.8075 636.6019 ] /Subtype /Link /Type /Annot
>>
endobj
18 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 59.68504 616.6019 202.65 626.6019 ] /Subtype /Link /Type /Annot
>>
endobj
19 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 59.68504 606.6019 113.8725 616.6019 ] /Subtype /Link /Type /Annot
>>
endobj
20 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 45.68504 596.0394 228.877 607.0394 ] /Subtype /Link /Type /Annot
>>
endobj
21 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 59.68504 585.6019 189.7275 595.6019 ] /Subtype /Link /Type /Annot
>>
endobj
22 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 59.68504 575.6019 227.6625 585.6019 ] /Subtype /Link /Type /Annot
>>
endobj
23 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 45.68504 565.0394 211.101 576.0394 ] /Subtype /Link /Type /Annot
>>
endobj
24 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 45.68504 554.0394 252.893 565.0394 ] /Subtype /Link /Type /Annot
>>
endobj
25 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 59.68504 543.6019 190.1475 553.6019 ] /Subtype /Link /Type /Annot
>>
endobj
26 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 59.68504 533.6019 147.2025 543.6019 ] /Subtype /Link /Type /Annot
>>
endobj
27 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 59.68504 523.6019 154.7175 533.6019 ] /Subtype /Link /Type /Annot
>>
endobj
28 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 45.68504 513.0394 207.533 524.0394 ] /Subtype /Link /Type /Annot
>>
endobj
29 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 45.68504 502.0394 195.541 513.0394 ] /Subtype /Link /Type /Annot
>>
endobj
30 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 45.68504 491.0394 151.501 502.0394 ] /Subtype /Link /Type /Annot
>>
endobj
31 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 45.68504 480.0394 152.405 491.0394 ] /Subtype /Link /Type /Annot
>>
endobj
32 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 59.68504 469.6019 101.37 479.6019 ] /Subtype /Link /Type /Annot
>>
endobj
33 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 59.68504 459.6019 109.7175 469.6019 ] /Subtype /Link /Type /Annot
>>
endobj
34 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 59.68504 449.6019 115.545 459.6019 ] /Subtype /Link /Type /Annot
>>
endobj
35 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 45.68504 439.0394 225.757 450.0394 ] /Subtype /Link /Type /Annot
>>
endobj
36 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 59.68504 428.6019 193.0875 438.6019 ] /Subtype /Link /Type /Annot
>>
endobj
37 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 59.68504 418.6019 140.9775 428.6019 ] /Subtype /Link /Type /Annot
>>
endobj
38 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 59.68504 408.6019 211.845 418.6019 ] /Subtype /Link /Type /Annot
>>
endobj
39 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 45.68504 398.0394 142.621 409.0394 ] /Subtype /Link /Type /Annot
>>
endobj
40 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 45.68504 387.0394 161.733 398.0394 ] /Subtype /Link /Type /Annot
>>
endobj
41 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 45.68504 376.0394 116.389 387.0394 ] /Subtype /Link /Type /Annot
>>
endobj
42 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 59.68504 365.6019 111.3675 375.6019 ] /Subtype /Link /Type /Annot
>>
endobj
43 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 59.68504 355.6019 251.85 365.6019 ] /Subtype /Link /Type /Annot
>>
endobj
44 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 59.68504 345.6019 197.22 355.6019 ] /Subtype /Link /Type /Annot
>>
endobj
45 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 59.68504 335.6019 190.9875 345.6019 ] /Subtype /Link /Type /Annot
>>
endobj
46 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 59.68504 325.6019 220.5825 335.6019 ] /Subtype /Link /Type /Annot
>>
endobj
47 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 45.68504 315.0394 209.293 326.0394 ] /Subtype /Link /Type /Annot
>>
endobj
48 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 45.68504 304.0394 99.93304 315.0394 ] /Subtype /Link /Type /Annot
>>
endobj
49 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /Fit ] /Rect [ 45.68504 293.0394 97.71704 304.0394 ] /Subtype /Link /Type /Annot
>>
endobj
50 0 obj
<<
/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
51 0 obj
<<
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
52 0 obj
<<
/BaseFont /ZapfDingbats /Name /F5 /Subtype /Type1 /Type /Font
>>
endobj
53 0 obj
<<
/BaseFont /Symbol /Name /F6 /Subtype /Type1 /Type /Font
>>
endobj
54 0 obj
<<
/Contents 116 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 115 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
55 0 obj
<<
/Annots [ 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R
14 0 R 15 0 R 16 0 R 17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R
24 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 31 0 R 32 0 R 33 0 R
34 0 R 35 0 R 36 0 R 37 0 R 38 0 R 39 0 R 40 0 R 41 0 R 42 0 R 43 0 R
44 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R ] /Contents 117 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 115 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0
/Trans <<
>> /Type /Page
>>
endobj
56 0 obj
<<
/Contents 118 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 115 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
57 0 obj
<<
/Contents 119 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 115 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
58 0 obj
<<
/Contents 120 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 115 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
59 0 obj
<<
/Contents 121 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 115 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
60 0 obj
<<
/Contents 122 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 115 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
61 0 obj
<<
/Contents 123 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 115 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
62 0 obj
<<
/Contents 124 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 115 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
63 0 obj
<<
/Contents 125 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 115 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
64 0 obj
<<
/Contents 126 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 115 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
65 0 obj
<<
/Contents 127 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 115 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
66 0 obj
<<
/Outlines 68 0 R /PageMode /UseNone /Pages 115 0 R /Type /Catalog
>>
endobj
67 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260626184404+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184404+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Installing macOS Sierra 10.12 as a XEN guest) /Trapped /False
>>
endobj
68 0 obj
<<
/Count 55 /First 69 0 R /Last 114 0 R /Type /Outlines
>>
endobj
69 0 obj
<<
/Count 3 /Dest [ 54 0 R /Fit ] /First 70 0 R /Last 72 0 R /Next 73 0 R /Parent 68 0 R
/Title (1. Prerequisites and host requirements)
>>
endobj
70 0 obj
<<
/Dest [ 54 0 R /Fit ] /Next 71 0 R /Parent 69 0 R /Title (XEN host \(managed by Anton\))
>>
endobj
71 0 obj
<<
/Dest [ 54 0 R /Fit ] /Next 72 0 R /Parent 69 0 R /Prev 70 0 R /Title (Caller actions \(request from Anton\))
>>
endobj
72 0 obj
<<
/Dest [ 54 0 R /Fit ] /Parent 69 0 R /Prev 71 0 R /Title (Preparation materials needed)
>>
endobj
73 0 obj
<<
/Dest [ 54 0 R /Fit ] /Next 74 0 R /Parent 68 0 R /Prev 69 0 R /Title (2. Critical constraint \204 HVM only, not paravirt)
>>
endobj
74 0 obj
<<
/Dest [ 54 0 R /Fit ] /Next 75 0 R /Parent 68 0 R /Prev 73 0 R /Title (3. Architecture overview)
>>
endobj
75 0 obj
<<
/Count 3 /Dest [ 54 0 R /Fit ] /First 76 0 R /Last 78 0 R /Next 79 0 R /Parent 68 0 R
/Prev 74 0 R /Title (4. Bootloader choice \204 Clover vs OpenCore)
>>
endobj
76 0 obj
<<
/Dest [ 54 0 R /Fit ] /Next 77 0 R /Parent 75 0 R /Title (Clover \(r5xxx\))
>>
endobj
77 0 obj
<<
/Dest [ 54 0 R /Fit ] /Next 78 0 R /Parent 75 0 R /Prev 76 0 R /Title (OpenCore \(0.9+\))
>>
endobj
78 0 obj
<<
/Dest [ 54 0 R /Fit ] /Parent 75 0 R /Prev 77 0 R /Title (Recommendation for XEN + OVMF)
>>
endobj
79 0 obj
<<
/Count 1 /Dest [ 54 0 R /Fit ] /First 80 0 R /Last 80 0 R /Next 81 0 R /Parent 68 0 R
/Prev 75 0 R /Title (5. Tools and packages)
>>
endobj
80 0 obj
<<
/Dest [ 54 0 R /Fit ] /Parent 79 0 R /Title (On a Linux workstation \(or the XEN dom0 / a Linux VM\))
>>
endobj
81 0 obj
<<
/Count 3 /Dest [ 54 0 R /Fit ] /First 82 0 R /Last 84 0 R /Next 85 0 R /Parent 68 0 R
/Prev 79 0 R /Title (6. Step 1 \204 Convert .dmg to raw image)
>>
endobj
82 0 obj
<<
/Dest [ 54 0 R /Fit ] /Next 83 0 R /Parent 81 0 R /Title (Option A \204 Linux with dmg2img)
>>
endobj
83 0 obj
<<
/Dest [ 54 0 R /Fit ] /Next 84 0 R /Parent 81 0 R /Prev 82 0 R /Title (Option B \204 macOS workstation with hdiutil)
>>
endobj
84 0 obj
<<
/Dest [ 54 0 R /Fit ] /Parent 81 0 R /Prev 83 0 R /Title (Verify the image)
>>
endobj
85 0 obj
<<
/Count 2 /Dest [ 54 0 R /Fit ] /First 86 0 R /Last 87 0 R /Next 88 0 R /Parent 68 0 R
/Prev 81 0 R /Title (7. Step 2 \204 Create a bootable macOS installer disk)
>>
endobj
86 0 obj
<<
/Dest [ 54 0 R /Fit ] /Next 87 0 R /Parent 85 0 R /Title (If the image is a full installer \(preferred\))
>>
endobj
87 0 obj
<<
/Dest [ 54 0 R /Fit ] /Parent 85 0 R /Prev 86 0 R /Title (If only BaseSystem.dmg is present \(recovery path\))
>>
endobj
88 0 obj
<<
/Dest [ 54 0 R /Fit ] /Next 89 0 R /Parent 68 0 R /Prev 85 0 R /Title (8. Step 3 \204 Prepare the target installation disk)
>>
endobj
89 0 obj
<<
/Count 3 /Dest [ 54 0 R /Fit ] /First 90 0 R /Last 92 0 R /Next 93 0 R /Parent 68 0 R
/Prev 88 0 R /Title (9. Step 4 \204 Obtain and configure Clover or OpenCore EFI)
>>
endobj
90 0 obj
<<
/Dest [ 54 0 R /Fit ] /Next 91 0 R /Parent 89 0 R /Title (Option A \204 OpenCore \(recommended\))
>>
endobj
91 0 obj
<<
/Dest [ 54 0 R /Fit ] /Next 92 0 R /Parent 89 0 R /Prev 90 0 R /Title (Option B \204 Clover \(r5xxx\))
>>
endobj
92 0 obj
<<
/Dest [ 54 0 R /Fit ] /Parent 89 0 R /Prev 91 0 R /Title (Embed EFI into installer disk)
>>
endobj
93 0 obj
<<
/Dest [ 54 0 R /Fit ] /Next 94 0 R /Parent 68 0 R /Prev 89 0 R /Title (10. Step 5 \204 XEN HVM domain configuration)
>>
endobj
94 0 obj
<<
/Dest [ 54 0 R /Fit ] /Next 95 0 R /Parent 68 0 R /Prev 93 0 R /Title (11. Step 6 \204 AppleSMC and the OSK key)
>>
endobj
95 0 obj
<<
/Dest [ 54 0 R /Fit ] /Next 96 0 R /Parent 68 0 R /Prev 94 0 R /Title (12. Step 7 \204 CPUID masking)
>>
endobj
96 0 obj
<<
/Count 3 /Dest [ 54 0 R /Fit ] /First 97 0 R /Last 99 0 R /Next 100 0 R /Parent 68 0 R
/Prev 95 0 R /Title (13. Step 8 \204 Run the installer)
>>
endobj
97 0 obj
<<
/Dest [ 54 0 R /Fit ] /Next 98 0 R /Parent 96 0 R /Title (Start the VM)
>>
endobj
98 0 obj
<<
/Dest [ 54 0 R /Fit ] /Next 99 0 R /Parent 96 0 R /Prev 97 0 R /Title (Boot sequence)
>>
endobj
99 0 obj
<<
/Dest [ 54 0 R /Fit ] /Parent 96 0 R /Prev 98 0 R /Title (Installation steps)
>>
endobj
100 0 obj
<<
/Count 3 /Dest [ 54 0 R /Fit ] /First 101 0 R /Last 103 0 R /Next 104 0 R /Parent 68 0 R
/Prev 96 0 R /Title (14. Step 9 \204 Post-install: Clover/OC on target disk)
>>
endobj
101 0 obj
<<
/Dest [ 54 0 R /Fit ] /Next 102 0 R /Parent 100 0 R /Title (Mount the EFI partition of the target disk)
>>
endobj
102 0 obj
<<
/Dest [ 54 0 R /Fit ] /Next 103 0 R /Parent 100 0 R /Prev 101 0 R /Title (Copy the EFI bootloader)
>>
endobj
103 0 obj
<<
/Dest [ 54 0 R /Fit ] /Parent 100 0 R /Prev 102 0 R /Title (Update XL config to boot from target disk only)
>>
endobj
104 0 obj
<<
/Dest [ 54 0 R /Fit ] /Next 105 0 R /Parent 68 0 R /Prev 100 0 R /Title (15. Networking in the guest)
>>
endobj
105 0 obj
<<
/Dest [ 54 0 R /Fit ] /Next 106 0 R /Parent 68 0 R /Prev 104 0 R /Title (16. Known issues and limitations)
>>
endobj
106 0 obj
<<
/Count 5 /Dest [ 54 0 R /Fit ] /First 107 0 R /Last 111 0 R /Next 112 0 R /Parent 68 0 R
/Prev 105 0 R /Title (17. Troubleshooting)
>>
endobj
107 0 obj
<<
/Dest [ 54 0 R /Fit ] /Next 108 0 R /Parent 106 0 R /Title (VM fails to start)
>>
endobj
108 0 obj
<<
/Dest [ 54 0 R /Fit ] /Next 109 0 R /Parent 106 0 R /Prev 107 0 R /Title (Bootloader screen never appears \(OVMF logo then black\))
>>
endobj
109 0 obj
<<
/Dest [ 54 0 R /Fit ] /Next 110 0 R /Parent 106 0 R /Prev 108 0 R /Title (macOS installer kernel panic immediately)
>>
endobj
110 0 obj
<<
/Dest [ 54 0 R /Fit ] /Next 111 0 R /Parent 106 0 R /Prev 109 0 R /Title (Installer runs but network is unavailable)
>>
endobj
111 0 obj
<<
/Dest [ 54 0 R /Fit ] /Parent 106 0 R /Prev 110 0 R /Title (VM reboots after install but shows installer again)
>>
endobj
112 0 obj
<<
/Dest [ 54 0 R /Fit ] /Next 113 0 R /Parent 68 0 R /Prev 106 0 R /Title (18. Comparison: Clover vs OpenCore for XEN)
>>
endobj
113 0 obj
<<
/Dest [ 54 0 R /Fit ] /Next 114 0 R /Parent 68 0 R /Prev 112 0 R /Title (19. References)
>>
endobj
114 0 obj
<<
/Dest [ 54 0 R /Fit ] /Parent 68 0 R /Prev 113 0 R /Title (20. Changelog)
>>
endobj
115 0 obj
<<
/Count 12 /Kids [ 54 0 R 55 0 R 56 0 R 57 0 R 58 0 R 59 0 R 60 0 R 61 0 R 62 0 R 63 0 R
64 0 R 65 0 R ] /Type /Pages
>>
endobj
116 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 931
>>
stream
Gat=*9lJ`N&A@Zck*SPGZa8L!><SfsP.#*=-!4"T\QH'I8&hF78]8C4Y)2[=_:Zh\(#F@WhTX8!K0[\6`V4H\nC<<;>6JKpcN-&bi;\BJJ+Rr<T-q/ldM8"!;Mn;kis'/)$$DX\*$C7hWH*P<_*!a>/k1R/G@hQa94NPS$>Y5JCVZ]518Uf"pLeI=,L5j&MSaT=b@(0#JOufh1]X>i#R`Bni6TY2/Cll*cbY)5rrU27%O:es4SrY^,bgGR.!cN"]s_K66u7RPojD[6#ckVAf'gr"[sI#ploIbqFUFK)YgW&aP3SD*dYeUg64r@[6?`<XFNl,!=A$SVqjk2.>F6WDZUYif$"JT_29[]^VgZ]DN:&bp$:56i[7&F&bhaeel8Yt0KpNnEF\W932fDQ+%,<%nf`+BP?96iAUrBBX5-hJQMJVpB<4iZ_1cq'r.$/D*neC6L+Bn(HEuf,@U;I`2p+V;FK3.C:2+`/iEWUBR-S\lNK/gq1H@<<o_!;Z3#5==1&$msHNse1'Rs%>&K>VZ!l6&#`@2@qkX50Op\,f'e*)ek0Z9u)@*/7gOq%$aXZZ$s\LH%!C;D/:MnA$F3TZD$,UK10`?`.%i_UUun[b%V/j@rEkdtk<V1o`P(l8@K.%amb7<Yjhej/rgRNfoG5XZ/9sPIsto$muNp0QCEp3m6H80kIuq3/OET(YJHXqn(%Wf>B)Z?b<IKW:=fJFM5&JSSqOl]Go(elfi2$C+V449/t[=iMZLaNJPal(M886X\X.QaF]K/gp*sWUAYtGUtDF7%GH&$CBnWF%M7=(V7snu1-;#U[qLKd)Bc6#W!5Xi#h_Ja$GdYe?6PgC_Pud7asn"Eeb79>DYKpup$pD)-rCV6/s_\F;&n!-`U1(`\ih6%HZq%fKYrUd4;XA-!mrTSi%m3r/$_Vk^uujnPHa'~>endstream
endobj
117 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1797
>>
stream
Gau10>uTK;'Sc)P($C`tGE(_QoF=cdA_NAd8XWm=_^MsVBOa]7,Qml:4gLVpg9O[de6rPB@!Wk9^$"Dj"@E#/h<2'E31Ie,"T]7PF:KQ&&t$CgoBFZS,;MBLUd8%W@01_G#@T_enFuFm6!-Np)FG'sZ7mpSaO=ge&5\90r'/:U$jg@r@#ScT&OeUpnW_=6#'(3M'SZph?buAAR/UN(s+;Ch`QuC;`/jfb"H)UV8Jdp#n51pZ^:%9f__b1e_,>"Mh=hV!*0J[eO[oONOD_%<qp0PS-04oCrh7BB4`73k$Wb)["/j",EVmlZ-h3*NVKL,td*ck^1d]m^0Z9G2fc5MWqo-FI>>msB'K";n`G)G?0NPI$JVK,2aX@L(XLR48Xf[Vk;3VGN]I:q]n!aVS;/cF:+UqQ1H`i;0?<I!>MZYq=jUq`'RT<k)h(s3"fu(!:ZI)<;rCMejJ28WK/STo:.[Q<bXO#8'[Qnf8iG-WU==WG5<ZDVCXMT;g<-J-5puipalig\a3J-Y1,=<<,?99<@IM"cK;E!1tWkP:k;Lr[QYMnbYEoDP4B"l3H"u)=JmecOCQ7Hd&%W+0u%OZMp9E\1:cUI^:%oTO:knA,bN0uCnen(bB9aE,YkADVA-Pr\p;O%E)D:faKk_i">'XE:_C)12&./EqV_=T`Q7>F5nYNRTCV`i[o7W+NBBG#.u%RfBe&=rJ^%5"cd^H:).DHZM\nCiFGoLjC\")P^9K]RGfkpZ'JUO8/#1rr3B*2oh$)><E77I.;!EOb\b5fNE=JZq,(n@9NEcMu&uE9n)hDsM][lh5S*fUOD0.[NIqF74L"fY\TWm!>E9CUui#;T.#-/d8aIQ$1erYd'Um'4_mU3p'm2k.!Y<IY2*8:(:22B""]*$c;Fqe&W?_B])O0^8m[<9raZa\6$rN_QGQ0XMu<oS!iFUQO]D)iL''3D/Xm(m2U8u@/O6=cG&&9%bPUGa=kkb1IM1o7tfU5M0*\E+iKl+$O:sRI;\EL[ei)1E%A8s`&d9IJ;*uM-lKh+*pe!^Y1`JYgaV+rkLK5e=L$,STp!9^X!,jjPn-L`q"aJ4c2kW<_I7[:\MjUXidmoh8NsPV*s5^r3RD;ldl]#CCM]?7K=I=/6r3bN[n[:;2;t9OfFsFdDtqNS)1b.mmBE'-Yr=1)P!KSQ@>[WnrYi05AnZE:=(@c=gS*c\Bp-Q@T:3i%oGY!Z%gT5q?,krQJ)EAn&^Q25XuAGLg!5sHJ:rA;5-HKKBmt=lZsRTP/5Lc)[$RP*Z2-="Jp>`^g<^AS=GMDI&%bQ&Y_BddEo8@Y=Zh9Wn"#ON!r#7A%_%Z[Dg62)*/ZCu_4(7N0^'4J9"*pioFfKlBbnXTh_c?cp71\W>HqkrM&d.*^Bf1Q=h7Rk#nY<5>'.Gi<7soBHYW\j>Y$@a!OJ5\/!p2b:Ag:SkhK34$!(P#'"gU[eZap@"Zk17m+EuXQrGRmbZ]Wjm-;hVVH2&j4CmbA*RH#!$<,1B+fr,_6,Fdp*@)!l618BL/oZ5\?mOTV*'kf.Q4;+RY,-C7`#\.:qT]*loOctdqR98OIbVQSTeAhZDnCFN]DZtG`I_O?3CLm\*9SKMOe7(&>@oTPJ7rXf7N$b!^]&npePhE2F/LA^%D+:9<gE"\%$JZ6GrN!NH$@N$;Y1G@,gdX_GBdYBh1uB+WaB[$li-=(*FGm)o[P,Cj4asGQhUu9NEK-nA\28AAIUcE<R;Y^7(JOS#<sLZa:go2%"A-.^W\=8UECNT#e9Vdeu\$(W.69*d$YX)lQ/Q8![RUp&0-*#f9*O,~>endstream
endobj
118 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 140
>>
stream
Gar'!]aDY2&;0_($B7W39B;_t=UWL(V/U>a8>)'<IK-!an.Z!<#X4*4MKnr?!Y<2Y&p1>u$lWM,4AEPa.?J8`4b&5D-s($.\KRe\>E@WTnk4^q)T`t--T[<n*;-NHCoG9V+Fe);*D$~>endstream
endobj
119 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 139
>>
stream
Gar'!0a`S!'LVbIMNhlGh2F/8fEtg8#lb*\JmdQo^Y!Oo8cf;%?:'%Fq"O.W7RK6NFKceXl<t&IP?Tki1A5tUpQ,HQLDdHP88_S]6g$:L6\5[aa:r"u.ZZJ0eZ]_<4N&_2+)*&B8c~>endstream
endobj
120 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3697
>>
stream
Gau`VHZ.Z[&c^a\@W4S0jXt0?-C$r&,`\(uNFO>VgacdJTZED?KF])iPc^Z%^,*rf.#HqN/p]5rJ_K4uG'<",Z`AV8Iu=#C,Cm6^nER[gM@)9M:io9aRnn!PF7T3b;U3c$ag;L[#A\'HWiTG"hT;,8$+;![jb2MeOKqb?;^DN`,#DhHre)h&Y_f,+rmD%=]M%$B@W;V*HHBL.J=H!o0JR>E2pCsT^i_tga9.K[iL?H2cn>W7Z&Dl=dB[#lHbUrE7EdP8%"n?6rmGeiB(rW^V5\NsA/+^niV1*XJ%gER):,+T[t$Qj[,<H]?nk<FN4jt/*_IdCboQ5)j.:RRb?rNc+S8G!22V24<&=/6W[V,4AhuA[Z0p4+N_qNe822M,K=ct:mHt-;*#q6:i8a2N#SeNG1uI!:9(J^3?/dug;jY1NX4thlnEp/P"Y>6^H?<'_c&"SC$^2;u+\CX-al9WPAUoso1JHq&P(ebQZ#ke5'M5WAjfjO*Z=K:8qRf/J[G>1?D+gp)5-Y?7a>h9CGMf9O/HZL+1g-[VbFE[6[TI(9\HHi:bE2[jQda6pI<kugQ:=0[+XfItaatdm,S&H$0gKqWY&urq2'L<14N/%D*r&Lq'ln3("pu%lnYqm\:I7h`@Q2LoRR_8$$IUIqbMYI2&2Se0@Y"6roJnG.$5,04j0`17U(Z8V\,]hM=c11#"f1)Yr@MTN3N;>Z"FN!mkmN8W?LA0\UC,1,>pc*3!=HoskLcEX=b:i(\J+B`L3osT3>o3VF$WLZUMtosUd>;FM'A7s5sn[t$o1&hZZ8c-oZig[Y?qHSC-Q>?C8Vrdacp>\cjt"nF/iZ-PO67$9Vn>b)[$lg<E6(28C("%'a_$AQEoE>J-Y-k[-2sj()FZ]N1=IpMOU&W8-HO]QX.]eV&u-md'="MGE^+)SHj8Yq&8,.=V>pp(Xkj[.0^WXhI%qW[]12`8D;RX/K5tY:oCmVHqn-s9pSZ?WMD#D$)a.7E6Bk_7[isNcEXL[.?^@%_sVaEP,7p$23fEMl?4gdbrC;-]#<_WI+Y,CTTE>f1.C$:5oSD)_VWfmmVEJ=nX@7XhOf2O37Pc%<=IXj(d3m%J*Vd`@4\3_6rJ-G3eHka,hn6&c*qEe+1@AE%cF6Aq2)2h;BBpj]%Tp>am3Vq?Z<PEYbVERDmSt-Y!U&T(pqm+3pr%1mOX`hj_76]cnL?9ATW+oXku\0a^2n'$UsK6gRHY>pk?Ed=DBsrh\bLZ%nYu9Tjig/Od"1_U=F4_nKWX#eUlK@*7kj&+_L2'D5De,O'Y.VZR)aq`oDL]O/H@9&/a`\!*'6e[rB<"TDl4=0.$PQA/AmH<A5&K<OCDejof#X!dA;Q"!#YA9PuegArTgdbPC6"D]MXJ85kO]<7O,l+Y1uqaruhJ&62#\GV&28Q`?,.G5M)oOPT:"ip=>8Cuacp=ZJe3bRqN)i%a@c3$<j4BCqTHK%XJ%;H;'pBfbUW.&61['r#G)NMh-2/.6tgib4s<b=19md']:QfG(Q3LX1<PKl=<,(j%a`r%uM;Hq5$Wo[fVE*H`+pK<=;Cip0ZCJr\J-akuXgpCkYL/_s62p\X93'*Oth2&qQ55_pIKR#.N=JaK)k`l,l]",%4\2Fd28)F2Br(r3%a!.eTh!2$7l"G;[7I&[A^!]C8PW>\$4f,2<$@R)ZT_Ac&2qI(VV-C_t(dWk^eNINrf"W3[P9f;<WcbY^FHG\l$iJ_5N$BD(\3#2m$U/3SS8<^!]>c;5\E@4^@r!A9'h#*:uA^%c0;WiSFl:N3?,mgo>b:`MD-'V<?Y5K#%gCF2ar[NNE^G=!"gB?qD6a-+-ed0-jfQ4>D?2odd,'BiJJ<0o?f]T:SGYHO-BEHHr+p$Lt2jtukLdh(W8ta@+o4\+aI!?#r&-l&RM%EfZY"eWs=fpIjcB4=EpoWgqiQm`UO(9ot@q?D?r<c]mGX34'hHjI3TP/un(841u293/:Fq'9VQ';:jrPrK>+!XW/9Q)1pof?A6c&O8\fAq7pkcKDR9J.NX+m@-$%@iMI/FlPS!NkV8#3VQZg?Pk3c"$$96g_'uVoR;tAhRHf[;/BQ.;TL1;-P@.7E2'SbG&aOABO$hFIuX7[ea;XZn?pmeuk4,j`2/H;s_U#_$51_'o^OZlb,goU+M:^5@Op4?uFmd";03?5[DZCeH,:rg@lFNfel1N[ni!]Vl)[8ruJHaUi,ZDRbh`nI5HhNQ'jrTU&<:K>T^6S>X(e`5u`iugNn1:?Ek<!)iDr^c@E)YDLg%(P)Z#UB"^V71\(GupSl(QDQ*/?c9/u05n'1-p9S'E=>r\c+#0>Q:f:I"%q8,=PLa0%.UL"/UgPAu_k8Og)\s3+"R60PEKI;\:',<5VlG`f4CbbDZmTLQB5fa*#Om[mk^WgVbN3N)V<@/"0`>Bnbec]s$8<pOZO-qQ$]/*]Yd0sof3U<kaI$1^hV8*W@ggX&lD=]ODNt4N9aP3FPlPDZJ>o\SZ=r?MW_NrFPAKnZ.GI/PYNZfHL8%Uk@"L!K7=VCe>Z%QlO_5N2"D9/M6TPf,OG?@="+IN1e?,D(UmD-,<\V,"85Q2iN`r:D5;=g]c?3T*RH?4-''c":+J)a_db^re*R=n2\kHa,OO]-ao.Y13K*r-Y11K;jfF'[bg$;t#VkU]/3^!bpmRMM&'B.Js#CQl]$+$l6C8(O[6O@Nb@_,5o/l6Aqm%`hE'?`32[fNW(d?MC$L[R*\L4_Up&*3+d)qmW&PFXO8<k(A&M>Pas9'N:j2]_];TPdEiIrubOeBQst1u-r0aq;D>VtVabbI[t&e4tA%Hgtm>6SNH.!_cLHqsqielPI1KUcR)bf2\>#B_CKP(o-Ca;X$q>na(Ftgg]kY6*+6W#HRC>!f/(fhcT:''-C4L0arfL=pa*&au0hDp%fH:1n_`A3k)9L+k.jM!M!=LZ-+Pu"u2jB,qa'oW#=J6]tXI?5O,h?\,Buas1"YuJL<2a+u!c&ciG.'5Z]dI=H"bo`6D67180uhO1&mb*&lPT\B,eJS*Y%Je0&7<i?kUVS$p+mTcM`.XZ<dJ8F7I[Uro!69o[%58?pEc6L/d&;p=9jXsuKf4EfOG&SN@t:<[o8C=,Wi$X2>]M/rN]@p'cZY]P6&"&'uM=:"Y'VTF&E&pd^>NlBGO_DA+L?<3";`QOGZT"W!H.iPIqqbiQ^pe,9EUWSR,dU^4CgARH.+@o.g&uu8*BOMK"_KlX,:kkniKfjLKV)YsC@?M)0@A?r%UpaL8s";V8iN4pd,*Q[q(LiP!lAI/,PNiu3:5i=L&pjF0r$fKZZq0+>n:9JYHGmEdE51Ub$Fek8UYhgUptk[15KQ9R^)hJim.7c71!"I*UgjFEfOK'#ShLedCD+:R?49/+\ekFs6<OKYEBjn].X5]<>57fb(;;cX/8cPX^o3SFn-V+l)En=Erq$h\WrN;?W$J,?qCNV*CWEr-B&#Ro,'MiKEKWTa,iPYK[u9'UUCZJDrRO8;`8UaPAF#!8h2>p9A^ko5Ypcf!c-&i\VhY1,'V-5?,XDQ>*$166(s]F[]OqRX^jl8*Q7#7[3BCS#d/VoW/_?)F5/Y6nJ*Mj".(j9o$M2YK*G=:QVCYbSNh'IIrBXm8&p8Wpr3P^-([l=DD;*L;4BmSW#LHu2DWqKT1>)Q^'R_1,:F3?KqARc-crA-8VDbB-A13<e!o_'_+&gZ@2K84o4hJ0\~>endstream
endobj
121 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3215
>>
stream
Gau`VflGh.&q0LUFJW_ejEiJI"?.cTMB+''1Jp%lc9/&j(/.%-@ZmBM9"+?adf:1]Zm\dpeP%lZ!XP=Q:3QfF^r5,rr\oW6cE?*t]`f1&Wu5$"iP<tk\@=T240m"sNb`kaf6"fP/]4s9%_d/ZO0=_kKT'W:Zg]K1oZ5P2jnoBc[-C@*bAcDi`]Y=2eAiGce.)T-^Q.:<(QQ%q@nHLhelR%.QZTp/9!RA!b@!eX)-fq^\B&&=R*YhB&[H(rXC&X:j*qLh=AYSWJqb/]2#)(t2aZR0S+.<Qg&"etRK<OdZCFArP7[<O(=fbtDl1S""hi1TVSmVgj:fXm8b<U^8J-Re`q04gA62aU=hYZ-Q3+J\emGYNLaKTW]ou0uA[#R*<C1.?IG5Z5cH,L'b?(sUI=aU;83,Y3,Ig8Z>=>1%n28`4M!jHc&\_LGhSYt)*XO[=l'HH*3tXLN>%W%77O+&"l1+'KW8"Qg^BV:dMq,\=pT!9Ba2Rq:-ZHE99;U#ij>e"_.ddlo]3B<4ZehQn`.hF;!^>WFbd`W#WFV+>Ru"&Z/L'tc#B\/XYJrJB%HDJLIKH.F^V?=)6m'B'T,nrJ<e2S@Hq@I]/eFNSW1m?^1Qr^;$_!hhr*hsPT3544k=I;U2a,NW?:48;5Z_''n<Je`5YV>R<a:M-Ak<IkMQdsL&2[2F+D*Dp*81i$bb0-#?`c*9TV6]%JH7u\^-Etmr,Lio$QA+E0IkJ)pGflo0Q6;@h^fIZR7p]c.8A/NKS5<)WV2t;1.)5?=:.9K";6h*[2BRP%(-a[I%J]4M10(/!GWR6h&WAaB3!tD"'LpV:Inn7U7[q;E==h-]`n"XhuSHZ+b&NXX/u#s*]S#O"37?^PYhTp>k$Aa8\*`#+Phg.LNP*%YoBs-Z+\&$=AEt,Def+3@ge$Gj)^6C%tE!b<Wtq#BEV-B'UHFuq,o+0l,9VYPDYZjb$;:#RkelfZ;`f72&2X2rUKCu:<`m"knA0XLHOmReKcftfL5TfYWu`[=jH"c(jsFM1+O<`W%Y[A9M2;tmYoIJTI\/0`Ad\!\RVqqGLhk!Y`-SF.:NL=]5KK"!$tu]r$h>h"8>.=;CRo'pps0V(\.'b9!49T5ebpg3PaWc6raOjX;X^FlJirRaEjQ&hZc)YKmH5OA-ks3p)<'AhX\Yl7!r1VNH3mrEtJ^]IW9O]$bNRV`ctnDeqn$#0TGUpIH&h#S/4Z="KQ+%+Od2"%@GEkQrQc$H36IOBS'JeKF^OM;-ru^B%pN)dGG2T(q(WooT<sXVF'F!1[5<X3mak"jaBaVQ2>u:-97.?]*Gdh#uO7$%VA=,*m-#*7_P$]m$EH./pX+C.tS^@1u]\/lCADg&rE8$ASha*K!GAj6=>(:Q33"`HV%Y.(E2MCYXqkMQ*sE2'@\QB<EZ?7.=3PlKI>AR:SG.4M$h8eL#+(.FF;X-,&GfN+Q.q/6cS\.g4T6mnOn/k_\-bJf+=\MYi;?Ga['1%<ZEgk=>V*e4gbMAn+jWf*E,dn[OOF:WT-2ZT<ZpCn^1i^fBK55T(in3qp@kre8PP^+X<8N)AXea16")*Dul\6LiouAF'TBY]"F!j.c'_.`S"/om3lEOT"6@A$X8=\fi'FM-L`D)8'?U,.ah>l=%-)!FZUe8R[q9PpIkFE]r-D7JY16gRiuSl-)9ED,"AY5-[O<JP^lB?dKLD?IpYuH^KjN^2!Vaq't?W>'2K^"Gu`etr8CZ1@g^t##IMjl1Xcf&m`Nmt*qJ9[@2^X9]UdT8Ti.$76g7dOM(Bc0.r*-HZ<2HeBSXIZe].7V6ocp;T.Q8"m\*VgN>Y"W#g.f!O)ZYearmN,PkUt%EltbQos'+ZLW"?Ys#<qBf1N3?p]Qn_.7TTSV$r[?fE8?Kh"STpO2lud&uW&rZ]X@L#mYWdXoVTj7%"P*'U;GVX9[A3a9WeJp*f,;1sID>/0AsRU$]u:0;R0^Z<AYc'2Ik=f=`XFg[])YI1L3I^Z47<VKkV3&B8e.j#Pm<B+C7g7t%65Dk7GObG[&ioVij*Dq/":jr<T<T"ja$bf3CrA34,Pdb`&!D9G@0P'[&oa=p-&G&8r"Z"NnX0RT4G*D;6Vi+li1nCSj!nR-%`ka4($".*!%b:357Q77Ppc@P]8ng2W<]<4euZ*$7H].T*`^+R^c[B@4\+@Q`OOXIU>2N5kNCf$Zrl352]F]:bOH7Q7WiL/PDf)<1EaN3b%f6gqf;R[q.DI0B\TWr"k`qtJS[C"IhqRedB02<MFh;j3_9M+^3,CW$Ad"1)bZ&Lp'Tu'd6\6k\2CMugtj[%0ebA.*Z9Otl5;/m)l@n!E=Dg-cB-RVO-*GgJeC2GI&e>D8X;bO+@N4L@&)V+oAZdiIY^\:B-mG2.?MhbPH%9I+IeN[);%RC,\_#dPRG>>DoN"38V,34W8pP[L9km_WiPMWV>/\FtL.Q8YUFC67lN&U?/I0-h*W6!g#)KhpIB<P1qorO^AW4)/uLp,>PU!CdG]/&cu\jTUiM7P_&A_TRH)_6>\Hct-KLW]3enf2Z@W&Qbds7XS^S#;skF&HZMYu!q9=PdP7,-`3GK'$G8pXbN^,/3)@d/Nk>_\&1IpJi,lf*M_T,.Q,)B(L@jj(i^!Y;'Pa175ru"8Gh)@%M6Ei);L`fsrhf:XoGWi5Pa\<<N$G(r/Ad!2e5b!'V,"KT$9h.F@`T$2Rk-q*kWjd[iDcXE+[`CVEO0c3`(CXX>)j#^Zb\jt+K^`SEpRjQ[qu8kdt1pK+&SD]*(IM#A\llFro+iUpJsUTN#D9p%HZZC/mTW''m\H-;;+V$pHa4bd'ELYf8T4Z*R8@2@8g+PAl`U#6%M,CNFfMYhoN\g:81s$j$Td0s0df4Er*8'*g;h\J+&>7bp^dSfnTZ=f/OX<"Hfa3i:R<%Z"L_lN?qlYi>2r[nZns$fFd?gT:lGQgHNHAetBC,Xe-[fWuIa*ZNKX='t<:TnLf%eO)oJ9P\4l+^3j:t%_-/lYf9?)b_UFY'QjJgGtq/52m8\3r*RqtiXsWFVDX&*e;6Dja?Pc:\W-s+Z;XVD1h=gT[D3@c?QX_jL5uGR+'?,;h[=<^u_)r3O91T@P^NJm_rJe[S[b,O;DjEJKRt9e2g8eQlW:e6T)bfEZl<qu3o6%e@@5O#QTDrM:k3k<t9p)\*`iFj`!la0L('g-=0uR.bOL8_JYPjE@eSna5iPO>^>OZ^&tT^r*1t+r`N"keCgKXS)~>endstream
endobj
122 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2769
>>
stream
Gatm=CNJJp(B*+)ibiVX'YQ<TpjnF:19&ECW!OUfkj3\iW_:tG[.r1WS:p_2F!X%q,Rc$Q,Se,+[Z9e9g`p5m#Cd3Uhi@c_a.QcY@$iX>JRN=PN,RZir9;6LUU7D?Ra^SGCiF`Uf!.=Vn&&SHdAW\fe%.5n_!&nPokP4'H"!Si42C%+HDI(U<Zi.l=@D<D1Q;>=j8[3"^>eTcdlD#'h,!d8c4V01+_Ygj3;HN:GoMN?i6\ZEE!c^T;<nIHnhuEg^uAJu)5E^cmju`e#t)im*3&G7Ah9bXBV?!PKt$A^Y%tN[n(S&TVjXBtNrR>OIi\?2X!6!Hp>7<tq5&#[8F%l?'Ts<9Y5;SKU%5&rN7#go7QL5MkL:=,$<TQ'_.JW1(]tt$,^uImY^!<[E]LX\PUAcbdgV%YC3rQ.)Dm86eZ7=#Nb&AF>Jd1YF$GDD+<\L>;1_Ir$I;Bs8hc@/1-q\CalKd_b@DLK++6_#Ogm.Z#M"t<e"m(gZhKTD7)U1-@&/rS;dQX`VT<fI8K9)ZVA,aMNtk.V0BQ?#iW:bc+,0m258qDW1gOJjU-+Xj%?MOs8%bF6RaF!a-cSSM6<Fd?'G4b.r;JZ@e,`QeSL03#IUWGoa`pK__oKU$N5?G<:').E&iKaHEBiIRoDW^)&'c72+A<$aO<DB0Q!U=@/5q*Q6h6/d":fID[D-Aqf;uu9cl.WACRQ""aj6GY>n'8TVI11U^#5,_`=`>ZV0A%bl\psT57H3/\si@?TYp2])9U'B74#Hi`>:DDD,A<4-P9l%^OndQ14plKbjmIC]tIdS@(R=JRdN@;Y4#H-kf>k>*_@9Of65aHGanBNMY5/l.M&nJ#SL[Y<BH$`"j2_Pi0"Gi,8MN=/==2&<K^kK5LD+nYSc1'9@Jo3G5&?hOtM:g!A%h#'(7pbpc&'3$]n=e3Dkjfbpcg#N.W1j68)Q-^S(RH4YB;1g-XU5jr(N>i,:QeIs=SQm2t-8r>``'%*,^J(/hX)eHSOEL]2+l*$jR.+q`G71MJ#-bn)K:-D(eRZKpM^)U+=HF]#M@&./:(P@mfK%\:k3c]D$J_]G):KFeG[Zjj=@laSg>VJ0T]&isTRL\=DAI!\t)I5;UE>u\7f6Jcjh)ENVZ5NH*So1FXZE0Y8-.c=5Vis7YoLNaNMFI-G`/[<iZ-07fab@W*)s*8`7rA%mS#*#<lFnUB)Pcosbc;?ofP]G.QWBRYgnKQD=S5^/;P-h[LXV#uKIf'3<ZSW,Z:LrY6oTI0@PCgjFFj8u.VS#1DR6Erk5_Dq*V?n&bKit[8q\QoXSR1EQY==l,$T62eHh6oL*PF";U:P3fdN$I$p*QKh6XhMSN\5J)0K8%!+d)kQ#j,c%-kRAmL.^Gr0gK'/!HJ=hMsT24pV/Tl3,/ue^!N[flm(0J@Ocp'#W\*^QU$r5Uh\I0nX!?d)<t1.5u_,MVDOr3K,V!8h"#]]\_m4K>8nP2T6d>]Z3pD\q2W*kL_)lISCUtDj_mNVA=Jlsep*5:rE@$k,[T&j=ik6_V^d)jbgr<k=[45A>(DULU;HU'CB4TFli74^,J5<!?<1au_h.*gl.d8[1[OQNbNS@)FU&pg)SDijO;aB/d;<-!Ko<@eUR-#ZRp[BQ.jWC_kAo=g)1LXkjnA?W;XRZp0;@5a*!"/<lfB.H*k+sdqt^]uIQ_GOkHL`rnsoZKAYI,I%#ukXY:LX).%B0p&/LTOA(gZuXJ(PK&t3?`@7oR<">A`"XoWF`g'?q_9,sfY/nZK5C>tru7`_&b1[/KhT'"NFNf;J!nf3Dk#o&A,l;67heke=8.J@Pbok@7/<l`ta`fWOK9J#b6L+Cl4cN4_(+AVP9bPcIaQZ07J8BbDL7adYegcb:,CbZP*iZjQRFN38%T)n&jk,#YE5>*2,#a&_+FT%"aks60n*EAF!;VSS/a7dF$mFBnR9)FOCoi-3qTAZs44pEfiVWO;<Z+'!l\^`>B%L1G<$0XX3JNPF-WW^Xr+Y.DX(*Sb(:k.b;Y6Nl&,aVq"23u6*2>8,@,,e\G[/eL-_sumPil[0hCGOW::FWH;m:T/;Y$DG*Xc[`P7?V_&F=H+7ApCRDBk=Ga-BoJu2*-Un/C/O8;'7@:;dEjJP-^)D^(*4h7o+.c\fC#\r$U#<8uN.)X]/.S9!M[D%!WbnM+u6CaVb_1[dB*l+V2)6B+_6iEASe5J)lQlcY^iq5N&\3gc]Wi?,_E!?FftEqBB8)\Rf3P/TKhR%]]#K4AF[XraVXp7Y?VFQD:'*pFm;RJF:]U.4ACm)A4LIja$!pP`9@]'*EdbU1U/;LDs!&>Tc"PqO@A#0OlacmR^TPJZ>(j-jai'PJ*EmO.&0NO?@%A?aMk50KPa7h"<>]bZl4`(V]+jSF=Z^:6P+k>T58.(p7ZRBG`_l/2*;.ctP\9UF\LF_M2W;L1Ak_=kGurmZ[p2%LpY<6\@VeCA3s#P>$/6634.oq$fllQ@S>W7&_!dN`,/F[>1)Ermbmrl/<C0h!]Z(O8$Cu>qIjG[nl>:Sh0-k'\0KO?LB0Cgpp@4U<AHBfTN2IA,5<)BD8os^L[ujDqYr7''4XTrp^gqe46d(2#%F>a=$M+&i+r::+Z.>F379?-[PIZ22]#dLU4he0[>:.pm^%HgN!^te(-AC21E+#DrVlg/)[T9Z2%m%S[P.u8SOWqU?jh6.$*7H03GP.H>*DQQ@oAt9sAlm.Df+7D,+9#PNLSRiB"4?>%Cki1Jo<^?fQ%b@Fm7lfCF7Q9ZSo6.OA:OkZDk0e%hlr!Pu4u2?~>endstream
endobj
123 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2351
>>
stream
Gat=,qbuLq(B3.)iiH'_ZM-stK\*;!Prc3\Xb^'*g0;bO<0K/+2+bh`#@[Z/4l$Df#r8/U-)>Tgq>*4fNX5phRHhO#!*kIKn!d]g0V3i0CGq,ii+dZ3Eb&dFG#N1!RYD:=G#L18>oWHsI_Oia`csb%T^EiZjN(0WI"$_ac.n0/es\9&d"`&^q/Z`\l(N:o;nWZb4qZ5cFZ<n#$]P*T\Q2jN@PqBCSVdUGNJ<[E%b0fOPf3>]RG!@__LOUiS@)*d?lV;A1>DSN1q:%:NW=LEaJ57=E**Y`iCuJm'<AF<B=dpp>/c'tBZWsgED$@ZVT\)-=E#p`Ip!^Se$Fb92Bqq2[kY7sG2$h+%,Vh6=dkT^]Tf\.;CG7,Ic%)@lUX"da?rZF63Mu^Z*k@F%;mf(Pt\#t=r"Ri%ebaT=H!f4inl*!Pk)^K*ZhK!<[8iF&Zr'X5b(qZY=_T*1X6%=7PqbgS:Y.mO!h],^j[6IVO>@#Z6Mf?FbXMrf(dfM8J'6*AMfZOS:iL&oQ^YI$ObrA1kpiu[D?Dc1'*ml;N_Y7cD/IYO?O;1$F*\p+D@f]#eC^c-VK"cRK++Fdu)eR^b?BB$fN:hl-a2Paq6kp>V;?J+bi.qqC#f[fk]e-ie#sgcNcEc)B[k.\L3u3WJ1SXViUY537"WujtiS\>VIL830`a!qNSoThB,[sgGg/QWtNms$b[Yhi2V89fFb?#,b,nU7+:Sd:(M6ENEs44^$Bq__\PHVNf2NRar`3>UGK*XIX*_s]XfahVJFqlJ;l@TH#kS.]i^M:\D0I<j0B\ULItP1k<,3P?^8Kfg*l1iG)l]Oa!d#YrVWf_!cJ972!;fBm00C\et^A?YsJXO@!pN!QDqb4\@d7&59I\b>:SgRa$G3udoDJl&hO$]:ERqXk3CcoBTW"hgS?GL2(sb&(F0^;ocI8E\ob]dmQ?%!kW8X23aumrjQB`sFQY%A)M%2Gmc`$AIh;mW`i@^)gL'OF9UB3=+,8b]lZ+MU)p_;:WN^O.dGlDorb-8MmXI'"7''1UBl7N\@m24\&0I)^6n5F6D]j<G$L/--Nic2u]>f6IDJKGsV4D,1ftaOAJUM%bWfHo4l)Hd*\#M/aX5O$k!m;`>A]k*KagUOu`e0bDdG.1c,]C71l[jpk,.1i`Y31To-/=d*%@^^55-8?K068eqfOA,*[/ioeJK:Yinpfo4WcP&(>SjoBRf!E1q0n3gl:SdZe$]WR\6C4\Vbjp%A-uX_oW;d'V:t_Jol51Kr:R2TP3sT[mq:D<I%CHt'_+(Qc>Su?]Y4B4E7$JWV:/u31R=nH?o+HQ]F*ZTiM>/8O:sQVf$8#FF?@%K],B'46L1Y.m=g/N^K;')7q>mYIbnEXNK1-KhtFaUY`GDi[ZC:S;T5:i.>/C&_I05TON_.2KM#)lJrqtH#Vl#el'p2*7X&#,.^3PD;\n6g?u<LUlMJ+J#"5]i@!FH7irFM.-^<K($cnhZ^kE`07KM=hZE\b6j:E!RV=*M@,^Bf^>)\XZiQgWM+U$K(2\@(c(!XaYY3<Gf=aIYP(]$@\1Yf#PcK"@l/5aY"jtOb8)'IPJDUu-&,Hj2>l'NY@g#1O2;sM7_&pr^#C79!-1b:<ch?B;&/q3aq&I/V+%ZM^ggJV5^SnG<_[\2JIF7iA_SkKK^Y$PbIRFJ\S]7[TB;#QW)p-NG]<dhQBBnC/Tn[P5pMBMeDOs_jX)19Gu.C+C.,X;q"DW%4[\u">4L45<ll?An?Q:aWgD!nG'*#n.`gk[@S`ESu?U!S]+b<]cG@\DoY2FJq7/6%o*0\q?RI@\ck:!L\M4$04f0XP^En:C#g`DrY;Kj17u9P(ob/X7^8ffmbm_/5$k/MVO*STu2*<;ONnZLAj0B/4%/9>couT0j):>cXWfN?<*pZeNV+?E+/[TsCcm&<YR5U_#p2#oZ)cNEHJZm;W+Y$OFc;j>5NE<6jo&c&Sd2h@=)rVHn6=`Z$%k$:eIO:_/B"id.\4IVI*/\qc'2<?!^':?u0pcn]f%5d?3F/En2q5:qKI]Gs6`;V?@NjGcEt:2j+H2S-$8!Tk'JnCn*Lkt1eSFG!YB1C8(($R\PUjh]Xf,tkXN>f6II?4!Mb'Xe9Za13F?V#;#JNmlT'If:,HFuT^%%d80&Z1tiYMq$PH_4N"`GTpf"B0@Hu8Jb&R<nJi:`Tc^1l&Xn(@(tga?$gSDX+d"k;uU9$"mktW?P#E!,$/q[DZ;1L`<&igp^efnms6%moBBu)>jD&3&j53M/=aZ-ZtrV$6qHSr:A,=7jp+e#7tN<ZB:Tr(0Ira&[V_K#(0&%Ij*=dL[9!!)]\p*KY`K-44(.$0a##m#IB<T4Ap_W/*;p8q;&YS~>endstream
endobj
124 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2982
>>
stream
GauHMD/\/g')nJ01%=2LoIa2:Am%a0"kmdu%CTEKNAoJ,jUfcOAb.I0N^u2#^Y^4-@U$5Z`<@k_S(aSrDpLO%6X!mW+%uVQV>q^XE-c5LA]$J3b;ENAItEUKdDM)HX`Of&k7:6&4EkJ+:>k,Y7t:E+e!T;IOci2+8PY:>]f_o.iJpq``58tg0MYINDP6tJK<IZ_0=*?@6IH;#/bCS5pVoEumkp((#NNSb"UcNmA#'oWI:$N=T_a!ClCVEk_8<a5N'9ghF%TlWEsY0r>dA/Q7)C'#c$C>BQ(U,^M1-I6/EEh?of/[=(=N)E7l7b(q,H:Ps"o%d6JjF3$,*l5LHF636;#,B%ErOXd0.<(<=5Fh5gGaIEk=7a](mAp6:dJ?&6-Lel9XrgGA(-'YIF5ooui\J-dX)1P"<J(0'7*Pq=Wb=Vt]?jp]%fCJ%WfBht9`JR[pcI0*L)0p0L<uWHqd_JM5nE!GZ`"Ed9N/Kia@U$'.3@6WE-h;l('W6e<X+G7#q"6tm>"h7jVL_i$'4H$gbQcUdW(g.f[lj;]aPmU5SjG-Z'&oN<MTd[rt(-"1j<54(iDRe=%mkeC=6$l9)*^5H1@I.C#1A"D$:l0Zr\J';3Q@u>ZeSKt?m**P^p,eFjPY$kB>*k%9O/lT_EeaH9p07B*>F_\b_44*Oo0CA>PnL1HQEFGf\M-6E6P+4!io48j7>&Tp2T<#YdiS2<n,ogQ.8J.p97^q!90OYj@=$W()-"N08"31+L60&FcbAr<iL@A;^q.$nM[aTK^E._rt:(*2VMA[=WWiS9^\f,S<2@;aYs2>53(40@Ei%!;!M)Z7'.qB9IG\6LLs$DYK$^d#phSEsMq3`p0Xs9(U.1')Fi<iLs[S.?0,+=itUY,el)91]b-@(@3OlCKH0KrM1,"_&I'P:T@UPmj'iB$k`3uIheo9NCBV2V_IdNi%HhR(D1%(MFA!FDaT6_"9"XAOb[32[bs2=MS1W--`uG3lg(<3E?OIB5-(-,[t7Mba]3,U66VdS.M<cXb>KC$=MceElV2ng&dJ,BJQ<#R&[%Va@Ls)5)>WXUnHo9">H2*=SIGs'DXNaeTkUKh5,j'[iG_-_*g3^0FqCM+6\Y8V@0;.fg`1YH&QE\tl$J+is_J+X*"ld+u)?p,gDoYuYg,lQ?KoZBE_JdFco[<:p=$X/BP+r=HltT@'RNONMY5Sn%JF@iM!U3;[d7[LK9@E"F^'#2C5[$FqQ1gor6Y:\^K`C)hP;J$P6i1MD2&/83+6(+QJ#i=N/f->=CDZE?#I^]a<?eUE'D(@\i`j-;qWjp\"_<KO(#9a\#Q,=Ch"OC5smV&^bEPn`m'M&#>?(Geaq1bCI0='\_H[(<m*DCPRI5:Z^'M'S?%(k`A)FTZ^&>8slPOa`nZn#YIZ/p!Un<#;m+:bb9`$I9hJOBAeG3Ta9s^>qCBBM`2R[-JW>\r\IWeZj7Ho`H.\o,5TNNVPd!CE)udm]<+)798\hX@3e_+;G4gCB2#`2ONRa9WdWR[MKnne=L9lP"BF]!2P9S=d5/f99KugV[n4f,Xq,,F"W+mI'fb8+c9=D4dIo@f]\2&C(Gn*D]aY"RNkWfcNV8k!^VBB#"W6spl'k='gfc6P7oF&cu-[2-Qa6rLHKW`IlHF!C0Z8MHL;&a(1WVE[r4-Cb4\;g>;`Hm763^JND4$sjHq=%[cTg)7\$FE3uI)S];*g!-rLj\jKqT))q/&UYNd1:I@(9NKqc1o!B/F73AZtDkn[NoME=2=9l4X^.nHC:A1?*DW<;%3jK.>!cG;]U&?8Kb(,S,9-s6e]"in$6`Z,6X((O(r&C^g35Dr?Vh*mPK$`9Jp*.l5:1b=PGQt1MuK30SOd_GKf)o.nSl=R)cYpX,I%OJt8V[isSBk.3E+Gq_%"%F%Q79&u"jcCcZgn?<@!q5V,e]i:?O%O%Vk#=:++cTHJBtu$8pj'_ReX_9(`###+U0oEFPBiLD`:4'sd?!@9M&Fos98AIII,"-2fA#'@3<QTjnBqWaXsTfM=_uAJs*=8fU-i>MS9@`RnI0'>jQGQ.<i_$c98GsQCpfr3P2SYN@*&]@!;=H_J%k](HZ_.@g4jdMp&sPe"Wdj8$.VNN&W:.f,L%CG&M2SDf?F5(]Bm@g7pd*H/9'^ho0/%6H/t24pT"V7)V+KPdr1[de/k[MJgYrW.S")."'&p2/F$MK@LY5)nNp^!`e]sQf7ZH%oBuD.-`m]EhS&>BcZW\R8ou,<L3r'Ys8PZYm0AB&)88&[m%J>+WWb&!ndUk!FAF;S=2fPYZO$M7btdR,8j/F^c!bgR.qmGWo<-\Yf%'Bc^4Yq<:RSINCS-2f\F^@](\4@YmHngK/$Q.c;CA@is1n?S26?)PIF;J4m:<q)hsraU;64$X,REc8Z#Ugo==nc;XL<0?Y2Up)?Xsh$D[IQ2eM4UeSG<C:#j-9=.%*Ardnf/I&j7l>4b;G!9ri;qI_DpagjCM_C3D*LX+fiEi`S40-m#p1YFDXZ?,;a5SuVl,PHSc;"pWeOT$nB(HTCY]r8-E[j@T#<[l"Kc/'/b/)%!?D2`-T&[u[cD#pif!W!8RV2(glHKM9SnXOU<^5\k0!+_"Gp<b`Ptq4nQWUI''1HcpUA0DGQH=Tb^-nC"2LWL<n'C^RlljY9/OJD4KT<d/2'V#(lTr*"JE@X9X+7bs,>M7;(W7%%X3lDISG.=i%O6rH"@1-BuZfdWd^(O^jE<)/B+DRq%"<o"O/?32_sIDfa)\N)e,]\_D0@=`@,=?#sriXO`:JepN?"1BC5W8baN/TZ]bG1-`JZ<i?0b:!nueX_5hZd<J0db"Y?3uOMX+D1OK^mL7ClgYD:(RqCodC@YFTt/cNcZc.-V0h$Z.em:S?@b.,e6STU[:g/q/0\q73Pai1Dq/'A(lcO2Snl]?[7/jk=#1A-`oqfjWL>P`/SjQ9qf`puAuEH6Wf-NZ=/ckpTbI442m=i?]BqS.;ZucZ+?93*AVV`?~>endstream
endobj
125 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3889
>>
stream
Gatm>=``=e&q9SYkgJ%JksPSmK<WLtOt#'b@bOFr,ZUnIm#W'ILiC^nJW?)pp?`n@"E0As<3ZSMYc%Ba]8$USpg^7P7kqgV)sD`)^bF_Z%#1n;E:Xr"DI.a<AX#8n7rs$;DM-R,Bo_<0pc2U1eZtRT64-1VeC5JJM&".(U8ZP!cd8pRGb:ig8m/q5A0\p9!c0dT9Or*\RN?!%iZeb"QUrN,'LBr4?a&ELj?g'q8-KtFJb!rkBe7[L1eg&X"#k_Gbn%bhYP>GaIBTR52>c^LY*c?%Y@N<HXd',%M2.%>bBYl&E8Ps%@[LaI_D*GS\f^DeqJ>?UZ$]C]leohErL6,Ur]DE6s*!nR20=Yl,aUWG1!9=-7D^8lW$"fB*/[FiF'H`LHAAQBWFQDFE)BCQD_L9Gl9m1kjD;\+<J>.-s/#rq[aj;MJX'PuH`o]j"J9!WEA."/kV1('T4KSa[.M6ND.o1Ubu/DN=/90RC\d<LiH]?&mc)fD$"bA%E?;Iu7e\hJ@otg'0iqmG&$lMNQ!kBLQ[_8XdUeaRIi=93C#=+[',*!ZiGVeQO71I*%QNlC0_D^S556990p?OBd29)"TXeDl9:c8K5V@O]F-3\_#GkkT76&;S2<?Q"+bD=e%Tc?F:tb&_c2I`O',G(KW?&]ohr39WK-TG:9OsSdiR@U")s;;@mu5q9oDgX`KS0H'=cDR"gY&=r/VNRM,Q=:OA&M^[4sEcN#6&K('XD!ZZL?\@_VG3`65316gajj4?qOf=a=tVYc>o>Il%L@Xo2:<l2O^XG<%qk31lm54WshY&jch^n`^hgMg0'h">=e.0?OliBU'K3-*2'DhEH@Poi%3&<,a:iQ0$d?62B&E;Jq5%:&JKU%>`Q0lQAhg1i2HY(ZI`EC(!NU=_$U#JL3\nlZR,P&KS:ogT9_L6kOHFW!!3S5Dq2IX&!nl3[d1Gm&nDs';F)&JP\#rL&WNZTY'<4OX4S97MlrEpq(ZV3ad"TH::86Z#%qG&qocH#"L-_N;9^MKB+`2Lk8<bm^a*9!I$>u<E'g]>n1i*2H(t4jFqn_f@(QlCQ=fEj7uXV.?l8Qkj_S^o+Jr;,.eLAM3+0P3`W?>A_Tf:49V.I[^4h$#@T_iCm8HI*@!XcXNpg`>HBr`,]:_\0a,ZKp6c[uM^G0#XI4\KTJT@/(D.lOo!K($JIgaqUD?K;i6WKub9GoLQ!bEfLf#!b@9^FRXmYQm/>$-U@R[X^nGHj3%aAtD&XKDlP.']Du)lEK#/&B9+KTSC4;M/h:b-.I)6S<U^]QU$V_!9tf\cI<I7VOn>8=O>eB;YO+57?>TDklsH"S`cc^-I8R.X^8rIZb*AeX<At\gWE#\9!NuZPt9t>L<51O$fXpDr3/+YorsJd<3^C2ERmJ\CLH4.dEq<Q\Fp6)")9ifY1E-qRu/2TdE/.'k5Z]::eWaF_d*1''7+*>nG^RroO"-7LX.[W&O&Pib]:(s7kB*bUOg;DS54kBbJ+d^t,r0B%hiPGT5"0kIuTKe-H-TpNdfKr,$YtjKpGdmRGYiSd+QVl1K&piW&=6g,:fm2r)YK>DD:,)to;3?ge1@MXiMoT:-V#`gC9_%N\HXc-t2$Fe;".7B!UgltfPd)j.JRjf/de-=a,e^Ms"5MMEmR?kuSs9QD\!G;Ek(:`o#Lh48Qc\G-,t<)4X7bDgM3#!@4P%:.SP$VHA`R%JY$HsS._8'j%H&7,e'b@P$b^_Xm,7<u\JAdot710Vc[R@CG9/Q3cY[#/<P-)Y1+7:nNsPd4IRSB\:$;s[kQP[&RncZ3/hUnXT$!08:-`^kN&_"'$]pY#F&/I]gCNRmq^QY!j,K/k!c?0:tb2'W_J\seC+[WZ=nf.Ybj`'=?^$Q9OfLNl[1[_S?.>8sO^UU>hXUd"h.^KQcpG@VqN'T9W0J/P612!:Z!aikho+gI<J3hbJV.)KB/WF:2`aZ>8,RL$<N!>@%s>o"ddmrH'Omdf]An!POjZ/U)NSJ#Xo"Zpl&$%4p,ZC#4\g=[Fi)\5C:>*93.jXU2\5a,1_SmPX>XC5A4$7aH-fk\F!i?.J$?YKE`$gX]n&8$b]kb>7j_ikGA_Kiu'8m;>iFX-/aOqSQLY`B@3',)@kE0;oC$VjWc4Ge=6@^Kq8IKSjuPNaJ1Jsa(i]Y?l6I`)^uKOhiC4=""Ob&R]3$F&P6]0NapN'f0H#-LObBJ`P=)=@S8fb3[`2s2LsiXWA54DKU.4>t9GYHcK2AjWF*2+Jfe*^_[iid/`50jnSH=FYeN;DD=bP:-W3MWd#n\8iS[Gma0q%*QR]e$I9CQ)<eLonIn$\?!G!=SO/?Rk-4HMo%H<Wg2CV0.tNJ$jRc5N])7'fp^bR/]Rq;nm1);J`\tiD]<4P$)p3LO_\;[%F^"E_a<J&p]mTd5NNr]k;W)WkJ\K:&[Z!BGP*E:>PG*cb-odO@i6jI)tm%L^3K_%T"^Dkh)g->mbN`)[<7D=YVZa:2U%H@8dc'bfGYfgi)!>@<FiTbo@dkPL?!$[Vu)6GmUIQLR50IP_`#.p-rY;$!h7(-\j0CD?hT7%/b8ZgOEnMT`uE:`0dh@]\lE_uie"<)p$2Y6*k@2RY]N]+'I(l]mc,0RB_,L%Pc$4n;GF.*jWUH3_=7gLWZ*l*cr^0=X@?<XaXQ4+RC5r0!W:b_I[G-k:]dE?Q4THUaO7=mGtu`Y8RRQ<Xa)Ecb4>'^*/,BeHW=5;80o&1\?D?M.IN@3/AWM4Hc3$"l+*DZ5A5QjRL5tY62qdV/:d`MmH+-u4Gd%NV3K_$!F&$sI[(ndV30&fNum69Zou="Wu:SsGmZ*)ab5X(q;Oh+\\PXVof':=WdB/Jgbt^*gFla]\^'#LB*1#mT4(e9DV+_i-i5!]V?^[F)*i0m3X_8lR6igVAUqn1KiY5<`SuaN2Qbc[De^fp0B2ni@Dt*_pamSC=uF?8W8kTj9H^S;Rd4EXiTlFM'oCi=KJ(ZtTD<e"?i+q,f?e3N*dJ%nC7PPqgXN6-qkALcr>sr4_gV91^C4&BF0RXX12j*K]D\aIIF,g:,bZ>\j]:/CW>MSD.#5:>k^*KLp"qW?\tHa<loZ3kSE`mp#HnNL?8$'s>FBeF=>MkSM@K`$J_MX'^sQQJmRr%fJpM8HjoT-`=&Rg-AI>1U,50A=,^SV0Ja)LF=a_8-oof[CMGqmdlO9.Q?0&7[WjpX_RYb!H0?25@\H]50=`M02H!Me6L5gb;+jFJA+U+\r4J0sNbfr5f=&qr*\^S%'g"s<BiMG`rZ,W1j@70C,*k!%e.rG=8au%[$dT4c$(2`'qr99@3,Ur'G#2di&#/?TlWM8<g!6R)G>85?]6C'*:#.fG<W_(utrn:!YF.3WrEUa*5<"5JCJR@Rf`45RD`,6lg>AMEi&H$i/\:mE2=4^9kO/Ubn<D:q&W-NTLl*_>$[9>&Op@.3%$#P,3eo4kOGa_J\VTuiAbmP*L8IaeE7:;LAE"`kDH(9c:[j4rHm;'\m1<5Q68N8KkD\cfp?m3e'2Lf_D;?-$1@R#i^PdDK.=5TSdk$&2H]"Zho\DLF;:K7gim"$C4+%aaV#h#HM8tYV>F?JE3lIMoDmS')7UX;ZS'DBMaL^iNSUYG2:qjqnqa>A15W?J=28s5i^m\-d!e27H/YL0_]o_gY8MBGUVJkqf?@ck$gg`hLQ4\)I-EOt;nTCMrr?>2ROZQ0.6J,f64Q0,k\4_fi:>s:D@E35FJ>gOF.l:q,`:Gd5pYA$tb=J3]\an6F8n?H<*SV8A;XHs?B@0n$V-%A3#J'OOm^mm@HcL*P+n>TU,Vl$!Pr-3#9FK8Y#*36;!3iRRqj(%=k@0j5H5?-s`QHIZ=gFt`+Q@I59#ARN-CMl-qBUFolp,(5WH=/e&@i.?dbj60-VJO.T0GA^(ImajJWW~>endstream
endobj
126 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3670
>>
stream
Gatm>=`<%c&q9SYW0[[PR1[E-U5d./;=)4_EL_k*@hoV0TZNML,DrVmYiWk'poSFkV^NU0?s"&pc*"7qY,\?#1B&`^e(k)<^PBq=!f@?Z92K_%L\oD:Fas,F9KC<RVin,1#$@1F5AV>^';PIY>b)$X8QA&8Ce7W+'?58/&m5-R-Ar%Hb(59n8>o#]1f0EYdIIrC%MYPf((8dmq9b]YJN%Q]O0WtKs#8a5_Un\fs,(q6_j"\)[W-kaeWKRqni*mNpA!*l9CU"9FU:$'%eZA_T>4qL_q&hrk4nb8OWFZW"t,8\fO_m^Y*+m:7&A#6V!*]$1O[KJ^lTe`?mDZoMB1RZZ1d6^:WGs9N-U@*>%p@tnR:qVn-J4jKU<l)`$8RjY(,L3he1A:[<+ceqY.I[B9E;A6I.E';f2Cc`uDS7q>L48+-ru%jnq$^BUZ+A>,j7T=FQACCU0?8NXt:hLZ(I4;Uu<!S/O/?aO2BX_MK],',))%elp'N3ue4IA3$ZYC.f;nAT]Gf"SX'4ctoF6@keEn-`s*cV\gf&9i2?j:RPheCjr-QnDP.KBVuH\%+%nh\-G#sccH(FCIjaBgcBFK]WY)oS8su2#IcoR73E/$p-,u0EFJuZ(FCDN-[QJ"crX=+N[P3$7rjqr#rD]]-.B6/PPQtM<Dj;?lHXI4ONbI<&"6NF1g:W;Et069;;I-A4q3edrWfKclsTe!brod0H4h^t\c*:<qkm>]pb0-[!_.k#i8K-t#9&.!%s\Fh+cq6Snt^.,R2CBKYhO"+n'UEJk'//)#^&K9$j'4LiTta+#pWQ2mN-8L_.P8&nJ[0)IE1.phXuD1kdd-3YV<e8X'q](('r>0on7FQ2"8;37g(ARFEN!6/3&g$kOa;%lcg(.&++q$FSTr`-Vp'#09/l'gK!&hekUnnT,\pjqY9_)Y3')"LFu,-ML7P8G[4Yc=e*.>]=Sk$HW-8Mq&\=*g04`1';Vppec[pq`Fp'Nkf=dIeN/J![WN'([m%o,64@pS:S!$\)!1kS[MJ>W+\[p'3>_;u2pF^9E54Y@W.nHGT+AanP0[M,S4>qa=?V=rHZZ$Eq`%lM*RJo37VCJ;0H`Ot6U4qMgF_qD#"eik)hqdj,ti-5`eDi^*>F[p\eY;W/pBCLb\q-52ufGhUPQkHZ7mPAm(]1s"=tCRm4Nk`/\;HU$!-T-:FIoo``k%cddubD0n+`E^2@57&Orro((p<V,%jJTb<3(Ta7h[`Qf*OtW!?_Rpc2fSIJnWd!V=*?_ejjR[\m>eMKfo:C1.afAPWFW_SXq@LG'hYYU$qRA$(AW5@V.i!SC4T^B`QTL57H!M>T4RnM:P3g_,bmhj8ZId&a]k3fU61kLGp1_Op%tY&;1ER3NMVID[DJ@jj8uPO/(qZ"?j\'Z'#DHl?hLXh;#+456e.F6k34%.ff6-<oE]((!Rj(9**mJ$b#Coi9to6&1i4EH?^^r4k:EP4G,K9Yqie.H]B/P/`+7-G]D"lQd(E<[=)jQ3-TCRou$rTo.MQT`8j[:MR+V>CCp9`XFjQ4B16N]gO;\@9U/E2i=OJ\=JmPK-#OoqlT[KfT&B'A"cHE@Z$Or_Es9+jt$h=`'p7NM$6![@0-[mVg2Oi)*:@VZhE/q]OCMJ^<Q:)gNY9tcn,QeF**'X5u95E&c(4oX$BTBiJdC/BM@=KS!Uu'*n(0"U;TK]N0Xd*a3Zoo0qNX&W[VqM<r([9V3C[/B(Hkqqd;9,:".@NV2_Wmq1PHLk#?pMgLA/o,8QfebSM&a'Z&Uc"<nN>OTOS28XrqU8%"9g$;$hhR\>;.fqrR[6*^pLf(71JU?eZ,O.mXu5F(YuU+&fX,dF!Pp$_5rFQ8+Q;IsFoI)Ws$X`Ie>21Y@6V^+*oM0,(,[+9@gF%pLeY%]KEOa#F,Er5/Xg7__o2qD<?oYE3tUX7Z^pFZ2Pd3fl.,e*Tg8=&ULO/NKN9WI[1f&W0QDjRpq"6!+jLC>sGrVM-&aH)"/a"<7ND=W2XJ1#EqZ']>Z-k#RZJjUo_R+[@&/*/Z]FupIKB"R/&%uF(d1J3n4C^k:XMB5YbWeXu;PIT>Y=H[,Q^Yi>G$QM^7iBDk]<&p;F4Zs\$:MKJHA);q'dN0k2Q3N^98!F1bmd?l7dFgHR'MW=[1n2teOTn`oW5/DB])=hOah5gkSsV]>T>me<_H]%;.G[%)&s<XT"RJ,cY>A86;hZFrj4A1.$n#2`#05g@Nu:5W0R<E&G72uOJ%2&VmAV"+XbRE]A7oUs+^.H4S>ieoSAU3=M@AhQd(UBpQn1MZSnLN;n'-\XY1"t#ZRH3a(qEs3EonG<,5$#7g#j<Uj-^F\'>&#gD?jj9]IBCugo)52(k[IomoZ8ko(b4^GeIWNSAM[0p0=g<&@!fY;gb0OG55Vpk2@$;ECenFVf]aJ#nQKH"D)Fh_#2E.eJQcu/]LG@<F=Zl`nW/`iIp>WHR@\T/BK]Ob_/(K\;ZAUl%XB0/]Qa;0*N47PFqZB7[sb/1*ip=GJ][FSHc)Xh!)<&,f&&hlUNK4GupXh@5#nb#Eub8@cUZ5>uDJ>$2$h"&Lsn;[.,F7A&t6q$%?:ML4nU!q4D>[N4U#S>b6-q.,8]n!>UeVfB5<2QuViS;T/9mh'U.V&_s@i#k]m-F89k,*\,JpSg-0k]Am=b/n%CSTd.]QN!,:<OldA6,4@n*P5G6V;3Ch'G^2_Z3h>B!*QP_TWGjSsq,k/>&?cA_6[5"0@G+^'_TQa$X1cpe?=a4@d?Oq*.N:&lAB]X_?6Q$Z1pB:s%H(4e\Vdoibdu`?q9V/A5C%"G>.B`0g*^).W[1<<VOfsu<OHO)@;%=1QJc!(SF#SY9N=hYSbD@c(i#+\Jc2$dJ_J`bW34o\96[KhbFKXUX0MHg=P,Gk&N>WKA)1bm<SuGS:$:T^SHupTHTl1%?DkEo8Lm3XP>'YWe`,K$T`acgFFEs.rIO4k9d+:IADQj<I/!$Ei,DT[38R*ePDP%uZP-/*>%,O;4A(i41)/aNMQoE$Be.lkGQ1]E5EhAm^;*g4g7LQu.!Qb-Wt2B_N:?qg">c%=WK:`lXgs01%km$4Z`E^67[?L:OMGgMR04"YA"kbN!ISqCc-)(A/=b3%[<2T<T`@\6hL]B\'2b:_k?KUec.S\seiJd.Acpd"FZ1qjP]frZ`"-E6j]j,r32*s]0e0m/VVW^+$KR$HSa!Tfk2;-VJVGo1h>AZb58e7%a)DY#ic&/(\-%1FkY)<dD,p5dK&STZPFa<7?bD";::l4J?Md(^mEb_.;B/U.@r"&l%^l]YD$A;E4[Jk=_d<\+[OugK9s>UpgD`jIPA4$#;f-=FCn1QTODQb5`3K&]5;iHroigtM!Wt-#aeP1fZIa"*E8.,Yi!k=J/O*[SRD'%tiagXc._g:6HDVW2m7D8qI3fZ3`4\b..D[MaglE_JhnHk9Rpuke84XaC<[8f]e$6_(3rTG/m':ScV0+oBdCcS.2(EMQo?2S?WR:^FEd8g7F]9hQ],4ErPpcSbb1164W"d2u0,r&$Ee2N9Pb1uRI[ZPmdk&YfWW5YqX/J[aX-h(lRk%WA[8[$FeG2N[U!rI3gK5`b7bdgjP+p[=HMZ.G-mfA(<)m(Qg"Ha5`+R-('Znc<`A4.d?0(\<D#iYhOP#n5)_.0"[PA$:O:4RGMAHOf8:Q6VY>BhWrr_b>^eO~>endstream
endobj
127 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 532
>>
stream
Gat='a\K`=%)(gSHn:p#A'Z'5U[/%^5fALP"@EL&.C>fH5#*#b2!en?9K[dmfs*[GOr%0fRgHlJ!o!qc8<DU-C7ue2L&E9CNj(uV0;Lo:c>*?72:L2.UaK^f#SgS.4:#RJed/TZPVZ#OcmBN]A>,%kAc_<X=gD9iKW#&_UB@J.,B-XhoH>^g<+dDUP9g<4J&dL>,7p4>hF1O_5k4osAuTpuX3j:EKlf*LL[8>NKJ.J5N!3s<s3MeAVtm9lgnpEtqmntI^BfX2ooVJ*kO5DranDRuPPmq4^(]\V+4ZGDXN8gEN*`gE!7sUKNip[9L0&!m>JmA#&#MHj:MFg`o,bS((f(rV#3iW'ZTKhF7G*13I/9:!2P7a;q'TmJnFI1t:JMj^mXB-m#m7C"K0O)4R]S;L<Y!eHQYXXI_6jiHbO@r73S7Lrd&:N*9&@]mnW^E(!gi>?;7k.9h9\VnDkuM7O2<m]E`5S\E#R,,kjH\PqPl9ef&PCtT-5j97Ls$_61h&@AWI(?S#:J4iXid(-#`bp~>endstream
endobj
xref
0 128
0000000000 65535 f
0000000061 00000 n
0000000146 00000 n
0000000253 00000 n
0000000365 00000 n
0000000512 00000 n
0000000657 00000 n
0000000805 00000 n
0000000953 00000 n
0000001100 00000 n
0000001247 00000 n
0000001395 00000 n
0000001542 00000 n
0000001691 00000 n
0000001839 00000 n
0000001987 00000 n
0000002136 00000 n
0000002284 00000 n
0000002433 00000 n
0000002580 00000 n
0000002729 00000 n
0000002877 00000 n
0000003026 00000 n
0000003175 00000 n
0000003323 00000 n
0000003471 00000 n
0000003620 00000 n
0000003769 00000 n
0000003918 00000 n
0000004066 00000 n
0000004214 00000 n
0000004362 00000 n
0000004510 00000 n
0000004657 00000 n
0000004806 00000 n
0000004954 00000 n
0000005102 00000 n
0000005251 00000 n
0000005400 00000 n
0000005548 00000 n
0000005696 00000 n
0000005844 00000 n
0000005992 00000 n
0000006141 00000 n
0000006288 00000 n
0000006435 00000 n
0000006584 00000 n
0000006733 00000 n
0000006881 00000 n
0000007030 00000 n
0000007179 00000 n
0000007295 00000 n
0000007401 00000 n
0000007485 00000 n
0000007563 00000 n
0000007771 00000 n
0000008319 00000 n
0000008527 00000 n
0000008735 00000 n
0000008943 00000 n
0000009151 00000 n
0000009359 00000 n
0000009567 00000 n
0000009775 00000 n
0000009983 00000 n
0000010191 00000 n
0000010399 00000 n
0000010487 00000 n
0000010806 00000 n
0000010882 00000 n
0000011041 00000 n
0000011152 00000 n
0000011284 00000 n
0000011394 00000 n
0000011539 00000 n
0000011658 00000 n
0000011836 00000 n
0000011934 00000 n
0000012046 00000 n
0000012157 00000 n
0000012312 00000 n
0000012436 00000 n
0000012610 00000 n
0000012724 00000 n
0000012863 00000 n
0000012961 00000 n
0000013148 00000 n
0000013276 00000 n
0000013409 00000 n
0000013555 00000 n
0000013747 00000 n
0000013867 00000 n
0000013992 00000 n
0000014103 00000 n
0000014242 00000 n
0000014377 00000 n
0000014501 00000 n
0000014669 00000 n
0000014763 00000 n
0000014871 00000 n
0000014971 00000 n
0000015163 00000 n
0000015290 00000 n
0000015412 00000 n
0000015543 00000 n
0000015668 00000 n
0000015798 00000 n
0000015956 00000 n
0000016058 00000 n
0000016213 00000 n
0000016352 00000 n
0000016492 00000 n
0000016627 00000 n
0000016767 00000 n
0000016879 00000 n
0000016976 00000 n
0000017119 00000 n
0000018142 00000 n
0000020032 00000 n
0000020264 00000 n
0000020495 00000 n
0000024285 00000 n
0000027593 00000 n
0000030455 00000 n
0000032899 00000 n
0000035974 00000 n
0000039956 00000 n
0000043719 00000 n
trailer
<<
/ID
[<f7bcafe2c14a6b5bdfecf76226921bd0><f7bcafe2c14a6b5bdfecf76226921bd0>]
% ReportLab generated PDF document -- digest (opensource)
/Info 67 0 R
/Root 66 0 R
/Size 128
>>
startxref
44343
%%EOF

View File

@@ -142,7 +142,7 @@ endobj
endobj
23 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115606+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115606+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184404+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184404+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Crash console \204 open ingest API \(design\)) /Trapped /False
>>
endobj
@@ -289,7 +289,7 @@ xref
trailer
<<
/ID
[<17f9a5b944b42ce125306ff3734bcaaa><17f9a5b944b42ce125306ff3734bcaaa>]
[<c12702ff83f02932bafed0a50a05e9a6><c12702ff83f02932bafed0a50a05e9a6>]
% ReportLab generated PDF document -- digest (opensource)
/Info 23 0 R

View File

@@ -152,7 +152,7 @@ endobj
endobj
24 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115606+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115606+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184404+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184404+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Open tasks \204 dependency graph) /Trapped /False
>>
endobj
@@ -208,10 +208,10 @@ endobj
endobj
35 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 851
/Filter [ /ASCII85Decode /FlateDecode ] /Length 855
>>
stream
Gat=*a_oie&A@rkk*Q?,_r3'cdj5/)"%?[mVd9La:6\pT,W^YZ^6BUA95RfeA;_"Sn'0m3L*QhC&(^2L!q84#]*AIL&?Gm9&J-MO>;1DniQ"J4M=Mo,TX?,2qnh<^R8AraaanD<;=+D3P5,0QGb-oj4M&oO,gHPqPa)Wr.L4$T601oWJd?7CjsC6NQ@DO%c'X7,\;nY+WuX;=@K,g(Jl`4q@G\s`R?-br,ul+NNDrKs<s\c509m3](Q4Pn(CjVk/3<Y(de8:1:&YdBWebN)$9+'%p8E7%Ust'C\e`s?TKF$&(G3VYd68E9["<;^R!li5.2O?<Kn8p!j/eii(e.;\+Z5sDIX=?-bKTrC`;26m\qX9kk2fYJ@[OX-,R.SG3UHc$Eh.TmPdKlDB-02L8tC<XSTk[MfgKI/#pg3M;-h*;/)4r8O1C7QMI9gAe/R?XgCE\]p*D4YbiK2se7L/bYJW1JG@l39o"Z=\V[iHbH&p-.9.p[fJf=rjlH*K0;OGflW=Xcl^U,B\:3XK%;fh5QhLKK$3=LhM[#efq]QTe-KF(?H1hm)$HJl,T=D,)\;6*UhpNlpgnk>A3h71pGGM1kqm_hN`2Aq;^:6*]LN`sip`,Q-0OZaMX/-c;R%`-b5[7s>0_=$k+\gR+4Kp`b>D<nVGCVXO0>l8R@f,=+G(=HJkHL91*GH6;0a.kk5Ni))_"3]CdgBQBrVQGEO+_QV2X$bX[)RAXWco08Uj``t=K@(]qD@ih#:^oa5&>DJ[%YD03F_)R)..hu9.bsRS0\=?dQSjJS..m"*]L3,qXe=SF:/@L\O5mR3'9[-_T%ea_,SJM*Dk/fmGG%!R!4.0o#DS$~>endstream
Gat=*>Aoub(k'`6p`@%>EW,\?O4i*-g8afY[&6J1$;O5q+9g1Bs*f]eE*5LM,/M.i3T'Ask6h@!&!lZQ"Rt)sM^np@i%4s5&`DK\V)N[hi($QdM/jjVTX?,2]>EQD1SG<=Oos[GU=oXB-$'5VqD>II\-o(JMeiY'.#SXq'`jD;K$'f9GQF>jY"T87TDcmi2e*a-@k.To0/i<aqQ&dTi4XYb%b!>]b.P405,emGXJJOHY!V?<?)a@8X]R,R><?LqE<BiTBbJ8Lh;usQD`7VMJ%U5th0gMF;!I6W+uNeh/ql,D.*#M**Dqd_g3YuB$Q,4rfd.&pZ<g'm%4ogWBCSrL(u<f!P_9+LAVHl!RGCetol4;\$ElG7b>0mfT=8&W%%K(7f`+U`<q>WWd^#mB@B<W@AU_2Ej9j/tiClRp6r6j\0`U]Nf;?I@6l1^:1DK*_#`-`UZZZ8;U]\VW!d1"\1!Gr4lt79D5.pI%*TC"Uqn]q#=d[.JKqH/?4]:rd)nr,fc`L.Pr4G,!Hh<=/^aN,[C4B!>DDg.&)aDLh8qM""0#e<-I&'%1&EAaGVLFrhB#%T8]"?i-i1idt2t&(&o?HfMj1-BJK^5SW+WTmr4<HDTj,(Yj<b_,hROmb:4PGCja^Q9Y3/;mf)PDF6s!fnTe@_pNergunP<C)'g],HM3(s]oY9fb1iS*-ni:$*tO6WL>pj@d@fgM;=ZrKg>*?/8o&/A9%AeV5eMYf]GM:O)a"`eC;DF&B(:b@@#&Yasj21i:K]V2AXX$WK+gIWo7]8p^.pP1A:$5HG%@'t69(5Q-[\*TWV/l<_2B-ScLf*!,+s"[.kU/To"cO_]o[1WKerr@"-HY!~>endstream
endobj
36 0 obj
<<
@@ -286,15 +286,15 @@ xref
0000223654 00000 n
0000223780 00000 n
0000223876 00000 n
0000224818 00000 n
0000225538 00000 n
0000225766 00000 n
0000225994 00000 n
0000229045 00000 n
0000224822 00000 n
0000225542 00000 n
0000225770 00000 n
0000225998 00000 n
0000229049 00000 n
trailer
<<
/ID
[<ec45184a6869623d65b73cee381b9d72><ec45184a6869623d65b73cee381b9d72>]
[<7a84381d4efe58b11f1f4353e8a1e0ad><7a84381d4efe58b11f1f4353e8a1e0ad>]
% ReportLab generated PDF document -- digest (opensource)
/Info 24 0 R
@@ -302,5 +302,5 @@ trailer
/Size 41
>>
startxref
231128
231132
%%EOF

View File

@@ -163,7 +163,7 @@ endobj
endobj
27 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115606+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115606+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184404+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184404+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Opus / Speex / stream protection \204 validation checklist \(task 3\)) /Trapped /False
>>
endobj
@@ -333,7 +333,7 @@ xref
trailer
<<
/ID
[<1cd619210883038fac0702297f0173e6><1cd619210883038fac0702297f0173e6>]
[<2f6142b0e36347c770d4b994c2ae110c><2f6142b0e36347c770d4b994c2ae110c>]
% ReportLab generated PDF document -- digest (opensource)
/Info 27 0 R

View File

@@ -142,7 +142,7 @@ endobj
endobj
23 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115606+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115606+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184404+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184404+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Over-the-air \(OTA\) updates \204 deployment schema **v0**) /Trapped /False
>>
endobj
@@ -290,7 +290,7 @@ xref
trailer
<<
/ID
[<bfaafcc416205de30349560cb8ea8f8f><bfaafcc416205de30349560cb8ea8f8f>]
[<3509cc3417159075b87375494b8de57e><3509cc3417159075b87375494b8de57e>]
% ReportLab generated PDF document -- digest (opensource)
/Info 23 0 R

View File

@@ -127,7 +127,7 @@ endobj
endobj
20 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115606+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115606+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184404+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184404+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Pro / OSS split \(cast-core + cast-pro AAR\)) /Trapped /False
>>
endobj
@@ -259,7 +259,7 @@ xref
trailer
<<
/ID
[<a4eb65ee35e6b29ba7d315a4876585ed><a4eb65ee35e6b29ba7d315a4876585ed>]
[<dc1c0dedc7b9dee00a0ee692ee732c53><dc1c0dedc7b9dee00a0ee692ee732c53>]
% ReportLab generated PDF document -- digest (opensource)
/Info 20 0 R

View File

@@ -2,7 +2,7 @@
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 15 0 R /F4 16 0 R /F5 17 0 R
/F1 2 0 R /F2 3 0 R /F3 5 0 R /F4 6 0 R
>>
endobj
2 0 obj
@@ -17,77 +17,22 @@ endobj
endobj
4 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 18 0 R /Fit ] /Rect [ 45.68504 762.0394 95.92504 773.0394 ] /Subtype /Link /Type /Annot
/Border [ 0 0 0 ] /Contents () /Dest [ 7 0 R /Fit ] /Rect [ 45.68504 762.0394 124.389 773.0394 ] /Subtype /Link /Type /Annot
>>
endobj
5 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 18 0 R /Fit ] /Rect [ 45.68504 751.0394 95.03704 762.0394 ] /Subtype /Link /Type /Annot
/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
6 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 18 0 R /Fit ] /Rect [ 45.68504 740.0394 99.91704 751.0394 ] /Subtype /Link /Type /Annot
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
7 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 18 0 R /Fit ] /Rect [ 45.68504 729.0394 74.14104 740.0394 ] /Subtype /Link /Type /Annot
>>
endobj
8 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 18 0 R /Fit ] /Rect [ 59.68504 718.6019 142.6425 728.6019 ] /Subtype /Link /Type /Annot
>>
endobj
9 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 18 0 R /Fit ] /Rect [ 59.68504 708.6019 132.21 718.6019 ] /Subtype /Link /Type /Annot
>>
endobj
10 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 18 0 R /Fit ] /Rect [ 59.68504 698.6019 106.38 708.6019 ] /Subtype /Link /Type /Annot
>>
endobj
11 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 18 0 R /Fit ] /Rect [ 59.68504 688.6019 107.2125 698.6019 ] /Subtype /Link /Type /Annot
>>
endobj
12 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 18 0 R /Fit ] /Rect [ 59.68504 678.6019 125.97 688.6019 ] /Subtype /Link /Type /Annot
>>
endobj
13 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 18 0 R /Fit ] /Rect [ 45.68504 668.0394 102.165 679.0394 ] /Subtype /Link /Type /Annot
>>
endobj
14 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 18 0 R /Fit ] /Rect [ 45.68504 657.0394 109.701 668.0394 ] /Subtype /Link /Type /Annot
>>
endobj
15 0 obj
<<
/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
16 0 obj
<<
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
17 0 obj
<<
/BaseFont /Symbol /Name /F5 /Subtype /Type1 /Type /Font
>>
endobj
18 0 obj
<<
/Contents 39 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 38 0 R /Resources <<
/Contents 15 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 14 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
@@ -95,10 +40,9 @@ endobj
/Type /Page
>>
endobj
19 0 obj
8 0 obj
<<
/Annots [ 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R
14 0 R ] /Contents 40 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 38 0 R /Resources <<
/Annots [ 4 0 R ] /Contents 16 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 14 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0
/Trans <<
@@ -106,9 +50,9 @@ endobj
>> /Type /Page
>>
endobj
20 0 obj
9 0 obj
<<
/Contents 41 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 38 0 R /Resources <<
/Contents 17 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 14 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
@@ -116,212 +60,83 @@ endobj
/Type /Page
>>
endobj
21 0 obj
10 0 obj
<<
/Contents 42 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 38 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
/Outlines 12 0 R /PageMode /UseNone /Pages 14 0 R /Type /Catalog
>>
endobj
22 0 obj
11 0 obj
<<
/Contents 43 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 38 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
/Author (Android Cast project) /CreationDate (D:20260626184405+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184405+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (ac-docs) /Trapped /False
>>
endobj
23 0 obj
12 0 obj
<<
/Contents 44 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 38 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
/Count 1 /First 13 0 R /Last 13 0 R /Type /Outlines
>>
endobj
24 0 obj
13 0 obj
<<
/Outlines 26 0 R /PageMode /UseNone /Pages 38 0 R /Type /Catalog
/Dest [ 7 0 R /Fit ] /Parent 12 0 R /Title (Developer onboarding)
>>
endobj
25 0 obj
14 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115606+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115606+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Android Cast \204 documentation index) /Trapped /False
/Count 3 /Kids [ 7 0 R 8 0 R 9 0 R ] /Type /Pages
>>
endobj
26 0 obj
15 0 obj
<<
/Count 12 /First 27 0 R /Last 37 0 R /Type /Outlines
>>
endobj
27 0 obj
<<
/Dest [ 18 0 R /Fit ] /Next 28 0 R /Parent 26 0 R /Title (All documents)
>>
endobj
28 0 obj
<<
/Dest [ 18 0 R /Fit ] /Next 29 0 R /Parent 26 0 R /Prev 27 0 R /Title (Specifications)
>>
endobj
29 0 obj
<<
/Dest [ 18 0 R /Fit ] /Next 30 0 R /Parent 26 0 R /Prev 28 0 R /Title (Design reviews)
>>
endobj
30 0 obj
<<
/Count 5 /Dest [ 18 0 R /Fit ] /First 31 0 R /Last 35 0 R /Next 36 0 R /Parent 26 0 R
/Prev 29 0 R /Title (By topic)
>>
endobj
31 0 obj
<<
/Dest [ 18 0 R /Fit ] /Next 32 0 R /Parent 30 0 R /Title (Infrastructure and deploy)
>>
endobj
32 0 obj
<<
/Dest [ 18 0 R /Fit ] /Next 33 0 R /Parent 30 0 R /Prev 31 0 R /Title (Development process)
>>
endobj
33 0 obj
<<
/Dest [ 18 0 R /Fit ] /Next 34 0 R /Parent 30 0 R /Prev 32 0 R /Title (Alpha and QA)
>>
endobj
34 0 obj
<<
/Dest [ 18 0 R /Fit ] /Next 35 0 R /Parent 30 0 R /Prev 33 0 R /Title (Backend apps)
>>
endobj
35 0 obj
<<
/Dest [ 18 0 R /Fit ] /Parent 30 0 R /Prev 34 0 R /Title (Product and codecs)
>>
endobj
36 0 obj
<<
/Dest [ 18 0 R /Fit ] /Next 37 0 R /Parent 26 0 R /Prev 30 0 R /Title (Agent bootstrap)
>>
endobj
37 0 obj
<<
/Dest [ 18 0 R /Fit ] /Parent 26 0 R /Prev 36 0 R /Title (Maintaining TOCs)
>>
endobj
38 0 obj
<<
/Count 6 /Kids [ 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R ] /Type /Pages
>>
endobj
39 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 836
/Filter [ /ASCII85Decode /FlateDecode ] /Length 291
>>
stream
Gat=*9on!^&A@Zck"&Rjlg\V.Uq:H>MB3P-SpH6Lfk*[9D$XtRpN6N\+,,e!$`r!0Dk>#0nK:Z_YkVQo!+.m6HpL"%hAT3%!T"f.hWW8k:Fh,Eb)oYRes]G'$B)7>KK>&b%YVHOC'TQ\bS:EJgW4Epfo-+gZ6gE]bY9dW)aMn@CWc%W(Vk86#AFeTnDnLDpr/VT+Be(U'5)b0-8C0n@/bTUmiB%GQo)W[l`4lhoI;,ldOQcX$DH:bol;7;MD:H8I7!OV3K.=n,_F!OqYXhmU7bK7@:!]c**nr802R]%U323"loa1ic8^T!Bpi8DO=BJr$)rLKKB:<]\VAL)CIg`>T\Yq_HCNU$LKNHr<VQ!?gV!G:7s+><(PRE=`!#u;QInKP4A&cc[H!.0pRm<lpD?f%fj'R`PXkpGFV"(>J$Up_juPO6muFMHVh[R>)k??%hauO306^75REYc][3,;#K@sPFH/SDd;hKF*p>OT"R+oLHi5Q8+HE\?[;KL':JY0?2p4D/["rLod6Ic3=LMf!%%J)]]7nF8p_pshX%(F`%"(Je#PDNX7\*7m6V/GIC!IXB3Q=b'`0K\'u2k2rb6+Dh64G8>M[*3iek]#Ml'*htDAomK+1nPeW#CGG*<+%t7puilL0RjpP-B7uK"mYRMpHBc2dmDbLUt%-4fhqu;c`_ds]h8+`#+!4BX\[<`0Wcq./\+34<t4gO<fuL?6%+Vk.(94t.u\@2FG3O#KW5TXJIiQJ2\<X!X!t);T[:`sb&QU*Ej)[ul843P.!2]+[mUU.@4GsbXbY@OlL],J@R5$/d'9R:8Knb;U6HWB4@1hM_<;tifm$6~>endstream
Gas2DcYC?O%#=:sMVg--<4-8[ZB#qt:YfHs0/+#"(kf3_rF'm'rFm*9@"BWiq^dK&_94ja^jX%Ba'_1nJ-,t>4bhCuGC8W`8hm:Q0Jd`5L\e0>aX-KB5s@eO$"PMG0M\fWS]Tb+6^]Gk^tK>D%3XXZZLbJ1-M/tOAibqo2^iSm\(FrPX3FS&^PjA#rYVWp*#\(T2Y*YV-Z3ttf</EGdI0iN):-4V_rF#RoO[V)?B$5`Jo;*/J_;6uq(0m;WUVa_bE@?hWAig9pF&YVS/0)8Z%]q*62([K9O2<~>endstream
endobj
40 0 obj
16 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 614
/Filter [ /ASCII85Decode /FlateDecode ] /Length 396
>>
stream
Gatn$;/_pX'SYH9/'_Y6#8\><@;j8N8s<;X?$Y4`CRg'3fZZ=WqX8'1>&A+5GnI?t#[dAPot<D`8A_%[?1!23L!(tRb##3+1QnI.MH)P225A45N0Cp48Hp=@8^]@%hh>X)'J/>p86Y/4-pRoJAObW:Zg^ceMP1?VI:09(K<]uH;9A]9_lf]7n_3d;"0.ul4q?r60M_00j:$M6N2J)D%-^<T[k2?q%f8e;<_c)tla1EXNKV#\-3g"V;k]PhD`.ep5;`3k#0kGmpIY#:$/TibMLa.TLXHTin/&5E*nOoZ"nEJ9G-^l1T_uW?85l;7?#-&VUa4D]=m?7Jg2?+7FNuAl7hd+"V\Lq)]<*'^iH?8.0;bR!UtY(KQ<b;jq\b.[0D^[7Fm+H4HY$up@Pm0AA>Z[N.XuB=&,dog#WCjEZ*._KI(1*$61sVd9]En[;N]<,IQAT2;fN3Ol?GY=SDrr6:>JQ_;MaMa$nhfpZj3N$-[]:GQe*anYOR6"JR5Cn.FC%cfAk8i*?'R"jV7t9e#nJ`8rrtuFk6Amk-["N%5h0jl[&+S;'Ibf7?4kKZd@<P.nP1P$3-+5;aG(/p7?9@.4rP=/f64's2Dh@2fRZUg&~>endstream
Gat=f4`A1k&;KrWMK`ku(nX%PUg#?WC8HAilk4o$'X4PMi:#8(#dqHE<@?I_n*K5JP6j>UokUr>*X`Cr";3+p+N5%P-]ErD/"pILdO`X"="qWJ/oqcr`AHVCOBR7X4QRml1Krjs&EZQ3P>2tS.+XM(NXR'l_G*m&<Yg.=b.H69[^eisM;k[J^W*e':\d6Mnpi)uI>?>$LN[<3IU`JmS+na4CH)9GJ6#>^:7]2n![Uum/;T%L;k=WIpBs?c%uq:"GN@RG[!_W&:t^3.N?3i#,IX3'6O8=a<c.4E<jc-if__m@mI2kN@oqEu%1V#[fqR/;2EnK&f@o0*'hVOZHt_/$UWb,1PN$sSLn84FZh4#QIctQ](hI^d68M?#or[!T$m:%>OF..hool?~>endstream
endobj
41 0 obj
17 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 137
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1151
>>
stream
Gar'`]*cDO&;9"kTAhNS@cJ`sQ<)AT7bBX2'SI1sre63!8eu#Hi*12+:VXOqE!h>Xcq$8qnjH_CLV:rJP%rsj5>UUDD.`Liah"L%cVntog).//WF]OI2_e/&`/?Tki+CUX9Pb^j~>endstream
endobj
42 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 322
>>
stream
GarnQ4`>s,'\rL!2j,Y2Gf7VIg8H)\3`Pd>,m?5I#W;ibrdKEq;-TkXak$(>48Fnu%%uk//)XH<EDN5Aq@1@\LYgra8+.%\Q!COeM1e5G`Pcf9LV876-G%l#K*,CQ;^S0<a\kinanW)+]KY#]`""0\8d#Z3)`N`Qc5)/n`T4j]2mFrp>udZ/iF!\C_4^:C<uDgYN?;t]lsAjWG>7Cm3HhPjjkG<`>uMNQGGlJP@85WsB5@d#KYA>a4:eq?8MHQO3C`j8O>8*qqA(d,M.D@UpK%llfIN8YHi29O=@u%T.\qY&+uM4mF"EFOqC/.7[9I6g~>endstream
endobj
43 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3687
>>
stream
Gb!;&CNJ3#np>gSJ%BZD!Gb.kJp\4S4'Wn9^r^GYX&QAA5T:lOH=/hLrd#h$&dH%T>BO#MfGT#!k=e+;Rt-#R,l2@q!I>-`]d#cj/65$3Q3<*XBT!CNI3=<9;S+6!g4BHbU9k'./)g46N*dh:/j`sN"\STWDsqAH?:@Zk]J\KC[LGm]%(FFer/\)W',J?&.M);qU*Opo5A>`q#Ur(lTgQf-#VE;3$VCY-8t0uMJp9L>pbbn\Oi;3r&h684Lu:!irJ!<-cZ,!s>h[Ya&5$p@p\6=3.E3o2FYH`lN*5Ao^eDB-6Hlf(;gZl)jY1&m@2AHGN>5m9XMZUOb8MnJHs)4BbiH(L$8@[&%^09+]6,g:j^QH^`A:kS=Y.!(+a#>,KOP=4lPNGI[\$gFI-kD/M04bI9@tlS>t+a[JeGV(qT]t:kf[Z+(Q[E1l\R'7`!M/N7rU7DGi#K]Q\r-r$Z[i[o5M<!]XK]Pl0n6=Os?%;/O>Pq8Q#S[OXs=WVL?p*F%r:Q5O1DWh7:7.qmmkjeClNJ#[Eqs`+^jWeo6pg\uco*0MI]+5!7YK^V<34DHE.K5b/CW5!m+clRFF+K.,@$JC:6;C(m#?m,llI7_2;=$oZ@qmCneu^H-(g;hLA$]boVSEn9_Al="Q*JS,+OleE[SW!^H!D%,'OIaHjeHhR(d<rl:%WIU#3Ni&FKI6&<BB#DSaS!Ofc8FSd5mP0DmZ5Lm=n,qgH5qU]pJiD?8L(b.k(qW)=Kbes.<:72$;(58MI:cdfg_Y`kIKO&Mm#5=NTFN0q<_!ZRK/WTblt^Y_O/QqV/'fWAPNl+o)YhP2>:,!)Z"q/3YcVJY$G[12+@MX\GE8[Y[^XlsWb:]:Du$]fY#8Ktq-p5#@t!i+T'?E[pNU%;mMZf.Aq5V*)*MSJ@2Ws,i:!&$.p#6@-Pm@-K9d1K18-$AgI)T]nUd,)(#9U/*mNu&B`s1XXoV>+!\`mX*et3mgX*<>kh-iC5=I+^"h@3XPa)E4q3">a;GST<d#lLZm4hrYX=a$<_e/c9=iWTATOZ]A;q*PO>ps4n:4SirJS@f$r\/r;%qEM`N'XWJM^&mf*iuH9!=-Xf*?9]?2NOpsQd=i$_cRg=F=g'eF;*om=RIcu`@.$rW2^*+aBb+\:CZBIK3L(CqE1hK)#MDnn=YAOXdu?$=uB^0<^pa-\abb^%n^gUQqu3bj^bDe@D6`p!(Q6Tn6P&ZQlBZ:YVGG58;L/\h:,0?'s;ka;nqQ-O6UDgpd9Nr+gq,n3;H`QcGDR8mYIq$J2nRd0cA:Si?9Cco<7qMq?]<;Zc"hZa5:ARZh?L.>!$>#%a-eGNUZKu*"C8Y:IgU5b)'>n#,]C):kV#Y2%3W'T$L(GC'1%pbN<i6Y2d-]c7R_pG&o;]W?+S+POVbEonVh2P^#&6%+q0)mZ)S;[1T'=2jQY__GHdii3([T^<&q=R+7h.R#94sl"%6LB'#hg:.9;1kABO>(nNk-ha!"+0pXrfh!Hd9I5]HLc8%W3+P!75rG\IfN@*Q+M06aDrp'/=]QP76.uCS4ZAk$no>#?m*bQJd)OtYjqUiTAC,<at:V:\"Q1^#03&KthnWKrIG,MX'B'Pr`<RpiXmKOU=C-&5>]+'KMI:qs'TUb;Ie*UY=iGKe_k&]^-mhmXn1%=%gQHtbY/W-#JXOOCFFSPNH<\B]h5X+krAS=PY<IcqPk$W,"i#Z10lb]39[!Xt6Ppb:OZf[<5#E6jiStW&>@#%SfF#O=e*?G@@hlQBSJ6:qs+Bom_[BDW'Luf=L*Ig;bo'!"i#%+0Y-KaP]!s6]dedTo`UOX:!H5N2)1LE7B^&$pO/_'T_\W2GnqRN,`2<aBD>2JaupcS9>T^.t`nGu/[0P2AliC,@oW1;sCVN5eH51R%?khe)S(oW@uWC@n;]?n<`mhgC?Vu8TB*Xf!=LQ3fIqARmZWE,Ulh9&k8LA=`!e\[8=)ihgPY`1S#$t(_FYXEZ9'cpO@S`>LE!q0UnN+-WHHEG;OX]%6\REd.jWg8RXeZkS\NLH`&.K1nes$q\BP/AKr[K>A?@oJU2HBsP)iAsak\T1.qe&IT*VQ5+rM!+VR4=um]<@@Fpo%8A(GY?[&YdQV4%r$#!fWLagA-JuXl`--f=\e`!rQu2ScjCTs'gE\TcJ\.pH*U#,1T&hn*K8N_.8d*T+/2W,.OBOmn1Y*+StY.f2QS_ea5W2Zl=?KAq<s7-rQ'JcWQN.gf`.Ztk'@b>CJ_8iV%*?43RWG)[%2cB#(^3#U95suf">Jh.qE'S>$%!cj1M:>*fPl#?_&iBVJqf]8o-X-ghNI3'*I:6n/,2k-lFee$lDbg1!1Gqca0!D1KL@OD>FtTc1+3:=/U-<nF@olN:!-;%/Mp^qt!1U6PZRpi;E'1r^3^q01jcAHYN]RV%*#%,btH-k$oRB0t$*M,2VufKB*\$hV(_WE1)5E.0IFu!hpqB_IWc]3Z/J]O!*;B:4`0q!Hi&[KZaL_AY,cdVci.rMKtY%Su.mQ=lsFUH(&<9VO/`6k"1GUP%C5\R-1$t1^KESW%DXI\4f.ck"P8U!YR<Ci6)6k1>:[0"=.Nb_3[Yg2ku?"8Jaug(!9)]E^gZ38It3I)VQPjL`%Lph3;c_VG2o8Q1=pJZl@m[Y(U>*4R*Gi2`$k'&\CY.;2B8(TC4[/Xfe#nQg#)gES^l*>16YXAe^Yj#@9gH4V904GIc@mc43KPlp;L`#Q.b4\l;M,fp8e$qcCDXeH6X'Lk%dDkb9,E[dNb]@LQUMV0H/BZ060cJqQVAL5T4?=MOOd^ENETQ14Y(EkV/!'+o^.^a)+dRL5L)20D6.U@\?i0*_ElOF#1-j9O1PIQ[S`]iMVXBb@0fbAkpTAV8LtLm!.."%L[K6UeIALn7Kemai5d/^dKoPR@?>jnYO-hmtr;;rG,;ci7PF?Cpj>RaM!Sos:L[opU?<3ppAJZdnC4?h1PRa^tEejBn8<>Jdu^@BaHrDhi*Z4kFQrHFAa(lLOmfp$05f6^?Q>P</C1Te)@LchBB0kCs"AlAW42rI:c_T?ZPk+XR=H+]LC]<]eoA"g=QKMsQ(DMJg!uAl:e!T3q6(MfJD3Wp9Hn*I&Rs^-b;dkrSNBoVMi-8#%jM>J#G$^MdpnpIG3uG)`"<P.796%(1u-0fq'/lY#HI>rca>]8gZ2_5:B<@r2C"XM(7,GW12mn)rZIK:f_XH1"Jj^gM?"Gt(uun'-$)9q.L3;0$<tU-roh/h2GD&3n5oU62c/DZW/KL(2d=lZcA^RUO)Ajga._5N#Id(RQbGJ6f9+EtbcghrP"-s0=IE0RYh#,Fs"YNEP,g*0+D:V];QJ05kM3abG[E?LNkt'J8qAJNOO<nhhU3ZoV).SKjCPrub$Ja<qMs^^JD#)MiS@iofnGFG\YE\O3'X9@0%.IdT9pH6Mbg\/-<G!ls/6Hl;@ZgRa`';3U]de-s;(n3eQ+Q#m"5]ERI<$8eTI=ra,.\&=6&`_ha0-o$&TTF?$Mb12gpNs`FU]43Qo]UuSJNifCM+.a7e+-^1>$\f?_'bA`$L*[a.g3G<C[4\?/QFM>q:cq<u'KFLUM.EE6e@8!qY$;jek`ct-kSsh]\IL&.-U,]::m-:\W2C\*/C;tRR3,fdFh@kB=m+iI?S+\j7$6I+mjZqN#brV,AG[e[gS3-5R]ur/h&ep1aEbI5UX%p/*Vf,2WMc%,~>endstream
endobj
44 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1496
>>
stream
GatUt@;hW+&;Iso=,^,7amCCA`>ER/&Xt%HSX9CPY>V/2J[NbAB'J_EfA*REJ_25B*H`=E9!FY9H2Pt3b9R3aI$*Q8[K\]_TR0:]=HLaXfS0jW"G5^j[s)Ape*\08f/IPc4^selJW8:?BtTP7p[X8,,\nN/I<G;6JjI((DpFgp(=;SQeM;icbi-_E!6IHeI&t4jiG2dKa#3^1W81aNa$a>$0kcR82=tLo0S.LYEF&&]iONm.F1AJ+(Zp=Ss&]qA(5qaNcf]8r\ZouF&PQfL@Q,AcaSP<\&`-8Pj/N'h`LHXh+F/:BANEVfl2dna/[^[d]sm1d,gG`oWe(hZ7OU#O1bZbfO3_MSK[V=UU/lh=UiHd2C;nY,K>SZKRY>Gm>Z*d+[ff.1?r@"XD6kp3@-Rod/3!b#:hc*_n8j]01n+99$U8IL<.R&-')mKh6EsLB`UaS)k:H1"rC`d>9?PeJ#tYpWXd8^8UfDE\<=@D095#(uaP>s<]bbA&d=OLrCI;^%Q=DtQKf*rm6ubJ%XJ\\[MT^)fWSFT,WH`+P"C#r$SY'Ieb&(`8G&KVVXr?0BT8s4a/'H5Sm4TuUaf]1fdrYkh4h;4U.[OBg<\i'Cc_:`QWt:'&E!IK'M0;biSO8<U'`BrV-u*mjI!*bU5]\O9gBRPUi2+pImofMq7E<nE_=LBu)S==?Nd>ID,R7PrE-cL97)Q8oBn]-"$!eDFTa$$mY^qJTPktBCWM0lQT<[HXKgp.W#7'#'/3]cjUPgiIqJjr(e12pLSig&TFqY<#mpMp[YNaT]T8\u;oEq5"5obr`QS"DN%BNg3A]E<&<%kpM"403`#p*<OFu/.+VG8_S=l''Mms1&#Q?:cLJ_B,F$T)Mc64H-Ai7=NTZ^@KY"Fnm9e8aOscNTh>)qg3$`kFfJ"ct<=G./rs:7XC.__l;?7bb\O8(nD*R\,Z[fWo\6?[r&`c<SlP]]EBiKhj$)(ucH7)f)'@k3FeuF+o(0U</XWI963JO\?eS!U#33">4^A5%u^<c>2>3f<n?^(gik(:U@4@8)]=Y*mfR5%ScT`.F(W[AXuVgkmb(:gKSf.c:.,cJer]u8u:Rop:tscCmG*7j+O"!VI*Nl>CjJt"L2)a%C`dZr\MNB1ORN!,aESooolnQ(YL/qR>iR=3XWaGoICOpm2<m'oEUF%?n*rh^4b6j]7pou3!cU,nBZ^0,d)j&GZ!IjL^)&0_HTLU29Dn9B\R.2iA]N\,"3.B_4_d1ktib&<o<E?#Q&WS`%7r:$Wn/*SV2u5oqZuL\a9kc6?7&se\d9</nnVoeV2"s1go(PH*`Ak+BY&7lh<'$k5G1D*Rjt4b>3Jni?\99VUTPc)kCZ?^`T7XfTkc%.@,ag87*eVZ7?HU+!.>QAh*(F%r050*r]FqMFu"YU)qNV`K##2a^`:GUO)]dBJ0n11G*rT+,4PEi]?T"prLs6nU]Y8s+g*&[,5p6ijg+<QMZ>[%<]]W*M"9+i8+F`0DQg~>endstream
Gatm:D/Ymt&H88.E?DNd2;#QRhm.p<R\D&2>%pk[7"^]-!bO^PC`iB*GEC0LRPZ[dJ6;N9T6p"O\MFC,+'SWg@t:a8866KR"*XcF,q?DLYh[O-%c(m")UV8R<l$IaU+&5?pRrE_dMFH(1iQrtE]K.07'd#\X!_+<\"<ek#_R]#(D)DuA'C.R01(f:XNT3ak0FDV^`jFH`$,dj=KLEo\3CQ5/XKRFgm1Uf[4QiOp5)a!mcTc*%6hC[)^^\k&P'#81S7O^W2[#'=e!I+i*TYug4Yf$nO8TVnp4"u[Zp\M^6bZ47o7crh6B/5o%1o9$=Gp-aq)lHdXA*AR0F%^YM..*DT7/hL)J;\ob6se>4]fgp_m&%[@o_$n1(g>M)umeRdm$Ak"Mnn488?2j2#1[dq,)=?H,p+j"I:R:Vo>)Z6XDi:;Kk:7rW(oDU/%)OtgGc^9!b^#nQhFO$jjSOk^=/$deNPK6hg=W<Tr62!bh-A;[5a;0ofiQp;(>oi-h<SHQF\MQ6=TUJ-G9W^+R4nJNLnB<.bB]2V<)Va>acDUR0'>buWK0'XLp`RU#KWq+.fVie9/[7p\XfL2l;6`[AT)1)DJQ2A0\1#JH8VD*V"kT&7>@ts0,\"K5fb9OXV&PYF*,(8L-F_?[\;p4kSbIsJ+.6m1NkuMWu4$i52(D-E:=>GcarpkiTUo33R?/`r7S86Fhhg'k%A8E:J8o<k,KjJ%^N44;`6,`^)h+.p9_Mg4E?1.\a<Umj[s&*>b!glJ%iUAD(LIEJ[56q6FcO.JGeoiBO+pX>%Y]'R27fB;J3A.5-S*Vf5Hc%>W$^(CB<S7Ql$b5B=1Zrn250>Y3X`L#F[RO3A[Vft7a7V@`ROLb;Ge1`G2"8[-8\gs+^>ea>#e_hY.^:'b(Rof$d).Q;B=Wg)Zn9o"qVr`F3ge]*p5e6sGcJ<RTBCG?KDYcXn\>eXn"sU:G+<>!U3#kCZemjgI`LniLR?:^2%&`urmno7r*21MppE$?/-;^^aN\l'c*I8If?i.ZK:T"c^f`8)DU]6UX;51SC'\cZ$ZOZ.i*-SnTelm3gB\Y^D5(?WH^S]\h<_`lkc.;bK3"P:<$6ofWM)\+I'*+m"U3;_jh?jU9eco2d3;mU1eQ$X1=T;h!p*/)T^r\F!l(Z~>endstream
endobj
xref
0 45
0 18
0000000000 65535 f
0000000061 00000 n
0000000135 00000 n
0000000242 00000 n
0000000354 00000 n
0000000502 00000 n
0000000650 00000 n
0000000798 00000 n
0000000946 00000 n
0000001094 00000 n
0000001240 00000 n
0000001387 00000 n
0000001536 00000 n
0000001683 00000 n
0000001831 00000 n
0000001979 00000 n
0000002095 00000 n
0000002201 00000 n
0000002279 00000 n
0000002485 00000 n
0000002777 00000 n
0000002983 00000 n
0000003189 00000 n
0000003395 00000 n
0000003601 00000 n
0000003688 00000 n
0000004000 00000 n
0000004075 00000 n
0000004170 00000 n
0000004279 00000 n
0000004388 00000 n
0000004530 00000 n
0000004637 00000 n
0000004751 00000 n
0000004858 00000 n
0000004965 00000 n
0000005065 00000 n
0000005175 00000 n
0000005273 00000 n
0000005369 00000 n
0000006296 00000 n
0000007001 00000 n
0000007229 00000 n
0000007642 00000 n
0000011421 00000 n
0000000122 00000 n
0000000229 00000 n
0000000341 00000 n
0000000487 00000 n
0000000602 00000 n
0000000707 00000 n
0000000912 00000 n
0000001135 00000 n
0000001340 00000 n
0000001427 00000 n
0000001709 00000 n
0000001783 00000 n
0000001871 00000 n
0000001943 00000 n
0000002325 00000 n
0000002812 00000 n
trailer
<<
/ID
[<21bd418253115595219f2239810885ec><21bd418253115595219f2239810885ec>]
[<b4fc6b561b67f06b71f7e5359745f43a><b4fc6b561b67f06b71f7e5359745f43a>]
% ReportLab generated PDF document -- digest (opensource)
/Info 25 0 R
/Root 24 0 R
/Size 45
/Info 11 0 R
/Root 10 0 R
/Size 18
>>
startxref
13009
4055
%%EOF

View File

@@ -183,7 +183,7 @@ endobj
endobj
30 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115606+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115606+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184405+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184405+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Remote access \204 implementation notes \(v1 WireGuard\)) /Trapped /False
>>
endobj
@@ -276,10 +276,10 @@ endobj
endobj
48 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 861
/Filter [ /ASCII85Decode /FlateDecode ] /Length 872
>>
stream
Gat=*95gRZ&AI=/bV?46fAe4u]8ourp!OWC?@"oRBrM/E$0eJiIL!03a!Lp5P$%8LqrXC<$oS0b#HQ`n!q7LdRl^`e&?GjH;\2(,pL*]ALAt:(c&AR2!c'CJdT;)H1ZP'g=oso%iRS*C[I=ntr]29!4LhX-,ih8llI(@tV#r<:6u*7bK*^U80$+G*iH"1k>Bgas6C_lC/obS;(3,X,8p7Ma57i:_\\$aQH1Z-""i38'f<FK0Oo.^qNeLl&kp?PXd5M@0YoeR.H639Ud869V3Um+@K+oG6a(0s>"HhH?Zd2h?J2V84n8+r']telWF\85;ia<j%Ip0^b->&kV'F#>+c5j!hM6hTp21coS_^[tVrNSi^o?@1[`:c<s\V+%TkEQi0@[OW>/-0'W0]N,8U.MoQ8mY6bMb_cM;jEk[e_=Brf$VT36B+ZY1m]or%+dSm@rA'bg)gTSHQsM>gYqP&Gg#XiZ!9Pb(=[Z>X"Y!lT5Jkao=uH3V[iHbqhV`2g#n&r^l8FomGp*Oc/&@F'SSu*CQI\MmQb`"(7[R/5e!/OL50_P5a"S+.UGjV@(N75!N>7>cPBqhh/5WaC>46q/!,r>H$18^O,MJbbe`1Ym_hQa/fD_A:<q4-0ks4V'?;P<o'A63CW(b]aXR"N/U-<M%`RUCK^Qt[Kj29f<:/urgct$"5%C1g9%+NO2a6'H/I)1ocMXIuPKLXUGcj`QD;^t!hHJQ8Ee:7&1UKlN+Y,2MD%ghaIL"pm(u'Vo#%9Oudi_TpTc/UN+Cn,H=&t;GAbWf:iXUJ'=<C>pdL7%+d)3G1R8o&bna)=MA(,)QhmqDi"t_DoO']Ic1QCTu\'-kL%G4E!_!E_6*/P"~>endstream
Gat=*gMY_1&:N^lk)i&@Za3a10hk6hMPptdm7X7rJgGDiD/'JZrk<.]j%I5@aP`>-k+'!Km-YumqdBDpLB([D\@G*p#2Tth&-:Vj`noY"!'`>p,g)6KJC^/cmL"lY@R;*T,mV:m7C<4c9BHS7jE4ijnR+h=(KqI\:hD$kb7$p23,5RsgfqR5C;Mqfi6URuZ[lc/1^)c`AO7',IN$-:6rn1O_]?V_+>FC25?U*U?%M_[hDL8WI+J6Dq]#u0+d$=AP+nugRU\,V:?4SEbbD@VU=mHfLA+7Z_K>_N_]-AGhVF0(Z^5Tk5:7^]'V;_B+uNehc<[D!.*![fk"7@OOLJg`b$\IXAsY2^$:Yf%(g(*KcKm!%(d4``E^BfOYs?_.bjHdqqE1smKNF],jVK5;SN#Fr%%Osof`.G^:@e?]dX8&tA$"<0H%ig+nd<V+F=!VK+t0HaR"+q4X_BIjd93HXKL24>#-hq4G+64b8V^D#TT2os5hn!jaPVB4mHL/HDO3K9\>NpTD!^t=hXLu`Z,K`!3t6CjfcQIe5A`%?&V'Zs@$IW&[6NO-\*BN=M8)V*N#0;cR.go[^SO[+M#N6l7t+e#VSc`*\p<-?i4UA'R@Qp$o]*TtrnO2M"P^.,6eFIfZaA2=p*U=o==<WS@_7@1LO5rWCHUKdXTtXDlOJC<k"j8"/[Ep@3l:jOrndt!@9Q4VOYk)BK5FfMn);P&b<%0M>eqs-dAh`JVJ/K(U2ki6lPZ]H<g%$R5ug<GPZn7#,t?K/\jWJ86BqgR6\lAkCC"8:X6s#>5b[qQQ/N2p7BB:_\ho+u.!2]G[6tBjgLiFb`jP%Dom(IVMEu8Wd'3g/P=-TUGuH^k\,fkc";q%=hO9#/~>endstream
endobj
49 0 obj
<<
@@ -374,16 +374,16 @@ xref
0000006633 00000 n
0000006720 00000 n
0000006823 00000 n
0000007775 00000 n
0000008685 00000 n
0000008915 00000 n
0000009143 00000 n
0000013497 00000 n
0000017095 00000 n
0000007786 00000 n
0000008696 00000 n
0000008926 00000 n
0000009154 00000 n
0000013508 00000 n
0000017106 00000 n
trailer
<<
/ID
[<73cdfebcff903d1566b9858951833b52><73cdfebcff903d1566b9858951833b52>]
[<74db94b9f71a3d055821ea20f0c6c642><74db94b9f71a3d055821ea20f0c6c642>]
% ReportLab generated PDF document -- digest (opensource)
/Info 30 0 R
@@ -391,5 +391,5 @@ trailer
/Size 55
>>
startxref
18716
18727
%%EOF

View File

@@ -137,7 +137,7 @@ endobj
endobj
22 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115606+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115606+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184405+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184405+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Remote access \204 validation \(Linux CLI + mobile parity\)) /Trapped /False
>>
endobj
@@ -193,10 +193,10 @@ endobj
endobj
33 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 874
/Filter [ /ASCII85Decode /FlateDecode ] /Length 890
>>
stream
Gat=*968f@&AI`dp6_Y.U6YDUO(k&)g>S4Qkp[G#Lr:0I;D=pBpKa1(575DB%+\O]n(WV@V+'>7@.B7UJ?L,$h]neEE"4:aKQ%!:iTSSn5?CIr['-tB@gqC(+:1PI`dQep&""/HDL>h]M*N8dSk$_UHSl#EPZ.oRj\uNE'I_)M=$i*5SAE1>9p`DE.$!\@%8T;-fLCd0(?NXnK;XW!P&:38mGnM"JTU]L=]fp,<_<;\FEn2O.tgtXDGlW&&+gk466fEo(Q)^q&_^aL$]h9X+6X]=89$RCJXU:qMk()/]1l`BlQddWn&/LGBnpEF0]AM<[/'jk;qrgL>)9l)Es"0&o+Wna9H_;b9^%aqq%[n\Vd(JATf&noPgCIE'L0h^S3q*foBLCAj_8&iX?^n!(8W=m0ChR0?WT)KmC&/o;sg(gA`XUD(DQ+WT@h-LBI9E>-9:@4R"%P_NGUE%d4Y)R>iC,BKihE$ZcQR?Wuf!F6(R+:KfATOMq/tnF1h&dkS'iupEPsrRYq$MiFd+>LT+m)(iEDuG95/:eDAm]p't.H\Bn_\5M9JS*ZTo+[*Ip+T-a(S*oatS9t_O._ZRXn7n%UU*jr"Aqn/9R%JF=I\(9AkVtCM^:@0UcU`C&a_%E-u]lnKWnXId88bPhjnM[Z@*B"Fg_RF*h8Ssb\rpeRWoYLI9NF+G5pr*:%TCdUR0jbcsW(C]_O5HptJbT,NT2sR,qcpqD&Fm>^2l:k;@;X*u,1ea&7A:uI]g5rB.oajq"Vo$6+JqKh#!uAsfg*UciAD0Qc*!pH,m'prm?YZW5>#9)N\tPi2:Lc!=h)[H7&-G=[VjB@l-HE:Q41nle@<r[.hkoQ/Z_U)$\W<BNC8<E5LeGDT`~>endstream
Gat=*gMZ")&:N^lk)jh@lZ%;D*a)*:?*RTKU-;SWZ=)Bc,]k3VmGE+#$Fq\jJc`4:nMt[\GWZ8%*mEL$#iN<*=#UC5^n1[#-G^chhf&I1iR^]$R!'42@#SOLnKd'abd]/CjT'?ac&E+T.,daN`H-qsEMpg,+-?m2W)=?sU^E>skUN8tmSBK=[*_"@&<+YQ\V*Hr%'5(a3!kae*lDK7&B:c#cl:cW2i-UG_O6+e?kF_-Nu&Vj^OgqASMDL:E)4eD0/PGLH_EEF)PK2m]l9@mpjoD3'IfVK%%r$TQq&jss17h!:Yf?\58l[JF9f;,?2sWd2iB"eqe?O;L'cIB"r.qfQ_I2?dmEE^[:,+pR%oJj@fe(l*C;D19J;5YIC<nohm\>OKG(<F(<)=jHfks0j1P4.??r'm3@b[6]\.iKi+?+9r]a+6l"mekB2d>S'AN,AjdESLZI$l,B+c\)P+t3rq&u--Ck]EU:(t@](%.Zd&;pn-X5mj+35Lq;W8iQ27<]Zg_=GLH%\GlQ:5Mo+HYD$iP)@Y,_p@8\)H0Aj0_?-(;`C\'<k!75^!.8t/p)lt:Y+1#)i%i5//,&OPAhG#RlJc"dn(%jk(0.KJh4P$$"m8+C;#tl2"kHjf/C;IO6^T,*SF#oMJ=>gN?^8P:>4+X`,@Q*K^gkKicSqlCM[l.L$SPZ("kQtjQ#V1di7m+G5MtO_U%pps.o[1Mn-\q7BK-m*<)W!"l=ITI["24l/rIER>;X_]JRk@$O]T;&>a52;'^1fZo9CjG`M>e+>:d&'#`i:>sd`p+\N*/,FfC`.G.WYCPtGl2S576Frspqmgh9j)E$"-iqD:c,8#oil<(SW4f5usc9a97a&'B?[9"cRO;c_-2;/=;TM(+AX\X9QK^f~>endstream
endobj
34 0 obj
<<
@@ -269,15 +269,15 @@ xref
0000004477 00000 n
0000004574 00000 n
0000004670 00000 n
0000005635 00000 n
0000006372 00000 n
0000006600 00000 n
0000006828 00000 n
0000010441 00000 n
0000005651 00000 n
0000006388 00000 n
0000006616 00000 n
0000006844 00000 n
0000010457 00000 n
trailer
<<
/ID
[<1627e3f70ce4b1d1228423dc24c605e0><1627e3f70ce4b1d1228423dc24c605e0>]
[<89a96c4eec836ba258bfde0ec50915ad><89a96c4eec836ba258bfde0ec50915ad>]
% ReportLab generated PDF document -- digest (opensource)
/Info 22 0 R
@@ -285,5 +285,5 @@ trailer
/Size 39
>>
startxref
13792
13808
%%EOF

View File

@@ -198,7 +198,7 @@ endobj
endobj
32 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115606+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115606+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184405+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184405+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Android Cast \204 implementation roadmap) /Trapped /False
>>
endobj
@@ -407,7 +407,7 @@ xref
trailer
<<
/ID
[<fc9a6eea06a9e2d4a6457f8f52705b23><fc9a6eea06a9e2d4a6457f8f52705b23>]
[<03d0655aef4f711dd3cf52a5e2c5902a><03d0655aef4f711dd3cf52a5e2c5902a>]
% ReportLab generated PDF document -- digest (opensource)
/Info 32 0 R

View File

@@ -132,7 +132,7 @@ endobj
endobj
21 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115606+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115606+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184405+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184405+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Tickets, Gitea, and alpha smoke delegation) /Trapped /False
>>
endobj
@@ -266,7 +266,7 @@ xref
trailer
<<
/ID
[<2691acc5e8ef1ad05f5101edc8066bb6><2691acc5e8ef1ad05f5101edc8066bb6>]
[<20b0e6cbe00fab788bc216ed6bd7905b><20b0e6cbe00fab788bc216ed6bd7905b>]
% ReportLab generated PDF document -- digest (opensource)
/Info 21 0 R

View File

@@ -112,7 +112,7 @@ endobj
endobj
18 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115607+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115607+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184405+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184405+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (USB-C / HDMI and USB-tether cast \(roadmap D & E\)) /Trapped /False
>>
endobj
@@ -216,7 +216,7 @@ xref
trailer
<<
/ID
[<b5d8df8d7d570acdede8840905e28dc4><b5d8df8d7d570acdede8840905e28dc4>]
[<56adac8059bac4b41af2249b586fc64a><56adac8059bac4b41af2249b586fc64a>]
% ReportLab generated PDF document -- digest (opensource)
/Info 18 0 R

View File

@@ -102,7 +102,7 @@ endobj
endobj
16 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115607+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115607+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184405+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184405+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (VPN / Remote Access demo \204 gap report \(2026-06-13\)) /Trapped /False
>>
endobj
@@ -204,7 +204,7 @@ xref
trailer
<<
/ID
[<b2cd8347e0a4b196bec35dc8a81f419b><b2cd8347e0a4b196bec35dc8a81f419b>]
[<aaf2d994c373d899c5fcb0d61963489b><aaf2d994c373d899c5fcb0d61963489b>]
% ReportLab generated PDF document -- digest (opensource)
/Info 16 0 R

View File

@@ -7,12 +7,10 @@ import sys
from pathlib import Path
_BUILD_DIR = Path(__file__).resolve().parent
if (_BUILD_DIR.parent / "docs").is_dir():
ROOT = _BUILD_DIR.parent
DOCS = ROOT / "docs"
else:
ROOT = _BUILD_DIR.parent
DOCS = ROOT
ROOT = _BUILD_DIR.parent
# Always scan from ROOT so that DRs/, specs/, and root-level .md files are included.
# (The old "docs/" sub-scope logic is intentionally removed — ac-docs IS the docs repo.)
DOCS = ROOT
sys.path.insert(0, str(_BUILD_DIR))
from md_to_pdf import build_pdf_from_markdown # noqa: E402
@@ -24,7 +22,10 @@ SUBTITLE_BY_REL = {
"DRs/20100612_1_scaling.md": "Platform scaling — DR (architecture, bandwidth, GEO policy, task graph)",
"DRs/20260618_repos_reorganizing.md": "Repository & microservice split — frozen DR R1.1",
"specs/20260618_repos_reorganizing.md": "Repository & microservice split — SPEC R1 (normative)",
"DRs/20260626_cluster_monitoring.md": "Infrastructure health monitoring — frozen DR R0",
"specs/20260626_cluster_monitoring.md": "Infrastructure health monitoring — SPEC R0 (normative)",
"20260620_postgres_timescale_db_platform.md": "PostgreSQL, TimescaleDB, platform DB adapters — advisory",
"Installing_MacOS_Sierra_10.12_as_XEN_guest.md": "Installing macOS Sierra 10.12 as a XEN HVM guest (Clover / OpenCore)",
}

View File

@@ -0,0 +1,190 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 9 0 R /F4 10 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 11 0 R /Fit ] /Rect [ 45.68504 762.0394 110.597 773.0394 ] /Subtype /Link /Type /Annot
>>
endobj
5 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 11 0 R /Fit ] /Rect [ 45.68504 751.0394 172.829 762.0394 ] /Subtype /Link /Type /Annot
>>
endobj
6 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 11 0 R /Fit ] /Rect [ 45.68504 740.0394 148.845 751.0394 ] /Subtype /Link /Type /Annot
>>
endobj
7 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 11 0 R /Fit ] /Rect [ 45.68504 729.0394 131.949 740.0394 ] /Subtype /Link /Type /Annot
>>
endobj
8 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 11 0 R /Fit ] /Rect [ 45.68504 718.0394 108.381 729.0394 ] /Subtype /Link /Type /Annot
>>
endobj
9 0 obj
<<
/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
10 0 obj
<<
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
11 0 obj
<<
/Contents 23 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 22 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
12 0 obj
<<
/Annots [ 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R ] /Contents 24 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 22 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0
/Trans <<
>> /Type /Page
>>
endobj
13 0 obj
<<
/Contents 25 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 22 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
14 0 obj
<<
/Outlines 16 0 R /PageMode /UseNone /Pages 22 0 R /Type /Catalog
>>
endobj
15 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260626184405+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184405+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Cursor IDE \204 second laptop / agent handoff) /Trapped /False
>>
endobj
16 0 obj
<<
/Count 5 /First 17 0 R /Last 21 0 R /Type /Outlines
>>
endobj
17 0 obj
<<
/Dest [ 11 0 R /Fit ] /Next 18 0 R /Parent 16 0 R /Title (1. Code \(required\))
>>
endobj
18 0 obj
<<
/Dest [ 11 0 R /Fit ] /Next 19 0 R /Parent 16 0 R /Prev 17 0 R /Title (2. Workspace rules \(recommended\))
>>
endobj
19 0 obj
<<
/Dest [ 11 0 R /Fit ] /Next 20 0 R /Parent 16 0 R /Prev 18 0 R /Title (3. Agent conversation history)
>>
endobj
20 0 obj
<<
/Dest [ 11 0 R /Fit ] /Next 21 0 R /Parent 16 0 R /Prev 19 0 R /Title (4. What is *not* portable)
>>
endobj
21 0 obj
<<
/Dest [ 11 0 R /Fit ] /Parent 16 0 R /Prev 20 0 R /Title (5. Scripted helper)
>>
endobj
22 0 obj
<<
/Count 3 /Kids [ 11 0 R 12 0 R 13 0 R ] /Type /Pages
>>
endobj
23 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 361
>>
stream
Gas2Ea_ClC&;KZF'`ZP`;Kh^s8)jXOM+0R^5X:&A22$ou7e?WD<jO1t'N@BMnpara&CL:2b8Rl"k`-K2&QW:6)I\S5aPJ^:<GFnP)kl5\,GB,uqdQ"IQc^_<b,oV(jG_;?UKqMP-@a2uKK;^rYXoI*-@n8d.3WQPLC0UO8%WP?g^T!_QI93N/=T@f[plsf[cjGf0/n6j'Uu+*Xf`4A&[$+p4sVmJ7/Mns1795%,<3/kbBV.2a;i;^I3J#JUk^ZcUUI.!2<D!qJ"4b2Zc.=ETA0s'Z_tdP2[ts"e^YJr5>]@^o^2^E$HQpnB5nfM=GamBMOa%t5eg]dEl:/u5T2E%rW(g6\2\U8K'X/siGiQ~>endstream
endobj
24 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 544
>>
stream
Gatn#:N)^V(l.SU'Ye.HKBq+n%(g(bH`EA_Tpd;sWYi5T.q!+U<r;SH,c\:2#?4-XY_6B]4RX@Xi-s)Cb\Q-PMTZq?$)A*)J-AJ^ELfjr-Zk:U65IN`&"o.r>UG%%c6"h`$Q2PjR7(<!?n)j^5d6:_Ij_p<La0#b6Q?t1oRpqIrMh]u"*2k4]'7uRdbdT.4o;iuVt^l("CE5>KQtS"#!+Ii9VJ_^>5c)eXY.$u,6WVZ>QTN9LTsXXc#O9*YI#6RE`:T$.7WUDpfokC@K,K&d!+M=>F0K/Bs9*nBC)6&-K6hFERH-%L"U#X8r$PZ\f"[]]7*dM=AX)lMi_A2gTp3gJXrrID9(QpPDW;"58b"Y$&aiFhCmrS7"k=3#<rtF$mjD2aSQe1EF\]#f3bbl>Aohnqp"eCq<_q2rcruT?_tp\Ws``t:iJH;\lk<CPJaGn3g:(S=#Y@QorE!h]"[*?htEo?B:ZJ*<Zu8LS["3'aIK5[84@d<+3`V7RBYoM0DQuf:b"r>DheU$8/)TF9a*-ms5RMX(P`51QN~>endstream
endobj
25 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1882
>>
stream
GatU4BlD`c&H/2-0j$8_j4:S/?1q`)TUVat,#+-.]-q'[TI&;m,)[p"-U"p:m5pPC>F$R*l,H:/8]0NVn]e^T-k,T4Zet`pi6O.MT2VBk`\X8GZ!i"\kMr>`8$oM-*T@R"JIUIT8/uDUj#DFG"6mfA,7][!5R6FtOa.obLP+rgk0Q+o.4l8;;J:kt$@3:2^d3bG4;'>VbS"7qWDX:I)CbckcHbsR%F\=Gb*]sL/Ke>P)Z5<YDk^(+O@iWt>6-**^;_U)5%Vd$JUke6<Y8+")#,(6i[CB"%Srqt>1aW7G)RN'+YAA!-2/3a/4aA.mM[5)iMR.oa)(m1;M,-_3>*mT01/#3S=19B*@3nQE3[7?UrA!F,D0>ls%SI1m3*4&].+R.:K!TCJXMH@GmD[QT3o;0FFO&[VpgP_Qfhls@+<.4$n3.eZ`cb@FeAOGB9SN;3+CAHbIS3S7c5AfDKNaD;/E^me<e@TLkBlL\g+,[NGIFZn89#M`jp.?PHQZ=Eg_J/UL;?=h]!qdLU^OQJ@e/j1)MdiZ%,q$GMip]GRb\Ge3jr00Pc=BNsMN)Kc[W%dpprtQf_56i0tVuP.@omH7]>ph''O9Bjg`h;moaD/7?AJYiVMm%Rq=F=)t-bd>/:=(i]fKYBW5E3XoSjL,&u27VW`EY"VmiBQgb.Fgt(%WFi"Kjbt`'?q\RX-M3.ee[p9"bPihCnr,l'L,2Abcrc_HY]Kuf3g>89cnZT00*SF2$P_BuF/3ds`4L_Q]Bm;>e7UG[0?7-r)HptC6^Mf%c#5&[RL/u1TBd^WA=i0bW*\Ar35SY.>:7g=96\%,i$s(.-pJg?4<A>+8f%);n?2Bb^Xk+mYt?\=/q:^i-jR^NgtWSRh_it8a!T$*ScQ.R^p]&#(d)%M'\7f++3?L+A?Vr3;2?\@`_\,^h!YEpf2W.AUFO;>$I]1>P-3b]+_!-J3D<?`Zqppmd\^%"V[=2jB=[*Hpf8f6Q\;[:+.V"%GoM8U/dQ`dA#;TF;T3/5X"ZgB&kp53a_Tk5:I("%BpOQl-ptHM"KT,!277+'Jr49#.b+8=^D'Ij3a0f"-Vs>,5AQX4V;V5VEiimm[><IV9Agg;+01Rn-'&-gRfQThTspag/!Ta-<n_=-)3j"S7OD2L;l[,)1-'%N3u`&QEVrjoR8cgsGl*dWhS9DdXsnqW21NnF*68CMJ4b<EF*CNb_#JR>_fqJ9q*+Heq>,H!-Co[bfYS\Z4C0(=(IQQ>beLu)Z>flK,;?p)p&f<hO&o2cCUP\;bpL,&q!HJP2m:R%)"ZLb+U/]rC_VIjqgK@5TO\o7>c6DK.K>)T>g79`X7&8\b#.tn6@Jl2Oh]WKE6/)a`5[u';!d-JK86'l9Fk4!e@N.)T\#\KN:F?i^nX8IFUlm>:Krq(*fW(_[O'P(JQp<e+B6]\?pE7eR.eKQD4bG_na#l6Za2O&O9\#=gC)b88'>J'HXWD4<>[i'IM/n516&1>,=k8:/W,/5PbJ3)eLNp$Ag]eP4@oZBO`s3m3=H["jk=7"RnALs;`nIQ((t2R&iZoa5)HT8i*o$gdqfg2Sm=$"aer!WLUNc(*c*a-?CnBfD:GHiofTaG5*+:A7<4DJp>O]Z=)]CujsR+!%d.gbN8#>FD!YE>rtj%;GgdRAbpp_p5CcF#\R*)$,RSG:?&77a.P*V1iD^c@!?u,aSOP-#,$VGDPt:TI_7+YT,!I:s^9-r>=aBi@.VGLONsFZ,%hH)FS)CEB=!.A=e8bh"AZC_l/jtA07uQUoeiII<q@'GUlS]pTp*sX.kf'-V)apR(0FDofGZ]Hm*$lffklNY`.W9,%!CJu=;U:'^FaK:p]OMmd*9BfYE%I's+eG_P$3d9DCeYoXBlEC_"%W@lS/ArH~>endstream
endobj
xref
0 26
0000000000 65535 f
0000000061 00000 n
0000000123 00000 n
0000000230 00000 n
0000000342 00000 n
0000000489 00000 n
0000000636 00000 n
0000000783 00000 n
0000000930 00000 n
0000001077 00000 n
0000001192 00000 n
0000001298 00000 n
0000001504 00000 n
0000001752 00000 n
0000001958 00000 n
0000002045 00000 n
0000002365 00000 n
0000002439 00000 n
0000002541 00000 n
0000002670 00000 n
0000002794 00000 n
0000002914 00000 n
0000003014 00000 n
0000003089 00000 n
0000003541 00000 n
0000004176 00000 n
trailer
<<
/ID
[<24c5032a0c9e3e5ba18591c4ef610879><24c5032a0c9e3e5ba18591c4ef610879>]
% ReportLab generated PDF document -- digest (opensource)
/Info 15 0 R
/Root 14 0 R
/Size 26
>>
startxref
6150
%%EOF

214
docs/FRESH_ENV_CLONE.pdf Normal file
View File

@@ -0,0 +1,214 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 11 0 R /F4 12 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 13 0 R /Fit ] /Rect [ 45.68504 762.0394 146.845 773.0394 ] /Subtype /Link /Type /Annot
>>
endobj
5 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 13 0 R /Fit ] /Rect [ 45.68504 751.0394 99.50104 762.0394 ] /Subtype /Link /Type /Annot
>>
endobj
6 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 13 0 R /Fit ] /Rect [ 45.68504 740.0394 178.621 751.0394 ] /Subtype /Link /Type /Annot
>>
endobj
7 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 13 0 R /Fit ] /Rect [ 45.68504 729.0394 92.82104 740.0394 ] /Subtype /Link /Type /Annot
>>
endobj
8 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 13 0 R /Fit ] /Rect [ 45.68504 718.0394 83.92504 729.0394 ] /Subtype /Link /Type /Annot
>>
endobj
9 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 13 0 R /Fit ] /Rect [ 45.68504 707.0394 108.829 718.0394 ] /Subtype /Link /Type /Annot
>>
endobj
10 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 13 0 R /Fit ] /Rect [ 45.68504 696.0394 103.045 707.0394 ] /Subtype /Link /Type /Annot
>>
endobj
11 0 obj
<<
/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
12 0 obj
<<
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
13 0 obj
<<
/Contents 27 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 26 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
14 0 obj
<<
/Annots [ 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R ] /Contents 28 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 26 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0
/Trans <<
>> /Type /Page
>>
endobj
15 0 obj
<<
/Contents 29 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 26 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
16 0 obj
<<
/Outlines 18 0 R /PageMode /UseNone /Pages 26 0 R /Type /Catalog
>>
endobj
17 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260626184405+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184405+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Fresh developer machine \204 clone guide) /Trapped /False
>>
endobj
18 0 obj
<<
/Count 7 /First 19 0 R /Last 25 0 R /Type /Outlines
>>
endobj
19 0 obj
<<
/Dest [ 13 0 R /Fit ] /Next 20 0 R /Parent 18 0 R /Title (Standard layout \(~/repos/ac\))
>>
endobj
20 0 obj
<<
/Dest [ 13 0 R /Fit ] /Next 21 0 R /Parent 18 0 R /Prev 19 0 R /Title (Stay up to date)
>>
endobj
21 0 obj
<<
/Dest [ 13 0 R /Fit ] /Next 22 0 R /Parent 18 0 R /Prev 20 0 R /Title (One-command bootstrap \(alternative\))
>>
endobj
22 0 obj
<<
/Dest [ 13 0 R /Fit ] /Next 23 0 R /Parent 18 0 R /Prev 21 0 R /Title (What you get)
>>
endobj
23 0 obj
<<
/Dest [ 13 0 R /Fit ] /Next 24 0 R /Parent 18 0 R /Prev 22 0 R /Title (After clone)
>>
endobj
24 0 obj
<<
/Dest [ 13 0 R /Fit ] /Next 25 0 R /Parent 18 0 R /Prev 23 0 R /Title (Lab vs production)
>>
endobj
25 0 obj
<<
/Dest [ 13 0 R /Fit ] /Parent 18 0 R /Prev 24 0 R /Title (Troubleshooting)
>>
endobj
26 0 obj
<<
/Count 3 /Kids [ 13 0 R 14 0 R 15 0 R ] /Type /Pages
>>
endobj
27 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 344
>>
stream
Gas2Ehb1j@&BE]*=*u*fi&-k^Re0TonR5,@i6u()>IV^hF[Q1XPAU;$&NRpdj=[&8(P[g`qmG[>bCI6;YXWj=>I"N5<$?V3pfM6a$89Q=3Ch5V2YP+*;I1:s+B'&uH&r\F>/k`R`AdT3it2'CcsTENXV65M-^NDe&6_cmD7<`Cm68,+nCha,5;oS898C(/%aAUAgZA=DmEQ97&^GB9g)kHUA,N0.0ZfB]-nYnI300=6a[)AZI2n/;#Lh`ooOs"lQe-H3rUlnR4Y3b52m\D<p<2hF)0)IcgWQAoEgGAn)!?NHUAI>3WAsn!01dmYfZ174+^t(ki<^`a3>"RN$,_U:h#~>endstream
endobj
28 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 567
>>
stream
Gatn#?#/1K'Sc)J/)JHk0L_-hAFFCX$+gK1[[QS1:_[,*]\8Mrb:1-XDkHBLZF,7O@K[<G7t0=hS0Kab5M.[Q2=Md,@`?,BZ5m%<6=aj_Ze;N"4%G#;M3EaM&4-pHUnL$9[g>cR&-X1B)H2cKLkqrPKAFlO5M6^);.R(In2#^gShSLO[See@j@25-?$h:l-aGZoql:g*pb@1#5<.U>P//:\kdO=P6J;L+Ho.D3B)[-c<Faa:bVrTJUkIuc;BF4CE!D#<C'6UhVIJFroenaOm?<+'0s5Y"2Ei"aElr.]b+fl?%K;g9\>\W35s"e(@'A>k0T2h1^Ya=[a=F%+P^l5%ES#5h@uJ?qU<?hVo`+/q)GW`IXQfXGC_+8TV;@8@-OC(^ANfp2J:Ai-F+>&C;3o31cdrum89C"25Rd3ss.R1JVR*gZLXilqmH;+Cp%Q(Zl^R2dW=*N%(MM?\1fU<cDt.6%4\C\eT2mq;l9X)=Y4&<tCDp]Rh]!KGK%0V4fTs0h9LQshM",jU.=TEH9&fG0q3R-j&;2@D#!=(AA'*YCcETY(%gTF*K3Ca(~>endstream
endobj
29 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2586
>>
stream
Gb!#^D/\/g')nJ00j*4Rh-MCcHF<?QJSa?&m3-/K[bINAJ:Nr">HQbJP`t7QrUq2QZ7O+\-+PV3E)VPOE&aB>B;cBgn3bY(h#QC-3=OdW+?I_J5YT^]q(5;&(Oo_PN7,(4HXph;32;UN).O?3iA</43A4[G?lf<qjS*N6E?lE:l%cHNn3Jaa6D3fdk$O38h[p9%T@"3t)CJCP9kA)F.U:FV$9aaP&FoGTIORmPc;V3X5]0Dl=aS9PE4F?1I8c9IOLi=gPsoV"_.i+NW[gI1/ZB)ANot>VIf@8]SW5858OnG)($YQi6$bREC1rp[E(Tj<Q15K('6k?n,l6D[ZT&T8r7lW?K88(GP1_'3QgC@=S?3tVcm3&CHckTl?Au22[^EHBPei[#Y,!C^@1[flH5r.d%Pkl$=5Y^)+s`$kJ#"+#oqRV"U1F+d$HA4t_R7_`&!-*H?0+*+?U[Xo#3le!Z!@L[EpGLm0;4=%3-2Q6GY`-O=s;Y?9:AC+][0=:kgME5h*gb5Lpe:IrT,+3.21!uPaHJ7=,TfFXJ!o9m"tNKYGIToVSq5Cn$rc?JgDUh7`@i.iR9Hp_Jd2_E`DjbkIMOA3ugtjG-&$E1K&@N37<]W"Lb'd)+!^6r>]YtN1OHFT,?M&prd[$.FeDJl8Dm&%arM`*m@>&rh@8(jGKDY<L3E-=QT30&..G)4F>0SDC-GQ[s.S1l/QS8s)>.GbD4[i@aI$7-5CWY_&)_T80X.%dU=f"jS%f>mWUc#WereDo"AcjgP)oP:+f5l&1:4?LeEMa\%\Jh#Wa?1Dsja@&G!d7o0T\'qlR-"C76kpoR:RdW`DU9gDkG8/^RLL*h5\Gk+s!"h$8&P3]3^2HQA&W)bhLiUIF0<)]"%;nba]/?A$#AE1IcuA:s#P*+Sb\qYMFkngM@[*!HB.IV/saYg)N!<rsFbh#Ze*dhf:\JP+<b=fa_<WYI;F.m1&Z*FQ?RLZ#QKd\r1li4TMd,0tsS'G`*j82uS`UJN%L)U\a/X@o8*h/`mO8/-3GH]#+>0r@&7%hH5!TY;BQQ[<]r@$h(:@BAO&5#dkC1XU0\RFipeE4G_-JkiH-!i<&S2[6(4l-HU,`dfo5EDFm0S=_\r!CT8YAkAcJm#e:c_uaH0'_YD3O`"8*W5dK@S.V][V2n=pbnf:oHt$8-(X[(r0ZZ5+eJi$J58f;peWHdZ3tnXOfcj(-jbn$,T.eX$n\qE(85b\UmnshHO!)/f\72AHHM?!7^7?tqVk/<4P>.fTF@0,Hbs$pO2"I\i\%#Q&Rc\*^Ar#cticZ.W6+$,8&i"7maBK//&(PA1;V^AK`uA\32mPp]Ou&oS]\u@6*MhP55@ut5QPZP>J[]`Pa_ND;8Nc9-KGP''8aQN<S@3mb!.At7.<D_<nr0,aQRmdQF;qG<_=A.k-`"a%dpMC8NhH=RqgH%[Bss_*/\=7_B90=&X&]@E3D3+OW^RW..Z+?l5##S,/@5^Y"q?S=$q)Hu<9'GX[dS#.hl6L<+]cC=_u3cVs1e@#j[(!PNbK*(IS]ulJVF)K?Vl>Arl(!1ZZJMa51`Df[0']cU7MfpUV[.op(LPJ$55DQ:LK_B9]0SKJYU'brnC4Vd3q]HBK)XNj.1LmD##3;mE[*fAKVI)j0+HP^i2utbQupQ\mC*(2\C54<Toje/>'&DHdoK)ERZT]5J$Im_#cYN6F>ni0R(=5L8d*PU^c6eV7f>JFt:;S*M]i5$biSF0."8-%oleP83M2HnZ@Qr/UY;L]QC0o-'0jZU+YHOWUhFMfT>Xpd7^D6?V4a*`9@i[pau8CX$99r7<]`uUIH<\_gHBJ0<q.GPmI7)1qXdL>Gn)jk\$+Fl!uu)]R#)!31X=3I@NtqT0>iEP$cr'HHQJhO+1U$m7-'?Gcff$kkE`o_fU&Lm;[RKroRtlq=41DIX]m\RWDp'@dEj7N2m]'4'lk<&QeK]]Lk+$]E35ck&fit0"sa/Hmp4<Yjg<T>AVpK<N[:al,dt:e('fN^HklF6ti[E\qAhMVMuLpZ>PVBJtBqTp'ORs@NI,1mR\tC054s5(H-%XBn+a_djYfm9#N!&notkkT&U'P\J"d(K\/$\=8.37?&&2gU\f58pWI]U7V\,4YsA)=8O03Z$l?s2*%,1M,C82_jsEGK<BtW'F[d9#oYEa8$0K9LII1u9<E5+W[b^?C]1G_XZskMNS5knF]R-AhbZ?/*APQ=!."?Kqb8<.74YeqFZ!ia6Zq"qq'D+tFEunbBcbq/f&hg=:9BDt)3=g>^S8L<XZmIrBp+!BXa1(dJHEf]M6#T;sohA\tQN4j"ciKF+B)U$PG'5VtC1$A!MW]#`=UjA-a;K+ZFE)EG=`[Q;bO'!m<IMN05J4[U04/,0<tCck1fkR=<P:%@-YT<B_X!qmf-Ma:^6LkEI:3;lp[3&c@9$WHIgg@(RboEL'7KuML:L[Q+*XM6JT@Pj540mm>spm$hrL";INS>2-.GOJJmWO:r#XLXV7SGQE/A.j:q(FpbBaIIlhY=S926l3Z)QHcA`PdGWac\$fMMN1`.!%$KA<fk03H^Z*0lI:0C+p=&McuIV$7,^W^b)5E:JF8'uJc~>endstream
endobj
xref
0 30
0000000000 65535 f
0000000061 00000 n
0000000124 00000 n
0000000231 00000 n
0000000343 00000 n
0000000490 00000 n
0000000638 00000 n
0000000785 00000 n
0000000933 00000 n
0000001081 00000 n
0000001228 00000 n
0000001376 00000 n
0000001492 00000 n
0000001598 00000 n
0000001804 00000 n
0000002065 00000 n
0000002271 00000 n
0000002358 00000 n
0000002673 00000 n
0000002747 00000 n
0000002859 00000 n
0000002969 00000 n
0000003101 00000 n
0000003208 00000 n
0000003314 00000 n
0000003426 00000 n
0000003523 00000 n
0000003598 00000 n
0000004033 00000 n
0000004691 00000 n
trailer
<<
/ID
[<7c6aeed2bcb6a012d5318200c51d871e><7c6aeed2bcb6a012d5318200c51d871e>]
% ReportLab generated PDF document -- digest (opensource)
/Info 17 0 R
/Root 16 0 R
/Size 30
>>
startxref
7369
%%EOF

View File

@@ -0,0 +1,184 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 8 0 R /F4 9 0 R /F5 10 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 11 0 R /Fit ] /Rect [ 45.68504 762.0394 133.301 773.0394 ] /Subtype /Link /Type /Annot
>>
endobj
5 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 11 0 R /Fit ] /Rect [ 45.68504 751.0394 183.525 762.0394 ] /Subtype /Link /Type /Annot
>>
endobj
6 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 11 0 R /Fit ] /Rect [ 45.68504 740.0394 187.981 751.0394 ] /Subtype /Link /Type /Annot
>>
endobj
7 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 11 0 R /Fit ] /Rect [ 45.68504 729.0394 86.58904 740.0394 ] /Subtype /Link /Type /Annot
>>
endobj
8 0 obj
<<
/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
9 0 obj
<<
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
10 0 obj
<<
/BaseFont /Symbol /Name /F5 /Subtype /Type1 /Type /Font
>>
endobj
11 0 obj
<<
/Contents 22 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 21 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
12 0 obj
<<
/Annots [ 4 0 R 5 0 R 6 0 R 7 0 R ] /Contents 23 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 21 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0
/Trans <<
>> /Type /Page
>>
endobj
13 0 obj
<<
/Contents 24 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 21 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
14 0 obj
<<
/Outlines 16 0 R /PageMode /UseNone /Pages 21 0 R /Type /Catalog
>>
endobj
15 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260626184405+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184405+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Developer help request \204 updated 2026-06-23) /Trapped /False
>>
endobj
16 0 obj
<<
/Count 4 /First 17 0 R /Last 20 0 R /Type /Outlines
>>
endobj
17 0 obj
<<
/Dest [ 11 0 R /Fit ] /Next 18 0 R /Parent 16 0 R /Title (Done / updated by agent)
>>
endobj
18 0 obj
<<
/Dest [ 11 0 R /Fit ] /Next 19 0 R /Parent 16 0 R /Prev 17 0 R /Title (Your verification \(after agent test send\))
>>
endobj
19 0 obj
<<
/Dest [ 11 0 R /Fit ] /Next 20 0 R /Parent 16 0 R /Prev 18 0 R /Title (Still on you \(unchanged from 20260608\))
>>
endobj
20 0 obj
<<
/Dest [ 11 0 R /Fit ] /Parent 16 0 R /Prev 19 0 R /Title (References)
>>
endobj
21 0 obj
<<
/Count 3 /Kids [ 11 0 R 12 0 R 13 0 R ] /Type /Pages
>>
endobj
22 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 351
>>
stream
Gas3092>UD&-q_%IZ".;9c,q?k?a-@4E(k62\TZQW\J=?"oS;,J.IGZPB;sOAq"S7.L5F_GmE+mN5c8A`)j/dK/c.1X*)D%S]6g#<Z-/N8a4siF*X0Q&8a9qf1u,AnlBMCkhiCFPCM;2`%JM1YUqFp8qZ'DC[j$\`tj<^oU-K<<U0+G(+]#k]h=hHSjbbbX7g+o>)3eM<,O,\$Ln5g)T1#R)*Q77+5AU(?as*@42uP0LMO1#3gVqha&-DWK#+s(G%d66c02<ugs7%1ku70jB*G6(B^4;ii<>D;,f/q@AHR4qS8WG>&#`qC`DDa[rm)[deXeb]0+^dB3UGE$`X)DDK'E^YP&HE~>endstream
endobj
23 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 521
>>
stream
Gatn"92FS%'Lqiq(#Q=@_YDhVSBMUC1^b']15h8ETo_;]OP1_q!V,XA2Q75i>uV)4MP^(pkM1h!Or',(H39\&35$Gr6J6l%OeBA*U7D1Qd69<W7@'i,JMBVb>pT=g*t+JeSSAF9ACBNM-<3K$#jWB.PMRu=;/Vbpp'dd@KR$_VG8@nYm9R(Op*V71;?#4QYB_/JBCZFX4lH_CQm%I]F71YT0l0okZn'qHU0=nA&IqD&>n2A^&FaL'gU))<>OSed=&$&1E^@'\6uUmrH#eS)cG.Qg2RZlrep6oj.h/Y1W8*iBe-*O;Ot)Z`b`@ob?Q#5`;E)%h_7J>A1FJ'52Ni79_Z;#O^(4VT<)Shj545&U6op`MR*eUq?L/$=NNDMCr*!?3h;'WbIkP]_];\OtMp2T%V$qRR*h1rmm]"6b%o6jZY0J]igtEP`HGkSr)a8)I5"%Tp8T7[bMX0^u00\JL9L<8FI,$+<[fR<hgL'2hfqd=-b..g.'e*!DAi<_<-1l[,bl.Woi;0#~>endstream
endobj
24 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2062
>>
stream
Gatm<=``:f&:XAWkXUdFP%JgqVg'pk]^%(5V33=.>_<kYZ*'#g[U8a;DiYA>6<n\k,g'eHqO0U^('+ko,l?1&!<+$kH:<?\(f#W!M?1U6kRGjeT94`R0GVbc2$7[8;,"Z5i&TT4K4MrZ.OGQ++I[]7A/lW3:s4;s#-G]cjs&atT"kRJr^%6.-qRTV&?Ad*Q=ajVj.-#:UYrm'4@tfG;NM[L=tkq(H(5Z=GecE`]Pnk(e>ZS1WDgEX'QSGY`7*4sSneRqCd%\EmJhpU-6Lm#U9/f>Rb-b^(#RFiXaB$O]TDsYE-VUYlM3UpRI<j*ZS(\NlKo,O;B@(p7Oe+=P4Aq'\_tLVAloee2Y8.\W^CKL1Gi<;YNA`o7"n&l@8c%Y("eJ#kt[Y4F9+,4g(:5s%b48o'YS!j[KDD(dZ-VhG="FCYu'&464(&m9lppdVB:qsr"UK;hF+)KljTgWMaOpR3J9:Kn26^pnC>d9HqC*I/!;HiBHH5fDP`U.Nk%*+ne`hnFKtnX`o,Kp/QAVT-IH&m%T8TFOrENKE>cs3%C,.0!_HDMQRljU(o3N0W>C8DXX]$@oBt[j?.>'\>`Y#\bE>hPSk3pZ)[39qcV"e->(XdYF0R2hUR.;mAc^HpD1,ga@Ad]uR%71CAq'*#]KPBg,XE=j[bB5S-M0CDrX2gJ6d1\r/)^VhB;rt`.]Y[S<@jdeng9NhROP<`g_G3\C!]/T:\Dg=)h[H0Yh08D$6OF`.:[!=OLe5`"WBD)\"3n4Ie;?[;?cgJX-1]9,:#'mo\gHGI!qqL89d*sl!-66$5Ot.,kcM@mVa9YT"<uUa;\7*deR<9&bG)Aq+nt_L_>u`Fd%]j=]K-'9k0A>Ip[EKbY&>_nUK`%3n7PCPXs"p%/staG)WE`o$X<sSJ_<KK\MHFUiS9Lg@8Y=HYsd4Su;6ZfAO9)X,W@\P.AHIA_hL7]dIkJYdoKcfZnOD9#=:[rkZ@ac4l&fL.S';m!h#_/Fctge6q*_E94t[gX)th[>ielR]]!)bQcgAAHQ#qL:qTD?;&('>M6el\Ui#4Z@T&sK5AUOV$osXq(5-/X$r`:[p9Qd13CLD8QHh"#maZGS;<;V7LK5i0"e1HAdo+U".RGrQ!kt0Z06e@#(%9.8e87</$rH?_a'Y=d%,7PWLdVsb'nns1QX/_nb`Y5*NRjpL]@o83?ko&[lEU.>XK,l:C)tK'L5u]d<dbDAJ`EQ5urg-R`bj)!mbNS>`=/P2pJmE2t@<4/%di)b4W3nm/#be\rYtO1]JFpSKUH=Gs#W[k99@6/b4Fjfr03gJqK&OTB"o:FY.Z9`#dKq.aZ3?pNg-fJju!iKs+eM/boNV(_&)fJ<8cu+lrd1mAN9e&gVllm"X-a#nSC28,6HBhjSkDCf!G/9=KpbMpS$$E/(bWMh#hggnR7tY8FiVdG`Hb64_?lG,K%B3&"F$p;+;6H1X)3pYE^m3H]!PZK18+@H:t5G7iu_RqE>V3E7,#L`F-i^uCnPE,#c)hYp=V%p/&X^Xos[jm>LO$^bZeU2U$/0+K9TWe1Op>,OdTSgZ\B=0?=]mk/L)H[q>hSNMB+Z&"^T5Mc[np\X6m9t_jjK#;ts-/7=6]Pnd;Y+)J03G/tLiF+JR7HkT<%Z"ofK=LQ0p7"oi=#+O8,?ai-nLIXAOa>7/4(00f,A^W4<=bJ_CO]eQfXddB0M*/5ik!=hp6;>giO&#LfbPep,bdEh'>B(n)olq$:D&lqD*FA-Fir8#]>=!rk,/%Xq"@!]1OKf7/Ag3oleqg<afLE?HQnR(lC!J82Q*WVV@bZ'7=c)oA-*iWnG=O5\cLdSOcoe$57+FE@&'b(rm#6\Ros;)=+;(Ve,=gScqVL/oZg4IDeT!)i'c)Bk>O!Xk\df&"u3^<;7)UUVPmXmbO)LM)5o)oN8:@4([^RQFutN"T$Q/-Oj;_PA+dQH=K>mm'oUtFb#Q28q"iXTqu56]\\IGN-WX]XpPBp_])CK)n9Aqsq:P.Yn%\Vn5FZ16[R#^d62e=u#8qRkT`Q66PV<[M&dQ5o`P<Y8an0<3fH0Yo3H4[V`sUpC~>endstream
endobj
xref
0 25
0000000000 65535 f
0000000061 00000 n
0000000133 00000 n
0000000240 00000 n
0000000352 00000 n
0000000499 00000 n
0000000646 00000 n
0000000793 00000 n
0000000941 00000 n
0000001056 00000 n
0000001161 00000 n
0000001239 00000 n
0000001445 00000 n
0000001687 00000 n
0000001893 00000 n
0000001980 00000 n
0000002301 00000 n
0000002375 00000 n
0000002480 00000 n
0000002618 00000 n
0000002753 00000 n
0000002845 00000 n
0000002920 00000 n
0000003362 00000 n
0000003974 00000 n
trailer
<<
/ID
[<1d0920c2e13176b58a30f9e5ce52f751><1d0920c2e13176b58a30f9e5ce52f751>]
% ReportLab generated PDF document -- digest (opensource)
/Info 15 0 R
/Root 14 0 R
/Size 25
>>
startxref
6128
%%EOF

View File

@@ -0,0 +1,275 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 14 0 R /F4 15 0 R /F5 16 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 17 0 R /Fit ] /Rect [ 45.68504 762.0394 135.493 773.0394 ] /Subtype /Link /Type /Annot
>>
endobj
5 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 17 0 R /Fit ] /Rect [ 45.68504 751.0394 105.693 762.0394 ] /Subtype /Link /Type /Annot
>>
endobj
6 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 17 0 R /Fit ] /Rect [ 45.68504 740.0394 95.92504 751.0394 ] /Subtype /Link /Type /Annot
>>
endobj
7 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 17 0 R /Fit ] /Rect [ 45.68504 729.0394 107.909 740.0394 ] /Subtype /Link /Type /Annot
>>
endobj
8 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 17 0 R /Fit ] /Rect [ 45.68504 718.0394 168.405 729.0394 ] /Subtype /Link /Type /Annot
>>
endobj
9 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 17 0 R /Fit ] /Rect [ 45.68504 707.0394 143.925 718.0394 ] /Subtype /Link /Type /Annot
>>
endobj
10 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 17 0 R /Fit ] /Rect [ 45.68504 696.0394 153.269 707.0394 ] /Subtype /Link /Type /Annot
>>
endobj
11 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 17 0 R /Fit ] /Rect [ 45.68504 685.0394 156.389 696.0394 ] /Subtype /Link /Type /Annot
>>
endobj
12 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 17 0 R /Fit ] /Rect [ 45.68504 674.0394 166.173 685.0394 ] /Subtype /Link /Type /Annot
>>
endobj
13 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 17 0 R /Fit ] /Rect [ 45.68504 663.0394 73.25304 674.0394 ] /Subtype /Link /Type /Annot
>>
endobj
14 0 obj
<<
/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
15 0 obj
<<
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
16 0 obj
<<
/BaseFont /Symbol /Name /F5 /Subtype /Type1 /Type /Font
>>
endobj
17 0 obj
<<
/Contents 35 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 34 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
18 0 obj
<<
/Annots [ 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R ] /Contents 36 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 34 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0
/Trans <<
>> /Type /Page
>>
endobj
19 0 obj
<<
/Contents 37 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 34 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
20 0 obj
<<
/Contents 38 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 34 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
21 0 obj
<<
/Outlines 23 0 R /PageMode /UseNone /Pages 34 0 R /Type /Catalog
>>
endobj
22 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260626184405+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184405+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Secrets, tokens, and recovery \(lab cluster + dev\)) /Trapped /False
>>
endobj
23 0 obj
<<
/Count 10 /First 24 0 R /Last 33 0 R /Type /Outlines
>>
endobj
24 0 obj
<<
/Dest [ 17 0 R /Fit ] /Next 25 0 R /Parent 23 0 R /Title (Shared store \(lab cluster\))
>>
endobj
25 0 obj
<<
/Dest [ 17 0 R /Fit ] /Next 26 0 R /Parent 23 0 R /Prev 24 0 R /Title (Recovery priority)
>>
endobj
26 0 obj
<<
/Dest [ 17 0 R /Fit ] /Next 27 0 R /Parent 23 0 R /Prev 25 0 R /Title (Gitea \(cast01\))
>>
endobj
27 0 obj
<<
/Dest [ 17 0 R /Fit ] /Next 28 0 R /Parent 23 0 R /Prev 26 0 R /Title (MariaDB \(cluster\))
>>
endobj
28 0 obj
<<
/Dest [ 17 0 R /Fit ] /Next 29 0 R /Parent 23 0 R /Prev 27 0 R /Title (PHP / issues backend \(config.php\))
>>
endobj
29 0 obj
<<
/Dest [ 17 0 R /Fit ] /Next 30 0 R /Parent 23 0 R /Prev 28 0 R /Title (WireGuard \(remote access\))
>>
endobj
30 0 obj
<<
/Dest [ 17 0 R /Fit ] /Next 31 0 R /Parent 23 0 R /Prev 29 0 R /Title (RSSH \(bastion / reverse SSH\))
>>
endobj
31 0 obj
<<
/Dest [ 17 0 R /Fit ] /Next 32 0 R /Parent 23 0 R /Prev 30 0 R /Title (Git HTTPS read tokens \(future\))
>>
endobj
32 0 obj
<<
/Dest [ 17 0 R /Fit ] /Next 33 0 R /Parent 23 0 R /Prev 31 0 R /Title (Checklist after creating any secret)
>>
endobj
33 0 obj
<<
/Dest [ 17 0 R /Fit ] /Parent 23 0 R /Prev 32 0 R /Title (Related)
>>
endobj
34 0 obj
<<
/Count 4 /Kids [ 17 0 R 18 0 R 19 0 R 20 0 R ] /Type /Pages
>>
endobj
35 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 367
>>
stream
Gas2Eh+@c(&;BTI.F.&+T4oXACpKC2[oZ#'%>%D)FZ0Z]mGbPiI!_'c<a.rrEZd0+o1ar_6La]M)W9>C5@h!OHNkuuE$LT"Gu&ZlWAN^;$O(#KM6'P4>tC0`1=I*h.ro&LaCn^)7e`(!Sp[asE)!Qu?l^hpN!?.%D2lY)hUP.E^?YWBFb+]4k*JBsb8QqTg5YPb0hiJU-WH"be_54,8*r7a?4ZH=mL5H&XTJ<HLqi.p-N-<8"W'2Z<);a7dQ;o<K7k<ZnR@/nfX21R[T`>Oj^;?)amA<dAi;7HG7Wg1Odc+cn/iik86W>GM?RN)Eu<t;G>&Ub7YHBarJl>hlHBgoYQh'u1YXL(b3225JKXain[`d)~>endstream
endobj
36 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 671
>>
stream
Gatn$?#Q2d'Sc)J/'__;$eI9R_sZ)$D(bOE-"tc'8sMc6`!aDLD-H&YpHYHfCNI<AKEM>qT'%*.1(5QPX?@AHJ=@O]D](5=q&3@/@`UdO,Tlq%Yk-(@O<bPt"t:jl;&82=3)"#.,7ss5Z@p@7L_Mt0)7[ok^WBe9N'b6K#!Xn'D[=6c/P?Or%>Cp9Y(FE?r&<[Y)YSA;0(BVO%XrN:1J$7-=\E+<Q.%8Q_)`&"_br([-u0p3]>*VR&ncWLb]R>9[6)7A)='sUG+_?>?h?Dn[)2YIjTB(b9'>Zb^d\#7jbt,82#.)a4\PY2c_`M.#31-64Y0U<e((I\Z.7QEaC0GZj?l@C5!P%UGI;INK[Y8e1oR.qhKSK\ZFIA7/f%Ab=CNV9Xft5h@m[j5I,7F@NI&er9_3Y?5R4]K?u_/g\uk9p45EIto"JX(>@$Sfirc5;VA0G[$DuO-WfH!phM)M($0uNq-rnWp%SS$:,UmMrQRB^+8^A&H8l1g"$sm;u8.fjiMEnUR[!C#7Y-rM-rWnG(BKjNS&"gRr+6Jd7[i^h00=&WCF"Wr:[IG_@[I`luh%!*^ZgfV0)Z>>7K<S>VI!mtV(N9de?E"R,?#6Y7jA";q`f/"B?=-L^0?q[2ErNuT<K)_Z@4<f/(ITsC[Y5/NAj?9M"+t5T;m#o~>endstream
endobj
37 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3504
>>
stream
Gb!#^CN%t;')eD/1#LRL`d1H7X2W%Hg.g"3gGJ6kDGb3cL*G*')HkK'jgb<aG=XkJlX<@[(Usb)5Tr-5B/i"dAuL<55H=M9>lhU-JUF/C8mo(1<L7fpI=h(Daa[+9XJ]r,k/:)<YcN\WBXWr]YSd\GKe-5Vfa>`VUmQmf+uZ)DP/0T/(Bc'i[N^1[#8g1e5(3#0B&CSOU2^=*7iK`e)T+I<K,[`:U#82s0X_;J`@7>5>X8uddGP_U)#h1YL*sPqKhP/ua!df;p'*/N07`,G!df#u\cCWu#F:#tX\R&+d4M"U&m3N%&%>gA!a"B:&[',r!oQCbARali2/WK)2qiMuA%5:l@84]RT;9+?Q1kO_1au6[>8=)W"VR!!N.71:G+7neliHNDHp=dKAdOIc?F<OEEdObiR(?Ii=&LA51Gk1MgJk6\8<uPX?,^MQ!^9<:/%-au&ei8u=Ia@+)J/K3XNtETl@Oph]1>8[%b9Ii+Ob-FZmSr,O-#:u%`oFjS:Dp22lW?c%;[?@9<RW0_[p^P6@d>$O"NPe[OPQ?d)_M^+!LAWkW4P:#-G0g`KjJ/[>p>s'u5Hgr4=/a4J$mg]9Y"Ka,G=i7WdVn%2."WR?[V?\eSgP=rkLUr?@H?Esp#/Vd:l0D^B$;Tu_qS>H*s%haVm:GJl30qk\dtl\jMFXi65D3P@uS.HG@[jU/'Saj-HiZC,Wq<>R8MI2iIj(7lNgYF5RMY(:!i[1T0IV1_E"MaW3\DB&8;@S`W?=])>#87L<@220b+Zg/1PoQD8+e4'^Y5E*%TN5JZOR[%__oS9c1Hs.,'$;8_>+UmqBp42EcD5^bn]nAEP;_2p-P&*SC"sE<sdH2_FZP1NrG:u2M.:p6ZENXlJkU#?Xm[oX-YXD@#NL'%Is&j9Eg#rGS5`E4fJGX3OZFRqP0-?)m8F3T:pn1]]EfMp"b)9cj!X8,X@@J(&-Co5E/66(2hT]6*:KW;maI\..p\lqc`&'?r]h_SY@[+_m18IX>id]!uhbU$SZ#i?elL4!!#r9Cm_)57To]Dc0gkmGTgn=$4=XeJEF_MG@>c#r%?[2bEO\u:1jUK9t8e(Q\2^#XZ2;hQiTGh!KJ%gZsA%)Y:0iMlWp>R<8s.bQ*RbC08/60JVEsFI_8CjJL@SXX=,nd@]8bc""0%MXf)ee/eZT3$b.TN>s=']h]inY?)Q%!q\OI4LQ+U;WkDM"+YZF<Z)XPg?5EDI*%*\LC=.M@(>CVr'b1snanV^]16654cTlm:C-ZVArd0SB&$9%C'$`,nR\,T!kUB['@TN;?2[Y2a0@V=<h3e_tW3G^aerh2#=+SJL/tEahKO1eeg[OPC1j+?+un##"Dnc/T0Z=9**R>C-'q8#(Aa>ebS;qH1d9O$BP<VQWd?OHt]jpQ#,M;jk-UiVfZ)4Kn"`E:4aQ.hu#+@o5?LXDG"qXd8&I>4(4cS;(as</s13>"pM0,/,"EojW6XG0o6`_Y!Qq_qhA^L133(ipbW2h"?@ro(0ZPfSe*l`>,!Lj+9X,pB?Vd)<)c_j$&qg/BQJsY:bGEH2BjV9sOLH^G*6O?X56XeJ\7QS[#B#*>,&Mjd94QRcJ5F0)..\N:"O,pHl`$EJ.O282MNYMKt0Al$gW_E3M?:@T$dkU/l!ORIL+5^8j6Z?\2V/`T?T5pP,ds3d[78[9Xlp"JA:H/*e"pcgE[l$LXZ&4J3p3q^i*NGg)WZ*ce*ja$h*Fjc1b/0*d<=fdEc'\(&`P.<;-9k"*<PUft35KJ6_"WeC$EYmW<]gl+-Q;'^F<=&MkgO?BBW40D3o90"jdW(Ah)q4EPL3>m%GRGgkr\A:P?nMk\M0/>5&Sgc.j+j84c*,%5P;*(5EVV/$9g%k::m*g@Ujl?/Z/c,GEl`Aj6NLm0J`,J\KOgbHXAB>e9-DU2ASAKmS1te9)K6;KDopgpne+`%sbH'=lg&1f8l\hgeJ#RBHQkTR^TF@o>U$S^XL:l?9EVbIJhB?W3cJ%KV:TQT&A2<m(*OB\*A9NW"4$a-lV&'!O)m$_lc.W>(g0TDt2\9GrVh@iGI,n567R"D`8Z$3;Xn4n\1eGqQ%-C=Ric)g!S*ERj9Tk4FO_)gXV5<bCLD7`=r+_@V'ZZoVi/D0+>j+7l'7P+K=iQ&8j+oa-Xp%?Zplhj/P,>(dYf7.kd[Rne5R-o7M*2(S-uu9C'a.5WV<L$CPX.?%P\)jskt:SlP;?3#fVOd"l$[S@qg%jfY.APniGr9tTu^amR%Hg0^eVG_.Lo__9c<h\ORq(]T>&;C*$+A6lG_L2.Vm/s%8KSm&I#h-JkNAt>l50qNHb!le/aah)\0b,Ck&\A1I(F3$7p:kBEHI?Gm&mgN0?PiWQ\hoE6$>o[g9lEBC.W0WBV@@HRUt-oE3"*?S`I``8F'a"u^gp$f$ACZ3*mF%m3kZ+;AED[3D<AnrgRu\)ICmD99j[$qA)_dc)\G[i"p*dZq^bQmemlH\?/,/'AXJIcr?&g#+WJRcK`e_Yg/4AP()ZNe7*/>t)jN&;<Mh9:V$03f>No!D>(X8M?kb[OG>tC$,iAe;Fe=On.YP%ERH^``#>hh*cla4^4APRAB%$.S*qskYPDk[ld$?8FuD`%EMIVDRbQj7Mhf5<jSGAgRHFlBoSYWPd@L5l,r,A#"jj::e`:#2s(6,'3RO&LQ%V,$_i`G%Q`6r53ZYq`\Hi>L!L%34pCL?M#U$#PKg^iH*GrUE#lR@9'ZK:TFV2+*piNs$r-E<K0\-D[8NfHC'<Q#<Pc@P3Cbt9:u-@8E@d_HoeG@nP$hL'q3XQ;75nlZR=1Hp?b`4^]9urQ\Xn:5s&LZL`fO:!8tkq6a:"R[hco"\))03Xo!nKI6@\4MpBl!<U`X[prL0Fl,R/1<13=I@A\;W.c31R"[#+j"Rg1,pF^e"Tfbg]2?goki8KX4(]@U7.^8/:R\mR+6I.kp\iNDVM[Al)5[bA-Qg7uE(;/MJI>b![crI`kNZQ!51ni9'&k($Yr9l!U1i/d8?0*486&[Q]g$]hNIF@1"b=Sh"=/Uujun=7^c`f1_?r0?0J7UgT_KI&%i/Zq+b93\9h,!B^+(qO$q(e@>DAKIGD>(umVUr[KJ#j!X,bY!24Xeg,kX^N5I%r"Ms4h35bA&J:Y6M]S\DoJJG\b_>.0J_g_f,pE!Glf`:[CcE3j8T4^^0]*'c_l8a:Zno#0^@J>SW),jD"1tHf.2!0H0Qr9@dCiUk_Ae3F=.6l<O\&u<OQ,h84c)RJ#U?N2='8Ui/>:jMnfST[1.UJ2(d@Frs=/()u9%IQ#2.1#:lasI.K%QE;Q_c<($r"GjKXC(!#q8.MM\GdUV[L'hdd]HA[0rUo,IBDrYj^_tqJk.%@47c&sAI9L@J!rg'?km=VsrDdaBjK<Y&E,Go6G`J]H:ERWO_o]\]b-mZ=H\1Ii*,Mj]&<_aPKTt=W>T[AjcHhh.^>r%4I'J*+eF;5)`<.F@E5_qn3B/i`9Q(_?D3^KhoL1I7J7-JK`+i*;g$\=NA!PF0MMZ~>endstream
endobj
38 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1625
>>
stream
Gatm;hcK)&&:XAWQq-cg65*O#]MF@&lQ1OpL%T$1_l7L7?;&aaK!,.P:>,cWJ=pONe_8:ooAuGp1FWJ80:MnM('#.\BFQ@d#3-RtS(KF/!H3AVcNu0dD234<a0L8;:98Wj`c5\3JTO$kV(c3U@qK[q_"-YkDRCU6L;q,EoFiR2-XZ+/-I@?<]S]Ah_"X&A;],OhnX0^\$a3:gNf*q;".[b2A7E*NmBhGO],cgA5e+_C2T7p/#nD"n6LGIU=U1D&NM0a'L/XPAFD5rC\WD2")s[0<&GdH:(Z0](P&nluk>\c>U2_k=<k'@A,K\/K]Ukd3`]('.=R;lF[2J42SaXcadLsBc49Z?R<=;Zpa/EYNMO8`YA6Ot?;/0VoQ%g+FXq!+''kD[ZDB[(V^daAWA@O,1Veut1_V@t&*gX"P&WI5.PcrMa')G`:pEN4W4o[p\D*Zd'&X8X-`Bn*a>fW-*c*KI6,qe-^C(?uB\#9V=.+P>_+WJmN_bNo_U?6S0R&3,$;Q3%i:O_dWP40,SfN4orO!Bc,/V:1O*\"KbgaVMR$)NUCU'*)%@)<b96is5i7ffR!T,Bk#WAg74>2ULtqtl&VN8"hrqYfC<KK/J0W_JCGM86#+7_-@8^:-;=[PiRLO588m@B177Bk>)XM?/3-#-:];"$RG(`ju>U-IVaaN:a0:K2%,o0&`=@PD\0+Q:k?E:_tF@KLqo(\JP.\XYl68(;6>-[S1)Z9@?MJ7OEJLa&s`*&Go6R1&eu4MY_4:n8@^8hR(o'H_]!\qK@*N(7T10(<XXVrqX(EhTb_)DgZt_[lp2H<GR9oLY2"m7!3a$AcH5?]o"ZE*05k"XPJ=2=s=QUGg2P#R>F^3eg@icP4$WJLN>;j/<#<is*PP@Na;l?PAn.f[Y,,oc]N*WZ;meEo/cAuNEDWOBp),kU/5[f.nt#s=G`'r^14boDYMY=@\N)fWtdR>8XRUJm%a?[oS!?5.23O*?*]IW6KGgGrIFl)G)nU^.k7d76s>.h92Lp?-8\a?m'9,)`r@T%n!=E!Y8t?UQi:4m06)[2nRicHKYXhY--s()hFjAo!BT$hTtB=EU#<.g-BrTH$iYle(^_M@\l95/Ln,[Z@n$%)\t8gk,FX2SB6`-n)5*c4jd8@WPPBQH\g=)P5"5DqOKVk#S:ZRXFb`*J"s](B&s"&P&SWi6alsD:FBl;<WEnfD:pqsj2,e]3!uaVmH)+8i!?_R-@I645A1C\lUmX($dq^4qa(u3?]9PL-)r:0<5G'cFIXk$O#I3cn38YLEKeg`36'InL\O[i%,1L1M%)NMS5PTRFhOWg8ntTKHnrJr!(C^L/8pD$_S+$pF?c*mHR]ILCqRn.`+)*b;"En%YNq"\^"qTSSkL@+jSG$mhmlYE!`V'UIiL;Bp>,M(F%JC&e(9]:b>Au4.8+5ShkWMU0hY>FU)NLfb.$aEY#eS81S:%@Se]NFb1ddDFo"Clo74X1\W8YrUbtIi6#Hr>slg6Z!jKPhH%hte"JF7T(9BP!URDn[ZB(72eoU>S>CbFdI'T8j'eFVfRQ>cYn)[H9D/2j\OgcgE*DH"\>:qpp4%J'nrpfMta<gMgR3MA'S^GCX)Pe-\U)E('l5K&,:rr=$rr<W~>endstream
endobj
xref
0 39
0000000000 65535 f
0000000061 00000 n
0000000135 00000 n
0000000242 00000 n
0000000354 00000 n
0000000501 00000 n
0000000648 00000 n
0000000796 00000 n
0000000943 00000 n
0000001090 00000 n
0000001237 00000 n
0000001385 00000 n
0000001533 00000 n
0000001681 00000 n
0000001830 00000 n
0000001946 00000 n
0000002052 00000 n
0000002130 00000 n
0000002336 00000 n
0000002618 00000 n
0000002824 00000 n
0000003030 00000 n
0000003117 00000 n
0000003443 00000 n
0000003518 00000 n
0000003628 00000 n
0000003740 00000 n
0000003851 00000 n
0000003965 00000 n
0000004095 00000 n
0000004217 00000 n
0000004342 00000 n
0000004469 00000 n
0000004599 00000 n
0000004688 00000 n
0000004770 00000 n
0000005228 00000 n
0000005990 00000 n
0000009586 00000 n
trailer
<<
/ID
[<aa67d45e33efa2f9924363b6a9c52296><aa67d45e33efa2f9924363b6a9c52296>]
% ReportLab generated PDF document -- digest (opensource)
/Info 22 0 R
/Root 21 0 R
/Size 39
>>
startxref
11303
%%EOF

View File

@@ -1,7 +1,8 @@
Infrastructure health monitoring draft
milestone: R0-pre
severity: high
state: draft (annotated see [AGENT NOTE] blocks; please review before DR/SPEC conversion)
state: closed — DR/SPEC generated; see DRs/20260626_cluster_monitoring.md + specs/20260626_cluster_monitoring.md
Track B (orchestration) → drafts/20260626_cluster_orchestration.txt
author: Anton Afanasyeu
date: 2026-06-26
related to: 20260618_repos_reorganizing*, microservice split, clustered CI/CD
@@ -28,95 +29,29 @@ sometimes it may be very complex, for example
|-------------------[ VM A master db node ]----X----
|---------[ VM B replica db node ]---|
with such a floating architecture, especially if we gonna use on-demand cluster scaling, there's very hard to perform manual watch of each service or node. even though, good to have a kind of smart hypervisor over all our microservices and cluster nodes that will make a decision what to do next in case, for example:
- the microservice X experiences high CPU load, needs to ask CPU load balancer to allocate quickly another node Y and redirect a part of microservice's X requests to new node Y
- the microservice X stays untouched for a last Y hours and the cluster's overall load is less than 75% during this time - hypervisor makes a decision to stop redundant instance, simply to save money
- the network pressure is superbly high - investigate why, if there's hackers DDoS attack - perform set of actions for DDoS protection, if there's simply spike because a lots of users(customers) - do actions to increase cluster size and bandwidth, etc.
- the data storage Y flied away because of HW damage - allocate the replica of storage Y and put it instead of broken one to the cluster
etc.
[AGENT NOTE — auto-remediation scope:
Everything above (auto-scale, auto-DDoS-protect, auto-failover storage) is NOT monitoring — it is
automated orchestration / cluster self-healing. These are valuable long-term goals but they are an
entirely separate and much larger engineering track (think: Kubernetes operators, custom controllers,
Ansible event-driven, or a home-grown orchestration plane). Mixing them into the monitoring spec
risks scope-creep and may block the R0 delivery.
SUGGESTION: Split into two tracks explicitly in the SPEC:
Track A (this SPEC, R0): passive monitoring + alerting — observe, record, notify
Track B (future, R1+): active remediation — orchestration reacts to monitoring events
The DR should decide whether "smart hypervisor" is a Track B placeholder or in-scope for R0.
My recommendation: Track B placeholder — list the scenarios as "desired future automation" but
do not design them in the monitoring SPEC.]
[Anton's answer: agree with suggestion. please help me to organize Track B as a separate draft document as you see it; make sure it would be referenced in Track A like a next-gen step of supervising over the infra, clean up everything from exactly this draft that refers to Track B, so we'll expect Track B will not be forgotten]
[TRACK B — auto-remediation and auto-scaling scenarios moved to drafts/20260626_cluster_orchestration.txt]
Basically, the most important set of monitored events may be:
- hardware health monitoring
-- node / microservice availability
-- ... TBD
[AGENT NOTE — hardware monitoring gaps worth filling in TBD:
Standard items for Xen/KVM VM nodes (project already runs XEN HVM/paravirt):
-- CPU: utilization %, steal time (critical for Xen — if hypervisor steals CPU, steal > 10% is a red flag)
-- RAM: used / available / swap usage
-- Disk: utilization %, IOPS, write latency (key for MariaDB nodes), disk SMART via smartmontools
-- NIC: ingress/egress bytes/sec, packet drops, errors
-- Load average (1m/5m/15m)
-- Xen-specific: dom0 balloon driver state, vcpu credit scheduler stats
Suggest confirming which of these you want in SPEC §3 (requirements table).]
[Anton's answer: you have clearer vision on that rather than me, i'm not a devops, please help to reconstruct/organize the doc that way, i can just confirm that again your suggestion is more structured; i would say it's better to keep an eye over all of the metrics, but up to you there]
-- CPU: utilization %, steal time (Xen-critical), load average 1m/5m/15m
-- RAM: used / available / swap usage
-- Disk: utilization %, IOPS, write latency, SMART health
-- NIC: ingress/egress bytes/sec, packet drops, errors
-- Xen guest: vcpu steal, balloon driver state
- software health monitoring
-- node / microservice availability
-- the reason
--- scale needed
--- unsuccessful configuration
--- software not getting up
--- out of resources
-- ... TBD
[AGENT NOTE — software monitoring gaps worth filling:
Standard per-service items:
-- HTTP health endpoint response time + status code (blackbox probe, e.g. /health or /ping)
-- Process presence check (is nginx/php-fpm/mariadb PID alive?)
-- Log error rate (ERROR/CRITICAL lines per minute from syslog/journald)
-- MariaDB: replication lag (seconds_behind_master), connection count, slow query count
-- nginx: 5xx rate, upstream connection errors
-- php-fpm: queue depth, worker saturation
These map naturally to exporters (see tool section note below).]
[Anton's answer: agreed]
-- node / microservice availability (process presence + HTTP health probe)
-- HTTP response time and status code per service endpoint
-- log error rate (ERROR/CRITICAL lines per minute, syslog/journald)
-- MariaDB: replication lag (seconds_behind_master), connection count, slow query count
-- nginx: 5xx rate, upstream connection errors
-- php-fpm: queue depth, worker saturation
-- cause classification: scale needed / bad config / process crash / OOM
- provider's fault
-- hardware or software
-- service absense
-- payment expired
-- ... TBD
[AGENT NOTE — provider fault detection:
This category requires EXTERNAL monitoring — probes from outside your network to verify
that apps.f0xx.org is reachable from the public internet. Internal monitoring is blind to:
- Anton's router/uplink going down
- XEN host hardware failure (the VM's own monitoring dies with it)
- BGP/routing issues upstream
Options for external check:
a) UptimeRobot / Freshping / BetterUptime free tier (simple HTTP check from cloud)
b) Self-hosted Uptime Kuma on a VPS outside this network (cheapest independent probe)
c) Blackbox Exporter + Prometheus alerting IF the Prometheus instance is outside the cluster
"Payment expired" can't really be auto-detected; it's an ops reminder / calendar alert.
Suggest clarifying in SPEC: external uptime check is REQUIRED for provider-fault detection,
and it must live OUTSIDE the monitored cluster.]
[Anton's answer: unfortunately there are some sw limits that may probably being a soft-blockers, for example (using current architecture):
- we cannot deeply change the set of software on the router
- we cannot change the software on FE side as well
- we can rely and fully operate only with cluster/nodes
future, renting the true cloud infrastructure, AWS, GClouds, Azure, etc.:
- also some risks/limitations on changing top-level software because owned by cloud provider
- but probably it's a kind of 'hackable', don't know - newer rented foreign cloud infra before
think about it
]
- ... TBD
-- Xen host / uplink availability detected via external probe (UptimeRobot, no install)
-- internal: cast04 blackbox_exporter checks FE endpoint from inside cluster
-- software/service absence, payment expiry: ops calendar + manual review (not auto-detectable)
a simple example, using the current lab infrastructure:
[global net x.x.x.x] <-> [(134.17.26.161 external IP) router (debian-based] (internal IP 10.7.6.228) ] <-> [(10.7.0.10 intra network 1) FE (intra network 2: 10.7.0.0/8)] [intra network 3: ...]
@@ -127,178 +62,60 @@ the owner of top-level services is Anton Afanasyeu. top level services include:
- basic on-demand OS installation, on-demand VM snapshots
----------- all up is SaaS, for all the questions contact owner ---------
-- cluster of VM's, XEN-based (hvm or paravirt, depends)
-- cluster of VM's, XEN-based (paravirt, Alpine latest LTS)
-- VM's control, VM's internal software installation, access, aggregation, fine tunings, software development, ssh, internal setups, etc.
----------- the last few lines are totally controllable by developer, developed product owner and projects workers as decided by product owner ---------
the VM delegated cluster owner must set its own monitoring software where it needs to be placed and monitor all the parameters he decided to keep an eye on, like:
1) hardware resources load, per cluster node and overall in-cluster, comparing the max. values delegated by Anton Afanasyeu according to payment fee for the cluster; like Anton guarantees that CPU will be real (not emulated) and it will be Intel 8 cores of Gold 5218 CPU @ 2.30GHz series, 8Gb of RAM per node, 32Gb of non-shared disk space per node, 3 nodes in cluster, 200Mbit in/out internet, etc; the project owner should have monitoring based of the extremum of each of parameters, compare with proposed plan, alert of some of values differ than what Anton guaranteed
2) project owner took 3 nodes / cluster; after month of heavy load one of the nodes show instabilities and slow data writes using distributed among the nodes MariaDb; MariaDb monitoring show exactly that Node B contains the replica of master db node and it's possible that there's a hardware fault (disk writes), so he should notify Anton to take it into account and provide spare node
3) slow egress/ingress -> delegate to Anton
4) one of project services or its relatives aren't responding well - there should be per-service self monitoring and should raise an alert if so
[AGENT NOTE — monitoring placement (unanswered design question):
The draft does not address where the monitoring stack itself lives. This is a key SPEC decision:
Option A: Dedicated monitoring VM (4th node, outside the 3-node cluster)
+ monitoring survives a cluster node failure
- costs an extra VM
Option B: On one of the 3 existing cluster nodes (e.g. the "ops" node)
- if that node fails, monitoring goes dark — worst case: you're blind exactly when you need it
+ no extra cost
Option C: On Anton's infra (outside delegated cluster entirely)
+ most resilient for node-level failure detection
- requires coordination with Anton; may not be acceptable for project-owner autonomy
Option D: Lightweight agents on each node, reporting to a cloud-hosted aggregator (e.g. Grafana Cloud
free tier, or any external SaaS)
+ zero infra overhead; survives full cluster outage
- data leaves your network
SUGGESTION: Decide and lock in SPEC §2 (topology). My recommendation: Option A or D depending
on budget constraints. Option B is acceptable for lab/pre-alpha only.]
[Anton's answer:
Option A: currently doable, having full control over hypervised VMs; dedicated machine isn't something that can block us
Option B: likely the chosed one for now, once we on Anton's provided resources but a bit limited on their capacity; thinking about A and B what to choose
Option C: good, but no. prefer to keep everything together until going to real clouds
Option D: good about lightweight agents, but don't want to track the data somewhere outside; prefer to keep everything single-hosted
MONITORING PLACEMENT DECISION: Option A — cast04 (dedicated 4th Alpine VM, monitoring-only node).
Monitoring stack lives on cast04, isolated from the 3 workload nodes cast01/cast02/cast03.
Router and FE are config-only (no new software); monitoring uses cluster-internal network only.
Now i think option A is the best from robust and future knowledge, although, probably, the hardest in implementation. if another Alpine instance (cast04 as 4th node) will take care of monitoring, I'm fine with option A
]
The how:
the actor (any of) may be triggered on faulty node, cluster, service, ..., state, first off, by email. any other services are also likely to have (messengers, SMS, etc.), but anyway we should integrate some monitoring visualizer(s):
1) Visualization of the whole infrastructure
2) Visualization per cluster and per Node health
3) Visualization per service provided by distro used inside the each Node
4) Visualization per service of project's software inside the each Node
based on the requirements, a few almost-ready solutions touch the souls:
1. Grafana (Kibana)
[AGENT NOTE — Grafana ≠ Kibana — FACTUAL CORRECTION:
These are two completely different products from different companies and stacks:
- Grafana (grafana.com): standalone visualization layer; plugs into Prometheus, InfluxDB,
Loki, TimescaleDB/PostgreSQL, etc. Self-hosted or Grafana Cloud.
- Kibana: the "K" in the ELK stack (Elasticsearch + Logstash + Kibana). Primarily a log
analysis/search UI over Elasticsearch indices. NOT typically used for infra metrics.
The project already has a Grafana pivot analysis doc: GRAFANA_vs_others_graphvis_pivot.md.
They should be listed and evaluated separately. My suggestion: drop Kibana from this section
(ELK is heavy and log-centric, not the primary choice for VM metrics), or add it as a separate
option specifically for centralized log aggregation (not metrics dashboards).]
[Anton's answer: ok, let's exclude Kibana at all from our goals/perspectives]
1.1 Pros: the most beautiful and user-friendly; pretty easy to play with pre-stored parameters, building customized graphics; may be self-hosted; may reflect anything you want, but the administrator's eye is required on it, at least on the first steps
1.2 Cons: requires additional software, like Prometheus (the most commonly used) or maybe other time-series based engine; so flexible that it is sometimes unbelievably hard to create pre-stored parameters set to visualize it later; requires also additional data converters/plugins, Prometheus-friendly
[AGENT NOTE — Prometheus deserves its own section:
Prometheus is the core of the recommended stack for VM cluster monitoring and should be called
out explicitly, not just as a "Grafana requirement". The stack is:
Prometheus (time-series DB + scraper) + node_exporter (per VM hardware metrics)
+ blackbox_exporter (HTTP/TCP service probes) + Alertmanager (routing alerts to email/Slack/etc.)
+ Grafana (dashboards on top)
Each component is independently useful and has a clear role. Ready-made "community dashboards"
exist in Grafana for node_exporter (dashboard ID 1860 — "Node Exporter Full") and MariaDB.
Also worth mentioning: VictoriaMetrics as a drop-in Prometheus-compatible TSDB — uses 5-10x
less RAM/disk, easier to run on a small cluster, retains data longer by default. If the cluster
nodes are small (8GB RAM per node), VictoriaMetrics may be preferable to Prometheus itself.
Relationship to existing project TimescaleDB platform: Prometheus/VictoriaMetrics is for INFRA
metrics (CPU/RAM/disk/latency). TimescaleDB is proposed for APPLICATION/BUSINESS metrics
(crash rates, session counts, graph analytics). These can coexist — different stores, different
retention, different queries. Grafana queries both. Clarify this split in the SPEC.]
[Anton's answer: good to know,i just want you again to re-read the soft limitations i've described above; pressure is that we cannot somehow install new software neither on router nor on FE unfortunately; if there's no need, then just OK; if need is not intended as mandatory - also ok, we just lose some of metrics, which is currently fine)
2. Zabbix
2.1 Pros: good UI/UX, pretty easy to deploy; good support, good abilities;
2.2 Cons: not as good as Grafana+... from the UI/UX perspective
2.3 Need to check the licensing
[AGENT NOTE — Zabbix licensing:
Zabbix Community Edition is GPL v2 licensed — free for any use. No commercial license needed
for self-hosted monitoring of your own infrastructure. The Zabbix Agent on monitored nodes is
also LGPL. This concern is resolved; not a blocker.
Zabbix is a "batteries included" solution — agent + server + DB + UI in one package, which is
its main practical advantage over Prometheus+Grafana. Easier initial setup, built-in alerting,
no separate Alertmanager. Downside: more opinionated, harder to integrate with custom app metrics
vs Prometheus's pull model.]
3. Nagios
3.1 Pros: the most probably known and loved by many administrators, can capture any data, lightweight;
3.2 Cons: i don't know nothing about data visualization, may be Nagios is just data collector and visualization being made by for example Grafana? disadvantage also in that this is very complex solution, hard to tune, hard to maintain
[AGENT NOTE — Nagios clarification:
Nagios Core does have its own built-in web UI (CGI-based, classic green/red status board), but it
is very basic — good for status/alerting, poor for time-series graphs.
Nagios is NOT a time-series data collector — it is a status/alert engine (checks return OK/WARNING/
CRITICAL states). For historical graphs, Nagios is typically paired with PNP4Nagios or Graphite, NOT
Prometheus/Grafana directly (though adapters exist).
Modern consensus: Nagios has been largely superseded by Prometheus+Alertmanager for metrics-based
monitoring. Nagios Core is still used for pure availability checks (is the host/port up?) but the
ecosystem has moved on. Suggest downgrading this option to "legacy/not recommended for new setups".
Nagios XI (commercial) is polished but not free.
If lightweight availability-only checks are needed, Uptime Kuma is a modern self-hosted alternative
to Nagios with a much better UI and zero configuration overhead.]
4. ... TBD, any suggestions
[AGENT NOTE — additional options worth considering:
4. Prometheus + Grafana (recommended for this cluster, see notes above)
- node_exporter: CPU/RAM/disk/NIC per VM
- blackbox_exporter: HTTP/TCP service health probes
- mysqld_exporter: MariaDB replication lag, slow queries, connections
- Alertmanager: route alerts to email + Telegram/Slack
- Grafana: dashboards (community templates available for all the above)
- VictoriaMetrics (optional): replace Prometheus TSDB for lower resource use on 8GB nodes
5. Netdata (https://netdata.cloud)
- Installs as a single agent per node (apt/apk/bash one-liner)
- Gives real-time per-node dashboard out of the box — zero configuration for hardware metrics
- Can stream to a central Netdata parent node
- Netdata Cloud (free tier) aggregates cross-node view without self-hosting a central stack
- Useful for quick bootstrapping before a full Prometheus stack is deployed
- License: GPL v3
6. Uptime Kuma (https://github.com/louislam/uptime-kuma)
- Lightweight self-hosted service uptime monitor (HTTP/TCP/DNS/ping checks)
- Very easy to deploy (Docker single container)
- Covers "is service X responding?" with beautiful status page
- Good complement to Prometheus (Prometheus = deep metrics, Uptime Kuma = simple uptime)
- License: MIT
7. ELK / OpenSearch (for logs, not metrics)
- Elasticsearch + Logstash/Fluent Bit + Kibana/OpenSearch Dashboards
- Best for centralized log aggregation and search (nginx access logs, php-fpm error logs, syslog)
- Heavy (needs 4+ GB RAM for Elasticsearch alone) — probably overkill for current lab
- Grafana Loki is a lighter alternative for log aggregation that integrates natively with Grafana]
[Anton's answer: cool, I like everything proposed there]
5. Mixed (hybrid), like Grafana + Zabbix
... TBD
[AGENT NOTE — hybrid recommendation:
Based on the project's existing infra (Alpine VMs, MariaDB, nginx, PHP-FPM, Xen, 8GB RAM/node)
and what's already discussed in GRAFANA_vs_others_graphvis_pivot.md, my suggestion for SPEC:
RECOMMENDED STACK (R0):
Infra layer: Prometheus (or VictoriaMetrics) + node_exporter on each VM
+ blackbox_exporter for HTTP/TCP probes
+ mysqld_exporter for MariaDB
+ Alertmanager → email (required) + Telegram bot (optional)
Dashboard: Grafana (community dashboards for node_exporter + MariaDB)
Uptime: Uptime Kuma on a separate lightweight VM or the FE (external to cluster)
Deployment: ac-deploy (new monitoring/ role in cluster0 scripts)
FUTURE (R1):
Log aggregation: Grafana Loki + Promtail (lighter than ELK)
Auto-remediation: custom event handler scripts triggered by Alertmanager webhooks
Business metrics: Grafana queries TimescaleDB (already in project plan)
OPEN QUESTION FOR PO: Should the monitoring stack get its own VM node (4th node), or run
on one of the 3 cluster nodes (and which one)? This affects DR decision §2.]
[Anton's answer: good, so we agreed on most of the points there, i also concluded this combination as the better one for myself. I think I've addressed almost all the questions. the Q from my side:
imagine I've allocated yet another VM and put it inside cluster as an empty node (only os-basic software is installed)
- do I need something from DNS hosting provider, like CNAME records, additional TXT records maybe?
- do we need a kind of tuning of the existing FE configs (nginx which is a forwarder there, for example)
- ImprovMX, addy.io, Telegram bot where? internally deployed inside the cluster or externally used by sort of API? need to create accounts for the document target feature? on which services, just to be ready before we go?
]
External check for provider-fault: UptimeRobot free tier (web registration only, no install anywhere).
[Anton's nodes:
just to remind, we're limited on this on the server's side:
- machine type: next type will be likely paravirtualized (no HVM)
- OS type: Alpine latest LTS (or Edge, but manually configured changing the repos)
- software: likely from the Alpine community packages/ package manager; meaning we'll try to avoid any source-based software, preferring apk's built for the particular Alpine
- FE/router: unlikely to install the software there, almost untouchable; we can play just with the configuration, like adding routes, playing with iptables, etc. with the existing software, but no new installations there
]
The how — DECIDED STACK:
INFRA METRICS (cast04):
- prometheus + node_exporter on cast01/cast02/cast03/cast04 (apk add)
- prometheus-blackbox-exporter on cast04 for HTTP/TCP service probes (apk add)
- prometheus-mysqld-exporter on MariaDB node (apk add)
- alertmanager on cast04 → email (SMTP relay) + Telegram bot (API only)
- grafana on cast04 (apk add); community dashboards for node_exporter + MariaDB
UPTIME STATUS PAGE (cast04, Docker):
- Uptime Kuma (Docker) on cast04 for a clean per-service status page
- Docker itself available via apk
EXTERNAL AVAILABILITY:
- UptimeRobot free tier — no install, web registration, HTTP probe to apps.f0xx.org
- Alerting via email from UptimeRobot
NOT CHOSEN (and why):
- Kibana/ELK: excluded (log-centric, heavy, wrong tool for infra metrics)
- Zabbix: licensing OK but less flexible for future business metrics integration vs Grafana
- Nagios: legacy, superseded by Prometheus+Alertmanager for this use case
- VictoriaMetrics: not in Alpine apk repos; use standard Prometheus at this scale
- Grafana Cloud / external SaaS aggregator: data must stay self-hosted (Anton's decision)
FUTURE (Track B, R1+):
- Grafana Loki + Promtail for centralized log aggregation
- Alertmanager webhook handlers for auto-remediation triggers
- Grafana queries TimescaleDB for business/application metrics (complement, not replace Prometheus)
CONSTRAINTS (Alpine notes):
- Machine: paravirtualized XEN guest (no HVM)
- OS: Alpine latest LTS (community + edge repos)
- Software: apk packages only; Docker available via apk for Uptime Kuma
- FE/router: no software installation; config-only (iptables, routes, existing software)
PRE-REQUISITES (accounts to create before deploy):
- Email alert relay: Gmail account + app password, OR Mailgun free tier (outbound SMTP only)
NOTE: ImprovMX and addy.io are inbound email routing services — NOT usable as SMTP relay for Alertmanager
- Telegram alerts: @BotFather → create bot → get TOKEN + CHAT_ID (add bot to ops group)
No software install; Alertmanager calls Telegram API from cast04
- UptimeRobot: free account at uptimerobot.com → add HTTP monitor for apps.f0xx.org
DNS / FE NGINX:
- R0: no DNS changes, no FE nginx changes required
- cast04 monitoring stack is internal-only (access via SSH tunnel or WireGuard from dev machine)
- Future optional: FE nginx proxy rule (config-only) to expose Grafana at e.g. /monitoring/ externally

View File

@@ -0,0 +1,72 @@
Cluster self-healing and automated orchestration draft (Track B)
milestone: R1+
severity: high
state: placeholder — not for immediate implementation; referenced by monitoring SPEC (Track A)
author: Anton Afanasyeu
date: 2026-06-26
related to: 20260626_cluster_monitoring*, 20260618_repos_reorganizing*, microservice split
Track A (prerequisite, must be complete first):
- Full passive monitoring + alerting operational (see specs/20260626_cluster_monitoring.md)
- Alert routing proven stable (email + Telegram)
- At least 4 weeks of baseline metrics collected (needed to calibrate thresholds)
The idea:
Once the monitoring layer (Track A) is stable and producing reliable alert signals, the next step is
to make the cluster respond to those signals automatically — rather than requiring a human to act on
every alert. This is commonly called cluster self-healing, auto-remediation, or a "smart hypervisor"
layer. It is NOT part of the monitoring SPEC; it is an orchestration concern.
Target scenarios (desired future automation):
Scenario 1 — CPU overload → horizontal scale-out
Trigger: microservice X CPU utilization > threshold for N minutes (Alertmanager signal)
Action: provision new node Y (via Xen/cloud API), deploy microservice X replica on it,
update load balancer / nginx upstream, re-route portion of traffic
Complexity: HIGH — requires VM provisioning API + dynamic nginx config reload
Scenario 2 — Idle scale-in (cost saving)
Trigger: microservice X CPU < threshold for Y hours AND overall cluster load < 75%
Action: gracefully drain microservice X instance, deprovision node, update upstream config
Complexity: HIGH — requires graceful drain protocol per microservice type
Scenario 3 — DDoS / network spike response
Trigger: NIC ingress/egress > threshold OR nginx 5xx rate spikes (Alertmanager signal)
Sub-action A (DDoS suspected): block suspect IPs, rate-limit at iptables, notify Anton
Sub-action B (organic spike): scale out cluster capacity, increase bandwidth (notify Anton for
bandwidth tier change — cannot be auto-done from cluster)
Complexity: VERY HIGH — requires traffic analysis, IP reputation, coordinated with upstream
Scenario 4 — Storage fault recovery
Trigger: disk SMART pre-failure / disk write latency > threshold on node Y
Action: elect replica to master (if MariaDB GTID replication is active), notify Anton to
provision spare node, re-sync replica on new node
Complexity: HIGH — MariaDB GTID failover + new node provisioning
Common prerequisites for all scenarios:
1. Track A monitoring + alerting fully operational (Alertmanager webhook available)
2. VM provisioning API (Xen xl toolstack or cloud provider API with automation credentials)
3. Configuration management (Ansible / ac-deploy role) for dynamic service placement
4. Graceful drain protocol defined per microservice (health endpoint + connection draining)
5. Load balancer / nginx upstream reconfiguration automation (e.g. consul-template or custom script)
6. Decision logic (thresholds, hysteresis, human-in-the-loop gates vs fully-automatic)
Approach options (TBD — to be designed in R1 DR):
a) Kubernetes operators (standard industry path; requires migrating to K8s)
b) Ansible event-driven (Ansible EDA) — react to Alertmanager webhooks with playbooks
c) Home-grown orchestration scripts called by Alertmanager webhook receiver on cast04
d) HashiCorp Nomad + Consul (lighter than K8s; service placement + dynamic upstream config)
Open questions (for R1 DR):
- Does Anton's infrastructure support Xen VM provisioning via API / xl scripting?
- What is the minimum cluster node count for safe scale-in (must keep >= N nodes)?
- Is Kubernetes acceptable given paravirt constraint (k3s on Alpine paravirt is feasible)?
- What is the human-in-the-loop policy: always require approval for scale-out/in, or fully
automatic within defined bounds?
- Cost model for scale-out: how are additional nodes billed / what is the budget ceiling?
Related documents:
- Track A: docs/DRs/20260626_cluster_monitoring.md + docs/specs/20260626_cluster_monitoring.md
- Scaling SPEC: docs/specs/20100612_1_scaling.md
- Repo reorganization SPEC: docs/specs/20260618_repos_reorganizing.md
- ac-deploy cluster scripts: orchestration/sim/cluster0/

View File

@@ -305,7 +305,7 @@ endobj
endobj
51 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115607+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115607+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184405+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184405+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (URL shortener service \204 specification) /Trapped /False
>>
endobj
@@ -647,7 +647,7 @@ xref
trailer
<<
/ID
[<dfb56bfa7fa29c8df90718f7ff48e788><dfb56bfa7fa29c8df90718f7ff48e788>]
[<d518e6310f2e40f7990db3642e85692e><d518e6310f2e40f7990db3642e85692e>]
% ReportLab generated PDF document -- digest (opensource)
/Info 51 0 R

View File

@@ -425,7 +425,7 @@ endobj
endobj
67 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115607+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115607+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184405+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184405+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Platform scaling and multi-environment architecture \204 specification) /Trapped /False
>>
endobj
@@ -862,7 +862,7 @@ xref
trailer
<<
/ID
[<c407e2764e1e7d4d181ff71ff66c0bf4><c407e2764e1e7d4d181ff71ff66c0bf4>]
[<b59883af3aa2b268402730441ad3ae56><b59883af3aa2b268402730441ad3ae56>]
% ReportLab generated PDF document -- digest (opensource)
/Info 67 0 R

View File

@@ -530,7 +530,7 @@ endobj
endobj
87 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260623115607+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260623115607+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Author (Android Cast project) /CreationDate (D:20260626184406+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184406+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Repository and microservice reorganization \204 specification) /Trapped /False
>>
endobj
@@ -1109,7 +1109,7 @@ xref
trailer
<<
/ID
[<a464cb1b9faafc78e6e7faee8af46142><a464cb1b9faafc78e6e7faee8af46142>]
[<3c211d31a9645697899591c5f06bcc1b><3c211d31a9645697899591c5f06bcc1b>]
% ReportLab generated PDF document -- digest (opensource)
/Info 87 0 R

View File

@@ -0,0 +1,830 @@
# Infrastructure health monitoring — specification
<!-- doc-meta:start -->
| Field | Value |
|---|---|
| Author | Anton Afanasyeu |
| Revision | R0 |
| Creation date | 2026-06-26 |
| Last modification date | 2026-06-26 |
| Co-authored | Cursor Agent (project assistant) |
| Severity | high |
| State | accepted |
| Document type | spec |
| Supersedes | — |
| Design review | [docs/DRs/20260626_cluster_monitoring.md](../DRs/20260626_cluster_monitoring.md) (frozen R0) |
<!-- doc-meta:end -->
---
**Document type:** SPEC
**Source draft:** [docs/drafts/20260626_cluster_monitoring.txt](../drafts/20260626_cluster_monitoring.txt)
**Design review:** [docs/DRs/20260626_cluster_monitoring.md](../DRs/20260626_cluster_monitoring.md) (frozen)
**PDF:** [20260626_cluster_monitoring.pdf](20260626_cluster_monitoring.pdf) · Regenerate: `bash ac-docs/build-pdf.sh`
**Status:** **Accepted** — implement per §7 deployment plan
**Scope:** Passive infrastructure monitoring and alerting for XEN cluster cast01cast04; Track A only
**Related:** [INFRA.md](../INFRA.md) · [DRs/20260626_cluster_monitoring.md](../DRs/20260626_cluster_monitoring.md) · [specs/20100612_1_scaling.md](20100612_1_scaling.md) · [20260620_postgres_timescale_db_platform.md](../20260620_postgres_timescale_db_platform.md)
**Track B (future):** [drafts/20260626_cluster_orchestration.txt](../drafts/20260626_cluster_orchestration.txt)
**Documentation index:** [README.md](../README.md)
---
## Table of contents
<!-- toc -->
- [1. Purpose](#1-purpose)
- [2. Scope](#2-scope)
- [3. Requirements](#3-requirements)
- [3.1 Must](#31-must)
- [3.2 Should](#32-should)
- [3.3 Non-goals](#33-non-goals)
- [4. Monitoring domains](#4-monitoring-domains)
- [4.1 Hardware metrics](#41-hardware-metrics)
- [4.2 Software and service metrics](#42-software-and-service-metrics)
- [4.3 External availability](#43-external-availability)
- [4.4 Provider-layer fault escalation](#44-provider-layer-fault-escalation)
- [5. Topology — cast04 as dedicated monitoring node](#5-topology--cast04-as-dedicated-monitoring-node)
- [6. Component catalog](#6-component-catalog)
- [6.1 Alpine apk packages (cast04)](#61-alpine-apk-packages-cast04)
- [6.2 Alpine apk packages (cast01cast03)](#62-alpine-apk-packages-cast0103)
- [6.3 Docker-based (cast04)](#63-docker-based-cast04)
- [6.4 External SaaS (no install)](#64-external-saas-no-install)
- [7. Deployment plan](#7-deployment-plan)
- [7.1 Phase 0 — cast04 provisioning](#71-phase-0--cast04-provisioning)
- [7.2 Phase 1 — Prometheus + node_exporter](#72-phase-1--prometheus--node_exporter)
- [7.3 Phase 2 — Service probes and MariaDB exporter](#73-phase-2--service-probes-and-mariadb-exporter)
- [7.4 Phase 3 — Alertmanager](#74-phase-3--alertmanager)
- [7.5 Phase 4 — Grafana dashboards](#75-phase-4--grafana-dashboards)
- [7.6 Phase 5 — Uptime Kuma + UptimeRobot](#76-phase-5--uptime-kuma--uptimerobot)
- [7.7 ac-deploy integration](#77-ac-deploy-integration)
- [8. Alert routing](#8-alert-routing)
- [8.1 Alert severity levels](#81-alert-severity-levels)
- [8.2 Routing rules](#82-routing-rules)
- [8.3 Alertmanager SMTP config (skeleton)](#83-alertmanager-smtp-config-skeleton)
- [8.4 Telegram receiver config (skeleton)](#84-telegram-receiver-config-skeleton)
- [8.5 Alert rule catalog](#85-alert-rule-catalog)
- [9. Grafana dashboard catalog](#9-grafana-dashboard-catalog)
- [10. Pre-requisite accounts](#10-pre-requisite-accounts)
- [11. TimescaleDB relationship](#11-timescaledb-relationship)
- [12. Verification and acceptance](#12-verification-and-acceptance)
- [13. Risks and mitigations](#13-risks-and-mitigations)
- [14. Related documents](#14-related-documents)
- [15. Changelog](#15-changelog)
<!-- /toc -->
---
## 1. Purpose
Define the **normative** implementation of passive infrastructure monitoring and alerting for the AndroidCast XEN-based VM cluster. The system must:
- Record hardware and software health metrics from all cluster nodes continuously
- Alert operators promptly when measured values exceed defined thresholds
- Provide visual dashboards for trend analysis and incident investigation
- Detect external (provider-layer) unavailability via an independent probe
This SPEC covers **Track A only** (observe, record, alert). Automated cluster remediation is Track B and is explicitly out of scope — see [drafts/20260626_cluster_orchestration.txt](../drafts/20260626_cluster_orchestration.txt).
---
## 2. Scope
| In scope | Out of scope |
|----------|--------------|
| Hardware metrics: CPU, RAM, disk, NIC per node | Automated node provisioning / deprovisioning |
| Software metrics: process health, HTTP probes, MariaDB | Log aggregation (Grafana Loki — planned R1) |
| Alert routing: email + Telegram | Auto-scaling or auto-failover reactions |
| External uptime probe (UptimeRobot) | Changes to FE nginx or router software |
| Grafana dashboards (infra layer) | Business / application metrics (→ TimescaleDB) |
| cast04 as dedicated monitoring VM | Kubernetes / service mesh |
| ac-deploy integration (monitoring role) | SaaS external aggregator for metric data |
| Pre-requisite account setup guide | iOS / mobile performance profiling |
**Alpha constraint:** Monitoring stack MAY be deployed incrementally per §7 phases. Each phase MUST leave prior phases operational.
---
## 3. Requirements
### 3.1 Must
| ID | Requirement |
|----|-------------|
| R-MON-1 | cast04 dedicated monitoring VM provisioned as Alpine LTS paravirt XEN guest |
| R-MON-2 | node_exporter running on cast01, cast02, cast03, cast04 |
| R-MON-3 | Prometheus scraping all node_exporters on 15s interval |
| R-MON-4 | blackbox_exporter probing all critical HTTP endpoints (§4.2) from cast04 |
| R-MON-5 | mysqld_exporter running on MariaDB primary node |
| R-MON-6 | Alertmanager routing CRITICAL alerts to email within 2 min of threshold breach |
| R-MON-7 | Grafana serving dashboards on cast04 (internal access via SSH tunnel at R0) |
| R-MON-8 | UptimeRobot external HTTP probe active for `apps.f0xx.org` |
| R-MON-9 | All software installed via Alpine apk or Docker (no source compilation) |
| R-MON-10 | No new software installed on FE VM or router |
| R-MON-11 | Metric data retained locally on cast04 for minimum 90 days |
| R-MON-12 | Alert for CPU steal time > 10% sustained 5 min (Xen overcommit indicator → notify Anton) |
| R-MON-13 | Alert for disk write latency > 100ms sustained 5 min on MariaDB node |
| R-MON-14 | Alert for MariaDB replication lag > 30s |
| R-MON-15 | Hardware guarantee baseline alerts (§4.1 table) — notify when measured < guaranteed |
### 3.2 Should
| ID | Requirement |
|----|-------------|
| R-MON-S1 | Alertmanager Telegram receiver configured alongside email |
| R-MON-S2 | Uptime Kuma status page deployed on cast04 (Docker) |
| R-MON-S3 | Grafana provisioned with community dashboard for node_exporter (ID 1860) |
| R-MON-S4 | Grafana provisioned with community dashboard for MariaDB |
| R-MON-S5 | Prometheus metric retention configurable via `--storage.tsdb.retention.time` |
| R-MON-S6 | Alertmanager grouping configured to suppress alert storms (group_wait 30s, group_interval 5m) |
| R-MON-S7 | ac-deploy `monitoring/` role added to cluster0 scripts for reproducible deployment |
### 3.3 Non-goals
- Automated node scale-out or scale-in (Track B)
- DDoS automatic mitigation (Track B)
- Storage automatic failover (Track B)
- Centralized log search (Grafana Loki — R1)
- Business metrics dashboards (TimescaleDB + Grafana — separate track)
- Monitoring of router or FE internal metrics (config-only access; UptimeRobot covers external availability)
---
## 4. Monitoring domains
### 4.1 Hardware metrics
Collected by **node_exporter** on every VM (cast01cast04). Alert thresholds are guidelines — tune after collecting baseline.
| Metric | Prometheus metric name | WARNING threshold | CRITICAL threshold | Xen note |
|--------|----------------------|-------------------|--------------------|-----------|
| CPU utilization | `rate(node_cpu_seconds_total{mode!="idle"}[5m])` | > 80% (5 min) | > 95% (5 min) | |
| **CPU steal time** | `rate(node_cpu_seconds_total{mode="steal"}[5m])` | > 5% (5 min) | > 10% (5 min) | Xen overcommit → notify Anton |
| Load average 1m | `node_load1 / node_cpu_count` | > 1.5 | > 3.0 | |
| RAM used % | `1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes` | > 80% | > 90% | |
| Swap used % | `node_memory_SwapFree_bytes / node_memory_SwapTotal_bytes` | > 50% | > 80% | |
| Disk used % | `1 - node_filesystem_avail_bytes / node_filesystem_size_bytes` | > 75% | > 90% | |
| Disk write latency | `rate(node_disk_write_time_seconds_total[5m]) / rate(node_disk_writes_completed_total[5m])` | > 50ms | > 100ms | Critical on MariaDB node |
| Disk IOPS | `rate(node_disk_io_time_seconds_total[5m])` | > 80% | > 95% | |
| NIC ingress bytes/s | `rate(node_network_receive_bytes_total[5m])` | > 150 Mbit/s | > 190 Mbit/s | Guaranteed: 200 Mbit/s |
| NIC egress bytes/s | `rate(node_network_transmit_bytes_total[5m])` | > 150 Mbit/s | > 190 Mbit/s | Guaranteed: 200 Mbit/s |
| NIC packet drops | `rate(node_network_receive_drop_total[5m])` | > 0.1% | > 1% | |
| NIC errors | `rate(node_network_receive_errs_total[5m])` | > 0 | > 10/min | |
**Hardware guarantee baseline check:** If `node_memory_MemTotal_bytes` < 7.5 GB, or CPU core count < 8, or disk total < 30 GB → CRITICAL alert (guaranteed resources not provided → notify Anton).
### 4.2 Software and service metrics
#### Process / systemd health (node_exporter `systemd` collector or blackbox TCP probe)
| Service | Check | Alert trigger |
|---------|-------|---------------|
| nginx | TCP :80 probe | Connection refused → CRITICAL |
| php-fpm | TCP socket probe | No response → CRITICAL |
| MariaDB | TCP :3306 probe | Connection refused → CRITICAL |
| sshd | TCP :22 probe | Connection refused → WARNING |
| Per-microservice HTTP endpoint | HTTP GET /health or / | Non-2xx or timeout > 5s → WARNING; > 30s → CRITICAL |
#### MariaDB metrics (mysqld_exporter)
| Metric | Prometheus metric | WARNING | CRITICAL |
|--------|------------------|---------|---------|
| Replication lag | `mysql_slave_status_seconds_behind_master` | > 10s | > 30s |
| Open connections | `mysql_global_status_threads_connected` | > 80% of max | > 95% of max |
| Slow queries/s | `rate(mysql_global_status_slow_queries[5m])` | > 1/s | > 5/s |
| InnoDB buffer pool hit | `mysql_global_status_innodb_buffer_pool_reads / mysql_global_status_innodb_buffer_pool_read_requests` | < 95% | < 90% |
| Aborted connections | `rate(mysql_global_status_aborted_connects[5m])` | > 1/min | > 10/min |
#### nginx metrics (via node_exporter nginx stub or blackbox HTTP probe)
| Metric | Source | WARNING | CRITICAL |
|--------|--------|---------|---------|
| 5xx response rate | blackbox HTTP probe returning 5xx | Any 5xx returned | > 10% of requests |
| Response time | blackbox `probe_duration_seconds` | > 2s | > 10s |
#### php-fpm metrics (via php-fpm status endpoint + blackbox or custom exporter)
| Metric | WARNING | CRITICAL |
|--------|---------|---------|
| Active workers % of max | > 70% | > 90% |
| Queue length | > 5 | > 20 |
### 4.3 External availability
**Tool:** UptimeRobot free tier — no installation; checks from UptimeRobot's global nodes.
| Monitor | URL | Check interval | Alert on |
|---------|-----|---------------|---------|
| Frontend TLS | `https://apps.f0xx.org` | 5 min | Non-2xx or timeout |
| API health | `https://apps.f0xx.org/app/androidcast_project/` | 5 min | Non-2xx or timeout |
**Internal cross-check:** blackbox_exporter on cast04 also probes the FE endpoint from inside the cluster. If UptimeRobot fires but blackbox does NOT → provider/uplink fault (Anton's layer). If both fire → likely cluster-side issue.
### 4.4 Provider-layer fault escalation
When monitoring detects that the root cause is in Anton's infrastructure layer:
| Symptom | Likely cause | Action |
|---------|-------------|--------|
| CPU steal > 10% sustained | Xen host overcommit | Email Anton; await response |
| Disk write latency persistent despite low I/O | Xen host disk contention | Email Anton |
| NIC saturation below 200 Mbit guarantee | Uplink / Xen host NIC | Email Anton |
| UptimeRobot alert + cast04 unreachable | Xen host or uplink down | Email Anton; check intra-network |
| Entire cluster unreachable | Router / uplink / payment | Email Anton; check calendar |
These events are **alert-only** at R0. No automated remediation.
---
## 5. Topology — cast04 as dedicated monitoring node
```text
10.7.0.0/8 internal network
┌────────────────────────────────────────┐
│ cast04 — monitoring VM (Alpine LTS) │
│ │
cast01 ──[ :9100 node_exporter ]──┤ │
cast02 ──[ :9100 node_exporter ]──┤──► Prometheus :9090 │
cast03 ──[ :9100 node_exporter ]──┤ ├── scrape all :9100 │
cast04 ──[ :9100 node_exporter ]──┘ ├── scrape :9104 (mysqld) │
MariaDB node ─[ :9104 mysqld_exp ] └── evaluate alert rules │
│ │
▼ │
Alertmanager :9093 │
├── email (SMTP relay) │
└── Telegram bot API │
blackbox_exporter :9115 │
└── HTTP/TCP probes → cast0103, │
FE endpoint, per-service /health │
Grafana :3000 │
├── datasource: Prometheus │
└── datasource: TimescaleDB (future) │
Uptime Kuma :3001 (Docker) │
└── per-service status page │
└───────────────────────────────────────┘
External (no install):
UptimeRobot ──► HTTP probe ──► apps.f0xx.org (from internet)
```
**cast04 minimum provisioning request (to Anton):**
```
VM name: cast04
VM type: paravirt XEN guest
OS: Alpine Linux latest LTS (64-bit)
CPU: 2 vCPU
RAM: 2 GB
Disk: 32 GB (non-shared)
Network: Internal 10.7.0.0/8 + internet egress (for Alertmanager SMTP / Telegram API calls)
```
---
## 6. Component catalog
### 6.1 Alpine apk packages (cast04)
```bash
apk update && apk upgrade
apk add prometheus alertmanager grafana \
prometheus-node-exporter \
prometheus-blackbox-exporter \
docker docker-cli docker-compose
```
| Package | Alpine repo | Version policy |
|---------|------------|---------------|
| `prometheus` | community/edge | latest stable in repo |
| `alertmanager` | community/edge | latest stable |
| `grafana` | community/edge | latest stable |
| `prometheus-node-exporter` | community | latest stable |
| `prometheus-blackbox-exporter` | community | latest stable |
| `docker` | community | for Uptime Kuma container |
If a package is only in Alpine **edge** repo, add the edge community URL to `/etc/apk/repositories` and pin via `/etc/apk/world`.
### 6.2 Alpine apk packages (cast01cast03)
Install only the node exporter on each workload node:
```bash
apk add prometheus-node-exporter
rc-update add node-exporter default
rc-service node-exporter start
```
On the MariaDB primary node, additionally:
```bash
apk add prometheus-mysqld-exporter
# Create limited MariaDB user for exporter:
mysql -e "CREATE USER 'prom_exporter'@'localhost' IDENTIFIED BY '<password>';"
mysql -e "GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'prom_exporter'@'localhost';"
# Configure /etc/prometheus-mysqld-exporter/mysqld_exporter.env
# DATA_SOURCE_NAME='prom_exporter:<password>@(localhost:3306)/'
rc-update add mysqld-exporter default
rc-service mysqld-exporter start
```
### 6.3 Docker-based (cast04)
```bash
rc-update add docker default
rc-service docker start
# Uptime Kuma
docker run -d --restart=always \
--name uptime-kuma \
-p 3001:3001 \
-v uptime-kuma:/app/data \
louislam/uptime-kuma:latest
```
### 6.4 External SaaS (no install)
| Service | URL | Action |
|---------|-----|--------|
| UptimeRobot | https://uptimerobot.com | Create free account; add HTTP monitor for `https://apps.f0xx.org`; configure email alert |
---
## 7. Deployment plan
Deploy phases in order. Each phase MUST be verified before starting the next.
### 7.1 Phase 0 — cast04 provisioning
**Goal:** cast04 VM exists and is reachable from cast01cast03 on internal network.
| Action | Detail |
|--------|--------|
| Request VM | Ask Anton for cast04 — spec per §5 table |
| Base install | Alpine latest LTS; configure apk repos (community + edge) |
| SSH access | Add developer SSH key; test login |
| Network | Confirm cast04 can reach cast0103 IPs on internal network |
| NTP | `apk add chrony && rc-service chronyd start` |
**Verify:** `ssh cast04 ping cast01` succeeds; `apk update` succeeds.
### 7.2 Phase 1 — Prometheus + node_exporter
**Goal:** Prometheus scraping hardware metrics from all nodes.
```bash
# On cast04:
apk add prometheus prometheus-node-exporter
# /etc/prometheus/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'node'
static_configs:
- targets:
- 'cast01:9100'
- 'cast02:9100'
- 'cast03:9100'
- 'cast04:9100'
rc-update add prometheus default
rc-update add node-exporter default
rc-service prometheus start
rc-service node-exporter start
```
On cast01cast03: install and start `prometheus-node-exporter` (§6.2).
**Verify:** `curl http://cast04:9090/api/v1/targets` shows all 4 nodes in state `up`.
### 7.3 Phase 2 — Service probes and MariaDB exporter
**Goal:** HTTP/TCP probes and MariaDB metrics flowing.
Add to `prometheus.yml`:
```yaml
- job_name: 'blackbox_http'
metrics_path: /probe
params:
module: [http_2xx]
static_configs:
- targets:
- https://apps.f0xx.org
- http://cast01:80 # nginx on workload nodes
# add per-microservice /health endpoints as they exist
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: cast04:9115 # blackbox_exporter
- job_name: 'blackbox_tcp'
metrics_path: /probe
params:
module: [tcp_connect]
static_configs:
- targets:
- cast01:3306 # MariaDB
- cast02:3306 # replica
- cast01:22
- cast02:22
- cast03:22
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: cast04:9115
- job_name: 'mariadb'
static_configs:
- targets: ['<mariadb-primary-node>:9104']
```
Start services:
```bash
rc-service blackbox-exporter start
rc-service mysqld-exporter start # on MariaDB node
```
**Verify:** `curl "http://cast04:9115/probe?target=https://apps.f0xx.org&module=http_2xx"` returns `probe_success 1`.
### 7.4 Phase 3 — Alertmanager
**Goal:** Alerts route to email and (optionally) Telegram on threshold breach.
See §8 for full Alertmanager config skeletons. Deploy skeleton, then fill in SMTP credentials and Telegram token.
```bash
apk add alertmanager
# Edit /etc/alertmanager/alertmanager.yml (see §8.3 + §8.4)
rc-update add alertmanager default
rc-service alertmanager start
```
Add `alerting:` and `rule_files:` blocks to `prometheus.yml` (see §8.5 for rule file examples).
**Verify:** `amtool --alertmanager.url=http://cast04:9093 alert` returns empty (no active alerts); send a test alert and confirm email receipt.
### 7.5 Phase 4 — Grafana dashboards
**Goal:** Visual dashboards accessible for all metrics collected in phases 13.
```bash
apk add grafana
rc-update add grafana default
rc-service grafana start
# Access: http://cast04:3000 (via SSH tunnel: ssh -L 3000:cast04:3000 cast04)
```
In Grafana UI:
1. Add Prometheus datasource: `http://localhost:9090`
2. Import community dashboard **1860** ("Node Exporter Full") — covers §4.1 metrics
3. Import community dashboard **7362** or **13106** (MariaDB / mysqld_exporter)
4. Create custom panel for blackbox probe results (status per service endpoint)
5. Create overview panel showing hardware guarantee baseline vs measured values
**Verify:** All four dashboards render data; node_exporter CPU steal panel shows non-zero (or zero — both valid).
### 7.6 Phase 5 — Uptime Kuma + UptimeRobot
**Goal:** Service status page + external probe active.
```bash
# Uptime Kuma on cast04 (Docker):
rc-service docker start
docker run -d --restart=always --name uptime-kuma \
-p 3001:3001 -v uptime-kuma:/app/data louislam/uptime-kuma:latest
# Access: http://cast04:3001 (via SSH tunnel)
```
Configure monitors in Uptime Kuma UI:
- Add HTTP monitors for each microservice `/health` endpoint
- Add TCP monitors for MariaDB :3306, nginx :80
- Configure notification to same email as Alertmanager
**UptimeRobot:**
- Register free account at https://uptimerobot.com
- Add HTTP(s) monitor: `https://apps.f0xx.org`, 5-minute interval
- Add email alert notification (same ops email as Alertmanager)
**Verify:** Uptime Kuma dashboard shows all green; UptimeRobot sends test notification successfully.
### 7.7 ac-deploy integration
Add a `monitoring/` role to cluster0 deploy scripts in `ac-deploy/sim/cluster0/`:
```
ac-deploy/sim/cluster0/
monitoring/
deploy-monitoring.sh # installs cast04 components
prometheus.yml.j2 # Jinja2/envsubst template with node IPs
alertmanager.yml.j2 # template with SMTP/Telegram creds from env
alert-rules/
hardware.yml # §4.1 rules
services.yml # §4.2 rules
grafana/
datasources.yml # auto-provision Prometheus datasource
dashboards/ # provisioned dashboard JSONs
```
Credentials (SMTP password, Telegram token) MUST be passed via environment variables or a secrets file outside git — never committed.
**Verify:** `bash deploy-monitoring.sh` on a fresh cast04 produces a running stack within 10 minutes.
---
## 8. Alert routing
### 8.1 Alert severity levels
| Level | Meaning | Response |
|-------|---------|---------|
| `critical` | Service down or hardware limit exceeded | Alert immediately; wake operator if outside hours |
| `warning` | Approaching threshold; degraded | Alert during business hours; batch in digest |
| `info` | Notable event; no action required | Log only; no alert |
### 8.2 Routing rules
```
critical → email (immediately) + Telegram (immediately)
warning → email (grouped, 5 min window)
info → no alert (recorded in Prometheus only)
```
### 8.3 Alertmanager SMTP config (skeleton)
```yaml
# /etc/alertmanager/alertmanager.yml
global:
smtp_smarthost: 'smtp.gmail.com:587' # or Mailgun: smtp.mailgun.org:587
smtp_from: 'alerts@your-domain.com'
smtp_auth_username: 'your-gmail@gmail.com'
smtp_auth_password: '<APP_PASSWORD>' # from env / secrets file
smtp_require_tls: true
route:
group_by: ['alertname', 'instance']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receiver: 'ops-email'
routes:
- match:
severity: critical
receiver: 'ops-critical'
group_wait: 10s
repeat_interval: 1h
receivers:
- name: 'ops-email'
email_configs:
- to: 'ops@your-domain.com'
send_resolved: true
- name: 'ops-critical'
email_configs:
- to: 'ops@your-domain.com'
send_resolved: true
telegram_configs:
- bot_token: '<TELEGRAM_BOT_TOKEN>' # from env / secrets file
chat_id: <TELEGRAM_CHAT_ID>
send_resolved: true
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['instance']
```
**Note:** Replace `<APP_PASSWORD>` and `<TELEGRAM_BOT_TOKEN>` with values from environment — never commit credentials to git.
### 8.4 Telegram receiver config (skeleton)
Obtain Telegram credentials:
1. Open Telegram, message `@BotFather`
2. `/newbot` → follow prompts → save `TOKEN`
3. Add the bot to your ops group or DM it, then: `curl https://api.telegram.org/bot<TOKEN>/getUpdates` → find `chat.id`
4. Set `TELEGRAM_BOT_TOKEN=<TOKEN>` and `TELEGRAM_CHAT_ID=<CHAT_ID>` in the secrets file used by deploy script
### 8.5 Alert rule catalog
Create `/etc/prometheus/rules/hardware.yml`:
```yaml
groups:
- name: hardware
rules:
- alert: CpuHighUtilization
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 95
for: 5m
labels:
severity: critical
annotations:
summary: "CPU critical on {{ $labels.instance }}"
description: "CPU utilization {{ $value | humanize }}% > 95%"
- alert: XenCpuStealHigh
expr: avg by(instance) (rate(node_cpu_seconds_total{mode="steal"}[5m])) * 100 > 10
for: 5m
labels:
severity: critical
annotations:
summary: "Xen CPU steal critical on {{ $labels.instance }} — notify Anton"
description: "CPU steal {{ $value | humanize }}% > 10% — hypervisor overcommit"
- alert: RamCritical
expr: (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 > 90
for: 5m
labels:
severity: critical
annotations:
summary: "RAM critical on {{ $labels.instance }}"
- alert: DiskCritical
expr: (1 - node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes) * 100 > 90
for: 5m
labels:
severity: critical
annotations:
summary: "Disk critical on {{ $labels.instance }} mount {{ $labels.mountpoint }}"
- alert: DiskWriteLatencyHigh
expr: >
rate(node_disk_write_time_seconds_total[5m])
/ rate(node_disk_writes_completed_total[5m]) * 1000 > 100
for: 5m
labels:
severity: critical
annotations:
summary: "Disk write latency critical on {{ $labels.instance }} — possible HW fault; notify Anton"
- alert: HardwareGuaranteeRamBreach
expr: node_memory_MemTotal_bytes < 7.5 * 1024 * 1024 * 1024
for: 1m
labels:
severity: critical
annotations:
summary: "RAM below guaranteed 8 GB on {{ $labels.instance }} — notify Anton"
```
Create `/etc/prometheus/rules/services.yml`:
```yaml
groups:
- name: services
rules:
- alert: ServiceDown
expr: probe_success == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Service unreachable: {{ $labels.instance }}"
- alert: ServiceSlowResponse
expr: probe_duration_seconds > 10
for: 2m
labels:
severity: warning
annotations:
summary: "Slow response from {{ $labels.instance }}: {{ $value | humanize }}s"
- alert: MariaDbReplicationLag
expr: mysql_slave_status_seconds_behind_master > 30
for: 2m
labels:
severity: critical
annotations:
summary: "MariaDB replication lag {{ $value | humanize }}s on {{ $labels.instance }}"
- alert: MariaDbDown
expr: mysql_up == 0
for: 1m
labels:
severity: critical
annotations:
summary: "MariaDB exporter cannot reach database on {{ $labels.instance }}"
```
Add to `prometheus.yml`:
```yaml
rule_files:
- "/etc/prometheus/rules/*.yml"
alerting:
alertmanagers:
- static_configs:
- targets: ['cast04:9093']
```
---
## 9. Grafana dashboard catalog
| Dashboard | Grafana ID | Source | Covers |
|-----------|-----------|--------|--------|
| Node Exporter Full | 1860 | community | CPU, RAM, disk, NIC, load — all §4.1 metrics |
| MariaDB Overview | 7362 | community | Connections, queries, replication lag, InnoDB |
| Blackbox Exporter | 7587 | community | HTTP probe success/latency per target |
| Custom: Hardware Guarantee | — | create | Measured vs Anton's guaranteed values |
| Custom: Service Health Overview | — | create | All service probes in one panel grid |
**Provisioning via ac-deploy:** export dashboard JSON from Grafana UI after customization and store in `ac-deploy/sim/cluster0/monitoring/grafana/dashboards/`. Add datasource YAML to `grafana/datasources/prometheus.yml`.
---
## 10. Pre-requisite accounts
The following must be created by the project owner before Phase 3 deploy:
| Account | Service | Purpose | Notes |
|---------|---------|---------|-------|
| Gmail app password | Gmail Settings → Security → App passwords | Alertmanager SMTP relay | App password, not account password. Alternatively: Mailgun free (10k/month) |
| Telegram bot | @BotFather in Telegram | Alertmanager Telegram receiver | `/newbot` → TOKEN; `getUpdates` → CHAT_ID |
| UptimeRobot free | https://uptimerobot.com | External HTTP probe | Add monitor for `https://apps.f0xx.org` |
**Important:** ImprovMX and addy.io provide inbound email routing (MX records) — they are not outbound SMTP relay services and cannot be used with Alertmanager. Use Gmail app password or a dedicated transactional email service (Mailgun, SendGrid) for outbound alerts.
---
## 11. TimescaleDB relationship
This SPEC implements infra-layer monitoring. Business and application metrics are a separate concern handled by the TimescaleDB platform plan ([20260620_postgres_timescale_db_platform.md](../20260620_postgres_timescale_db_platform.md)).
| Layer | Store | Examples | Retention |
|-------|-------|----------|-----------|
| Infrastructure | Prometheus TSDB on cast04 | CPU steal, disk latency, service probe | 90 days |
| Business / application | TimescaleDB (PostgreSQL) | Crash rate, session count, graph analytics | Long-term (configurable) |
Grafana on cast04 can query both stores simultaneously. No ETL or data duplication is required between them. The TimescaleDB datasource is added to Grafana as a second datasource in a future step — it does not affect R0 monitoring deployment.
---
## 12. Verification and acceptance
All phases must pass their gate before the next phase begins.
| Phase | Acceptance criteria |
|-------|---------------------|
| 0 | cast04 reachable from cast0103; `apk update` succeeds |
| 1 | `curl http://cast04:9090/api/v1/targets` shows all 4 nodes state=up |
| 2 | Blackbox probe for `https://apps.f0xx.org` returns `probe_success 1`; mysqld_exporter metrics visible in Prometheus |
| 3 | Test alert fires and email is received within 2 minutes; Telegram notification received (if configured) |
| 4 | Grafana dashboard 1860 renders data for all nodes; MariaDB dashboard shows replication status |
| 5 | Uptime Kuma shows all services green; UptimeRobot sends test notification |
| ac-deploy | Fresh cast04 reproduced by running `deploy-monitoring.sh` within 10 minutes |
**Ongoing regression:** After any cluster change (new microservice, new VM, nginx config change), add corresponding blackbox probe target and Grafana panel within 48 hours.
---
## 13. Risks and mitigations
| Risk | Mitigation |
|------|------------|
| cast04 itself fails — monitoring blind | UptimeRobot external probe continues; Alertmanager writes state to disk and resumes after VM restart |
| XEN host failure takes cast04 offline | UptimeRobot fires from external — operator is alerted even without cast04 |
| Alpine edge package breaks Prometheus | Pin version in `/etc/apk/world`; test upgrades on cast04 before rolling to workload nodes |
| SMTP rate limit during incident storm | Alertmanager `group_interval: 5m` + `repeat_interval: 4h` limit volume; Telegram is parallel channel |
| Prometheus disk overflow | 32 GB cast04 disk; estimated < 5 GB for 3 nodes at 15s scrape over 90 days; monitor cast04 disk in Grafana |
| Credentials leaked in git | Secrets must be in environment variables or a secrets file excluded from git (`.gitignore`); never in `prometheus.yml` or `alertmanager.yml` committed to repo |
| FE/router metrics unavailable | FE nginx stub_status available via config if Anton allows; not mandatory — blackbox HTTP probe sufficient at R0 |
---
## 14. Related documents
| Document | Role |
|----------|------|
| [DRs/20260626_cluster_monitoring.md](../DRs/20260626_cluster_monitoring.md) | Frozen design review (source of this SPEC) |
| [drafts/20260626_cluster_orchestration.txt](../drafts/20260626_cluster_orchestration.txt) | Track B — auto-remediation placeholder |
| [INFRA.md](../INFRA.md) | FE/BE topology, hosts, ports |
| [specs/20100612_1_scaling.md](20100612_1_scaling.md) | VM roles and cluster layout |
| [specs/20260618_repos_reorganizing.md](20260618_repos_reorganizing.md) | Microservice split (each new MS needs a blackbox probe) |
| [20260620_postgres_timescale_db_platform.md](../20260620_postgres_timescale_db_platform.md) | Business metrics store (complements Prometheus) |
| [GRAFANA_vs_others_graphvis_pivot.md](../GRAFANA_vs_others_graphvis_pivot.md) | Earlier Grafana evaluation for application analytics |
| [orchestration/sim/cluster0/ARCHITECTURE.md](../../orchestration/sim/cluster0/ARCHITECTURE.md) | Lab cluster node layout |
---
## 15. Changelog
| Rev | Date | Change |
|-----|------|--------|
| R0 | 2026-06-26 | SPEC converted from draft + DR R0; all decisions locked; deployment plan §7; alert rules §8 |

View File

@@ -0,0 +1,778 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 42 0 R /F4 43 0 R /F5 44 0 R /F6 45 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 45.68504 762.0394 84.37304 773.0394 ] /Subtype /Link /Type /Annot
>>
endobj
5 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 45.68504 751.0394 77.26104 762.0394 ] /Subtype /Link /Type /Annot
>>
endobj
6 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 45.68504 740.0394 104.373 751.0394 ] /Subtype /Link /Type /Annot
>>
endobj
7 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 59.68504 729.6019 88.44754 739.6019 ] /Subtype /Link /Type /Annot
>>
endobj
8 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 59.68504 719.6019 95.54254 729.6019 ] /Subtype /Link /Type /Annot
>>
endobj
9 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 59.68504 709.6019 106.3725 719.6019 ] /Subtype /Link /Type /Annot
>>
endobj
10 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 45.68504 699.0394 124.381 710.0394 ] /Subtype /Link /Type /Annot
>>
endobj
11 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 59.68504 688.6019 130.95 698.6019 ] /Subtype /Link /Type /Annot
>>
endobj
12 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 59.68504 678.6019 168.4725 688.6019 ] /Subtype /Link /Type /Annot
>>
endobj
13 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 59.68504 668.6019 136.38 678.6019 ] /Subtype /Link /Type /Annot
>>
endobj
14 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 59.68504 658.6019 170.9775 668.6019 ] /Subtype /Link /Type /Annot
>>
endobj
15 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 45.68504 648.0394 230.669 659.0394 ] /Subtype /Link /Type /Annot
>>
endobj
16 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 45.68504 637.0394 123.949 648.0394 ] /Subtype /Link /Type /Annot
>>
endobj
17 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 59.68504 626.6019 170.5725 636.6019 ] /Subtype /Link /Type /Annot
>>
endobj
18 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 59.68504 616.6019 196.8375 626.6019 ] /Subtype /Link /Type /Annot
>>
endobj
19 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 59.68504 606.6019 148.05 616.6019 ] /Subtype /Link /Type /Annot
>>
endobj
20 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 59.68504 596.6019 156.81 606.6019 ] /Subtype /Link /Type /Annot
>>
endobj
21 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 45.68504 586.0394 114.605 597.0394 ] /Subtype /Link /Type /Annot
>>
endobj
22 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 59.68504 575.6019 175.575 585.6019 ] /Subtype /Link /Type /Annot
>>
endobj
23 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 59.68504 565.6019 208.725 575.6019 ] /Subtype /Link /Type /Annot
>>
endobj
24 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 59.68504 555.6019 236.8425 565.6019 ] /Subtype /Link /Type /Annot
>>
endobj
25 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 59.68504 545.6019 156.3975 555.6019 ] /Subtype /Link /Type /Annot
>>
endobj
26 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 59.68504 535.6019 179.7525 545.6019 ] /Subtype /Link /Type /Annot
>>
endobj
27 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 59.68504 525.6019 209.1225 535.6019 ] /Subtype /Link /Type /Annot
>>
endobj
28 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 59.68504 515.6019 141.81 525.6019 ] /Subtype /Link /Type /Annot
>>
endobj
29 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 45.68504 505.0394 97.70904 516.0394 ] /Subtype /Link /Type /Annot
>>
endobj
30 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 59.68504 494.6019 136.7925 504.6019 ] /Subtype /Link /Type /Annot
>>
endobj
31 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 59.68504 484.6019 116.3775 494.6019 ] /Subtype /Link /Type /Annot
>>
endobj
32 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 59.68504 474.6019 197.235 484.6019 ] /Subtype /Link /Type /Annot
>>
endobj
33 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 59.68504 464.6019 189.7275 474.6019 ] /Subtype /Link /Type /Annot
>>
endobj
34 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 59.68504 454.6019 128.4675 464.6019 ] /Subtype /Link /Type /Annot
>>
endobj
35 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 45.68504 444.0394 151.525 455.0394 ] /Subtype /Link /Type /Annot
>>
endobj
36 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 45.68504 433.0394 138.613 444.0394 ] /Subtype /Link /Type /Annot
>>
endobj
37 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 45.68504 422.0394 149.717 433.0394 ] /Subtype /Link /Type /Annot
>>
endobj
38 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 45.68504 411.0394 157.301 422.0394 ] /Subtype /Link /Type /Annot
>>
endobj
39 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 45.68504 400.0394 134.605 411.0394 ] /Subtype /Link /Type /Annot
>>
endobj
40 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 45.68504 389.0394 127.949 400.0394 ] /Subtype /Link /Type /Annot
>>
endobj
41 0 obj
<<
/Border [ 0 0 0 ] /Contents () /Dest [ 46 0 R /Fit ] /Rect [ 45.68504 378.0394 97.71704 389.0394 ] /Subtype /Link /Type /Annot
>>
endobj
42 0 obj
<<
/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
43 0 obj
<<
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
44 0 obj
<<
/BaseFont /Symbol /Name /F5 /Subtype /Type1 /Type /Font
>>
endobj
45 0 obj
<<
/BaseFont /ZapfDingbats /Name /F6 /Subtype /Type1 /Type /Font
>>
endobj
46 0 obj
<<
/Contents 100 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 99 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
47 0 obj
<<
/Annots [ 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R
14 0 R 15 0 R 16 0 R 17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R
24 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 31 0 R 32 0 R 33 0 R
34 0 R 35 0 R 36 0 R 37 0 R 38 0 R 39 0 R 40 0 R 41 0 R ] /Contents 101 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 99 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0
/Trans <<
>> /Type /Page
>>
endobj
48 0 obj
<<
/Contents 102 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 99 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
49 0 obj
<<
/Contents 103 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 99 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
50 0 obj
<<
/Contents 104 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 99 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
51 0 obj
<<
/Contents 105 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 99 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
52 0 obj
<<
/Contents 106 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 99 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
53 0 obj
<<
/Contents 107 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 99 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
54 0 obj
<<
/Contents 108 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 99 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
55 0 obj
<<
/Contents 109 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 99 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
56 0 obj
<<
/Contents 110 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 99 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
57 0 obj
<<
/Contents 111 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 99 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
58 0 obj
<<
/Outlines 60 0 R /PageMode /UseNone /Pages 99 0 R /Type /Catalog
>>
endobj
59 0 obj
<<
/Author (Android Cast project) /CreationDate (D:20260626184407+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260626184407+02'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Infrastructure health monitoring \204 specification) /Trapped /False
>>
endobj
60 0 obj
<<
/Count 43 /First 61 0 R /Last 98 0 R /Type /Outlines
>>
endobj
61 0 obj
<<
/Dest [ 46 0 R /Fit ] /Next 62 0 R /Parent 60 0 R /Title (1. Purpose)
>>
endobj
62 0 obj
<<
/Dest [ 46 0 R /Fit ] /Next 63 0 R /Parent 60 0 R /Prev 61 0 R /Title (2. Scope)
>>
endobj
63 0 obj
<<
/Count 3 /Dest [ 46 0 R /Fit ] /First 64 0 R /Last 66 0 R /Next 67 0 R /Parent 60 0 R
/Prev 62 0 R /Title (3. Requirements)
>>
endobj
64 0 obj
<<
/Dest [ 46 0 R /Fit ] /Next 65 0 R /Parent 63 0 R /Title (3.1 Must)
>>
endobj
65 0 obj
<<
/Dest [ 46 0 R /Fit ] /Next 66 0 R /Parent 63 0 R /Prev 64 0 R /Title (3.2 Should)
>>
endobj
66 0 obj
<<
/Dest [ 46 0 R /Fit ] /Parent 63 0 R /Prev 65 0 R /Title (3.3 Non-goals)
>>
endobj
67 0 obj
<<
/Count 4 /Dest [ 46 0 R /Fit ] /First 68 0 R /Last 71 0 R /Next 72 0 R /Parent 60 0 R
/Prev 63 0 R /Title (4. Monitoring domains)
>>
endobj
68 0 obj
<<
/Dest [ 46 0 R /Fit ] /Next 69 0 R /Parent 67 0 R /Title (4.1 Hardware metrics)
>>
endobj
69 0 obj
<<
/Dest [ 46 0 R /Fit ] /Next 70 0 R /Parent 67 0 R /Prev 68 0 R /Title (4.2 Software and service metrics)
>>
endobj
70 0 obj
<<
/Dest [ 46 0 R /Fit ] /Next 71 0 R /Parent 67 0 R /Prev 69 0 R /Title (4.3 External availability)
>>
endobj
71 0 obj
<<
/Dest [ 46 0 R /Fit ] /Parent 67 0 R /Prev 70 0 R /Title (4.4 Provider-layer fault escalation)
>>
endobj
72 0 obj
<<
/Dest [ 46 0 R /Fit ] /Next 73 0 R /Parent 60 0 R /Prev 67 0 R /Title (5. Topology \204 cast04 as dedicated monitoring node)
>>
endobj
73 0 obj
<<
/Count 4 /Dest [ 46 0 R /Fit ] /First 74 0 R /Last 77 0 R /Next 78 0 R /Parent 60 0 R
/Prev 72 0 R /Title (6. Component catalog)
>>
endobj
74 0 obj
<<
/Dest [ 46 0 R /Fit ] /Next 75 0 R /Parent 73 0 R /Title (6.1 Alpine apk packages \(cast04\))
>>
endobj
75 0 obj
<<
/Dest [ 46 0 R /Fit ] /Next 76 0 R /Parent 73 0 R /Prev 74 0 R /Title (6.2 Alpine apk packages \(cast01\205cast03\))
>>
endobj
76 0 obj
<<
/Dest [ 46 0 R /Fit ] /Next 77 0 R /Parent 73 0 R /Prev 75 0 R /Title (6.3 Docker-based \(cast04\))
>>
endobj
77 0 obj
<<
/Dest [ 46 0 R /Fit ] /Parent 73 0 R /Prev 76 0 R /Title (6.4 External SaaS \(no install\))
>>
endobj
78 0 obj
<<
/Count 7 /Dest [ 46 0 R /Fit ] /First 79 0 R /Last 85 0 R /Next 86 0 R /Parent 60 0 R
/Prev 73 0 R /Title (7. Deployment plan)
>>
endobj
79 0 obj
<<
/Dest [ 46 0 R /Fit ] /Next 80 0 R /Parent 78 0 R /Title (7.1 Phase 0 \204 cast04 provisioning)
>>
endobj
80 0 obj
<<
/Dest [ 46 0 R /Fit ] /Next 81 0 R /Parent 78 0 R /Prev 79 0 R /Title (7.2 Phase 1 \204 Prometheus + node_exporter)
>>
endobj
81 0 obj
<<
/Dest [ 46 0 R /Fit ] /Next 82 0 R /Parent 78 0 R /Prev 80 0 R /Title (7.3 Phase 2 \204 Service probes and MariaDB exporter)
>>
endobj
82 0 obj
<<
/Dest [ 46 0 R /Fit ] /Next 83 0 R /Parent 78 0 R /Prev 81 0 R /Title (7.4 Phase 3 \204 Alertmanager)
>>
endobj
83 0 obj
<<
/Dest [ 46 0 R /Fit ] /Next 84 0 R /Parent 78 0 R /Prev 82 0 R /Title (7.5 Phase 4 \204 Grafana dashboards)
>>
endobj
84 0 obj
<<
/Dest [ 46 0 R /Fit ] /Next 85 0 R /Parent 78 0 R /Prev 83 0 R /Title (7.6 Phase 5 \204 Uptime Kuma + UptimeRobot)
>>
endobj
85 0 obj
<<
/Dest [ 46 0 R /Fit ] /Parent 78 0 R /Prev 84 0 R /Title (7.7 ac-deploy integration)
>>
endobj
86 0 obj
<<
/Count 5 /Dest [ 46 0 R /Fit ] /First 87 0 R /Last 91 0 R /Next 92 0 R /Parent 60 0 R
/Prev 78 0 R /Title (8. Alert routing)
>>
endobj
87 0 obj
<<
/Dest [ 46 0 R /Fit ] /Next 88 0 R /Parent 86 0 R /Title (8.1 Alert severity levels)
>>
endobj
88 0 obj
<<
/Dest [ 46 0 R /Fit ] /Next 89 0 R /Parent 86 0 R /Prev 87 0 R /Title (8.2 Routing rules)
>>
endobj
89 0 obj
<<
/Dest [ 46 0 R /Fit ] /Next 90 0 R /Parent 86 0 R /Prev 88 0 R /Title (8.3 Alertmanager SMTP config \(skeleton\))
>>
endobj
90 0 obj
<<
/Dest [ 46 0 R /Fit ] /Next 91 0 R /Parent 86 0 R /Prev 89 0 R /Title (8.4 Telegram receiver config \(skeleton\))
>>
endobj
91 0 obj
<<
/Dest [ 46 0 R /Fit ] /Parent 86 0 R /Prev 90 0 R /Title (8.5 Alert rule catalog)
>>
endobj
92 0 obj
<<
/Dest [ 46 0 R /Fit ] /Next 93 0 R /Parent 60 0 R /Prev 86 0 R /Title (9. Grafana dashboard catalog)
>>
endobj
93 0 obj
<<
/Dest [ 46 0 R /Fit ] /Next 94 0 R /Parent 60 0 R /Prev 92 0 R /Title (10. Pre-requisite accounts)
>>
endobj
94 0 obj
<<
/Dest [ 46 0 R /Fit ] /Next 95 0 R /Parent 60 0 R /Prev 93 0 R /Title (11. TimescaleDB relationship)
>>
endobj
95 0 obj
<<
/Dest [ 46 0 R /Fit ] /Next 96 0 R /Parent 60 0 R /Prev 94 0 R /Title (12. Verification and acceptance)
>>
endobj
96 0 obj
<<
/Dest [ 46 0 R /Fit ] /Next 97 0 R /Parent 60 0 R /Prev 95 0 R /Title (13. Risks and mitigations)
>>
endobj
97 0 obj
<<
/Dest [ 46 0 R /Fit ] /Next 98 0 R /Parent 60 0 R /Prev 96 0 R /Title (14. Related documents)
>>
endobj
98 0 obj
<<
/Dest [ 46 0 R /Fit ] /Parent 60 0 R /Prev 97 0 R /Title (15. Changelog)
>>
endobj
99 0 obj
<<
/Count 12 /Kids [ 46 0 R 47 0 R 48 0 R 49 0 R 50 0 R 51 0 R 52 0 R 53 0 R 54 0 R 55 0 R
56 0 R 57 0 R ] /Type /Pages
>>
endobj
100 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1000
>>
stream
Gat=+gMWc?&:Ml+b[Xj+Nbs/pa)3Q2?1hWqTREh>+`J'o"L;E5Fh`BBg4[Wr";"0:f]UJHnVfUB^ucj&J%,[Wk/6PJ!28=(JM>$XIt@oTnn1;'AhoC"b:s)J-,P\_%*f8+lr&U#J/h?mklR$<HAk+tRM\e?1aBio)A<ej[jEN2#$d*8k>[gg5D#pXaYF6ESJ@hN1'MG.D"JXSBbK_gMj"mg:b!XGWA%Yu@A)X;\H`'Cr#;"]WJpC\F.H2^#i_+qNeo+h[-ql)%cX,WM06a)#hp.kI3gOq4l!jn_ol&CAm6L-Y?n@BdQ=gVM5VptXn<";2%*gOa?=hhmp(^f_?;gA*hpRUBkl!amdeA:g?UGJj&:"q8][QQ5G4Mfb]FOT^<Gr'+dSI?`>Dp)RF`;kLi2(TH7?@8C=<,TfAN4G,f/TCG'_V)EL+`6Q'qRfX%d[o7gUQ!@3W]Frsgr@C,+>f[`UX9ESMT>8_r<AU"=#0_j:tbM,"_o>m<l^J#M@S9cIaA"KFaO=8Ot\D/pZ>8!)a`Z$:45mP7f1a:JNd]t1*U&%=eY'iQZ\<-0P_"pa/0m,)EqNfIaE:Ci1alK*O9*r0mrPSpWMeE[D:,0SFDDHA=8jojFMl'i#;"F2'O3_4AE8HrXCO;;T7Z<2T]G%EZ-3aSpM`3R4a=m01k17U<06abA`$d-7&m/DDO(0eD.qIA,Eol(#A2=&srL<$dUW@V,5b'WJ'K@t*[eeR,ZnPskI9$H8,O4AT<p^ZDHdP.<Lch!R\8?ecH2;AnV<nV9=E2%2[MKG8_IoTr]cBH6Ce,8&LaJG&>e+:$9oC&P.LA,3,\?/pFqm_2G3J?]#\FCKh-J#&a+gOgTI>Cs8[^3%G3AhLfU1b!iRj_O8]EZHX0X:_A'ga_gU-c'gJlN)SJT,A8R^*D/_W5>n=PWH*&>A9.*s^R98._+-4q<ZbKLc.2H`O(8OSERjC?`_YMPT:C5WRhW\E1cV'nMd0CEn=:ndgYM*_c~>endstream
endobj
101 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1359
>>
stream
Gatn'>Ar7S'Z],&.F)G7+foq;AT)G7DSVRSMnM7W#\]('3D6)=;+^BHG9f1CgLLL/&4U+T<q?:TSATECOPl$lhoc5^r<hD1U-KTt2F%EXYkeGcY0K5'dDMMAOu/M^J1Sl7_@(pELED^*B3]I"]L\5;#EhYZ#RYHrLB!HdQ(\Mc)Ur."%E:kko9EM2)XIZ#gNq]PrXGt.L"/top0[T@8O#pUU!I@s$Mj=IFAf">(5(phY6/<(&PJE%=I-B'&`n9h;,6%QIiaQt9q\'1l.T):,P"\q)_X.6lR)Z>=$uEYP\FrF#0WPXl7,%\M65%]:YT2lXf;J^SeeLi>VA-C&@f$Jn^a+O$^GRnBgW0sdg;$P5bQk];m*]5:.(ei1M$j2/!A+r$4HsInIpUk/*OCQ1Z^&RBl"t'+2<'f>#g3d;l3T2;]G`JJ0JKu#Zs'5B.E:$CA"5?Ct):.d!_m.jc+*ZTL9\KE[?:%m;-XK%rfEg#,UTJ8uNd\?("T9>s\&rgT@RZEbW[-/ARLc#MX@/`Cu/.?6O%`!';4ZR+kM$=mtY$Zl%3H*]d<heQ2E`F$A@Ek"PghNQoD%0i<%*3aM7u\g00SLJ(k>1!J7L`umF^<3h;h,G#O`;Q1tjZkb>e@m&:-7(J*gd2@L.h:;4-C_!,=<PXHXg$/(J%$G$]06ZOq]^slfhi4V7a!?=N4b,#A9uRTAFJcoKM+(pPLE:o9;U;KEdTM?c%"OPHiV3G6c#Cin=[S[\n^rhdmRfL70&OPQPTi#^3)K16nm/AgDcDXo+U!S@`fUKG1#r2se-9?S;Z1KMYu_6F#:,3:PocUZ%/"i-9r$\AThuY>o2!t]D$0WI8Ro)<TZW1-8e@A_]\^68Y!=<r<f5&A*&lgBi.FpY-r(RCAqta`\0F>Dn$Ku=%;NN]l0CbZ)hl-$C^4oHX[<Z*fEhDeK+,r(eRG'/2eIuEXP`>IHeX8h16KRG'<jfK%+>EN0"!uh]b4&Z7[&mAN,B#A*ee",%T5TaB=nmC3/t@q8I/?qIGr2Z6uP3]N+H^YT^@D?n[:[sk7,Y<j05;`:c^bc4T3QI!?at@]b"`XrkZ7Q)+PYLR*%@V7!DtFA\a,>MeME#3pqo"^Rok/`d"h\N=nMHM@IH&;2B4-<DN^(A]l69FiC\#ZRF*hn6r6KXU[B44A,s/d8B`$)e;8*_[VDK'3_1GIXHX"p6\T7A90LDIt;i;41J2g!\@boP-X_gXG7jd]\B@SQo*@K;=qGiU8g+'](Opk4k=XU>^h8dU[PVV_=&)h[\4WZ`Mq//bDE[_=kAjM:JW`3BpQVsmkaoD9,?16bhM2sSk3rl15o;MTib3]:X=71i%7e!SIh=i#C5hs0)~>endstream
endobj
102 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3595
>>
stream
GatU6>Ar7U(4OT53%kY!Z\^/0=*GGgUe*W7DUPDe4.$0["LLSOR`^dc8PZq5ILiEY'3gc-Ul@a*4u])!-POksLT'+e)W8LIhL-Y7-qkFB9[/7T*SaE9I\)\mUhOPOC[!0*@p>_>l/:aM^?n)A>+/A2pj%UY8^33/(/3=FFSU6</1J)lUTT'a&k4gbQ`k\!6+0M_qfA/(V$'_p7PK+t]iOSrJ!8</4!9&`eIi?-?kVY>j5:<RaPQF\@kW8.[aKA!Vm^JAqoK6;1umS0*CiC2M]c2<fh9m`9\]IK47P.07NhIQi6V;^]QriZEp^b\Zk2d-GVhMN+g,CJDUjN3O)K^<OtH2?0Vc&YO*o%o/m--N6V.8H;$?#4>ljOLQ*U!D#lREoR$On$k[GI.RspO*/5P0%;m+=(UFX[N8]L_\a(CPs&?M(W.lU86^pd"X!M:`J]IhtK=k#eF_tXBopYn@+ot]!4fPh+jKj\UAE\GT>LZW&r76[r;MbG`=Z%,&W^Hd'qi8J<jJf<A.0Cp8>(!QOU<tIm\[YI>**n#i]7hg:1+ZbJ[7]"F<5!E:%?^L31-RRob1uY#g8T`c8oSG],*Xc0W.U>Li1&WPXdqgIXqNM/!/l2'dJ,Y*[RA#nspphI2lf</k/1g`cL3,%$D0Gn:.i_)bZ1(d6Djt<(*;.K\p=Ro#PkSPtYd$gaL1MDiJD%+enG9;Ee<SHS;n6eH8i1e6"WEp*&C_O=A><Dp;V-#BB9CqibJ*%S_Hd9VLMXq:7s]j_Ml,7ufClAB>T"=:"XM"G9/=/;Hk?V_21@s5gEgGqm_^.@<T%RF`Dc":s'AbRdA9%%2=A6J@3t2R<c+[*l*e.,1FR[U<j4@1BLWu0W4c=.Y[YJ!AuLnm,`NV.>-'[kZPBQe-3>h(/37Rr19;-Z'`0ur09/lr4O2D>ahfBBlXiqUq+;PD0G1&Fa!-3?j[ugt$dU=ETsQAig[S^i_ApPT0-80!Y8kC!Mns(6`M&ptOB$LRe\2P<h?6#t9p"Kg"<WQZ4@WhYKpN&t*@G=T2@WPqr#kS"4B@Xgg0f"-9BClJA[TP'YM/Z(BAC\W@!K./''?!cOBu1HCs0fa*:eo&=:hc`&-gf'[:1O@MMbCF2,Qe=`:G#NDE2laJ9Ss(FG7/d4XI\rL8+j`MX3:PX'Nb9nN>oB__85#PHKC4`9lnrK<%+mf<Q=F%PBFGpd(#IOCsi[eNHLM9#A@OV!#^B-5/ftbB)&]UqF.QW-8HtqA;u9&%[*A6X(n:%h-\/<!1ZY*0e=+YtHW%WSZX.kq4hE"#OMH&`\K*=EJ?ll$ecSlC`6/N=p!D-/L7dQGmc5;uTa/;"-V\1e#cEf<=;6`oJOV'PBC2gH%qC$dWe'`qUrfg_ij'cZRW8;^*gIDaN??L^%&?5+FN-VBTZ;'ZMV2I#\PH5NjTHTGi.R8]8BPU?NDF2A$hXLQrbs4kPoUgJ:f]/.:<]\:44%!KU=V(Z5P_NskaRq-(3*ZLAmdI(0;R#*KrkV;Du.KBt)Ea\ei+`^0S.\GB%APH*]qWZs$TVeOfd>em9%oV"hDkloiu&[7`8a%\6mP.MRCW?o"67H).;rB"Ue/<Olfrs4M;.L.P.b9'<r"DiVU%(<q9/-KR+2"5kMCTM[JGF7r_0*PQ%fCoE6Gib:RQibnQ0Y(L4?Wl):P*m]BE4B%*TW@5DkBU93pcO[K:N<LMl0iB_(sh6D_m$PS_\lgb=L?#</;rKI/O[c)HBC6]K;5_Phq=^(8VXOP]Vj;*bsn^qLU*m>Y39i-+7^,X9amY<^_5<H'[Bs+d^)g(QWWVcc)>4*rCZC(Qr^QXc%f&LVs[AAMh)sPMTNi(;IWV5`gT-[NuM^ke,SKMF?aS"V0QT-(3hV)F<EhN7BE1f,fHL_)/N)))89ZCBrNK>OS?<ciQN[.9q"P_b%Kr'ZKj0V!'N)I?'dR9kC_]ZK)a'"5\)jqH!["N5G%Es:LKRqI4EfUT#'"bhVgN8H%=)\-p\L^Gq,XAJoH4-qD\ERlV)B!@p0"A^HVXGL7S?ch)_^.hF9+bR&DUM]qOo-Xg\eKNZ9/e>L3!Y/upSj03^NJW]%)^Ci/+1g;)"=[=PAn"8g'g#-Os8lj6l8\>hH+e_7fg[D9eB]LKFtl+"5kWG0&E2#VT2ShQ"rN=Fo%,\5mGCmG;1_cp2NZ=4FiOAcY/i>Zb%^59idPLJ(\eUIUX;%^BEc,68@@mZ]l)Vc(lVEEDeQ?fN?!VbJ!;[>D<8G<KGd#'V*;Lm0@_B&fFWLK>6Fq6rJL-t8/!s^AEK1?fQKgn3:#fC`pnT%:_]+qZWHt/K^JU<nDO,e:aTpQ\1`]7f&*IW+/(pcBiTKRU\0s\2K8su2)-rQW&P@o(BFnSRCa$q`:5#0cf:Tt%sa6cRm;e-s<SM><o]6bpJ,BOt)W%#qh`c:&635/n'\#bWc^sqYuipBLV2a-HjE3cVDE:W3cNPRd2j5p6k0:/Ji8p&iW]?#O"]?C@/Ai&T/%X+RK1F-L\2k<4N"PX'R[_t^#[T_h+,H%5gU^uCf7sirWqr+pD,lbeiP#s,#0osg@O0**cf^5DXV<+aT^7&=7l@XYA6:%B%K#;:eL_r5-(!ffL4i%d(4<t>D8+BPn9WV2Nj'opCY$QT?(c<`64)D:$Q$5;7Ej,Ac6YoHYnOmq]EaZ'"oL+e7>DEAK_BV:%;+EY,a[X8!kj2P;3N7H%kku.k`:10\kWbU2HCOmBrOjggi]sg*=u3GN`l7!Y20b34'XN-7Ap-Z+hMYBQ&'c\Aa[Lp[_"HaNl0%B5]AgAO_C>m4kW-^b!VY3N%b+FnqFOS5ZZ?H)FAB*\M37,r0ECKnA+gh6!_:`ONk2\bOt&bc$8/:^=\iIXo!-MOnd.)D"C=UhLh6(SG6/J3$q=,%rS8OkPJ&2u,WW"K,WWIGEXV>NL@kc7"GshN0Hk*&='oEF8WmfrrT-J+72HRu4u&5@4j`<,UouIVe^&C@*6Bm_alfIERq9iUaUa6Kh8J.\3G;jg_@NRu<dF3r#spL<Fl'?L@Y>E.#FIW@p6QU?rk)$@FRP:"ZMCHX`t"r9_73%8<0)KC3:6SI5/KKBA*U=B(jg!_DSfEt9gKJpEsr$hO)I*GjNap26cC*@PGK?@Pn-;q!Q7VGXrkAFRW/a0"]bR1B:ck(MGnAc\#$D#D"K*qS@me^rH'&:rF->;QEpnUIXl2JB>J$b=&F.Zh2T6qIqc>4XdHBf)b'_,-6H=*Z]IGFr-hZ,D3a5TFo'+$XYP@$I!6Bo%V:"ZATT$4d8S^jI)-bt4_.48f[.6XrmYCFHLt?^YfkWo+."u_4]l\aa=dsU.PDU?8C^TNaOj`af>ZdSdTbhB?Y[Wb^BO5TL>KZ5ZLu7I-18)A8CDrhCiaP[(>C/]EMN5nfn)TU%MUI\obQ4HE94C^dWZg=\ZB4=B8;gYem%hXp*uF%QFVnhRgh"WfX/+9D.1Z#]_$s1G_ahZiT0FB]WTY4cTC91)LIr8W3k6Nd`)bHD-/Bbmb5#]9!0f3+I)4*bqO8&0U-B6c%-PT9F?t`S;2%==E@/&*#i5!2HYf&Ro,4Z/8;At0Oc%)Rji)d(*Tgn@q<A:GZEJUm/M[!Km`~>endstream
endobj
103 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3242
>>
stream
Gatm>D/\LD&cV3*_&a.q0?qW`oq"&Fr/u-WSt1eQBa\I0KrjC='hdOU06V_/rd0FMMNZOoM:*-YSP9PRjR@FS*"Igf%R4(n+2eGU0@8qgN%dPU%DnuSU;]XprSlni'>1M_]:*VF$e^gNIs<:s"0&00`39ZG)4mrl0%(_tGU>oEp*AVA9HBPJJ7)i]3As]+dH55kaa^<O`9F:s$&']er*?_Ik-/G<2sLsKVV1JD(#/Eb]r'K5W21<Ep/M\I&`a4Va;]d@pun!Iki,Oo"A>\e8R-'#\:WE,ja4B0"YIIN\pf=)=s#JTB'].9[<M8p,"u]EPPd[q;[94*O#>QjkSCY=S_s?a428fC2N:de(==t"rP[UA'J3ud\#CGO7KEsjiCgtL9t2cQ\jh.eP&1u;.AF'h7RorN_pFC"2A-04a".1(Q\R:as"%V$A\"EL);9YTBME[_HNhl#Jc\0[FV??>QRmBUl107`I@`XM4Cd#+(\d16\3p'll>HYfZqK(nR"['lMdF9u&\s=b+pmjB[.^iH#Nhq"ZsbCUfUAu,D`a9I!:dA">\;Wroj6BiGG=KeYjLInO#HsV:IG0Q]Z3:\RV8?OCnS=GSfO1*<Dmhe3LY@g=\SEW$Clh-Bc+Y>beX=6S?r+3ks%QM4bnJDJC>$@WFe&\B/rV9lWTm^+#MYMisVSo&r`dtfH-Ue@ZG&Fb=QPL<p[\6g[n3#6Wp\KV)6B2:I/R1m>`tF\#@#enO)QIB83"+;lWuS#qUX?5=/E+97,I+/:/_^;4*HmV!s"^l+<&(?K3%^i&jY@G#%dpIG5W3)3DdDYKPT+U*9]_Fd*&D\B?\53)U+LBO(`an4?AUfhoe]a"@)lr;5SDF,=C1(`iUi]/n=joHJpb\./Xd0gbV$e.T,Ql]$d].Rt3CTW9MnU(fn(eJ(;HMBJR,MP+(.+DPX^TMu4?<b_o5<!gcL2eLkR"?m7qPY(s"?:b39PUod'rHLRFe'`'aJo/Z=Cs?t(_jStZ!Q\8@31uQFQiOV">EXmeO+1ikbKpZ>bED[eq,)="^NEm#XHJ!SXUp;A8D,L@Uaq$ASUZ04ZG_cUcAJ.2ILb/oHP;JR(@dn03<E6IKeS(c]L`"Z$(^gle9Xs&gR*L_K=\^+pW,!X#(AK@o5O"'a#e#]QKN_]o\>d.]J5c_6t#@am+u6,i]:F-.2UnJ;EkLQ"'-#gU5\q_n-Hq1[c3A7.7?f1C[V``NQH1SFF)5j/53S>06bL=hXgOIY^iiNE9Qj4r>AVQ'I1icc;0"7.-GZM1g8Z5dM]][4rU[8\E/;I@DMIFh]oBF-*S=gL+I!!-9#R/oSWPh!%\)$b'<W?4g5na6"!!5k\p?ar\H7GIg@9TIFJZ\1s\/L81XjEo$/hEONNRPEmor6>1:tY&3!8s]SWIH7lhW5>c*8'hZ<Ee*tF_93?7J7oM!Nrlu<PHKqALTmdYlt&Il81HB=UN.4`YH@CFsO9,Ts7:dFF`rTf35bYK;t3,+`BOQCfuM4b+8NtBf'Z3[DQNS5.e!/ihk9*XQJ!cDG1Mkc^X$D6Yi580<hUW-Al%hEa1Ff^i&0]D4QPXR:=Aobi*C2!ggo"&#42%t1#K#5m(Bar]r].t)&e;*=V@AX7L9_;qG`:Obm5h</O9[!fQp5D;V2OT.=maXCdj"WYO2ApQ\QM47._jYaC@Z`+>hk%@k^ZW*0B4gR'VY'NLZb+uXgT,Xc+$V>:i;SOB:[.!#mWrl$EV<8')t4$"n-9W<q%$1BI*3$J8j,+F3%?Afeg]qEdncp`@CQ+b+u9B`f_m0X^$N[RG/?V"Aa.Km?*VO#Cs$c*BA"bI\KCbkKD\O&]aNF(I4'_ur+s@PmFd7@G:M)!>(#ZJpc%:!?btT-6"HGVFAXi,8fsY$dRR"Nf0'Ng!*<)FYsT"@K``e-1qf<7)HNUt-hh2VIeQTrAHJruj^Y/mBuXpfVf[KTQrBbpoIeA5S.52s4>u;h\1k*q,HFsY8M%KEVC93#0+r//j_UP8H-anCIeC\?h1"B/o@FO(;fSnUYl_c6?4L%8cm"jM<WkQoF=N94Hja'(R8Z+R;!/^F#[XV\)(CCu7C/]P$?RHb>:2\KnVPf&)cU>Z>CSMh%iInZHQDlh1bWq/0o]?4]"4U*RDc'e7n%Omn<u_OIEH=t@C+(-]*YD^Ki!1/<]M*DrV\FOP;IVLRVQ#JZNJeKq==D!J#A=-dD*-%*.&>thV![Kf(mN:SlMmraK&Bm.cG&8Qu,J&a!mJS(a<rFFr-2;C&'A$0>m-J*CmgCC9e4;\NVr\7'ftIKB&5M8gHIO?uDdEY+LE?W@F4a'TAH"a&9`oMIr\B8]mNkK?FU?o_"3Zng+`dMBW=aP2LI";Jc"Y9uH@Z\^o-h8p"2h59B1Y"0m:Pos5?iL^TknX,u>SXpk$SGSebtY#k:UO3j[<ZH:3-\"_pCr/rn(U`/QI\g7q8@"&.J'a>4YZ_Y/K($hge)U+`6-*DamFK[qX1>YM@&h7EW,)Q192?=&Y:k]>?KS?J69i'4(of/G0$!*Bc^n^.6H[UI^A1R(IK`aJ$:.#?H5`dpT?paH$Q9MG!g*MQ!.&@$4&5&YEHH&l!SY`*NLG80O\OLU;#Mrhn25'!7].3a.:NB(Zhnl0"GD0:eCsO&Hd#m\!qn7b/47]`g!g3s%QYh&uMdM/ZDV+:Qs,e=coT(-8Gi2&4_]&LIJTG>a#>[0Hl]gcNQne*gA?+PF]he7tQ-j)\dl"5bq57ood4:VmlQ&k$ka-$n=f3]A'gV)_hGh^lpPHM)AaLni'Vb=.C9`4+LHRXJ)8CMUB^1XmpdJHZR0aRm*n/UR]-#KY(%I3pL56YBaD/DHiC,1>DG(+$.FMF]Ap@0:NbQ8++cQ^ar0FH6Jt`tDXiE?4.,XZ!X]E):58%_G"<qt=Y;N@e4Vr;-nW$=YRp&UCN9]MdL\E<P:SB>hZ\r*V&=/6T^M>9<XHIhf9i+igjbE/ejPb,^W8pJ+%(VsaD6HO@K*o%k=#dkY2qn#ajR=3qhR[X+h*kX:UYq7=:Z!4"J7!4)+0Q]\iXXEkNOF=*%ZKK6r#>WQJmT5q%([2\<KOcN1Hu<kiC;ahTgS3.#CZ(kUR?jSMbnP=<_".h<dm&mG-2Fq5cdKYRdn%5q%T+/ZCB3FRJ0/phn=Der:[jR\mQS59]`Yb62,2Z$f(YjNA?qdLV`MI':NE?$rf@e?/P#UHT]R0?g]cUAFTn=L?B`^I)aeRK:A9JT#^4ghrs-N\KI-&~>endstream
endobj
104 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3841
>>
stream
Gb!;gqet4K')k%D"bFSN]Xs!$pS0l&ONk5I*;W2>p\'-70PHl7e]=I88pU@/2q3JC>eR']gH3$L99U8(B1U>B%;?9NnCFmpr>e5>0@9X)L,9o&2FoV='.r(8=,Whl7p=<gZkV9&<"h9pX&t*h_K/N_%r+FsY#oAB6^l.^he!L,/l9gLnMQd6%:86\VESDsbn5;1$/)H.QJaIMU8qEbf47J@pG>W9N.+6SY94#FjAKSYlf-Ycp'gaR%#LV'(r;hEM#EeX]gn"0F0q"mMHp+M4g=^8O67b#X"i;1U)KJS**'$K8PrdLYRI<ESuk%+;B/@(9F^VYMVp5@!F'f+Y3@i*edN6+[.sknnorL"1#&-FR5bj#IMNIIg7V^"SKQOg#3G,rXU,[ORUhULc^hjaaMH(SOCRI>/,aiL/,5VG!^-J[m#o;rJPS<iUKP%"3iY,)o]_\:2k>O0ePe;'F!_/V#t^Y[,S$u\8USlN>md3mh6sVK&cHJ;I\Z3O\f\AF]O8HA?FXaa9SP,Ghn^b$,$:66NF5@q;F]7!P.'Z#Y&qi&Mn8UF3k[LWS=Q7amFD_LWiT+qmJ_@:h[LN(?8OShU](]o`nFD+O7s?)an@Q#jN3Bq33q8N_f:5,pjLe^ntNJDBc*j5es>l4quu[j2eA7`CqCasVnCg/T!5bd[&/3UO1",B-Pu6thS8;0VP_K#FACiU?/WbfjT,VbF0R\p,[0YN&1,5+QL?Qoi6<bX!sPV(:bj,$mM7bcSV)<nKMkPY9"h.MZ$q2KjX7m)cnn&'+cB(#q+Gt^:g'd['?pK+_;DFdMQ8h9V4kfQM`4-+&ar=S[B&3jPX9J[<N,TZe]-3UeZRJt>mu7g=p:/5$34>=$7M/S!4-DT:b!sq9%>Da<*$f?W`;;5YL"gFT13'E;%U=ThNg6q=,TCBrUF9m#lJOdd#Ff3RpC@C!9d2*TQB8X86qnP'!g[#^"Cl_NW@f');t)A"8`k:"Yq0NW@cSuBeb.;@Glb\<R]b^PWF>D22E?&fJ]4MjoiMD*Aa2MF22P8(kW;:)"h1sZ0m$7EtfGG1IX.)2OG"ZP-SP'FS;FJ\mh`6U]Cl.!LQob$<1kom#LIJ4Ef<\(0+!e\01Z&n8T3Y6[V&61TK3]7ii<H-dFfq<p,X"pm*I6Js2EN)=_DdE5[\e=(E7<lfATYLH]6%D6>CEqY^]3!n)"[3ud.g.?]ZSaiLf!h==uM,30-IdOe`!`U2cF4`7e?kmE3B?]o8"Y].dS/INjq2s(c;.>K?^3*6%bd1+ggD?_OP1I]#j%Eh8%1ip;<koKVdOuOS#5/KC)03W5c:5fj,e`roEeUSFY6As1@mRp@.'2C$t.^a/?L+'\j7Bk;i(g5;Fp+2(Li.=t?foR'<.1OZ_k^h-XHNqQE2feEkd!`="Xd6L=9<Q;JQIVG%']D("U0Ra]-X%JqJ:GAj/EsU3n8i<Vna?/W?S'*DSg7G*&NkW_S?+]o>KcDqqK"2RS82#?PG=J<->c2c%!Ouo-@egIN#f4Eo-B?YCF"NK7kpj?@67Jh$fW#8?DU`YLBHde'bnh@\&#<()T-=:,$Q/M9:D8EV2R'mKh=X:pN#`nH;UX+%F`O,PS'q$:tBhG.LZ5gWJ9$HW%>hae=sc97[<(SCOGD*^o2P0Oge^i\nW3pAEecPk8:)Vf(9s?>h8C)L,jr)4dPc.dY[e)Udnb^,u*Ek;[Teaa@dT!F6#bSRcYI8E6Yu/YHlT(=+;bH.)SKKQ^1&@]d@G5"d*1n>aJlSaUdneH9h9[H&"P%?$OY^Jcp/)4pXNQ"SI]$5s/F43h/iR,YS/:BuKT'2Y5I>S]2NZ0$*8_O>S?6lD$?&;j#i)n_7g>3N\Eh:9-V*=VG:'U9J?,$arB0H`Rt4m@i)LaBb6pV)X43G=Gcb[M6Dg0J1]ga*S&r[er%=Qf7uFrE;WnLq8&X'"UFC=\_o)C\eN/>R8Q+-h2@aPG&tod49Dpip+2pV^W3ZS5MpO*fQ$:^dMAuj3rM+Br2R%::CA^dJ/I7$k9(+WcP'EW>MOo"I<Yh,.O7Np93!^UO5a,8l/'QlXW(d$;JTf9KR,2MC[te[XVEWos5l]h"EDT[;Z(&0m\JDknQ:4%AD)%N8Cli+gCo]Wi5@BhfT%p-J.P<h[RmF%1^VN(73(sg]KV.p_S&pR#6H$h8@5Pi=OsP*/&POKL,1Ul0kWZf2g,hI_WM%VB9,J>>Q6P34sD-C!U5;"^TLYD.:@Z'sP1u?$ChOTceqX'8@C[H&6ot-&FoD#VNOJrm"?3ouO'S;[0"V@CW^B$q-TYb@6HEdsa1@RJG[;CDtH26_bcth1laIZHA+)FO>M^UEU)o@^A.00F;-ihVrJW<KQVl^PkVm;bH)&RJd#Df.hs[7;F;V5!%f[Oq$1nae$25cgcJ1P`:!=YL'fV^eAuCINTCEQ04>Ir;Dn>Vp3AUT+s:rT-G6.C49J%b^,;EF\IFqO'/ak9)"VG8b^c$mmu5t4%N]I-jP`ml(&VZH=OO"f,iB_F5NdYdKtKlPYP2e;nA^71ZTJZ0H`5;Zu0fT=e``@3l)Yh]Ot(RmJ.2DG+?P!milbni2U$3N=__WcoDRRbqhcs-!Pt-^T+eN(60P7#A]LQq-hFl`YEU(Bh%h>L8S*eJdrG6ZSdH*pE(1$V5kpfD;:Xr<cP6ZU$Hrpm_^0Y5oZ>K$..4d.%q5<K+L7d$C[prC2>[hVK<LV2^Ec!LNf8J2de0_h1.jP:\V4KkDd;n-GSl=NUf%J:,,;VI%4]A&K3Whii)gB,!%L]Ir7i2FuapUU2.+_#sUfZGN0t?Gtc&j5#)tS#ttP&>!Ig$0he9#oog*6Sn\46&>3_;D_#B(!1G\Pd-N1]c-hAu?Y^ut#l(gi-CT.c*gqkhV/alD_eu*n&\#=47DCG*%A+XcDTBpf359#.N!F<&lS!5R3:,o*-NmWRCo;QQRDFW.K>(T6FVe@&$iL<2hNfq4W4+&Gl#,*o:S>9/0AXmR*RMTLe\4HH%L7hMM!2Z]VDN>g,@EIo/e/N.(B=g9+4-Ut/-(#`-is%Mc`61L3h(U9[\pb>_ObPGM4[*(hAoQ4<PGZ*;>Utj@kr!tpiUb;(f#ru!43s*?4^Gi]+t,.3lNh.@?(%^OF5ZPnfU"a_N(;5'4i%/fM4Vq=@XVr,CdIo+=E.XK)I9-Kd08=hfH2g@oQj$28'q`n`7;sXCf3md4mhF8A^Rh:RQrb"j88/W)(]pd[aYDeUUEWV#famNurP@k9gOjWQI^K&`=G??JLi5):*Jr#2=,eZ5oj8mF9),%CTbJCr^:p*NQb@d[=$^RUiADXZ[Qe$nrpN".j6E=sl,S>[-`U#1C8^?#0gt<cSRhL`p"XK7ZJ8Z9@377cD6.?NTG<Tdo7h75tJ7K_\'?R-_mTaL:1BX?^i$7J0olHXrEp)RLP/l[$YkGe$!j90irsV]ia&aKqilP@G/8fDI*UW*=oH4EW]dZ'd,4S]LhQ*g7%m@Gi9n*+D[`g&h"OAY-ic\P:(dB&FCo;&+6Ajs`Jh:_,I_)&i#p*+Lq(8#'G1o1eTnfm0XB=m:U`+Z8<[q].&ci>t60HFp]"qH6kio4U5V-*Luo#-H?omHT'g00B\/:@l3OQVR#LO?r-W4K.[feUCTj_G`Vj#mY&>85I>k`V^SA$"1BLd,G??@/_5dJ88PMT:G"Iatscr5@``KOkW/c(Ksd&HUD.pI*jr,Ef7gL_H$]lj"r#tqOj^uSm_<jObtLc1Q#eBDEAisCKM@"[kdqT.nNOLN!N\50&J8+!TAb-Tit0rWb0WCgQCK_Rc`8dn?Y_hAK]H#lloq>6WBAF.urT!8@K:+e(b@:bq.d>Rbg;Kkifd]D$17~>endstream
endobj
105 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2695
>>
stream
Gb!S-BlE%SmCRiOnUS>u\$<$^X__2uLNi&BLS(\2Zp9.NCl]UMk_^WuPCHr"/k]NoP+:[.W,gN8E_$\^)'2.1`#k0??ap(P((@qj+;.d,+GuhBFU]RrpY6u2VP4EdTo'1j3Y=d5<,c14&!N*Wr6V9[ba&n\d[li!L[-!Z,R"i*&O?TD74(QUIpIWA=nJE:o*MMUOG6f4iH\`6fHkDiLTNr/_VC42HnoRd[?m!J\Z;CDXlE^2k71c[c2H7DZe)u'@huqL8Vm6?0^inJ^KK,uBO+@U#lQcAo(d#8m6OXX)?L9b`?KSh,YaM!5BLW;q)ST>/Hao(i_p+b3/C]3@P8Q,*uT4\`t)a1]_^O)r*)]ne>$t0Mk]un1[ja/9,c:#hh2A\#*[DX=o??!dJp_LQL1tk5ok,k!>#.Z-JjFBiR@h#1Yi9j/f"AjEDqW:\D/Tan\dc.g^e&Th+Hd'*lTs*<sn/[IC,ZT@^^XKGUNDZY8A$;lCdE*+)DISjZ!dCcB:buJ>ns64qF%$*9l^-hK^R[Jk0"#YHNO"Y5(Q&rJL_tEEW5/.2NOOP$dqF,aon?3mi4JZ6)@i"=Z]_Y";Ne4@PCB<1!lHquo]Z6lH56gU#^qb?+IJ8%.m>hAS`S]O=Zr,0)m;Ha3%)oU1NI?QN&ojCt)O.:u9ap$3'3eA]<.T2aCYTEpG4JeSnAkncF?iLclL=ECGL[(G!oiIL)d@!`<bD/]"Q%ZU;LY,rSE:f@R>]4?p#jlF.C-c$0#$dePDV?Ha=;#mcckUD;.*0N:V2i&MhaHe.3[k.OHLFMZDb8_=8U'm\<%Lr2Ci?*S1*fD612L^JQZS6PWDQPVsRbaW0%_$^+cN3RCFeTX8,pFF)FDH:s20FI`VHf1TW<L01:-qXa,peE&O#n='Y9:;9oJHY%I5gXYk/A`&mSeVklrC&Pl51G=mgp`,BVlhMAk@$te)1PGAatF'jB>9+C.Dc\"].mf&>6.0bArSHF"'!J#"o.brs\,tNOWMQMstq4\`>h-O7oqsrH4FA4?Sj'\FeHL)0l.D%>ptW0Q*Im+2hM5@4h?n/0):sb"WeZ-I5Ua<A6k9m5c"(Eh\L1]cnp0r4+22L*WfT#dUFd\cIDc8u=qbSirTUEl+[r&P7TUOn$5=eRp/LIkh_.Zj0#ja=4@jR8),Z7_5UA"C9f%9lpuqSM&nBU72k4''RHR0E"`Gb$^#1@n.S#&cu\)^QWaEea=?MC4`CBjq4DqI2]E,Y9bi[VEbh(1#9tOb!I0,+RgCun[??/9SW9Ml;a]%%_)820/;>OZt?GJU/&k\EVm9cc]6n;CjEfKL#T[baMK7c<HEq(Htoks*nXaU<'K3.Fju<J]6)Pn6UaKMFG!(c8)7^rIC!*\Oa`X#\oVPc(<JOb;cQ1jZ^t@jg97Dd'm1n\<^diLO&s^>&\_CBXnWp;VXDB,HW!osV--J"\+rRukt7G3"QeLX_Y7Ms_/nKprf2KCo`RY1'pZT&kO_she'mc2<on5j#okrZ9)rGs]i]P3DXg=9qoN5<<W_2-#@Q7c!oPI3@'Wc6i$\h<6<+*F-jS\/"Min7JD!d+J>3fD<&q?>(V1Ft6Hc*hRYZTS5mI=b[UR$==Ha7p=gBI_,XZh5>Hm:53]F]KX_Gd*TQqgcFp,PB]^`4rj\K#8,-1J8`R/!gl6cW11at3LGQ<a)Kt"qtoGXt#07"Ong\$=Q?4=(q)=k>#*W)PTU0Y@[_m0FlH*M)NHn9c<jj$8f\HnD(:8lQBRjq5q<!=WIp>h^uVB1t%V6FiIgP,"$?,gT..Q&-r5*'#H'OI0!1:h]5hB[&f\kKmk=td04(,E;3^X<YBW7;5sIuNcMMa:CeEqF+g\R[5%ET/`khKZ+GU-?H(ZGM%UP70b.1fD)`E&C+>d+Kgk?=Jd2)VXiK!nV;$1jhsW9X]cuA)Vr=HY[$r8`'mG?g/?m=MfKESt4u([Rf8mJAG$Je'Y]`K)=57$7C45EHu`uf+Z23;!65eiY*/9NGblgfCA&30)c#%IgTj'U#.I%Eq8=i4_2<%cYkD&9^aT(Ze6d$8!E9/jgd7_]7nGo0p4SOg$!a(B`YsD/:7ZfmL]7.O/a/d/F\`Gm@q%0,tV/AeMNLo=-?N\+<5CNaH56Y%-BBUb>+TT@OMEC[_ANfmGb-HoCbnl1,FlH%MP?@&8jTI/7C4<=b?6Xl?oLJ;70I^)"=CSCm*RanAKC3.Qd][9p4=t<$3jU=_AR%Jg%m-Wa\!f`f;&(%a2@rDV/KD@RpPAPP+<bU)F3P&U%6K\;?SM3nq3*W&9%\s!!,\\2X&p'W&(,,aV_G39]'7P3&hUQ<EKDc)Gf/d[64TB@5PWShKlTIWR)2C=@g8jR&e%W"p+<BC_+'*(4GWCib9"NIZjklN3m)5i`p/4:0Q=rdG_?I^H1CL?H`hiGZC(96/B)pLUMrnIuT)!6^dK;o)_]b4Sl!&Z.NpGY,6If,Jg9k#0se[`<ZskZqa0DOs`PJ>6.V:4]mhbUJ[:.qOr=%TXLe]`"*b#-P'b#[1'Sl>LGD&s=N8*^Nj?\9c)9N\8*^$QT2kjnCcd6[*b&hWlIRhm2R8VPW&jGf7B9nVRR8'c%-1iYch.(2iPQ(<dZ/Yg?_0(k1X1LpAk;nZ0n[j^t^dO!TRS.tm+)m!`hJJj^MUd'BF>,d]$oJhEMsjplu8Llj6]YJCb\NX@#pr<IFH(K^~>endstream
endobj
106 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2095
>>
stream
Gb"/'D0+/q&H88.Yldp6kZHE,hCMUZ#uI98BFXM$KeOQN3nkj)6RO8T^[L#NZ=R1EAL;e?S4#R.hVR\WF3h!W5fF7rs4n7EjTGd+#S7?,3=oKD@IbK=S6UHV+GH\1.-AlQFg-Tg;)MRuGpp[hA8>tZ(bc8I%)qSL)[a$`0pcnqdKT7oKtqrtE/*Bl8hG!&StXOWNUM8_a,qGqT#0P-9V.+&5N8T_"k-A.Af#.>Jh!q6'>o57hSr;EP&#l0V6F%4nbE9k[EgW=:?6uP+_?\GFCkQ+GoDIK)F;D<q+ZK$!^Fh0)E@gd/A$tl>G]l"F,5Yt#%$\SqhdG1R\>;,fqrKn6*Ui5lNDXLLi=9hd1'<RKUU78)L;PXB4t1j$5M$';Gj5M*U;6cP!Mmtea+B^Mn5hQin\)o&rRGT#t9.?6k)g?cWn#Y2$Aa6h\r`<r8*^.+gtQ5L2'[B<V&^3^Lino#;s]TklPD_Tbr*2"\EjQ:[It9nI2+;3h5fD?h%@1MDBkX4AO'u+V-%uQjX3nEMQeCAE$FmH@Qr.c<^:C?j/dSR1n*Afaum5p90(dNu/!p-IVX;Er@!531B`&(#mP2D@qUpbi,G^`aQB7r+lJM!qR2ok38!fl0qqBY-6`6j1:3@dnu]TrQ=`I@s9J[`EnD/DV=/4aI%U)iO9m1%?R%(>j\/RnkKF1^?J^.Dpkl.T^,!+)-8d7q=h'IDrT\b)g6C`PAuA;C+;ZhR%7;%4h%r%63;*9mZkCXj(JNjj:]-ROLfkcdQ?>tKua?Y&S]hS_Vb._m6V[g9/d.+YFjZX?jXJ!CIkt1>T<od/Hon^^:JMmh<@orRa#4@WX*QC$F%TN"?7k7=B[0U*0gRF<<W)$$F!9)"?=O-PhPpC#iE(C_RGSC%>6aK'P\6%p<<r1WE=kkfcA(FQMU3t6'"m%$RkX,?Z*Itm!9"Df-g)';?c[eoD3P0TN0tpS$bt)Da\bW)RM*?0"i5VH9%.TLbZ>//6fCp8*5b>O%n:gM,QO**B_a9m>a;&93:Y<];[#r]Q@'?hEekG8a<oMn*7.889_[V9WoT%QZ:0P9SQ<.0lQES:(+*6S8I?2Jq<&uP\JsZ5dL!(pU)Z%lISr_rd'JFSs:IW1#sL`W?f>B'HuN-MO<A9Pp;`jAeh:GfZ:*;Y?LD4[s0fjS</`g;RgjP&V=Dhb]fO'MP!'j$gE7S#D-3*R0.qL'32_.U-VRiBI>\0I1<00N16H7qG)9Om];!lo@=WM2Q'-UV"'>]4XRAtll/#3r'heIMMf_gXV@X:\mc?\VbRr*T;[77K4g`Pfpp/s,O&^/PE'+]E\q]\U5:]AHLnMeOYcZIUd']oh,PB/1<Yj.?r-nn[FG;``o)jc$N(qVm4uE=P!/H-5;5Iq/?l_a<Do=@-#?k($bHd*CBZZGS=?^+BUl@*nb.U!qTeDnd%-tTC3G>22j/VKR>_B7=5tXB[N$=+pIO.H;F\mU83)45ka\uh*R`(W$u53k::ipD*I,3I$VbK=(H!P2"cdpkMq:l.h0n-1OuH+*CcR)u9^eQ>K'S0sPT7^".R;HiKZ,BGYJ37@d0l-X&"&P+>a_YY[1]Bq<mC1\P0m+NmluO4T3p0Dh\SG)&3Dl[o*-.pF#%BB5P3bg/pVWEA584<JONlX@j+7UEPUDdjKF"*%&GLoAh7U+QH-&UAQ,SI0kJf_Y*n9jh/rMd^nj.L\ag$';jmW!I^askWqn1)P,9Ij[Hu2aLTS/n#4YP-TuB>6AL#i.:4.j2RGFU?Yr-6JB]_K46IDIYRu"W."+mnqS>N9_%(7:RG$V].'j:-6kEoOIO'+Lje`tT_nTfr:@n7$I:3s5glWiDlj_oj(IZjR&FX(+\haKo3?Z&5Kldgka'MC5rCU[mhKqeM?gPN3c'_S@TB"`!5N"mVY4&dNLfWE`4.bQC2WRAePLV9OLXf@*pr]TacMXhH)]pBaiaRH1Q>#_cs>PjUH<V/WW1RlET[I+XCQrD]\3J:_G=2/)3ngA(Y(M2]V<*qOpfd_u+6\dF,;u+ed3RhCY*-P&6V%[=+:quF)=3I#?@M\F5.nMNRMD2Jo5d<["A1/,DZX<cdmO\PXrrGkIW]'~>endstream
endobj
107 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3336
>>
stream
Gatm>>BAQ-&q801fP0JAPr>@]-Y6'qg9esn:6OYW8tRr(JLF&u9G.a7b4bZ(B9tQ>Zt.'Lm)1dg&D199qsB*C^r1/lqAH+0Ik5"$g&fHP`<ImFE+/8Xr`VG]p<78`\t7l9T'8QQ>)):c?$m-;nNj3[.l9@jUgSoKo^&spF1SWU`_@ki0F;^[M]J!$**Cp<!5Bno:asT?Q5;2^nJ)hSd(Y"ipT_F1_!mBQD)Zg2oXisC*:EbpYiMn>K2erW-h[HO$;i8_8cVXiS,ga`YagMS`?Je`EkB91Gf$on90m*]Fp43oOfVtkE#.gL%EZ;VB=1d=UFLB6[CT$a3Cdkq5mSE,^nsegJ__F]fd>R-]L!L$aJ8idniRMnh49l\1='>Aj-+HeQQHtZ&/BT;1DR5a<r-tH.WNE`*L.VB;s@X*"\76DVA*BEY_&EBd0a%t?1;WK<+),ur!M)&%I=?A-:KaCo/4E!)GboAhlnk5rMbqrq`*TQGuCn6%<OY2O_FrL'p(o*-eP;)2\R7LT/FXGmjNMb5?t1>?R90OD=>9'%V.E*-klR`:QWa]ZWE!>XsCi-oLrSIPiL/Xd^W#8nRKb!Ck7:,'=;E`64!mG_pTP!>/&?LJiW;dG2+WIdkEr:218S3hrgd7n06`EhGJ6.[T!Qq^i\9p@\YK;hf_WRB<taZUb^c4\N+kK(lT7^\13D1U:]UR((HB4@$-?@%;J`,F-%@PJUufYeT\&mWI1g=)kna*`8b*F2DRk=dtY`3V[TE>SR04)DU"_j$FW7V@EmkN-!7F<%j.&Yf\-V^A'f^7=gFhN"BmS?;T:6(&qUGs'G,se*(dMDP4/`;JnQP[AL(BVN:1Gqb]gs"p)ca`gY.H2\7XKapb^7&;m[C]GC@@sdQGW*^>g);1Z?`$ibd7Tiq(n\%>3A@-dAFNbVF\cm@p?mKRdN0PXWO:`ZEn0-1VaCG![[!9iFDE9LZUl$>:CJ2U)F%D'[Q:b[U5:%]-:X%E9brkaQelnY_FWc/GiF=p9Q"CQ,nj@4kB%?R5?XO;32TL=IJQ6RU?2]$[(hkS-"j4k9r<ENH]\RJpLB5Hl>DJ,TI)88mV!AGq3@<`m(\=@[;t4<;DD!O"2Z64]#IWC.(RbBQo^aXU`HeOnTs#.>7:p6Fj+Ooh%\$5&Y(Ui6/DffL!iVR5CnS_fbs;I6PjQOpE_q/mo:VMNh@ggPtNF3P&fM@taq;]'UXaF$RLES*oP%[/1cA$BT;aYaXj+c#B0Kl2SB4Wt3"7A%U.1a/\tkgnpYTdOq!J6*PZOmk@$r]sP@F0b'1GTeJZ/ti3%>\,52NjO_r>3U]q4F][^SLE_];:;L(s,:*.b2GQrb2Cn6lB=Jq1^%gjq,&eI?8g_XnVW/2$H6r1VAU8XJp!W@kSVIJ3r-KO+SJ.U)UlfJc9,fY(1d^!2<J6/Ho1gA9<QsM`#BR]1RFATVcRErjg'4M@%)^XRarATJEad4nSH59Hq#fB7$OrM=?>aY-]E)MLI/%SL'BBhajB=u0n!^^4PIna<@&El.AR#J=!7*E#1LVY<lB-uTG)?r.'1''B)e\B"BEhIpAt`4:(Ul(.RPA=UI)>C3/YMX*I=d?N<._<Uk\)!n::<E3o%,M-i2iQ8Fe[cS2lVo^P$DBB/acFC1IRPn+Ve:,`*#ORL'^IieUIR:R..i1cO4jq8bIJlhUBJZU]'/(eP$0pt'`Di"P"fP":""E$CoFPSr%5$7KVPR'kJY=HGoTVB$RA+`H(!#3?]UO[U2(*).qT6KAYkCs8@f6PS8e`*\*T:#h3/4,@s"%[LdA@(Y<3<mmYW:K9Le!/>5#^-jT7@n\7aEA9I;C?=nT"8[[oa=HT?:3G>-+d/DjUM*XSbIU:eW$oih%&@dkX[Xj_k2n+0FFnsl^n%XoXqr*7<b3P1`kI"RS<7qu3c#5I#-=3fc0hqZ6rJ.FUSK/r1SKq57R`iJ.\r#-*N`?u)5jh7\adNT6t(k+n>Mg,K\!-^q&ZO#E'H6II2<fUVh\\Jm\'E&NnRu4OX(S)p'm9H\]B#mjC!gQ;p4rN6i6NrhSn/LB$Y_1QfSPdWHak1q>f,%VP'0k_V:"-Ee>F]@);$$a/No:le8/a5K*n__I*r2hd(7pbqqH1*kGO*G(T_Fo<+7XSf9iD"Ef"\1&K%%9kRod_P'XF/b^5eWPfM<]8n8KnBothc>%400S>Kuh*P5u*6@3sjaTM;LQXYZoF2W:4IOFHJS32r$'.mEHEHYtV!<]t9Zh-JXC%"ai#$i*I(ihcVWBXgWjJ/@J]EJc;Hs@j)U)PhBR?b])4hND"'rJ&U5Djj(brLZ<F(PoHscR4dkiE/e)3[LpGttF.$brp$l5VMUQ0VtH'"_O)g_8+\gSWi\jR\"I4Pd^WcldFUT;OGONf<ilI[Vp<4*1m\YhH"4(^E[A.-R);qQ8/#eKG.+uJT[>.s/d0f>a]rDT1K*0<MZj*Ep]-VeNI"TM"f=8./WR#^9Zjk@Cb%5Y@3cN1qOqdpCk&U=$)[0Z%853A'AF2PG&+/Y?V'g$5\_'S?XRGrt7.;5?"MGYtg_YA?H&C,];?+bOAPj3ss>m&<Vn%;A:Y["flFkb]]>$tZ^m<^VH8c)YXF.7_@J&9&E36U`BKO`::bI)pL/H(Du$t5<[f'Y1VrcQpg:8"kggYWWB$&(C,L8D9.[eacHFq'&hN9IG1CaCeK)Xs5P,I=Np[\Or#[rq)^UV1GeMURfn@gpK$m5\FX/'=PGk'AFL]P72M$W0!E=JoHM5uTns\u>#0=QtdF[Id;3*8)%LGTtQ'%J)Rm1I`T@UHW,0b,4Kfp`<J4N&/]1TsEB4XI+lgP`i30mC<0O1unOgmL^thfg\)?6ChZml?j;'+u(3;A;XQV<@\NR<l)P9EM3Q[a6rb0Cb[OT)JQhO?/omfGPM4(1F'7/f<\l_qpV$I(dG0-7SaQ5MH:*h<Wct6^,`]?*p3--*+&of6#Qb,g&\kO%H,!E!4fd%J62DojZ2u_d8&Ld\!)HlZSEp<G8JNnhksqdjdLqaj/c/sJ7\Q4KI6n6)a;g2J!_g[:'/:X[G?o>N'ke4D>rW+LR5I4GF@,lV!/IB-U%1@`:VYKXu[Kd#dC!QGl!_19UKj\H*Kl-*9MA]P(.BTEoee.J+O5Q^YgFBO"g=2h[9+8%e?Yt-fint"bo#J?0@f'WeUmV!0&f4YYG)TRJIRUb=VR;)m+jSH]UT29_/p"g*U:Z^0dgs0q#'>MbI9IWY_c+1YjanFH"_W47g>IkI*.Hg9,G$/[MeK3?tZ0W-q,K7j^.rf<PH"`kN#j9N<4Z%DU"mH7F0"D$8-H"PY^pb6fbB-6^Seh\g54ci+G/r7@M~>endstream
endobj
108 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1845
>>
stream
Gb!#\s)6UN'`Yjr`Oju,ctNrB'#&(\`nKj(\o-oC9KQr^O\#t+9B+HEkcq;b\)26>+G@P9C-!r38?neZT0JtBc'V>J5;W:\I"7OcW4at&CqsEeB%(G1hu_1/Hae?6.bV1f<l_4!U"O-!p#Bp'fBjS`#s.4c-V@81M?pLhO2](K%lKg!9oeP*@DTb"9q'GWs,NeJ\#9@!?\S2UE5)Vmi_cE1M`Hj:Oir0i!lNuGjU_Wg@.7\U9d2I&,=t<hI#?*Vq$Dq*0B1=FMaAWL*>^=\HIfjBZEO*`2t&E'cV>sO4MQJ+"_]TB)G'-!W[*Ok8+Z!K]oADP[dmr>P_bV,Z&mn+U:nd>$'']4B\n@PaXOX^Q)@GeJQ*n6B]\9/oGqA?LY0_.)&=VMB#O"dj_#nD%4P/Bg#dBnetHnL"eM9?nq_%VZ7*[MbH0(k7tBAUe+H$*8;`k'_Xfb^@LhpK,.ZMF;O*bSp8$j)8J<D\".@V\R+"d\X?M6c/IG8[&.dG(&&rE0o-ZU$`KR.1]PrEfi1_;am`h\7hul&=MBVaZXGLL&p#ndTJ,<OsY&)'Adm-FDi;DU4pZqetqrQqT*aJ\ir\fUq1'*P#c;[_tVQ=m1^?uNu5L*$<)bLl>fn_(]6lsU8/J/hTg4b!eo$U,bqML(8<Sq&/7mt.E8WL@98A!r<Je5rGq,_S(C`;]Lg"*^?=J4J,)QCO>H4Fd;):YbRpB>0WL/+FP=Cb[8^?(9CUN:]C=bUW0HGlM=N]3XPO$AQ;=0jn@)*,eh+G%.9nYV4\;/sY+'JOt\.[T#0":oku-l=i\D$VuLJ:?lAKc,TU35^P"dJmXlPd(F/0lg<C)fhJ`\]t8cDGl$daE;U@9B0NM\KD1m(foa2S5VNe*gX%j\@&.-G"Xi3/;dknd"9a3j[`g-Y>!%\d4;JEUK-#nbe3P7#$cn)[J*VhWK^r!iAiPtEqP<g.2=-[19Cs%he>s*aDY>lkT)"L]R-L4XW3_GL=KHD>u&5'HQKqS&=kPor:L=)P0>hW=iJ0o<3R<f1f)-roN`7EJ"<ccI-A]Q=<`o3$=(C")dqs1QGHOlZdFV_#?.HcfrNXoaG`Pn0Y!M"(?dA<4<N,()Wo4eThDUip^oWmc0V1jL;DY`j+pFnj1VL-^^X9_$uVlJkI^9:SLF)`Dd?L,\4%G#!DRUC_ufYF/r\rN@T)B1OBC"!<<B+BI2c!oEh`edh6DPa^>KPk4?b4!WRZI1Q_+WOq_mH77[6p$0hW+H8Cld<TJe+5`<&bn\aSWF/<_pN=DV,)juO02?su"*Y]?k"fP"o\7P)7ro\_Qb?F.cGSRNZ;658Ir7c-W6$&*8elaU\3-*mo(a0<-g8;;mZ-kOI.2;g*pSM7@sT6T9dD"Nh0HQS$8mk`Rjq[Xc"s5WS[f0%FfnU1IECL]lQ-[4lI*fl8Y[rI^3<s?Cd$.'Z?_I<t:mh:6Zp.qmK/[YQhi;OdH96N3/LPCS>r;mul9qhgc8G,A$>[op:K*#Cg)YkXd?aQP[(k[I;^*8mBV?%<PUF>Xh>?`M%/2^>kc#\M<RJ!22)2&#IWj0Ad3(j'3Y1Rt/r;aI1Ei^S`GOT1p%hd^IH&/q!-F"\64D3)Im\KEBpnuks88&uD9c_WM0q\;Ibj@@=n'CJ17n+Q=q`U66]GKZ4#+EnL1.,LEB;6"Geb92J&V=XhIP)/)Y%_p:N;>H[(a]gMO/52.Iee1pq;GG)e`;!d^AkD;2R?($mls%@)O3'$iU[=.7%)/A+QNr$9*"u5GG#b>;Z^UG,8DeKhru`CBK&Ylh1GPdWHu`sg,3'uO+Nd'BH9$jp2RPD%BPA_fnlb=[>R_HNO<V2mlt5nM-U~>endstream
endobj
109 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2519
>>
stream
Gb!#]BlD`q&H2$(0aLt$%4mCK][[,Rd5i`9e?r9j79p0LC*bUn+`g4(9&'C&=]2%D=X6GF72mIKW*R]mcC=.%$)mVdZ@C[1i*lujmg'I3_^Q.&d:)ec^)`e-Srh2lh,$f":j"HD7o;-6a7i=m^Q&%GM?B.iHudD>G+rU'j4O`2,c),?1rXuRJ4`Xgr9k>9WT"W75;>h+_eBr^ph8ZD&#3.k-%(r%!?VX97c?aoOsjc<Y=A$9_\Z[qn3%1e<<`"*M\%*l$5Pfq$`a?e'bFAFi>_U_6lI+]!(QJ=H_6;.0*VZg$bk]#DERt95<P;.:H#I37/_rYKngtM6,6qDnDXe7LWk!BR./I.QU2i&iV26gZeQ,2$Uqp!Qc#GF_?6VM/0Z7MZ-VD%cS/q0T6psDe=3W"4A;L=7A72b]*HRCEAE'r/=rqFbcar51/'[BA&1UXR6,n-/cW=G#A'J:GS%j[d1$V@d^u:E)LW*&JV>dN+&dU^j05`/J*$".o,BqXd0aL)YpUBXf,&:q53Q$@R3)qeNN$"qZ"29&hI)cZh/%>k9cfb$%T2?NgFQ-;R6X3@_<E7tKX$[X+Z%?*bGTc[\G\i9"[&4E<:o5#kFsVS]_#G]P]bo&?J*=\*UK<UTUD2AV4#@N5;eFhjIaCg]%Fis#9aKM!"(6#TZ[hLO(K9Cp\?=@d424(=7jHKMb33.?iaVa%5iG2T>fgP#`sdDehPD/5tqbG-LsXO4\#)b(CSa9)dP3jj3501ct5`:Y]&asI"PuVoYT;=E/i)gG]O^h@T:r=-?n+*q'h(`@%IQRoKLA#dHIkT(45C_I)d$e@OM\3bFY/l4"XQm7t2e3[_uiGlVgZ(W%jokiFEWVOmj4DW;X&?r;.Y'TCW+i=WS87cYB"O?NlL1B1"H::.uK(a#koCKU,*4"ObP$Ke+`__@eb=(kq@[WG;a-6PU>kW7lEffgIPQ)`kH\o>q,uBYPR(42E^G5;c&sN\14@;cEL'.3D9t]mAOf(PeL2.r"Ql^h&(O-)LHep)V.*S+1_6iZ?07oirI@_l5RV&-+ja=?PW#(r3=.>teX++#p9q^&4uI9r]XA1MK"@<)n%*R'dm3D3l1_pIAl\5Y?+!C%bd8gJQliAlCfK#,[cK,95\s??$U9B!n;#2NI:F!+MoB]o$Q'c-S`'*)j7]:b75[3g$@qR3amtlmS)p'7*'aFF`U+PUV*>4Y!Gt6*'T?8g[AirQi_mQ?28d*PmL'%(VhS.Mn/nFJb!5d6*$eI6rfJ4Kt,5Y@dLMUOON)a^Y:MJ>j;*67g)FJ=\"!#_k9>[Gn/T'iQu^Ac-t@`\+G0Xm$T*'U$@HLq\hPJr;e>e^nBCW^jp'O&/BI$K!"TJT$Gbs'=pem>,l96>TS;LSDCcA@4]A@`N6h_^8*po*VfOrUTZ[1I,i"#*MQM_7MXmBAc9rP*6urp!r:/eLb&MJ0d;NgjK1'&=I^n6Pc6fLSYu)q5PI.mQ)mMh<b2bQeMN`_s%Y-'SbDfL7'iB9QBdbpn,]2=5nkmh&3lA!Tr[A!?9k]HG0cZ\KAi=a"iA&_<J,@12O!3SF1DZJ>68<_0J0`hWET#2KZ94>i[HEIQG^YNWr=YhXt-?WCWakH^=irAPP<Jh6k@.d#LkF\ScSaEC?-J3^[u+R7LgOJYgHVDI/4CbteX?`eBjr)1=+m"j)8=R@h\b<4:'jO$r0g!iN*WSuS`RfIAY0'p9Ek05c@39G69;8@e5HL"qGdm$27`nr8MMhrEVg-]1VMh&rs%H$=[g<+K"S[)$neP`J#`B1lu^6/D??X_b(TW=^Cgip%.?(/$X^<`\^h=MSpcZ@G`i!fjXQ"ahf-BKJhnblSfH7uoL1I+XlXWKW*g>V@2-l^G!>BZg#=Tih?"N[tfR(dr-^\-/S&fW`\HZsA,Rp\F2n*%a=)/Iq"e/3O3]m7jhT7I.c2Xkb]+$8_PXreG^nohdFls7?NJ1aDg!JpO'[9+_q7O>9:-6+sRhDTR""YqNb_n+s#rmnrr_g4\pf?2[nY^0dlUrB90TO@3C2-AZK:L0r5EhB!g->=le/d;L<%8irFgLa7,5HHJhc/N7c^Ukg#G`k3,Z`tVrS39&sfBpdD:do*;X.2HZ8S6'EEVm&1"&LjWq3KgkmpS3u^MuYR5Cqt>,R_X.WkV-.4hW*Aod4.Q.a7:.$_sL^ck@d\OU*e`5BN6imGdH7%S$a_]`eU]J<9m5dc>uP1]2!RtRg.L$H+JpJ:#eYfNp&X^7DFbD-iO$hnjtpl\*JQi5-W!-qjA"rkc!ftmQ<+'F3bMF=!igQ@dK*]L07Q=b4k[sS'!83DJu(!(?H61*3DEr[pqsA&"Zj?qr%GX-gmB!m"g5,Gq`)+WN*aU-@bVgPdDec`M2d1.gWD:/@iN]2rU>m9=J_R)KQB!=<p,PDNW/P^WM#V!2K#,0=nkVVs)B8MV^D^BKNPY7N0;S]m6X)Rth?!GG\1f*<Y2PrQf=AB%7u7Dt:.7UHrb`?Gm%nB2+2Q2%9+;oJ(c<r!b$'!MjHG?2~>endstream
endobj
110 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 4025
>>
stream
Gau0F>B?9)(4Q"]3024`NG'pW`4K#b-[+X8A3@:U2%Qj1[@nm$!Lbhf>Pma\1j<KK`L2r@Z%9W\lh?rf!\422m!gA_\6QlJRK1`C[0C(g#-:#*e`u5M#q9%1/4J*G#trac5AUG6ARFP[fURWIa=tC`D+,]'!mWV3"G?AC-]5T6Q^.Z-^Pbk>Y+q2Lc&,5QKe9WRBeNM`K<FAfC%`\"m]]2X%q*T[ZPE)b7aM,VH1D/?J&CP!3TqR[;\)RC;R(2YY8I;SQTVgUad*8&67?J.3g6FVb!KCHAg\BY'1kGV]"tqWD$f>YDo]fD)0KGg(b2O^/%!rtL_)RF2So=FaJUPT"LEBpSk?OnX-l9DCc5@=YF1;l]DOgnIfJg#o6ImZC6I8)-!qj_-7o/!iSXT]Z$Q3,rUK9u/P_Q&QRMA*G0=mkYSN0,gWf@N[Rh+NDs-^KRnLi5'Sh`'SEWsX4XWpVe;'YtWuHk6Y2_UDX_#RUaJ#kD\1RnHoF`cac,E>8QWp=a'J!tlq,uZce$5'Cn_`4OMPVm6PJH/GgCGZh#u=\`;'F"*OUl[2U'`LCIJ$Eb<nm)nl8?$6DN>C0nH#9Q%g6BSVKOt+ohb>11cnd(r*2BaT68&m74^Z)&&m]r%eO1sb/,o6'VVKTb9^:`[<+@S8_)`qDn=F;;,M5!l85a!Wr")u\4C;#]WHS*b'al:#ep3.(XUM4lFM>]j3iU(T$&hG4n9<EZ[d?c#bEAL\:OMp2TN&?KcApaJU:*q!li8D:lP)k\eMTrqqZZeHPF]%H\e*BGn,b=GoRaFG.!a`d[7T7j<\#D7R73l`!eh?Z_LA`7-"%KVZjFm$8-B_#NL^MM4e9NS]'R:$hDg`'?\kbj!G42iJrW[#N<5'BXHZCR8cp!.n>#b<e4j3[XMIM$[Ya"n+8/*/+k-ZRgL?-JJH1]fYPP>^W_?X[hE\nBR!g@-)p(pNZ5Nc</N>GA[^<=1#1Si]`TpDHkrq?M,E_W6-iAER"u*18&ZutRDrRSi`q>=&7<R%<s\n#K]g:A"],n]6j5%E*$.-XR:(s?IFQa+?5cFOUClo-Pu5N>)86ARBpu&q=)$qe`8bAQ=T"8F]cPtLLU*B^TJhjHY(SeCo\iD-MJ?k:WIppXfEDt24kloSO1B'l(_g0a@=AnIWlE;VOk'VoN5^UcTJc>X8#a;_gbsT=4#DcR.Ak6udg*U5VU>h3iUf!Uls#dKEMKo_%/qKfkqCJIi^BS;P4hH545f@_i95PmQH$/?6[qF8FDs_"(fjFh(QS\-dP9LgRkG=#N;BI1HLY'%04^c_5:rXImD\*NaRoGb._'TX@j%tj:K:Md2hThF!/8\=G<`^]6egE=+7J*G:tKf+U$Z\_7Ui?i30o]\_2O_N!`Fqi>A4JOXhRXcJ.HF3qOTqBE-$a628C5B6<JT(<7".-FmaN;1rM*(J8Y-=J,s^>=gdRMP)WoL)9c1lfSpcLceXtnpj<c3/dU1N_UabL'%81-K;lrMK:m!:N&m\(fEU52-MEU<D_Vf2(5O.-K%*;,a`na$HNcTS<9QgYd?+8L8kWreJ5AV;DlG*0(1>5tA"a#.!FhZ'=<P5q4;Ej;Jt3LG9!lX4>T8YY\:J8R2S)GR:19^9Qn-'SP[dZG!LMhu-1n#!200D?<?(];!G1?`]nAWqYb5]5MP]KMW4RVkW#A>uK:2jk1?#?._.@l7EEIm7G)jVnH>Z)KFF>9%8j.AIrkeCQg/<kH&>X</Tl-hV:V]Go\jqLrMe,F3AC!j((>j#BYQmR_:e\?W`mP'q(br-Y0LcJWX3CV_,C2QobM!O#'faOF"p\Hc?86=Vk\Q7U]b$AE]c<aS<S^4-O!na:+8MY:GAr4j$,iUB7W(W_`B%:=9-(8d]rU.ip!llr81GI![PA0+)Y%#Q?O6q9KrUc3jfu+k6DL`GAqdV03a/&JLmZp)L:#(uRZ&[m%9ANrPT$)lp`M(TDs-^s$?'e3<p)=1juY=oW7\?87B%utngBCd(m,5cgMY7EAoWD8q+l=,*U@+f;tmF(n(h"l(X=X]l?n$@cZs4WX$%Hdpito%+Uc+?TnSa7lJC3u&",:_Ua??Fc6:i\hgG0L4j,%2V"=gphg)ISD%P0-9d=uF\K'YI/U?X!nm#:\EUAWl<m$:XYkCI^;p).))8aH%k'8rn[t\kH$e'dJk:`k01P>gPP-$e%cb)-":mJRSi#E?!3E7CNQs"pumZ^;"Lg5W2O.6OnLpb%4/9I;9F!r@E:V'Hd8E]K!@Rtos=UCkkRX:T520+o;enZ5RR@O(?(i!C2LYpO12M+G!I71Zc_K0B3!5p90`&D@.SS%DQ1/7&(jWJV$h4"sfY0dum:h:K&$?#.i<B$%pTgZBq@4,F*=einOD\&U<mR<CS&/#`GoNgfX!kSYpP)lC5>MZNQ^bl@[^p*V@+0/1`Mo<`Xl4[kB8EqL'XYj>U9ShjM+7SO&,dNmcQCBqX"*I78<9/<p\VRsB<J.8`#JZ$5/o=*4=b`21KGTCL(MfF>BXe;f8&g(/,J"1?ZM5KH-SuZ1nA5?)6,*0d'E1J8n6CY"UAb%[;p"S!V80&SA9DqPa*.='O[>gdiDt%S65JjQESn!.Mf`o3?!fNB"Wd%kO4L^-eR0kndhTCciidWn$G==3jH][0VF6C*UdIgi\JSpN1:9g<*Q0'FR$.E*OmV8g^e=86j-n50lK!^SV8\h7hl]2=&WD7kdg,kOg!o?`OkErElq1hXT(.u2q.j(WpknYu9;A0Nk^0!bL)fn'W/g':4G1!2r&YE#(fCu?;%hlqY#IMT()^a]#,;I-EK@239BX6\P6MXpB&W+&:\"ZYS)`*m,R%/F$LY*ucPW#\_+L-;$<9F-ihV8jq0J#e)oJWORGFO_Eo`b<cUrYSrcl?aQ"U$#i$RQ@&;':OR)N'serb17S,ntTp1!pe4"q97*ghl-,Jp[GMM"E0b8<E5:m@EEF_83Y,\O-O&kb^@e^IADFbBL"LU]>p>)%g:C!I=rWS5u"',SC[Jo4..M2WI3#/]^rq6[)i$1=RCX*YGY>fSDSJ:i:C3Ha(=[mR7JR%pjN<:b0UC%f7Wa>.Ft\Yg6)T$+trX5o;NRBer(Z@2Aj8CISM`4-CAN?5_DNGh>c[pTDqf^iI*>nGOARPajX0CW_b_obGmgdd^6R@c<NGrY3g#S\QJ5et_klG_hi;<'bkM^odlB^PDh@Hj(OEe8BF[XP_;btCfU%VU2qOBmb=2jj0:,^juV;a;"ToG@TL5pM[I%;`G4K63.tZb58G(fe.4!O6r]AP>iBmuUet,?]o'_abfh7H7&\ms)Wr_$o(>W25-IbG@r0*;kgWJgEj:q_9UPY]/b3*m4%<lm+H;oVMGBr.H5/^%Qi4:!X)cjZ/!QSS^%"V'G%aYZYN^o5e$*R+J3]s5k<;n1MIXGgIn>bXgClrh5=d/0N@&XdKtgno2hUoSb%[5X@p"I?Ak3Zb=)AbPOSbl;APK*G.8[`ZK31H$r[HLc@sJ+7f72<&;D:UF!D=eo23JneB&57mn#W#='[f=(]"#M9iKg=)j5r.NQIlHL3_aZjS@EN4tAJ/mDRX5)pl%<Pp'"[kWu_q9;_1=E@s"k/=&]I-ii^[B!)Hl`AX>%nW*>L:sYp[b4i8WP=Vk(7R?WHkA@_p?t"p_[S(`Z]?nPU=rV"WQ`XQAgd%]ThDrO8[H$-K<3AJZh^tJGEK6u;Q&8T9nr'[N?F.*Dj0/G8n11YMoWI`A2p;I3dL'rrZV]/B1LZd)#O:jSej?<((Wi.jIoF_$V%@pl*F\(r]e?cR-??_TYbjnHbt/0*/a>F,irUPhNBdb>gdd-*$cOdk/,dq+;#JO<KcMWWgu?L8mo_pbFH5l1uW)!"jHZ1_KCM4SSbq+p>)D1:HtBd]09TZ?AqhC.l-AN($=_9qg>_7c+%51$M*QGqeE9G/+f:aiRJdIs([KNPc44Trm:!'Ts[diejrd-4Jhd!K44jm/l7i<Onmu*GO<a[E=t>L*o.C?WEG*j'+6Wq0aY+jM\%\'mrJm;/K)IJrrJ*jJ3*~>endstream
endobj
111 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1141
>>
stream
GatU2>B?8n'Roe[30.s$,"ht?9V9b_agTZ?>0"6NR:0WfD-B2(_JZ]pILk'X`9SAq_(drtkJFdn4(^bJ@a0+e"2(8Ck`u800V&;eM$qeY0V/c'%bOf\"GAh["5e+gT?p$5#-BPb(_ino4E.uqE5i&d0aEYhq:boV"n_s6p?u31Nup-'iR\BCi>6X_q8K6:<+qILWbcJ12^RG_.>S)_[Kp.HeeT#Qnn/29D*PD(MX?3u7]BcX@ZcX]Q50jk-Z<Dh*N!c@(uOh/Nl)l4";S*Hp\-ffSLFrP80H2Y[Sd;bq4q*Bd;W2$p=cl5^*a:4UIoCn>FU<tdXNmoYCG@)1cF&;ZVG!6[`m/,*f!A-9.8:C\:;;`8hbUZAMX6>e%_S5HDVb@SB.9,IG\Lt2l@7">qM#@;3g:Dm];;/=]B"=RVS*o<.k1thlgj"-u0u-Pt>Hn[aI.VO2G)_AYsKJ<#31dNUTiJm)e&QGk[/G2n?Z9rc0$]D5>RoZ-gG0Ek+q^<2OG:?'KI2Y[_CQ'PI6eaLNiIW3siMZ:]6?=DEpDc9f1+&^Hst/Bk)bpPl@N]Mu<p9o+p+o?m8RdF%XJk0K+;n]g^0anW0-pC7+)cJ$0@kX6FUd@]psqg\h)G<H0-pW;6AGjqc-643OC^b^5N#;%OYcWd)sl-&7sI>f)"oo\>t!(o<Q\\/*<Zia.i!;P4J8CSX[V%(4c\>a->C9=^gKl;=WG<I,OO1MjG)"E%:f0)*p^]P31a)M]K*WGYAlPQ[La.(%&]&eo6LL$BXa?0M_93EfFVADbCA@H`9)a).a1uODW!-+Hu#K6@]kdGi_FjI6jekn_A:Sh3Br5@lAS-u3[GGfVYejkp7SflO\i@E]4OHhkUZ=ujsMr!dhGLMsCc^4Ygi3_sPT$[)jl0l%:9ik;!EH/]`Vhp3NnG_p"HipW+f#grAJN7Tc8<Aubp]E]R?p`b%bd(O8@A;c2,%4ZrFSnKPmiYJ=VP!,o"h5leGiZ$rf1+u.2)D<0-VOsQs,5q,=EK?$V))YjiP\dc0IM&!i%aLp);>5:F#MjTm963kF/[`U^P5s$$QnI^i<gbskj3PNpb$'jJGoB:X9MDRLtE2QVn!jH*"Q0Pg`mkMJQI&ALgrTbfmZe<)#Oa[grgl~>endstream
endobj
xref
0 112
0000000000 65535 f
0000000061 00000 n
0000000146 00000 n
0000000253 00000 n
0000000365 00000 n
0000000513 00000 n
0000000661 00000 n
0000000808 00000 n
0000000956 00000 n
0000001104 00000 n
0000001252 00000 n
0000001400 00000 n
0000001547 00000 n
0000001696 00000 n
0000001843 00000 n
0000001992 00000 n
0000002140 00000 n
0000002288 00000 n
0000002437 00000 n
0000002586 00000 n
0000002733 00000 n
0000002880 00000 n
0000003028 00000 n
0000003176 00000 n
0000003324 00000 n
0000003473 00000 n
0000003622 00000 n
0000003771 00000 n
0000003920 00000 n
0000004067 00000 n
0000004216 00000 n
0000004365 00000 n
0000004514 00000 n
0000004662 00000 n
0000004811 00000 n
0000004960 00000 n
0000005108 00000 n
0000005256 00000 n
0000005404 00000 n
0000005552 00000 n
0000005700 00000 n
0000005848 00000 n
0000005997 00000 n
0000006113 00000 n
0000006219 00000 n
0000006297 00000 n
0000006381 00000 n
0000006588 00000 n
0000007076 00000 n
0000007283 00000 n
0000007490 00000 n
0000007697 00000 n
0000007904 00000 n
0000008111 00000 n
0000008318 00000 n
0000008525 00000 n
0000008732 00000 n
0000008939 00000 n
0000009146 00000 n
0000009233 00000 n
0000009559 00000 n
0000009634 00000 n
0000009726 00000 n
0000009829 00000 n
0000009978 00000 n
0000010068 00000 n
0000010173 00000 n
0000010268 00000 n
0000010423 00000 n
0000010525 00000 n
0000010652 00000 n
0000010772 00000 n
0000010889 00000 n
0000011036 00000 n
0000011190 00000 n
0000011306 00000 n
0000011445 00000 n
0000011567 00000 n
0000011681 00000 n
0000011833 00000 n
0000011951 00000 n
0000012089 00000 n
0000012236 00000 n
0000012360 00000 n
0000012490 00000 n
0000012627 00000 n
0000012734 00000 n
0000012884 00000 n
0000012991 00000 n
0000013103 00000 n
0000013239 00000 n
0000013375 00000 n
0000013479 00000 n
0000013602 00000 n
0000013723 00000 n
0000013846 00000 n
0000013972 00000 n
0000014092 00000 n
0000014208 00000 n
0000014303 00000 n
0000014445 00000 n
0000015538 00000 n
0000016990 00000 n
0000020678 00000 n
0000024013 00000 n
0000027947 00000 n
0000030735 00000 n
0000032923 00000 n
0000036352 00000 n
0000038290 00000 n
0000040902 00000 n
0000045020 00000 n
trailer
<<
/ID
[<f6ba50be391dc4d05b8430d9019777f8><f6ba50be391dc4d05b8430d9019777f8>]
% ReportLab generated PDF document -- digest (opensource)
/Info 59 0 R
/Root 58 0 R
/Size 112
>>
startxref
46254
%%EOF