hadoop-zookeeper-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From f..@apache.org
Subject svn commit: r944003 [1/2] - in /hadoop/zookeeper/trunk: ./ docs/ src/contrib/bookkeeper/src/java/org/apache/bookkeeper/bookie/ src/contrib/bookkeeper/src/java/org/apache/bookkeeper/client/ src/contrib/bookkeeper/test/org/apache/bookkeeper/test/ src/doc...
Date Thu, 13 May 2010 20:23:36 GMT
Author: fpj
Date: Thu May 13 20:23:35 2010
New Revision: 944003

URL: http://svn.apache.org/viewvc?rev=944003&view=rev
Log:
ZOOKEEPER-464. Need procedure to garbage collect ledgers
  (erwin via fpj)


Modified:
    hadoop/zookeeper/trunk/CHANGES.txt
    hadoop/zookeeper/trunk/docs/bookkeeperConfig.html
    hadoop/zookeeper/trunk/docs/bookkeeperConfig.pdf
    hadoop/zookeeper/trunk/docs/bookkeeperProgrammer.html
    hadoop/zookeeper/trunk/docs/bookkeeperProgrammer.pdf
    hadoop/zookeeper/trunk/docs/bookkeeperStarted.html
    hadoop/zookeeper/trunk/docs/bookkeeperStarted.pdf
    hadoop/zookeeper/trunk/src/contrib/bookkeeper/src/java/org/apache/bookkeeper/bookie/Bookie.java
    hadoop/zookeeper/trunk/src/contrib/bookkeeper/src/java/org/apache/bookkeeper/bookie/BufferedChannel.java
    hadoop/zookeeper/trunk/src/contrib/bookkeeper/src/java/org/apache/bookkeeper/bookie/EntryLogger.java
    hadoop/zookeeper/trunk/src/contrib/bookkeeper/src/java/org/apache/bookkeeper/bookie/FileInfo.java
    hadoop/zookeeper/trunk/src/contrib/bookkeeper/src/java/org/apache/bookkeeper/bookie/LedgerCache.java
    hadoop/zookeeper/trunk/src/contrib/bookkeeper/src/java/org/apache/bookkeeper/client/AsyncCallback.java
    hadoop/zookeeper/trunk/src/contrib/bookkeeper/src/java/org/apache/bookkeeper/client/BookKeeper.java
    hadoop/zookeeper/trunk/src/contrib/bookkeeper/test/org/apache/bookkeeper/test/CloseTest.java
    hadoop/zookeeper/trunk/src/docs/src/documentation/content/xdocs/bookkeeperConfig.xml
    hadoop/zookeeper/trunk/src/docs/src/documentation/content/xdocs/bookkeeperProgrammer.xml
    hadoop/zookeeper/trunk/src/docs/src/documentation/content/xdocs/bookkeeperStarted.xml

Modified: hadoop/zookeeper/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/CHANGES.txt?rev=944003&r1=944002&r2=944003&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/CHANGES.txt (original)
+++ hadoop/zookeeper/trunk/CHANGES.txt Thu May 13 20:23:35 2010
@@ -65,6 +65,9 @@ NEW FEATURES:
 
   ZOOKEEPER-747. Add C# generation to Jute (Eric Hauser via phunt)
 
+  ZOOKEEPER-464. Need procedure to garbage collect ledgers
+  (erwin via fpj)
+
 Release 3.3.0 - 2010-03-24
 
 Non-backward compatible changes:

Modified: hadoop/zookeeper/trunk/docs/bookkeeperConfig.html
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/docs/bookkeeperConfig.html?rev=944003&r1=944002&r2=944003&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/docs/bookkeeperConfig.html (original)
+++ hadoop/zookeeper/trunk/docs/bookkeeperConfig.html Thu May 13 20:23:35 2010
@@ -290,8 +290,9 @@ document.write("Last Published: " + docu
  	   </p>
 <p>
 <span class="codefrag computeroutput">
-		java -cp .:./zookeeper-&lt;version&gt;-bookkeeper.jar:./zookeeper-&lt;version&gt;.jar:../log4j/apache-log4j-1.2.15/log4j-1.2.15.jar\
-		-Dlog4j.configuration=log4j.properties org.apache.bookkeeper.proto.BookieServer 3181 /path_to_log_device/\
+		java -cp .:./zookeeper-&lt;version&gt;-bookkeeper.jar:./zookeeper-&lt;version&gt;.jar\
+		:../log4j/apache-log4j-1.2.15/log4j-1.2.15.jar -Dlog4j.configuration=log4j.properties\ 
+		org.apache.bookkeeper.proto.BookieServer 3181 127.0.0.1:2181 /path_to_log_device/\
 		/path_to_ledger_device/
 	   </span>
 </p>
@@ -312,6 +313,15 @@ document.write("Last Published: " + docu
 <li>
  	   	
 <p>
+ 	   		Comma separated list of ZooKeeper servers with a hostname:port format;
+ 	   	</p>
+ 	   	
+</li>
+ 	   	
+ 	   	
+<li>
+ 	   	
+<p>
  	   		Path for Log Device (stores bookie write-ahead log);
  	   	</p>
  	   	
@@ -331,7 +341,7 @@ document.write("Last Published: " + docu
  	   Ideally, <span class="codefrag computeroutput">/path_to_log_device/ </span> and <span class="codefrag computeroutput">/path_to_ledger_device/ </span> are each
  	   in a different device. 
  	   </p>
-<a name="N10074"></a><a name="bk_zkMetadata"></a>
+<a name="N1007A"></a><a name="bk_zkMetadata"></a>
 <h3 class="h4">ZooKeeper Metadata</h3>
 <p>
  	   For BookKeeper, we require a ZooKeeper installation to store metadata, and to pass the list

Modified: hadoop/zookeeper/trunk/docs/bookkeeperConfig.pdf
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/docs/bookkeeperConfig.pdf?rev=944003&r1=944002&r2=944003&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/docs/bookkeeperConfig.pdf (original)
+++ hadoop/zookeeper/trunk/docs/bookkeeperConfig.pdf Thu May 13 20:23:35 2010
@@ -69,10 +69,10 @@ endobj
 >>
 endobj
 16 0 obj
-<< /Length 2171 /Filter [ /ASCII85Decode /FlateDecode ]
+<< /Length 2151 /Filter [ /ASCII85Decode /FlateDecode ]
  >>
 stream
-GatU4gQ(#H&:O:SkcMJ4R[0n!cka^29mT+Q1qQPcMa4^!Ru&[G'"&\QlT<U=BN'q\+M]1s8^>PJ__X[95;$!?6HenTD*;J=gY+5!bD(M,(#(DYGV4!k^j8+FJ)<6HelksYc/8H?b$5nsXH9pB5M"kuMk;%,+(;A,s*E)[FZg?@J`X:$QG2aLcjm.7=e!C&MgK$g[iF+)eu_i*G[Y7WER3smCsBDOMdi.-MF&Z&5YH?aM<^2dbE@iuj>9P7ms21-VXB05n/Gj`X3e!n`Km)tL$ZlDWu2h5P&KY&4W:A&c:ho%6KE?aXXWotHJL@Bm;$LrfMTE9%]oioa!IlIN-!0s1ICE\H8l/85G["9UZ(/cO3ertLLVph@Eu;n9Gn?n)*d""B\Ot<O(15_J+Rd62n<(rNt&:[@TdOJp5H,&'Th6VE;dj*;&<T@%/8d8"4rT#'jPPMD,V-#[:[e)f"ejm03LNoXt>Fr;+uS'cL)e1*;3*UDLh8I>mG0W'CT[DK*Y^[^',"'_dJl,6=doSe9h+[&Ao5?gXcla&%mfAS0-\R#>cAtV:"W1UT`^takP^@9[Z<U]sHmpH;pHgWuR:cN*!F"TQu^^3>/']BVrUP4AUSs;B54?]B9?egK?4r,(\?.!Z)!j6M@D&Fk,%/9$t\\a%PGieU`(QQ;pgXRmoFK'5O?if2>Si:@kSc_S!URF'e9[Q!T"41Vl2KUDg!(L<,lme1AO8@i5jfqF)41d3=p(]V[<tAKBUcs._G,?=TqrY+b?0TT*h+%@%pbnt?th]pbqg?5O:#EJNgSWOg/Pe93M7M='qC]gP^<Tme?ajamnDP"D5mV`hhhXE]`8PMgg5lpQ#JE*Aj93T3quoK[h[7*\oVarJ:!k;^UJ,rik4F4fE\0=hV;$nG44TkO\=o!&d,K+`SD.D*J&eWBJ=DluL7gR!o44$gt"XpYRsKR:i@D9d:82mq4m8Zgr-B>!A^-C7<?6rW9h3D^7!J9?W
 #KU(0/0W>Sin&#9U(tNPTFc,;6&ql*SHCq`c'l8W*#?KHF\0VS0Y`M,@;p)"_<A(K^>sB1I4rP0A3j*C68>!<TA;D/,1**+?_VDBt@bfu<;LtSn">478oWO>RM?$EYMs^]@J8:aF6?hI7d]97pj='0rNhp1PhHdrZ`8P'\D8h[e9C`%B6fE+I<<apoLTsH03A^6]<W1tip7CaHf\iP5`4-VPThu/'@C?/^mGk;#@bnj8[]_i8g$O[1\JFUs-d3ZsQlP&&"nW]"8pUA$6XQ;8;2VsIJ<nl3e_nKF&JQVuUMt<XR_,i7oDf9':$!rnDM'%=#[DatNb[h`pJ$$:n-n_d+`l-Zk2KOI\9#e$eVk[,rkK-W1/b.])dn1O0e*LD4O9bu0\Z\dibL6p4s4*dg.Z*+SF4-]k-=d?@>HPYb61Y8\mJdb\VMn^I93J#U$_V8H.%qr5W/]MlDql(6N<(maBrUn)L>f8,H0fpWbN<PeQP8f1=fut0?u7P=p^W9722Vb.0,R4Y%)5UNl'[NY0*VnS$!,I140'J7)P"pR-fPl-&8BL1$;D4NR*,elJ:UDUREE6@bp5i8OeH`0V"BlNRCEnO0^j[eQ?MS4r)gA]cg,X\<a`@hT-ZC'OH%XUdV[>j1D2"CqbP?&2$q[;1[#T)Qq<IhG_qsLeI^*4[ftWhO`R/rCb?0>Dc='RuJL^A"V+`?;_JLj1stF+C$<a\f3GZQ[N>t7^AHSAg.J:e:N9R([,ZrIIW9@DE>$i_SOLkacg`nYhLCggX;<0#G.7\Y_0S2X+.tU2S7.N'oRW<h_.t`h'@9<<9?X*04^?+SbISuPTX4Ifaa;t@ue=@"1<Hg2ECtZ<d/Lrq.%$n$nQ5ZrEV?`<WX8&gtYi-DfF!@N2Uoqo8'&9huG4II@I0jU"APVEh19+*Xa9:jM@iijSk\an%bW@.=:&Y[SfC#LJ5IhFN:Ciad>J2_6Y3GcuYju!M5'c$QL(/<qNj]kXQ
 Tse@KpnW[F.5Cs_?p;es.]DKs=rmrl='rJhn]d-oY+'<hZ$cN`r%V[iO\L`<m*m#`^_rHZjV*CafY"m";V.r>pHd.>Xt361ao3T#]V#gMUoqE^@dC/F_&I=]%6;r=!4e@),de3>q)_94a/e+c4>ni<\rbU_(+ku3NaBNs)_FbA7gNQ/'MmZ^Dtr<K__3B.~>
+GatU4gN)%,&:N/3n?)DC"V]hMdrm'Ul87mMR`9ekeH\\L,pX2@n7"odqC["u8>)\(j-`R@@Bm:oZb*l">22:E(3PIN4f&P@g+K=8_]Q91)tn[2+k6%aVnMct'd_J_P'LgBl8:4MH._`$^:+$GSpjuCr3Z5%Z:b,@U6B_)')K?([Lu4lMF_.P<lqK:im5TWdd1,$FddHTN"S)5PWnJ&26!_QVA:qZ2E!=oA!*N2,#;d\O7d#Q=uQ&\9NpaN^7D_#V>U*-k63N$<1[Jlcb)Yll5d&f>090JWk1G5[h!T#2;9:Jf=A>!beqioN`ki.=:8l!rF%dlp5gAO3:=#r/0"!_X;C3m1m%Y^jjk=b&!sh[og+!g<&NRZl.2(Jjo.:%VrGE;c9Q^jZ!$nMb!Bo#ZfI_s;0%Araq32=[!JEAr(D\.KcUO^s!";L?[l@#]eE:.[@5u3H/:l'-G!:uB_U.>m3goIE=`X*iWj:#IPc,-S*XA^iW[(JY^T!qMZ`:#@$7h?V^)WI@H/j_$`_,$ikM9/Su>f,Y#&9ZT!dMK!a!-efaqI*c<`3Y3XSX5rm'ghM<hZ1p,&^#;g7pdLSuI5AQ>A]]UEIN,,0^+VSu<E9T+=h+7O$O'02\KbW/H1_.sg;#nh;&s'0(qlY:`]g&%lJbG(-L!IJrhQZ4_dNGojq<^oieC0AP\c*gL^oBLYIpj+=1j@hPJi62S?W_n^nn;R2gB-E3PbD9u]006q/)F_?WB;u#,etY>)J(-s-B+3>G0bbZF\BtW"Tp"G>5#_Wj<AW1]%79&PB;k6WWJ>jeD0LDhfX)1?/*,4]l=ZWX0?B6O3mP&+\-LY&V5Q(k@[q?N4.2Z@S<g'GDE-c'h,05rOH,U-aM>K(%\rrCN)Q6*q_e*EXP(tEn2ruU)HU;uT,Lij.+*C0n/HaP"_gc:E%.:DY%[*iUF7#8FatV?GL+sWab1/uVU?Bf>&3oW)6^umam(kKZDk.I>Yt/=LNE?
 r%'-=cDDD`1hn'3biL%)#jscmu9->RDl@%fpA[!&RmWhfHj;'\9^q9m8*()p+V_X*/kkr8Jp<b@nbJWUk#4uWQ:'Ro\.C6j+c-7id_8d#Y09Oo!>iJYY>lSun06$CtYin5X$\W,ka`Rj.QBAA>6DL;Llij8@\T`5umLY-1k*qOSa,f6[?&.2OaJoqVjp&jU?>&&LF%>neKA/Jmh-l!N0+am01d`K&4CGN]o\/7ThdG<W't1;/F4or<]t"pHib+2lPaDlrM$rMTP"J.8;2]m?7RnW&8jKc-]#t9gS&V*d3>dUJbL51(`MEf9J9<>W;<6;QW("PA2eT(dY&W>E[^erfIH>U+]#7:VkS8<%RA$'h'Xp:\`<2*!.`6up5a`IW"@&Io=aln.JRna31!i*,SFP;AAf=A3?N]n%rGQY2cI0lMTNlWS,-U/l525a9bQ`g1j-TOD@ho1!$pd]s/VYD?F+abs>eAJ3"(N<:7F)WIZZ*%t$C[9c-A?gRNanoNTW(dVDJGSk?jbG,ClHXopiiO7U+,&tlNE(ZmstemEc!F@>:EFk&IFNCH.5sV$UHTADKF`5c&jD.DtHD[&`G8H->%S%\5MAIFH18s'H4&KjJGd1`)-QeEgOS#/.b,+K-qliH9J7[2W]5W>t>Cl6?O1akVQ2TPPNWh`>k4(bT#[nL9UFOpc[hJ>#&]Z`aC\D5EnWVgEi$tKAFUmq[WsFMNMer9]>**q51.e9R9X*!C^`u_:/WNRnR0O,I<dPr!<Q`5K(mj+Q%(?=DeIEL+&"HhB5,PaR-`MGamONpBnk>V]V8JR;S49LeI=_ouh)];uopr1T7f.j>N3+pVUiQ!4VK0]3))/;XYASe:kp.4SX'/DY^jY+TkDBr;Y.2'r;$@CB282>u2T_SB>kF3f=:7(9XS^\SlQb34)&$5TLckBgio(0)22cXPN@:`%7;2ELL,>XU.6Q!2*7+FisCI)^lm;HtHZt9%6h:MANYjhc8
 BKD]4aWrR9Q1"$![j&pQRTD$%9Khs#Z0H>JZJL,bl:74nn!hO\riF>.H>a<>;B^p?VR!nTeHg8O1#5WpW>_)9qPoogp:jZqmXqT*oh@NM(@bdPE'e^'K9i`2J/C&KI/qB[cAc@]r+\uD25,h@*Hh4iG*Tf$cQ3?_>frWA;L.oH~>
 endstream
 endobj
 17 0 obj
@@ -122,10 +122,10 @@ endobj
 >>
 endobj
 22 0 obj
-<< /Length 1086 /Filter [ /ASCII85Decode /FlateDecode ]
+<< /Length 1177 /Filter [ /ASCII85Decode /FlateDecode ]
  >>
 stream
-Gat%"gMZ%0&:O:Sn?!1^AOoE-V=nWP2F27Hg\'$uMh&'G=bnVT.=-XFqi5gZaLCNQYb@1:B?o:mGe]XE\sRo;EDjUHEL&?%8<P7f)p?.l42GCKA42q2ca/+5pMW*3*`7J0^O)&q$i"A>T!?k)_2"6";[SttQn5],dsSDT2\<3IRI@N3>N:]Y_EI;1O#Q,aZM5G:q1q(#N+/6P4lT?F3BG4p#L:cK6dg5;n@*O("K_@PBB+U22qhaLnU7k>V*oK,2Vur>]WH[0P<2iFI33[);DE4DIM:_C/L(1l/V<MNq,4@,e`FI6esYZ@19[kQk+1?GSYHU1Z+P?D-cW+_^76%<ls"KcH%DIVG$<FYLT.s;9bXh"0UF8`l+l>ggutd7H98FY:>(Pa7O"H#h<c>9-Z>WM>#0FenErmP6jhI*`mAjW-#<\f:8PH7[S?Q:,0/W5*5fS/Tk`g,C.2:#]f]N5KS@t%bOsRKW-<4G.++0?+s7l'o-5JL'c.l!V\'@D+0GLZQlYVY?cMD:qgm+n<(S73MU`hM^bNNq<DsYAH7O9]iW2j64fh8riYLnh.[r5dpEcu;^7%>j2]a;?qpM2GHQ0-BW=J(!:Dnk)#NhQB:,ci,-Mhl3X)i-:Z\7lmF1]0/]eSru<3R;]],1,2e0\^,(96<d.uu3?K28'K/O0Tl,h;#Sap*!6VLiDiT!"`4#P2is5mgt&E4W&AR,D0gmc$8rl7c?Sd,b_*h$%\pnb_.1_P3(Y.\dr([Qd>QeIVcfY?m6h'GdD6,6'ii)37[a`'?"JW<DZAi>K:b6$\2H'fj?m,-U&p[i<#i.nELL&I!/>F)aD9;4p9iGs1dKKKOhtE!"-H]e2X1PXeeC3Oc'f(0]HG>tZ+Y<<>4%$HaYc9&l+d;BTWA9'@=fNi5i4;i)Xgp\D8!@I]kB8cPKPr:d]So:u!oSVD+g`rt'g(o'D='Poo\(dH1jMeT2siLO/>8Z2ok_HD@fUT%(p6ri/
 CdO^M+N?PL>#X@)"='$0,<nC@*Y*tG7=G!e7=T&Q01Z#SK(@2QTm9f`L:3Ym;md%N&$:Si4'oY%oK5B"O:ejC:rW`^9L?\~>
+Gat%"gMZ%0&:O:Sn?!1^0HrrCde7D(2F27Hg\'$uMh&'G=bn><.=-XFqbgLUHqTI7J]?9b3HI:C_eS_bC@QF4;!'r;M^6(=MPA2jB=rZ,UPr[%6Y$mW=o>sXGh7LcJg9d]rF:EbFhb#dMkKYKg`Jhq-`8p2(g<3gbOWB5G5#hGF.or'<.2qKl@-F\6$H2Q^'fBkBr9,Lapn1`XaY=NI);:]KESUnA$o5f+RQ*[CM@=YX>5e8:)`e6MFc#\,U!rn&91Dn^Hd>QETb.l*BF%oNV.hP^3ietgNFqrZiJu"X^?-W(O9Lj"j$#pa7m+8,f9I/mQ;(@(qK[Bb>NZ%7^Y+\.\2b)N4/`]ZdulA<Pr>dA\QF3s-DC[BSM#ll,Hc,>9E-5osWS=d_;?]88rfZf$5M33[Q"#LZsd_FQSRT]8?1RHJ)D;<-,d-D^MsY:@=@"-.LWEk5CeoMTL!$7:=k&jj`\L2/*d1*icLm=,kO8c910:,C`FQ/;io*'DpjX4a#SUD!lL>/M:"Q`W>4W0k?PUJ.8(9`13EOrP'Pp7#7VU0MZ4F[H%P!,-PSdE2%`EH8/"_m8b*+Dsu1S_@n5HS6d5^%ne;\$15VA*9)mGqPUVSQ$+EpHjHsDiK/od(l2GaAuEE^F_2i5#q%lo7lZ25DH1uu[pWQ.fo5d=cX@jU`=2=;Z#8!cbr)H(eNf,JWV0paU^Z1nJN;gqb6G&c9XT454DlD(!fJf)CNWN5&:6CV:/dXEfk=FjZenkeBa?nLgU@/N-t]H]QPVQYc]^*-V`[\.AaSVciDp:m]ARp4jDKQf+l(an$:R$ZZ_6V'0Y8jf:hBCoM8Fk)eqK9H3nYU!D[8i=7sOWO:aNj^]bgP.#q\[bj+o^I@=[06#aL4U4c>j$N8G>JPnel,d&2=O#&f\KYBWt[^]DZuC$5Yl(7JTb4q>C>6;Vm89:U=!%5C_O>QNqcDt^#CmBC[QD0QBZd=IK_/rF,^NWr*83HI\
 Ws71P*KtrP$-sD'nbIhkRk:S.9r6WZ:HeRZI62Rro_ar.Wj<.k3VS#p5mAOFR,b'JG=<uppR].0(#Z;h^E!aN='o[bp&C,8.ET@gu:bl@alL-(GG+Gdo\6Ci5M77.0`82F#[Cu+8>;0uFdTcT,S2gI+O*Y00>uNFr.gg3:fF>&bVa2d*L&2A].G_f~>
 endstream
 endobj
 23 0 obj
@@ -145,7 +145,7 @@ endobj
 25 0 obj
 << /Type /Annot
 /Subtype /Link
-/Rect [ 138.648 477.947 266.952 465.947 ]
+/Rect [ 138.648 439.547 266.952 427.547 ]
 /C [ 0 0 0 ]
 /Border [ 0 0 0 ]
 /A << /URI (index.html)
@@ -264,7 +264,7 @@ endobj
 15 0 obj
 <<
 /S /GoTo
-/D [23 0 R /XYZ 85.0 545.8 null]
+/D [23 0 R /XYZ 85.0 507.4 null]
 >>
 endobj
 26 0 obj
@@ -275,42 +275,42 @@ endobj
 xref
 0 37
 0000000000 65535 f 
-0000007234 00000 n 
-0000007306 00000 n 
-0000007398 00000 n 
+0000007305 00000 n 
+0000007377 00000 n 
+0000007469 00000 n 
 0000000015 00000 n 
 0000000071 00000 n 
 0000000722 00000 n 
 0000000842 00000 n 
 0000000888 00000 n 
-0000007532 00000 n 
+0000007603 00000 n 
 0000001023 00000 n 
-0000007595 00000 n 
+0000007666 00000 n 
 0000001160 00000 n 
-0000007661 00000 n 
+0000007732 00000 n 
 0000001297 00000 n 
-0000007727 00000 n 
+0000007798 00000 n 
 0000001434 00000 n 
-0000003698 00000 n 
-0000003821 00000 n 
-0000003862 00000 n 
-0000003999 00000 n 
-0000004136 00000 n 
-0000004273 00000 n 
-0000005452 00000 n 
-0000005575 00000 n 
-0000005602 00000 n 
-0000007791 00000 n 
-0000005766 00000 n 
-0000005943 00000 n 
-0000006158 00000 n 
-0000006363 00000 n 
-0000006572 00000 n 
-0000006685 00000 n 
-0000006795 00000 n 
-0000006903 00000 n 
-0000007009 00000 n 
-0000007125 00000 n 
+0000003678 00000 n 
+0000003801 00000 n 
+0000003842 00000 n 
+0000003979 00000 n 
+0000004116 00000 n 
+0000004253 00000 n 
+0000005523 00000 n 
+0000005646 00000 n 
+0000005673 00000 n 
+0000007862 00000 n 
+0000005837 00000 n 
+0000006014 00000 n 
+0000006229 00000 n 
+0000006434 00000 n 
+0000006643 00000 n 
+0000006756 00000 n 
+0000006866 00000 n 
+0000006974 00000 n 
+0000007080 00000 n 
+0000007196 00000 n 
 trailer
 <<
 /Size 37
@@ -318,5 +318,5 @@ trailer
 /Info 4 0 R
 >>
 startxref
-7842
+7913
 %%EOF

Modified: hadoop/zookeeper/trunk/docs/bookkeeperProgrammer.html
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/docs/bookkeeperProgrammer.html?rev=944003&r1=944002&r2=944003&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/docs/bookkeeperProgrammer.html (original)
+++ hadoop/zookeeper/trunk/docs/bookkeeperProgrammer.html Thu May 13 20:23:35 2010
@@ -226,6 +226,9 @@ document.write("Last Published: " + docu
 <li>
 <a href="#bk_readLedger"> Reading from ledger </a>
 </li>
+<li>
+<a href="#bk_deleteLedger"> Deleting a ledger </a>
+</li>
 </ul>
 </li>
 </ul>
@@ -292,9 +295,18 @@ document.write("Last Published: " + docu
       
 </li>
       
+      
+<li>
+        
+<p>
+<a href="#bk_deleteLedger"> Deleting a ledger </a>
+</p>
+      
+</li>
+      
     
 </ul>
-<a name="N10042"></a><a name="bk_instance"></a>
+<a name="N1004A"></a><a name="bk_instance"></a>
 <h3 class="h4"> Instantiating BookKeeper.</h3>
 <p>
     The first step to use BookKeeper is to instantiate a BookKeeper object:
@@ -391,7 +403,7 @@ document.write("Last Published: " + docu
 </li>
     
 </ul>
-<a name="N100A9"></a><a name="bk_createLedger"></a>
+<a name="N100B1"></a><a name="bk_createLedger"></a>
 <h3 class="h4"> Creating a ledger. </h3>
 <p> Before writing entries to BookKeeper, it is necessary to create a ledger. 
     With the current BookKeeper API, it is possible to create a ledger both synchronously
@@ -537,7 +549,7 @@ document.write("Last Published: " + docu
 	The <span class="codefrag computeroutput">ctx</span> object passed as a parameter to the call to create a ledger
 	is the one same returned in the callback.
     </p>
-<a name="N1015E"></a><a name="bk_writeLedger"></a>
+<a name="N10166"></a><a name="bk_writeLedger"></a>
 <h3 class="h4"> Adding entries to a ledger. </h3>
 <p>
     Once we have a ledger handle <span class="codefrag computeroutput">lh</span> obtained through a call to create a ledger, we
@@ -647,7 +659,7 @@ document.write("Last Published: " + docu
 </li>
 	
 </ul>
-<a name="N101F9"></a><a name="bk_closeLedger"></a>
+<a name="N10201"></a><a name="bk_closeLedger"></a>
 <h3 class="h4"> Closing a ledger. </h3>
 <p>
     Once a client is done writing, it closes the ledger. The following methods belong
@@ -730,7 +742,7 @@ document.write("Last Published: " + docu
 </li>
 	
 </ul>
-<a name="N1026E"></a><a name="bk_openLedger"></a>
+<a name="N10276"></a><a name="bk_openLedger"></a>
 <h3 class="h4"> Opening a ledger. </h3>
 <p>
     To read from a ledger, a client must open it first. The following methods belong
@@ -842,7 +854,7 @@ document.write("Last Published: " + docu
 </li>
 	
 </ul>
-<a name="N10305"></a><a name="bk_readLedger"></a>
+<a name="N1030D"></a><a name="bk_readLedger"></a>
 <h3 class="h4"> Reading from ledger </h3>
 <p>
     Read calls may request one or more consecutive entries. The following methods belong
@@ -956,6 +968,87 @@ document.write("Last Published: " + docu
 </li>
 	
 </ul>
+<a name="N103A4"></a><a name="bk_deleteLedger"></a>
+<h3 class="h4"> Deleting a ledger </h3>
+<p>
+    Once a client is done with a ledger and is sure that nobody will ever need to read from it again, they can delete the ledger.
+    The following methods belong to <span class="codefrag computeroutput">org.apache.bookkeeper.client.BookKeeper</span>.
+    </p>
+<p>
+   	
+<strong>Synchronous delete:</strong>
+   	
+</p>
+<p>
+    
+<span class="codefrag computeroutput">
+        public void deleteLedger(long lId) throws InterruptedException, BKException
+    </span>
+    
+</p>
+<ul>
+	
+<li>
+	
+<p>
+	
+<span class="codefrag computeroutput">lId</span> is the ledger identifier;
+	</p>
+	
+</li>
+	
+</ul>
+<p>
+   	
+<strong>Asynchronous delete:</strong>
+    
+</p>
+<p>
+      
+<span class="codefrag computeroutput">
+	 public void asyncDeleteLedger(long lId, DeleteCallback cb, Object ctx) 
+      </span>
+    
+</p>
+<p>
+    It takes a ledger identifier. Additionally, it takes a callback object 
+    <span class="codefrag computeroutput">cb</span> and a control object <span class="codefrag computeroutput">ctx</span>. The callback object must implement
+    the <span class="codefrag computeroutput">DeleteCallback</span> interface in <span class="codefrag computeroutput">org.apache.bookkeeper.client.AsyncCallback</span>, and
+	a class implementing it has to implement a method called <span class="codefrag computeroutput">deleteComplete</span>
+	that has the following signature: 
+    </p>
+<p>
+	
+<span class="codefrag computeroutput">
+	void deleteComplete(int rc, Object ctx)
+	</span>    
+	
+</p>
+<p>
+	where:
+	</p>
+<ul>
+		
+<li>
+		
+<p>
+		
+<span class="codefrag computeroutput">rc</span> is a return code (please refer to <span class="codefrag computeroutput">org.apache.bookeeper.client.BKDefs</span> for a list);
+		</p>
+		
+</li>
+	
+		
+<li>
+		
+<p>
+		
+<span class="codefrag computeroutput">ctx</span> is control object used for accountability purposes. 
+		</p>
+		
+</li>
+	
+</ul>
 </div>
 
 <p align="right">

Modified: hadoop/zookeeper/trunk/docs/bookkeeperProgrammer.pdf
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/docs/bookkeeperProgrammer.pdf?rev=944003&r1=944002&r2=944003&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/docs/bookkeeperProgrammer.pdf (original)
+++ hadoop/zookeeper/trunk/docs/bookkeeperProgrammer.pdf Thu May 13 20:23:35 2010
@@ -5,10 +5,10 @@
 /Producer (FOP 0.20.5) >>
 endobj
 5 0 obj
-<< /Length 646 /Filter [ /ASCII85Decode /FlateDecode ]
+<< /Length 676 /Filter [ /ASCII85Decode /FlateDecode ]
  >>
 stream
-Gb!$E966RV&BF6e$6>[)[sA.s30SI<*r6/OZj1%CAr;^$P\0LRbJQf4V\=)j'0)@bG.%>L`(F3GdJFl;-jP^:1;^rT-Gl^=#f?O7:ce@sa1u5;Z5pM\XgS0$=fK(i([)m!PQ(OGK<hq'/*FFM\Zr1(+s-#9?(df<q_XU4Vi!bX+W3go.!,DF8&pGTIt_qER#iaZbO6B-PS:s8PqLna7^lF+[[Y;NLu<57K'=s3-,@$X"seXW4UE5%KCH'6=!lhl%MYe_O1!e)b6Ksei(R3ZP,&03E1n"p<qe:.!](t*DKo2BAK\jCO)8P$f%.A@Zob[7B":FVBei8G0@@uW%]RoN(GuF(=%8b%c.um)MJ?+=FIZA+.0XaZpjVAY1'K*MFqiRa"[CtO-isU$PF5Tsc=-D3!t(1[AL'A=iK3P?,_!U1UUrJ[?&\._cg;mA.5:*?Kcl[1p^(=$WdTL6_GB+o&:1>4\gWmgp^,hX*k"RQo^7s]J&X/RT^oTK*!KV\dI2)(+1G7%@u,I`j57^="YpFMdC3dP*#@b^$:@.8V8/W:L_,Y?J^U,YI-:gKIkl/S[I,=0K*pThMK.XWCoa(G\^*4KIB-$<QlF@mUEA3a?\ih4?<Yf;A$"L3[d'+QUC(tgrrQHOi8a~>
+Gb!$E966RV&BF6e$6>[)[sB.ta#IosD%D&J>M906!].g:'hU:Xp>o^-ajZ)eE>(=!?$<XTs!01"kL&%"L1gu4j]-uST1su9*>*s[S"OTiM&6=..EZkuG-tB9f4QQ,;I?(U1eEJsWt3XGVQ6iZ`Y@.JdYYJP8pPu:UAWJ>17Ke?A[l+jfV-OFit@n*')sIEk(!c+_t2ljQ")g<^07MY5&XD5A7taM4H9^@a!6t3"&]1Ok4=,A%AtT4;na(I<NB:>]A8%T>kt'J>ALe--3p(*)G60O!uio#U/1%q-\l19AC1i^.]3]bTCB,O:!oB+0V3Hg(="K*W&[L`al5=Lj"uM7C8O;A?G_tn-ZTUlfZLLk<$*,n'n/c+*%$-%Go!8""=097$WD!X0$D[Q0PiN#aPJt:H?hb>OuSCG:4ZUpE>XP%E7Luf's<I/HR-f.i*cs$409'=R"CgsAM:Ys8ASX?c[[]?Fo%g<6Z<^QbJN-XPubLq%f[Ea8:ZTXQU(`\Y`-+u1'nT_'&L`2#.ikgD$FVn*(@QeUYjPJB0'9/S3SjRkk+$l:l_nN<V.kHO%1P.nA::8Yp%g7'B'od_9kN"-\njtp5cea\&P"pIS`e@757Q>Q#EKV0)*?)[;T#U*X_:ZY17r%%\FurJWnZnesL4HN\,UWs2YhSoY7'2'^5~>
 endstream
 endobj
 6 0 obj
@@ -29,6 +29,7 @@ endobj
 16 0 R
 18 0 R
 20 0 R
+22 0 R
 ]
 endobj
 8 0 obj
@@ -102,32 +103,43 @@ endobj
 >>
 endobj
 22 0 obj
-<< /Length 1815 /Filter [ /ASCII85Decode /FlateDecode ]
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 108.0 402.141 206.144 390.141 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 23 0 R
+/H /I
+>>
+endobj
+24 0 obj
+<< /Length 1902 /Filter [ /ASCII85Decode /FlateDecode ]
  >>
 stream
-Gb!Sm9lo&I&A@C2i+UHT-ijq`Qs8p64`1d%A"?ft5YI3WQm,OnMX13:0),U#T9;s?:1c6^K\cBQI9>hk\')`DpDabU4(u0-3,#oHaFQPY"V/cPSr8HkUZEQqGt%3[\tMgB?[^2ID&2R6;6n`9Dc*dgUY@VRrCtFebc]?#B_guRo5a@[\5s4PMora!@H%+).kPYO^rHq+;'s]6iqLEo,"E3<'fha#A[&Q$oh6ej+f],;gB1Uj8!Jop9KCfOiZ#cP3ERtqhU#1'``fV#8%(i<DW?X`O&s,X8R@'A&VWZ!%)WL$RfOlM%!oqUl91k\>eVRTc!.'QR:`I/JSUk>anEX?E:A8?l,$o-gm]*fQ\oD7_XiJrC!HK,PESLPirK0M-OKDbf^"e)Nd^&N3bYM$L72p<`mXR[7-I<roG-G/*!@n8^meui)JYSC>]3CP!=P.fM'?=O^nMHmVh^U1J-A@.Ws&F/?;CmCZ_@0tFPiHi`a%FETVLX$`QHDt.$Gj5A3S#\p'X-;9EOl,f]uQ48L_AVVN%:c[7J>Og.iB?2i5t,i,p%CV>=e<2MMF\dCWrdKT,-A8W^*-c?baR=a?@r=LNqgbB*(aGHlA_?/gB7$(>:(OfKf]]M/AXRY2TWq:'Pmi"Wnm`:#c!*=!!.'rRf:oVH:22:qAGCACgOrZk%lJ_tGIZ%jN6Q=Od/8Y..-0W-9kJ<b&^IT,Qh$RJV)YFrWMA2=1\CAdq))oEbE;@Nl]o/Gg)qkTZckFPW^;SR<$ZaA?M-Zt_dCT(C-UB*;5]kV,]W,"kIEe;)F-8*dJ5W@6O2]5B)WYV*3TehP_&!,1Z^f?9d7NH.O1kqIb-;4*.:TNSXiUBF/^&r77TMSLrK[(6J%5lO*#-A6*WH-$Yi4,.od54j8>LhsdqQ1GQmA7Gq?8CLu]p&m3'il^$L-$h[:eXHoM<.KIe4l1hKc]B14Qqp-,as3)F#i%L202VYC`'S72&q:u^=&A:E`IL
 '%ltQ\Q4FLKZ`Q(=ip[M^FqVQ?bLc#-HO]98)*sdHECQ?ff,PL:9[90I.YUT0a&S76q>;k$J=tK/LZ;#IXh^.hFM'hF4[BN\.]31sQe;n;jj2P)$FlpN\K4hLTDr'96P60:LRO-\mm''Qn/oEPMrtSo'qQ2kRl[d7"8U>&nU8U_hFikrB2bW`fB535onFiM&Q"-n)k"8Gbn0::iCtp8@0XkZlQ>--]Fa<ss8.j6m0:.6K]ch2Rc9cnZ&)?Xr:>%\_N.83Zg;pe4\UXaV7r6u7i/M*2C3BIW2\^BT+u)jK\"Vuf;U1!Y9*E6OXL`nXNE+a5$mYNA)lhak;GkaRq$8^&DP=F9Fb[g3#j'f@<KHSA=Qk<<Bnp&j5<UhG[MV%@Yj^e1@.R2h1\(J'<a`_NM!4=]ok22T@GuVg>[.TJ'`h[3.emA.:'X0ibfPZM2^mj'q"_=I?u&$)VC=_r.=f%P!J1_$AF)ib_ngG9gA*@OMF*HU0-a]Ii!eEpHO+(`Zjk=07I6g_*SQGHpS"$&1A2DgCY/GZ7+Rh&6B-C8IS)iHFrnI4^Up#KoiSBYUicHpAH;^F'Nb$2)NV%gHVr'Qh%l"kA,M@'FD8OL4r,;$r$`]E*!>T\f]8KDP?\5\51N&"-BL_oQKZ%#d_*Od-H_>>1tRP[OTr:Zl>Oc't^6T%R@_AdJrgc+if+t.pNd5=R_d6f5N5l1hpie37W:>(IPaRN';n[T,[P66((1jWBUlhL\E@Rm`GllX13`M(ssSn3'r\k<hUFZ.Z8(*IS)Q<>?r+J1\^,g=dQT7)eO)k#:4P2N+H-XXc8Y0?[4[/pA~>
+Gb!Sm9lo&I&A@C2i+UHT-ijq`R9T$tT!X9KYthEJTI!-<9T^er`H?WX(]4>"&u;=03h=JS#)(h,J:5%3aLB@3:\Ph@%m+I8=ZC*,+NT+`"GI?0q4<M$l_EP_rGb9q27fJTc<l"AZY^cNpMmcEPHSu:;kr(uHhgZtK?17DT4n&Dio>(L(V#eC%u]/Tlf#YRO]P]@0Sa/\>a,Wg]_H>`/'/AkBMHbt7N$AOc0L3aVF/kVd+8N0+AP`bp+YTAO,0tK'BJ)%EV,,0>;4WZ2*UR_l>Ts7%"#Vkrfe10Pa6;g<lZo>^c*-M1;R@+XKUJ*$HM7TJ^qDCg6a=d.MfPQWLrN2lk#!2jO8h%::3#6`%DMQM$qWGIaWuD>qRIbf#.XlN(t!&3&&rW#9<Wb[lW`OG(tljA7K?MPTk2r6&#_eH4E7XADk_=ljOWP7'*jFML^E/r'V.$+N-Pt!`'7YP5kuIgfF[W@D/6FJ7h4?$0\';2iN$4_iS'H4,UG67T#sm*fInTdI[f3!LX'/3&&t-n<6IlZV4RjNGFs8BUV[BMDpAIFPug4KU)CGBsra79kuAL5+s/]F:tD<TXS6n<*&,/*6ZW(@sLg%E>NsLk7S$$>0m\iP$C.i@5\..ckb+V/#Lb:J<TcE,lZ.Vcu[!q;K6GoTTZ<4<*\h`eF4nQr(3!D"2F"!@Ll2S/BQ14OZZ,8?qsL`!3>O*Ff.,2(J:?0?:03+LiiVg<VXg5B>_2aWLAJ9qQi3G?`?*<\LU[21cO74/C!kQ8tBPH)(Ls8BYY'Qmol+u1d*'g3FV-\',PB`T\FARX,&*@<<H!Nd$_foL<&O=i3L:J<X25!XeFacag8\RC,Od=*'T38FMLTU'KR_1d!;@VTd![`i$9%6EdDp](E;1Q1NB)q..(3ST1'r!kcPYO2FB&!XJJ0BB[YJk?r.1eZEpC#")0R`<0lZm=UL\1'[3iK$u)oWmPFnSCY,9]0CZ6iKD&`U5HT:9b2IC
 [>MmmN1n,P+g\8&_rrpDXRZ5(Z4We"ZUtN\,-PYhmcAPR0Mc(PE89U3an&IbR5Q0?I\/7/`]Bs>CU1mufo/Ep(hff;G>.3P/:#0\;bI9Gl7&ulocf"Aj50C^.'_X>73;_DIjZ6[q;!r?YEu(eb2OtpkAX4/(]5S#Y[/iH2T9FL'Sp[I!rTWSZhBA.nRa2>'Ii!D#FKMEj>P;7!EGbRBn!,ksEL+=S\/>!Y!6)1]s7Ej+4Ek29c]tG8jak)eWK*j4X>qFGPfBu7W=,0%kX+'@G_-e&i@I\J?'gZpUA[9e.E!CP6()N]5n`JiO_rV:^Lp\6cj_3^(LpM_f2R]ON99.B02iJ^Pa3N>NsF=T9UMAIafMCu\PQ41,,^-`EX/qW6;?RN=tRgVQ`2CVDnaHgQ7.fIXKF-Y4^RPu@kDiDCE!u)bq[V[']"UF0+N<]3#j'f;16=;A5X7U<Sc$8j+*W&'Cj.-U/Vfn.o]VDrS9p"`s](=::-)I6G4!fih+a^Fe+#Uolk.iQc(("+1'LU..;=VRYp/iP(@ltdl6Jhl$Htm^EA"W"`u@o8Ec\8..RbAo+HcHn>o#4f)Pa_Kg9_NhbFkijLkPWo-+\\rj]rq<'Uc&7nd-F$;s`eDd%s4KYA_OUYmnmISX$D>9Teg"WA/^Hi*N,'a:a"i!()9<VB4)cD>pPmHIdp5"3gSlP:O]0K]IMLZY/SYl=qB\Qa=XL"rTil2es_?$\I(=@RSb0rT68GV.,ebdMEB#s:4.CH?W/IR=8:qF:GVX%/0N.5u3Cki%%NgqH0\@A$J7F2Y'("'u%nHVAdA&B8\Q1DG)<:""DTQlY&SGe:";*%p7U_IGunW8e"qe3"K2_2#&$<o_5:;nb/\EBSB8*Rf.r`E4oh&iHVl$Z.Gp%Vi+/H2[j$T4F,~>
 endstream
 endobj
-23 0 obj
+25 0 obj
 << /Type /Page
 /Parent 1 0 R
 /MediaBox [ 0 0 612 792 ]
 /Resources 3 0 R
-/Contents 22 0 R
-/Annots 24 0 R
+/Contents 24 0 R
+/Annots 26 0 R
 >>
 endobj
-24 0 obj
+26 0 obj
 [
-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
 ]
 endobj
-25 0 obj
+27 0 obj
 << /Type /Annot
 /Subtype /Link
 /Rect [ 108.0 633.666 234.648 621.666 ]
@@ -137,7 +149,7 @@ endobj
 /H /I
 >>
 endobj
-26 0 obj
+28 0 obj
 << /Type /Annot
 /Subtype /Link
 /Rect [ 108.0 616.466 193.644 604.466 ]
@@ -147,7 +159,7 @@ endobj
 /H /I
 >>
 endobj
-27 0 obj
+29 0 obj
 << /Type /Annot
 /Subtype /Link
 /Rect [ 108.0 599.266 235.644 587.266 ]
@@ -157,7 +169,7 @@ endobj
 /H /I
 >>
 endobj
-28 0 obj
+30 0 obj
 << /Type /Annot
 /Subtype /Link
 /Rect [ 108.0 582.066 189.66 570.066 ]
@@ -167,7 +179,7 @@ endobj
 /H /I
 >>
 endobj
-29 0 obj
+31 0 obj
 << /Type /Annot
 /Subtype /Link
 /Rect [ 108.0 564.866 193.644 552.866 ]
@@ -177,7 +189,7 @@ endobj
 /H /I
 >>
 endobj
-30 0 obj
+32 0 obj
 << /Type /Annot
 /Subtype /Link
 /Rect [ 108.0 547.666 207.312 535.666 ]
@@ -187,172 +199,205 @@ endobj
 /H /I
 >>
 endobj
-31 0 obj
-<< /Length 1938 /Filter [ /ASCII85Decode /FlateDecode ]
+33 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 108.0 530.466 190.644 518.466 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 23 0 R
+/H /I
+>>
+endobj
+34 0 obj
+<< /Length 1941 /Filter [ /ASCII85Decode /FlateDecode ]
  >>
 stream
-Gau0D968iG&AII3n7^--#QYL4R%@j=:>I1Z1tK$h-jPW],h<YQK;97Vf,&g*=O80:VpiaI,CnFc^@ti:cUKk"dGkKoC\@FN'Y;A.I,A$*H`[)BL/AbH)0I3K(8F)`f<`lZgVCX)I@I?.DGB;oJ(SIK4c2R"SCuKhG(C5kQd-OJF1R`2*Yh8TeiT#nRI]I.96L*C1],uT'4iTaJtl;JP0/lC3LDWYRIUo@(rM=qf6ekif9bo:@LC&[67+hH)hlYRYD%5r_"j#6/%q>bi&;e&Gg,bAP0\;XEFfMACl-'L?V.L'>W.*`/u;N&[oP:"G=+cZMB>:=[$*.eBBZT6H(HQbrf_*\og1nqo&hR\8<J`a:P"?*+Gbt4^`Ki)!\Y:#To\\/iKZr4Yr@'Bji'\?JSGRa$@&4AXChA'2LH*1KOR?KDr)]!)F_7dhJfhu(4N26N8cZk5!dQX/_cUHb1$X`Z:.98^`LuVn5+?hIBUlu*##15])d$m2N4Bg^h-Y#dNhj5I(/8-Z1d'n;7<QshsNB4DnaILOt-)6T6Q[Z-i`Zd]jlG=Cd2)CkIEWBIneKV04rNlE+u"HJF2@,!$?D^T'r$'^<\G5J[3<[fB^Ec2a:cc.h[utV'(?7Qb0?W;O4qH0-Skshq_r"me)@qmXW?Ib?WunrJ!tJSV?GVhKXtrD+WlCYQ=3%GMH(9USRS.J7.$Ma>8Z\+Y`1V<c/^-\]"n&\p,oDke+KsDiGs(.p;#$^RS7aW3Yhk8h5d/9L#+HfaGA:]dd*s!\>Ed+j7!ectRWiVm?8$l6qO"DA74ooP6f]eIrCL?>UT]2YSfh"Ou`mk=]1dUDL?*nf?@[hdKo?RS<,!IJS(Y#s)cSlD*ik#,<<#S(]Q,11`"GdQj"IG#kp^EXD+N!Ad0@l7Ps<6(c,cY$c1CS_/Od$m%'J.Q9Cn;k02q<o,t*lA@Ah;baYLV<Ke0C1U@E0q_-=d`uOs&O]\lp*:]h@504RFVi6
 n3g9h$o%gQ"]%NBq*UEOdJhF0-r68a0!m-?uAj$?nYRjRr5nT%AM.au70aCNi%rAJ6i[J$!#cSnUGRXE#2m7rVG<fT:n?L`E27%GI=&GA$0W&EW:_B&)eGoX!AT</bYK57d2dc#kmj?X.Ds!BO@HEH>J/&qiGK!n(kh).`ZIgk1jH!jr@<NNn#+X*n?tQAoA<![:qd<kmV#<kU7Qmhga<^e"9L]<ofIeLt'$4%TC4JGF*rm0YkTp)PJ.*E2KUaOj(K()1d,Y6JqL$B0_oLbl9fNaecru"7@AH<ni6<-u9j>OR0kEanY0P`?VKpDJpa:2S$Pfd\eDS,"L4m&/7ZF=G,TE5!`f$P=3"Ad;+fM`ApBmcY.s8IJ*8P+qCIj8u/dXQRr.KWh[2Ut$9jC-*fVCBn33ZpkiVHOg)dVa)<8P/1?_-q(85)CFTXM\GYFNIIPH)h.Jo>i^hl:H$%$4R5",Ofta,JkC4V&N&Nn3Ncq:R<3Hmife!`qQ1k2f<!Ru6L2@]4oX2F_#>g;I6n+u"j)j+!Z%ZUjb9I^0(i%-@SsjI4M@lE-"227&@il"7H`_3([oT]$GUbNFkF==)ql:c&Z\:*phh,p-PFP`>8t#eE<+&3N6`1quj6NH,NTY9:1lI%=uJp>+Rn24nL+Rac&-<F%>HY)ET8J:j&u3+JJt*dQiU?Vqf<5M_iQ"?bR]7/p8YLB:(Ai\Q-DU")]gU$Vnu=Cej;QL)b9pt8JJOuTHM]J*lH.Dd@;4`1J(]*1B<0&H3Z:`>CApI-?cAgGdear6r=GN\6c]5a/VW'\ip3P1*OlG7agG]:Z'a[-MtK3#30d@)"U;4n\J)ah2M9EL9+GBD%G$@V&qQ"A(2)2d7V9\,]eW56!h(rEL`&N/t><=<o;`MCc\]tP;`@c&B#B'33Zfs2[p&0PbC`+Dm(SV&fG\U;i#P;:q.p3jem~>
+Gau0D968iG&AJ$Cn7^--#QYKaUaKBS;`DfDNA^)Hb(690M)@`C+DJgno`ZEM(,SS(l#\]N#U";qn,4$Re$GP.g#Ern<pK_^ZcGS<j86Rel`p<\)b,5i1?qEubg68J]08h`s3uh]h?FIeC2:CCEuQ$!rPMB'7fsH6i_2;V[r[K6\o?MfL<KB\o!hBbQ/7Ajc\sMX>cQ91Sa#T$Gt<T400#og\gTCG@La`e9Vsr)7uZD-Snl%SP3Ybb1,T6pGpuZuk`&L(hq(1WI,KCqje^g-9CNl3juhTk&^+fKYGAT1+1K1;j0,gp""n@SQ;ga3R6.I;MRsSMKAm-`2=8q\]+ahhMP<Z))?38coQi-_(<(?dXJO!,<Fim5!YE;i).8M>D1S#\1\DRQ'jcbK'0F+@)d]\d!iS$?R=GNW`>Z1'Dke,b6mtNhqW9@rY#)cjP;PjOA`8Ea_C3N(jV%c6hQ_JHUJ,O_5$N+O#jak%r")<oe+_Qi^bKhp]c0hHA`EqBfX'73o.3TM#N'AXHu/`T>F[>bkBFP?_qT+9o<]"@r?n0QpZXp?;XYHp+1mRLa&,X1kca6.(Zk:7$SF$]$F$'cQf-m^/rJKEg\9A)+Ahda'me]IiT<YI[q.%0]+bD6I(@En/nMFBq#XI]q;$J-m9Y9%m#H>'^!$ZJhQ=?Lg0*''ie7Lig6'Sb@3aXJDV.f+U87D+Lg\lUa>8Z\+Y`1V?>\gY\]#1.\p,oDkcDLgDi>l<-s:-u^Dp8-B.E4RV6lsV`:W(EPuRnX8-W(sHNdM8<^Kh+;k`7:GbN:R=/hrC%_5Fp=YZueNDr\1-jI(n=kVT>BG+.FX+E!T'oZJK[EEc%7t$/Dn`adtYO7UX'2$VKK2EFRY;7"!C#%9o0p==&&X*Ef%(*?qQ&lAecPW#uY#KV-.L:b[hKB'L)stT[r+,;Ad8RU'iS*;(5dp7G\Xor`=';E"QBa:T-<.++lRE*<WCtqO9g4<q.a=U("#hb
 X7CDDjR6cVV^dYsVR\H9gC!a,VY:f%fMYZ-l!A9JHXCOM&0FA3HPs$N.O[&A@q).+29'q-<[Sf5a$POZm@gnDAKicO"@E0BcQr8[o5-:6T$bhS#XFr;[@tffM/?B'F,@)'tkOapBrd",.me6)6qW#ie![t.?0bCQ5LZknr#oF];C-WOR-C+M68gV\6,M%BDq?>(oFb[!&<Gr'gL4.btKk.UiW=G8e`afd9JF-jP-]p%RWWC2)rrJ3YFWgP,J.*E2Kq'RikAg%md,Z/dqRk/"rQ"Ja9fNaecru(9EMQ$Ni6<^09j>OR0kEanU!D@2VKpDJpa:2S#8O@XeDS,"L4m#F7ZF=G,R[=0PPJ<p<!J;-"AMo*?GTTRV/H<nK6s\@9g,ZR8^Oa#-Oe5#rLb$GiXo2#a.P;Y33Zpsj8*>W(gZF*<8OT!?^(4385(8&TXM[\W1:_BPGub-JoA(8hl(<"%$4X7!snF>7^(j'#EAmVlh0ZCCmHk@(,eR3/"[FFo!Y)`7"&&qf"idCOk6Kh0pejF9Hq[T?_j_b<rJU3/]#@/o70ta:$I#t<[OK.fuN8l4^RX982O/iE!W?&dmcj/P43TB)Z,(\-CKf=+(6X`NUm5X\j]g74@*4/4'*bg$P(K9+g`5;S`uq^hI*(H:GX@ml86AXXr'j!`WHsk_.cc<0[=.m^N,(4.1XatXcGOFT'n[KpaXTW!@9)_M*RP,AY))&+)&P9Z\e9q>@lj@L>%g/;.\[>+TkCM-B[\81JlmZn;25cSsT?&GhBV]@p-5bM*=uu!+!?$f5KBF]A+<>FAL17,-664?LAo*YuS*N6Xe=Jp*F$bj!kDc_JX-[(PO.((jJQkN1n=*N_4Cep<?EMT4PT;2b"7n-=[>!H:?>jUK8J_BbsiF(?kG)=I-Q/l*NO]U<4:saG0au4!_7mk3`;PH,8U+*hAPSrWUklb>/~>
 endstream
 endobj
-32 0 obj
+35 0 obj
 << /Type /Page
 /Parent 1 0 R
 /MediaBox [ 0 0 612 792 ]
 /Resources 3 0 R
-/Contents 31 0 R
+/Contents 34 0 R
 >>
 endobj
-33 0 obj
+36 0 obj
 << /Length 1922 /Filter [ /ASCII85Decode /FlateDecode ]
  >>
 stream
 GatU4hfG8H&:X@\_.,7LlB":/\3;4P[b'iioPWZtV@N`=_hA'o\Z,W+>JR[J(_N[:9KWTfX4?XI]:X2W?G0RH^9+??L&V[afHm[6"9JGs]RPCT4[pX`3N[Cde\A0>B*CVg6tl:4n#8YlHrt;fmNCT-+*C%=*Y97ccMGraEco\F^NR=Plb>\54p`55W#Ha&!r!h"WZNShIP(Vd#Gsc6>s#7C@-<g%O(hn![P%623r)RK8rkoRMZhM9hGm/n79QS&Ic'MGVX@tboW+$D7k,uO8>L^#>ph.&LpBFk7('LnUN1Y4pV])+8,VCR7FRJi.TB9?Fg2$hR"6#u.TB.iC<%IEJ?Yg"okE[D(f<nW^m''r82,011#6^l^dB"1c$U3Ed>CGn,RTg:-Vi.,.*MF#Be+n#ZO<!QgLBR&R>1FH6A#c,d\BjC?!I!6R;oV"&bcFYC;KO1U^uPIeI]B,H?E')6]Y'd7Wjr?#a[JQ<`E9+6,7sn]6TI-H/Q4'Gp2)H-e&ZfV82j%B]E98%Y.E:;\F+3RejQed<;--7dTlm,*Rp7/!ke/]TB?O0GcA5"e[X=P@,k;-V>'f`hpo5HFM/^bKS:bma\s;N1/0DdAf33EA&O6B_#)+W4CPjF<D^u<FK@7+[):G?".0U1A[<d=ECsT;K,oAmlIc`c=RDrS9W'p#t#Kq@u\rL;jV(oACqC2,-Nf0fgM,`T$W86$DGiYGY:hGBX^Ad,0_E*lMBI*ap+"T/IQMPq0R)1T-c8<@HL"K0N5*9k]95gn/EH^he?_jaSYqH^%ampOko@:kT6B?E5sr!N]E%dQG!CQm-h-@]ola:l7\Q%ir3,Bqg<YRo_;o""hNMI8nRO@Up:lmPLU\K@6V\L/mG=L67jB&\AY-q+;V[]25L(S/2jUI30#.j@2?P'd"f%Eq_rSHL9@W\I^<!/m+_#Wij$R(FUZdJAn%CN;n9/-g%lXe)MR-MDetCE&n&RAm]W'WMU#mlRq^2
 T#-*IK5"Rd[kAEN_+ZJ4T[Qtjg9RS8<6\V],eG]'0kAntf8T`G[F>A.Zo@%7J?5FJO`dX2B`Jf2@LG88cJO/LdBnBrE51$KSP^4B#]>3b/6si\pO!7D/2Cuu\F#3>/02A0c,%q$WIbRGH7UV&G3\=Sa0i22c<n`BAh)E^ZKO"2;(Zc^G`F@]!/qT\N$`T0=j@EZk3%e/X;h(5enJ`C/d%!<Whj5=LXN#KMmt5:_c/Q:L"4"b1'"6A/pWfbemlE9T*h`^"6J1Eq<7["=;2?tHB9Bm7L('N]+^"C8D^-qmMeX]"/1/.:9I5Tb@jjAS(rr=u`Db$bk!7'U?e6JP-qZIqc1oq!>Qo.n/hB"B'-=O+8D;;GT8ljVfS^pd8!?Y4q!*;G[D^&^O:jU:<4T7$iTsN-H7qN?@>9JZ`O:AAMFid:J\J1Cl(eRJ%GgaqdpLfCQ$/@ET"&'dVO0biW,3W_Mn0"#JW\cu>?]__F1K<IA^$0$39c?g>q^2T?^i\0.i^'eF2!@[NVj'K`!g5LYAkNtL;\3ZduIe03LomjRVEgucHIRI%Ir,o:4R0NiD<9U(*=T3=>-8^&+RL--h4GpjniF$1PIJEP;-IrF=MW\-\j2(USs&^="YTZTD'V,4+EYGIFKhZWOq4dW(aoSAA-D@ZG)WC$B/H<WT8<Hcs3QNdfLM>.^aPeTQ7\GgCq"jBqI(,!o%ZKVCl:pk_.G1Pf9E.[u^rhL0WqB6/KOg^mqG9;B>Y[l.oWp4#38"kO"/n)#3&FX1t;KIIHl(nSjNm$hO?5CSPgT-cU-[b)8@eN`&`!YjEO;Q,[Q&g)P7U:q.d&p;54j39?[K!I#a'*'6RMD;FR5@[dmI$_sE60M_:s6+tX?"$%8)2ac!>j1BW4Sj\Ln]WZNZ2Or2$&f]/fj'Z!$6Y"fkp:JPq7H"3nl*:Z~>
 endstream
 endobj
-34 0 obj
+37 0 obj
 << /Type /Page
 /Parent 1 0 R
 /MediaBox [ 0 0 612 792 ]
 /Resources 3 0 R
-/Contents 33 0 R
+/Contents 36 0 R
 >>
 endobj
-35 0 obj
+38 0 obj
 << /Length 1691 /Filter [ /ASCII85Decode /FlateDecode ]
  >>
 stream
 GauHL966jf&AJ$CE-/)m/J8\Wh:!Y@f^):3Ft::dk9,CnZb_G$H(=g0'k"*Y#+Xa.jbdOS[JKiE2n+^uVoA#;)0Rq7n&m8&OmDeVYJ2NeJ);pj,L?%R;E1`15I9+&"J1Z&3;qTElsQP0/ClVd+`d5\4"VWI&IteHfK%jP91%9ro>=`/V2:o[;+H/mn4;NM7uCD3T*X(0JObf?';X0DF$gj+kHW62.5S:R=9".[RJ"9,M-6rlBbigkjZZanQ"I"A1&Jr(/7^%VA@CpBNA8c(@O8g<q9-8fC+G<Jp.Rb86p&Y<;.OCb<@S"WW:!]Y!)*m%g7jf$!c9LCGcc>J!&7/N%N&'9em0W'1uA9Jbg/s.)c:dfT8*f4,/e/6$5aBuhhmeB?ab'MNY[@RE?=[Q%!%E8<9.fH#`6b+d@j7!f&7O;L!IhU:\NR_VII$>J5=cPbN-JpcVCF@9If9*9Ypm(:;hU^IR$`ZW@uF(iWYCP!j/8GH4lt!o!H!'DiJjgniY%47"TY,6c?^i$Ah%l(e-f8qXGkm\#%=1^?XD=pP[1=/n3X"`I=Y9='spubnWHSR[@)riGuZF10[@l4]H$AT.<d)qa-/#drR't2@W+jD^B?IjE2*N/62TSqE:/f54W.n:):M'g9IBR0%u;>To%S9eb]eG2:b7#1E<UOgpP^Krn[)q>OhIpfQMCS((VGTF:ZpnOO5X.C1UkG$&\KPJnh5rYOD]hF/)A=2b37*0LicHCi8cX69%:UjRt$E=q++]<_u6hWfbWHI=W`'RR]a+pIWADB\Z')=P?gf.X+<.Fq&a-3#R?r0f<[T<,4nrWD1g!^i>jU'TkS!=pNTH6c`'pMlG]fH8,_n9gZQ\2D68c\ZtQ+eRLEi11!r_<ji?'3b\/Si@3Nj*0qg0kdLTdD<\=#U@)j;o7U!%1L`.Yd-4<VSCD(Hd05-oM:Imofk`f('[A2ajBV)qbK/lNTJR+BOA>R^*DP[!)$:/O.qc>
 \D(h[F1r+AFPe4h65]uQ%M9bV3_f+au4jPo%;oVb<0k!,'Xn1d2ba(TM5)18I!.QT`g7l4mnGHISG*J$-=eOa"%;e+OH"s2?mFRD.>tsP%#Xr2%`hmf!kat#tRP]cdCKd_!eK5V+j(\^GRt"\)'%uuaJ)L-oJ&YVgM?7(h/E0_hKZ'VkpM%sn&HFpTSu9Okj(c(=DnG(gQ6a$Pp"j6$RNcu^_/-#7Mr5CHJ^a3*Tb.W7eBM&'eFA;\jR8YC#fS3NBK';KeX4!]^*4gj1^[H,((qrOLGgRBDF1Ml_.W_Gb\fP=eol9F>Gl&/IdNXoYTA]`1JG4d[sI4QZSPSm!uH[bV&-$5*)Yd?V['-$g0tjK,1`MpfNlsu'o#@eI;f!n3BnFb.t[L%W.H,?NMt@dV#[kpYJ?:NMsA'eBVf/MnkW0Jf'&3Cs7+\)%e.%-H9Pu#+:Y2o2[J;k1c<6$-e\R8:T!'ifDW6SPto(^!-+X\:#S-eO@^F_P@o1E)GVtH!XF\$S%>IdJPVg3(SSDMo<e7jGc=k/1["IG+s<3$Ds:G@C#B9L&Op$]e^YeJ2Que.,h%;`#"QN/jr7a6@R)O3[YE8Q5m#3ERmG78ML=Q>\epQIG`]m;R;TGB1'D%7HOtqVMWdOHXH"^V/j;,VCY"PeXU_uH4.eBh-dB7Z"N[mm//m@[=Goe95=GW=pj^\R$)R~>
 endstream
 endobj
-36 0 obj
+39 0 obj
 << /Type /Page
 /Parent 1 0 R
 /MediaBox [ 0 0 612 792 ]
 /Resources 3 0 R
-/Contents 35 0 R
+/Contents 38 0 R
 >>
 endobj
-37 0 obj
+40 0 obj
 << /Length 1883 /Filter [ /ASCII85Decode /FlateDecode ]
  >>
 stream
 GauHL968iG&AII3n7^.D-ijs.UaOo:;E*jI[5GWc3D^tHZ)1'WK];4QG<q,)Jg)Wom;t,R#Tso8rV#mb\+A;OI.m;n>&3p5@2@S8[QMlg^FiU&J)H8!O#pAkXQAf0g$MoC(4*nfbC=n8/^!"pHo86G.3&7`X-)HaTn."(\(9`C"_7JaqI7^!!MQ_2C'COV*$m`E-m9*_d7Nh+#q%!L.?RZ_TOP%fQ.uX%W4-M3`Cg/*d^?$L*q(VAkg<$Q2gQ`i=f.p>Me:nZ./!AeRlb^#qJc1Rk:k=e6Vjdt!-82S?3V6si3qe:U8iN2VBFnO@AXHf/CHcKXbm`W+UbY2N^Yg[FXE8/`amK7[)fS+*i8\R2K;^h>W)qC$a@0J?lJb%rStfmLR[$opJZT!+>T"^<j#<7>$V*Wan`j2iaGCE<pZ\EjRK)unm[Z1.<Znb4/$r+O7/:*oAP.dV(q>pg%>h^M_rhV8=f;jD#1-^EcI?Zq-&9n*g/I.oWA\kGn^%p3L'k`ampS/'Jib[>b+kh=FL1#jHL!q;3if/pfYq_9>"g2Q\Zsa.).@:-X>&hlT3aP%k'$)X?uG)ULu;$\']F?V?u=%\k;KtPUD[R:\<.2P,'ibngHT46(?$KBGG<]g;#\B1E%.$;Sq5)6mQ*1"jjMs.$%LI(Jr21liM$;i'Up.G6`muBZ'1un=BbLF)IlO(d.21]>lcih<m&'"`O*,a*<0.2@2]^C1G9Q)-ElA;a&C%-s'9)/5T>_*'Dh#%V=cL7Cabm/rDT>/;rN`=brUs8XuVb(9*56.s,jgOSJdFhjb5G3/^c3*lr]_dA<do3N[)@5f@Rbg]WL+&#&$m6>h\!oY3pD&9JnIKV<%YVeYO'Tam5a1r3`5EVct]'9/H3,BHjq=n,DEIgVJLJ%Hn-V<^7,qbiq9pTB9Up11_S-8&9QktblLC2ME/IKk"/W7GUNIp7q=2phBk!_`i%2aUqX825Q*KlJ-5K=?f;\i$]
 lf3CO,?V1@%aDo0lOB36"J>bae9!Q6M6&"m.f$%4;(79F?db2_(gQ1gAWg^/M1D`Ba\)U*.7jI5XE)FOhE4\anM+PmXJ&)#LEH3AQKmC*emiT3VkF[SLkn;l^VQ^rhj/p=@$15q03s_uagF,jAq^dn>0R+MqE#)"m?l+uK-c!ECZ@.<f`%qQNPbT7Hp_pKU<tQSD`BKX91<i^RR.tQ+mYXV9"S5r4aDg?U*4enI'dXo9l]35^N,GmMMsVr>X7nilBfa&e\a-_K9a^fe)0a>f1?ALcVjoXP.2C(X;IRlnE74d"2su,`Nc,mCZ>EGG"8kd0H^T=OPK1;o(r\e#`9`(H\YV9kq:AT>`c.:S>Jhg+`@Fm/#rk1fChn^AO:j+?`,A^A%GcV.E66eAaF%Y@m5FpOfVnhG*1"XD`MoEs)s$m?TiG8s;LLX"0%_^8D<6]Y7;ED=EmtAp#2*:P^oE_nNuo&B/GD4TP5B1&fVtnP3p?9I2g_]f0Sk&4Tbl2jk1VlQ[@L7X,]NU#UMhGGpE]ZG@M0r/\sW`*\_L9?P630PF(r.//!lm1c&=Bo0>j$JR-u5,$<!L[^_HZa+B=3smtdR[EZ/thjhm-"Y=`m$]AmThnC[:+>oDLY,/)tml`!BseuOG;mn%#j7%bGPHp"Y!/ff`48V\Uu![(OW$SA]5bD-9r=kIP1$W[4:?1jIYJ>J"7a/l<P6FJh_DXL(cV/.!#?FN]DJU=_LcYXB(IIR3?/]5D02<C*P!:D;V5q-1o<X>eX5O.rhZkgYq*\rc09q]9JSbXm.ccD>l&pi=?JDmaX;Kp+J:o<PQSKrY\'7.Zt*\h'cH?<u@c/>JeO*^_'XQ3#RU7(bkNKQi+:QS\Eks9`@KuTi"j]Bj+&7G5C,?TqA~>
 endstream
 endobj
-38 0 obj
+41 0 obj
 << /Type /Page
 /Parent 1 0 R
 /MediaBox [ 0 0 612 792 ]
 /Resources 3 0 R
-/Contents 37 0 R
+/Contents 40 0 R
 >>
 endobj
-39 0 obj
-<< /Length 1227 /Filter [ /ASCII85Decode /FlateDecode ]
+42 0 obj
+<< /Length 1825 /Filter [ /ASCII85Decode /FlateDecode ]
  >>
 stream
-Gat%#gMZ%0&:O:SkV3*9Y"4D\ZpfOVS)&7s5dt%6eU=*eOj-?2*K&]1J)?B)RA=T@0ao!BMK@aERA8`YI.fOl4jRfG_XGNJ*g/3JOp$8EhYmJ7d?Go-L1!%=A+jm7p3.U'5T)bR=0o-_$LpK9]d@A;$0,F-$3%O3e_HmFDrjI<Xg4*%:XD-5mGCP$el?M.PM9j2mXiIB="DE+(M"gX\&>H+Q_cN:255Q5F7u'36rf&S?AdaaY,LGH:n[76_>Fs5Orkhbi.uGLngO#?.@*I5r]^ie,8,tn`W5Yb53,R9ihHU0:oO5J3%<0F`8ZmsoC#)?1^cl=<cO4mYMh([%J",ok#-**2/Fst:0ou.B+GPbN3EdM2jursPja[)c^lCW.7qOjZ8&"&;)j>mbsVR//?jf3_1L)c,.=4J"'I,HoE;B%9o<-6Z,h@jg(\I]/]nrfICj]i)l(3oBMY9MS!@@Q-OL1G0-"6!Kk&*#ao"-d2dk4:oWo(i"F,mG":O(1Y.O&"cB3Z,K]8AP@pQDV:2'V]gq'Rd?)nbPQ<(.,@<NR'^Q`T,;j%S2^F@j,3!jpVDX<:aQCLIaSJ?U+EWu:Ub[V**[9ha]8e"QP9*p[(D?F'a>k[47b%&JA5?TKg4?K-`+8Y@I@rj;@-XbbWjJhO&QSl:Gcnd0(6tpg@=YRjn==;<RNB";aXc"XN@2tcQgFl?$[0Fi_j&D[$SZFJ^0JT:*GCKeM0D4qUR\j2#R30JJftC^Aq"upIm1e`i(^k%gYu5mI":)G=C?sZ')9UM]DL]0`T+IFi])85@Z-;P,jnuXc8,516$G/9WR'5k#a'#l&M?t<hNo)KBHYl.q\%>f\3*A@dn+Irg0iBg@$HZ''fYH.2;c#rneQ6uOPapaW_0kA9FE*mSUD%gJ@-trD+WHJ:4gs`Me<p:dIs.%&Sh0XrF^E60Sp/O"-nhJGTiVk(S1r]H(P\Q1H<^V44_G#(6/K"G\o/aIHUL`0*<Nd
 9[5?/k]A;_RC7uSY%q2^c_fcuk42pq:AbeNg#NVW*4W/BsOLXj<@DU2Y0Z,G\>l/8h2Z'H>^7?g1cKd+hh5K4XTj^PkI^gC@C[ph1:^qUNH8;cG=Y;i?p-l'uF-Sf,U>b'?5r+bGgpp`fNq7A0K+'i5dClORCAY$mC>HdsAj*sd:9DHrXfZ]49D?;O:YAeJW[dTa['T<(P>V%%6QEMF[R0GpF_#/OItNndi;Ng3&1I;~>
+Gau`T>Ar7S'Roe[csm-QS4JdRXM]Rc9tRP1\h/23p-;9XX[O"28T'uH^I-2-%M`:9!:(1U0PR*d^N8@(?Jd>PmM9.Fe60]P_]j,XlhJ1)s1'i@?O;dU:j>a/SE8ak`V$;4UB0o4nfQ]rLGJYdDRFEo;D.lEVj8$Upb$dY[a&4r+0/$G5A7Th=fK#1,p-*CIdFeOd\=ZhGqul\PB`A8X5^)tV?oqlX&Kf[l"8fu8QqrOQeBh&>$IQW<@kIm.H?2$7PFd=1!'@]h#.SA6nKYn*'=iZnpDC=GhG]FB+ffB`9U(g!B<X)OF%SuXT8l-kj/^BWJHANGY_',D8K-g\g6R!+JeHal4iHNnTKt'R;R5:g-Pd:>`?DE%<s$@beStHq,>DrD/4E=-Tn'?n&qSRV2COsd3d:h_LX`TbU9L>TSk[i3uMrN=_dp)T[Z^O,gK<?(3rhBjm`YkGnD:VepB8](bnuZ3Ik_1YO/,-80l8@[kY:Q85#d,j+GQo<OL52*IX2HJB%d?ORT^K_F.0=6^=*,Li_SLAZLeYY1_RFH+D@+VB7Blb&j2tC1!n]kFsOP9#AU-=.Pd#qsH`VpANk/')F&kl3>#&A?C_r+HDlTB!]b4:hW6.FtMZ"heuL<9eZCCeoG9shp7jZ;LLis4u`.X*(+`'?V\C?>80A)&W[lb6(oMI:ddTo'Y.jM9Q_@71_SU2P.QOJ=q23B%+b8s\5a=P,+,,6e-V$/r<3<nQ3sg&WPVF'nRN(18@6b;UK?e_X^?R(VcMnYcY"41WMaa4Md@#9iF5*>kP-`)bNf)tok]"\kk+&W#:/"[cSkCb_<ZI<))h_!*-f[C[]<of/FtipIG+VqK"KW8k36cUa\!!h:NeERM^4)/9[?&R8@/O/jZ*Jj&2`8[3#P=SJTEMLGe@=@2cai^cP3I8G/uML\uF4s9o:,!Yd1fDWli/2k5dW0$h\)7b"<uOiUQ0#NJRJ5/&)tm;hkSci:)[<Y\(O
 $<J"!ie9b^GlTG6Y9XD)mI!2tPG.LY-bT>RI*-:1(h`-]$O0[Ii^]8A[G7"g*.mD;-ri#ekFb%r&GW]Xm"JHrSj?d7dj)Pb=>.aAdO,%MRDO$#c+>ab&,GE/bg._?-8<0pg&e9,UTpR=jHE!)UCb8"_<*un]>i?gb8he:M$?)WIF0s*m/eKogaYf=1PuU5nV-'IE/Q"Ag)QpOO,%I-jJG[j7%7.C$RC:7`l<p\P![L2k)k!M;f.cg\0Jh74!geSK;QBd%>l`I8261YHB5\-Jl[@GVD3j+r4cI`Wd;H_Cd^UMu2W:\oet)L5iWr^Tk<:5IC,Nm9gj/7q]%S38?)`3.(Q`+@K3icn/QOs^\e1RHrm]6=F[FChE2B@CF@%5"Ag=fMgBfH_FGt)2/$up_^Rg?4_\mF'4M<SM$tmV&:o1GgDE>'O,k]=J;V+h6jWL+,5^D)MH4`;Q<kb*rL+sa$_+0[WoLe->,i[V9cf?S_#KH-',t;gjB0V1$kQ7;kF*`QN:^TX!$2f9++YXMEnS`^%:X*leWDA,[oS_QmB]Pe1&=iJ1@d3i0ha2#?FfjYM^P,e0leZg-CPW6&mn8.sf+8:"\8>kGLZ9iP+YRS_'X#\t'Bm,-0F.)l-4p5tVC\_n0FrG?0)&6$1[!bMWgXoAkADeQ<&Nq+f'UpS@Ff7d_e[$B!,C^gR,MX1$sd0sFI<Vb(3'rk8&p(FCLrn@d'flW,6@Fm"^I]JGU`iQI,T`t]W`V1DtWOt8Cs=u)?f2Y#9k:(2e&p/G,&QfWX!GPFk_moor<>&"e']I(RF-$[j4MG-I2;B@(Sg:<N>&Z8k93B^Y?]Um/~>
 endstream
 endobj
-40 0 obj
+43 0 obj
 << /Type /Page
 /Parent 1 0 R
 /MediaBox [ 0 0 612 792 ]
 /Resources 3 0 R
-/Contents 39 0 R
+/Contents 42 0 R
 >>
 endobj
-42 0 obj
+44 0 obj
+<< /Length 605 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat$t9okbt&A@ZcHqY%9g'2&^Sso)&e@i4mDOV[Q)$hgP=_$1R^TT?p6WT)O66JKKcgs8;AsW^GC%*$;<8.'i8-gOjNaqsGpoqKk+c_ZhF9m<u]8oF2\u1?>q]dZoi^h!O'TGL%@k&^f^7aZ6Sh[rJ5>h:%P*25T-;Ym67SG.`cKBHO5+Za6XlHI"Mf+oG\]ObIKB[O=ENY>[d=0QqOEIdd00jkte.pM-#Y^%ZlVP12=e"M#^^$]b"14_@?<>Jj]R.;FU:YG!c6=em:Fqa%-l;!&66)PK(0@Z>cKr$4k;;g:RaE3]6h)m\=H(on@;c'M1FQeB;c\RJ6+L`h<jgg]LL6,^O8BEI*k;X%k2s5>)j;;B\h\2Q^[60E3p?&aM]lfHA>(KI`9Iq*ck'-AN4O2`V+51IE0dmg&MZYB#;E#ib15@4ag;q>q7+-W3m+:@dk_Da.ki7N$U0Q1:!AC7.K&73LuVN8-ps6O((c\<mo]stCiXMU8uB_JP)4uJk)XPCPF*R4fk]%+W3<4LdoC[672F<o5NC6<Am<r`oE64_EW,7oP:Ff69J:SWXX2$3<3!bB>$ZL5Ed%m"*U#_,`4gEp!MS0Z0`~>
+endstream
+endobj
+45 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 44 0 R
+>>
+endobj
+47 0 obj
 <<
  /Title (\376\377\0\61\0\40\0\120\0\162\0\157\0\147\0\162\0\141\0\155\0\155\0\151\0\156\0\147\0\40\0\167\0\151\0\164\0\150\0\40\0\102\0\157\0\157\0\153\0\113\0\145\0\145\0\160\0\145\0\162)
- /Parent 41 0 R
- /First 43 0 R
- /Last 48 0 R
- /Count -6
+ /Parent 46 0 R
+ /First 48 0 R
+ /Last 54 0 R
+ /Count -7
  /A 9 0 R
 >> endobj
-43 0 obj
+48 0 obj
 <<
  /Title (\376\377\0\61\0\56\0\61\0\40\0\111\0\156\0\163\0\164\0\141\0\156\0\164\0\151\0\141\0\164\0\151\0\156\0\147\0\40\0\102\0\157\0\157\0\153\0\113\0\145\0\145\0\160\0\145\0\162\0\56)
- /Parent 42 0 R
- /Next 44 0 R
+ /Parent 47 0 R
+ /Next 49 0 R
  /A 11 0 R
 >> endobj
-44 0 obj
+49 0 obj
 <<
  /Title (\376\377\0\61\0\56\0\62\0\40\0\103\0\162\0\145\0\141\0\164\0\151\0\156\0\147\0\40\0\141\0\40\0\154\0\145\0\144\0\147\0\145\0\162\0\56)
- /Parent 42 0 R
- /Prev 43 0 R
- /Next 45 0 R
+ /Parent 47 0 R
+ /Prev 48 0 R
+ /Next 50 0 R
  /A 13 0 R
 >> endobj
-45 0 obj
+50 0 obj
 <<
  /Title (\376\377\0\61\0\56\0\63\0\40\0\101\0\144\0\144\0\151\0\156\0\147\0\40\0\145\0\156\0\164\0\162\0\151\0\145\0\163\0\40\0\164\0\157\0\40\0\141\0\40\0\154\0\145\0\144\0\147\0\145\0\162\0\56)
- /Parent 42 0 R
- /Prev 44 0 R
- /Next 46 0 R
+ /Parent 47 0 R
+ /Prev 49 0 R
+ /Next 51 0 R
  /A 15 0 R
 >> endobj
-46 0 obj
+51 0 obj
 <<
  /Title (\376\377\0\61\0\56\0\64\0\40\0\103\0\154\0\157\0\163\0\151\0\156\0\147\0\40\0\141\0\40\0\154\0\145\0\144\0\147\0\145\0\162\0\56)
- /Parent 42 0 R
- /Prev 45 0 R
- /Next 47 0 R
+ /Parent 47 0 R
+ /Prev 50 0 R
+ /Next 52 0 R
  /A 17 0 R
 >> endobj
-47 0 obj
+52 0 obj
 <<
  /Title (\376\377\0\61\0\56\0\65\0\40\0\117\0\160\0\145\0\156\0\151\0\156\0\147\0\40\0\141\0\40\0\154\0\145\0\144\0\147\0\145\0\162\0\56)
- /Parent 42 0 R
- /Prev 46 0 R
- /Next 48 0 R
+ /Parent 47 0 R
+ /Prev 51 0 R
+ /Next 53 0 R
  /A 19 0 R
 >> endobj
-48 0 obj
+53 0 obj
 <<
  /Title (\376\377\0\61\0\56\0\66\0\40\0\122\0\145\0\141\0\144\0\151\0\156\0\147\0\40\0\146\0\162\0\157\0\155\0\40\0\154\0\145\0\144\0\147\0\145\0\162)
- /Parent 42 0 R
- /Prev 47 0 R
+ /Parent 47 0 R
+ /Prev 52 0 R
+ /Next 54 0 R
  /A 21 0 R
 >> endobj
-49 0 obj
+54 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\67\0\40\0\104\0\145\0\154\0\145\0\164\0\151\0\156\0\147\0\40\0\141\0\40\0\154\0\145\0\144\0\147\0\145\0\162)
+ /Parent 47 0 R
+ /Prev 53 0 R
+ /A 23 0 R
+>> endobj
+55 0 obj
 << /Type /Font
 /Subtype /Type1
 /Name /F3
 /BaseFont /Helvetica-Bold
 /Encoding /WinAnsiEncoding >>
 endobj
-50 0 obj
+56 0 obj
 << /Type /Font
 /Subtype /Type1
 /Name /F5
 /BaseFont /Times-Roman
 /Encoding /WinAnsiEncoding >>
 endobj
-51 0 obj
+57 0 obj
 << /Type /Font
 /Subtype /Type1
 /Name /F1
 /BaseFont /Helvetica
 /Encoding /WinAnsiEncoding >>
 endobj
-52 0 obj
+58 0 obj
 << /Type /Font
 /Subtype /Type1
 /Name /F9
 /BaseFont /Courier
 /Encoding /WinAnsiEncoding >>
 endobj
-53 0 obj
+59 0 obj
 << /Type /Font
 /Subtype /Type1
 /Name /F2
 /BaseFont /Helvetica-Oblique
 /Encoding /WinAnsiEncoding >>
 endobj
-54 0 obj
+60 0 obj
 << /Type /Font
 /Subtype /Type1
 /Name /F7
@@ -361,131 +406,143 @@ endobj
 endobj
 1 0 obj
 << /Type /Pages
-/Count 7
-/Kids [6 0 R 23 0 R 32 0 R 34 0 R 36 0 R 38 0 R 40 0 R ] >>
+/Count 8
+/Kids [6 0 R 25 0 R 35 0 R 37 0 R 39 0 R 41 0 R 43 0 R 45 0 R ] >>
 endobj
 2 0 obj
 << /Type /Catalog
 /Pages 1 0 R
- /Outlines 41 0 R
+ /Outlines 46 0 R
  /PageMode /UseOutlines
  >>
 endobj
 3 0 obj
 << 
-/Font << /F3 49 0 R /F5 50 0 R /F1 51 0 R /F9 52 0 R /F2 53 0 R /F7 54 0 R >> 
+/Font << /F3 55 0 R /F5 56 0 R /F1 57 0 R /F9 58 0 R /F2 59 0 R /F7 60 0 R >> 
 /ProcSet [ /PDF /ImageC /Text ] >> 
 endobj
 9 0 obj
 <<
 /S /GoTo
-/D [23 0 R /XYZ 85.0 659.0 null]
+/D [25 0 R /XYZ 85.0 659.0 null]
 >>
 endobj
 11 0 obj
 <<
 /S /GoTo
-/D [23 0 R /XYZ 85.0 518.666 null]
+/D [25 0 R /XYZ 85.0 501.466 null]
 >>
 endobj
 13 0 obj
 <<
 /S /GoTo
-/D [32 0 R /XYZ 85.0 659.0 null]
+/D [35 0 R /XYZ 85.0 653.0 null]
 >>
 endobj
 15 0 obj
 <<
 /S /GoTo
-/D [34 0 R /XYZ 85.0 588.2 null]
+/D [37 0 R /XYZ 85.0 588.2 null]
 >>
 endobj
 17 0 obj
 <<
 /S /GoTo
-/D [36 0 R /XYZ 85.0 622.6 null]
+/D [39 0 R /XYZ 85.0 622.6 null]
 >>
 endobj
 19 0 obj
 <<
 /S /GoTo
-/D [36 0 R /XYZ 85.0 264.947 null]
+/D [39 0 R /XYZ 85.0 264.947 null]
 >>
 endobj
 21 0 obj
 <<
 /S /GoTo
-/D [38 0 R /XYZ 85.0 362.6 null]
+/D [41 0 R /XYZ 85.0 362.6 null]
 >>
 endobj
-41 0 obj
+23 0 obj
+<<
+/S /GoTo
+/D [43 0 R /XYZ 85.0 441.4 null]
+>>
+endobj
+46 0 obj
 <<
- /First 42 0 R
- /Last 42 0 R
+ /First 47 0 R
+ /Last 47 0 R
 >> endobj
 xref
-0 55
+0 61
 0000000000 65535 f 
-0000016858 00000 n 
-0000016958 00000 n 
-0000017050 00000 n 
+0000018885 00000 n 
+0000018992 00000 n 
+0000019084 00000 n 
 0000000015 00000 n 
 0000000071 00000 n 
-0000000808 00000 n 
-0000000928 00000 n 
-0000000995 00000 n 
-0000017184 00000 n 
-0000001130 00000 n 
-0000017247 00000 n 
-0000001267 00000 n 
-0000017313 00000 n 
-0000001404 00000 n 
-0000017377 00000 n 
-0000001541 00000 n 
-0000017441 00000 n 
-0000001677 00000 n 
-0000017505 00000 n 
-0000001814 00000 n 
-0000017571 00000 n 
-0000001951 00000 n 
-0000003859 00000 n 
-0000003982 00000 n 
-0000004044 00000 n 
-0000004181 00000 n 
-0000004318 00000 n 
-0000004455 00000 n 
-0000004591 00000 n 
-0000004728 00000 n 
-0000004865 00000 n 
-0000006896 00000 n 
-0000007004 00000 n 
-0000009019 00000 n 
-0000009127 00000 n 
-0000010911 00000 n 
-0000011019 00000 n 
-0000012995 00000 n 
-0000013103 00000 n 
-0000014423 00000 n 
-0000017635 00000 n 
-0000014531 00000 n 
-0000014808 00000 n 
-0000015058 00000 n 
-0000015279 00000 n 
-0000015552 00000 n 
-0000015767 00000 n 
-0000015982 00000 n 
-0000016196 00000 n 
-0000016309 00000 n 
-0000016419 00000 n 
-0000016527 00000 n 
-0000016633 00000 n 
-0000016749 00000 n 
+0000000838 00000 n 
+0000000958 00000 n 
+0000001032 00000 n 
+0000019218 00000 n 
+0000001167 00000 n 
+0000019281 00000 n 
+0000001304 00000 n 
+0000019347 00000 n 
+0000001441 00000 n 
+0000019411 00000 n 
+0000001578 00000 n 
+0000019475 00000 n 
+0000001714 00000 n 
+0000019539 00000 n 
+0000001851 00000 n 
+0000019605 00000 n 
+0000001988 00000 n 
+0000019669 00000 n 
+0000002125 00000 n 
+0000004120 00000 n 
+0000004243 00000 n 
+0000004312 00000 n 
+0000004449 00000 n 
+0000004586 00000 n 
+0000004723 00000 n 
+0000004859 00000 n 
+0000004996 00000 n 
+0000005133 00000 n 
+0000005270 00000 n 
+0000007304 00000 n 
+0000007412 00000 n 
+0000009427 00000 n 
+0000009535 00000 n 
+0000011319 00000 n 
+0000011427 00000 n 
+0000013403 00000 n 
+0000013511 00000 n 
+0000015429 00000 n 
+0000015537 00000 n 
+0000016234 00000 n 
+0000019733 00000 n 
+0000016342 00000 n 
+0000016619 00000 n 
+0000016869 00000 n 
+0000017090 00000 n 
+0000017363 00000 n 
+0000017578 00000 n 
+0000017793 00000 n 
+0000018021 00000 n 
+0000018223 00000 n 
+0000018336 00000 n 
+0000018446 00000 n 
+0000018554 00000 n 
+0000018660 00000 n 
+0000018776 00000 n 
 trailer
 <<
-/Size 55
+/Size 61
 /Root 2 0 R
 /Info 4 0 R
 >>
 startxref
-17686
+19784
 %%EOF

Modified: hadoop/zookeeper/trunk/docs/bookkeeperStarted.html
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/docs/bookkeeperStarted.html?rev=944003&r1=944002&r2=944003&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/docs/bookkeeperStarted.html (original)
+++ hadoop/zookeeper/trunk/docs/bookkeeperStarted.html Thu May 13 20:23:35 2010
@@ -272,13 +272,17 @@ document.write("Last Published: " + docu
 		</p>
 <p>
 <span class="codefrag computeroutput">
-		java -cp .:./zookeeper-&lt;version&gt;-bookkeeper.jar:./zookeeper-&lt;version&gt;.jar:../log4j/apache-log4j-1.2.15/log4j-1.2.15.jar\
-		-Dlog4j.configuration=log4j.properties org.apache.bookkeeper.proto.BookieServer 3181 /path_to_log_device/\
+		java -cp .:./zookeeper-&lt;version&gt;-bookkeeper.jar:./zookeeper-&lt;version&gt;.jar\
+		:../log4j/apache-log4j-1.2.15/log4j-1.2.15.jar -Dlog4j.configuration=log4j.properties\ 
+		org.apache.bookkeeper.proto.BookieServer 3181 127.0.0.1:2181 /path_to_log_device/\
 		/path_to_ledger_device/
 		</span>
 </p>
 <p> "/path_to_log_device/" and "/path_to_ledger_device/" are different paths. Also, port 3181
-		is the port that a bookie listens on for connection requests from clients. 
+		is the port that a bookie listens on for connection requests from clients. 127.0.0.1:2181 is the hostname:port 
+		for the ZooKeeper server. In this example, the standalone ZooKeeper server is running locally on port 2181.
+		If we had multiple ZooKeeper servers, this parameter would be a comma separated list of all the hostname:port
+		values corresponding to them.
 		</p>
 <a name="N10051"></a><a name="bk_setupZK"></a>
 <h3 class="h4">Setting up ZooKeeper</h3>

Modified: hadoop/zookeeper/trunk/docs/bookkeeperStarted.pdf
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/docs/bookkeeperStarted.pdf?rev=944003&r1=944002&r2=944003&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/docs/bookkeeperStarted.pdf (original)
+++ hadoop/zookeeper/trunk/docs/bookkeeperStarted.pdf Thu May 13 20:23:35 2010
@@ -5,10 +5,10 @@
 /Producer (FOP 0.20.5) >>
 endobj
 5 0 obj
-<< /Length 648 /Filter [ /ASCII85Decode /FlateDecode ]
+<< /Length 651 /Filter [ /ASCII85Decode /FlateDecode ]
  >>
 stream
-Gaua=9lldX&;KZO$6AM$[e^2SX4sF+D%H#e;q`4q/NZW4+s>L^^TRbH&t+\uRMeU8d#),2SsL1$O[\^k(nr!(au0iT[oJ+/2BiF]MkJRZ8WJAD"D,(+kA6jbn#o@6WgTV<)CP7Sm'AIEW4%05dc?BblbI"3XOS:rU[1X?1@6lXdKmr[ZA19[qnY?`KKnYF"^jZCpFK[;b,#d>d7eJ+J#+Zj.ann!#t49-5(]c'O:kr+oFmD7SN_&^i^`Ef!e&W)"l9J/:L/.OmuLK9a,K`jI8cM`YLM;Bk,@U`Il0/d!mEN^B(V`UmL9NIJ.1GQ6$Xj\0b4!8W3\tLm>BJ(['*[./"1#rK#,jY4Q2BJAie$r$M^Fk<N5T_>L>VY;^Pk%/1&4UR8"o]!T3N!0>g[O0tF-?8RL!<-sE3mn?dS32@MRTTpJf6iq0)8(4bFOJtj#f3;DWeQrY=<32jWXegE*Q<ri"!oTh6,W6&cM0];kIITsE_k7.00c^`!Bd6I'Oo.7K=:@dhS,do%/]DV*A@%[QY$>lLZdDGh_cp8]]$$El5rr<TR+I*#)(-h5t5O/*Z.CM1T+7HtC+Prh0-f3!`PW(eUq'ra)ou?@i-5a;?]5!n+6<=_OQ)-FNghgH"<],BV)Edj\(6R4l~>
+Gaua=9lldX&;KZO$6AM$[e^2KX4sF+D%H#e;qi:r/NZW4+s>L^^TRbp&t+c"Ri+^9d#),2SsL1$O[X2k)58*)au0iT[oJ+/2BiF]MkJRZ8WJAD"D.>kqeVu!cVI0`WgTUi)CP7Sm"7'jW4%05`oN+VlbI"3XOS<HU?lBV1@6lXdKmr[ZDTP&a2'i,K`B;f$c%GfmTI7TPtNL[URC!6r^p6]<Mgf!'8YT:Hj!A,+XOq6kU.XL4+68J`K/dV"o>;r$=!c[cWt_%muLK9a,K`jI8cM`YLM;Bk,@U`Il0/d!mEN^B(W#]mL9NIJ.1GQ;0aPl0b4!,W/F,.m#'A'ZnGVX$^tWRK#,RQ4Q2BJAie$r$@&cK<N5T_CXF2b.?jd^/1&4UR8"o]!MB$70>g[O1V'?A8RL!<,[-din?dS32@MRVTpJf6ir#Y@(4bFOJs-mV3;DWeQrY=<33'bQXj:;XXoRsBSk[[<`o*U=Vs2*LX5E`$m7s3Rgtt89)@o8dJA01#L[HGVc:VP],.>\`h@'T<:nuAaqALs@*rm>B_2qL&S,Eit&HYiZ:hoO\T)5(]+.H_dBDh<!K*pTiMK.XXlqVidD4RjsqaPMJ5&Z%8CV?e"\LDV(6!.99UW_Ht[VAh69<H%*rrEsqf?=~>
 endstream
 endobj
 6 0 obj
@@ -102,10 +102,10 @@ endobj
 >>
 endobj
 22 0 obj
-<< /Length 2147 /Filter [ /ASCII85Decode /FlateDecode ]
+<< /Length 2260 /Filter [ /ASCII85Decode /FlateDecode ]
  >>
 stream
-Gat%$gMYe)&:NH>&FttuaO27Y9%opi:cFAr?@Xlh5."#ra:_Q)>7rlZAB4ZFNijAi;YClOLrkqEH=kH]0"7m>GG.BPi]>iMb&t!)F^4]3SW+#$JaX39"jXPurdI;X2pRl^mf(b%BUZTVoYkqdX%&n'd*;)*m6Uc#.HTA=66([,GE(+%5H)4,qH1h?#4;FMgRhP3D-()[b0JG9eR56:P:-\V^OLLqD`I7hmO7&LXF=M^G!9r%ZGB&[5=UJO%dn3.H*&s$120BY2>SY^<>4O1H7#h=;O)6cbKB6A-IDXNZIO_V#a`:#dcSYWnVABN2g\cA:_MV0l.G\h00@R0ZqP]"Lp5:_K?DA>j]H)QjJCjB'GC&gfVG5q15^Ks'U"\*8[<2>,99e\<(Q>f4;7jP(a;ro7ksFL<L\)skZp^`dUVm@"#AZZs'nb]7,#$f0#YrA+-auK>a@k#`7MMG$>&`J2LF&UB&B"a0g;<WRZh@rSI,X7JRT(7iYi]1`9t.lF@?Y-S<$asM?T5\!`8*D+EU5r@uLD0VMi<28]4!Z_7:W0COB,nc><#%6JIG$CfPhXVUN_\e9`Zq*spRRi\Q']^gsQr;4IGk%'`V^lQq0XnXVlCUqTb.g_9_n&p!]Y_=NT=i2\b3`Fp]<jBAF0G3YoPoCjeqO`STN(eou3\,Hn1XHe<b<C;\I(Rm2SJQ/R,2.^I.m$s*[4n+u%AmPkM&:-rSi\ALkgCU!#Tqag40[McATQHK/."/09;(h)rdaIB>T%86<,!$@Q-o[Z!9`+`;[eF9u$RIj>W\*IJ1ck:aa+Uij/`MPm`4ok(VOe$Nl]RA"#qQL9jfNp/$5ob"0_(ik_O7udaSg0VieJK4"o`4GZ-d!K"'ahFXhhJd+`Zs-g%I'J:WR^k`9X\i4c=?ROOpqLmKWcdP:Pl;/rOftP("OY!u!`8-=e7ELW8Y(Vuj9^!*H+fZO10-JrBa@]I@ZfKi'mG5YinM`&]t+9/I)
 WkU3oFK&IkJnG2HC>^jk]P,`sHS%]]SaMT?@H75Q'as8V+XCOY^5m>*W0TDDB$-pC99[t(S#L.`t.7T"j)2W\^aUK)+2h2?&K'=3Y`g9,F!gt\M*k1Z&3fUHHR^-=S_9bF;RgcK)OQfXU:(B+-4<<"IW=;5^;a-c`<K$^2X^mD'$Vsc&L8V$aU6\l*J2.@Rr:_gE9/qU=()KV.>/T;f&`HYJ_")sJY7`te_6eS$0UCQ'PX_VM"dGWi$JXFg@b5&snX+PGEOu8j`r-1<7&4\JO0@3h6`U^&(=*eXa+80mAh"iD"oZR1Y/>A\`,+AJ@fc>%MLs[cs.*"bSei$Za/S.uc9U;\-*RD=\e#GUX:I&Bn4JOK!9+S7Dd+2k!-;^h6@d/dAZt<4XE],0AA0f.`jK(Y>bNNf@mM>5Fm]s$3So(%_$m]'Z/8YpCSC/bh`Rg+5G,:fQ[[QB%6uEe/=EuXdP&9\k7Xh6/d%shI5BG!!QBPi%)r!-S.eci<?s0q\q%@d,0SDb99J*LR)$WeMaBTmhVZP"['AYW_<;n5%ZT:*E-ibojBr>r$R4S+Dicp=ia;2_Dj]j/]@9,8J%nJ&E>pG*6c1S<U6(dmHSKKb\j*:.8WE9KI-@1$oZ:hZkIU<:Du5k,m-hPKCK98#^)QL5WIY)0/q6fYcSTJ*/-l:q8M9nq?M?_8dILs=X^ZjUB>e$pib&5$Oe9I_c`+G#'62D[2$q[FM_l)^H=Te16M"W'W0@"nVW>]_bB^@c&O2=<O/6;I!OuHc-u+StI>J>IL_;&"dtlD2Y5r7@Os/$0rV3ntE1t)$KKmLb4u^Oj:fE4hr2.moPe^aq]+%5)MS.\^Sn5!`8pE%>YiOt&(7O"p3/d?X">66*.m.aBV7oHe475S(rLe%YFHG7RB]:jd@XB)5`',dbn)4<$2H,TD>JT@QXT.IH!t/REG2pN.$0FLR_LDBd<C=#N+_6D7NGV5p6Wc,GApd+?n#l>m;>h
 L2\1t-MfpER(bE.d!!QG"]hqaM3H>FQ+UV+Zh!<,hTg@c]8KV=AKkGUIQ'p^3_qAcV%'O'KCi(i?cS)[cKUHCZ=4PTV($_o=\T,=L&`*>7LVsR<*_a,q=_tdL(RYS.&$odWc>GZbS-0Vaf[td>S]1-G\F+&p0T)T$@ft/O~>
+Gasar>Ar7S'Roe[&GjfbL`)>d3nOWnlPaj]TPM2qD&isPU2;3>kYb=6m+:]&2]g[P@cYM(aE.=*NO`@K0&K//oni"92[e6j/u[gI+*CU:m"N/DW#%M\deW&8-/U^U(9%0j2nWkqC9':2Rm].s]0\U"8(tZUI4`CTYFP'le9d2%^CN)<\6]q[>6FVLSb4XoT@]")+Jk7nB$j99q'6G;a6sKk".'Xe1.QBJDXkd,>3Qk`Pk@)+qCtV?W)moNbA5?W'5:\AWmNo-W1#!8d$_Q##[&KK/h4IK>E8,9M,l:phHYBeCR_44`=oOBhX#(P6;I<+W+4ME]Mt[gCROJ!0k#^GH^U4WbV@9DdED;00*LdFYt.;lGSKJt844msPXO82+<FPVS4W%Zg_Us"(bAZ$7lFD[Z;&jr\dQeKHu/WaX+7^4rl:OFLpV4^<(Q._hb15>8QcrYj51Jl$@2/)(44NQAuA&$#TltX:X6;.c8ZZI5dgk\8W<k9Hug9G3hgpqcDMUo_*Uap+Y\"0(ceGQ0h).(j$r";,Ru$]i8"%b2-cDNB9IK`Tk24J[^&&*U\G&>ni\91*"c:-i\Q(M^aQ>!W5\]pR$c(KopifEH,VF]QJX-B^a&mf&d@W5JZ"E0i0uXNp`M"\jI2r046FsDq0SFG(^/d3-ls$d:Al7\?V1h(WeM3ncR.bhLS@,K0e#Ja4Y%`^*b\:R0lK(E0g2?cnJHM0Xb]c<l)5+V%/%n+.%R:R9V:U)QZIP8\1#)]o6a>*`()'i%1Hf[h*,,`npXKNOB`O$g>[QNj&6t>>d/B"7D-l;r,&JgoeKWSQUEAA_86achMFU"La8IDM%;<T9r/d9\UP)]r+JO3cp(5U[W7bs:bD7Meu6&L+`Qj+X6ne2S.s`N>[:,VpFOO^KO!0X\fZZ[NiHWR\Lc5V:V2A"%SXq\X,$d:*tkc\:^+ge"^i3lc3fAa$5*\\i*Bd7/<&#."$/%0;:X>j;5.s$6D)2
 .%Yjj+`Tq^qG54:f;TS]'D#.HD/Irf*kol,e-IS]o=!\NS$mGu2L&n&u7)H8a$=3=^d[p'&<JF?ojH_'^NoUZQGj)sJ+Mm.Y)TLAtJIIsm1`lD5,?bPi!U?t`Ku),#d[Tm\/]`T/3Z8`HG.9W8GuGZ6g:Maf+3GA\'jJ`t/JdcSW\*Y=9!DK*i<IG@h!si-,3NnNGqCK-5$H4i`A%ZgF+E=WmpDp$iIc#nc_2q=jN*;lq_KWbnJ%;&Xnej5'&kh>:>g3tAJjSTN"V_iC"L(.AbW=^MjhC#4C/$\L9APSnWD4kSaI2ho4N@O%uu?pYBtn``92f<k=(%-6W`he@j(9KjB-pVS$@bMejG$:]M`,UJ9Zagq\Ip'^g*:k&7BO:]N;$K/"S@%cW@!Z34:>t,P37!/80^>c5fV6fint>\,pN?m5IMfR`e4X--pSoY@lt5Ts(c6!GKTc`Ubuf\tR`W\\tM;bFh`B\f'N?LYtC/L2;7qk?*suj(XEY(JqP379LOJ.Im]G'=b9'U(@S!qpcBN.m%Vd[,0c?d#b@s[j/1PpGN\h0IHdDK3XP^s$50g@4o;rY(MQ0EJ[<.I3S'6e<eLRXXo&h#LaD2Q\F)gpQp;2>'>h#C?B2KM&2&BQ(6/W+IDQ..g-(S9tkIUQ\'\MpE8dQKFOSb7P6*uPP=Hu&kFj2>^,VNmBEZ$lHu!a'kIu.+,!t*DVr;@<182U\PJ[MQUZ?';86Z>0i.VAP&_hG^[l9bj`k>,s%M:D.pmYpQ&WndR;DP2L*JmCPEmNI'`f<>Di7fW7fn6OEj-Ub8#I,T,8rOR5r32B/OOOu[lDB8ikd?/\.p^_*oO$WWVIO/Al0t,\Ek0R4=tS2)BfJ.K>LZ<42!2V6X3A7hheqDP*01?H5dJ9p9DgHI4E6tHH'WQ72hbX/nTo,G-*MWessYI73;cK%`4EE2cM`J_b=Pg$Y/R#dDjjcLO8p(/XkI>8t4A+^6l7X5(V:B2u(
 N][(%]tZ[:=p\b`fk@.oJ/0iBJ<,Ej6E'3n]MVp.Kj0e$:278k?UYP4d6k20Ni][RB2F.e!?4QKG-0Gn7CB_3]Wfd>l1K%Vef`oI'*GH2geof;[(1sD`L^;6R^7&")QmsoDN]"?5>h9f`k!YEM44U9DG*"B3%9X`a7`fP5jmB\?;Zn1bM1m:h9C9'%-@NX)>Re<;kr^l8,?"`(D<n@,k!if>GF^r*gpC?I)H4oVs[pmf+L6UH]]GE0<S]XM,?0aZ1007rI>4W6:)>]E6s#kZO$N~>
 endstream
 endobj
 23 0 obj
@@ -158,10 +158,10 @@ endobj
 >>
 endobj
 28 0 obj
-<< /Length 1732 /Filter [ /ASCII85Decode /FlateDecode ]
+<< /Length 1775 /Filter [ /ASCII85Decode /FlateDecode ]
  >>
 stream
-GatU4>Ar7S'Roe[d%c6%$nn>'2;?#(,[ItjmFhOB2Xc4*BNqDd\rn$\)tr05F>G@M['^?/;pdTfhmn-t@bj4CmN*`_-cB6*^NYkI,O>S"!5Eqg4hor,5X&U_Y.XSkQc\X6$\WO7=Q7s,g`mO4o!k4JqA+f-i\`YT703+qa,TijoJ`n%<,/K)/+3qLPtdID-tSji1=;Nc[++5`YOaEu.4Nm2FK>)$7cS8W7%*4l['UUK1l'o<4R5\o;YcMn@D9pj,[8qK?[7-GO7/,LAJ+Jp8&;)SQ>'.`7`Pk(j+hHEL2C8?-gOa70AGW.5#WpPNp.`hZEtmRH!IA_3W,:rdDakkhs5W089Ea58rs<_h[)?"7jm:!LUB65[#<IWWoB;dMi/_18%\qt,=!qQp_`'q505(8o2K"Ij.S`>K4>+G45_UaY_0R><g&\P=Ho?YAJ=1HR#GM[/*fl27+g0RbI&lAN61/#3pEJ.lpuP&391i9>6&`M[U+;ld)JBHVVn"i)i.(K3UMLbEEq;agi>:,D<?")S-_RspL+leU]@$57BSGI<r;-/QCD`+B/!Hu7j9(Q,KOkjS2;1s.lJ3k;JWYd)`q7'_C\h;)%"D%<a(NjUq'<Wg^d2=h:1D+hlF5O*G:7hK`m-+:T(0di=RtIas9B6d&oM8<bCfhA@<CO#9P<10jf$tO+eDWfBhg3qGDbe:)_?3bX'CJ:/ejpAOns;<5,aQA(T'/!o?Su`RaC6#VeeD>-k8h<Uuljqg8()B_$Ch&O)kDFRXAT4NR+(rms9;dHptcMrIiCHlkeJ/L*<fmrQDWTh'=bR`].1WBd2qpIF/j&<RJ&_cF<=<:j@,@uO,:HXBT)#.@eq'kkoT;u$\t62n[n:B4k_kB<p&06(J61DC<O)cOk:nThJ)]oks1A+p%`!af@'6.HVqB_B,j:HU:;H1!nGHKR0AK7t:6VL),\+P-!&cnt9Sb<^qP,T7JJWm1GBAn';hh?:>CIVk[
 k237>^$e0!:c*^^?j[WGfYXumAX.,gMQ15E#UBPIO4N)jPko-['q%1lL/ld@RY\7%m^6Io+[p7KmDDeAob[1Qs)efH4$$<Rhbbi)^LI,Y6/Io"4#)db@F<uPFph!@^)tQUH,-P=tY5UJRm]:"<JUP:+;=,"Mm`L<d"?T@1DXZKh"g!2D(J2#-c)0-9Mal'VKlnnC"bN.)CK8G<QS2?"S-m+=7ANTE]"35ih&N,]N\lHhLV$+W4X_I-,*>/n<)r*l#Rt1?*m!L+Z%ek%BCS@eg1'%Y@T+AkPk6HiZhh73c*slO;rOHseM-H\O@+aRnAp=(TFH"J)G/!N/JOtaMs#P[U_(bW5\jO#XE/NNWXWLABMp`^:J(o0lqA/Z4B]qlQca9>bO'+lKL!GTmnugj3Mn+0L07G4/i&TG^bR7J`Mcb:A#o$frLpL,mQX^B3?_d#o_BB^F&hSTnpgF0"@;t$pB"pk\SSTMR8mDB<nNg*E.UF8$:M&>g`;3jJMVkU=[[YAQ(4mZ_I,OeBBo3eSpDRN:BhM,4@El4LA:6RVOF>JTL]48S%_g4frhc=cT[[N0:TE`7W+R2]a_W#M:@oJ@:S<apr&!ZC3D5AfguB"MgU=qCY2.f;EZF?\^_-qW&,uODS<P(*6*0;^!I!+]0/K!?\!RjH8-49rh_KoM)eFl6Z[Qip5J/'h%m`l>3F4X=mfj=I<)N8=^6HS7b4t(22<*^Yg07t(DJ)-\:4L.9WNj~>
+Gat=,h/D%+&:aF]Tgo?))3PX*d;0=dO`]7]g,0'=Cu,8(dC)kSF<rq]2XGqNaV(_N/]R&e`$XU+rU0QC\t2W6As4k]k,mSAr?S(iH=7Z-B-<Z9)rX`TLS7d!mpYeAjE`_p]T#&9_f)mCK^R/`pg[WW2Xj;T\2W/eIngjnjMH8]pRJ,TWii[;eN_]'qt2%7s/a^NPo&:ahX%-`WI.!p+>Rsl5:3W]Q1,W/V6VE,S-Zr7M%GV3Y%h7BWo%_o/Q5fqreW9(on-GkI#3;>lYEUe+*1fMR4;si?5>!L"t)0++X>6R^L!lXSO4$%7CJ>(B.7%fRLoK&A[A,2AY.(+_b/GboLYCAd4VKO6OLOs,RS69&_@AJO+",<KrN3b/7H(>$7e`S@Rs@YKS1436)Pol\]&cf;haT7Tie7%RFh!AmHX@ifc8-N8u9E`?'It4C=&;?p!dpZ/jSXcD5Zja/K9^`&]I05biIE-4?4Qt2"'Q@A#mdXV(5PHB0ejRHiq5UJ,k">%!!d=AX:Mp>b-QV!l>A9hnu!3FU&0DLTJ5?a@SuV:rp'_k4"a3;b'gT4b3ZCLO%Hd=Z[h)O;kRE`PE`[@\6X1\qMaP&331GY>uQ`G48Y,n4pV*fH_u;E`t?B3k3]d;RP.o*cO<U@#3D%_^aeO"ZfdXXp^Jp[QD7Hbr3T`ba-/4?u]Ncj>]_+MN(X$pBSf<CU2;+CoqVPb@O;<`GA4I,"9)93L>LX3)0*1%khe%hDTDeODKBi88.V]F0cqjXAfZR6)[=JGm][HDd$d7H[HAoKI297nPF^+&<:JqJac6u`%C+Wi<[T&c?&qpGt<?hW,de9K6(],#.L+E[PS4QN)!5t;OUm&XJ$/`h!a$8U@mQs=a8#=fYI(jn15a<_#I_Q(`bOhbDKe@U#:8BbD;#s:j@@A7BS.B=!!4e`rQJTIW-@CToTZ^LTPS#;.Z$<<YufcG[=3%KkNP$.YKrDU5BPW!rX:r562&,06*u
 f?Zp4`NA0;s@=UNYml(s;/"%,R\/%mR"q_Rk,n]_nhL%i_`:M-:kPk##H`sOmI_`cNL[)])'GJ*)5gcAp.W[m`TP.@#AM<2,ckDm8od6K:nEYQ%ID:1)]HHT`f,gE*>(2]9"d=$h^UP2N?@=.k(jCMtM7[j@+C>el#2H'HWJ_K+,j$,JlfVGWn!;/1R6(mtr@"9CH2#ekmKC+h2!39&J\tt7\7p^#;*KcO]^C&VK*_*aOQ*m$aXiTVYN?Z$*-ZVAM)$-+KGt`p<?g1'I94o@a/R#5)7[``Z$f)C=Yi^qVpouaKLBd$Wk"cg:S)b]A6I(<`Z7eY5tJl>3-X2K]kL6%@*i'qH9uF!rU1j4&)f"n,:o:bF%-FJO9^PKF2tP?RV,.\?2>I.ig@Mn8OWL'b+sCWAZ+8:Qf1oS6G4h82m(3<6O5eoiPcB@``=;dEe$dcp!hXcBq=?nbe,-8=oG?nFd&k#F,+[>2B8:s.WQ6<OG19i<Y#`(ddX6#g\LIIJ]CL@AKi>?EEGPAR($5Y$:YfHVf<!<Mcq,oFlTP6Xj$\=e)Zo1!^8Vm62+8W]=e+ih(N]W(R*dQ;FB[rN-DV)rOrG_Qp`+lVXOEV9S[9T[4LY;HJ[-<ZIBd]S!R8p4@&(c7+XpWiM($19@H;]TO\@&%oF_,8%DM5P`O<L*Jd&8NWOc<TJ7T\&df-R&]VFsqjlS-K,`D=#rQJA4e6Z1qAlIjmWZ"GiO53t[W(V$qg6#XT4EeMh!/1-mOsn0*R"&'ZcB5q?L;*WUnfs)J,-Uh=9~>
 endstream
 endobj
 29 0 obj
@@ -173,10 +173,10 @@ endobj
 >>
 endobj
 30 0 obj
-<< /Length 377 /Filter [ /ASCII85Decode /FlateDecode ]
+<< /Length 513 /Filter [ /ASCII85Decode /FlateDecode ]
  >>
 stream
-Gat=d92gHs'SZ;W'mE4c]d=mUQI`=bkXI-clN/B/N"n$@Fo:t<U]W.fB,lZH\Ok*B%]bOnBB5U;.)VU=KH^Sr<-Sc'I4l6j$Clf_E_fa9g.bEN9dNWc/CqI\lS&?Y-2bLPOM]oS(MaKb"_9\]HR9X`#(f_5<(!lX`Y6GMi%\Cmc0ML>X`Y"REih(DMF3V3n#O$ibr.b0hA5^2VlHs/G_59oW"fA\5XmVG3=ppQf`CNdJF!\hL6DWf2DHHYN?6a?o$Yh3`/rI`A=[Yj&.R5X:3nZE0i8RB#W::reQ((I\Z4H^hTpkMd?[E`.Scr\<OTB3\8:c'WSTHns-^L@ADNd@,55)9j5ekO0T&'k377G5h1mS$r-.&q2N*h~>
+Gat=%9lldX&A@Zcp4s748-0rK3^(t5gQUc_%rQ@t1gXZf$+N;sP=,=r,Tm,#g6k]k61B&!n*TP4kKtK7IRP5Ks/mQ`O?o1Dr_-nu5Ec:s#+"1;F</X+YFK$e.OK_?ie\<,X*b&cQLOY0bmOG9i-]6hLJ5FA=P">[%gSds\14naL&:u>ii9tdT%p'7#HHT@?I,i$\#>jG%U_Hs1kY7YIs\*OM%17!1o@1\W#_.6B5j0ATG^sS[UU.AT;UB9=Lk)Fd0kD&kf4?cUnefOq-sFa.+Brh%e$HqV((0p;LlbDCuF\el;o0s!l%Xo@d&9t1d<XM%c%+O.5WLf&?j0cI9iG_DI$ZkD,0DWq[F!t]rcb>?%\Xr<,us!$d7JSp<=]YYrV'<8ot+]7BM=$Y)8B;eC)HXn,B$s.[:[6\Wgb_#s.`h%R,AZ%aT<*mTddK/<&1Indu2JoSE&YNSr!R\=_d8B'Xm^FqRq9a*L[oI8f1e>#gQTdr$P#>-a3r_/X\&VQe6b~>
 endstream
 endobj
 31 0 obj
@@ -334,13 +334,13 @@ endobj
 19 0 obj
 <<
 /S /GoTo
-/D [23 0 R /XYZ 85.0 179.654 null]
+/D [29 0 R /XYZ 85.0 659.0 null]
 >>
 endobj
 21 0 obj
 <<
 /S /GoTo
-/D [29 0 R /XYZ 85.0 533.4 null]
+/D [29 0 R /XYZ 85.0 490.147 null]
 >>
 endobj
 32 0 obj
@@ -351,51 +351,51 @@ endobj
 xref
 0 46
 0000000000 65535 f 
-0000009672 00000 n 
-0000009751 00000 n 
-0000009843 00000 n 
+0000009967 00000 n 
+0000010046 00000 n 
+0000010138 00000 n 
 0000000015 00000 n 
 0000000071 00000 n 
-0000000810 00000 n 
-0000000930 00000 n 
-0000000997 00000 n 
-0000009977 00000 n 
-0000001132 00000 n 
-0000010040 00000 n 
-0000001269 00000 n 
-0000010106 00000 n 
-0000001406 00000 n 
-0000010172 00000 n 
-0000001543 00000 n 
-0000010237 00000 n 
-0000001679 00000 n 
-0000010303 00000 n 
-0000001816 00000 n 
-0000010369 00000 n 
-0000001952 00000 n 
-0000004192 00000 n 
-0000004315 00000 n 
-0000004356 00000 n 
-0000004534 00000 n 
-0000004719 00000 n 
-0000004919 00000 n 
-0000006744 00000 n 
-0000006852 00000 n 
-0000007321 00000 n 
-0000010433 00000 n 
-0000007429 00000 n 
-0000007855 00000 n 
-0000008040 00000 n 
-0000008204 00000 n 
-0000008410 00000 n 
-0000008632 00000 n 
-0000008866 00000 n 
-0000009010 00000 n 
-0000009123 00000 n 
-0000009233 00000 n 
-0000009341 00000 n 
-0000009447 00000 n 
-0000009563 00000 n 
+0000000813 00000 n 
+0000000933 00000 n 
+0000001000 00000 n 
+0000010272 00000 n 
+0000001135 00000 n 
+0000010335 00000 n 
+0000001272 00000 n 
+0000010401 00000 n 
+0000001409 00000 n 
+0000010467 00000 n 
+0000001546 00000 n 
+0000010532 00000 n 
+0000001682 00000 n 
+0000010598 00000 n 
+0000001819 00000 n 
+0000010662 00000 n 
+0000001955 00000 n 
+0000004308 00000 n 
+0000004431 00000 n 
+0000004472 00000 n 
+0000004650 00000 n 
+0000004835 00000 n 
+0000005035 00000 n 
+0000006903 00000 n 
+0000007011 00000 n 
+0000007616 00000 n 
+0000010728 00000 n 
+0000007724 00000 n 
+0000008150 00000 n 
+0000008335 00000 n 
+0000008499 00000 n 
+0000008705 00000 n 
+0000008927 00000 n 
+0000009161 00000 n 
+0000009305 00000 n 
+0000009418 00000 n 
+0000009528 00000 n 
+0000009636 00000 n 
+0000009742 00000 n 
+0000009858 00000 n 
 trailer
 <<
 /Size 46
@@ -403,5 +403,5 @@ trailer
 /Info 4 0 R
 >>
 startxref
-10484
+10779
 %%EOF

Modified: hadoop/zookeeper/trunk/src/contrib/bookkeeper/src/java/org/apache/bookkeeper/bookie/Bookie.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/bookkeeper/src/java/org/apache/bookkeeper/bookie/Bookie.java?rev=944003&r1=944002&r2=944003&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/bookkeeper/src/java/org/apache/bookkeeper/bookie/Bookie.java (original)
+++ hadoop/zookeeper/trunk/src/contrib/bookkeeper/src/java/org/apache/bookkeeper/bookie/Bookie.java Thu May 13 20:23:35 2010
@@ -63,7 +63,6 @@ public class Bookie extends Thread {
     
     // ZK registration path for this bookie
     static final String BOOKIE_REGISTRATION_PATH = "/ledgers/available/";
-    static final String LEDGERS_PATH = "/ledgers";
 
     // ZooKeeper client instance for the Bookie
     ZooKeeper zk;
@@ -136,7 +135,7 @@ public class Bookie extends Thread {
         instantiateZookeeperClient(port, zkServers);
         this.journalDirectory = journalDirectory;
         this.ledgerDirectories = ledgerDirectories;
-        entryLogger = new EntryLogger(ledgerDirectories);
+        entryLogger = new EntryLogger(ledgerDirectories, this);
         ledgerCache = new LedgerCache(ledgerDirectories);
         lastLogMark.readLog();
         final long markedLogId = lastLogMark.txnLogId;
@@ -206,7 +205,9 @@ public class Bookie extends Thread {
         syncThread.start();
     }
 
-    // Method to instantiate the ZooKeeper client for the Bookie.
+    /**
+     * Instantiate the ZooKeeper client for the Bookie.
+     */
     private void instantiateZookeeperClient(int port, String zkServers) throws IOException {
         if (zkServers == null) {
             LOG.warn("No ZK servers passed to Bookie constructor so BookKeeper clients won't know about this server!");
@@ -441,7 +442,8 @@ public class Bookie extends Thread {
     }
 
     public void shutdown() throws InterruptedException {
-    	if(zk != null) zk.close();
+        // Shutdown the ZK client
+        if(zk != null) zk.close();
         this.interrupt();
         this.join();
         syncThread.running = false;
@@ -449,6 +451,8 @@ public class Bookie extends Thread {
         for(LedgerDescriptor d: ledgers.values()) {
             d.close();
         }
+        // Shutdown the EntryLogger which has the GarbageCollector Thread running
+        entryLogger.shutdown();
     }
     
     public void addEntry(ByteBuffer entry, WriteCallback cb, Object ctx, byte[] masterKey)

Modified: hadoop/zookeeper/trunk/src/contrib/bookkeeper/src/java/org/apache/bookkeeper/bookie/BufferedChannel.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/bookkeeper/src/java/org/apache/bookkeeper/bookie/BufferedChannel.java?rev=944003&r1=944002&r2=944003&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/bookkeeper/src/java/org/apache/bookkeeper/bookie/BufferedChannel.java (original)
+++ hadoop/zookeeper/trunk/src/contrib/bookkeeper/src/java/org/apache/bookkeeper/bookie/BufferedChannel.java Thu May 13 20:23:35 2010
@@ -80,6 +80,17 @@ public class BufferedChannel 
         return position;
     }
     
+    /**
+     * Retrieve the current size of the underlying FileChannel
+     * 
+     * @return FileChannel size measured in bytes
+     * 
+     * @throws IOException if some I/O error occurs reading the FileChannel
+     */
+    public long size() throws IOException {
+        return bc.size();
+    }
+    
     public void flush(boolean sync) throws IOException {
         synchronized(this) {
             if (writeBuffer == null) {

Modified: hadoop/zookeeper/trunk/src/contrib/bookkeeper/src/java/org/apache/bookkeeper/bookie/EntryLogger.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/bookkeeper/src/java/org/apache/bookkeeper/bookie/EntryLogger.java?rev=944003&r1=944002&r2=944003&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/bookkeeper/src/java/org/apache/bookkeeper/bookie/EntryLogger.java (original)
+++ hadoop/zookeeper/trunk/src/contrib/bookkeeper/src/java/org/apache/bookkeeper/bookie/EntryLogger.java Thu May 13 20:23:35 2010
@@ -35,10 +35,15 @@ import java.nio.ByteBuffer;
 import java.nio.channels.FileChannel;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 
 import org.apache.log4j.Logger;
+import org.apache.zookeeper.AsyncCallback;
+import org.apache.zookeeper.KeeperException;
+import org.apache.zookeeper.KeeperException.Code;
 
 /**
  * This class manages the writing of the bookkeeper entries. All the new
@@ -50,31 +55,53 @@ import org.apache.log4j.Logger;
 public class EntryLogger {
     private static final Logger LOG = Logger.getLogger(EntryLogger.class);
     private File dirs[];
+    // This is a handle to the Bookie parent instance. We need this to get
+    // access to the LedgerCache as well as the ZooKeeper client handle.
+    private final Bookie bookie;
+
     private long logId;
     /**
      * The maximum size of a entry logger file.
      */
-    final static long LOG_SIZE_LIMIT = 2*1024*1024*1024L;
+    final static long LOG_SIZE_LIMIT = Long.getLong("logSizeLimit", 2 * 1024 * 1024 * 1024L);
     private volatile BufferedChannel logChannel;
-    // The ledgers contained in this file, seems to be unsused right now
-    //private HashSet<Long> ledgerMembers = new HashSet<Long>();
     /**
      * The 1K block at the head of the entry logger file
      * that contains the fingerprint and (future) meta-data
      */
-    final static ByteBuffer LOGFILE_HEADER = ByteBuffer.allocate(1024);
-    static {
-        LOGFILE_HEADER.put("BKLO".getBytes());
-    }
+    final static int LOGFILE_HEADER_SIZE = 1024;
+    final ByteBuffer LOGFILE_HEADER = ByteBuffer.allocate(LOGFILE_HEADER_SIZE);
+
     // this indicates that a write has happened since the last flush
     private volatile boolean somethingWritten = false;
-    
+
+    // ZK ledgers related String constants
+    static final String LEDGERS_PATH = "/ledgers";
+    static final String LEDGER_NODE_PREFIX = "L";
+    static final String AVAILABLE_NODE = "available";
+
+    // Maps entry log files to the set of ledgers that comprise the file.
+    private ConcurrentMap<Long, ConcurrentHashMap<Long, Boolean>> entryLogs2LedgersMap = new ConcurrentHashMap<Long, ConcurrentHashMap<Long, Boolean>>();
+    // This is the thread that garbage collects the entry logs that do not
+    // contain any active ledgers in them.
+    GarbageCollectorThread gcThread = new GarbageCollectorThread();
+    // This is how often we want to run the Garbage Collector Thread (in milliseconds). 
+    // This should be passed as a System property. Default it to 1000 ms (1sec).
+    final static int gcWaitTime = Integer.getInteger("gcWaitTime", 1000);
+
     /**
      * Create an EntryLogger that stores it's log files in the given
      * directories
      */
-    public EntryLogger(File dirs[]) throws IOException {
+    public EntryLogger(File dirs[], Bookie bookie) throws IOException {
         this.dirs = dirs;
+        this.bookie = bookie;
+        // Initialize the entry log header buffer. This cannot be a static object
+        // since in our unit tests, we run multiple Bookies and thus EntryLoggers
+        // within the same JVM. All of these Bookie instances access this header
+        // so there can be race conditions when entry logs are rolled over and
+        // this header buffer is cleared before writing it into the new logChannel.
+        LOGFILE_HEADER.put("BKLO".getBytes());
         // Find the largest logId
         for(File f: dirs) {
             long lastLogId = getLastLogId(f);
@@ -83,14 +110,132 @@ public class EntryLogger {
             }
         }
         createLogId(logId);
-        //syncThread = new SyncThread();
-        //syncThread.start();
+        // Start the Garbage Collector thread to prune unneeded entry logs.
+        gcThread.start();
     }
     
     /**
      * Maps entry log files to open channels.
      */
     private ConcurrentHashMap<Long, BufferedChannel> channels = new ConcurrentHashMap<Long, BufferedChannel>();
+
+    /**
+     * This is the garbage collector thread that runs in the background to
+     * remove any entry log files that no longer contains any active ledger.
+     */
+    class GarbageCollectorThread extends Thread {
+        volatile boolean running = true;
+
+        public GarbageCollectorThread() {
+            super("GarbageCollectorThread");
+        }
+
+        @Override
+        public void run() {
+            while (running) {
+                synchronized (this) {
+                    try {
+                        wait(gcWaitTime);
+                    } catch (InterruptedException e) {
+                        Thread.currentThread().interrupt();
+                        continue;
+                    }
+                }
+                // Initialization check. No need to run any logic if we are still starting up.
+                if (entryLogs2LedgersMap.isEmpty() || bookie.ledgerCache == null
+                        || bookie.ledgerCache.activeLedgers == null) {
+                    continue;
+                }
+                // First sync ZK to make sure we're reading the latest active/available ledger nodes.
+                bookie.zk.sync(LEDGERS_PATH, new AsyncCallback.VoidCallback() {
+                    @Override
+                    public void processResult(int rc, String path, Object ctx) {
+                        if (rc != Code.OK.intValue()) {
+                            LOG.error("ZK error syncing the ledgers node when getting children: ", KeeperException
+                                    .create(KeeperException.Code.get(rc), path));
+                            return;
+                        }
+                        // Sync has completed successfully so now we can poll ZK 
+                        // and read in the latest set of active ledger nodes.
+                        List<String> ledgerNodes;
+                        try {
+                            ledgerNodes = bookie.zk.getChildren(LEDGERS_PATH, null);
+                        } catch (Exception e) {
+                            LOG.error("Error polling ZK for the available ledger nodes: ", e);
+                            // We should probably wait a certain amount of time before retrying in case of temporary issues.
+                            return;
+                        }
+                        if (LOG.isDebugEnabled()) {
+                            LOG.debug("Retrieved current set of ledger nodes: " + ledgerNodes);
+                        }
+                        // Convert the ZK retrieved ledger nodes to a HashSet for easier comparisons.
+                        HashSet<Long> allActiveLedgers = new HashSet<Long>(ledgerNodes.size(), 1.0f);
+                        for (String ledgerNode : ledgerNodes) {
+                            try {
+                                // The available node is also stored in this path so ignore that.
+                                // That node is the path for the set of available Bookie Servers.
+                                if (ledgerNode.equals(AVAILABLE_NODE))
+                                    continue;
+                                String parts[] = ledgerNode.split(LEDGER_NODE_PREFIX);
+                                allActiveLedgers.add(Long.parseLong(parts[parts.length - 1]));
+                            } catch (NumberFormatException e) {
+                                LOG.fatal("Error extracting ledgerId from ZK ledger node: " + ledgerNode);
+                                // This is a pretty bad error as it indicates a ledger node in ZK
+                                // has an incorrect format. For now just continue and consider
+                                // this as a non-existent ledger.
+                                continue;
+                            }
+                        }
+                        ConcurrentMap<Long, Boolean> curActiveLedgers = bookie.ledgerCache.activeLedgers;
+                        if (LOG.isDebugEnabled()) {
+                            LOG.debug("All active ledgers from ZK: " + allActiveLedgers);
+                            LOG.debug("Current active ledgers from Bookie: " + curActiveLedgers.keySet());
+                        }
+                        // Remove any active ledgers that don't exist in ZK.
+                        for (Long ledger : curActiveLedgers.keySet()) {
+                            if (!allActiveLedgers.contains(ledger)) {
+                                // Remove it from the current active ledgers set and also from all 
+                                // LedgerCache data references to the ledger, i.e. the physical ledger index file.
+                                LOG.info("Removing a non-active/deleted ledger: " + ledger);
+                                curActiveLedgers.remove(ledger);
+                                try {
+                                    bookie.ledgerCache.deleteLedger(ledger);
+                                } catch (IOException e) {
+                                    LOG.error("Exception when deleting the ledger index file on the Bookie: ", e);
+                                }
+                            }
+                        }
+                        // Loop through all of the entry logs and remove the non-active ledgers.
+                        for (Long entryLogId : entryLogs2LedgersMap.keySet()) {
+                            ConcurrentHashMap<Long, Boolean> entryLogLedgers = entryLogs2LedgersMap.get(entryLogId);
+                            for (Long entryLogLedger : entryLogLedgers.keySet()) {
+                                // Remove the entry log ledger from the set if it isn't active.
+                                if (!bookie.ledgerCache.activeLedgers.containsKey(entryLogLedger)) {
+                                    entryLogLedgers.remove(entryLogLedger);
+                                }
+                            }
+                            if (entryLogLedgers.isEmpty()) {
+                                // This means the entry log is not associated with any active ledgers anymore.
+                                // We can remove this entry log file now.
+                                LOG.info("Deleting entryLogId " + entryLogId + " as it has no active ledgers!");
+                                File entryLogFile;
+                                try {
+                                    entryLogFile = findFile(entryLogId);
+                                } catch (FileNotFoundException e) {
+                                    LOG.error("Trying to delete an entryLog file that could not be found: "
+                                            + entryLogId + ".log");
+                                    continue;
+                                }
+                                entryLogFile.delete();
+                                channels.remove(entryLogId);
+                                entryLogs2LedgersMap.remove(entryLogId);
+                            }
+                        }
+                    };
+                }, null);
+            }
+        }
+    }
     
     /**
      * Creates a new log file with the given id.
@@ -108,6 +253,9 @@ public class EntryLogger {
         for(File f: dirs) {
             setLastLogId(f, logId);
         }
+        // Extract all of the ledger ID's that comprise all of the entry logs
+        // (except for the current new one which is still being written to).
+        extractLedgersFromEntryLogs();
     }
 
     /**
@@ -228,6 +376,9 @@ public class EntryLogger {
         }
         File file = findFile(entryLogId);
         FileChannel newFc = new RandomAccessFile(file, "rw").getChannel();
+        // If the file already exists before creating a BufferedChannel layer above it,
+        // set the FileChannel's position to the end so the write buffer knows where to start.
+        newFc.position(newFc.size());
         synchronized (channels) {
             fc = channels.get(entryLogId);
             if (fc != null){
@@ -250,9 +401,6 @@ public class EntryLogger {
         throw new FileNotFoundException("No file for log " + Long.toHexString(logId));
     }
     
-    public void close() {
-    }
-
     synchronized public boolean testAndClearSomethingWritten() {
         try {
             return somethingWritten;
@@ -261,4 +409,79 @@ public class EntryLogger {
         }
     }
 
+    /**
+     * Method to read in all of the entry logs (those that we haven't done so yet),
+     * and find the set of ledger ID's that make up each entry log file.
+     */
+    private void extractLedgersFromEntryLogs() throws IOException {
+        // Extract it for every entry log except for the current one.
+        // Entry Log ID's are just a long value that starts at 0 and increments
+        // by 1 when the log fills up and we roll to a new one.
+        ByteBuffer sizeBuff = ByteBuffer.allocate(4);
+        BufferedChannel bc;
+        for (long entryLogId = 0; entryLogId < logId; entryLogId++) {
+            // Comb the current entry log file if it has not already been extracted.
+            if (entryLogs2LedgersMap.containsKey(entryLogId)) {
+                continue;
+            }
+            LOG.info("Extracting the ledgers from entryLogId: " + entryLogId);
+            // Get the BufferedChannel for the current entry log file
+            try {
+                bc = getChannelForLogId(entryLogId);
+            } catch (FileNotFoundException e) {
+                // If we can't find the entry log file, just log a warning message and continue.
+                // This could be a deleted/garbage collected entry log.
+                LOG.warn("Entry Log file not found in log directories: " + entryLogId + ".log");
+                continue;
+            }
+            // Start the read position in the current entry log file to be after
+            // the header where all of the ledger entries are.
+            long pos = LOGFILE_HEADER_SIZE;
+            ConcurrentHashMap<Long, Boolean> entryLogLedgers = new ConcurrentHashMap<Long, Boolean>();
+            // Read through the entry log file and extract the ledger ID's.
+            while (true) {
+                // Check if we've finished reading the entry log file.
+                if (pos >= bc.size()) {
+                    break;
+                }
+                if (bc.read(sizeBuff, pos) != sizeBuff.capacity()) {
+                    throw new IOException("Short read from entrylog " + entryLogId);
+                }
+                pos += 4;
+                sizeBuff.flip();
+                int entrySize = sizeBuff.getInt();
+                if (entrySize > 1024 * 1024) {
+                    LOG.error("Sanity check failed for entry size of " + entrySize + " at location " + pos + " in "
+                            + entryLogId);
+                }
+                byte data[] = new byte[entrySize];
+                ByteBuffer buff = ByteBuffer.wrap(data);
+                int rc = bc.read(buff, pos);
+                if (rc != data.length) {
+                    throw new IOException("Short read for entryLog " + entryLogId + "@" + pos + "(" + rc + "!="
+                            + data.length + ")");
+                }
+                buff.flip();
+                long ledgerId = buff.getLong();
+                entryLogLedgers.put(ledgerId, true);
+                // Advance position to the next entry and clear sizeBuff.
+                pos += entrySize;
+                sizeBuff.clear();
+            }
+            LOG.info("Retrieved all ledgers that comprise entryLogId: " + entryLogId + ", values: " + entryLogLedgers);
+            entryLogs2LedgersMap.put(entryLogId, entryLogLedgers);
+        }
+    }
+
+    /**
+     * Shutdown method to gracefully stop all threads spawned in this class and exit.
+     * 
+     * @throws InterruptedException if there is an exception stopping threads.
+     */
+    public void shutdown() throws InterruptedException {
+        gcThread.running = false;
+        gcThread.interrupt();
+        gcThread.join();
+    }
+
 }

Modified: hadoop/zookeeper/trunk/src/contrib/bookkeeper/src/java/org/apache/bookkeeper/bookie/FileInfo.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/bookkeeper/src/java/org/apache/bookkeeper/bookie/FileInfo.java?rev=944003&r1=944002&r2=944003&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/bookkeeper/src/java/org/apache/bookkeeper/bookie/FileInfo.java (original)
+++ hadoop/zookeeper/trunk/src/contrib/bookkeeper/src/java/org/apache/bookkeeper/bookie/FileInfo.java Thu May 13 20:23:35 2010
@@ -33,6 +33,7 @@ import java.nio.channels.FileChannel;
  */
 class FileInfo {
     private FileChannel fc;
+    private final File lf;
     /**
      * The fingerprint of a ledger index file
      */
@@ -42,6 +43,7 @@ class FileInfo {
     private int useCount;
     private boolean isClosed;
     public FileInfo(File lf) throws IOException {
+        this.lf = lf;
         fc = new RandomAccessFile(lf, "rws").getChannel();
         size = fc.size();
         if (size == 0) {
@@ -110,4 +112,13 @@ class FileInfo {
             }
         }
     }
+    
+    /**
+     * Getter to a handle on the actual ledger index file.
+     * This is used when we are deleting a ledger and want to physically remove the index file.
+     */
+    File getFile() {
+        return lf;
+    }
+
 }



Mime
View raw message