[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[or-cvs] r11078: improved the event concept, added fully automatic long-term (in puppetor/trunk: . doc src/de/uniba/wiai/lspi/puppetor src/de/uniba/wiai/lspi/puppetor/examples src/de/uniba/wiai/lspi/puppetor/impl)



Author: kloesing
Date: 2007-08-11 11:39:12 -0400 (Sat, 11 Aug 2007)
New Revision: 11078

Added:
   puppetor/trunk/LICENSE
   puppetor/trunk/README
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/EventType.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/EventImpl.java
Removed:
   puppetor/trunk/doc/example.png
   puppetor/trunk/doc/howto.aux
   puppetor/trunk/doc/howto.dvi
   puppetor/trunk/license
   puppetor/trunk/readme
Modified:
   puppetor/trunk/doc/howto.pdf
   puppetor/trunk/doc/howto.tex
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/ClientApplication.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/Event.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/EventManager.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/EventSource.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/Network.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/NetworkState.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/NodeState.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/ProxyNode.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/RouterNode.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AccessingPublicWebServerOverTor.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AdvertisingAndAccessingHiddenServiceOverPrivateTorNetwork.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AdvertisingAndAccessingHiddenServiceOverPublicTorNetwork.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AdvertisingHiddenServiceToPublicTorNetwork.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/DistributedStorage.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/ClientApplicationImpl.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/DirectoryNodeImpl.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/EventManagerImpl.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/NetworkImpl.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/ProxyNodeImpl.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/RouterNodeImpl.java
   puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/ServerApplicationImpl.java
Log:
improved the event concept, added fully automatic long-term test for distributed rend descriptor storage

Copied: puppetor/trunk/LICENSE (from rev 11077, puppetor/trunk/license)
===================================================================
--- puppetor/trunk/LICENSE	                        (rev 0)
+++ puppetor/trunk/LICENSE	2007-08-11 15:39:12 UTC (rev 11078)
@@ -0,0 +1,66 @@
+===============================================================================
+PuppeTor - A Java-based Tor Simulator - is distributed under this license:
+
+Copyright (c) 2007, Karsten Loesing
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+
+    * Neither the names of the copyright owners nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+===============================================================================
+The Tor controller demonstration code is distributed under this license:
+
+Copyright (c) 2005, Nick Mathewson, Roger Dingledine
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+
+    * Neither the names of the copyright owners nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Copied: puppetor/trunk/README (from rev 11077, puppetor/trunk/readme)
===================================================================
--- puppetor/trunk/README	                        (rev 0)
+++ puppetor/trunk/README	2007-08-11 15:39:12 UTC (rev 11078)
@@ -0,0 +1,8 @@
+This is a Java framework that facilitates the configuration of a set of local
+Tor processes and the execution of automatic tests based on these processes. The
+intention is to make it easier for developers to analyze Tor's behavior in
+arbitrary network settings and to measure the effects of changes to the Tor
+source code. Due to the automation of configuration and execution, these
+experiments can be done in an unsupervised batch fashion.
+
+For more information, read the how-to document in doc/howto.pdf .

Deleted: puppetor/trunk/doc/example.png
===================================================================
(Binary files differ)

Deleted: puppetor/trunk/doc/howto.aux
===================================================================
--- puppetor/trunk/doc/howto.aux	2007-08-11 14:38:11 UTC (rev 11077)
+++ puppetor/trunk/doc/howto.aux	2007-08-11 15:39:12 UTC (rev 11078)
@@ -1,12 +0,0 @@
-\relax 
-\@writefile{toc}{\contentsline {section}{\numberline {1}Introduction}{1}}
-\@writefile{toc}{\contentsline {section}{\numberline {2}Installation}{2}}
-\@writefile{toc}{\contentsline {section}{\numberline {3}Example 1: Accessing public Web server over Tor}{3}}
-\@writefile{toc}{\contentsline {section}{\numberline {4}Example 2: Advertising hidden service to public Tor network}{5}}
-\@writefile{toc}{\contentsline {section}{\numberline {5}Example 3: Advertising and accessing hidden service over public Tor network}{6}}
-\@writefile{toc}{\contentsline {section}{\numberline {6}Example 4: Advertising and accessing hidden service over private Tor network}{8}}
-\@writefile{toc}{\contentsline {section}{\numberline {7}Example 5: Beta test of distributed storage for hidden service descriptors}{10}}
-\newlabel{ex5}{{7}{11}}
-\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces Network setting of example 5.}}{11}}
-\@writefile{toc}{\contentsline {section}{\numberline {8}Architecture}{11}}
-\@writefile{toc}{\contentsline {section}{\numberline {9}Known issues}{12}}

Deleted: puppetor/trunk/doc/howto.dvi
===================================================================
(Binary files differ)

Modified: puppetor/trunk/doc/howto.pdf
===================================================================
--- puppetor/trunk/doc/howto.pdf	2007-08-11 14:38:11 UTC (rev 11077)
+++ puppetor/trunk/doc/howto.pdf	2007-08-11 15:39:12 UTC (rev 11078)
@@ -1,2830 +1,1572 @@
 %PDF-1.4
-3 0 obj <<
-/Length 2573      
-/Filter /FlateDecode
->>
+%���
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
 stream
-xڕXKs����|崓�7s�V��$��$�)R��~�dyj��F?��O��RO��������I����u>��Pg�}
-���O��0�����J�D�)a��ʯ������U���i�(��Fdk���$��d����PQ���Q��~5����K���8����	���(�	<����8���ac���Qb2�Q��cy(8C��<Nzd�zj�_��W�2
-�b8�l��m�J�r/��	�LF�/�����u)��n������3�@cf�mU�Hao��/�2���V��F�Fm3U�����++��X����f`9���؈>�5�'q�Zv��Lfr0�p�ES���:����0W�H;&��0�<O�_��Z-�5��5��F�ð�9����E$6�6FAh�:R$��l��h�i�����I��ߩ��iu�ё��x�0��m/>I~
-kt@��V�r��㙬a��朆$�~��*����[wv�o�+=R�g&)��NS�2E�:D�4&	q�%?�<����4!N����OE�9�Y+vy87tb�gpH�"w6�gٟf��T̾�W)a���?I �X�_�7\f����ӦG�cO�����nd!8D�{Wz^v'��|�����
-���!\E��&��
-��Qh�k��>���"έ�ƽ�N�q0Zb]n8���mh$���q��-��E?�;�(����1�f��l�Cg6&f�Zѱ���-|xc��a���w��7fz�����86W�~_Q���K#�鐿nv�a�mQ<k�-����նr��z���*��u��.^�>M6�hK�0Ng�#X]��yJj�U0>�u�ۦvDr�s��Egҁ����hf�[P���Q�Q�S?�?F8���j�L{��oޘF�-[��-��o�q''�hX#�~0�W�bLkFd�X�����Ԡ�|9��3V4Mgl��%��}?��MW�I�i��M$�;:Y�����n\?�,���C������
-�g��pn��m-�sW8���/Lh���6T,��-X�J+-������$̃NuJ�6`�S�?�SI (|ۥ��--����R��wW�n{BN����31A���H���s�l��_� ����,��$�:�ƚ�U���y�ե��,�%�<�"-����Ԟ8Qo�D.��3{&�����ER~�x��I��
+��ny/��	�>%�9K��rH�dɥ���_���4���\e���������݃>��?T}�H��=\~y����w��<~~RKt	R<�:�Ei�_9��A�u��Sp������^,��t>%�goR8���).�p�_�Π+q��Q��D$��+F9�ܣK����0H>�Y���'r����ѻ�lIƂ=��3Eo�-�IL�������L�ʊk��x5��v`	�&k:j~Q\ޣ%
+��K��p��p0��Ž�f_�������R���5����G��$��a,�j$�=��CY*��$TT�`�ǕژJ�;$T}�B6b�.I��������z�QO�̍U�9zD2:�HV�Jźf8x=DGkZ����3
+=�ꯓFk\v5�$Xg��wэ�٘-9��Ftc�^D�ЛxqЗ�&�7�b㲕�b�lLp�m�8~B���b�7��$KE+:>�4.����d�EgbݯMAg�-[g&����gn�%E?%��[��M&�����ΰ��ɴ3IMy������ɓS���~t���
+����Y�t5GP�����Q�߭�ߐ��D�nk:ׅLv$L��'7*Бt�Ӫ,��®����n����,]�����`pu覅t��BI_u���������b��<�('樀��#ƈ��&����z��٦�߅!�X�0�W4���+�~>��x�hO���}M���:�����և����u�|s+w��3vQ�p��<HO�N�ͼ���'X)���y�x�Ys^zp�5/Ie^u�����7:-Q�odԺ�^���fg]j-�yx���)y�͠5�=��_Io�������"0#%(�cc���K�$
+����9�q��"�C���S������BQ�"|+1�M��5�L�l�e�vU@�6ɍ轅�u�ð����j?��
+�q=�5z�^�x���Ӑ�I7â�2G`j����wVc�8��l�����z�<+	1j���^�d���g�5�d��M�˙O�u�.�նN@��۩/��Ξ\����|��RoN�	6R�A�D�
+y�f"ؖv#gf�N��D���P^����zd��� _w�������r��\6KЋ6W2G+����+~	���_]M�wH�1�=��W���������K'ȣ�g�)#é�*V�����Ix'�zC�
+�8+)�`z~�k)�
+��O���"��o�m�̋�w��n�	��{��@~��&����iE����mi���R�@cuL~X]���u�.�+(���e��_���~����%�+U�ݵojk+S[��Q���υ򱴛�GȌ�����)�g< ���hW+07����#k_lB�����:9�vj&����fo% )�ԔÝ+8������	�$u�V&R²MF��'S翮�2�6\,<��T��[oG'VKD.<<3G@�ˎ-Q3��g�zQ�l'T׃�g@�+��{��+���$׆�!|����@<�ݦ���%�ru���P8���(_jZ�/�A�y�W�{D%�?�U~^ Y#�$�
+o��Y`v(��軕�ϸcE�3r�aD>j���k�޼L�Ɓ?SR�+ ����۞?@{E��:^wֽ�c0�b���n���x�a��
+a-�fm���n5'j������J]�g��7j�S8�M�z>5�`��#������xލ�� ���NK���6	m��(�E,3="�W�$������J+o�s�c��������� �N�5<K
+��y�V����_�N����C=!��/W
+����7�pH�j.�_�V�&���xE��*/�>ҡ��,�E98['�{6�FY��l>&��m��O�VR�nӅ�C�tV��Q@��C�f��̏�՛y��)�����މt>�j��f�D&%Nxu��er;��|�oRi��2��LQ��׮���O0�h�#z�n��b4�^(ɬw���Bv�SX������[�iƖ>�s������#5K�Ap�v��l��zCN/����k�c#����\_�����k��5���D[6��'&��2�Kz5)�?֪w�2��ޥ+�����E��+�J=$zȷ$1ϫ~���N���&�����1��y�G��'�F��u��j�6K9�C�O�U14���l�0 �^���}�t��S��SM�芫4���P�7bt���MF�"m*�wu���f��������ә����h&�����BX�+��[i��������^uk{���Ӟ�0�^��G�}��=������q�Cn���bZ�o�iMmc��v��=���NP�s}���_��o=rL�}ߺsV�i�_itn�h�a�����n=�>�\�,��m�����r;F(>Uo~���Da�[�8PF���%��6w���6B3͇w�n-P�>"c�*��B�x�"ӵ�lHĔ��bW=�)�u�eߖ
+�$3�?���#Cvek3� ;�+�w�@?84]F�"ƥ�� K�����̦�W+\�ٙ��M����|q��ndstream
 endobj
-2 0 obj <<
-/Type /Page
-/Contents 3 0 R
-/Resources 1 0 R
-/MediaBox [0 0 612 792]
-/Parent 25 0 R
->> endobj
-1 0 obj <<
-/Font << /F15 6 0 R /F16 9 0 R /F26 12 0 R /F8 15 0 R /F7 18 0 R /F18 21 0 R /F17 24 0 R >>
-/ProcSet [ /PDF /Text ]
->> endobj
-28 0 obj <<
-/Length 2407      
-/Filter /FlateDecode
->>
+6 0 obj
+4887
+endobj
+25 0 obj
+<</Length 26 0 R/Filter /FlateDecode>>
 stream
-x�YKo��ϯ��Z$�f��dA��lI���>�����]]������;���T������Ş�8K�F�(��k��W4��Bo,�w{ ջ}������W4�h���@���	B��f�!1K����Dᮻ������=Q{�����|G������N�	��jE��ħk�.��H�H�c��(n�G
-�-�Ԧ,c�#�W�X��9����g��<���0��g#z
-��]�س>a��;kF���v�>��J�����HQC7���0��vJ��0Sq!q���;�ԝ=w��^�-���\Fґ�'HR;ˊ�����xw��&�a�A�# K� �
-�-�ýJ��(��d=������V�e���N���}�גƤ�)P��A���)�㷆�`��I5r�G0a����U	�Ht
-������#r���/
-,Z�����ZDC���8�$��q�"gYxn�Ha˫�������G=��&�-�ZyS�^���U������L�/��%Pk#�J�E����+�B�"R����,�r��빦� �"j{�������?�-�#����t�v�a�IwO���s�`x�o�IkAY�8d�Ș0#YY�8���A��~��������-�œY�:�G�(K�ZF���J2���Kt�\��鋆I�z��-xy`�X.�O�Y�lM��	�.�V)�7]mv��\qⲌ]���$ҡ�DNS�T���t�&c'�ød������4$�]3���&��Y�-:���b�$��K�j��\�a;b�����Q���o�F+Y4�E��H3zF`��B�=��t%R�-~Y����ur��>�z&,���w����}&��h����\a�<��*-\�d�A��i*�>�����v����E�D	�_��C���dstream
+x��o�~�Na��w2oI��I��E�˲e׶�ؑ��wh����ٳ��o���~>^q�������o��q���g�}
+�9K���G"?/�_���G�ܝ��q����OT�\�r/�wO��~������T�Ur
+�r]�L w���)�	�s��{�f�^婂���zX�`�w�?�r1^��d�4/J�{�׋V����5��_�q��<�fWN/v�c��}��G�U�>y'��
+_u��f1AH��S��˜�����x���	��$cVQ���q��:�c@_N�?�E��kiAF
+����g��x"d����]�A���v��Q�"�SP��"Y6M�J��Ժ8�&���OZ9�1�)�0�Bpk�Y��0��DI��;_����)otE�G,U��x��c�h��+n6Q\W�_�d�Q0<��g\���
+����;�Ab�������ffB1X�@P��Y��h��߮�7��
+b��)�OV��$�+\֒�.�w�T��K*��n2�mI�ؕv%�
+���
+ͻ\0 t0T�z�!5x�]����m��ПJ��(p!�z���]�{�g��E)�W�CF-�D}wTK�T���M�����(Q�E.���l��Uy�e|Q�.8��-t5��(��;��z�k����x�&��2�{Aԙ@v��g��Pp'�?�kb8��~Y��A��'m��:�cv�	��1����y=�W$3o��7�}�������ǚ��@[''t��h��D��r �������ֻ�SI�����#.H��d��Մ/�'��<Zlw�fKIЉF���]`�����k���"[{Yo��ʠ���k<#B
+<"%O��gdq'
+���B��v���ޟ$������E��%��Æ'E\qvf9��4\Po’��l���4	���	��H�!��a�!
+���䪗5��9+CQ�v�+�����
+��M���EL��T�peNL](>���R]J�<�d �Lt���MvU[����:l�5����nJZ���1��J�s
+�ͫ��w����o�<�_d:f�$����X��z�0��R(��H��3����W����j:K�9S j����R�GȺ(�S�O��A+f|&�1�}J,k<".�=����!γEu8[ܖ���8��wr`�2HxӜ%��u�!�p���95x��GL�!+�Z�'BcY�28�ˮ��J�DxU$ۿ�7r��D |������,��PT80.L�����&+�`tvq��k#�]Y44�h���Hw�
+j�c��=;��8�n��FOC���3@�����ؒ�
+��
+��R�1zZ�/���clR�^�	�� �uD;nmѢ� |�E��45��Ԍ�.�(�vIki��+@�;Pޢ����}j&+@]�����I��(-fe��3(b��3�1Q1f�6A,1��䙖)%�'�ҧ�G�Q�Sgڰz���^�\Ϧ�ж�_�؅��&�E�p8��Y��Mw��O�8�m�ދi�ev
+D����YD�����O37��68���`/i��^�U���ƃeK#9)p0��&�w5rs3+�G�D6�������VN��EX��}�{0%���H|B�
+�������<k�?���#=h�7�$��A�V���YĄ���W�$������P)�c��
+��c!V�����g���lJ����4�!CQR��!��+v�@Q#�s�ìϠ�JN����=ۘ��1�/	5Zy-|�6'\*�>�R6�1{H�)N.>��qy��:%U��b{K�����[��Dj�
+i|�����P���x�f�W~ӎ��D�^qƫ����J�L����C.&9��2��dM����=��|���Y%��%���mjc��n����r��|66����E_�!a�|L���2MH��i�f������L����
+�Z��s��R&�����A;ts�����U��oP�+�3l5H������VLLC+B����Z)���<�
+k���m
+�>����e���\r^���Ա�g`7�sF#2a�����+2��LN�ۋy^�nG���},@�&�C��y���-Y`fA�
+Ή\Մ�ܾ�2�T��H��H�1��o?����h endobj
-27 0 obj <<
-/Type /Page
-/Contents 28 0 R
-/Resources 26 0 R
-/MediaBox [0 0 612 792]
-/Parent 25 0 R
->> endobj
-26 0 obj <<
-/Font << /F8 15 0 R /F26 12 0 R /F27 31 0 R >>
-/ProcSet [ /PDF /Text ]
->> endobj
-34 0 obj <<
-/Length 2594      
-/Filter /FlateDecode
->>
+26 0 obj
+4713
+endobj
+32 0 obj
+<</Length 33 0 R/Filter /FlateDecode>>
 stream
-xڕYK����Y��zg���A���Ez���d���-K�$w'�~�v;�ͥ]$�E�꫗��*���RifE���4u�ƫ���y2�G����͈����߁����?<��|�Xj�6J�e�*�oR���o���m�ڭiwc�g�U����oh�V�kƐ�G�����W�%a�d�5�,��ˌ���"<�t$���ޮ7I�d�>����ϺLp�
-�8��p����c��VW��c�-^��?��7�]��-4e��7`5�xT1Ox<�G����c�ɲ���'y͑R���og��pB�V��������}\�eY:�I%8E�T��x�sD�,���Lo�Y8����oyB �&�����Y�j��3:&yy�<�]w�H�x�|���O�!�F����
-�V�az׷-=��Q���XAŷ�.��N�?�"�YQt�8^D6R�a��foܢ����K��9�{X F>�8錃2��J��J���	TZ�+g3������T�e�-F�UF�K�Ne�������	�3���q�3�$KXσ��,����w85y�G5GK.M4�/g's�B���H����--K�۞@�����b��PH��p�8E�!���$�bB�.���W����+#�nH��H_TTxD
-9�'ۻ��R;�+S_��F��F���9p��{w����<{^l�O���vY�/B�)G�tf�.+5u�!σ��0�ǰRW����ct�p�}�W�@���d����A�WA����Y4�0M)~��v��]���0���ۼP'�S%���k0��-����-K��K�t%�Q����ƫ��3��D�\��CuQ��h~n�*/��ڧ�D(N�փ�1��Q�=�6|�ѨKn��<>�����Ay���)����pS��9Z5|�4\�X�;F���vwV��H�z�-���+��Uf�ai�q���10M˛\�.�2s�/�n_�&�‰�]�'�!��c���K#y�"�3|J�}Ő��d�k;�p):	>xoc[�.ޅ~ꩌ\��.���|���dY�]�i0��w��"��g���J��_{��5������nV1�G�&�������7�LϱKIj��U���`���|��~��s*������������vu���Y9�r�z������Śk�8�{�A��T�yV$+��0�
-���w_�3Z5w���(�K����,��H
-�����ȍ��Y
-�U�y.��,³uei�����OT��otX�D�����T2�>.��ʁ�K���)�mN��<��䧏�A`n�T�~�3��w��|��������A�/�b��vҫendstream
+x��oGr�a ��Q���v��f��(Ɋ$R�HY�ꞚsH���5왾U��K�_vb�;�����=y������'��ϡ�
+��D��ٝ�8�����(x�N�?3K����{������_�b�8�����~!O��,��vRR1�o[�Wt��������vzE7������No�ݓ9������?�p��_���+���+"���F��hvgR��s����X�yW>������|�򆒈;�g�V�哙�Y�=!�42?$�����
+�~�e5m�:��l���^����<v�N�vz?
+?���x�zKgbd���Lȸ�zr����0��*��?N�oX����X��ϻ¼i
+�����Y��6N�)���i��7���>�$+V����'8ZG>�&-�8\ܭ@�d��jˣ
+��[�R�(��^<�����A�xVN�	@���������	�ڰX�&V7���������Z�{�ڦ*H/��!=��@��	� [���r�@������^����ڐ��E(�����M즅�帧�%�Lł꘸�]%�4V���" T��'mٞ-M�h��#}���СS��
+�T�]�9RGg�5�xd��R1�����/_dS��p��e^QT���$\�2��.w��T�H!!���f��{����������]^�W"�]2!u@G��e��'�Tf?����������jk�tEg��#�erf$�Z�(��'�Q�
+2�ƪ�-��M�a�-w x���=G� �����QV#7�����J@l���Ƚ���#�qTp��nx`�Ǹ,P\����D��(��+��oJ���~����lqޟ��c��g�����`�P�`X�U���`����|��.����h;`��C�N�+������QUd��Ik�ʫ��GΨ*�Up�&a�ѧ�k���ɇc����K�4�4�E�	xE4�u��BFV�+3����I�D�W\�y!�ܗ0wr��M$�C@+%��T�R�<��X�|�S���vY}��6�^��+[�1(j ��#���e�xʭ`�0�s!Jt��Q)�����f��	;Z��*��M�Lt�쳼~9=�E�������{���
+�$*�0)�*���A�en��x��x'�*����Ba���@�݄�R1�\��"8��\�P;6������_����Fs������cP����Â������F�AS
+��K79٩��͢3�k����R�Gn�w��xj)���J|�!Ki=0d��,�ش�FE|�iL�B�8�#9�	�+�h�o�i0�oƀ�u��
+�AC��m哓V�'��Bg%�����]{z5���CH���Ů9q8W2
+1;ު�eM8/ԲÍ��&,Z6w�@1Ia7���a#�]+��y͞�\���YnS�[�7sq��C#��;�m�n�u^����qJ1i�ۼ�\���!鵲M���Tg��
+��[��%�
+;2`p'��ӑȒ�"=6�Bf'j��_G���LQ�㕒�K[�q���8���>.��[����EB_��	o�!O�8_ޥ��œ��K�C����1�]6��g~,w����9�\��>�y��y���k��j��������Ks�#/+���k�?��h��#T�q-Ee`tlӝw?O��Q�h���*����ވP.�"g~Yba�N�R�+��≓�;���cB'G�>�߉���_�pF��F������'�7W<ZsF�c����͙U��l�wXP���ye	�����7o%Z��'��;���+��a��S���]6��H����Ti�Bw���������u��j�(GL�c֒qR�2�<k]���#=ȶ��ڧ����>҃��	��!���5.ژ�3)�~D_�h����_Z-iKH���m��-����;����:��ndobj
-33 0 obj <<
-/Type /Page
-/Contents 34 0 R
-/Resources 32 0 R
-/MediaBox [0 0 612 792]
-/Parent 25 0 R
->> endobj
-32 0 obj <<
-/Font << /F27 31 0 R /F26 12 0 R /F8 15 0 R /F14 37 0 R /F7 18 0 R /F18 21 0 R /F17 24 0 R >>
-/ProcSet [ /PDF /Text ]
->> endobj
-40 0 obj <<
-/Length 2495      
-/Filter /FlateDecode
->>
+33 0 obj
+5168
+endobj
+39 0 obj
+<</Length 40 0 R/Filter /FlateDecode>>
 stream
-xڭ�����1�l����Eoj+�DB$V @��i��{�:�b=h3=������*��&Rk����A$������b��.������`A�c�7q���d��Hd���a:�x�*��Oc��2��pMz�| �鎧5�-K���d&�TH&�}k�3h/�h�f
-�E��H�4�yQ��-Ƞ3���>��VZ��#��s��dk������܎.��	"�E��/�\�1>�( �L��&�ƴ�c1�3M�ɸh�\�F�p��kW5�6�x�2oXX]�������	5Lj����j��4�fP]S*G��eo0�D��YSc<�m��^i���������#?ޟ�az��������B���U����zB��TD�:����\d��|����_�]��
-a$|?�-l�~Ed���d1���wWrN5S:A�����
-T{ۚM�����^;�O�9�<�����{��qRH���{���;�@6�.��n�<8'�]n�/��撳�%��VXno���1��r�������l�'��(�F�|~�=?���J��T���ص:}-\$����9`�l�a�+�~��L�;1@�v�\
-�9��j�W+k�YҼ���O���qֆ8-;UzcW�<���v�£K.�~��0w
-P�R�J�s���
-V�IdÈdjx�
-���]E5F�-�ҽ��D�b ����m�
-�Hw���@�������8F��FP��%���W�%K��&�5h��G��
-N�����u�l��d�չ������/��oԤ�yS��S�?����-tғ���xT6�=�D�vZ�,-��˯g[�b`�SAn���x#e��];m��
-s����H�-Kkd}��ȶe�o�N�/]����*o�� P��
-	�m��(����i<�c>-�=�������㬋r�t�n�<R���%v$���������z�c56z�I��
-��[�H�����X��&���q��endstream
+x��Y���"?b�@�}$��oY��yWZ+�W�e[����zfv%;X��n6Y��#�ُG7��Git#7�ԫ�^��(won��*l�rfs�����������k�?����6�F�6�F��ѯ��t�����pPI����NMN��l��ť��o��_�<�_3� �Ijsz��+���.�Brje'g��c1j ��L��a����
+���+�4-�:��x|��Twg[�s�nc�+�����������Ƞ�$X���P�^��J�{�'U0���a��M2�̮l���~
+�����R�
+2�R?>6������t��d��xZX��F;�;$�	�	oϴ���\V:\���_ן��!`���]� ˅�� ʛ	t
+U�0&�B�3l�<>q����y�f&�Q)�:��(A-���y�9�EeϚ,���#R�)�YC�;�����l4�����_�Y{>Z�MG����X[g���ͱJ���L=먂}Ϙ��c`}�!��N��<l��,7XVr*�d��X�!������ � $��ag�
+ܝ�v��Bx�P�����5'��܈�M/>��4��k�
+,C�|o���W��w�Pٮi���2�'�v~�i���摚���Ū����&���Y�,<��%O���_ޝ�����E���Q&��=��b��"ܴ�H�8���d�c@�6��5Q��,��D#�P6�������UzERuxE!=�)������^�eaԠ������b{'w�q�5H}`w��R�ɝ�+2i��`)��į��~���(�@�o�g������$Jy����Б�R@vY�ދy���6E]HFi}0��g���j����p����
+i��)�
+������k�BUx��_5d����1&3�<O�$��v��+���FIv4'���#�3��54=��`��*V�+|HR�|:$3�����l��$"������>dK�� �5`Ͻ������ӝs)��>O�/��������(T�0P@�ҫIYA���F�#@�l���b��E���>F-f3�WY��5B���bkuT�5�v���A2�%�rD_�!�&��>���fr����D�<�*/ߋ��1����;�OOK�&��v,}_�-�+�����݋>:b�u6nX1$�3�Ь��������s�#,R%!"�� �z�ʒU|M+x9a�ϝ�z�n\HXn?+���f}
+2�Z���v�IL�߫4�ά�<I�bM��@��*b-}��4�����="��Ѐ������ƀ�
+|}ݬ�4��6��������<Ei�dbO�_9��D�}�f9�����'q�K�����B�:?jLB�KU$~����bż�V}b��>�Y�^�����vp+ةkINP�
+��+`�U�v}-��-����+����_��'O�Ӯ
+��k
+2*����i/*[�c7�ɮ6��2��:�3Ŵ5R��ǐ���\�t�o�Nm��I��Th�tx'�I&Ӊ��h������S\�a��D,����:�d�T��j9��Ta���d-��)���+x�Ж���s�Y���5��"�@#��Vך�BrL����L=�v������y&���/�������
+�
+Ƭ;�����z�צ�_�{��"SB%3���r^?xQ��3�w�B'�w�/tO�I1��s�C��)c$���*ޑ,�<�n~��7�s����x��Gd$~������s�]����O�^�6iT�e��>����1�4@]ޱ����<u���\��/+k_T�$z�{���O�O�:f�<��GD���ndobj
-39 0 obj <<
-/Type /Page
-/Contents 40 0 R
-/Resources 38 0 R
-/MediaBox [0 0 612 792]
-/Parent 25 0 R
->> endobj
-38 0 obj <<
-/Font << /F27 31 0 R /F8 15 0 R >>
-/ProcSet [ /PDF /Text ]
->> endobj
-43 0 obj <<
-/Length 2115      
-/Filter /FlateDecode
->>
+40 0 obj
+4823
+endobj
+44 0 obj
+<</Length 45 0 R/Filter /FlateDecode>>
 stream
-xڭXKs�����0�l��'��cijI*ES��EjHʲ���}��+{@���
-]��U8�E�`8[��"o���2���몾(_�[ge��Yپ�+��c)E��]\��������0���~?y��{��C���Bc_���-�"y#9��v�����C�h~5R��5��w%��HZ�
-4���+PY�ӌ�'bOLJ��Y���������k�g�ȅQ�{�iR�7��U�Z�֛�.yn�/W}�T�1��'3)��/�����%�����k��H�E�q^_{�By�H���$l����H����t��GZ������sZ)yS��?��̿��9f=���-Ck�4�0Q�Q���ZB�i4�:��P�V	��@�NC��U9%�S���6E���I:g�
-��n������s<i���j�Z#�қ-Џ
-L��h1���I@��Ta&=�S�yD)��b�g`yQ�^HJJ-���JK�$�9�][h:iR�g���[��9���4ۺւ��e�9oh��pw�����;���5n%�%�s����A�R�z��!��{��|�@��N(�*�������m�He�Uy��*��Ks�����-#ej����\b�?:ggS	B�U��-�A[W^9��f躒O�<;����3�ylV성������^	)wD���]N�D]��C�κY������oAy:�Tj$�ox?��7�ܡ;F'��1�cb=[d���u�F�TErK��b�;e��k-��yѮՉR�@��!.��>�C#�fۭ���k4��U�M�rW���6&�C�#�ʉ�B�.�9:�KjpL5�6�ƕ�1�ڹ1]2�f/����n���A�:�bQ�2!u2U�㮪��P��ȸ�E� ��%JS/5�Y y�T�I���y�nss���
-@��ۻO�f	+���	���~���+t�!cxۭZH);.�ϝ�'q�yy�b�wl�����ّ�>�_V���j�On'���KG�3}����QH+%�s_���.^%&��Eެ��	>�@����������|�����E�#IC�\)�ſ�q�y��؟L��?GtB��h%~OE?~�T��r��@��H'�]�JD�V��LN�����8`�u���͟�?�J\����W��[�5�;N�O�����3�z)&ˮ���A��-+��D�u8_"���JOLv�J�I>��6�q�)�Q��endstream
+x����������t�p']����"�%[v%˫d�E����CG�"������/w�?t��w;���x���1N�W���0+�^����Wnt��_�7z~tn�`�zDЧ}KЁ��;� �~C^��F��.��"P
+�{��x@��)���e�pRV����=
+���������{���:۵�M���~O��_�;��l.���|X��G�1?���qѯ�,���E?t��]��u�v��b���k��i�@ԜC6���(����V6΄M�P 2R
+VI��R~�����&��b���,�a���
+��up"����'.��;N���.Sh�B�2�p��w}ު�V�;�
+/��*����٪���H!=��f����(�JR��AFЃ������;�lϚᐯ�e����\HI<S�A� "b��擄O��+pO��o��h�0���v��x�0l&�x��p����F+��7���Ԟ�'Q��|�2zؕ�7=������+��P#���� i���ڼl�tҝ����+m%bA����+�C/a�r#�+ܨ���X�ܸ��E@�)"Z+x�+��cd����G(�8�Ap�������DžM��ܷ���i_��Ifğ�Nf�b2�$���a��v6<Z��Dv(��+���=�o�-vZ�F��Z��Fa%7���Hk��D�]@{&=�7cT뮛�/',X@͙�	~>l���Q:�2�(^�D�CNˆ�]��9���I´�7j�;6�������d]��8:?��'��>�M�U#�UMGڔ|�5��o�r	ˌ^`장a��mVX+�]qFW[��W��G41��_���$02�)1>33[M�*{��?����P@�߮G�Nbة�$o���?�(�M���ӍI� Z�ʸ��RtRO�J�^~��+���������k��T$Lr&sՌ}Q��;���q-�6�O�����04�S���h\z���Y�.�Y-���
+�
+á�nѻ�E�ґcb�`��Y�L�����' dS��w}4%��qA���$`�Y2k����B1���F��������Ip����*~ff5N��c��
+;ס��:��t�Zp�`�3P_�"���x_/��91���+y�5RL��|���|�8���WW��dP��ձ9W��@�]���~�����՘����_$���B#��D�����.����f�h8����l�������h��[����>v1��g@����'�����s�_�����w*2ͪ�o�F���;�r%�Y��<�N��"���������Ķ����e��ׅ*4u���aٌ��>ΆxAA�S��Y��`��h)�Ҡ�܊y�T�^��"BD��i�����4�����XeTX賐H�&�{s@��[M�;�������jO�W�Ф�y�F3T��HL�	�����H�`��f��l��/R\,��~ڽ�!�)���Y��ϣ�e��-0�X�j��-������Y�����e� �e����(M
+>��Q�@*x��HU!5����QYi�(�RRbB;V�i����2p�����Վ��������%0�m���!
+�Ӧ�NW�Dkb}ɤ蔝�$��-%����xkH�%�?{�ّB���=a#xxu�"e�kc��!��9�e�˴��	z����c;����R�g��� �����E���G��F�l�3�Mv<�:�4��,xu9�O %`m�{7.Y_�PfP�2��QO��H)��wy��m��|o���mçy�vH�[���	W��JS\e���=�6�{�+&+�^0��k������#SsE���Qn��#fb�;�\7��<=.�������_Vf��%��x���R�c�Պ����Noj�0��2�	jW�J��TMjc<�������7urLv+�B���h7��{K��/�6#�YC捉2'�Uܔ�]-���?��n��v�M��B="��S�lV֗/����喢����B�I�0Hs�6����uWWY��b��aa���:}t�R������Shtu$�5��Z�;�CYu��8���rjJ7M�tZ���a�yϫ+��	��я�1+��@���]�o�$�
+�U+���5`ZlO6=�[����3���f�^E�S�wi.�+����J�ǯ�O�0�����;;����Vb���?wn����wg���]*<���J�U�����2a��^?�Q�e��`�}��؞JN�夌��e�/��L��,suG����0������jf0�6���i�J01�ݻ�����%�ȓQCs�f2#��_J3E��H3],�ʁ���
+��+�a)����c���P
+S7F�z,JB�n> ��n�o�v?C[h8�b��Z���ú|*wEџ��0����Li�W����k��������ZDp�/�s[����R�_����,މЍ4�\����]_�^p���c�ʚzTMM
+�f)`���҃mh�p�7���g ��@xi����e�͕�,��W���x��́�R�X�����ˊ>���7&���W��_V2_†A���(�����;endstream
 endobj
-42 0 obj <<
-/Type /Page
-/Contents 43 0 R
-/Resources 41 0 R
-/MediaBox [0 0 612 792]
-/Parent 25 0 R
->> endobj
-41 0 obj <<
-/Font << /F27 31 0 R /F8 15 0 R /F26 12 0 R /F14 37 0 R >>
-/ProcSet [ /PDF /Text ]
->> endobj
-46 0 obj <<
-/Length 1690      
-/Filter /FlateDecode
->>
+45 0 obj
+4200
+endobj
+49 0 obj
+<</Length 50 0 R/Filter /FlateDecode>>
 stream
-x�XKs���z�:��M�Ӧm�V&��X�$�)R)���Q�����̟<{��*��W�8M�/�ϊ0I�t2_���6M��n�,K�`;�����
-צ3|����M���<�&�8�,�I���olכ��v���}ʲi}��E>{]�
-Pa��2K�(��gi���7=�@��it|�q��E������^҇(V@�Ꙉ$��)qNg*K�����f�"D:ӨD羝#��n`qK��
-ƲK2V7$8	�(MO�2���΀�D����"L�q�~z����]w̲�"H�T���
-,�^"��{&�����9v'����T.���ôȢ�%',����dQ	���T
-���+�������>���ZtB����"�-c��W�f6M����~�^`n^�n�Х
-���ȟ��cL�F��tט��m8������	�B�
-D��q!b�6/��t
-���G�{��"�fIB��k�
-n�%zh<�o'j(�����gg�����*��F�vv����O�i����m��)�Q��-��񫶮�=�l�{m{۬9���dن��0������0<�Ni���i�AǗ;�+W��+뺞��+����kyn>򥟳�(�Ǿ��xt�­Y^�_��E�*,ǎ��<�V�&Pd�-7q����c"}�ˋ����yG��*%p�ba��.��!&Q���EX�	���qp�m4
-0l���i����!b�A�a<���A��d�`-g�@=���8����iZ��8."wZ����
-8�º��<څv�{^iw���=献�����|�G�p���@�S9cψ1���z��T��.�j�B���3������>��wq<��Ζ3ءb�ښQž��G��N�-��8���֢c�=��#V���+�^8�0-I�����<X;�I8�-�v���GϿ����p-V��<�]"%-ĵ�mw�-['����Xޥ��:���x�Y��)�G�>��>����ڥ���MM�x����#�p����TU�^�g�̡E��^���?��q��I,������{9���8j�A+n�'=���fBo1I�O��C(ʼn<v�.��*T���&Ǎ��Jh�i�e��?>y5�C�endstream
+x��o\�~
+��d�)���������"K��ː�gWk;i~�r8��Ċ��/���]����������W�+�^?;i�P����<��x�6>�`�������%���G+�����:�,>�3�����y(;O�S������ԙP�Ͼ�����rQ
+����M%��<��W���?�e����2�T"(��=���
+��[߯ij��~$�������
+g&�����	�58v'j�{V����2��^�x LcT4�V
+���(Ǜ-g�������<�+�!
+&��"��dW��r�&� *��u�~tUf�3�j�-�W��i�gΜ���ť3�(�\_�ӜA��*%�O,�5�`r*qڻ4Q�
+���[��pL�K,�w���2�E�CX�L+��.E�N��Ԡ,���B�h3�~D�š'���j2:�2C��/Qf�hy��pV����8������� v�v�L�A��b�������.�"�lgG��*�lX���Ip���-�H��C�d��U�u���ZXSXߔ��6�������ak6b>�����q	�R
+���� oq��]��s���uC,���C+U�un��0�o��ğ�G�pDVLW=}�����:�mb �Y�'8E�:d�Ĉ'�J�Pg���5�o*Ϭ�����*���Hɀ8�֚7�PL����������O
+�1��[4���8�W_Dk&��&���0��yyL��<���e��If��J�o��f��q���Dnd�Bi����R�����5�S�[z��>%HW*OX>��<��8��lF�� ���ԞΪ�j��i���5Y}��x6�����*�ڲ�-�ZZ>�������@�4</.�r��y��}1�����8v�wH�T����y/�"9�;Δ.��$���*R�U��}���D�Y�z�*����&c�į�d�g3<p�~6��^�զ+�x���+�4�y������iM'���+B���8��\�
+|���R�Wu֚?Q竢c4�"��q��Y����:�$ppx�K�z'��6l�u�\z3��+N�v�(NW��S*l�1a��pZq�D�H��V�����j�&d'η%��5�o�GBj���j�\f���}^������{�^\q����Ms�إf|���pQ����^��w�9����	��	���bG(���V�����@�R��+6S�H]S8v����pCz���U5Bi;�7�����|$w ��D��P�V��O
+ӊ�:҅����M�6��A/_�8�������Г1؝�1|��+r�:
+�9��0r´��;���g)�D
+��y���NJ�9��F,�ԒG.�)�:�N��ݴ'c��������;�O6Y�4
+L��� �Y|:���S3�����~���"�X���˹����Կ���rŰ��P;)l��7��_�lWbӠ�%�O��^��NZ���w�k�}
+��Ph��}�=�L�j;��l'����XW��	�b�Ñw_���Û��r��(R��E��=��nݻ����H_q������ �+ʶ`a g
+|)7�-�m�ca�t�-��-]D�9��krR恟���c���4�]�y��n�u�Oh�+��H��S���8������?[wP�#�$~.3|7wA�p��R�WD
+V��pXr��+�����E���������2
+49xD�%���͂����!endstream
 endobj
-45 0 obj <<
-/Type /Page
-/Contents 46 0 R
-/Resources 44 0 R
-/MediaBox [0 0 612 792]
-/Parent 25 0 R
->> endobj
-44 0 obj <<
-/Font << /F27 31 0 R /F8 15 0 R /F26 12 0 R /F14 37 0 R >>
-/ProcSet [ /PDF /Text ]
->> endobj
-49 0 obj <<
-/Length 2362      
-/Filter /FlateDecode
->>
+50 0 obj
+3580
+endobj
+54 0 obj
+<</Length 55 0 R/Filter /FlateDecode>>
 stream
-xڭY�������G���c���f:I&C��ʼnD�d_&�{���ݹ����X,v��>��q,����?��,�:|���5�6�ѐgUuR��U
-g8��L���[hTLSO��]kg��"����Ƚ$��T�����ch8"����Z����Od���R�@�3R+�覬<h+N&���3^f8��������6�x��r�J�N���������
-ժ�#��m�W���01FK�~E^�n�rM����ru�P81���G������aOk�ΐ ����h՞]&�"�yN��7M<ۊ��-���g�`�b"�����4I�����Z��X�^A)��V4���
-�l�줔��N7�j���j �^"�W	TL��m@�L�si4Èu������U�{-����!��X?F%4�0��M	 �>�ͮnop�:9�����8��-B?���q:���l�?��N�z�Ǎ�����F����Aӆ��|zs~u��A��f5��Ԍ9����>M�@uc(f̿[B��B�,N�&|M�<k@��F�,��l{h��~�����׹&����	>���P���\�ۖr,�D��Y5']���6lg��f����F���T�����Pz}��C�¯)�H�D�����6����`1�s+��2�1h}����mߩ�02-���n�S����n��6����"�ߍ���#F�Z�}?��ǴEm��Kl�e��}�����}L�����WD��Ixh@��dstream
+x���U��~�_zo�=��HBK	�VU[U�������3���즭T!��f<�����7�s�'�����K?�'�s����LVZ�:���7�A�/�����~�P4�^o��b�R�v�
+�և�}3x?Mj��~�����A+�~
+����Ԡ��tǻ���0��0�����U��q���Ld�B�#�����F=�Ҩѐ����
+=�t'k�S��dw�<��]<�	2=���/�ɨ<��I��#������B��ߏ���8���yR���8�վ�q!�����#*:T�+=���H������I���hH)��N*-$�_4pR-^R�5PN�(����G� ��/u�Ԍ��`���]�����O#�Z_d��Wg�f4��R��&<�t��~��Ly�����</1+�Q�S�I
+����%@D	�������ɯ����q�ǡ�ε�i�}Uj������?~�����R8����n�lƝ�QjK�?؇R��۫��#�lE�C���۹:���S�K���+:U�|���|%˃�$��O���7B	����r���#պ�޷���5u�5���BQ��������ǥ�[��
+k��&�_r�r�j(B��4#�N��1+̈́pz�o�X�\��ýf(�Wq��
+�Fd�pP�c�+�_y�7�Q;������/����?
+Ґ����o�+x�d.�'��rے$`C����ⶳ�ҳW�s��3��x`o[��׬��>a�5{f!y8)���0rO�.�Ŗxl����TdH����O�p� @f��hk��X�x����M_�[�'���|�+	�xFeBP'\�㖤�0�hl�	!4�_�|^�d���ߕڇl����q�����x��x�Cf_��N�ה�a4p圙��8�*Lsov�Iŵ-�����M��+�"�;?(�o#T.��(o)FY++6�Ԓuw�l��A'{y9T�2S�`}aC��S�!�A�m Jm�]�k��̮
+�����q����y�1�+(�� ��=(~Wb
+�>�׸L~@�C��E�������\�%쓣����3��������C���C?U�<��~y7>���e<�.��;�'�O
+���	_�Rv�+���M������R�@]��3l��k��L*��/ǐ�)�t�-f����J��y\��iY��1k;��aJR�L�]�UM��z�P�
+ѳ�V���V֙�0�!�4^2�<�wm�%CH��4��[ж�!��`��VJ:|���7����������������Ws�H� 5��ԃ��G���9?O��ĭ����qT�mG �r)��2��,�A�6��f�x�߱��%���n�&�铢V_3��E;��+V_=Hn���A�t���n��_�������kߟ�M���=�?u�U�2^ d�[�����ڒZ,h�)���"�L��d2�F�� Q�b9T�.�H�<g�#h�1��~#�Q�h|���¸�B�uu+cvZ�vaU��vs	�}�{��`ʓhǺ�x^��f�9��J�ܵʾMp���������	F�~��(tUα���l�`�`��X/��ՙ�-��B�T9��r����⤲���K��0�;5�9��ü�*����l\z"uY�5�<�N�iF������lH��+
+,�G<iUQwǧM`.�d����O�d��س�I; �“���{���+��K>��da��N������N��S�b���(��}y����o�� �GT��ềJ!���Re�����bۡ��!K_H��|P5������$��;�Ͽ�(o�>{����ˠ�甁��|C:��GS��Nc5�6���M�e����:)u�W��%W@"�.qV���75�endstream
 endobj
-48 0 obj <<
-/Type /Page
-/Contents 49 0 R
-/Resources 47 0 R
-/MediaBox [0 0 612 792]
-/Parent 50 0 R
->> endobj
-47 0 obj <<
-/Font << /F8 15 0 R /F27 31 0 R >>
-/ProcSet [ /PDF /Text ]
->> endobj
-53 0 obj <<
-/Length 1734      
-/Filter /FlateDecode
->>
+55 0 obj
+4873
+endobj
+59 0 obj
+<</Length 60 0 R/Filter /FlateDecode>>
 stream
-x�XKs���7j��_��m���I[S�
-�R�2�dz������Wg<�dA��0!�$N����HL�^W����|�����‰��E��y]��	V��j��/;�'������6�/��^���"��H+���͔'�����pd���Y�D�y5r�H5S�?��LƝUuM��Vح. U0��F]hU��V�6������:�±�31 ���O�?~�������� C5����EO������@��-.l�#H-�Ugn�q��6�:�bԎ	��1��4��e�/-o����$�f̠z�]�i�
-݃5fEۊV��Qlq���m��[�0	��Т���>^P��ȴ�d�Tz�]�i����d�
-���s�ӝZZ*E����X��#g�*�{��b���m;\�Er��mM3��81 v
-V��t�r
-�@Wn7�����f̑�"�{]�����<�	
-�3<M������#cU����#Kw
-ŷ�����r���X�U?��'i�4f���z5��c��1�@m� %j:�Ⱥ<�d��ز1ϼ�aG��XOG�����S�W�H��9���[�#7O!ZuA+��U����R��pq�P��]��ӹ3
-=i�j���MN4yw�s[��4��)�m�*�hf�G��h
-���o��oh,n5T�H�w����Kw��N0����
-h!���ܴ N������Yt���z��c[?m��zYu=ECA����[�U\@�AH���=ӷ��ˁ.r��É�H�� d�,�I8urpwr���QΆ��Q�ıi��Y �ۦ�0��]��2���g'|MBΰ B���x���~~q� �a��3�pؤ-�{�`_ߑ>�e�
-�'-��&vÄ�ר�kh%�x[�������L��L�q��sU���۽����$d�MZp�i'��&�ﻫs�]��08��V�/VR����{_���{��R��ӽ{j����^}�t\%���hO�+cD\���e����� �_U��zN�=��͞7�1�����ao�/?��c�uJ�C��D=~pB��ȘlX� ��s��?����¥�����Q���\������-_���:+b�j��+��v*
+Q�5�ojX>��g�p�K b!��(ѧ��`�I�D��Ϫm��p�1����aR���8ȫ��<(_�1����*�
+󌳉͹48Wsy�D-BR<u�������)vʦ�/ò����#z��+�2��"� LrL�����|qNA<�'�c�׌��6r�����`������_s����C�m:�
+�����X6�2��[�	�g,�����/�7�"�������ҧ���Ra;Ɋ��3Ӕ�O��}#���,�o�}9�����˼E^�I�P*�0E��hmc�ψڨ�dIί�.�G1��߅��/�z��m{���KW���q[ָU
+���u��u��#�u�#Ꜵ�+/ @�A󟗵�!*�4 �(CB��>\�%
+���W�6��*���X���t^8H�f+�B!�ڪ0%�BL�^k��W�kk�>*��D+5o�����'+�U���4}��Hf[�7���2�iޭ{���?A%j�������i2�vt946��fF���t2X�@5�@���K��S��i�]O�	�%r�=�Hi���\�-B���~��ʽ�Xs̫��W>DC�X��&�Y0��c�{}2)E��`���X)��VЊ�z2�����ܢ�]&�+�"0�.)�5�S&�<��:��5��Q��
+��*�v���\9�
+k�xD+,vT�m]���JRD��T]��w��]A��a���}��Ī�H��,����Gs�Z�y�Z�b�AB��@
+�v�2��M����77f�E�R�;ڶ
+��N
+G�eF���t��`���9.��&��1h�6�(������a�o>g��H��
+�x�I�.i���<�^�&}>U[bk4c���d���aǵ1�����������ܵZ@�d�d����x��2-��i9��є�ڜeR��%$-K7�i�K�W���
+��ԼCڀe�����c+�`�ס���W�""����;��t Q|C��>�T��
+WC�ū�wP�ޤ�6n��W�vf�?X���Q�#��9�1}�e���J��������Qt���T�Nx��|��}\���[��I���龤���n��/�,��3��)N=^�:3�Iɳ�����wG�A��׻�����7������/v
+���PF&��s�ۼԹ.j4�s3O�wx��������{7��}���_飺�[�w�T��vss(�[�`bǧC��Z���=�L4׀X����s�����a�6�7 endobj
-52 0 obj <<
-/Type /Page
-/Contents 53 0 R
-/Resources 51 0 R
-/MediaBox [0 0 612 792]
-/Parent 50 0 R
->> endobj
-51 0 obj <<
-/Font << /F27 31 0 R /F8 15 0 R /F26 12 0 R /F14 37 0 R >>
-/ProcSet [ /PDF /Text ]
->> endobj
-56 0 obj <<
-/Length 2235      
-/Filter /FlateDecode
->>
+60 0 obj
+3536
+endobj
+64 0 obj
+<</Length 65 0 R/Filter /FlateDecode>>
 stream
-xڕY[s۸~ϯ��\�-V�	��� J!���!�9J�-X	���S�%������s��8�����-�no�+PDa��y	���z.��-4��k>FB$�
-����e# ��*/xw�(%Q�XJ@�O-Ju�!������N��Iɓ���0��$��G���kuf��tI(@���~/�W�t+x�����A��gh:͝t����bEv���4Z����_�*v�,��=�`�>�ův�?��8���z�=��K�����o���P����N�s}�� �7�_�CP�=�C�|�^���:_�����u�>��z����4�	�W����O5hm�X=Y�zu���5������W��SJ�V����r��g�+�v>�I�?���V���0je��c٨�1�&��`��x���n�vĪD����� ��$a��i�c�΅��&�ٿ�L~&��J�������՛5�?��|̍F�n•��B��T��>��țK_�ҳRJ��\�����c����9��-L��B��+�Z^䍆ݗ�v��)�?��+��*5�D��yn��t�2HY؟� � �@`A�z���+lc�P��>��ųUa�y��=�sY�lqN:���
+�F������LBdL`ѕURBj5��Q�����	��&QIJtz���N���
+4�^�6+��_CE���v���Րl@5��S"@}W&�	'Zv��RVF,K{Ѵ�>K�r�t��P��_ݝ�T�J��)�d�ӣ�@2���h����@�x �R��Pl]���}V�JO��_���z��kZ&؊�X������]j������J��+<��,����"�}�%W?�K��Uz���Y�R�������5Q�37�{�
+M�+Ka�Ɛ���o�QU�D�`�0��&0Rh��Ç)f�+�T�V�j��;f�f>��̡q	�y�p�Wi(B]�[00�!��3��\�Z&h~�R2��Hh�7Hq"��n��+X�̵%K����R�{��j��d�d-��t�o�/e�	���n�}ֶ\���e������죆���,(�S�}��FK�2:뙪��Htp�iL/(���h.{}X%����i\��q2��������&��&)���&��^P��3�J%��k��cG����
+��x���A� ���2چ��l�s0��f�ui0���yI�j�Z���h��
+��w�4*lu9�\R:�$wH.��X�#)�ǥ�$��9yY*T�af�z����.ٟ�I��F`!߰��i��s�Ɋ,�K2���4'��g1]�j��#�`׽�$W�Ϭ�,9xL��|��f=f�����6�N0!D�ۋ��4�����wp� �u<H�I�eTjp�y@b5�h<�!2�b <���	Yb!8;�6��)A�k/
+ �&��)<����/�JBK��[�S��G+�k9�Gp����.�[@��z��5��@G����{���z��h$b[�Poz�����3s�`T�~���=�&aI����j���<�Ȓڣ-�Xr�o2�zɉ�P�����s.ZIJ*!�<��$��X�Q����)q>�]�<,�Q-E�F�q���S��2�$���F�~Š�5�JȎ�!s��Cl��ط���
+el4r0�0T��.4�Gh�g�h�B�0�(,�����9�hDk��,К����w`�,S���ιX�Rr
+��(����}������G�@uɕ���
+gd)Ve`�4��-�6O���1y��
+/��[��P���U��)/��Y	"����VT\hhð��[�sZP.������"�������+���5Tb}�����0G����Ţ����"Z(������r���
+4��/r�?p!��
+\D냏g�w��zg�:�5�db���b��K��L!��9U^$��A�ų��z�����@����R�dϜ��&��������ξbE��!�F�
+S��3Db�d���F���|�W�%E�2ڣ�$R�>��u��|�R]�gn�TOH�FĢz�����k�k'�Ir�x��!œ�I�dIWNU�1�8���g�!�plQL*7)o�=K�d����������,������tBԖhI1DºJ�c<�Q���x���D�����dSe�;Wr�1�4������L�%#��~磊��K����9���7��\ԫ>w ����zYJ�+�}ְQG���8�R.8�iz綧FxJ2�c����]n6o�1��]N���.�l��7�*2$T,Qa�p��-����Y�#��ߤ^~�m/nqW��u~S
+p�����:kI��H��{"����B�.!y�����������/������H�_��S�+��|�Ν��}�>��5��U����`!��<$4-+Ѓ�_����ndstream
 endobj
-55 0 obj <<
-/Type /Page
-/Contents 56 0 R
-/Resources 54 0 R
-/MediaBox [0 0 612 792]
-/Parent 50 0 R
->> endobj
-54 0 obj <<
-/Font << /F14 37 0 R /F8 15 0 R /F27 31 0 R >>
-/ProcSet [ /PDF /Text ]
->> endobj
-59 0 obj <<
-/Length 1790      
-/Filter /FlateDecode
->>
+65 0 obj
+4702
+endobj
+69 0 obj
+<</Length 70 0 R/Filter /FlateDecode>>
 stream
-xڽX���Aޤ,Kw���&��:M'#�3�$��Ƣ��{��^�ODt�8I(ƒ��|'���"G��߭��G����7���O�<����*�EݨRi��-���8��ּ��.j壿H����k��4��������tKp���wVJ�}{��lU����r�V=�-��J��jUfj;dx�GN���>]N~�?]L.O��?��Tͺ�N�h��Z�gU����'�"��I)���u�*�tɄ�mV�g������o�xݰ.+{��AJq���-'�G6h�_������V-#�H�8�2����endstream
+x��o]�~�I��_���Z7��4(�"�-/�eɖ�$������~����o�ن3������Ë�غ��է��D��{o>9��VZ�9x�#ra4�~�^<�a��<wn���޽��og^�]7��l�?��k���/a6�f_��,|�u}���O[�z���֋i�����%�F�}O���Y->�}I��������{�q��B���
+�n�u�颧u������,�u��;@�������<i0:�⌴>�b򼵲��	v�Z�g	�����=�q>�
+�^�e����k
+[����Q��S�O%9��8��4f��S%gA���+���L���9���.̴�S�eI�m�up5~�9��H0��{x�m�Z�Ó�;�|1;mSJAc�����d~_yC5_��������������Mg ����M�w������Z��~1�MQ=���+����4Ί�
+�꫶~��n�$�Ѡ���/>~UM����2B�����:g����1�ޤk�[u���⠿O���Z?9�n�l��y5��F$N�ш��K�3H >�����?c	��j��a�<\gMI�<����f\��/{�����i�LJ�����0�(���\Z_�����oA
+�dty�w4�������W�?7�A~�m��tE��JZKJ	ЗJC�36�|ئ|�'
+D	o�tN�
+ ���ȏq�0�'������\аd�_+ϴ-�V��,�����%������W�^��W���N9��=r�LO!$'�`s��i�r]d8�C8Y�����%��+�b��Cv���g�Ћ���gBa�p��8�+
+�����	i�ɶh:�fY�E{:H�,d*�@2+�&� ���%p�KYyf+0N�@Y�0uח�^1o��0�zo�į2�R��}CcL�+���n���/lH�����ʂb.d�П���2:䞂����taX�𗖖����!�2����
+���a^r��ZRB1���33�l���Bj1	*�7R^��I*.y~-��"���V��H��X�ǮD�������Tm���Q�[j�+l��ق}�:="�~���~z
+���ǽ@��MQKs���)����V����-��JL�_`����%"(J6�EB F�+Ek��'���J���gh�q5�?,)�L�@��W������in�LkD�r`�R�;g^$i���Mm���� %+��yn�
+��p-V��ƻP}Z1����̝���A��̲9�*����g�'������}�d�t�N�4�/�`���;�$Mg3��<���+���c'��hԉ�����u8*�����$���+�m\S�S^B�Y0;{�>e̸�6u��I��+���|���.�̻0EhE�v*��w8�'d�\nq��I������F!����'�!������s[H�2
+yݶF��4���s�����[L�*+.��W��+?KL<�M�f�:��r����������o�h����x����b0��$b}�m'����y�1ڹ�9������t[�E�gH��,_�0��GF�H�]�MH�5s1���C"ma�pZڞ������.�;���%?�&?'!?Uz�.~L~�2^>�p���,(�r�ZrU1����`���Է���^���+Gp��+{=�b�"��l�ƿb���8�>�&�6����2��-����քx����vY��'q���endstream
 endobj
-58 0 obj <<
-/Type /Page
-/Contents 59 0 R
-/Resources 57 0 R
-/MediaBox [0 0 612 792]
-/Parent 50 0 R
->> endobj
-57 0 obj <<
-/Font << /F27 31 0 R /F8 15 0 R /F26 12 0 R /F28 62 0 R /F14 37 0 R >>
-/ProcSet [ /PDF /Text ]
->> endobj
-66 0 obj <<
-/Length 1066      
-/Filter /FlateDecode
->>
+70 0 obj
+4060
+endobj
+76 0 obj
+<</Length 77 0 R/Filter /FlateDecode>>
 stream
-xڍU[s�6~�x&V�����4q:n��;�����mM�q@�$���ZA��sXI��|���a�(����U��|7񞽀E	O�����ɸ���bR	��/vܻ�'���gv���"��*O��%I��U�7ݔ���LJ�f*�e*b�n@����"��lw��Ŧ�~>���0�o���cR>���U��Ls?7u�>җ��U�qjSHH.�΋6[��~^��N��l٤
-��P��Ÿ�pz��*�g!�QA��l_ �3!x�V����1`|�I��v��oO��]`4�u�VhW���5�"F�P�;��e�!���T�5徥����RLؠ���c�v����3��@Q:�G��hE��g}e�M��;�
-#q;��6���������KjQ���D 
-��R��<w��w�;-�mπ�����ƀ���N}�p��_cH}UO�qʤ�}\��4M��5�e���γ�Pglg�FI��ӛm%,��r}rK��'�x����������K�>�@�8��l�WUoә
-ʑ5��l��Ӌ�t�2$�;m���i�iԄ��������^c����Z�<.�����Η�o�;5�ͯ�{��h��p}������pd
-����&0D�h,qN���r���v����Zmk�-�H�H�dk�r�� 'P�mM��RskS�wgq��vx��2��L�8C��!�t�����S��,����\YO��59�);���
-i��v� 3�k(*�V�����/�ȇ*��2�w=��7��r݂����GKb)�oǜ���c2_M�7�tendstream
+x��[Yo7�����yy	r8�7��K@�}�%G"K�~�xU��=#{�+��m�|ĵ�=OlV�:h�&�����Մ���^KP�j���2�,�]R*4
+@��r�^;[^��4W:S�+��N�������Zm�Aa�IwI����!��G��L����^��i1XN�$�b�f`���w:������&�v��GsB�z�����^���ڮQQ�	����F��+w2�EP.k�Y���:���ゆ�0z}ݔn�ƽ���	b�L
+'k�=�<���Z�*��b�����4�����z�4�{*�^�!	�ҭ!l(\���:H;�\O��56hGlë3�F����ҹ���qS��3���Q��۽�X-k%s4��%�=T���`�R�����#�1>yz?������J����&�m'|�?8����N�xv������za��0fa����cv�d��I�����J��f x�1NJ��&�::y�7H����khEYv��:�U�E!��%�����oy�w���6����ҳ�fR.�zޚ��R��Xz}B5�|�9;� u2Ƽ����g-K�Gr^:�i�e��ʇ�+M�3�l�
+����xsab,K&Cw�B0�<z�b�%l$�8������'�C� *S�)�#SJ&�q���(j�y`��z+ez�K�Q�+(U�*^�Q?.�k�^"\�pB�5�uY�
+�%ZKe�O��[�7�#��bAJw��XDl%�������ëZ�����I��=҉f���z>4�?Y�.s��j�/z����R��-�ĭʭV�nw��˾�������TtH�ak�}/9�!Z�c�Ό>�ɬ���N�^Ƥr�ʖ��`V�c��X�ʐ�M���9s6L�ö�VYB�=��çE^�5����1��b���t�+A\-�7͜:�=���(��3�bl����$I-�=\}�V����|�a�:Ļ��˕��`�5��-Õ�����9�y���1��/qU��7W��Ռ,��X[�d=b�j�D��6 Qش���{[g��������\�'!��q�C���Ժ�Pk���$"����G+nT���%g���<��`�%���ܯ�_��fr��l�f�=��ql�������r���^��{�gʒ&�q���_2p��dU���:�8���~���|�>��zҦ:u�����]K����)+ Nt��b?"
+�Ã����J�HYD5Ԍ>ҟŭ�Ҋ�����Ͳy��������k��ya���E3���o_`w|�]ZL��3F�6����ú����L^)�h-@ �&��B�t��1_����	��(�������}��[�y���?���m����E���Nf�P�]����d�E*��R&wDZ��P3�F(l�S�����(dJ��`$�����FM#v<�On���t�
+��ԕ+gӞ_��r��&
+  endobj
-65 0 obj <<
-/Type /Page
-/Contents 66 0 R
-/Resources 64 0 R
-/MediaBox [0 0 612 792]
-/Parent 50 0 R
->> endobj
-63 0 obj <<
-/Type /XObject
-/Subtype /Image
-/Width 4194
-/Height 2458
-/BitsPerComponent 8
-/ColorSpace /DeviceRGB
-/Length 279588    
-/Filter /FlateDecode
->>
+77 0 obj
+4168
+endobj
+81 0 obj
+<</Length 82 0 R/Filter /FlateDecode>>
 stream
-x��VI�`�!vf'����G����pu�s9^f�+t���W��-o���-ȡ/���D�/�>�u���$�ڹ���V=a�M��-�׹�U�ДD�M����y�\S�$-��-9�
-/㒔�J"�5��j綦�-��t�-����	�[�7%�U�wV���/���D��jM��俦\KI-p���v��D�������bT���5EJ-7z��bM��r-%-)�\��7�ԣ�R��•Y��[�5Ś�|-}ȩ*fG��DǽP��(�pTw|*��XS�%o�9�>��T�t-��F���Ǚ �]�"/֔BjeM��~-hM��M���-گh�����H�vmkb�-�
-������MMM��//?)����������5�q�V�������j?h�-IF���MMM-,,�i������Y	 Y5&����[���-uYU5��+�+֦@����{R6:mw��1�w���őw��1���A�6��qf������@f���
+Xv/�ye��w���E���~�pֆdghƥ��H��	��+oG��'���X���.�}�����9��(*����7N9���:C1�Wg�T���Q�:ˮ˨nt���=�#�|�W:��{Uu<���7�a璊�B
+���O�}�uHt9P��
+��ƽf`L-�]K��͵�ͨ$�V��u(�3�s6-�̝�+���JUh�[��eT{&�	��g�����>���;R,���ptU�p1H����M��,�����5����J�)g١Q������Б�w\Y8��Q#Nɽ'��<���D��[�ڨ���ž����
+�+��f������sa��qi���8&}���@z)�z�y^�֏���(��T��+�A��u[+g��qڶ0�|[Ћ|�ۙ����+��iȇ�ݺ-��%Z�*D������\:�F
+l�Uu�N	��+��Z��<o���\�o��M�7��"�cd0��Gֵ`_�쪢���Wn�-F�豵cY
+R+�����1x�t��+eϽ�q�._���K�2^��=�yuånZ�������+���mT���u)ݛ)u˷W�!��벁�Y'ܒ\k|�^��O�f�ܬ�^���$k�����������@Kٷ��[� }�r]�g
+A����
+œ��9$�E�p(=��\Ŋ
+�(L�����f6U
+�f�/����3mU-]QL����U�4�2o;��	���ݴ��:��*��ڒ�BpKS�R�\�rZS�sS�9�����m��WP�^[��:*��*�W+�&C��w�n���o��j"TBYS&�V(�n#Ƃl�%+��*�H�R_7O0�P������7r��c���U
+�0x&�PʮF9u���S;�EO2T6E�I��1���H[�v�;
+� ��x�Ko��_3ьr��̬���h&��/��m�&&�<�쇃;���O��q%�9�޸M��:�5��OuQendstream
+endobj
+82 0 obj
+2238
+endobj
+86 0 obj
+<</Length 87 0 R/Filter /FlateDecode>>
+stream
+x��r7��bnݍ-�HVle�l&9�rHd[qE��_�np�9L̈��zz����?/o���z��7�����������o�~y�<|�+�Ɋ{��o����ݛ��z�?��N������`[&��D�bɩ��#�T�����"HN��w`���0Rf���vPV�E�~D�8�|�W~����AC�������"�e�1�h��+�P�6���L%v0�����d���3�43=W�@:J7�㜊����a[�e��y
+r'J�rq���I�\��h#��S6�1@����o7�o$IN��o$w*�[ޓzv&2��ks�����Ҍ��-�hQ��;�`vendstream
+endobj
+87 0 obj
+1745
+endobj
+91 0 obj
+<</Length 92 0 R/Filter /FlateDecode>>
+stream
+x��I��Ι��7��h��E�"+v�v����m9I.��ʯ��,�P��XU&_��a/�����|�{����$���PvEtڙ�W�+���=���G)�1ѫë�!*e��0�s�t�	
+t�
+�~{�3�`Ih%��V���oXF	,��-V4c�|Ґ~��z����Z�F�u5�������pQ�-�/��^����y�Hkoz�=j+�ۺ��v��ݓ���{r&
+�����2�X=~�{������dz��y��k�a!'��^���`�?���v� �M��ݿ�e�0qb(ϐ<+C��quqAh“ӸS����D#3��f���K�2���)���LMJ��y
+$�'���db�乌( �����V�7ת������J�:��mg4�dW�Xh��s��^K� L�ə!����ìې3�?:BC�t�M�,࣌|���x�M�}�����Q�� 0`o�"�9H��tr�e������2�E
+�]qa/�̝e�	������Za��Q`�\ �����2A󬛐��˷V�U����tr���
+�s�TV���m�k ���H1����Gi	=a�3�����Yr�$:���"��:"JB�h)��'�ϝ�H-��7��l��j�c��G,� �����V��9A���%�L�
+��k�X�" �V�دҠ�i\�0y”��,�{�h�)M^r$RQ���`=�:j/j�:���«�6�(��Y� ! ��e��L�2�f Vq,�a`,d--V��\�
+h仈s���-�V�+L�H�$�7������C������(;+~���!�߂�^��O��%���R��0�5���+��� Tt3���'mad���nWO�DS*5Q��^&�~���R��Ԑ�֐*�A��p��L�����Xzo#�w�l�����8���l��&�
+�m�a����i�E�
+�@�MQ�GTU)����+�#4�#�N)�n��Ҷ*	+Q��Q�Q�I5�#�uv �0wBxV��T	bS���׸`j8�0.�6y��)r�@����O3�J1P��&�	�6�@��RFQt�jB�dO���t���d<���-�։���S���NY�:��2,����L&����.l�Z+!���2J ��:�[���A����U�-���7�j�6�Z�Ѳ�WpLj
+Y}�͎���q����Tz�!y���c��d-̳n����&WU��ll�.��p���8u�n�>�6��om�_.ދ���+���tK����(�:����\%��nr���J���:�
+��9�9�Z��BM�Z�CȒ�I~�k�j���3���1�=��G����6A�˶���͡v������/����vP{�[@�g���28��kFB戇���ަ�P���I�>5����!���""'�}��g
+U}�eT�;p�nc�[ �4 e)��o�Z,!\2Z�JZ�坴Sc��>#ө^�:��{%����E[�{#T�-����G{{{�(VO0�蚔1%�������E�W�L
-̹#�$-)�ˇk�:%Q�^�&>ꊚyN�;QJ"��
-�9tD�k��I-T�����-)9�����;_�zf;6ʾ�HIt�9,�6-2�-�������ȅKId�	ORV��Ύ�|���D��-'o̜�N��k-�U/�h�
-�����pb���XZ)~�-̗����-Q��č�۬D�GG_%�F��l���~)	 +R-���R7�OOo�����������^��u�h�$��HI-$%ѥ��������D�����r���>���~�7�BJz��������n��/+��x���w�FɈ���>mnn���j+-..JI-�I2b||�5)~���_J-�U+�!��udB}N�>�>���$-'#fggGFF~������-,,tY���'%qG)���h��72���?�W�
-dq�-���v��h����UvSN�Z��	#�F&�?Zʲ���W��%�-yӴ��0�F$������>*�����1���---O����I�w�da�􋊖�HV�J��k�X�+*HC�H-Gب\��(%Q�N�z��\�YQ�P�ZR
-^�.������-)%Q˂O���I��A
-S�-�����{JBD-/%��O����U�OI�����k�����cJBD-��r�DJ���W]��:j�o�%fE��?�y
--��ŋgff�������$%����h���>�Zy�$0�KI�-V��4�����--���LI�j�$���f7\�����^�y��1;;ۤ�ċɈ�Ν���XZZ��@v,�-v��_���w{HI\�zUJ-ſ.,,��%--&�Iܽ{�����$^��(�<y���_����׮]��-�.^�X��-%���,%-ŗ���\k)	-�#
-'O�,����k�۷o�YY��-5Ĝ
-2}���-&HItiaa��d����&''���ך����qbb��)�z#����=�m����^Q{R�)	)	-V��g��� �I�*-�w�2T3����UzwH߁}-�--�/^�8==]|�$*]��y����i�I4`V���֘�c�-@�ݳ�(�NI�l�8呒h���|F
-��pW-���#�R�#%ц�=�hmJ§`-�����R5iZ��E�JJ-�--g-�"�}�q�-p��ǿE��b��lJ"��0�����:��-�J�����cc����F㇫\����-�tttbb��"�!z��V.�{zz�-q	-�1��Z�:;;���)� %�E�S92=��7C/Ÿ2(-�@�-�G�$"�W_�|���8<<\]]����ΟX������y�p�d�8C�khh�e�77�i�f��"��S{8�9m)��==���R-G@,�S�[Ѱ���+�̬��������۷o��ED�2R��}4w�{�;��--C��oo���x���F���o��M��7-Y	�p��L������1�L��)�|lQ*���m�����"-skpp��R�]�mD�Pxƶ-����EJ-|�h�����#^�zU*��	�tF�$-��~---����������$�IS��SSѨ{dd�Z���b������gT���+�J����ONN�q_���-*�NS4~���>|����E�X�-����}�S���]�mD�Ry̶w�z�$��n-5�����..�dq~�)���R�F�U�O�A�O�⮷o����m���-Rе�#@�C��������ٍ�
-)��nq���ghh�ktt��-���,�����J����qyyyrrr7(q||�9����/�J��-�{xx����ڜ>��Ԣ3����F�����̻�۬D�џ-..Z��fff޽{������tt������277�֏��U*I��P��%���1ݚ�����!�$�곮\.�}�-%������^#ݫ�F)��>�|ss�J\]]������?::Z]]msB077�������������>Em�阱�1)	����n��R.gLM===�������y��D�
-��xd'��#%�9�J%��D�-�-C�hv���.%��	��i�]JBJ�''777_�|��yvv�->~�<���VWW������������F�!%!�@�#�'uJ��s{OO���_4�Mq
-sqq���cN�	SSS}}}�$�i��xj���������1�u�gggR������Y�⩝�&-*�^�Z8)�_����/�Y�333���������sttK2":�T���dH��)�������z�`�@��Hr�u�P(����:G���MNN�j���
-
-
-��!����?�888���������H�L�*�J����mkk����IID�66����-*sէpb��-G�>�N�2���nAb��-G�V�t��E��-G?)~�("-�>��GUP٭G����U��-����F��/%188�zJ�է����m����_(�-ǽ/�-���+�-��,���-�2��-R��'#�.]��66vtt����H@JR�-�2�˨-+**���r����I�$Ɲ��-�D-�����1����-`��%D$Hnx(N���-������]��ݝ\J"q�I-�����%-
-
-֬Y�~���������-ɥ$��$-+++����ՓKI�]�VJ �H��8��^N(-E�����:D�-%#���'EYYYuu�|�$-')	����!i�dzSe�����Qj��V�5ֹa�J�!S;I�l!��ȭ1�-
-��-q�)���!)	�����A��� �����;�L�Jd�@J"%
-l_�zg~o��dq:
-�Zy���-_0��W�)����������Y���w~#c�e-���$�9����]��&�Je-����D����D,����Dp��JX����+W:��N�,x������x\��������D[�і(]^�^`i��܂�(XVT���h�ū�J�W���*+[]�l�u՚�������-kk�������i}C�M�[ַn����پ���������}SOg_oW���=[�4��o��-��nܱ}ۮC�w�}��ٹo�����>w���c/:~���t������}�z����~���}R�j��)%��{
-)�䪑��D�!��]!}[����� %!%�"��i�$2Yp�-V�,,^��duQi���Ϟz�Eyi嚓y����5��8�����w��z;�wo��u���<4�exx��탣y�ݻ��ع��]�`y��;z��^{e|^������iG$��H*!%����Rq��}a��@J"���J�����5j�-�-Gd#��dD����#δئ$2���9�W�R9�~�t���=��Sr`��e�����U#}��2+��$�p� %-̛�p`Y��M{�J",��JDu�Ok#����m��t�����.%��6K�$tA(����I��s�I�f����B���Dc%�Ok�$2Yp��˨:-�V@���@>Y"��}`�����[p���ć��p��X�n����D@444<�=�_=-㮿���I
-
-II-�;/�$o�妢夶-NyKkx�����UE%�KKV����*���������Z{*2�P�~]݆���G:;6vu�vw��������g�ޭ[NE�>��m玓��=c#�����h����p�3�����t���32����L����#�$-C ����g���	�H�	�E�@�A� @�X,����N��O/�m�<��BQr/�%Q��f��Ջmu˒,��ξ�%)����y�B^�{���{���hI�͔׷aC�Ն0�6ďMnC����	--�rį�#T1#�0��[,��,	-��r��-����k���PІ�ʳi9+���r�--{IԷucC`C`CD)D<_�\	�$>�#�$-
-
-Ξ=���G�>|x߾}���;w�gϡC�\����}���������I����$��-����f�N���g���G'GܕT?��$�>-��DKba~vn�	�	ʼƙ���]�̻���+�wff��}�oMߚ�������������ped||xl|ht̕#���C�9�c�op�w`���fW�����v��u�o�����������������������WuKgusgUӵ������}{Y]�����Z���r�������ɕ�Ƃ����\t�(���o�=g�=[Zs�s����yE�+U�������삊��Y��^,?q��G���u|z���3���}|�Q~ɇy%�`->�[t���˕}9�{�3�
-�g^N;y)���_���v~z����|���?<�x��������m����Ҿ��2��=9/����YϦd>������ޘ�Yɒ�/-’-n(`ꎪ�p
- |'�e-+�@N��	���--���P3b�%�8777c)(7�
-�!��
-�j
-S��i�-�1
-��	fCH���-�-�R�$>�`I��-�-a� V��Œ���-�d�-B͈���˼��t�!�/�"LjC���wedrzmu9�%QQ���DL��\C�hC-n�6�T�'���$bIp'���
--��t1(7F'�$�$-X�%M鏺Pe-X�%����P4(۩h-Kb�g`��65L	K��$-e\M-Oxh-hV�S�KB�����%;��!�#T��;V�K�X-u�$-ǯ�	�%1<:n8�D�Ն��!~irb��k�KKKb}5ԌxbI�����-	��gw�M�
-!�cE�t�I��nvB_S���R�k�i�
-��=a-�"�)�4�Õ@9�L��ߒ�ˆؒ�t���H�kQ��]i1��o�^�]-<��X-����,�ç�f�!�"�u{��m�w��!D��ݲ%i9��}%)9�96D`v��oh�%�!,	U�f�����Ȗ�u\F.-��^7��-F�-KB�,	�.��$�$�a�z���(,�W�V�
-��
-��
-�M35�F���`?•��l�?�hK- *J8����_ONQ"���֚��������~�h(-�=��:��s
-�$-�t�-M4~�R6�T*Z�$LP��-ll�0Ss�	�ވ�	O%05���)Z���`,��O��->�Tܬ��q���⇧Yg~�%�����ظ/�%�|z� 5L�-nSr{�W��PE"ȏ�BlS��~D�3ͳ��25̭e̞�[-�u�K-����Hl���fDD?b���DgCfS��%��%-q?½�D� Jl�—p~����'��SƔ*Tv�0�-�|B�����8[��6(>?�6����A����(l��\V-kt�!��
-�����a�Y����ʝ�tS		E"���lQ$*T�av�m��n�U$\zK--(�W"�0+܏����X��{�Y��-6�)�Ē��%-+�X���.���xrx��������&3�����	;')܏81h�n���%m�.	X-	a�I��G���4�*Mh�Vc�GE�f��~����*g�m!l9�DS*a�x�F2&N���bN�-����-�&��˘�ѕJȊ�W�D���	�!l��+��b�ĩ�f��E�.l9WR$�Ԓx
-K-��P(�JIϺ���߾}��X>"w �(����-��q�U�&c�G0E�i�%��k�	�A��"�qT4&�z%�v�W��^��W�X-I ��4��!�<�����?}i��������E=�j��Ο^ ~W$N�X�dc�G�����qB�!���$��i���<�V*�ι,Z0�f"+�%��1>�|�-K-:iB�H�����%-[Ϟ���,-+̏�bo��*A�%h�4]�4a'J��J�rD����K��"G����̏���Dn���DV�X*A�{%��ˏ`�V�!M�ZQ�!�6�)�ǒx���%��-~h�����7 -\��~�]*!��!Gt"�v	�`�`(.�'�oC\�!�E��K-Y�������H6�"�D	�]W*QH��zE�8�J%
-(D��>�H�KE����.:�܏�T�p�4�"�ǘ`fo�P�3����-Z�K���!L	3\��30�EC��J(��S*A2M���4�����tNm���Xl����	nj`ꄦTBP$����"Gp?�&�z%����t�Kd%?6�l�VC��Ԓx��-�-M��"�D	���*��R�I�Vk��I+-�R	�"A?f�$r��^���<v��'r���H�{%Fl'�j̘�+gX��l���!ΖfC��%-�����L&#���X���$D	-�R���7`I�9bvv6O�-� G-&4��"��Ldj�Dˤ��$u���G4��K��X�(�K���p2J{%9���X�ĞD�hl�DV�`I<ʓ������Y--�yT�t����@R���v�W��`}/wTS���E'X-��%�ҁS3A#��1���8�%-�z�zz:�Ɉ:��ݻwaI�ڈT*�L&���&9�Yڃ\	-K��g+-����^τ%р���>��eҪ���[w����$sRN]Z��v�鼥:?���J��Z��?���Z?Bl�p�K�<�?��K8[l?�M��R����zA
-s%�����Eˏ87
-�P&צ37?|�هܒx��$>	K-,	/����%|����aI4�%,���ok�d3�<��Ԓxt��!tB���=S��eÊK��RЏ�%�Pi���J��ܕ �����T��֗��R�<�D뤐`�%��QK%��F��\t��X�ǔj	˕�+�౅���K��lS�2�PK�<�%-7��@�\ZZM��_}U+Jԥ�N��c�X(�<8�-�#"�1!G�D Hc��1A#)�R	bLp9��J�E�i�%����]BT$Ď	�ZBt�=BM�!S��$-�u�Wo����%-w����<���Mp���$��"��F��p���.�L����\-���-W�¤-�&K�-&`CJ����\:������X��&wmUx���p{G0��jdu��2�$O�����XU!J----qaa}}�r6���Z\\�$	���;���n�̌�<--�
-���զ��roh�GR$�:1�Gh��F	9��WBS*��!8�A������K�S<�T�GLmӈu�#����x
-�jnC��K�Fד��4��Mϖ��h�5���$*�2�-�wg�:gD/i��:�K��%�T�%q�4Ëb΍�H~��H�R	;�a�'�"A�%�(A�1�T$X��ۏ����"���Dd���'�ZB����h	����t�܏h�p
-.J����!aC���	K-�#Vt�?�_H_�ES*��ܘ f��T�я`�J"��ь;&څv	K�0�J��H�R	g�����R	�A�^P�!L�K-����݊����w�M-����$��������kC̒�"��Wz%�A������G옘��Ė�.�z%?BP'�!��K��J%x���v	G�`�*�?�\:m�8�
-�"`C��ޒx(��۲$��I-�0��G��&��ضɏ�_���5�S�a)Sv�R	%j���H�%��cb��z?",jN�D�[�h�G�(�
-a�lI<��-����-��Ӫҗs5�S���&�$3�9B�$?{��ֻ�!B��3WR3���AɏДJ8�#�Jķ��!�	G������[�^	G��a�S.E�3��4!����]B��%6ZxB�4n{"�(��@�r�Ͱ!�InI<ydR$`I--d���P�W�NXuy�����Z�%�Ԇ83��
-�EB)��a�<�"A?&�Rfvz��Dk�`����ބQ�pe�F��'�v	�Q�G����@XN��HP��.!���`P$�C���xɆ0�I<q�X���+��&E���>]j�D|���E*�!�xK�����%��O�$,	�Ws��o^��A�0��F���\��| K�dC�M��_J�+	ُ��R	�E8q�m�"!�=4���G�	W��0+�^	���]�*��Q���y����`CTՆ0/cN����-(�ZB(��֗�E�4bDŽ6�"�\I"�
-E��6�1_{���wg�$7���ucIT�j��<uv�V����ל^~%e��^3"aI�Y�[�,��8[�\s�	���amQK%D?bfW[*��c�?"�c��J�;����)�f�#�a)B����L��"��Q=�D�0e"K-�$�=�%-�/`
-�k���K-�3����������T���y	7h�x�]QI��@%Q���p%11vA%�*	���	CJ��ʵx��P�qN9c�>Bn�nu���B����D8��,3A�Im��`����ь"�4�HP�&��z����[��*	-�2�L�R��^?_<���J�@�\-G�3âLA/*�+&�L�Ht�����H��D|YQ"��H����4c{�HYܿɮ�@
-QOƆ�����'9��-X�ط��mG1]Id�+��5DL�����}D\"�Z��t"]^Tb=���>"�HP�KD�ѦO'����
-ёdB�:���"�{�]o5D�HUO��$-�V;;;��!�z�ZM62Z	-��-"�s@1��c�>"nQ�����nD�,0ѣHmBK$��K��Wv}D$��<��Zi
-3$�!PI0�Ŀ��-��aPaT��-zc�����--�o�����?�[Lj%��N}uU�����������P�࣏>|�����VLۍF^��>mmm�����zT����Q��tt��-D�HV$SJ$���R&�{z���'nߦ+	��
-D>D&��H����~�[��r��$W<|�������:;�܉\.�qQ�d���"������'ϕ�V��V���-�<��\__����4"�KK-)�-��@L)�)J(E�J)�8�T,�Jb��D9�B.���<ߒDs�(������Ҩ����5SZ-9|������i������Pw�
-�9zoq�-KK-\e吜W4GGG��n%�+��J�\.�-jh����\]5�����Fń����p�-�ʈ�����P"����z��xGG�Q_OOwggG[[+H�����:2�ȟ��x�-���Tg�~�ww�-c�iS�7��-��mltdb|��V�R�(﹇�ѓ�U����OTHcʥ<�$�L•�#JœE����v�(&
-hLj"Z>q�VH�h\��8I;D�i���1b?�m���ql��8:D���&t2��m����5��--���mm�o߾��FN=�9
-}OC~���P����S���M��,g�76r����R)���i���5�j}���<W2���$�-�G�S_]]E^��e+���ݔ��1�Ej0������$
-9} 
-
-�-ѡ�Z������-�@���R.��\-��%} ����-�sUg<=no�ӕ����I�ǧ���7�<�D������%���ŏ���������P ߕ�F��+���<����Z5�;����-�-(y<!%?��/�D	ĔˆbJ	�(��R*G�Rʤ��2J�LSN�1*�rF���`(���F�
-7)���6)�Ύ��J�B(�c���||��-������;ɝ$NLN�O���Lj�#�#������@�@?������������"vvtv����m�-�-��'�MO�ɦhj�8
-��:Bm]�DŽ���ԺUUU�-����P��Í��"����LLN��8ݧ����
-��Z��%~�y-���h%-�~�vq�q��0˸H��a\�5L3�u1��������f�qZ3;�f\5.:���@q''n�ϻ--F)�G�%�\��8I+%��D	QH��cD�q�V���-���>q�q�G;A�����c���H/���qt��82ؕ�'���q����q��-����${gk5�Du:X�s����-��v����V��cJ��$��	"��w�-s5�J��/�;/a�-���7d��!�������-*	�t:����[[����D.������0����������J-+G!��G=>q�QI-��������V1N_,c�X��-I�^�N�r������iT�Β��S���h
-}��-S���L�?^+�����1D<ٱ�������j#�-�|-ө��$�b��3�-E�-Ȋ�If||\H�5˩D5o$a��Q�
-*�'�;>���ɎJ������;��
-�{S�����1�7�3��0���.���|�E-����G�vww766O��"!�$���v��
-�����B������RI%-=��
-�����
-]�3��-ӎ��r���,�8[r~���g3�<�X�m���\�EW�����B�I��Jv���4d�&�ݾ����-u�jU��#���&�*T�V(��>"����O�%�ȑ#
-?�#tI獒�^r�^{�b�8������J���GTT.�C.�&&ƿ��H$����e����D"�˭�q��T(r�\ve�5�-�d2�[�$-%��>�r1�Ţ���p,���r���J��9/�����_���0�)dx҅��o�u�����M	�9~\�5e������-������A2�t�\u�����D"��ra2�L4������Y��>>��6��~�T-IǢ=�͜���pD�P���$��D�~N%&�~��-�1W���uk��ad��5�{���IM�������T�C	����-�HD<4'O����S�����&���C199�R��+#*��� pŸ"�*	��ܾ}K�Qk4*�V�Nģ+��&������uJw�W/=���ݎZ�&��:*u_�r�/'`
-�O�����Ų��%±��;.��_r����x��=�Cw+�����a��Qa_�r�ǮR|��������^���6-I�^��������tWl?��\Ԑ�a���b��˭x?����s��谹3O�8�h/��pq~�B��
-�
-����
-����$�I��ɩÍ��z_Ӿ�FU�f��B�^qX�n�B�v�B�f�\���G�e�4$�'H�C��B�'+����4r��gϑz�$�}�|�/7�d��A'�ׯ�-�L�w-!C+��9�S��l9�������--'���>�tfZO��=WWŷq>�>2�-�j�����d�S��B�.Zߺz�7���Q�!dhJ�Wŧ�M'�\����f=w����s�=ٗ��k۔�����k��U��N��������--CC�}��k��q%��M%�F�����n�PrI6zʍ��e�B��<6P2H�L�C���a�d�4]2V������\I���2-���̷'�YO%��T��y�����bߌd2'���yٜpYX�ͧe��v�����*\����
-���O�F�<�f-��.�^����X��2j��#�Rz�cB	��5�G^-��T*u�����������F355�-����\���z�����Z�e8^���K��%1�V#��:��9�'���;S%	yh�\L��R4��sVo��Ο�o���Q����$���Je��woܸ��11a�X.���$-A�
-�DT�@��*�������w||�6�SI-xw��%_Gl��G�$-/<-�-���]'�����՟�---��-��%���o}�%
-x}GDl�ۛk�-���-�6�]�;����--�ш0���pH��ޠ0 �%�O��^OIϒsOǒ[���N�Qұ8����}aV(v1���ssֹY��%VH�e��Z'������)Ӕ��e��Փ5�
-��KQ-��--d�$ڈ���#+	���btt��-�R�TN(����c��
-^������-8.^xmk����3-&�<%��Q^^�dD���������3G��-Foogo��FwW{0��ں:������'9-Ƶ+����/��1���6�������{���]
-�J0ֻ����4��l�,�cfa.?{6�3���8;�����ٽ?����`��chld}���`�c��w�-c����o���Lj�{�/
-�ލ��߳>����wg{0��N#�������>]-Fu���ݺ_�޺���:��ǎmt���u��/��~�ѻ��_���_�ݺ����~��?|�n������կ~�rZ�<�����J"����0�$����..ަ�����o0v2KIu��-����)	-~��g�e\@�\��()�h�u�S{LF�7�������I-u��-g�٣-�ŝ�lvvv�ZJ-��t*�2X��/��ID��Ws�����KHJ������y3QTTTZZZ[[�յ��" %-df��D@*!l�\�"%�Y2"p������RF�-�$-d����8IID˅
-���2"PZZZ[[���-�����hhh�����"� %�	ޠ��|/Ɉ�����$xR-�-�l��{{vUU���%����$ZZZ������^XXX[[�������8�VZJ���OJ"B)�����4귵�mOItvv$/066v������/!%-���`]HI-��>y���x-	-��,))_ۃ�����1)	-I�-v�֡��%fo��ҥK"1��%-�U܂`�ߣ�iMڽ��RRHI-�|/R�$��D��$zzz�$B�_����-�U܂`�����$����$�$��-�U�R�v\iM�--RR�S���[4�����-Қ���$B��RR!�B��p1-����L-ɒTp„������Rl;��K���R$%�1���D\��B�)PحFq��e^��rl�ɼ�����^^^�J��@J���w_���������L*�Tp`a�����/..
-&�ʍ7�$�$B����g,���vdr�#%�v?<�d�Q�uT�Q��2XV.i����gppphhh~~^6AJ)����[���;���DT����-K���q�!eF��,
-�m�s�ΔDMMM�f#�xBH\�~]JBJ"��m_QW;\��$�hT&������><����{�� %-X��r�Dh��!,W�����W�s6�hT�UR-dk�2;hLp@��3�~w�0��uuuۃ###��yp�)�|�lDgggCCC���l'��g��{���<���J)����PC��K���,I͎��opV��L���x��g��v~~���$�$u��nD?�]OA�M�-%!�?&�JB���ic?�᫨h�I�ۯ:�x�-�f)�HI-o�R�$-Uy5~B-J�����E�������"AJB��]�9B��2d��Y�6�Z��Ų�j��\�3P��ҳ��_Id;��`������%a���|�-8W����Ba�'�T*5�M��$_6b��"�0����II�n��͐G����m���	�XJ¶)	��Z�GD-�e�������-��JB��r�$�3���T��M�프��F)�w_���>2)	I.}^�)	�'-r�Z�/)	��o������}?)	}
-)	������6?�x;�;q��< %a���� ��Z[HJB�"%a�雔_-%�Iuʲb˗��9==����Z�$%a��)	i�j�ZH����I�Q��el�yJ��`8ia��3S��ѵ򋋋F�A2B��ĪB��N�ű�~��������B�R��x�D"!^J�u�e#�n�|��)������^��-%��	��0Z�w�l9.
-ju^ܤ)	�3-��ȋ��ስ������\&��q�G$����Y����eRҾ��)	�TD��%a����D����-|m-_-R��~j;[7Q8��'%��(�'%��i-����NOOS��$�'
-J-���E0�r[���k���ÉD†�QM���ҋ	Tp:��s����#%a�e#�^�٧
-����H����;-�����J�#�hY���M�8��Y�z��(�H$����-���vS{-GL��4j����������,�����������%-�X�(l�^o8N&��O���2���@�Z�ٟ����s�V��$̾l���fvS|�5�-�D���C�s8�Pݾ��"�����&`x��o����`���T*5�MS�$f��5֒P֑T��8???99�!����B��I��9�"-8����X��-�b��oo�6)	���N��mQ!�uRxW&���-�x<�y��U+ZŘ��wK�`0�Q��F�T*1u��L�EV*	�"���]��I@��|>35-��X].���n)	Ql���P"��_sM-����"��4*?����1��+T,��Z%*��GMS�ш���0d�-�B���|wwGJ’���-K~�_�Ri�۪�������Y�-��)����OOO�$̸~�:`�0�}�*�A�y��-Q{,K���,E���^g}+hJ�~���%(�(�-$�H����-*@�����.�wOe������S�����|��-�fT	K)�R`,�B�e��(�J����_���^+G0�>�H�,8�-�X�v��'��>Hx�OlX�,GWyR��"��R�0'B�$�H��#C)�F5k��5��zqq�4HIl�N���2������-����<Ȝ��r�4UV�8>�`�aJ��|�$%q���1�o�iHSZo�����-�A��x<���t�m;+Y2%��aJb��&%-D��[����Ņ(N������OI�-)��u�]Q��:DT#��2�M՗������j5Q)Yf��R)ˤ$��/--ךT%
-)	��l��NU��B����ש���Q|�������B�)	�b-Q(��-�+��� "�́�hޔ�����-�B�V�R.�K���=-)	yt:��,&���=???>>��>!���
-���?�:,%�dHI��`���#�������-9�_~�~���B�������F*�4j^��������///�����G�T*Y;���uvv����$D�J��3/�-)	���L&�G�V�U��//���8x=�O�>�����$�-	fX�>-�X,�>}�����8���777�G��I�W�߇�%�4�H$��-����� ���[kkk*	�N�(��{�D��\%q�T�fs}}}nn�����Y]]-�677����>��x�%���*���������H$hs$�-��JB%Ѧ���SSS��++�X%$����$�cT��^%���M�-��UI$UF�Ϸʈ�������O��#--�P5_t&�!�J���D�3�QI�����h�e��%����o^٬[l����MK<�9��� 9�bA+��3-���¿v��*	��T*	��J�4.�6-"PV*��x��2"l�pRLOO/,,����D�Ri#-p�z(��C�-T���ʈ`xx�V�e�3�ܘʴ*�vG�'���T��G%Q��-WIܿ��Q��8�����������AZ��(iϟ�oO1�s���J�d�d*�b]���|�J�-�\%-TIlll���>}jjjee��Wn�$�-�4-���lLYO�mɥ��d/�I�_������i��EY�H�-B�g��J-ZI��-���uSI-:D9��x�-b8:,#��][^^���º�$fff�h?DQI�$Z�X��'eD___��χ�/�����I-���E��J�100055~���VI-"���J�D������J-"�$޽{��Ȧ�XZZ
-�eqqq}}�-��8���Ӓ�����r�-���Fν�(\"a0�T�]#?���-%-�sˈ0�?���S�Q�J-'���J��W�H(�[�|W&�/�҅��s$Lj�nq�-:�8������D�]���[Q.څ�$2~��]I<|�ӕ�mD�]�6B%�emmM%����:�Jbhh���[�°�2�-]Iܿ��DOWn�6�G1�6B%�E%�>�TI����I��|f�TI<{���ˊ�6B%-%�z\~l룒(͵�(�R�"��-TIH$-]I�}�F%�����?~\�������044t����D�s�(�	b��*��W�vRI>x������
-C-_�215������v�gM�}S$�d�-�\�>1߹���(	n����*	�D	.��,߭���X�-d6S)��(�Iq�e$��ю�3��y,T(j���C^��c�����?q?c#�����l���dooOJ-�w�gxC��:�-RRq�X6��{���#~��K��#N~�:z)~C�$-3%����׶�����-��,GGG;;;�-%JD=xJbkk+��ć~l>�����mŲ���H��D-�WL������woCJ��effFJ"d�~��;������^%ꜟ�W�-VWW��mmm�����-��w&�n�G�?%�-�s-��Ķ��!����-��ɓ�&*oxp)	-/����D�#Ne��s�	R-�����#���\N��$-��HI��
--G����ւ�lM��j�Z����!�yY�|�$bqZ�MMu7��--�-��������+VJBx�9�RJ-I�޼��J�R�ZUN�V5�n���[*%-ɂ��q�x�������db�Xfgg�(-���Q�=�\.=�7o^6My�7nD���t����b��
-�s��Z}mU�I-]��~�����)	c#�h4��")	�T$]Û�ggG8"̔��ѷ�^���unnnvv������#D�}t�UM��HI-�힌��~�-��$-�Y��c5�����-�V��x�&���8�1��q����-��R-�V��liii?]-��?�ꫯvww���ȭ[���T*iAÚ$��HJb�F�Ξ���zL�-�B.��27o޼v�N�ׯ߸q�[�(������D�1�IF`���$�66�c�D�Th)Q-JLOO�Z��V�;w�IIп�#"�k�M��D�����B-J��Ŏn���������_mnnj���	---�-'��---���-����noo��������)*��K��*-������v�=��Z-�˥R)�11�����)%1�5�(%!%-��ʶ��/%��]j�ƪ�(�Q�ߑ�--W���!�[�2�$~�G��>NC����2�`�&4>[�L��9=��1n#TS*�41z�Ǝ�D�M���!%�ekY�3v��N�����/%%Q3��,�'=�-6.%qX��R��)��r"�(�W_��<����-	J���/%�$���G_fJ�y���,��5�����kY�)���)RMz�3��SQ=�~�?`���KI���`��|&p\JbkU�����x��2�Bf��M�y�,%�7-fM�ob'� |-K�S�<�He���=�����)��il2Oje)	�--����)��%ոR]q�y��$-&%!%ոR]q�J�LYS����$-p�U��&F$)	-���������J3��ҸHu��2���Xx�ɭ������|�Ro\��BJ�->(��S!�np��$�R�-y�LJ��-���Zq�R���ȹ�)��6u��	 yb�=�)��u2%%��2���F��-�1��0yh��~8)m.�F�ɫ����DΨL�3�o\��ܖ�h)�>-pvJ�(!%�V)�&�mJBD`��{�%%!%Q_�������$<�6��-��|�X셽qե�<-n������|���-ջ|����ϲ�6t��Y�
-B���-�w|t��10���d�$-/�����¿S�$�-������'���-����J-�})	���-�)���--������`�z���#���-��T��>sj;'�F�\��
-�����7��F�-�����M2��MJ-<4[�5VZ����޻���O�------�</}����U��{�x��-z���u��93�`--9�S��-��f����$��-LI���i����žSF�Q�We)��������_$HIܖ��gڹ0%��Y	-J---K���)	)	Α��H/A	-5�at,�D�q-�keo����-z_�0hq��_RQ9����a�������--�x*��"%--��m��%��ij�F�Ŷ��!ʹ��RWߨ��>��N���---�ߑ-!���HI:��է/�N�m/-!���m����ϟ'��j�Ǝ�?�-	ʹ��RKߨ��>q&9`Z˜]c�++֮�k�|���jʿ�V�.5�d]��+�����K���U�l���2���1�C�I��Ku�d���{w��n�ʝ�+�[������η;��g�#�9�"�����z�9Lr�s^�)���4b���r����������,�����lrΔK�-�֜��x�58�
+����;꼢���x��\~W_�7����GM�.��iDX�k=�~�	.�*�/�����	p'endstream
 endobj
-64 0 obj <<
-/Font << /F8 15 0 R /F14 37 0 R /F27 31 0 R /F26 12 0 R >>
-/XObject << /Im1 63 0 R >>
-/ProcSet [ /PDF /Text /ImageC ]
->> endobj
-69 0 obj <<
-/Length 1147      
-/Filter /FlateDecode
->>
+92 0 obj
+3425
+endobj
+96 0 obj
+<</Length 97 0 R/Filter /FlateDecode>>
 stream
-xڕVK�����kŇD)�-�y*�"�+��e�3�?{B�M�ą�M�d�4S����[���
-������!-��
-D�&z��U/�-����6ý��c��p���/��l;&<���&5���bXT��KB?͖P����@:Lk$?I��)(�-8Z������馽{���������
-�����o@��<�B���
-e�?���G�!dr��y΃���WKo7�/�3@FE=O�$�h�����ۉ�}ɑF�v�z|0�)����Z�������:�S�>�����+I%o���!�}��>~7�Ř�����S$ѥHyI���L����fP��iF��MZk����+!r���E4����yQ]�]�P�(�6�Ȳ_�&,�J!�%�l����Uܢ��� �E������a���V��K3c�Pvd6�33��Ѳ����<��Y�C���R2��+�������Qy�c��n"_yQ�1>5r	XU=�Zvɚ�k1Kr�
+��V��l��������B#��J+�>,�Z����[�L�
+��	滯����stream
 endobj
-68 0 obj <<
-/Type /Page
-/Contents 69 0 R
-/Resources 67 0 R
-/MediaBox [0 0 612 792]
-/Parent 50 0 R
->> endobj
-67 0 obj <<
-/Font << /F8 15 0 R /F26 12 0 R /F14 37 0 R /F27 31 0 R >>
-/ProcSet [ /PDF /Text ]
->> endobj
-61 0 obj <<
-/Length1 1132
-/Length2 6144
-/Length3 532
-/Length 6875      
-/Filter /FlateDecode
+97 0 obj
+1160
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 595 842]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /ImageB /Text]
+/ExtGState 22 0 R
+/Font 23 0 R
 >>
-stream
-x��eX�m���������A�AiPi�F��i��=����|��:�]��AG�[������(hʛ�<@�<3��A�`q-���9@�r�-��"o��&>-�>-���
-tכ�_��J~�%/H
-������\B�>��n�9^D�^�ܦ]���u"�a�jr�+�ckPfU�hx
->����>�������k����S�86L��m�1Y��W3+
-O^F�K�sR�D��ɀ����.)��k$�Gִu_EMz�|�}�"� E]������Qx�����-7
-���)HkZ�p��];Y�����aq���ᑇ>}u("����8���S��aij��%	)U�������`��Y����_SĐ�����K����.̲O�d����3�NzN�~%��Y
-���Tv������o��*W��̴<�Q���^'��׿0�x�P�#���)�$���u��_e�c)S'������q�TI�����mi���
-"_�%��b�E�u�d$�B�+O7�̧ٛ��{�>�aq�/��aQ��8�v۬#�����n�Wu����-�Vؐ��L_+;�E%x�Z��<6�w��X�H��K�ʤl�|�3"L���UMT̾T�(�������f5��"_�w�|4�&&�˺�����t�wK(��/B��=M�����y:a�a���҂{���/�ҫ��~���$��4��"�9��n;&��-z�_L(��(S"�,R?ܼ��r�W�Þ ���Z�&�/G����r�M1_�"�+�"x#ˠ��Li5��������\�^��>t���Mę��9�D\O��`
-!��ۋ�jQ����
-����;��1�c�|
-��H��\E������`�ri���^1,	�`1�.Q�KG�<X����jm����}y3�����=L̈؄�OϷ�n��q�����%篽�31m��-�#6��	�����X�V~��UUe����$�v%����|�us����UI��HE������L,�-��斝2ο{x�����N���yL�N�ڢ�(�f�%m���X��ğW4��)x��[�&�Y�Kf�qi}���*��i�ɭi����Uw���lCJ����TI�nB	��"C��P�r��3�/twFh����0��b�a(Dq��s��������4Y���˵'̻���%(;a���ͅr=�(ф-k2K�Y�\nz�Y��k���4�"�"H+ߎLQ�dY抸���
-�:v}����i��J�H%&�ϊ�V� ��1��(h}���T'�|D��[�-����(j�`�+2V3��~��=���Gm��WB8=��\i���d��{��Q<A�Ԣ-�tȹ1W'|D�@��:�?x�Y�d�L���Jx�U-����N�b&7�~|�["�][Rs4������S!-�5*4�����].��`���ӠXߠ��lۛ�N4SK��A~�J,A��W_��׎��U:���hR��gS��Ȏ�k���p5tV���H�A���Z���q(N��E������{�U�ΘD���t?ٜ��b+ȣ�?�w!�:æ����lCnj�γ����(�g6f.��������6�+����a*95&#�lW��yU��'��E��.�5��8qGBq����Qz�-r��~
-���M�Tb����	���y��Ov����w$aop�Vִ#�LtԳ�t@��1N����
-)g���W��g�&���N��,F��H�r�����wfgz���<y�9�㦒9I�AvD8�Tn"�b��u���2��~���^U(�zM!�A/���]ՠ[%�5�l!����z���N��8��
-�D�k��>5�$��rw.9d�Ϩ>�
-��zX�̙�͉��QcI4q�Zb�.�<}�#�js�B���\Xb���<���tr��_��n��䓆XP�V�čh	��)�ġ���S�D�e3Z�����<�}�ŵxH�)���Nk@�-qz:>bj��á
-#��T����ϸ��%���1kw�Y����z�ʩWm/���������j�$6qyz(߃���K�x�*~`�j@Q�k����+X0
-K3��X2޶�BV��G���X������[�9w5�9F~a��<R��k�y�tj0���M@w�����݈Cs�.̠��������H
-��ontents 5 0 R
+>>
 endobj
-62 0 obj <<
-/Type /Font
-/Subtype /Type1
-/Encoding 70 0 R
-/FirstChar 12
-/LastChar 120
-/Widths 71 0 R
-/BaseFont /AZRZGN+CMBX10
-/FontDescriptor 60 0 R
->> endobj
-60 0 obj <<
-/Ascent 694
-/CapHeight 686
-/Descent -194
-/FontName /AZRZGN+CMBX10
-/ItalicAngle 0
-/StemV 114
-/XHeight 444
-/FontBBox [-301 -250 1164 946]
-/Flags 4
-/CharSet (/fi/exclam/colon/A/G/I/N/R/T/W/a/d/e/h/i/k/l/m/n/o/p/r/s/t/u/w/x)
-/FontFile 61 0 R
->> endobj
-71 0 obj
-[639 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 350 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 319 0 0 0 0 0 0 869 0 0 0 0 0 904 0 436 0 0 0 0 900 0 0 0 862 0 800 0 0 1189 0 0 0 0 0 0 0 0 0 559 0 0 639 527 0 0 639 319 0 607 319 958 639 575 639 0 474 454 447 639 0 831 607 ]
+24 0 obj
+<</Type/Page/MediaBox [0 0 595 842]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /Text]
+/ExtGState 29 0 R
+/Font 30 0 R
+>>
+/Contents 25 0 R
+>>
 endobj
-70 0 obj <<
-/Type /Encoding
-/Differences [ 0 /.notdef 12/fi 13/.notdef 33/exclam 34/.notdef 58/colon 59/.notdef 65/A 66/.notdef 71/G 72/.notdef 73/I 74/.notdef 78/N 79/.notdef 82/R 83/.notdef 84/T 85/.notdef 87/W 88/.notdef 97/a 98/.notdef 100/d/e 102/.notdef 104/h/i 106/.notdef 107/k/l/m/n/o/p 113/.notdef 114/r/s/t/u 118/.notdef 119/w/x 121/.notdef]
->> endobj
-36 0 obj <<
-/Length1 750
-/Length2 576
-/Length3 532
-/Length 1110      
-/Filter /FlateDecode
+31 0 obj
+<</Type/Page/MediaBox [0 0 595 842]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /ImageB /Text]
+/ExtGState 36 0 R
+/Font 37 0 R
 >>
-stream
-x�U�L�Ju�+���Rp�44P0��u.JM,��I,I�R0��4Tp,MW04U00�22�25�p��,��Q��)2Wp�-�N��H����������ZR�������Z�ZT����h����\������ǥr�g^Z��9D8��-@'��T*���q�����B7ܭ4'�1d<8�0�3s*�*�KR�|���B盚�Y��.����옗����kh�g`l
-��vˬHM	�I�HK�N��楠;|`���C����WRY��`�P
-���P�6�00*B+�׼�̼t#S3�Ģ��.`
-�
-2�R+�.��/jQ-���$e~s�ʻ���?��|<ċݺ���'}I������xT.��gt���vՏG��U|���~��]�_k��{��
-�}dN<6�-uB��H��c�M�H���q�a�K�K̞�}��˛���m����o���v�
-���s>���.#��ߦ�{�/��kܗ<n��[�����[����d����1���͓_��aՍ-<�-{f�#Mz���=��Y���/�T�}���)���0��:o�K���.l���yE�
-���צ������_��	�ᚔi�s�`��C���I^>�������d�j|��/�p�0,H�M,*�M,�+/Contents 32 0 R
+>>
 endobj
-37 0 obj <<
-/Type /Font
-/Subtype /Type1
-/Encoding 72 0 R
-/FirstChar 15
-/LastChar 15
-/Widths 73 0 R
-/BaseFont /YYODSQ+CMSY10
-/FontDescriptor 35 0 R
->> endobj
-35 0 obj <<
-/Ascent 750
-/CapHeight 683
-/Descent -194
-/FontName /YYODSQ+CMSY10
-/ItalicAngle -14.035
-/StemV 85
-/XHeight 431
-/FontBBox [-29 -960 1116 775]
-/Flags 4
-/CharSet (/bullet)
-/FontFile 36 0 R
->> endobj
-73 0 obj
-[500 ]
+38 0 obj
+<</Type/Page/MediaBox [0 0 595 842]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /ImageB /Text]
+/ExtGState 41 0 R
+/Font 42 0 R
+>>
+/Contents 39 0 R
+>>
 endobj
-72 0 obj <<
-/Type /Encoding
-/Differences [ 0 /.notdef 15/bullet 16/.notdef]
->> endobj
-30 0 obj <<
-/Length1 1884
-/Length2 12110
-/Length3 532
-/Length 13167     
-/Filter /FlateDecode
+43 0 obj
+<</Type/Page/MediaBox [0 0 595 842]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /ImageB /Text]
+/ExtGState 46 0 R
+/Font 47 0 R
 >>
-stream
-x��UX̶h��k�-�ס�kP��Y��?Y����t��eO������	����0rt4�0����v�@w-��c��9W���Tb���=:�
-=Y����6ja!uYɔ1���6��a6��|��Zh׮A.X��O&pQ�,"��SV��b���-� �O_0=��4b4��wY6���{��'݈�����D�����T��Ϗ[��S��$x���s~��X�o�|RI)��8F����!;����(O�d(@�vC4G����aZ��!vDz���-�T�Ȝ�㙦��[y��hYWȓe�X��e�
-��
-�fs��HW��T_l�[H���l%VH�tܡDrE^��������+WO��ڠ� ���V��qX��Y�+�����9-�o��i���.Kڢ]g����[��l(�FNPpv?��LٟfIald�%�_g��A\NzL;�	U`��pZ���;|��'Q,9�m3��T�|{`��7NFd�~����
-I�9`[v��Mqg5������E*�FF����3�U�y;����aUӈ��WY�Ҝ�ܷ[��m� ����O���-��߇(
-��	��{U3^30r壝1#�3GY@~Lj��w
-����6 ?/�{�enp��s�Lɉ�ph�m��X���k<��LA,�f����ZH����1��U@	�����n��f�8�F�Ur�I�nv����������_�S��؜��P<5�����ʾb���٩F{����퐊��F��+�/��V�����W�r�n촜�\M�b�_��Pz-v�ER<�
-�y7U��-�sZ>Q���T9�
-q�~�)�o���3��Y2#�\"I����*�`G�n�m}b�m�Xh%��a���}SSf�y�Z�j �!�<��K��%J����S��Ö&�>�M���QJ����A��3��/+<߮%ߨ��L�R–��ի�ɥ";�m f=�O������+3�foOn%�˞�_���,-nb�]��av<.���ŖK5��,v�H�܏��:0��QqPC����Ų��Y�\T���ѳ(r��nU�'��-�W��M��O�K��g;A��x�����t��՞8G�������t�軸��'JϾ�+Y��+A������؇��՗�Htґ>�B����R�~�rş���'���f=e(�#�уpg���a�������� �sG�����H����s�
-B�gsF⸴.o��,�;�$"�����q�{Lep#ںcV�4--k�?V�S��I- \�+��	sYa�s��
-g�IՅ-t����]� �@\��0��.���)���4��O	]6��:	�s��(�o~�~��.�)u�s/��8!]��������-�}/BØe�x`�8�A���Ꙡmڜ5�q�R-����������-RPժ�7���)�2�#UJ����tB
-���SH���6%��ů~g�����y
-��$���gp��A�v�~ܜ����H���W��3�	i�9۟V#�[Nf�Pw_�`��-O����|K�b��5�ⶓ�ԁD�M-�s����v D-wF��g3X������|Z��on�m����W~�P�o��5��m�y=���i��ے�.sR���M�,�KKv�}�������Hm''_œ����Y�6��nx��1`���꽐�ф�|�xIK�M��;O��E-��d�]g�ء���8ђ��P��--������.��Ӂ�٢+o�%���ƀ:f����+��ͅ��m���J�xO���g�����q��&�)PҀGWdg=����^̨��cj����V�U���[����Ŗ�H+����	w�o�$���M�eW�;���������d�@:��	uG�_�k�e@���a�ѿGְ�����K�����w�u$$�"�z� �C�}�z�U�����Z�i�IگN���@{�rY����#
-*>E�/͟��>?���>���7�<��%54q1F~�g����]j�Y�TF����2L��%�E!���+��)jzS(��
-���ŋ���d�f�ز����ָ����T��R
-y�{f\�}���<t��I����F�>�j�粂��(�` uZeZ��k
-~�ܦ���o��������֯ү�=����-��'׶	D��W����^�-�\׷(�C��"] x|�D��64�_�"9���?~|Qd�?v5
-�Ym��=!M6{
-:�Y�	q�
-���wZ�:���ꁫæV�hF#�w���b������E�a���uQ�@�uOP��������8�ھaȃ�M�f�W�-P�{�&����ELW
-�-)0=JP~曣|$�0l���o��~ȵaP���yK����-)(�7v�-ގ/��#�����%S��f��Lb�����#��������;�Z�5��r?,�����?5E��ᵳQ8|�v������
-�ƣ����/<�vџa�hneSm�Pm�y���]����xw��l��H�X�ބ�fS��Y��w�ަ8���>�{Z��m���
-Ea|$���\b,�-_�8j*�Nwh���Bf��*\�|X4�K��Aj�����kE��PC���pƿ]&=�9�����S��{ո���ee��h֕B�Y�Ӎ��z�h7@-�#�j�ij
-;q��q�����^1��7��-�F��<�n��T��'҇��4�}�&��R��M��:�H�����z�݌����hK�'�(`�_[]�rh����z�׎4$i���h���)&��E��Ⱥ�]x�ף��7�h�����7�P*�=�3)K���=ʃX��FB&8�����7X�� ��"�n����+f|���.��
-�kY��0�<��\�v��y:~7T�����+oV;n)غ�ے����rEG�Ow>&�-դ�y0.��U�/�y/����)�e~�D��c�����̓V�>��ʙ@���~raY.�(g;3$zG��������.e�4�4�2��߾�;fX�T�ry|��R\7}L�hD���ijk���gSo�{��h��kK�5=������a��"	�2+���sϦyn蚹�U�Bf���}A�����bh� _��sv��H�Z!�5GH�$���@`P��{~rx��~(n��?��>U*�����nY@ްh�x(�c�1"�BM����2���-�����:���?���]Dsn���`�r'v�;��P��M��$�R�Ea���3���GU���3���fSQ� F,S�vRP�Z�)ŎO�XbM�?Ň%6[�K�����)7�I������e�s�G�-�g��z~샡��d��R�|�?
-ʶ^���nĩIr1���	�W��5�}��_k,�����7�Jl���g��3M���\]�mc�;hE���ǝ��f��!	��h|��g-{�lv���7Mگ�֩�׬1�8�ǐ=�-���Ї WT�6P�������#PgO�RRY����Lyv(
-�b�fF!4��#2ގ[8���afԏ�⒆	��݅�j���Ep⤥𴴽d�#T�`�ޭ�h3^֩+|�P��4���C*[�u�2J���H㥨u�L�G�3�|
-e`I��P�FD��A[��������ϩ��&1��!��V���(k, ������Cw���\M��-��=���>�!�)�8��r63�8�-�.c�3�F�{�$�����k���~�Z�-���*�-,�*G˱:x#f|�*�)����?�gjНø%Fh���AO��U�-�����/����J�CՍ%W��*�}X��-�,,�[�Ʋ��H��zȓ�Ž�*�&����Z��?˙���^HI�9��w\`��q�/��9>�F&������ұ�o�a���+�Z~�:��嵻��Bn!�V���-���W0�M�S��Q|m.�c\3]��lj���x$�����ӀTocZ���Qez�7��������ϐ����!��XD�(�-����P���
-8���@P˱��凝D��~6�"<��P�*���>qB�����l4�"�/�����.�mz���60_2�l�<�WP9�DoM}�<h�QH�����W�� ���>�=ö��$�z!f�2���g���#>T�l���r766݌�B��y���g����H);����4c[1q����Ф XIXQ�jHq�R�*�>��
-�5�����^OO�fԝ�������z�񶔰��c�;���?����L�������H`b4rt�9Z#�endstream
+/Contents 44 0 R
+>>
 endobj
-31 0 obj <<
-/Type /Font
-/Subtype /Type1
-/Encoding 74 0 R
-/FirstChar 33
-/LastChar 125
-/Widths 75 0 R
-/BaseFont /STLUGA+CMTT10
-/FontDescriptor 29 0 R
->> endobj
-29 0 obj <<
-/Ascent 611
-/CapHeight 611
-/Descent -222
-/FontName /STLUGA+CMTT10
-/ItalicAngle 0
-/StemV 69
-/XHeight 431
-/FontBBox [-4 -235 731 800]
-/Flags 4
-/CharSet (/exclam/quotedbl/parenleft/parenright/asterisk/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/A/B/C/D/E/F/G/H/I/L/M/N/O/P/Q/R/S/T/U/V/W/Y/underscore/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/braceleft/braceright)
-/FontFile 30 0 R
->> endobj
+48 0 obj
+<</Type/Page/MediaBox [0 0 595 842]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /Text]
+/ExtGState 51 0 R
+/Font 52 0 R
+>>
+/Contents 49 0 R
+>>
+endobj
+53 0 obj
+<</Type/Page/MediaBox [0 0 595 842]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /ImageB /Text]
+/ExtGState 56 0 R
+/Font 57 0 R
+>>
+/Contents 54 0 R
+>>
+endobj
+58 0 obj
+<</Type/Page/MediaBox [0 0 595 842]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /Text]
+/ExtGState 61 0 R
+/Font 62 0 R
+>>
+/Contents 59 0 R
+>>
+endobj
+63 0 obj
+<</Type/Page/MediaBox [0 0 595 842]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /Text]
+/ExtGState 66 0 R
+/Font 67 0 R
+>>
+/Contents 64 0 R
+>>
+endobj
+68 0 obj
+<</Type/Page/MediaBox [0 0 595 842]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /Text]
+/ExtGState 73 0 R
+/Font 74 0 R
+>>
+/Contents 69 0 R
+>>
+endobj
 75 0 obj
-[525 525 0 0 0 0 0 525 525 525 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 0 525 0 0 0 525 525 525 525 525 525 525 525 525 0 0 525 525 525 525 525 525 525 525 525 525 525 525 0 525 0 0 0 0 0 525 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 0 525 0 525 ]
+<</Type/Page/MediaBox [0 0 595 842]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /ImageB /Text]
+/ExtGState 78 0 R
+/Font 79 0 R
+>>
+/Contents 76 0 R
+>>
 endobj
-74 0 obj <<
-/Type /Encoding
-/Differences [ 0 /.notdef 33/exclam/quotedbl 35/.notdef 40/parenleft/parenright/asterisk 43/.notdef 44/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon 60/.notdef 61/equal 62/.notdef 65/A/B/C/D/E/F/G/H/I 74/.notdef 76/L/M/N/O/P/Q/R/S/T/U/V/W 88/.notdef 89/Y 90/.notdef 95/underscore 96/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y 122/.notdef 123/braceleft 124/.notdef 125/braceright 126/.notdef]
->> endobj
-23 0 obj <<
-/Length1 1140
-/Length2 5257
-/Length3 532
-/Length 5984      
-/Filter /FlateDecode
+80 0 obj
+<</Type/Page/MediaBox [0 0 595 842]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /ImageB /Text]
+/ExtGState 83 0 R
+/Font 84 0 R
 >>
-stream
-x��w<���j���"bը����"�H�R�W�ڛ�V�ҪYjS���6U���{�����9��
-� �H7OA�X��m 		���;O8��*
-KI����0,!-*%-�M*"Q~h8�ȫ�+�E�vn@m;O'([b�4DB�?!���+��@��u��8�h��-Az�����o���$� ���e�@0��@�6u��� V�n V� �/��� V����~�������PPD\���4�����]f(�
-�"!2��u�ʅ#��
-��	:�m[HC�q]��/֘�WdҐ����7?�T�}��=ӿ�� S�
-u����n����d������=^%�/D�-�_��-��c���"��[�݀2ݽ,R,b�2�H�sq��~ҕ����+���)�I���]L��1�����Ƌ�܈hwB�۸lv���r=dz��e��s���>�bA�T��j%[8�,�r����Ա&=kS�?�2��k �#�-
-h2S��e������_m�έ�G'Y�����:{J~��@�z'^���y^)�C0�����>���y&!|�”أ��<���N�/}��pmDR�e���*��gO���v�+��p�V�WF��8�ҙ3�Y�G*�/�t{bj�~>������s��U7�g>���~ӵ0L�=�\fm���Q����ӏ����-|�e�]Ý�������S�W�:�{��ժ�b��� �V*���G�i=y�52LG�dm�r�jO�C_�~S��8Dq���h�۫�n� ��������\V�� �ٓ��#?
-���)��xKk����_@�p�g�N�~Kj�����Oe��q���2�f�������b�F2�&��b���
-L=�sOI衏4�ඈ����Ve
-�-�N>:�֨P�X0đVV��NKK�P�C�-�~M)��{m$&�f��~��71>V�̭��^#�X�7r��=��<��޳�٤�YmYΈ�J(�%�G���6��^�OIhvH\��6L�m%4�����h���l/�e�E=A�U%�� ��0B�����X�lp$���%-�Pp��lh�`�Yr[������p-��-`2�ڊi�fJU���u�ִ6�#���P�%��u������ˢ�d��ތ6�%;5
-	�e+h�����M�M�e��H�[J�Me���_c|��!o��&?גݤ����Mo������Q���������\.1��&��g:�q�2�E��^�,ns�@���:�|[��$����A���<Ix������Z�̋�:��q����[����>;>|/�2�T�M����v����X��)%�Z��g�C�.F��һ�Մ��i�
-
-H�_Dy]̠��\����ەl8�܈퓕{��NX���Pa�+�yW�����*�7����"�ݹD�d/L6�o�x1��Am�D,~�H����轶A�n���*���X�Z���J�CN>`��d�6�k�u�J&l'"��=�	Z;j\/P��\��bL���=ʢ ��9붤��k`��:G�M����9�����зܹ0����~�MY������o6/�y_�n��z)��U�{�s>=h���(.F�{-�z�a|$������+n�e�C����%Ga�W�����S��m(G���?C���)D2��$5b�}ȼM3��%�4鴅I�>��K,���{�D�K�R��mK�a���B$,˘�|�Ԍ�օ���]�G{ep�E��X�����T�w�������� {x�'(��!��e��Vn�V��h�;!Og��nQw5���������R��Y`�Ȏ
-�8� ���&�L�l3P����x��H(͏�����T|l���Qo�Υ@��6|��
-
-t0�5Ĝ��|{JB�LH���ў��t��Ӕ�ʛ�>z�q*����(y�v�y;
-�'~Ɵ��V8H��N9-5�-.{��=߃�q]�ٍ��l��A�𬌝��-�R-�N�\��_�RF�i#��
-4^0�*��(n--h�~>K�a��U5��*�4Ćm���4�y60�q��Vz)u�	@l�C1�|/�}P@��(�5�O�X`[��z���Y������(���/wؘ��]-��֒=H�Ƙ?g�̭g��tnP�ی�ޤ�O��e�ك�F7�����9<ks�	���Dk��%��zk�
-j<�m=���X�6$֤���Hh�R��]L�������
-*��T�7��)��&��Z;�(M�=G�>e��$p�@1aM����.��:edA�zn��Y�t��gS��\����y+�2`.ћ0�RS�	�S�f8��������2�-,���Ί�F��n+Bg�|6���pg�&gI֏�/ճ��z����Ђ�]�}��$���A�����'̪絰F͸�����*����IK���PF�7�Ul"��C��7V�R�����C{"vh�+/Contents 81 0 R
+>>
 endobj
-24 0 obj <<
-/Type /Font
-/Subtype /Type1
-/Encoding 76 0 R
-/FirstChar 12
-/LastChar 121
-/Widths 77 0 R
-/BaseFont /VVCEAL+CMR8
-/FontDescriptor 22 0 R
->> endobj
-22 0 obj <<
-/Ascent 694
-/CapHeight 683
-/Descent -194
-/FontName /VVCEAL+CMR8
-/ItalicAngle 0
-/StemV 76
-/XHeight 431
-/FontBBox [-36 -250 1070 750]
-/Flags 4
-/CharSet (/fi/comma/period/E/P/T/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/r/s/t/u/v/w/y)
-/FontFile 23 0 R
->> endobj
-77 0 obj
-[590 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 295 0 295 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 723 0 0 0 0 0 0 0 0 0 0 723 0 0 0 767 0 0 0 0 0 0 0 0 0 0 0 0 531 590 472 590 472 325 531 590 295 0 561 295 885 590 531 590 0 414 419 413 590 561 767 0 561 ]
+85 0 obj
+<</Type/Page/MediaBox [0 0 595 842]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /ImageB /Text]
+/ExtGState 88 0 R
+/Font 89 0 R
+>>
+/Contents 86 0 R
+>>
 endobj
-76 0 obj <<
-/Type /Encoding
-/Differences [ 0 /.notdef 12/fi 13/.notdef 44/comma 45/.notdef 46/period 47/.notdef 69/E 70/.notdef 80/P 81/.notdef 84/T 85/.notdef 97/a/b/c/d/e/f/g/h/i 106/.notdef 107/k/l/m/n/o/p 113/.notdef 114/r/s/t/u/v/w 120/.notdef 121/y 122/.notdef]
->> endobj
-20 0 obj <<
-/Length1 786
-/Length2 1538
-/Length3 532
-/Length 2113      
-/Filter /FlateDecode
+90 0 obj
+<</Type/Page/MediaBox [0 0 595 842]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /ImageB /Text]
+/ExtGState 93 0 R
+/Font 94 0 R
 >>
-stream
-x�Rk<T�(��(�K{�M$f����Ij7f��a�3���]�~Ĩ�:�������\c�(ըD�����<�}y���y������AG:�D��-b��~ ��$9W�ц�p�H��s&�=É�-��,��t]��m�@cp�m�F]�&�]���]w����'B+��3�<�������܃X��)��Xg��;~���a�q��~��H�Zg8]�\���"�Viǣ���p;Ny�
-�x�{|����(���Q�Y�k��$�-8�Q�@}Ȧo����,vp=6-����a���Pm%~��j+��6P<U�{"ߠ��.�_^f��f���I�CTD���+�40FP����6����v�Cˍ.��Viٵ;}G�Ac����"׏��.�-�ѧ���w�>����&�!?=���>���Y�s�X����%��An"����=f�#mB0Ƥ�x����u*o��Q�W*���ʫ�BT����� f�����endstream
+/Contents 91 0 R
+>>
 endobj
-21 0 obj <<
-/Type /Font
-/Subtype /Type1
-/Encoding 78 0 R
-/FirstChar 49
-/LastChar 52
-/Widths 79 0 R
-/BaseFont /DZUJME+CMR6
-/FontDescriptor 19 0 R
->> endobj
-19 0 obj <<
-/Ascent 694
-/CapHeight 683
-/Descent -194
-/FontName /DZUJME+CMR6
-/ItalicAngle 0
-/StemV 83
-/XHeight 431
-/FontBBox [-20 -250 1193 750]
-/Flags 4
-/CharSet (/one/two/three/four)
-/FontFile 20 0 R
->> endobj
-79 0 obj
-[611 611 611 611 ]
+95 0 obj
+<</Type/Page/MediaBox [0 0 595 842]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /Text]
+/ExtGState 98 0 R
+/Font 99 0 R
+>>
+/Contents 96 0 R
+>>
 endobj
-78 0 obj <<
-/Type /Encoding
-/Differences [ 0 /.notdef 49/one/two/three/four 53/.notdef]
->> endobj
-17 0 obj <<
-/Length1 786
-/Length2 1532
-/Length3 532
-/Length 2110      
-/Filter /FlateDecode
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+24 0 R
+31 0 R
+38 0 R
+43 0 R
+48 0 R
+53 0 R
+58 0 R
+63 0 R
+68 0 R
+75 0 R
+80 0 R
+85 0 R
+90 0 R
+95 0 R
+] /Count 15
 >>
-stream
-x�R{<������hsr{]&��K�ZFM�m��43�̐�"�)�\Rf����
-eх��$5�E������y�����	t($B�5��_vI|*�I#pBY ��TbF�B���-�h4� *�ϻ�/�r�:���@�"�b.�-P��@|�@I�x��Ǵ�P\*.c@�0F����-�u�a
-���Z����KKJ�.W�ymO��-Y�,[c��~��X܆��w
-�\ݯ�����fҹ_���k��ھ�ד������t��Ý���ߜ��>e&�b���eE�a��H/��լ.~�����֨*�"��a����gf���W$R�vū����M��]����]����4�e�Y��(�o�1�\yU�f�1����C��o�����f.M�����������d��|�=���>�8�w.���	}���G���;$b��>lӌ`'��gΉc�V����A"��������
-�pፒ������gJ��E�3�Yw�ü����p?����Y����R�L|�i�}�A�v����u4��|�h����eKQ�@Y����xm�y᣻au����c�����Z� �h�(�
-��{�,�\����LJ����\�endstream
 endobj
-18 0 obj <<
-/Type /Font
-/Subtype /Type1
-/Encoding 80 0 R
-/FirstChar 49
-/LastChar 52
-/Widths 81 0 R
-/BaseFont /ONLMXB+CMR7
-/FontDescriptor 16 0 R
->> endobj
-16 0 obj <<
-/Ascent 694
-/CapHeight 683
-/Descent -194
-/FontName /ONLMXB+CMR7
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+>>
+endobj
+7 0 obj
+<</Type/ExtGState
+/OPM 1>>endobj
+22 0 obj
+<</R7
+7 0 R>>
+endobj
+23 0 obj
+<</R15
+15 0 R/R13
+13 0 R/R11
+11 0 R/R9
+9 0 R/R21
+21 0 R/R19
+19 0 R/R17
+17 0 R>>
+endobj
+29 0 obj
+<</R7
+7 0 R>>
+endobj
+30 0 obj
+<</R15
+15 0 R/R13
+13 0 R/R28
+28 0 R>>
+endobj
+36 0 obj
+<</R7
+7 0 R>>
+endobj
+37 0 obj
+<</R15
+15 0 R/R13
+13 0 R/R35
+35 0 R/R28
+28 0 R/R21
+21 0 R/R19
+19 0 R/R17
+17 0 R>>
+endobj
+41 0 obj
+<</R7
+7 0 R>>
+endobj
+42 0 obj
+<</R15
+15 0 R/R28
+28 0 R>>
+endobj
+46 0 obj
+<</R7
+7 0 R>>
+endobj
+47 0 obj
+<</R15
+15 0 R/R13
+13 0 R/R35
+35 0 R/R28
+28 0 R>>
+endobj
+51 0 obj
+<</R7
+7 0 R>>
+endobj
+52 0 obj
+<</R15
+15 0 R/R13
+13 0 R/R35
+35 0 R/R28
+28 0 R>>
+endobj
+56 0 obj
+<</R7
+7 0 R>>
+endobj
+57 0 obj
+<</R15
+15 0 R/R28
+28 0 R>>
+endobj
+61 0 obj
+<</R7
+7 0 R>>
+endobj
+62 0 obj
+<</R15
+15 0 R/R13
+13 0 R/R35
+35 0 R/R28
+28 0 R>>
+endobj
+66 0 obj
+<</R7
+7 0 R>>
+endobj
+67 0 obj
+<</R15
+15 0 R/R35
+35 0 R/R28
+28 0 R>>
+endobj
+73 0 obj
+<</R7
+7 0 R>>
+endobj
+74 0 obj
+<</R15
+15 0 R/R13
+13 0 R/R72
+72 0 R/R28
+28 0 R>>
+endobj
+78 0 obj
+<</R7
+7 0 R>>
+endobj
+79 0 obj
+<</R15
+15 0 R/R13
+13 0 R/R35
+35 0 R/R28
+28 0 R/R21
+21 0 R/R19
+19 0 R/R17
+17 0 R>>
+endobj
+83 0 obj
+<</R7
+7 0 R>>
+endobj
+84 0 obj
+<</R15
+15 0 R/R72
+72 0 R>>
+endobj
+88 0 obj
+<</R7
+7 0 R>>
+endobj
+89 0 obj
+<</R15
+15 0 R/R72
+72 0 R>>
+endobj
+93 0 obj
+<</R7
+7 0 R>>
+endobj
+94 0 obj
+<</R15
+15 0 R/R72
+72 0 R>>
+endobj
+98 0 obj
+<</R7
+7 0 R>>
+endobj
+99 0 obj
+<</R15
+15 0 R/R35
+35 0 R/R28
+28 0 R>>
+endobj
+100 0 obj
+<</Subtype/Type1C/Filter/FlateDecode/Length 101 0 R>>stream
+x��YXTg־���2�y����������"={t~k�����	�+�{uM`�#�+c�7�WU�Z�����+Ǡ��]�b�.Nw��Nܾ#�o��Ne�T
+T{hB!V�*�����J��F�}��G�ig��O�䣚G�
+�j����G^�����4���hR1�U^�9ѿ�cp-?�V�vtLfS
+4�R��`�k*TZ
+���8�A]4�u���#���&C������S�2� ]�i}5���u�Bp�9T��&��4��2w�3��?��;��K![�TBR*���i�`��=��]���'���1y��(E�F���2����#hî3Hto"~������e8�4�۵�WY���Jn�o���.����p�<����#h�����?~�X$�-*Z&}|�%z.e+��}_i��5�aK�*4�~�AF4��+Bg��tU�A���n�x�?E{M��>�Mt?�����{�=
+d�bC�"B�����.�⫶���d�4����xW��1��|���)c!��,���+6T6{7�_8m��㫯ۢm��h�=��u~����w5:ەWt�E�,�-A�u�#����ߴ�WҨ��؄��#�g�P)�*,Y�'AS`� �mʯo;mF
+����.?���s	����Y*��Gs�P���	5������(����|��/EJ��;6�h��'=���8�&:	˜�YUA}}`��%�	��cٯ�o�^�֜�]��º�4������m}q�,���v0waDd�&`G�,5)2���9lKH���G.\m�o��5�,��2]IL\aRI^yvEiR�g����f�yUm�%�_F���^��+�-����[��a�i����1�=�	�4�֖`��� OC4�O+�n������gMʛ��{�ω�c8U�&#�DH��a[:�3��rN�]Y�#Q`��3�@���H���Rxr`cu�-sR��Ӧ�0��Y.���9�29E���d}������Շ�>O`^�$B��淢L�:ls����W�c|=��2�R5�#�M��9Ͽ���ơH�4T@�I���0�~gQ�x������%��������%��~�}����ի�c�`��ެ͂|��R�H=���s�֕��'�%ŀ�����<�la��|`r!�X�������>d૧�޲崴w���exsc�m�p������z�c#�+��i�S	�����}#8�bF3�/��Ub����m�"\��4d�����K���'��A^����D�������XHl����\|�� zizU�1]%1���j/Uf�Ȥ?d�pcH`ThX�)�[e�9���xu����ޖ���=�����\C��,N�+o����F�j�B9����H�X��}qeD]���!I��G��U�������]2��&ZRT��OT���/(�%�y�'FQBQ�j�`�H�<aVW���S�qaB1��R���b�ѳT�b�)7�r>A�Ew��ҽ絯'�U'D͚�R)��QH$^gW�eD>�4kՑ�.N���0
+�6+A�^�������(�M���F��zȸt:/�6�Q8C�*BȨ�R� ��\�'�D�NHJM�q[>��]�v���N���k��!W�O�u�:�������#�Ic�%�)@��8�D�0�����"X�QAl)w3����8�,2��ࡄ��@�g�}�+[K/����LU!��.3�������g�䐓s����S�ȡ�!ⓓ	�#���Ķ����ؘ���IvA�d�F�k������l���ZX�E�VЊ$v�+����B��A]��Kb7�s!�91]�r��R��T����U�vpֆ
+H�ZM���;��͖ի���}hSW
+`�ҧB1��|^�oٔ#/�'II�*�j��o��D���R�O�ா���������|��-�[n��(_�G����7�.��?���ڜ��vF�#��m��^-�F=�ٮα�a�;Mp��i9�qN%쇦�J�jw�c��@/'aoYќ`$�������┝؛��(�ԁ"I����h��i)T��8�;�����2��gq�]u�'�>���X���F���d�x#�[}�>�'�3
+�>��יe�/e���"��F��W�а��&CQ^��:�V��i�%%�TLZ�23�֗�'g����i,I�.��h5�q����Pb=����'-�U��	�I��c�Ӹ�y�e���߆�����#�)J�B��#O��+�n�Lv�$a)I�V��,���@�j����Y9yB�(�����9�'q����e�ٵ���PH���+OP&'�8�$�[m'����7F�:lM��[(疘wE�Y�/�~7��+a^�����1�u���c���������)8���7����-���+�����]�y7��f��Ĩ�c+פj"���I�2#������ټx�(x��S����	v3M����m-E"��g7W\{�@���>3Yh|���S����d��m���x�V.^�P!����,n#��{������-�5>d\�Bn'��@Fāf�`�گ.�d#���a:9B��^n��������;�%A*��UW��!�[և�l1��{6ҟ	඲荙O1����Ch��!�(��,Uf����,:es������`�I��>HBK-����Tm͉-�&F�n��[I#[s48��J�*+�|Ӷ�M�5�h�,8��$�����<.�o#��I�,ԯ������N+�c�+����_r+�+�ԕ�#���<�s����>d
+  A&L6y�XW�%�+��7�P�'+8�6�B�f8B�����ԥ  clef���l�|��|�'���6ta����m�y�6+Sa��z�Ҩ	����6�63���ʥf����1=���@4Dė��f0#�A�*p�$��7�a%���V�(r9,�(��k��%�׃y|���T�:,�U%,b��%��}y�H����9;J��,~s�ID"���_',zi3�#������Uۼ���`�f������\/,�7�=X\�*ZX7)���D2����kJQp�����zv�n��۫�C���?�
+endstream
+endobj
+101 0 obj
+7650
+endobj
+102 0 obj
+<</Subtype/Type1C/Filter/FlateDecode/Length 103 0 R>>stream
+x��W	TW֮����B�ո	.1F�%*�n��}���
+("��n\"���'�먉3�����&�+Ќ'�s����߻���aX�����+�f#
+V+��;�vp�����ٺ=��I��x(�cf�n���{x@����
+���	�e�y�Ӧ3�f3��2�ƃ�njd���f%��YżɌeV3�of	3�Ϭa�2n�Ɓ�c�3��2N̫�f,�c�3?�����6i6O�l�l#�������.�;���(�{Ů�笞W�g��ך^&�ͽ�ޕ}�;�������V���iB�]fz,�|����,�|�F�����Zo嶃?���׎Ѥ:O\�4�&�8M���[��'-J��r�U�3��@����G���ے��z�Q��;���+Wk����������ـs��3����A��h��6c�$R��=f��!�㏜��8�F���uzuvvR���MK�]'\�J�x‘����pr#�Q����8{�5š�9���!ɛ���q��P����HV������5�����!7<�>���v�������B��MzH&��+C���A��R� ��������%�ׅ(��L~�
+���A��r;X>�Ŋ�GG�fQt��A��"c6�s�rFu���ڂ����@N+����d]�~�&��c����C9-�x������+uy���>I|TY̞=eU�����*6J���\�T���+o��u����2i�)�N�p������0����%T�1!Ci	bVvJzfvXŦ|�!d,�C���u}�9#�-��Dy/�x&fT������H/7��Z�ud��Na�t:���K�0eѢ�p�����s�
+�x�_P����eG�?7D.������g��/��n%�K�ҏ����4rC�G~u��]��[�>��4�M�A-��`D�Bh��������de�3/�H{�ΖH�2�+�JK�2on��3��J��S�Q��>��׬b����8rk�����_�T�UiQ"[p���Q]5<��R����~]�lh�xk�|�:3��po�m��+��:�
+z+�C��]���)�~_���\XG9�����z#G^'ol 
+�~󡥵Z�	4?�m*SԘ�Q�8*��'��kl��� ��Y�=��(�@i��i�������Y�fB�����I����w��0/I�+���[�`�$�#���+_��(���i�'�P�}��Հ{Y�y�Ų��~�p�U�U��N����T����6&���8p������M���A06O�����1i���V�7�ːSn��*+hU�-܁D=���d���M��0��ɵ���n�Q��M����G[̘_�s$�#�uj�V�<c�Ĺ�W�W�G�=��顙m��Q������T �I�L���"}�ADi�)|w|`2|	
+N�=�s	e�T}L��@RCB����F+�m�����5jB�S���S_���߁��mp	Q`ޤ���Z���m-,o�}|Kh��64T;�����H&Ջw��W�5���͡���֦�--_@>�$$kEݶ�:]�>Z����t��Z|�U�����Y�'�c�٪���$��2�? *����~x���	����}q��S��&���G=U�utW���;�$Y���q]�>�+�+نl�5NMZ�rK�.2��%eͭ�h�a�n0���u{���B�Į��ĉ�t�z���#H�~����=�`�����}Jy�9�.�+>��M{̕�g7~2�������3z��QD��A�f�
+�<��5f{��m;91^��E`+endstream
+endobj
+103 0 obj
+4070
+endobj
+104 0 obj
+<</Subtype/Type1C/Filter/FlateDecode/Length 105 0 R>>stream
+x��V{PSW���[�j�ێ�VTt�XmpD�����%�B*�� �<x�(VQQ����ݾ���ݞ�L����3;�drg��~���
+EӴ�8�����������'�\�n.Gܧ�����В'(Moܲ�&�$%$*=��z��o�D��'V��L������ٞ$�2{��oJ�G�sG�G�$]�Ȑ�(�����G�,^��R�&Q$�+�T�/Y���z��m�6Q;�0*�z�
+��)?j'B͠fQOR��9�'5�z�܎b(�g����+.O�$�������9Ϻ�^�ǩ)��V����ݱ�;���j+Ԡm�&K��:N��E��K�8mZ��6�c�7�����z~l�.<��~c��������[��!rD�dq��-���Ѵ;_��N���j��t�������@/�� ���!��%g�>/R��A���c��`������X�Dh���+��6v�2�KW���!���L�`�x�=��`�r�_�ɇ<V]}��66��������"����] ��B<l;�0i"߈L����C�4�.n��‹E�mɯ.��
++������Ym�̆���l;F�~CL�ޞ6���
+��?��.b��T�ձ�@�"�+gc~a����OiM��,���yG$�ݲ���K[3͹�*��1��6�Fŗ�A������؝�M�Q��5���#�ߟ�9��P%$t�6L������x}a%�[F����J�G����C�v쉂Tb�W����q�Eוg/{��������2�<l�s�F�s���ei�yjKVK��������b����r���F���{����p���ڰ~���+N@�/b :�[��E@�v{sC�0H�v�3��Cr8��\t�.�}D�9��@e��M���'�,S������֨;X+����BrH&����GS���������S����2p
+pډNzYI=�C���������#�=�=�QE,���sW����F��^�lCz7���D'c�#~| vkN���-����z�6�����pc���ܢ꬯�4V��+BɌ`q�����y�?wY��A�؀/���2[[}wG�EV�])oygxp؏�X�r�o�G�t��F�u�[�z�	��n��;"�&�^��wOWɀ}n�y	x����T�v:��k�+c_4{�ndstream
+endobj
+105 0 obj
+2508
+endobj
+106 0 obj
+<</Subtype/Type1C/Filter/FlateDecode/Length 107 0 R>>stream
+x��VyTSW�@�,m_��df\kE�C��X�ZDԺ+�������#���E���f♿��lӔ�)�ESg?��ܡ���9��=r�����+p����1�E)����z�Y��ݦ��A�����T'��W[
+A�Y��UL�i:��[��
+�Y\'�����T�C�ӭ��mT$������+��+v��|QvZ;q�K$<�
+9�Lp�}�!x>~?�Ȼ�e�+�>:u;�|��/}.�����Ds?��#�4A
+4��E�?����Ĉ�,��gJ����q���D:�m��+�~�5s���z�hȲ�����4� %����~1�3����*+
+�d����lM�G;�R�
+M)�-�ψ�=M�h�$������-'P��,��c�����]���Qbdd��2ɻM�FmMaS6$�����A�h�+�����������\��>����#�jg�n*J�l`�~j�TK��|�|n.’z�l[
+�9$���l�����9�����x1N����i۹���
+��!�9���h��s!�B����:��k��)��l�p��������u�����x�G����o7z�t�0�i��ZM�#����ޑ���x�xݢ���bf‹yN���$�w����)נ6��MdҴ�A���?�W�Ǡn\�&O�lώ���t4o�������ֱ���WнF�Ѝ��}�gw���t���}rt�~96�A����z>b�7Ь�	fd�F�k�5��g��}T��]�Q 	���[��풊7,3������6����+!��&����H����= #Ś�O<��n�q�,qo�@:~=@ZH���49����	%�>'�C6��Y����jk�֚#UG[r�0���8��`I���WR����]�ǹ&�w4��W����� ��Px\���\��ֳ��=c2��;�������q��(X	��}1��cs�k�s��Wm����c���p0mW���vfM��_��ۛ�!1�k*j{.�X��W��IWY鱶�z�;A����ޤQ�]��ܾ��Ȩ�}�)A�ӗ��ՙu� �&�*U}~S�{5�Y� ���BU(��8��^c�6�������M��6�3��!
+endstream
+endobj
+107 0 obj
+2471
+endobj
+108 0 obj
+<</Subtype/Type1C/Filter/FlateDecode/Length 109 0 R>>stream
+x��VXT�>��P�F@m�G*^������/@	��!���(3�Ό� *�"��b�y��~Y}��L�ͻm�f��̜��{��
+��Q(�9A����4�zR	$t��еX�wm��q^_׏Q*3B�MMJ���5�|�O����$R㢣}����(�t��9���+}���eHM7�:�����f2���&23���Ɇ��3Mqi�fů^����a��W��f>3�Y�bf1�Ù�0ʌgF2!L83�	b�0s��&��ICf8&������2ҥC9Gy���D��n$�����������qv��b��Ґ̀��)�R��[)%vjrv��,H��܍�D�;�����������%�{� �q:�d��f���_A#5ɑ�
+��NE2X��.��o��uz"KW$�^�E������N[�8T\m���T�Ԡ��Q����pdJ�Jϝ-�9����5I}���J�i2���Zc��zG���3_!�����_��,#x�����"&�������������]N�������Z����#��'�tJ��N}��
+�n��g���z1�{C)���*��y/i׽�>��,0p(��4���w�mπ�]��ϊ>��Ǿ]MM���}��#�!S��ZtR��q*w�=~���k �_Q�����tbqm��&����iێ�8N���4��@K�\G�d�(j^/
+�+"��������řȈѦ���O c�xEW&Wf隌���y�_8e,��N�_�k�_y&Qp�a{�
+�h)Z޲ێ��J��Ս����—�{2��У%?Kd�m�oH��$Q�n�5�3"����X����8�t��C7�^���'u8*]���򪶻�̝��N�KοHC��؇-�CPWo��Y������)�R�u}�U��OLK�y���ek������������%7���F␥m^���_eo�g"g4R��1������Jy3>/��Of_�o+���+X����C�K�A��U��G;=�$쏁���Kn�4+a����
+ٺ��A5O�v}�d��ܽifo��M���^(�bc�]%���8
+��R��q�g�Qc�Sã!�ϖ�۵�+��J:��Ѫ�8������FK�5Ra�-I�9�ZJ7䁥�`����D6�b��x���A�.p��!ċ�2�v��NY*i�̌ͅE[t7Q�.d�*F�޵�8l�m��?�������Փ�|��x�%����k7@ ,����d���:�XQ�s��I���[����
+���%0b)
+�8
+�9dJ�]�P���K`�W�f?2�������AR�7u�>t������J��Ѐ�6�`l}ddl|-�m��_%X��%�LҴ#�kcc��)~��y$��,���c'���F��82-��L��}���򳫵Yy��Ԧ8��!���t���7(����\=6iv}4���]A[Ia1F8X���ݐ}L��ҽOS��;�{���[�endstream
+endobj
+109 0 obj
+2974
+endobj
+110 0 obj
+<</Subtype/Type1C/Filter/FlateDecode/Length 111 0 R>>stream
+x�cd`ab`dddw�44+endstream
+endobj
+111 0 obj
+237
+endobj
+112 0 obj
+<</Subtype/Type1C/Filter/FlateDecode/Length 113 0 R>>stream
+x��YXT׶>��cW�9�Xb�=�&cA���H:��:��:E�]�b�c}1��cb���Afr�����{��k#�,-(�H$Y�>}����0��
+����e�ka��ӆSb���š�c���~��޼w��}��;�Bܼ"� �m���ةNAAko�;��F�84xwd���-t��4���e+�bCv�-
+ݹq�>-	۵j���s�ߚ#�w�
+\�&�c�'�>卩�?�f�w��5�z��}D-��RoR����#���r��Qc�5ԇ�j��ZF͠��5��@��\�Y��j95��HyP+�9�ʍZD�Km�VR����
+�G��|�i$������Kz�F!@z�r@�
+B!(��;9�@銤��7�J�UG��F�|�0��}�7�lU���j.���ǧ�b��h�%����"�f���Z8��iv�oa
+o���)�:/A��)�*��2���a^�vŹ\���?Ճ���F���|������Pwm3�`&]Fl��l���ͱg��>[�Jz���'��d�O��þ�\'����D�6��+�Ӹ�N���� �њ�Q
+��!�NS���~��ă����7�u����#������3�D��\'ErĬ5��$0�ω�B����o���
+#J}�K�P)*+,,�����0���,%�\K{�LyJc<a�<u���<.��aAS����u���gPsk��-#ǭ'�h�6/v��I�����y\�����y�禝�f���z�X���%��:��?L��������7n^u�6���q	w|�+������X_$?��+ꉹaH�
+��?hm��}4M��m��ؤ�r�d���|t��_�ΙR=��x��Au�����44L����o0ȴ���[=��5�6q�,g7b>4�T���F��-!��hXѓU�l@�x!�^�����*
+&���>�,b��l���N��H� 
+�Uo ��%A�]����7%�D���7b��&�~�~�c��ߌ�6�Q"��:x�;c�Bw���t�͚���Orx��#)���������A���&E�ϟ�ڣ�n����	��X��Q;�¯��ax����� 65+&��ܰ.%-DO�˨.�e�.���H6H���F�?���v�Q����EM#�.dg"�&��%`Չ��&V�͢p�7��[�j�p���֐x[�����k5<��&������r������ɝ�OH�����3�Y��M][��<���������utyC͎3����ND� T�+C�'O�a	�#L�7�����G�ׯ�<�$�q�녫���~���5�%�}M]-����x���{�8ޛö�
+��ϐ�Io��vNڌa���)�d���T��W4���<v�;o��\
+[�J��hA��,�����˰��|q��'������p����_�m�?ݏ������S�ⴼ��.�T���6mb*kK�jcZ�mR����s�W��6�J�O������~�F�]ߴǞ��x�G�:%��JG�eIeJ5����{����9ZU���������m��X�7��Qu~�>�4v_Z����{�8�mE�b.?���TA�c$�f�Z�|.��C��'K���n��+v-����O�<R��R��$Z�b2TY9}R!�=�01|+U{	�{V�%U}F�ì&0����.�b�Κd���F	�:�}�.z/���w<L#$�~|t�M����d?i�֡C̷�9�ԜI	��ͩ�t5jF��5Q(y!W\X��߇�+u�h%����|�bW\(:~�L��"4��Չ衁8g�*���������|�����b	|o0�2��r/�o������k�$�6BЈ����E�R4��Tj(�J������n���4~ʨ8N鶆������g���	�Xc{ì�<��M���Aa���	
+��
+���kj����>s
+*����6�ؾjA���Wc���RY؇Zl�ۚ��.�*�-s�������6�8Vy���;Nހ����Ko�S'#.8���-^�`β���eY�D�G�`h��E�{b?��
+�Q��㟞��W#�heU�T�sq
+��1p���ѓ�ڣm�P������	"}pJ̖e�r0ڈʨ�ȸ�~B�`�|���__	��jЃ��O��W��@jj+^�@G�|��̸f���^G�i���;zH25���RO;�xx�w=�o��e^5�{��C�35��NT!$���?Z�K�N^�E����Rҙ
+	����ߒ"��`.3��ڪ���b��2�ȑD�Q�����,��Q��njI\*A�"���g�����Yh_��:��F�&J�hek�N* F�}z%������hQ�&��\[Ԯ�J��S��"�ϙ�%���4�i���-'�$"6ߕ�d����R��o�l��n�j�U�����E����m7\�eV��O��2s?��=�{|*P�oDը����F�+^^��n<�4����v��и�����9�&��F�������ՖŹrX.�y)K����!Q#�g{'�d� 
+��G2Fhh+�@>��!D�����)g[)����Q=ʫRU2����^�#���mn��k=P�b8��j�a�X�[P�B����UFG����+J��-�S������i��;����Rӳ���5?���[}|�����>&1\@���[�ォ[�X>�Q@*�.d�%G�+[d+:��
+�v�y*���_{�cn/������=e�r���9����H>0L���!����\�bڎ��������OW)j��\ri��t�?����v�׃�54���(i��t\C����"Z�r�����."��c�\���C�������(Yp��_/K����1�����=z�3�c��D��xUtC�����������`���f7���b]��h�"_�O�s��E%*����]�e��h�v���'C�c'�����������
+,�RWeg�2�R�X�B��W_���C��D�+7���-�v�۱��'��{a���m���u��9w���k�o�a�UGM|2��P�������K�^w�/�X�v.o�^���!��A����7a ����ܼ�|T�Ūä��UK`$���Mħ����<n.q2�Sy��e�z�G��|C@���J���_�f���il��_��P����@���+��
+<@7x�~�+�?
+endstream
+endobj
+113 0 obj
+6149
+endobj
+114 0 obj
+<</Subtype/Type1C/Filter/FlateDecode/Length 115 0 R>>stream
+x��WTSW�>�Q�����p�C���/T���ڊ��<�	������b��UEKm�vl�h{�.��3���ջT��ܻ���V����j�%��l����ȩ�;��9���Eh�䵐�E�Mo��]�<\��e�\����23^*�����R����.�����iz�4F��O����lI���'S��N�I�n�}}cz\F|f�֎�Yd�<�������B�Nm�ޠ6Q+�W�g�eT��^�vR�L��B�@j����Im��@�Prj)�<�
+"G�\t������s��x���f���{xގ���v|������'�����v+ߧ�S��gڶ
+}��7��a-L�J
+���`H�e�~us>dBeuEU��r�j�h
+��t��� ނ$a�hV�I����M��Nӭ�~֔ݒ��Y$�8;v�d�՟�m�I���g����-u������+^��0���*��A�1�{�eO ����;�o�Ԍ�0����ʥ�)3��M�
+�^x
+K�����G�!W+��X����_�����:�ܑ�����^Gη��D����8��+Q�;�a
+/‹x�C�����D���N������#p��w�E��hS�L�WD+P��e�BD��:	#����c�SpNd�|[�L�'�DO"��L=|��]���#�����}�c�
+�9����j+#%�?[-_[�xt�/�_�E��>�e4IR�5��2ڈ�����mϠ\�k/t_��⅞nx!����:UCQ���R-��@8�����z�g��î5�$���w��ɡ0�y�&~�=�W��=�V�p�W8�����eW��(��v[�T`���̛�lK9����[�u���*�ش�\c_{���]x<��ߡ��ƉD����?�'q�t�B˯�ɻ4�<�����������)��<lgb�/�k��F�b^V�*��NfP�;�#_����p��z�������Ӱg����+JP��f����-���<}0Z*Fσa[;~�5��Q��y����d�Ij��ф����_k*����
+;{����l����`$�Ƒ�T�G����@�z]�������F����|V����V4���Oo�i�æ�B��Vzyd@T��+/�0*���!g�ٝ�b��y7x+�)I
+`G��������z��^�uU��f���J��Lՠ�ʺ|}�>�����Cɵ*�y���K�����m1���|(m�S����Ԉ�t�቏N$����k�� Ӆ����O���)שt���C�t����AI
+�����l���n�ޝ"d7��0�� T�q�*6�2x�����������-w�!)r@��w��r��I����cO��t�R��MD�V!�+2�Y�Y�����^���AP2�����k��<N'�OO����ju�%j�+K�й[gM���F.]����21ڪ�����J������j$����ss
+
+$^^����35�����v:zbfj��7��c��Xc�o����d��m��@]M($��$�����:�<*ɘ�<X�����	���sDW)����b��
+S�llA)
+b�g,����up�lup���qf�ndstream
+endobj
+115 0 obj
+3328
+endobj
+116 0 obj
+<</Subtype/Type1C/Filter/FlateDecode/Length 117 0 R>>stream
+x�5P[HSa+��+68�x��&No���C\���N�x��7n�[���s�#o�+~!^OR�Z��-,J���6RA���ؠbˍ�8��h��rJ�������	�P�A%�k�a]�<Xi\"���C�гq�6�waEVNf��'=�������!�6y<��SEJ���������kD!ek/������b�K
+/�w��(��G;56����]Y���!����i��������c/����:rϛ��}��&��v��_EɂX��@�3(W!��vw[����6�F=;֣f-F������V��,��+�q�o���~�"k��(!~!�����,t3�endstream
+endobj
+117 0 obj
+656
+endobj
+118 0 obj
+<</Subtype/Type1C/Filter/FlateDecode/Length 119 0 R>>stream
+x�5�_Hq+I�����T�t���:P�QJ[o;�D:|0��׶���<6����q�������z )�b����D�i���?o��n�/Rß>��k̻fQ�-b��	r��h�Gi!D�N
+a����}UD�J��i�:��9R�cٛ�G�E�H�[�DEI�6>��%4�.����7����'��|1�=�kl��[���k��/�/\�4ŅAtRŋ�`"���pz����"z�+�)�E>��r���lx���TmH�"���	�Qu�\4�'� �;Bw��G�D+endstream
+endobj
+119 0 obj
+655
+endobj
+15 0 obj
+<</BaseFont/ICLHMS+CMR10/FontDescriptor 14 0 R/Type/Font
+/FirstChar 11/LastChar 122/Widths[ 583 556 0 833 833
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 500 0 0 0 0 278 389 389 0 0 278 333 278 500
+500 500 500 500 500 500 500 500 500 500 278 0 0 0 0 472
+0 750 708 722 764 681 653 785 750 361 514 778 625 0 750 778
+681 778 736 556 722 750 750 1028 0 750 611 0 500 0 0 0
+0 500 556 444 556 444 306 500 556 278 306 528 278 833 556 500
+556 528 392 394 389 556 528 722 528 528 444]
+/Encoding 120 0 R/Subtype/Type1>>
+endobj
+120 0 obj
+<</Type/Encoding/BaseEncoding/WinAnsiEncoding/Differences[
+11/ff/fi
+14/ffi/ffl
+34/quotedblright
+39/quoteright
+92/quotedblleft]>>
+endobj
+13 0 obj
+<</BaseFont/UZYZOC+CMBX12/FontDescriptor 12 0 R/Type/Font
+/FirstChar 45/LastChar 120/Widths[ 375 0 0
+563 563 563 563 563 563 563 563 563 563 313 0 0 0 0 0
+0 850 800 0 0 738 0 0 0 419 0 881 0 0 0 0
+0 0 0 0 782 0 0 1162 0 0 0 0 0 0 0 0
+0 547 625 500 625 513 344 563 625 313 0 594 313 938 625 563
+625 0 459 444 438 625 594 813 594]
+/Encoding/WinAnsiEncoding/Subtype/Type1>>
+endobj
+11 0 obj
+<</BaseFont/ITYNZM+CMR12/FontDescriptor 10 0 R/Type/Font
+/FirstChar 44/LastChar 120/Widths[ 272 0 272 0
+490 490 490 0 0 0 0 490 0 0 0 0 0 0 0 0
+762 734 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 490 0 0 0 435 0 490 0 272 0 517 272 816 544 490
+0 0 381 386 381 544 0 0 517]
+/Encoding/WinAnsiEncoding/Subtype/Type1>>
+endobj
+9 0 obj
+<</BaseFont/GRQREI+CMR17/FontDescriptor 8 0 R/Type/Font
+/FirstChar 39/LastChar 118/Widths[ 250 0 0 0 0 0 302 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 693 0 0 0 0 0 726 0 0 471 0 0 0 0 0
+628 0 0 511 668 693 0 0 0 0 0 0 0 0 0 0
+0 459 511 0 511 406 0 0 0 250 0 0 250 772 0 459
+511 0 354 359 354 511 485]
+/Encoding 121 0 R/Subtype/Type1>>
+endobj
+121 0 obj
+<</Type/Encoding/BaseEncoding/WinAnsiEncoding/Differences[
+39/quoteright]>>
+endobj
+72 0 obj
+<</BaseFont/FVSMAJ+CMBX10/FontDescriptor 71 0 R/Type/Font
+/FirstChar 12/LastChar 120/Widths[ 639 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 350 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 319 0 0 0 0 0
+0 869 0 0 0 0 0 904 0 436 0 0 0 0 900 0
+0 0 863 0 800 0 0 1189 0 0 0 0 0 0 0 0
+0 559 0 511 639 527 0 0 639 319 0 607 319 958 639 575
+639 0 474 454 447 639 0 831 607]
+/Encoding 122 0 R/Subtype/Type1>>
+endobj
+122 0 obj
+<</Type/Encoding/BaseEncoding/WinAnsiEncoding/Differences[
+12/fi]>>
+endobj
+35 0 obj
+<</BaseFont/WNYVFJ+CMSY10/FontDescriptor 34 0 R/Type/Font
+/FirstChar 15/LastChar 15/Widths[ 500]
+/Encoding 123 0 R/Subtype/Type1>>
+endobj
+123 0 obj
+<</Type/Encoding/BaseEncoding/WinAnsiEncoding/Differences[
+15/bullet]>>
+endobj
+28 0 obj
+<</BaseFont/BNGLQK+CMTT10/FontDescriptor 27 0 R/Type/Font
+/FirstChar 33/LastChar 125/Widths[ 525 525 0 0 0 0 0 525 525 525 0 525 525 525 525
+525 525 525 525 525 525 525 525 525 525 525 525 0 525 0 0
+0 525 525 525 525 525 525 525 525 525 0 0 525 525 525 525
+525 525 525 525 525 525 525 525 0 525 0 0 0 0 0 525
+0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525
+525 525 525 525 525 525 525 525 525 525 0 525 0 525]
+/Encoding/WinAnsiEncoding/Subtype/Type1>>
+endobj
+21 0 obj
+<</BaseFont/IRVDMF+CMR8/FontDescriptor 20 0 R/Type/Font
+/FirstChar 12/LastChar 121/Widths[ 590 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 295 354 295 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 502
+0 0 0 0 0 723 0 0 796 0 0 0 0 0 0 826
+723 0 0 0 767 0 0 0 0 0 0 0 0 0 0 0
+0 531 590 472 590 472 325 531 590 295 0 561 295 885 590 531
+590 0 414 419 413 590 561 767 561 561]
+/Encoding 124 0 R/Subtype/Type1>>
+endobj
+124 0 obj
+<</Type/Encoding/BaseEncoding/WinAnsiEncoding/Differences[
+12/fi]>>
+endobj
+19 0 obj
+<</BaseFont/WTBOIB+CMR6/FontDescriptor 18 0 R/Type/Font
+/FirstChar 49/LastChar 52/Widths[ 611 611 611 611]
+/Encoding/WinAnsiEncoding/Subtype/Type1>>
+endobj
+17 0 obj
+<</BaseFont/WTBOIB+CMR7/FontDescriptor 16 0 R/Type/Font
+/FirstChar 49/LastChar 52/Widths[ 569 569 569 569]
+/Encoding/WinAnsiEncoding/Subtype/Type1>>
+endobj
+14 0 obj
+<</Type/FontDescriptor/FontName/ICLHMS+CMR10/FontBBox[-40 -250 1009 750]/Flags 4
+/Ascent 750
+/CapHeight 750
+/Descent -250
 /ItalicAngle 0
-/StemV 79
-/XHeight 431
-/FontBBox [-27 -250 1122 750]
-/Flags 4
-/CharSet (/one/two/three/four)
-/FontFile 17 0 R
->> endobj
-81 0 obj
-[569 569 569 569 ]
+/StemV 151
+/MissingWidth 333
+/CharSet(/colon/L/slash/A/y/ffl/n/ff/c/B/z/zero/o/d/Y/N/one/C/p/e/Z/quoteright/O/D/quotedblleft/two/q/f/parenleft/P/E/three/r/g/parenright/question/Q/F/four/s/h/R/five/G/quotedblright/t/i/S/H/fi/six/u/seven/j/comma/T/I/v/k/hyphen/U/J/eight/w/l/a/period/V/K/nine/x/m/b/ffi/W)/FontFile3 100 0 R>>
 endobj
-80 0 obj <<
-/Type /Encoding
-/Differences [ 0 /.notdef 49/one/two/three/four 53/.notdef]
->> endobj
-14 0 obj <<
-/Length1 1842
-/Length2 13515
-/Length3 532
-/Length 14535     
-/Filter /FlateDecode
->>
-stream
-x��eT]Ͷh���$�pww��w�A���=��^�����^{@��>��FլEF��L'dbg��u�c�g��11����D���v����n-�����1��莣�;@��?~��%fklgbak`fc::z���bx1,lM��裂�X����s ����#�I�?��g���ᇶ��~����_�~HY��V6����+��9���̿�/��\��+����+��/����������s�ع|��cǏ[�__7����%�����,S�BJ}�-&��A������.ƃZ�v�^��*�Gڇ�t{��h�~��6�����q�!�O|x��4{s�*?�>Z��Y�8O�RT�*H��kCOf;��x��jhp9�J�Cik�JR�D��e(L3��]��Ln�=f,�q;!��5���������j����#`rFiD20=�:�OL�\,L����]�蕌]w��y����]E4��� ��]:�߹7r�s^���$b�%	����O&��,U<!_8b{��w/�]!��;(O��/���9��2�J؎1��[��Z
-3QJ��/Ӳ*`�dhk�v��Jŕ�B�I�l��9p�^��!�|�rbH������#^�<o%��*��zX�&���ֳ0�����A�����kP#��=��<D����y�I� �E�����hs�9*rGʞ�%��↶s>���g���\��l�敛d�֣����ɘ��<l�&{���͕Pu/�/PN��w����6�ώ@v�~�]�����m���,��u��NE(��Z5["I��%��*M����d�ND�l��_���t�M<�"�,N�<i>EUZ�7�@�v��07(���Nݱ��(}��s��~x�^�LCvj����.AP0����Pj|�)#j���t?bU	���\M������l�Z��+g����82�&"��Fk�X�?�K��H��f��!֌��?=�D��v�~H���n+w�;�4@�<���*�=
--���ڼ��^v=��惲w��@�V�˽A��b�;5m����`}��]��3�mPC��",��3*ה�K&Eo!������T۩g(��7Z�\sɑf� �3a
-6�5���)�o?R�)�iM*:�
-l��1�����?6#�x�=@������xpkS}h����o��a,	G �kpy���@�	�‡/��X�LZ�c�^�B#1O����|zf8G���̓�*z�v��K�����0B�����R�B����N�S\�C4��[[�90�׻_�	V^*�@H�����jtG=ut�Rg�f%̥q!̻~�LA�)z���E�%���y��{��X����=3����e�������7vB�E���`�C%tI��cz�k���R((@�C�u
-�Ձ�XUe���/yڞ��6]�ǜi�
-�D�}F�[_�v�������
-v]|���$:7WlV('������.�[E��7Z��>�-�rmk_X���9_�&�M���c���	�L.Z��9���.��]�����\*8�<z#��{�"�5q���)7g-��x+)�\/�uv�DJ�ot�ocd#�����J��6��p�Ҍ�)�YuH�-/�i]�W���?"ω�|��^qƜ���2��lR�)I�^٠�$�;ȧsG���w�b裷��Ѝ~��{��ɰ3L�Dr����PZ���7��>yc򑍅J��6!�"i��G�ċu���4�-��?�����ʠ����'��[{�������-���a���ײps��3�7t_O�#C������G
-�lAw5��Z^��|��.>_�r!�R���W�3��L����w,@Ҕ9G=�Mz�EM��27��������� �ͥE���`Ij���l��n�bv�Uf�48��yi@�����B�+|����Կ�E�����='4�#_��(!jj�����)�� px��1cnZ8KkZ8d���/7o#`�%�M�ܻ������\�M��F���7ٯ>0�6�_Yf����h"H�$�;VCb����j��67��m��ǚ��ÂY��X~�X�� ���0��fτ*�]j$;�|Kf�#�o�E�i�IO(����-z�4P��HxT	8<L	vT�#:q�<����0V��7E,�|�x��
--�RlѬ˔]������XcR���u��X�r���6��{Tv���"�ɦ%���#ڶ
- }��!������ou)�9����-�#�,cNʤ.ZZN5X����qN���df_�*O�����[��Ϡ*��ou���f�Z��K�G��v�;��-;N�DY����߲~���*C/���E$���
-�F�6�T��$�����'@�6��)��iu�$uF������v�,�J�>�|Njv�]I�����E���d�6�\5�*��{Ǻ����#����^,%S�����)�76L�����yȿ���B$���-���7V���T`PA�X�Y�-�J��v5JY('���G}�"*�Y7�����^M3[�H�����>�^��2�犪O��T-/�r�7��q��v+��3���/Ǵ��x�[�!�4��mG��	<4LH����-�T�D���(P94�-��T������sE� N9�cY
-u�
-C�]s���/���Y��m��U�Tk>Wp	�*���:���J�HP�)3�;?��vx��/��-� �y\	����"&c�u$�l.��+\bAI&�ei�G޷%�mX1�
-��T�Q3�Lah��X-�Xˉ�"�b��[�Q�,��p�d�Ӡ~ޱ>���vV�C(Y=䒾A�-(���D��kO���$�a�_���m͓�Z:B�#OYp-�	U���
-����.���r-��ʖ0��8�C6/���#�]@�Nk̨�tID:��#m�RL�;���6qgY��6���|
-o]����Pf�S;j���Fp%��}�m@M����u�X?ô�j̊M��{W��">ұ����"�KeoS�(�.�@�����P$�O63A�2{
-�EmB��I���cu<�����:+Z�:��>��>�a�����0EU�4#�)�M�hK
-ϑk͓��� *�"���u��5<��ń��R��z���B��~�^�;�*��u�����::N��A]4�@��1]����z�����-Y��P~�µ�s Zy���%�X��2�f{����G�%6�r����3&X|m�n�K`�����s7�Lk�b���W�-���ˣ���lAG�m��~.J۽l����і%7�X�u�^���������e���0`7
-��q���@9-�U�ƭ�y���k��8u�'�Wbqh���~�w<�$�k��~�}�N����fJ�-��7��F�F��z͗��sLFH
-AD5��V��.>
-��'�����XI����:nNo��h� �L���&@DO��M��J�����ëTG��kX���E��9Y���� ��l�����)�����-,0�-����s������~��8@8��zf�+���2�=��-gv����leM=������H�l2*k��!�*F���5L��ѡ��,ù�Y��m,�<;j����	Hc�W������u�q��L�zhD�����Қ0j��ϒB����%�q�u	d8�x5*lr8�N�ߊ��W����V�����}os*�j���VW
-zV\�-�DX̙+���5�{�i��l!������
-����U/�EWu�zJ���tM������M�
-��_]rzXyѯtV$�5���~���M��p�Ʊ���VpvD�����/X�-L�RO_Em��*�M],�&�vU������5M)YAx�ΉjU�6��A�����8帎d������Gp6�,�(76��"����FͿ.4�R݄��H�J��Ь&��t�� k�ቨ���'z/�D�h�"�ZMd�^��Y�[X�Bi�W���P�����ș[�
-\���F�-sqE=�(��~z��Mq���6�"���L��W���R�Nvrq�<R=�����+n|�*��:���y,Y�v��
-�X�P�2��3�4�d&m+�5q�acJ��A1c*G�����;���_<�t�U"�L`��e�?+��;&.�E��z�pf=a���.�r������v��h���A"�H��g���@�-&�	��\�;�����aWlwj?�%*:��~�pKU*Dr� ��&�-yBPssfH��&�9ݫ��(����n���.�h҇7"
-~���h��[�kI��14��-�y*;��/�5m�3��^D�m�ջ���8�e2΃-e���g:i֦q��ƻ�&��#��fOLTͨ�Hv-�6��g��3S~�l-#K�+<����^JQ�SS����'���zH����	�f�kj���Y��B���/���2٤��L"U�$Z��HX�''�L��ֈ����~|Hچ���Fփ�⣳p���"�����\hG7�k:�|��1�S���w��	��s��Ѽc�SK
-H�����pG{���4� }�VC��(�=�MKě�)꓀�_Y����j�J�܄��n�l��Zm�B�����G�b��vSLΐ�N�W))��,���$���"����BT;뫿�BmʤAI%��-��Wu_˸4�B��4렴5�b��@&i�U��N`6i
-3�.�<h�:��7���^�����$�SK���oD�D��g4�|w0���F�Cz3��������(��/��2b��hT\^Ҡ�g�`�k2e�:aӈ��jAhL
--���J�"�U�EinB�J.��롽�-����9Jé�����3�w��j�7�[GL,G����q����\�����8G���bHN�]���U��i��k�z��N;Էl�H��c�o2,'��z���������OD�\R�IJ#]q�)�k�_Y!��J�<_
-?5?w>�KA�9��Lf�������L�������-��%g3Ǒ��Ad�u6��Y��!T	�k(����ܮ����(�<<�ۗ7�	e����'�C��`#ˤ��]������#�MP;u@Y���?J`�ﰾI����e�	��v?����b����U��h��z���W%,�!���脈{,ۍ݇���HC����-g$��C���������R��	S�}?W�+^ _Ĕ��On7�#��U� ���GBٿ�2���M��K	V&�;N�ut���[�8�V<�Hf����G��b���vb+�Ȥ�S�U/�P�b#����x��S�J��6���&��9�X�R�3���a)|?��Y��Q,�`hՙB�Ow��q�'�=���Z�؞�D�8t��/
-���G���{���rwM�I������0�����3^C�\�~� jj����鋥�F�7� �SXvRA}�_���%M�ʡ_\"��!W5��f`���V�d�n�+Y���)@���
-�����w1���w��n��W����:��K!��w��������%Nc��Ӣ"�M�����7_�����\����֫����\(��ˀI�{l�W����7:�����\[�4'��$m-��4d��[���j�t�� ���-VΔ�I/�J��v#�c~�"���0����q��r�����������k�o��2M��z�����sHP�Z�ڙY
-�W
-���	�Ok��-�Z��\�����X�w�J`*�*8��H��t�����V̕�j��t�1
-E<�ph�\NP�l'�:BA�D����5�[MG��o�f���u�X{�)�FL��I�ȩd��aG�-t�p^7֌@��X�Q~����t��R�JԐu���M��:��	��\7S�-��=ve�����Y_4+q��I���LVZ�{��Ki]������`��K]FNkZ<��lm���V
-c!����ncZ�T���	N�9M:b:h�*�^���c#���~��m���D��Z�ʼ�o��-Dž/�Y4IG��y�M#(x��w��M����@s��y��%ON�i�������נ��4\1p�K��A����xN�n�)w����-�Q�0�y��tPǤI������[N��΢��e!�����l�0�ѝ!��;U��`SF���t�bRxi��sG;��o\ 2w�m�	�o?��|)��T���~7k�W��5[4�'�[?��|9����nj{��	{�b��k�v�>�ؠ���׼-���C���ww
-UfE����Uv������Y�	����O�hِ�G|-����,��d�[�{��EO�"&^F/\�J$��n�i�l5מ�#\��zD��<����6��DfV���tmw:mZX>P*�/����cr��6�\�3hT%�������P}�n_n'(��\����t.:����Tm@dgd��-���}E����Rt���W��kȷ[��7f5�9���~���]j����e��<��!�����q<#G[�U���˚���.T���ȱp��H���췳U����PTBMY������W��*��u}DI�������O�-�%vm�,�ר�B��d���=��ݘE1��!�J��1�ǥ���$�h���<�"�`T��Z���dM6&E�۟��y���g�p��ޢ0˶�\��E�l,��2��oȖ�����u�.�Zϐl��ڬE��eo[�2��A~R�J�����=��ev��[���.	����nro�l��1�{�x�_�X�?�oTm^'�Kڭ'啕�����v����d�C߳��N�9����}e�.��\o�m�sH��S�',o
-/~7�����T–W�[��ܓ��Ԯ��?����-ӴN�Dh���_@`ʵ�;2�/Eo�9���@���\z��o�@���'F��R�R�*v��>��ws�P������(�,�M,w�r�Z���+�߃���)23��M9�y%����at��>��P��"S�@gZ��������n���YE�51T�l�3���4֠�hF�%���
-"N���x|V�"(���_���U�Dj��A���S��B��$i�����^�����R�}O�Q@��G�5����>�]��?�Y
-*N��������ԕ���x�Hs��@=/ۙ�����,U����?�H��D����$�+�圽Z=�§_���������q����c�����s�����p��I�PL
-��/1������ط*b�=�Lf��"��1�b=oO���$1���ש}l6
-5Ǩ$[2R���fAX��ސ\��1������6���z��7�<�����M���;M�w.����۪��������U�^�$ڙ/e�c'�����N��/*��ҙR`7v��я������M��k�J��C}x>x�F�t�N�c�؉Kj��-�e�zuX8�G�L.�p�>���<ʸ�,��M[1�/���%koPf<��r�j��wm��1�Ї���땆�T��0
-`+��mm����T%����F�`�&����=;-�ْw��D���N5�'�۶�Zt�rl��D�Ma�"&��w���w�GWQ�2YQw
-i��5e����D��y�`AA�}�Е/�aQX�������_[&h���F��ϳ3C�_�9�m��:�ISi]�D���0��:��r�ɋ�U2ش��R9K�3)!2�?�"��5����
-�12 0 obj
+<</Type/FontDescriptor/FontName/UZYZOC+CMBX12/FontBBox[0 -201 1139 700]/Flags 4
+/Ascent 700
+/CapHeight 700
+/Descent -201
+/ItalicAngle 0
+/StemV 170
+/MissingWidth 375
+/CharSet(/colon/A/n/c/B/zero/o/one/d/p/two/e/three/f/E/r/g/four/s/h/five/t/i/six/u/seven/T/I/v/k/hyphen/eight/w/l/a/nine/K/x/m/b/W)/FontFile3 102 0 R>>
 endobj
-15 0 obj <<
-/Type /Font
-/Subtype /Type1
-/Encoding 82 0 R
-/FirstChar 11
-/LastChar 122
-/Widths 83 0 R
-/BaseFont /NPIXUF+CMR10
-/FontDescriptor 13 0 R
->> endobj
-13 0 obj <<
-/Ascent 694
-/CapHeight 683
-/Descent -194
-/FontName /NPIXUF+CMR10
+10 0 obj
+<</Type/FontDescriptor/FontName/ITYNZM+CMR12/FontBBox[0 -205 793 714]/Flags 4
+/Ascent 714
+/CapHeight 714
+/Descent -205
 /ItalicAngle 0
-/StemV 69
-/XHeight 431
-/FontBBox [-251 -250 1009 969]
-/Flags 4
-/CharSet (/ff/fi/ffi/quotedblright/quoteright/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/question/A/B/C/D/E/F/G/H/I/J/K/N/O/P/R/S/T/U/W/Y/quotedblleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z)
-/FontFile 14 0 R
->> endobj
-83 0 obj
-[583 556 0 833 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 0 0 278 389 389 0 0 278 333 278 500 500 500 500 500 500 500 500 500 500 500 278 0 0 0 0 472 0 750 708 722 764 681 653 785 750 361 514 778 0 0 750 778 681 0 736 556 722 750 0 1028 0 750 0 0 500 0 0 0 0 500 556 444 556 444 306 500 556 278 306 528 278 833 556 500 556 528 392 394 389 556 528 722 528 528 444 ]
+/StemV 118
+/MissingWidth 326
+/CharSet(/A/n/zero/o/one/e/two/r/g/s/at/t/i/u/seven/comma/k/l/a/period/x/m)/FontFile3 104 0 R>>
 endobj
-82 0 obj <<
-/Type /Encoding
-/Differences [ 0 /.notdef 11/ff/fi 13/.notdef 14/ffi 15/.notdef 34/quotedblright 35/.notdef 39/quoteright/parenleft/parenright 42/.notdef 44/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon 59/.notdef 63/question 64/.notdef 65/A/B/C/D/E/F/G/H/I/J/K 76/.notdef 78/N/O/P 81/.notdef 82/R/S/T/U 86/.notdef 87/W 88/.notdef 89/Y 90/.notdef 92/quotedblleft 93/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 123/.notdef]
->> endobj
-11 0 obj <<
-/Length1 1338
-/Length2 6858
-/Length3 532
-/Length 7670      
-/Filter /FlateDecode
->>
-stream
-x��e\��ia@���c�.�;��:�[P����A$�A:B���s>�ߙ���뾟�2j��_���^H(�L�$���`>-
-�x�m� n�@[+�+�����`���?�+����͠ߌ���-B$�ps���o���������������L�+igW�G��I��M���Pv�h6��e�AX*[
-�%���*�̅6*K>�3z�-��������p+����>	�߶�)8��*e���L��[��n��?^f�(>�"�����|��GгJ���������}%w?�����z������V�������H�Yr�N����{�(�ɔ���bhm������[���y�A'��E4�1u'*��������i-'����.!c�J�E@ե�/��H��w�5�<�K�����	�~i�]��%��#�u��ݚ˪�[�&;���G	i���a��GR�K���[>��Œۭ�`5�`nf����?�NuDe�$N�7nKi�h{�e�?/�c���v�V��}A��;B�1iAߗG3�h�)ؑ�������[�,���Rۜ��sx�!������gu��TP����*�YU˗L�����&s���o��B�ҩ�S�������ZԖg�(-2��m�#/Lޞr��^
-N�̩;�/E��!���m�ODD4~4�L�W�<[?���$���)7)z��X<��d��yX	��-����
-9�0߬����e1��OWr�����&��ɉ�$�����L+��mE�E_���C��M_0�p�O���M�g4�N���|�2r�Kō���-�W�_QĪ�z-^�OާM�s������	El��U8L��ϐM
-��O~��)5�FA|��T�5��%��k��m&���,J����ɍ¼�+&��!3������Y�P��ku�$䣬@s�-�0�i��0�wl�t�c��pkM�`�G臕�k�&4���	vT A��&�a��)V�֖��qf*g葞�BDz��:����5�a����O��]��6�u���q*h��ӥM�8W8v��=4�>�|�m����~�6O���X����tҽ�l׻��0���.Ϝ���T>��8k�f���#Xh{e�5��H[(�м���{���[�c��w�ޖ��4zJ�6Ů̅�|����[t3�������G�
-���װk]�h>0>�tP�P9�Q��=
-�@���
-]�P�5�5v��5��p���Šq�7yx:Y�s���B�Y�ܣ�;���$���:P���˞n�rM�FI�Đ�k��4�>�N�ۥ"~�?�W)�d��8��[1��i^��@��Wo�\`%�g�lNw[�������a�.s����-vǽV����?cT��D�t�C_��䅩5\����᛼��6e����(T!������76�r�
-�� Z�s��M)f�N
-f����sK�������T��2��$7���v�d	_����
-����/�����n\$�����s���7)��*V5¡1=G)�l|��-K6���tȧl�;rA}6�Q�w��3��������������X���8$�����k#]�S��i�-�4�lɤ#"�ǜO�K�H�����7|N�'PP����]ǒ�6ǣuc�vg��^���)2G������A��.	o��H�Y$�T%��S�B|�Er�JdK�5"�V��������-X^�� ����/������v��jj�v��������B{J���:�Ge#��V�K�o�4���
-{�S�����y���4
-�@B
-3��͙�
-���Ԗa�*1���i��Kp���{L��9��O�X��X'܅H�'NJSdSvB��:9/+oJ���6����-�OSn�UHK�y�A#��v��&x�Ӧq(w�2�k���5�r3�[�]��y�}g��2���^{���O�z��x��n��(�3a?;C��-?i=T�'��x
-/F�a?O8��`%�
-U?���������>���.G�kGp���Ec����h�P��=$D52�*��>3���"��.E~-��*U�����Bp�,��7�3d�gy����(د^5Ep`�@�{�$yJ�D�ؿ���-*-G��k!�X�@*��F\��V�Q_ �Y2�-���f$u������-�D5|�����Љ'�s�vC��'�[�xܮ�������k� �c-5��.���	<�tG�����n{��B��k�������/EWؕh����0�:r�S[��C�,݈?&[��i�n:����-m�������>��3����-8�'C��-���Mc�
-2��)E���(���O�����ľ�}��媔���d�H��/����.�2����מ�����3���#<p��4�sK��)��8��2a��4w"�|w�|��_A��!=�y���-�<�;9!�)���u/e%�@�R�����jz� �l�����%�$<O��[:e�ᇫGޞ�~������{�}kK:cW�֤8�2�b�4���`W�'�>>4|ThF��U�2Q�W9c��EIk����Tt�ݖ)+8 0 obj
+<</Type/FontDescriptor/FontName/GRQREI+CMR17/FontBBox[0 -195 744 707]/Flags 4
+/Ascent 707
+/CapHeight 707
+/Descent -195
+/ItalicAngle 0
+/StemV 111
+/MissingWidth 301
+/CharSet(/A/o/d/p/e/quoteright/P/r/s/G/t/i/S/u/T/v/hyphen/U/J/l/a/m/b)/FontFile3 106 0 R>>
 endobj
-12 0 obj <<
-/Type /Font
-/Subtype /Type1
-/Encoding 84 0 R
-/FirstChar 45
-/LastChar 120
-/Widths 85 0 R
-/BaseFont /SODXSF+CMBX12
-/FontDescriptor 10 0 R
->> endobj
-10 0 obj <<
-/Ascent 694
-/CapHeight 686
+71 0 obj
+<</Type/FontDescriptor/FontName/FVSMAJ+CMBX10/FontBBox[0 -194 1164 705]/Flags 4
+/Ascent 705
+/CapHeight 705
 /Descent -194
-/FontName /SODXSF+CMBX12
 /ItalicAngle 0
-/StemV 109
-/XHeight 444
-/FontBBox [-53 -251 1139 750]
-/Flags 4
-/CharSet (/hyphen/one/two/three/four/five/six/seven/eight/nine/colon/A/B/E/I/K/T/W/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/r/s/t/u/v/w/x)
-/FontFile 11 0 R
->> endobj
-85 0 obj
-[375 0 0 0 562 562 562 562 562 562 562 562 562 312 0 0 0 0 0 0 850 800 0 0 738 0 0 0 419 0 881 0 0 0 0 0 0 0 0 782 0 0 1162 0 0 0 0 0 0 0 0 0 547 625 500 625 513 344 562 625 312 0 594 312 937 625 562 625 0 459 444 437 625 594 812 594 ]
+/StemV 174
+/MissingWidth 383
+/CharSet(/A/n/c/o/d/N/p/e/r/s/h/R/G/t/i/fi/u/T/exclam/I/k/w/l/a/x/colon/m/W)/FontFile3 108 0 R>>
 endobj
-84 0 obj <<
-/Type /Encoding
-/Differences [ 0 /.notdef 45/hyphen 46/.notdef 49/one/two/three/four/five/six/seven/eight/nine/colon 59/.notdef 65/A/B 67/.notdef 69/E 70/.notdef 73/I 74/.notdef 75/K 76/.notdef 84/T 85/.notdef 87/W 88/.notdef 97/a/b/c/d/e/f/g/h/i 106/.notdef 107/k/l/m/n/o/p 113/.notdef 114/r/s/t/u/v/w/x 121/.notdef]
->> endobj
-8 0 obj <<
-/Length1 1079
-/Length2 4669
-/Length3 532
-/Length 5383      
-/Filter /FlateDecode
->>
-stream
-x��gXS۶����EjBE�&M�"�cH� ���ҥw���T�ҤR����{������KG���
-B@I@AC"@@BT7o*`�0,���%����-1I�!Q���������<
-���ā�H
-C0�
-���t��ڿv�-���SF�:�q�x��E�#� �VT`MG|-$����&Wv��ׄ9��s@��+������`�t$���(oh����C���8����
-��!3�;�`"�������@����
-?x� -�@z-`���]�nH�-�����m瘔�+n�V�Y���G���6E	|��0��F������ڎ�C���jn�����w��8���@_����]��'�Y��ș0f�����l���Q��r��76���e�e��u�)��x��RW��������,uwaP��i&M� ���������'T�P:ޙ�j>Nz:��-{�Xtq������nJ�'c���V�M�f�j�]룋�/{X�$d��-Ǝ���o��4&����[�4[��kZ@a��.8n7��a��-ZޫQ��t�f����m�9/]�Id��)T�.'b��dq��y#k�=��tF؊9J�)�@,d��0>�u
-������������[o���l�P�7�&5<�%(�Zu=%�3:���6���*���5�^�1�62��84?>�+��6
-��]���:��j<������}�^��/�+�[��Ϝ$��t��jg-�\���+B��<��"���\>�പ��y`!��Y&41��}���.�c������4DZv��"7?5�D���"PC=�����&�q����mw-3���؇e����r�+T�f�f	��o��Ur�YRÈ���ҷ�Zg���kǽ����l�o��r��ń4p��f��Z_\�R1遙�H����6O���������$__h���ټ����s������z#����`���qe䒖gL���{�����OY9�nV�;�t����~}�xGxd<;�И�+O9 i�r�M���'�s���4�D�#�i,�4��z�)�P�"ן�(Dq+�>x'�����pv|}q���������/P�kd~���>5Ӆ$�lm)�-C�	/ȥR��XN���8�3��q���xk�<��*!2'/���Y@\pSb��Ć���W�.<��aY[1�����7c�k1���/�����
-{���:ȿ"b������邶Z�,�¦oGd�l'0��a3��������v��Ѵ�����
-��_�Ϻ�L�{ͮ��u<�~"�dHl7��l�U�M����$�-�*�����vD�u�t>�ű�%;��w�U��/7k�U�ߌ����}@ Rn��'j�Ss�8�ʔ�
-F�Yr�)�1�w�#q*ݐkim0u�9c���oA���qB��gqvg~J���y���m-Vh��f�'���U]$���
-�7O��G��'�7��i�Q�k�V�M~\ɑS�'�(Aո�%CS;y:�������1��n"�I�u�&��d�mNͪ[7-C�(��*9�P��='�wO�m/vE�E�||����K�5���9g%B����Q=8����<��2�-�����#���/l�������*^'y��c�F��3i�ҟ�m$Ux0���S}�n�1��R|�
-�b���u� ��`;�%�����-1�,k�L���fn�������������ʵ(�X��Z�N\j<��WKc~l�zA�VC�#?\�C4���v׼t���%C]OU����j���Z��5Z�kW��(�ƚ�9��_(W�X�
-��߼M,)��"Ŷd-���Ƚ�ūs�;L���F�3����.
-�83R�#�I$s�:i����ty���8�w6�����!�th�R宵���;ZD��q?���u�$fx�����+�nR�q
-���B���/�5��.���mKL�����?Ũ]b�O����0�%s�L>������ˆ�?������(�����괨�|��o۪�7������3*�]�$j%f�D���c�Ցp'�kl��(��B��A�L�'����&�s��;���P�ҷ����?���gA0cR�t5L��aE����fE�����
-w|>߯ɮ濱��%
-�;dy����R��M*}$~�dHF͈Ǟja:_M���'�����[�6@�~:/��!�8��̖C.�����0�@D����F�p}�P�x�.Hӫa�BP�"���@�A�=�-��2���8�|���Y<�.-����y��'K{��@�-�9NJ������޺E�����J/Fn�V*m�m�)VOW��P��n�:�w�d��MJe�Ha �T�y���GK�;�R�
-�s��sJ粘ϑ����������mj���7���������)���A��s��U)�)�iU�먂��7+�C�fs��
-�rC_zL��A��6�jN��tA*���[)M�	��r��χ�g��``q�Q�mÎ�u���p�������Kk������&t��������\6�A�����8ӯ���@���<F����n��K�X�Y���W�����#u	����o�c��|���3/~\H�uX��Z*�/�u|�ح%��<u����Z������k@�1=���%���&x����i�a��s�r�;���������E��^�yS�漸�9����r=S��A��4f��2H�z
-kk�׀=�w6O�*9��%�@F��T�Ȟ熋&�|���bx�`wRɓ�gN9vD}���G/�e����k�S�������������q����J�{*�S}*�1b#>�L�,�n:U��ȘV7g��/s_J�K�	����M;t�Yy������5���h����>�h���q0L���#��]�����¾�����_H�ã�c��,*M,l����F�m�v����N���ضo
-/��vR��*�.!�H��a���5/ی��n��g҂��
-��I�ҍq��(�/�YT����Ս^���Y:_!d�|��23>�^���z�4�&������wl��������ϴ��y�u�h�VǓ��G�5K���v*=�5�;�z(��M��5�<r.�t[��@~?`��{����ޗ�b��شh4���n��@W����WkLA��C�������fZp����S�ɽX���
-����� 0 obj
+<</Type/FontDescriptor/FontName/WNYVFJ+CMSY10/FontBBox[0 0 443 444]/Flags 4
+/Ascent 444
+/CapHeight 444
+/Descent 0
+/ItalicAngle 0
+/StemV 66
+/CharSet(/bullet)/FontFile3 110 0 R>>
 endobj
-9 0 obj <<
-/Type /Font
-/Subtype /Type1
-/Encoding 86 0 R
-/FirstChar 44
-/LastChar 121
-/Widths 87 0 R
-/BaseFont /JVXBXZ+CMR12
-/FontDescriptor 7 0 R
->> endobj
-7 0 obj <<
+27 0 obj
+<</Type/FontDescriptor/FontName/BNGLQK+CMTT10/FontBBox[-4 -229 537 694]/Flags 5
 /Ascent 694
-/CapHeight 683
-/Descent -194
-/FontName /JVXBXZ+CMR12
+/CapHeight 694
+/Descent -229
 /ItalicAngle 0
-/StemV 65
-/XHeight 431
-/FontBBox [-34 -251 988 750]
-/Flags 4
-/CharSet (/comma/period/zero/two/seven/nine/at/J/a/e/g/i/k/l/m/n/o/r/s/t/u/x/y)
-/FontFile 8 0 R
->> endobj
-87 0 obj
-[272 0 272 0 490 0 490 0 0 0 0 490 0 490 0 0 0 0 0 0 762 0 0 0 0 0 0 0 0 0 503 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 490 0 0 0 435 0 490 0 272 0 517 272 816 544 490 0 0 381 386 381 544 0 0 517 517 ]
+/StemV 80
+/AvgWidth 525
+/MaxWidth 525
+/MissingWidth 525
+/CharSet(/colon/L/A/underscore/y/n/c/semicolon/M/zero/B/braceleft/o/d/Y/N/one/C/p/e/O/two/D/equal/braceright/q/f/parenleft/P/E/three/r/g/parenright/Q/F/four/s/five/h/asterisk/R/G/t/i/S/H/six/u/j/comma/T/exclam/seven/I/v/k/hyphen/U/quotedbl/eight/w/l/a/period/V/nine/x/m/b/slash/W)/FontFile3 112 0 R>>
 endobj
-86 0 obj <<
-/Type /Encoding
-/Differences [ 0 /.notdef 44/comma 45/.notdef 46/period 47/.notdef 48/zero 49/.notdef 50/two 51/.notdef 55/seven 56/.notdef 57/nine 58/.notdef 64/at 65/.notdef 74/J 75/.notdef 97/a 98/.notdef 101/e 102/.notdef 103/g 104/.notdef 105/i 106/.notdef 107/k/l/m/n/o 112/.notdef 114/r/s/t/u 118/.notdef 120/x/y 122/.notdef]
->> endobj
-5 0 obj <<
-/Length1 1069
-/Length2 4336
-/Length3 532
-/Length 5041      
-/Filter /FlateDecode
->>
-stream
-x��gXk���JU@ġ#-	%�(һ��H�$@ $!�Q�*U"H�"E�������������f���o(���E�a1��1�,�|�*_���x�
-܀����6p4`��A!]��C��`�n��ܑx�)@�h�����-� �{�9�D��-^�u�S��	�5n`�aZ�tU�����'C�H���f�]"-�L�m����(y�����C<	z�$�.�����>Y�Q�uX�Vp�[ptgNL��(]��"9N���m)[,-?�H�3;���6ᇘ?;`n��qXЩ��NN+e��$�H�Ss��!��e#ٳ��;'P�ʑn7�;��'hq<�~�ׅ�՞�Q�j��Ű{��>����u�D;���	~8c��[�^�d9�X�n���n����-.p�|�Q&��ф�n��5��٤_��c$9�چ&�w��������o�
-��.xR�uql�Q�nс~~(��L�0x�i�ɸ��}��B�5�@�����[khէu_ˏ�&��l%'�/�q�����m����Ks�x]w@X�(%�q̄����S�9ځ2��h�p]u��W&c����\=s4����c8�P��{�v0�~^�x�ڮߵQ���ri,P�IQ(�������B&��ݦ�T���
-*u2^C�?��EO�Ӕ�����M�0�q��F��R���o��O(�JѬ��3�`^�D���"�-��=
-ޛ�H2�އ���ө���--��Y�z�>}R	����+g�l�;Y�x��Xw*��7�F��87Պo/����%�6Sl����e6*^x�C�6(�$��1����6�(g_ӣ����|�p�c���ʐ���+\nAa� ���]V�9��xd%�%m���)�s�PE=4������3�F�>�jRI:��UV���mpF67}�l��d�ai{p�&�d9+�yQ�)y��f{����&!Z�R2m�Wr�@p�c�`8�՚��_���/@����)4��/����T�ǟ�0�z��z۾�s��c�ʞw)-���%��Y3
-��bI���/	S���g$>^��u�VY����O���O~��-�:T���K�f�Ӌ:J8r��{���M��J��,�x��4on�]:M����o+R
-ޒ:�$�⭣(�d넉��~�S� ����+��
-I�!Z���拙��Q�syk~0P�I�-
->��:?c瑙��jœ����\�r��6v2{}	f�(�&�2rĉڌ
-ەX՘�g�/��k����'"ʶu�V����<z��;�ay2;6��D��#��^�SI��ZJx�X����2?�j;]�ñ����$��8.���[������*V,j0�����L��L��.�ޒ;�6��Cg9�yo&vՃ'�x�+�Yq0;�)����V/H�`vJ8Mw��5�	�.*(��}�v����D���6lRBW���-m�<X���a����Pc��%o���zq������=����?�H]�������j����>]�50���� ��-���B��[�+��7�
-�����)�ۜ:�Y^";+��^���Z*U>W�ńs#t���r���<�����6h$�����C�endstream
+20 0 obj
+<</Type/FontDescriptor/FontName/IRVDMF+CMR8/FontBBox[0 -205 857 704]/Flags 4
+/Ascent 704
+/CapHeight 704
+/Descent -205
+/ItalicAngle 0
+/StemV 128
+/MissingWidth 354
+/CharSet(/y/n/c/o/d/p/e/O/f/P/E/r/g/question/s/h/t/i/H/fi/u/comma/T/v/k/hyphen/w/l/a/period/x/m/b)/FontFile3 114 0 R>>
 endobj
-6 0 obj <<
-/Type /Font
-/Subtype /Type1
-/Encoding 88 0 R
-/FirstChar 39
-/LastChar 118
-/Widths 89 0 R
-/BaseFont /XKNQOF+CMR17
-/FontDescriptor 4 0 R
->> endobj
-4 0 obj <<
-/Ascent 694
-/CapHeight 683
-/Descent -195
-/FontName /XKNQOF+CMR17
+18 0 obj
+<</Type/FontDescriptor/FontName/WTBOIB+CMR6/FontBBox[0 -21 564 675]/Flags 4
+/Ascent 675
+/CapHeight 675
+/Descent -21
 /ItalicAngle 0
-/StemV 53
-/XHeight 430
-/FontBBox [-33 -250 945 749]
-/Flags 4
-/CharSet (/quoteright/hyphen/A/G/J/P/S/T/U/a/b/d/e/i/l/m/o/p/r/s/t/u/v)
-/FontFile 5 0 R
->> endobj
-89 0 obj
-[250 0 0 0 0 0 302 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 693 0 0 0 0 0 726 0 0 471 0 0 0 0 0 628 0 0 511 668 693 0 0 0 0 0 0 0 0 0 0 0 459 511 0 511 406 0 0 0 250 0 0 250 772 0 459 511 0 354 359 354 511 485 ]
+/StemV 84
+/MissingWidth 416
+/CharSet(/one/two/three/four)/FontFile3 116 0 R>>
 endobj
-88 0 obj <<
-/Type /Encoding
-/Differences [ 0 /.notdef 39/quoteright 40/.notdef 45/hyphen 46/.notdef 65/A 66/.notdef 71/G 72/.notdef 74/J 75/.notdef 80/P 81/.notdef 83/S/T/U 86/.notdef 97/a/b 99/.notdef 100/d/e 102/.notdef 105/i 106/.notdef 108/l/m 110/.notdef 111/o/p 113/.notdef 114/r/s/t/u/v 119/.notdef]
->> endobj
-25 0 obj <<
-/Type /Pages
-/Count 6
-/Parent 90 0 R
-/Kids [2 0 R 27 0 R 33 0 R 39 0 R 42 0 R 45 0 R]
->> endobj
-50 0 obj <<
-/Type /Pages
-/Count 6
-/Parent 90 0 R
-/Kids [48 0 R 52 0 R 55 0 R 58 0 R 65 0 R 68 0 R]
->> endobj
-90 0 obj <<
-/Type /Pages
-/Count 12
-/Kids [25 0 R 50 0 R]
->> endobj
-91 0 obj <<
-/Type /Catalog
-/Pages 90 0 R
->> endobj
-92 0 obj <<
-/Producer (pdfeTeX-1.21a)
-/Creator (TeX)
-/CreationDate (D:20070709134125+02'00')
-/PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) kpathsea version 3.5.4)
->> endobj
+16 0 obj
+<</Type/FontDescriptor/FontName/WTBOIB+CMR7/FontBBox[0 -20 529 674]/Flags 4
+/Ascent 674
+/CapHeight 674
+/Descent -20
+/ItalicAngle 0
+/StemV 79
+/MissingWidth 384
+/CharSet(/one/two/three/four)/FontFile3 118 0 R>>
+endobj
+2 0 obj
+<</Producer(ESP Ghostscript 815.04)
+/CreationDate(D:20070811165352)
+/ModDate(D:20070811165352)>>endobj
 xref
-0 93
+0 125
 0000000000 65535 f 
-0000002765 00000 n 
-0000002660 00000 n 
-0000000009 00000 n 
-0000381395 00000 n 
-0000376080 00000 n 
-0000381240 00000 n 
-0000375246 00000 n 
-0000369589 00000 n 
-0000375091 00000 n 
-0000368686 00000 n 
-0000360738 00000 n 
-0000368528 00000 n 
-0000359408 00000 n 
-0000344595 00000 n 
-0000359251 00000 n 
-0000344251 00000 n 
-0000341867 00000 n 
-0000344096 00000 n 
-0000341523 00000 n 
-0000339136 00000 n 
-0000341368 00000 n 
-0000338305 00000 n 
-0000332045 00000 n 
-0000338149 00000 n 
-0000382187 00000 n 
-0000005496 00000 n 
-0000005388 00000 n 
-0000002902 00000 n 
-0000330740 00000 n 
-0000317294 00000 n 
-0000330582 00000 n 
-0000008370 00000 n 
-0000008262 00000 n 
-0000005589 00000 n 
-0000316978 00000 n 
-0000315593 00000 n 
-0000316821 00000 n 
-0000011192 00000 n 
-0000011084 00000 n 
-0000008510 00000 n 
-0000013575 00000 n 
-0000013467 00000 n 
-0000011273 00000 n 
-0000015557 00000 n 
-0000015449 00000 n 
-0000013680 00000 n 
-0000018211 00000 n 
-0000018103 00000 n 
-0000015662 00000 n 
-0000382295 00000 n 
-0000020213 00000 n 
-0000020105 00000 n 
-0000018292 00000 n 
-0000022740 00000 n 
-0000022632 00000 n 
-0000020318 00000 n 
-0000024810 00000 n 
-0000024702 00000 n 
-0000022833 00000 n 
-0000314678 00000 n 
-0000307525 00000 n 
-0000314520 00000 n 
-0000026180 00000 n 
-0000305946 00000 n 
-0000026072 00000 n 
-0000024927 00000 n 
-0000307420 00000 n 
-0000307312 00000 n 
-0000306086 00000 n 
-0000315230 00000 n 
-0000314938 00000 n 
-0000317208 00000 n 
-0000317185 00000 n 
-0000331551 00000 n 
-0000331202 00000 n 
-0000338858 00000 n 
-0000338563 00000 n 
-0000341769 00000 n 
-0000341734 00000 n 
-0000344497 00000 n 
-0000344462 00000 n 
-0000360238 00000 n 
-0000359854 00000 n 
-0000369249 00000 n 
-0000368997 00000 n 
-0000375725 00000 n 
-0000375504 00000 n 
-0000381870 00000 n 
-0000381645 00000 n 
-0000382404 00000 n 
-0000382471 00000 n 
-0000382522 00000 n 
+0000061343 00000 n 
+0000101592 00000 n 
+0000061185 00000 n 
+0000058685 00000 n 
+0000000015 00000 n 
+0000004972 00000 n 
+0000061391 00000 n 
+0000099596 00000 n 
+0000096006 00000 n 
+0000099321 00000 n 
+0000095657 00000 n 
+0000098988 00000 n 
+0000095270 00000 n 
+0000098511 00000 n 
+0000094606 00000 n 
+0000101367 00000 n 
+0000098346 00000 n 
+0000101142 00000 n 
+0000098181 00000 n 
+0000100845 00000 n 
+0000097668 00000 n 
+0000061432 00000 n 
+0000061462 00000 n 
+0000058853 00000 n 
+0000004992 00000 n 
+0000009777 00000 n 
+0000100336 00000 n 
+0000097186 00000 n 
+0000061558 00000 n 
+0000061588 00000 n 
+0000059015 00000 n 
+0000009798 00000 n 
+0000015038 00000 n 
+0000100143 00000 n 
+0000096950 00000 n 
+0000061642 00000 n 
+0000061672 00000 n 
+0000059185 00000 n 
+0000015059 00000 n 
+0000019954 00000 n 
+0000061770 00000 n 
+0000061800 00000 n 
+0000059355 00000 n 
+0000019975 00000 n 
+0000024247 00000 n 
+0000061843 00000 n 
+0000061873 00000 n 
+0000059525 00000 n 
+0000024268 00000 n 
+0000027920 00000 n 
+0000061938 00000 n 
+0000061968 00000 n 
+0000059687 00000 n 
+0000027941 00000 n 
+0000032886 00000 n 
+0000062033 00000 n 
+0000062063 00000 n 
+0000059857 00000 n 
+0000032907 00000 n 
+0000036515 00000 n 
+0000062106 00000 n 
+0000062136 00000 n 
+0000060019 00000 n 
+0000036536 00000 n 
+0000041310 00000 n 
+0000062201 00000 n 
+0000062231 00000 n 
+0000060181 00000 n 
+0000041331 00000 n 
+0000045463 00000 n 
+0000099865 00000 n 
+0000096446 00000 n 
+0000062285 00000 n 
+0000062315 00000 n 
+0000060343 00000 n 
+0000045484 00000 n 
+0000049724 00000 n 
+0000062380 00000 n 
+0000062410 00000 n 
+0000060513 00000 n 
+0000049745 00000 n 
+0000052055 00000 n 
+0000062508 00000 n 
+0000062538 00000 n 
+0000060683 00000 n 
+0000052076 00000 n 
+0000053893 00000 n 
+0000062581 00000 n 
+0000062611 00000 n 
+0000060853 00000 n 
+0000053914 00000 n 
+0000057411 00000 n 
+0000062654 00000 n 
+0000062684 00000 n 
+0000061023 00000 n 
+0000057432 00000 n 
+0000058664 00000 n 
+0000062727 00000 n 
+0000062757 00000 n 
+0000062811 00000 n 
+0000070549 00000 n 
+0000070571 00000 n 
+0000074729 00000 n 
+0000074751 00000 n 
+0000077347 00000 n 
+0000077369 00000 n 
+0000079928 00000 n 
+0000079950 00000 n 
+0000083012 00000 n 
+0000083034 00000 n 
+0000083359 00000 n 
+0000083380 00000 n 
+0000089617 00000 n 
+0000089639 00000 n 
+0000093055 00000 n 
+0000093077 00000 n 
+0000093821 00000 n 
+0000093842 00000 n 
+0000094585 00000 n 
+0000095124 00000 n 
+0000096353 00000 n 
+0000096865 00000 n 
+0000097097 00000 n 
+0000098096 00000 n 
 trailer
-<<
-/Size 93
-/Root 91 0 R
-/Info 92 0 R
-/ID [<B55F53A3ADE1C4CE70EEAE2114A29330> <B55F53A3ADE1C4CE70EEAE2114A29330>]
+<< /Size 125 /Root 1 0 R /Info 2 0 R
+/ID [(��_>��Bο^����_>��Bο^��
 >>
 startxref
-382725
+101703
 %%EOF

Modified: puppetor/trunk/doc/howto.tex
===================================================================
--- puppetor/trunk/doc/howto.tex	2007-08-11 14:38:11 UTC (rev 11077)
+++ puppetor/trunk/doc/howto.tex	2007-08-11 15:39:12 UTC (rev 11078)
@@ -1,6 +1,7 @@
 \documentclass{article}%
 \usepackage{graphicx}%
 \usepackage{url}%
+\usepackage{msc}%
 \begin{document}%
 %
 \author{karsten.loesing@xxxxxxx}%
@@ -25,8 +26,7 @@
 An application that makes use of this framework starts with setting up a set of
 pre-defined Tor processes: proxy, router, and directory. Though these
 configurations should work in most settings, they can be altered by adding or
-removing configuration entries.\footnote{This is not implemented yet, but it 
-should not be too hard to do it.} After deciding whether the processes shall
+removing configuration entries. After deciding whether the processes shall
 either create a private Tor network, or connect to the public Tor network,
 processes are started. Now the application can start clients and servers and
 perform requests using the local processes. In doing so, it can measure time
@@ -425,7 +425,7 @@
 
 \begin{verbatim}
 Request took 13808 millis from client to server!
-Request took 14851 millis for the rount-trip and 1043 millis from server to client!
+Request took 14851 millis for the round-trip and 1043 millis from server to client!
 Exiting...
 \end{verbatim}
 
@@ -544,53 +544,32 @@
 
 \textbf{WARNING: This example does not work with an unmodified Tor!}
 
-The purpose of this example is to demonstrate how the distributed storage for
-hidden service descriptors as described in proposal 114 works. It requires a
-modified Tor executable that can be compiled using the sources in
-\url{https://tor-svn.freehaven.net/svn/tor/branches/114-dist-storage}. For more
-information on the design of the distributed storage see proposal 114.
+The purpose of this example is the automatic validation of the distributed
+storage for hidden service descriptors as described in proposal 114.
 
-The network configuration consists of three router nodes, which are used for
-performing onion routing. Two of them are used as proxies, and the third is
-used as hidden service directory. Further, there are two directory nodes that
-are also hidden service directories, a client, and a server (figure \ref{ex5}
-depicts the network setting):
-\begin{itemize}
-\item Router \texttt{router1} with control port 7021, SOCKS port 7022, OR port
-7023, and dir port 7024.
-\item Router \texttt{router2} with control port 7031, SOCKS port 7032, OR port
-7033, and dir port 7034, acting as hidden service directory.
-\item Router \texttt{router3} with control port 7041, SOCKS port 7042, OR port
-7043, and dir port 7044.
-\item Directory \texttt{dir1} with control port 7051, SOCKS port 7052, OR port
-7053, and dir port 7054, acting as hidden service directory.
-\item Directory \texttt{dir2} with control port 7061, SOCKS port 7062, OR port
-7063, and dir port 7064, acting as hidden service directory.
-\item Server that listens on port 7025 and is registered as hidden server at
-\texttt{router1}.
-\item Client that performs requests using SOCKS port 7042, i.e. over
-\texttt{router3}.
-\end{itemize}
+When running, the example starts a network of local Tor processes, consisting
+of 2 directory nodes and 9 periodically changing onion routers, some of them
+(not the initial nodes, but those nodes replacing them) with attached hidden
+services. Each hour, one node is stopped and a new node is started, so that the
+population size stays the same.
 
-\begin{figure}
-\includegraphics[width=\textwidth]{example.png}
-\label{ex5}
-\caption{Network setting of example 5.}
-\end{figure}
+The automatic validation performs four measurements:
 
-A typical output of example 5 might look like the following:
+\begin{enumerate}
+\item Are the online statuses of hidden service directories propagated to all
+running nodes successfully, and how long does propagation take?
+\item The same measurement with offline statuses.
+\item Are hidden service descriptors stored on the correct, responsible hidden
+service directories, and how long does propagation take?
+\item Are hidden service requests successful within a given timeout?
+\end{enumerate}
 
-\begin{verbatim}
-Successfully started nodes!
-Successfully built circuits!
-Waiting for 1 minute...
-Waiting for 30 seconds...
-APPLICATION_SENDING_REQUEST
-APPLICATION_REQUEST_RECEIVED
-APPLICATION_REPLY_RECEIVED
-APPLICATION_REQUESTS_PERFORMED
-Exiting...
-\end{verbatim}
+The results of these measurements are written as comma-separated values to the
+four files \texttt{online-propagation}, \texttt{offline-propagation},
+\texttt{descriptor-propagation}, and \texttt{hidden-service-requests} in the
+working directory of the test run. Successful measurements are written as the
+number of seconds that the measurement took, failures are encoded as
+\texttt{-1}, and aborted measurements are dropped.
 
 \section{Architecture}
 
@@ -607,6 +586,121 @@
   \item Dir port
 \end{enumerate}
 
+\section{Events and messages for hidden services}
+
+PuppeTor contains a number of pre-defined event types to observe how Tor behaves
+when setting up and accessing a hidden service. Therefore, PuppeTor parses the
+log statements coming from all started Tor processes and decides whether to fire
+an event or not. All necessary log statements are contained in the current Tor
+trunk on log level \texttt{INFO} or higher. Further event types can be added by
+an application.\footnote{However, those new event types need to be mapped to
+pre-defined event types, because there is no possibility to extend enums at
+run-time. Or is there?} Figure \ref{setup} shows the events and exchanged
+messages for setting up a hidden service, figure \ref{download} the descriptor
+download, and figure \ref{connect} the connection establishment.
+
+\begin{figure}
+\caption{Hidden service setup\label{setup}}
+\begin{msc}{Hidden service setup}
+\declinst{a}{Alice's OP}{}
+\declinst{r}{Rendezvous Point}{}
+\declinst{d}{Dir/HSDir}{}
+\declinst{i}{Introduction Point}{}
+\declinst{b}{Bob's OP}{}
+\action{BOB\_BUILT\_INTRO\_CIRC\_SENDING\_ESTABLISH\_INTRO}{b}
+\nextlevel[2]
+\mess{ESTABLISH\_INTRO}{b}{i}[1]
+\nextlevel[2]
+\action{IPO\_RECEIVED\_ESTABLISH\_INTRO\_SENDING\_INTRO\_ESTABLISHED}{i}
+\nextlevel[2]
+\mess{INTRO\_ESTABLISHED}{i}{b}[1]
+\nextlevel[2]
+\action{BOB\_INTRO\_ESTABLISHED\_RECEIVED}{b}
+\nextlevel[2]
+\action{BOB\_SENDING\_PUBLISH\_DESC}{b}
+\nextlevel[2]
+\mess{POST}{b}{d}[1]
+\nextlevel[2]
+\action{DIR\_PUBLISH\_DESC\_RECEIVED}{d}
+\nextlevel[2]
+\mess{OK}{d}{b}[1]
+\nextlevel[2]
+\action{BOB\_DESC\_PUBLISHED\_RECEIVED}{b}
+\nextlevel[2]
+\end{msc}
+\end{figure}
+
+\begin{figure}
+\caption{Hidden service decriptor download\label{download}}
+\begin{msc}{Hidden service decriptor download}
+\declinst{a}{Alice's OP}{}
+\declinst{r}{Rendezvous Point}{}
+\declinst{d}{Dir/HSDir}{}
+\declinst{i}{Introduction Point}{}
+\declinst{b}{Bob's OP}{}
+\action{ALICE\_ONION\_REQUEST\_RECEIVED}{a}
+\nextlevel[2]
+\action{ALICE\_SENDING\_FETCH\_DESC}{a}
+\nextlevel[2]
+\mess{GET}{a}{d}[1]
+\nextlevel[2]
+\action{DIR\_FETCH\_DESC\_RECEIVED}{d}
+\nextlevel[2]
+\mess{OK}{d}{a}[1]
+\nextlevel[2]
+\action{ALICE\_DESC\_FETCHED\_RECEIVED}{a}
+\nextlevel[2]
+\end{msc}
+\end{figure}
+
+\begin{figure}
+\caption{Hidden service connection establishment\label{connect}}
+\begin{msc}{Hidden service connection establishment}
+\declinst{a}{Alice's OP}{}
+\declinst{r}{Rendezvous Point}{}
+\declinst{d}{Dir/HSDir}{}
+\declinst{i}{Introduction Point}{}
+\declinst{b}{Bob's OP}{}
+\action{ALICE\_BUILT\_REND\_CIRC\_SENDING\_ESTABLISH\_RENDEZVOUS}{a}
+\nextlevel[2]
+\mess{ESTABLISH\_RENDEZVOUS}{a}{r}[1]
+\nextlevel[2]
+\action{RPO\_RECEIVED\_ESTABLISH\_RENDEZVOUS\_SENDING\_RENDEZVOUS\_ESTABLISHED}{r}
+\nextlevel[2]
+\mess{RENDEZVOUS\_ESTABLISHED}{r}{a}[1]
+\nextlevel[2]
+\action{ALICE\_RENDEZVOUS\_ESTABLISHED\_RECEIVED}{a}
+\nextlevel[2]
+\action{ALICE\_BUILT\_INTRO\_CIRC}{a}
+\nextlevel[2]
+\action{ALICE\_SENDING\_INTRODUCE1}{a}
+\nextlevel[2]
+\mess{INTRODUCE1}{a}{i}[1]
+\nextlevel[2]
+\action{IPO\_RECEIVED\_INTRODUCE1\_SENDING\_INTRODUCE2\_AND\_INTRODUCE\_ACK}{i}
+\nextlevel[2]
+\mess{INTRODUCE2}{i}{b}[1]
+\mess{INTRODUCE\_ACK}{i}{a}[1]
+\nextlevel[2]
+\action{ALICE\_INTRODUCE\_ACK\_RECEIVED}{a}
+\action{BOB\_INTRODUCE2\_RECEIVED}{b}
+\nextlevel[2]
+\action{BOB\_BUILT\_REND\_CIRC\_SENDING\_RENDEZVOUS1}{b}
+\nextlevel[2]
+\mess{RENDEZVOUS1}{b}{r}[1]
+\nextlevel[2]
+\action{RPO\_RECEIVING\_RENDEZVOUS1\_SENDING\_RENDEZVOUS2}{r}
+\nextlevel[2]
+\mess{RENDEZVOUS2}{r}{a}[1]
+\nextlevel[2]
+\action{ALICE\_RENDEZVOUS2\_RECEIVED\_APP\_CONN\_OPENED}{a}
+\nextlevel[2]
+\action{BOB\_APP\_CONN\_OPENED}{b}
+\nextlevel[2]
+\nextlevel
+\end{msc}
+\end{figure}
+
 \section{Known issues}
 
 There is already a small list of problems and open questions that require more

Deleted: puppetor/trunk/license
===================================================================
--- puppetor/trunk/license	2007-08-11 14:38:11 UTC (rev 11077)
+++ puppetor/trunk/license	2007-08-11 15:39:12 UTC (rev 11078)
@@ -1,66 +0,0 @@
-===============================================================================
-PuppeTor - A Java-based Tor Simulator - is distributed under this license:
-
-Copyright (c) 2007, Karsten Loesing
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
-
-    * Neither the names of the copyright owners nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-===============================================================================
-The Tor controller demonstration code is distributed under this license:
-
-Copyright (c) 2005, Nick Mathewson, Roger Dingledine
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
-
-    * Neither the names of the copyright owners nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Deleted: puppetor/trunk/readme
===================================================================
--- puppetor/trunk/readme	2007-08-11 14:38:11 UTC (rev 11077)
+++ puppetor/trunk/readme	2007-08-11 15:39:12 UTC (rev 11078)
@@ -1,8 +0,0 @@
-This is a Java framework that facilitates the configuration of a set of local
-Tor processes and the execution of automatic tests based on these processes. The
-intention is to make it easier for developers to analyze Tor's behavior in
-arbitrary network settings and to measure the effects of changes to the Tor
-source code. Due to the automation of configuration and execution, these
-experiments can be done in an unsupervised batch fashion.
-
-For more information, read the how-to document in doc/howto.pdf .

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/ClientApplication.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/ClientApplication.java	2007-08-11 14:38:11 UTC (rev 11077)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/ClientApplication.java	2007-08-11 15:39:12 UTC (rev 11078)
@@ -25,11 +25,11 @@
 	 * 
 	 * <p>
 	 * For each sent request the application fires an
-	 * <event>Event.APPLICATION_SENDING_REQUEST</code> event. On receiving a
-	 * reply it fires an event of type <code>Event.APPLICATION_REPLY_RECEIVED</code>,
-	 * if a request is not successful or times out, an <code>Event.APPLICATION_GAVE_UP_REQUEST</code>
+	 * <event>EventType.APPLICATION_SENDING_REQUEST</code> event. On receiving
+	 * a reply it fires an event of type <code>EventType.APPLICATION_REPLY_RECEIVED</code>,
+	 * if a request is not successful or times out, an <code>EventType.APPLICATION_GAVE_UP_REQUEST</code>
 	 * event is fired. After all requests have been performed (either
-	 * successfully, or not) an event of type <code>Event.APPLICATION_REQUESTS_PERFORMED</code>
+	 * successfully, or not) an event of type <code>EventType.APPLICATION_REQUESTS_PERFORMED</code>
 	 * is fired.
 	 * </p>
 	 * 

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/Event.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/Event.java	2007-08-11 14:38:11 UTC (rev 11077)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/Event.java	2007-08-11 15:39:12 UTC (rev 11078)
@@ -1,87 +1,47 @@
-package de.uniba.wiai.lspi.puppetor;
-
-/**
- * An <code>Event</code> is created for every state change of an asynchronous
- * system component, e.g. a Tor process or a client/server application running
- * as thread in the background. In contrast to <code>NodeState</code> or
- * <code>NetworkState</code> an <code>Event</code> cannot be a pre- or
- * postconditions for a method invocation. There is no prescribed order in which
- * events are fired by a certain process or application. Some events can be
- * fired only once, others possibly multiple times. All management operations
- * for events are contained in the <code>EventManager</code>.
- * 
- * TODO change from enum to hierarchie of interfaces/classes, because enums do
- * not support a type hierarchie which would be very useful!
- * 
- * TODO add methods and attributes to events to include additional information
- * (e.g. time of occurence)!
- * 
- * @author kloesing
- */
-public enum Event {
-
-	/**
-	 * The node which fires this event has successfully opened a circuit. This
-	 * event can only be fired once.
-	 */
-	NODE_CIRCUIT_OPENED,
-
-	/**
-	 * The node which fires this event has opened its control port. This event
-	 * can only be fired once.
-	 */
-	NODE_CONTROL_PORT_OPENED,
-
-	/**
-	 * The node which fires this event has successfully published a rendezvous
-	 * service descriptor. This event can be fired multiple times.
-	 */
-	NODE_RSD_PUBLISHED,
-
-	/**
-	 * The network fires this event when all nodes have opened their control
-	 * ports. This event can only be fired once.
-	 */
-	NETWORK_CONTROL_PORTS_OPENED,
-
-	/**
-	 * The network fires this event when all nodes have successfully opened a
-	 * circuit. This event can only be fired once.
-	 */
-	NETWORK_CIRCUITS_ESTABLISHED,
-
-	/**
-	 * The client application which fires this event has received a reply to a
-	 * previously sent request. This event can be fired multiple times.
-	 */
-	APPLICATION_REPLY_RECEIVED,
-
-	/**
-	 * The client application which fires this event has sent a request. This
-	 * event can be fired multiple times.
-	 */
-	APPLICATION_SENDING_REQUEST,
-
-	/**
-	 * The server application which fires this event has received a request and
-	 * sent a reply to it. This event can be fired multiple times.
-	 */
-	APPLICATION_REQUEST_RECEIVED,
-
-	/**
-	 * The client application which fires this event has given up waiting for
-	 * the reply to a previously sent request. This event can be fired multiple
-	 * times.
-	 */
-	APPLICATION_GAVE_UP_REQUEST,
-
-	/**
-	 * The client application which fires this event has completed a series of
-	 * requests, whether they were successful or not. This event can be fired
-	 * multiple times. TODO Can it really be fired multiple times? Is it
-	 * possible to send multiple request series from the same client? Should it
-	 * be possible?
-	 */
-	APPLICATION_REQUESTS_PERFORMED
-
-}
+package de.uniba.wiai.lspi.puppetor;
+
+/**
+ * An <code>Event</code> is created for every state change of an asynchronous
+ * system component, e.g. a Tor process or a client/server application running
+ * as thread in the background. In contrast to <code>NodeState</code> or
+ * <code>NetworkState</code> an <code>Event</code> cannot be a pre- or
+ * postconditions for a method invocation. There is no prescribed order in which
+ * events are fired by a certain process or application. Some events can be
+ * fired only once, others possibly multiple times. All management operations
+ * for events are contained in the <code>EventManager</code>.
+ * 
+ * @author kloesing
+ */
+public interface Event {
+
+	/**
+	 * Returns the source of this event, which can be a Tor process or a
+	 * client/server application running as thread in the background.
+	 * 
+	 * @return The event source.
+	 */
+	public abstract EventSource getSource();
+
+	/**
+	 * Returns the type of this event.
+	 * 
+	 * @return The event type.
+	 */
+	public abstract EventType getType();
+
+	/**
+	 * Returns the original message that lead to firing this event.
+	 * 
+	 * @return The original message.
+	 */
+	public abstract String getMessage();
+
+	/**
+	 * Returns the occurrence time of this event, which is either the parsed
+	 * time from a Tor log statement, or the current system time when a
+	 * client/server application fired this event.
+	 * 
+	 * @return The occurrence time.
+	 */
+	public abstract long getOccurrenceTime();
+}

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/EventManager.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/EventManager.java	2007-08-11 14:38:11 UTC (rev 11077)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/EventManager.java	2007-08-11 15:39:12 UTC (rev 11078)
@@ -45,6 +45,23 @@
 			EventListener listener);
 
 	/**
+	 * Registers the given <code>listener</code> as event listener for future
+	 * events originating from any source. This method can be invoked in any
+	 * node or network state.
+	 * 
+	 * @param listener
+	 *            The listener that wants to be notified about events from the
+	 *            given <code>source</code>. If the <code>listener</code>
+	 *            is already registered for the same <code>source</code>,
+	 *            nothing happens, i.e. the <code>listener</code> will not
+	 *            receive multiple invocations for the same event. May not be
+	 *            <code>null</code>.
+	 * @throws IllegalArgumentException
+	 *             Thrown if <code>null</code> is passed for the parameter.
+	 */
+	public abstract void addEventListener(EventListener listener);
+
+	/**
 	 * Returns the list of all previously observed events from the given
 	 * <code>source</code>.
 	 * 
@@ -74,7 +91,7 @@
 	 * @return <code>true</code> if the event has been observed from the
 	 *         source before, <code>false</code> otherwise.
 	 */
-	public abstract boolean hasEventOccured(EventSource source, Event event);
+	public abstract boolean hasEventOccured(EventSource source, EventType event);
 
 	/**
 	 * Removes the given <code>listener</code> as event listener from all
@@ -111,7 +128,7 @@
 	 *             Thrown if <code>null</code> is passed for either of the
 	 *             parameters.
 	 */
-	public abstract void waitForAnyOccurence(EventSource source, Event event);
+	public abstract void waitForAnyOccurence(EventSource source, EventType event);
 
 	/**
 	 * Checks if the given <code>event</code> has been observed from the given
@@ -138,7 +155,7 @@
 	 *             parameters.
 	 */
 	public abstract boolean waitForAnyOccurence(EventSource source,
-			Event event, long maximumTimeToWaitInMillis);
+			EventType event, long maximumTimeToWaitInMillis);
 
 	/**
 	 * Blocks the invoking thread until the next <code>event</code> is fired
@@ -158,7 +175,8 @@
 	 *             Thrown if <code>null</code> is passed for either of the
 	 *             parameters.
 	 */
-	public abstract void waitForNextOccurence(EventSource source, Event event);
+	public abstract void waitForNextOccurence(EventSource source,
+			EventType event);
 
 	/**
 	 * Blocks the invoking thread until the next <code>event</code> is fired
@@ -185,6 +203,21 @@
 	 *             parameters.
 	 */
 	public abstract boolean waitForNextOccurence(EventSource source,
-			Event event, long maximumTimeToWaitInMillis);
+			EventType event, long maximumTimeToWaitInMillis);
 
+	/**
+	 * Registers a new event type by passing a pattern string that can be
+	 * applied to a regular expression when parsing Tor log statements. This is
+	 * useful for log statements that are only included in modified Tor
+	 * versions.
+	 * 
+	 * @param patternString
+	 *            The pattern string that will be used for parsing Tor log
+	 *            statements; the syntax corresponds to java.util.regex.Pattern.
+	 * @param eventType
+	 *            The event type that will be fired when a log statement was
+	 *            parsed that includes the given pattern.
+	 */
+	public abstract void registerEventTypePattern(String patternString,
+			EventType eventType);
 }

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/EventSource.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/EventSource.java	2007-08-11 14:38:11 UTC (rev 11077)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/EventSource.java	2007-08-11 15:39:12 UTC (rev 11078)
@@ -1,11 +1,16 @@
 package de.uniba.wiai.lspi.puppetor;
 
 /**
- * This marker interface is the super-interface of those interfaces that can be
- * the source for events.
+ * Super-interface of those interfaces that can be the source for events.
  * 
  * @author kloesing
  */
 public interface EventSource {
-	// this interface contains no methods, because it is a marker interface.
+
+	/**
+	 * TODO document me
+	 * 
+	 * @return
+	 */
+	public abstract String getName();
 }

Added: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/EventType.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/EventType.java	                        (rev 0)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/EventType.java	2007-08-11 15:39:12 UTC (rev 11078)
@@ -0,0 +1,248 @@
+package de.uniba.wiai.lspi.puppetor;
+
+/**
+ * The possible types of events that are fired on a state change of an
+ * asynchronous system component, e.g. a Tor process or a client/server
+ * application running as thread in the background.
+ * 
+ * @author kloesing
+ */
+public enum EventType {
+
+	/**
+	 * The node has reported that its routing table for v2 hidden services has
+	 * changed; this event can only be parsed from a log statement in a modified
+	 * Tor!
+	 */
+	NODE_ROUTING_TABLE_CHANGED,
+
+	/**
+	 * The node was started and we managed to connect to its control port; this
+	 * event is fired internally and not parsed from a log statement from Tor.
+	 */
+	NODE_STARTED,
+
+	/**
+	 * The node has opened its control port; this event is parsed from a log
+	 * statement in connection_create_listener().
+	 */
+	NODE_CONTROL_PORT_OPENED,
+
+	/**
+	 * The node which has successfully opened a circuit; this event is parsed
+	 * from a log statement in circuit_send_next_onion_skin().
+	 */
+	NODE_CIRCUIT_OPENED,
+
+	/**
+	 * The node was stopped; this event is fired internally and not parsed from
+	 * a log statement from Tor.
+	 */
+	NODE_STOPPED,
+
+	/**
+	 * Bob has built a circuit to an introduction point and sends an
+	 * ESTABLISH_INTRO cell; this event is parsed from a log statement in
+	 * rend_service_intro_has_opened().
+	 */
+	BOB_BUILT_INTRO_CIRC_SENDING_ESTABLISH_INTRO,
+
+	/**
+	 * Bob has received an INTRO_ESTABLISHED cell, i.e. a node has confirmed to
+	 * work as introduction point; this event is parsed from a log statement in
+	 * rend_service_intro_established().
+	 */
+	BOB_INTRO_ESTABLISHED_RECEIVED,
+
+	/**
+	 * Bob posts a hidden service descriptor to the directory servers (or to
+	 * hidden service directories in a modified Tor); this event is parsed from
+	 * a log statement in upload_service_descriptor().
+	 */
+	BOB_SENDING_PUBLISH_DESC,
+
+	/**
+	 * Bob received a response from a directory server (or from a hidden service
+	 * directory in a modified Tor) to a previous publish request; this event is
+	 * parsed from a log statement in connection_dir_client_reached_eof().
+	 */
+	BOB_DESC_PUBLISHED_RECEIVED,
+
+	/**
+	 * Bob has received an INTRODUCE2 cell, i.e. a node wants to establish a
+	 * connection, and will now try to establish a circuit to the client's
+	 * rendezvous point; this event is parsed from a log statement in
+	 * rend_service_introduce().
+	 */
+	BOB_INTRODUCE2_RECEIVED,
+
+	/**
+	 * Bob has built a circuit to a rendezvous point and sends an RENDEZVOUS1
+	 * cell; this event is parsed from a log statement in
+	 * rend_service_rendezvous_has_opened().
+	 */
+	BOB_BUILT_REND_CIRC_SENDING_RENDEZVOUS1,
+
+	/**
+	 * Bob opens a connection to the actual hidden server; this event is parsed
+	 * from a log statement in connection_exit_begin_conn().
+	 */
+	BOB_APP_CONN_OPENED,
+
+	/**
+	 * Alice has received an onion request; this event is parsed from a log
+	 * statement in connection_ap_handshake_rewrite_and_attach().
+	 */
+	ALICE_ONION_REQUEST_RECEIVED,
+
+	/**
+	 * Alice sends a fetch request for a hidden service descriptor to a
+	 * directory server; this event is parsed from a log statement in
+	 * rend_client_refetch_renddesc().
+	 */
+	ALICE_SENDING_FETCH_DESC,
+
+	/**
+	 * Alice receives a reply to a previous fetch request for a hidden service
+	 * descriptors from a directory server; this event is parsed from a log
+	 * statement in connection_dir_client_reached_eof().
+	 */
+	ALICE_DESC_FETCHED_RECEIVED,
+
+	/**
+	 * Alice has built a circuit to a rendezvous point and sends an
+	 * ESTABLISH_RENDEZVOUS cell; this event is parsed from a log statement in
+	 * rend_client_send_establish_rendezvous().
+	 */
+	ALICE_BUILT_REND_CIRC_SENDING_ESTABLISH_RENDEZVOUS,
+
+	/**
+	 * Alice receives a RENDEZVOUS_ESTABLISHED cell from a rendezvous point;
+	 * this event is parsed from a log statement in
+	 * rend_client_rendezvous_acked().
+	 */
+	ALICE_RENDEZVOUS_ESTABLISHED_RECEIVED,
+
+	/**
+	 * Alice has built a circuit to an introduction point (which does not
+	 * automatically lead to sending an INTRODUCE1 cell, because the rendezvous
+	 * circuit might not be ready); this event is parsed from a log statement in
+	 * rend_client_introcirc_has_opened().
+	 */
+	ALICE_BUILT_INTRO_CIRC,
+
+	/**
+	 * Alice sends an INTRODUCE1 cell to an introduction point; this event is
+	 * parsed from a log statement in rend_client_send_introduction().
+	 */
+	ALICE_SENDING_INTRODUCE1,
+
+	/**
+	 * Alice has received an INTRODUCE_ACK cell as an acknowledgement to the
+	 * previous INTRODUCE1 cell; this event is parsed from a log statement in
+	 * rend_client_introduction_acked().
+	 */
+	ALICE_INTRODUCE_ACK_RECEIVED,
+
+	/**
+	 * Alice has received a RENDEZVOUS2 cell and can now open an application
+	 * connection to the client; this event is parsed from a log statement in
+	 * rend_client_receive_rendezvous().
+	 */
+	ALICE_RENDEZVOUS2_RECEIVED_APP_CONN_OPENED,
+
+	/**
+	 * // directory_handle_command_post(): rewritten url as //
+	 * '/tor/rendezvous/publish2'.
+	 * 
+	 * TODO document me
+	 */
+	// HSDIR_PUBLISH_DESC_RECEIVED,
+	/**
+	 * // directory_handle_command_get(): rewritten url as //
+	 * '/tor/rendezvous2/yniedqlk7yhfdlimcbimsyhtchxoer3t'
+	 * 
+	 * TODO document me
+	 */
+	// HSDIR_FETCH_DESC_RECEIVED,
+	/**
+	 * The hidden service directory has stored a v2 descriptor; this event can
+	 * only be parsed from a log statement in a modified Tor!
+	 */
+	HSDIR_DESC_STORED,
+
+	/**
+	 * The directory server has received a descriptor post request; this event
+	 * is parsed from a log statement in directory_handle_command_post().
+	 */
+	DIR_PUBLISH_DESC_RECEIVED,
+
+	/**
+	 * The directory server has received a descriptor fetch request; this event
+	 * is parsed from a log statement in directory_handle_command_get().
+	 */
+	DIR_FETCH_DESC_RECEIVED,
+
+	/**
+	 * The node received an ESTABLISH_INTRO cell, i.e. was requested to work as
+	 * introduction point, and replies with an INTRO_ESTABLISHED cell; this
+	 * event is parsed from a log statement in rend_mid_establish_intro().
+	 */
+	IPO_RECEIVED_ESTABLISH_INTRO_SENDING_INTRO_ESTABLISHED,
+
+	/**
+	 * The introduction point received an INTRODUCE1 cell and reacts by sending
+	 * an INTRODUCE2 cell to Bob and an INTRODUCE_ACK cell to Alice; this event
+	 * is parsed from a log statement in rend_mid_introduce().
+	 */
+	IPO_RECEIVED_INTRODUCE1_SENDING_INTRODUCE2_AND_INTRODUCE_ACK,
+
+	/**
+	 * The node received an ESTABLISH_RENDEZVOUS cell, i.e. was requested to
+	 * work as rendezvous point, and replies with an RENDEZVOUS_ESTABLISHED
+	 * cell; this event is parsed from a log statement in
+	 * rend_mid_establish_rendezvous().
+	 */
+	RPO_RECEIVED_ESTABLISH_RENDEZVOUS_SENDING_RENDEZVOUS_ESTABLISHED,
+
+	/**
+	 * The rendezvous point received a RENDEZVOUS1 cell and reacts by sending a
+	 * RENDEZVOUS2 cell to Alice; this event is parsed from a log statement in
+	 * rend_mid_rendezvous().
+	 */
+	RPO_RECEIVING_RENDEZVOUS1_SENDING_RENDEZVOUS2,
+
+	/**
+	 * The client application is sending a request; this event is fired
+	 * internally and not parsed from a log statement from Tor.
+	 */
+	CLIENT_SENDING_REQUEST,
+
+	/**
+	 * The client application has received a reply to a previously sent request;
+	 * this event is fired internally and not parsed from a log statement from
+	 * Tor.
+	 */
+	CLIENT_REPLY_RECEIVED,
+
+	/**
+	 * The client application has given up waiting for the reply to a previously
+	 * sent request; this event is fired internally and not parsed from a log
+	 * statement from Tor.
+	 */
+	CLIENT_GAVE_UP_REQUEST,
+
+	/**
+	 * The client application has completed a series of requests, whether they
+	 * were successful or not; this event is fired internally and not parsed
+	 * from a log statement from Tor.
+	 */
+	CLIENT_REQUESTS_PERFORMED,
+
+	/**
+	 * The server application has received a request and sent a reply to it;
+	 * this event is fired internally and not parsed from a log statement from
+	 * Tor.
+	 */
+	SERVER_RECEIVING_REQUEST_SENDING_REPLY,
+}


Property changes on: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/EventType.java
___________________________________________________________________
Name: svn:executable
   + *

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/Network.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/Network.java	2007-08-11 14:38:11 UTC (rev 11077)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/Network.java	2007-08-11 15:39:12 UTC (rev 11078)
@@ -1,5 +1,7 @@
 package de.uniba.wiai.lspi.puppetor;
 
+import java.io.File;
+
 /**
  * A Network instance constitutes the central object of any test run and is
  * aware of the node configuration. It creates all nodes for this configuration
@@ -137,8 +139,7 @@
 	/**
 	 * Creates a new <code>ProxyNode</code> and adds it to the
 	 * <code>network</code>, but does not yet write its configuration to disk
-	 * or start the corresponding Tor process. This operation can only be
-	 * invoked, if network status is <code>NetworkState.CONFIGURING_NODES</code>.
+	 * or start the corresponding Tor process.
 	 * 
 	 * @param nodeName
 	 *            The name for this node, which is only used as name for the
@@ -153,9 +154,6 @@
 	 *            for incoming SOCKS requests. May not be negative or greater
 	 *            than 65535.
 	 * @return Reference to the created proxy node.
-	 * @throws IllegalStateException
-	 *             Thrown if network is not in state
-	 *             <code>NetworkState.CONFIGURING_NODES</code>.
 	 * @throws IllegalArgumentException
 	 *             Thrown if an invalid value is given for either of the
 	 *             parameters.
@@ -166,8 +164,6 @@
 	/**
 	 * Creates a new router node and adds it to the network, but does not yet
 	 * write its configuration to disk or start the corresponding Tor process.
-	 * This operation can only be invoked, if network status is
-	 * <code>NetworkState.CONFIGURING_NODES</code>.
 	 * 
 	 * @param nodeName
 	 *            The name for this node, which is used as name for the working
@@ -191,9 +187,6 @@
 	 *            the mirrored directory. May not be negative or greater than
 	 *            65535.
 	 * @return Reference to the created router node.
-	 * @throws IllegalStateException
-	 *             Thrown if network is not in state
-	 *             <code>NetworkState.CONFIGURING_NODES</code>.
 	 * @throws IllegalArgumentException
 	 *             Thrown if an invalid value is given for either of the
 	 *             parameters.
@@ -281,10 +274,10 @@
 			throws TorProcessException;
 
 	/**
-	 * Attempts to shut down all nodes. The method blocks until all shutdown
-	 * requests have been sent and either returns, or throws the first exception
-	 * that has been observed when shutting down nodes. The method can be
-	 * assumed to return very quickly. This operation can only be invoked, if
+	 * Attempts to shut down all running nodes. The method blocks until all
+	 * shutdown requests have been sent and either returns, or throws the first
+	 * exception that has been observed when shutting down nodes. The method can
+	 * be assumed to return very quickly. This operation can only be invoked, if
 	 * network status is <code>NetworkState.NODES_STARTED</code>.
 	 * 
 	 * @throws IllegalStateException
@@ -339,4 +332,12 @@
 	 *             working directories.
 	 */
 	public abstract void writeConfigurations() throws TorProcessException;
+	
+	/**
+	 * Returns the working directory of this network configuration which is in
+	 * test-env/networkName/.
+	 * 
+	 * @return Working directory of this network.
+	 */
+	public abstract File getWorkingDirectory();
 }

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/NetworkState.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/NetworkState.java	2007-08-11 14:38:11 UTC (rev 11077)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/NetworkState.java	2007-08-11 15:39:12 UTC (rev 11078)
@@ -3,12 +3,12 @@
 /**
  * The <code>NetworkState</code> constitutes the single state of a network
  * that is the result of the <code>NodeState</code>s of all nodes in the
- * network. In contrast to <code>Event</code> the network (and node) states
- * depend only on the methods that have been invoked on these objects, and not
- * on asynchronous state changes. Most operations of <code>Network</code>
- * require a certain <code>NetworkState</code> as precondition and may ensure
- * another <code>NetworkState</code> as postcondition. There is a prescribed
- * order of states.
+ * network. In contrast to <code>EventType</code> the network (and node)
+ * states depend only on the methods that have been invoked on these objects,
+ * and not on asynchronous state changes. Most operations of
+ * <code>Network</code> require a certain <code>NetworkState</code> as
+ * precondition and may ensure another <code>NetworkState</code> as
+ * postcondition. There is a prescribed order of states.
  * 
  * @author kloesing
  */

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/NodeState.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/NodeState.java	2007-08-11 14:38:11 UTC (rev 11077)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/NodeState.java	2007-08-11 15:39:12 UTC (rev 11078)
@@ -2,12 +2,12 @@
 
 /**
  * The <code>NodeState</code> constitutes the state of a single Tor node. In
- * contrast to <code>Event</code> the node (and network) states depend only on
- * the methods that have been invoked on these objects, and not on asynchronous
- * state changes. Most operations of <code>ProxyNode</code> and its subclasses
- * require a certain <code>NodeState</code> as precondition and may ensure
- * another <code>NodeState</code> as postcondition. There is a prescribed
- * order of states.
+ * contrast to <code>EventType</code> the node (and network) states depend
+ * only on the methods that have been invoked on these objects, and not on
+ * asynchronous state changes. Most operations of <code>ProxyNode</code> and
+ * its subclasses require a certain <code>NodeState</code> as precondition and
+ * may ensure another <code>NodeState</code> as postcondition. There is a
+ * prescribed order of states.
  * 
  * @author kloesing
  */

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/ProxyNode.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/ProxyNode.java	2007-08-11 14:38:11 UTC (rev 11077)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/ProxyNode.java	2007-08-11 15:39:12 UTC (rev 11078)
@@ -187,4 +187,11 @@
 	 */
 	public abstract void writeConfiguration() throws TorProcessException;
 
+	/**
+	 * Returns the SOCKS port of this node.
+	 * 
+	 * @return The SOCKS port of this node.
+	 */
+	public abstract int getSocksPort();
+
 }

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/RouterNode.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/RouterNode.java	2007-08-11 14:38:11 UTC (rev 11077)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/RouterNode.java	2007-08-11 15:39:12 UTC (rev 11078)
@@ -53,4 +53,14 @@
 	 */
 	public abstract String determineFingerprint() throws TorProcessException;
 
+	/**
+	 * Determines the base32-encoded fingerprint of this node.
+	 * 
+	 * @return The base32-encoded fingerprint of this node.
+	 * @throws TorProcessException
+	 *             Thrown if the fingerprint cannot be determined.
+	 */
+	public abstract String determineFingerprintBase32()
+			throws TorProcessException;
+
 }

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AccessingPublicWebServerOverTor.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AccessingPublicWebServerOverTor.java	2007-08-11 14:38:11 UTC (rev 11077)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AccessingPublicWebServerOverTor.java	2007-08-11 15:39:12 UTC (rev 11078)
@@ -4,6 +4,7 @@
 import de.uniba.wiai.lspi.puppetor.Event;
 import de.uniba.wiai.lspi.puppetor.EventListener;
 import de.uniba.wiai.lspi.puppetor.EventManager;
+import de.uniba.wiai.lspi.puppetor.EventType;
 import de.uniba.wiai.lspi.puppetor.Network;
 import de.uniba.wiai.lspi.puppetor.NetworkFactory;
 import de.uniba.wiai.lspi.puppetor.TorProcessException;
@@ -65,11 +66,11 @@
 			private long before;
 
 			public void handleEvent(Event event) {
-				switch (event) {
-				case APPLICATION_SENDING_REQUEST:
+				switch (event.getType()) {
+				case CLIENT_SENDING_REQUEST:
 					before = System.currentTimeMillis();
 					break;
-				case APPLICATION_REPLY_RECEIVED:
+				case CLIENT_REPLY_RECEIVED:
 					System.out
 							.println("Request took "
 									+ (System.currentTimeMillis() - before)
@@ -88,8 +89,9 @@
 		client.performRequest(3, 20000, true);
 
 		// block this thread as long as client requests are running
-		manager.waitForAnyOccurence(client,
-				Event.APPLICATION_REQUESTS_PERFORMED);
+		manager
+				.waitForAnyOccurence(client,
+						EventType.CLIENT_REQUESTS_PERFORMED);
 
 		// wait a second before shutting down the proxy
 		try {

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AdvertisingAndAccessingHiddenServiceOverPrivateTorNetwork.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AdvertisingAndAccessingHiddenServiceOverPrivateTorNetwork.java	2007-08-11 14:38:11 UTC (rev 11077)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AdvertisingAndAccessingHiddenServiceOverPrivateTorNetwork.java	2007-08-11 15:39:12 UTC (rev 11078)
@@ -4,6 +4,7 @@
 import de.uniba.wiai.lspi.puppetor.Event;
 import de.uniba.wiai.lspi.puppetor.EventListener;
 import de.uniba.wiai.lspi.puppetor.EventManager;
+import de.uniba.wiai.lspi.puppetor.EventType;
 import de.uniba.wiai.lspi.puppetor.Network;
 import de.uniba.wiai.lspi.puppetor.NetworkFactory;
 import de.uniba.wiai.lspi.puppetor.RouterNode;
@@ -44,8 +45,7 @@
 		RouterNode router1 = network.createRouter("router1", 7021, 7022, 7023,
 				7024);
 		network.createRouter("router2", 7031, 7032, 7033, 7034);
-		network.createRouter("router3", 7041, 7042, 7043,
-				7044);
+		network.createRouter("router3", 7041, 7042, 7043, 7044);
 
 		// create two directory nodes with parameters (router name, control
 		// port, SOCKS port, OR port, dir port)
@@ -86,8 +86,8 @@
 
 		// wait for 3 minutes that the proxy has published its first RSD
 
-		if (!manager.waitForAnyOccurence(router1, Event.NODE_RSD_PUBLISHED,
-				3L * 60L * 1000L)) {
+		if (!manager.waitForAnyOccurence(router1,
+				EventType.BOB_DESC_PUBLISHED_RECEIVED, 3L * 60L * 1000L)) {
 			// failed to publish an RSD
 			System.out.println("Failed to publish an RSD!");
 			return;
@@ -123,8 +123,9 @@
 		client.performRequest(5, 45000, true);
 
 		// wait for request to be performed
-		manager.waitForAnyOccurence(client,
-				Event.APPLICATION_REQUESTS_PERFORMED);
+		manager
+				.waitForAnyOccurence(client,
+						EventType.CLIENT_REQUESTS_PERFORMED);
 
 		// shut down nodes
 		network.shutdownNodes();

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AdvertisingAndAccessingHiddenServiceOverPublicTorNetwork.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AdvertisingAndAccessingHiddenServiceOverPublicTorNetwork.java	2007-08-11 14:38:11 UTC (rev 11077)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AdvertisingAndAccessingHiddenServiceOverPublicTorNetwork.java	2007-08-11 15:39:12 UTC (rev 11078)
@@ -4,6 +4,7 @@
 import de.uniba.wiai.lspi.puppetor.Event;
 import de.uniba.wiai.lspi.puppetor.EventListener;
 import de.uniba.wiai.lspi.puppetor.EventManager;
+import de.uniba.wiai.lspi.puppetor.EventType;
 import de.uniba.wiai.lspi.puppetor.Network;
 import de.uniba.wiai.lspi.puppetor.NetworkFactory;
 import de.uniba.wiai.lspi.puppetor.ProxyNode;
@@ -65,8 +66,8 @@
 		EventManager manager = network.getEventManager();
 
 		// wait for 3 minutes that the proxy has published its first RSD
-		if (!manager.waitForAnyOccurence(proxy1, Event.NODE_RSD_PUBLISHED,
-				3L * 60L * 1000L)) {
+		if (!manager.waitForAnyOccurence(proxy1,
+				EventType.BOB_DESC_PUBLISHED_RECEIVED, 3L * 60L * 1000L)) {
 
 			// failed to publish an RSD
 			System.out.println("Failed to publish an RSD!");
@@ -93,22 +94,22 @@
 			private long requestSentFromClient;
 
 			public void handleEvent(Event event) {
-				switch (event) {
-				case APPLICATION_SENDING_REQUEST:
-					requestSentFromClient = System.currentTimeMillis();
+				switch (event.getType()) {
+				case CLIENT_SENDING_REQUEST:
+					requestSentFromClient = event.getOccurrenceTime();
 					break;
-				case APPLICATION_REQUEST_RECEIVED:
-					requestReceivedAtServer = System.currentTimeMillis();
+				case SERVER_RECEIVING_REQUEST_SENDING_REPLY:
+					requestReceivedAtServer = event.getOccurrenceTime();
 					System.out.println("Request took "
 							+ (requestReceivedAtServer - requestSentFromClient)
 							+ " millis from client to server!");
 					break;
-				case APPLICATION_REPLY_RECEIVED:
+				case CLIENT_REPLY_RECEIVED:
 					System.out
 							.println("Request took "
-									+ (System.currentTimeMillis() - requestSentFromClient)
+									+ (event.getOccurrenceTime() - requestSentFromClient)
 									+ " millis for the round-trip and "
-									+ (System.currentTimeMillis() - requestReceivedAtServer)
+									+ (event.getOccurrenceTime() - requestReceivedAtServer)
 									+ " millis from server to client!");
 				}
 			}
@@ -125,8 +126,9 @@
 		client.performRequest(5, 45000, true);
 
 		// block this thread as long as client requests are running
-		manager.waitForAnyOccurence(client,
-				Event.APPLICATION_REQUESTS_PERFORMED);
+		manager
+				.waitForAnyOccurence(client,
+						EventType.CLIENT_REQUESTS_PERFORMED);
 
 		// shut down proxy
 		network.shutdownNodes();

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AdvertisingHiddenServiceToPublicTorNetwork.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AdvertisingHiddenServiceToPublicTorNetwork.java	2007-08-11 14:38:11 UTC (rev 11077)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/AdvertisingHiddenServiceToPublicTorNetwork.java	2007-08-11 15:39:12 UTC (rev 11078)
@@ -48,13 +48,13 @@
 			private long circuitOpened = -1;
 
 			public void handleEvent(Event event) {
-				switch (event) {
+				switch (event.getType()) {
 				case NODE_CIRCUIT_OPENED:
 					if (circuitOpened == -1) {
 						circuitOpened = System.currentTimeMillis();
 					}
 					break;
-				case NODE_RSD_PUBLISHED:
+				case BOB_DESC_PUBLISHED_RECEIVED:
 					System.out.println("RSD published "
 							+ (System.currentTimeMillis() - circuitOpened)
 							+ " millis after first circuit was opened");

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/DistributedStorage.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/DistributedStorage.java	2007-08-11 14:38:11 UTC (rev 11077)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/examples/DistributedStorage.java	2007-08-11 15:39:12 UTC (rev 11078)
@@ -1,143 +1,1521 @@
-package de.uniba.wiai.lspi.puppetor.examples;
-
-import de.uniba.wiai.lspi.puppetor.ClientApplication;
-import de.uniba.wiai.lspi.puppetor.DirectoryNode;
-import de.uniba.wiai.lspi.puppetor.Event;
-import de.uniba.wiai.lspi.puppetor.EventListener;
-import de.uniba.wiai.lspi.puppetor.EventManager;
-import de.uniba.wiai.lspi.puppetor.Network;
-import de.uniba.wiai.lspi.puppetor.NetworkFactory;
-import de.uniba.wiai.lspi.puppetor.RouterNode;
-import de.uniba.wiai.lspi.puppetor.ServerApplication;
-import de.uniba.wiai.lspi.puppetor.TorProcessException;
-
-/**
- * Example for distributed storage of hidden service descriptors which
- * <b>require changes to the Tor sources as in SVN branch 114-dist-storage</b>.
- * 
- * @author kloesing
- */
-public class DistributedStorage {
-
-	/**
-	 * Sets up and runs the test.
-	 * 
-	 * @param args
-	 *            Command-line arguments (ignored).
-	 * @throws TorProcessException
-	 *             Thrown if there is a problem with the JVM-external Tor
-	 *             processes that we cannot handle.
-	 */
-	public static void main(String[] args) throws TorProcessException {
-
-		// create a network to initialize a test case
-		Network network = NetworkFactory.createNetwork("example5");
-
-		// create three router nodes with parameters (router name, control port,
-		// SOCKS port, OR port, dir mirror port)
-		RouterNode router1 = network.createRouter("router1", 7021, 7022, 7023,
-				7024);
-		RouterNode router2 = network.createRouter("router2", 7031, 7032, 7033,
-				7034);
-		RouterNode router3 = network.createRouter("router3", 7041, 7042, 7043,
-				7044);
-
-		// create two directory nodes with parameters (router name, control
-		// port, SOCKS port, OR port, dir port)
-		DirectoryNode dir1 = network.createDirectory("dir1", 7051, 7052, 7053,
-				7054);
-		DirectoryNode dir2 = network.createDirectory("dir2", 7061, 7062, 7063,
-				7064);
-
-		// let router1 only publish v2 descriptors
-		router1.addConfiguration("PublishHidServDescriptors 0");
-		router1.addConfiguration("PublishV2HidServDescriptors 1");
-
-		// let router3 only fetch v2 descriptors
-		router3.addConfiguration("FetchHidServDescriptors 0");
-		router3.addConfiguration("FetchV2HidServDescriptors 1");
-
-		// let three nodes act as hidden service directories
-		router2.addConfiguration("HSDir 1");
-		dir1.addConfiguration("HSDir 1");
-		dir2.addConfiguration("HSDir 1");
-
-		// add hidden service to the configuration of router1
-		router1.addHiddenService("hidServ1", 7025, 81);
-
-		// configure nodes of this network to be part of a private network
-		network.configureAsPrivateNetwork();
-
-		// write configuration of proxy node
-		network.writeConfigurations();
-
-		// start proxy node and wait until it has opened a circuit with a
-		// timeout of 5 seconds
-		if (!network.startNodes(5000)) {
-
-			// failed to start the proxy
-			System.out.println("Failed to start nodes!");
-			return;
-		}
-		System.out.println("Successfully started nodes!");
-
-		// hup until proxy has built circuits (8 retries, 10 seconds timeout
-		// each)
-		if (!network.hupUntilUp(8, 10000)) {
-
-			// failed to build circuits
-			System.out.println("Failed to build circuits!");
-			return;
-		}
-		System.out.println("Successfully built circuits!");
-
-		// let it run for 1 minute...
-		System.out.println("Waiting for 1 minute...");
-		try {
-			Thread.sleep(1L * 60L * 1000L);
-		} catch (InterruptedException e) {
-			// do nothing
-		}
-
-		// start server and listen
-		ServerApplication server = network.createServer("server", 7025);
-		server.listen();
-
-		// obtain onion address of hidden service
-		String onionAddress = router1.getOnionAddress("hidServ1", 2);
-
-		// create client and try to access it
-		ClientApplication client = network.createClient("client", onionAddress,
-				81, 7042);
-
-		// obtain reference to event manager to be able to respond to events
-		EventManager manager = network.getEventManager();
-
-		// create event listener to listen for events from our proxy
-		EventListener eventListener = new EventListener() {
-
-			public void handleEvent(Event event) {
-				System.out.println(event.toString());
-			}
-		};
-
-		// register event handler for events
-		manager.addEventListener(client, eventListener);
-		manager.addEventListener(server, eventListener);
-
-		client.performRequest(2, 10000, true);
-
-		// wait for some seconds
-		System.out.println("Waiting for 30 seconds...");
-		try {
-			Thread.sleep(30L * 1000L);
-		} catch (InterruptedException e) {
-			// do nothing
-		}
-
-		// shut down nodes
-		network.shutdownNodes();
-
-		System.out.println("Exiting...");
-	}
-}
+package de.uniba.wiai.lspi.puppetor.examples;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+import de.uniba.wiai.lspi.puppetor.ClientApplication;
+import de.uniba.wiai.lspi.puppetor.DirectoryNode;
+import de.uniba.wiai.lspi.puppetor.Event;
+import de.uniba.wiai.lspi.puppetor.EventListener;
+import de.uniba.wiai.lspi.puppetor.EventManager;
+import de.uniba.wiai.lspi.puppetor.EventSource;
+import de.uniba.wiai.lspi.puppetor.EventType;
+import de.uniba.wiai.lspi.puppetor.Network;
+import de.uniba.wiai.lspi.puppetor.NetworkFactory;
+import de.uniba.wiai.lspi.puppetor.ProxyNode;
+import de.uniba.wiai.lspi.puppetor.RouterNode;
+import de.uniba.wiai.lspi.puppetor.TorProcessException;
+
+/**
+ * <p>
+ * Automatic validation of the distributed storage for hidden service
+ * descriptors as described in proposal 114. <b>WARNING: This example does not
+ * work with an unmodified Tor!</b>
+ * </p>
+ * 
+ * <p>
+ * When running, the example starts a network of local Tor processes, consisting
+ * of 2 directory nodes and 9 periodically changing onion routers, some of them
+ * (not the initial nodes, but those nodes replacing them) with attached hidden
+ * services.
+ * </p>
+ * 
+ * <p>
+ * The automatic validation performs four measurements:
+ * </p>
+ * 
+ * <ol>
+ * <li>Are the online statuses of hidden service directories propagated to all
+ * running nodes successfully, and how long does propagation take?</li>
+ * <li>The same measurement with offline statuses.</li>
+ * <li>Are hidden service descriptors stored on the correct, responsible hidden
+ * service directories, and how long does propagation take?</li>
+ * <li>Are hidden service requests successful within a given timeout?</li>
+ * </ol>
+ * 
+ * @author kloesing
+ */
+public class DistributedStorage {
+
+	/**
+	 * Observes a hidden service directory from starting it to shutting it down.
+	 * Waits for 24 hours after starting the node, so that it will be accepted
+	 * as hidden service directory by the directory authorities. Afterwards,
+	 * initiates an online propagation measurement for every node that is in the
+	 * network or that enters the network while the observed hidden service
+	 * directory is online. After going offline, initiates an offline
+	 * propagation measurement for every node that has previously accepted this
+	 * hidden service directory.
+	 */
+	private static class HiddenServiceDirectoryObserver extends Thread
+			implements EventListener {
+
+		/**
+		 * Is the hidden service directory online for at least 24 hours, so that
+		 * it will be listed by the directory authorities?
+		 */
+		private boolean twentyFourHoursUp;
+
+		/**
+		 * The Tor process behind the observed hidden service directory.
+		 */
+		private EventSource hsdNode;
+
+		/**
+		 * The node ID of the observed hidden service directory.
+		 */
+		private String nodeID;
+
+		/**
+		 * Set of nodes that have reported to accept this hidden service
+		 * directory.
+		 */
+		private Set<EventSource> nodesThatKnowMe = new HashSet<EventSource>();
+
+		/**
+		 * Creates a new observer instance, but does not start it yet.
+		 * 
+		 * @param hsdNode
+		 *            The Tor process behind the observed hidden service
+		 *            directory.
+		 * @param nodeID
+		 *            The node ID of the observed hidden service directory.
+		 */
+		private HiddenServiceDirectoryObserver(EventSource hsdNode,
+				String nodeID) {
+
+			// remember the args
+			this.nodeID = nodeID;
+			this.hsdNode = hsdNode;
+
+			// listen for events coming from my HSDir
+			manager.addEventListener(hsdNode, this);
+
+			// listen for starting/stopping nodes
+			manager.addEventListener(this);
+		}
+
+		@Override
+		public synchronized void run() {
+
+			// not yet accepted
+			this.twentyFourHoursUp = false;
+
+			// wait for 24 hours until hsdir is accepted by DAs
+			long startingTime = System.currentTimeMillis();
+			// for testing; change to 24 * 60 * 60 * 1000
+			long endOfWaiting = startingTime + 30 * 60 * 1000;
+			long now;
+			while ((now = System.currentTimeMillis()) < endOfWaiting) {
+				try {
+					wait(endOfWaiting - now);
+				} catch (InterruptedException e) {
+				}
+			}
+
+			// accepted
+			this.twentyFourHoursUp = true;
+
+			// add to set of running hidden service directories
+			globalRoutingTable.addHiddenServiceDirectory(this.nodeID,
+					this.hsdNode);
+
+			// measure how long the current nodes need to get aware of this
+			// hidden service directory
+			for (RouterNode router : runningRouters) {
+				new OnlinePropagationMeasurement(router, this.hsdNode,
+						this.nodeID).start();
+			}
+		}
+
+		public synchronized void handleEvent(Event event) {
+
+			if (!this.twentyFourHoursUp) {
+				// when the represented node is not running for at least 24
+				// hours, others would not consider it as hidden service
+				// directory and we cannot perform any useful measurements
+				return;
+			}
+
+			if (event.getType() == EventType.NODE_STARTED) {
+				// when another node is started, initiate measurement of the
+				// propagation time that this hiddden service directory is
+				// online
+				new OnlinePropagationMeasurement(event.getSource(),
+						this.hsdNode, this.nodeID).start();
+
+			} else if (event.getSource() == this.hsdNode
+					&& event.getType() == EventType.NODE_STOPPED) {
+				// when the represented node is stopped, initiate measurement of
+				// the propagation time that this hidden service directory is
+				// offline (any online propagation measurements that are still
+				// running will realize by themselves that they cannot succeed
+				// and will abort)
+				for (EventSource node : nodesThatKnowMe) {
+					if (node != this.hsdNode) {
+						new OfflinePropagationMeasurement(node, this.hsdNode,
+								this.nodeID).start();
+					}
+				}
+
+				// remove from set of running hidden service directories
+				globalRoutingTable.removeHiddenServiceDirectory(this.nodeID);
+
+				// stop listening for events
+				manager.removeEventListener(this);
+
+				// just in case that there is another event in the queue, don't
+				// handle it any more
+				this.twentyFourHoursUp = false;
+
+			} else if (event.getType() == EventType.NODE_ROUTING_TABLE_CHANGED
+					&& event.getMessage().contains(this.nodeID)) {
+				// when some node reports to have changed its routing table and
+				// now includes the node ID of the represented node, remember
+				// that node for later offline propagation measurement
+				nodesThatKnowMe.add(event.getSource());
+
+			} else if (event.getType() == EventType.NODE_STOPPED
+					&& event.getSource() != this.hsdNode) {
+				// when some other node is stopped, remove it from the list of
+				// nodes that know that the represented hidden service directory
+				// is online
+				nodesThatKnowMe.remove(event.getSource());
+			}
+		}
+	}
+
+	/**
+	 * The states in which a measurement can be.
+	 */
+	private static enum MeasurementState {
+
+		/**
+		 * The measurement was started and is currently running.
+		 */
+		STARTED,
+
+		/**
+		 * The measurement has succeeded with a positive result.
+		 */
+		SUCCEEDED,
+
+		/**
+		 * The measurement has failed within the given maximum time.
+		 */
+		FAILED,
+
+		/**
+		 * The measurement was aborted, because it has become impossible to
+		 * succeed.
+		 */
+		ABORTED
+	}
+
+	/**
+	 * Verifies that the online status of a given hidden service directory is
+	 * propagated to a given running node, and measures how long that
+	 * propagation takes. If the propagation does not succeed within one hour,
+	 * it is considered as failed.
+	 */
+	private static class OnlinePropagationMeasurement extends Thread implements
+			EventListener {
+
+		/**
+		 * The state of this measurement.
+		 */
+		private MeasurementState measurementState;
+
+		/**
+		 * The node ID of the hidden service directory.
+		 */
+		private String hsdNodeID;
+
+		/**
+		 * The hidden service directory of which the online status should be
+		 * propagated.
+		 */
+		private EventSource hsdNode;
+
+		/**
+		 * The node to which the online status should be propagated.
+		 */
+		private EventSource node;
+
+		/**
+		 * Creates a new measurement, but does not start it yet.
+		 * 
+		 * @param node
+		 *            The node to which the online status should be propagated.
+		 * @param hsdNode
+		 *            The hidden service directory of which the online status
+		 *            should be propagated.
+		 * @param hsdNodeID
+		 *            The node ID of the hidden service directory.
+		 */
+		private OnlinePropagationMeasurement(EventSource node,
+				EventSource hsdNode, String hsdNodeID) {
+
+			// remember the args
+			this.hsdNodeID = hsdNodeID;
+			this.hsdNode = hsdNode;
+			this.node = node;
+
+			// listen for events coming from the node and the hidden service
+			// directory
+			manager.addEventListener(node, this);
+			manager.addEventListener(hsdNode, this);
+
+		}
+
+		@Override
+		public synchronized void run() {
+
+			// start the measurement in state STARTED
+			this.measurementState = MeasurementState.STARTED;
+
+			// wait for a maximum of one hour for the measurement to succeed
+			long startingTime = System.currentTimeMillis();
+			long endOfWaiting = startingTime + 60 * 60 * 1000;
+			long now;
+			while (this.measurementState == MeasurementState.STARTED
+					&& (now = System.currentTimeMillis()) < endOfWaiting) {
+				try {
+					wait(endOfWaiting - now);
+				} catch (InterruptedException e) {
+				}
+			}
+
+			// if the node did not learn about the hidden service directory
+			// within one hour, fail the measurement
+			if (this.measurementState == MeasurementState.STARTED) {
+				measurementState = MeasurementState.FAILED;
+			}
+
+			// unregister event listener
+			manager.removeEventListener(this);
+
+			// print out measurement result
+			long duration = System.currentTimeMillis() - startingTime;
+			System.out.println(new Date() + ": Online propagation for HSDir "
+					+ this.hsdNode.getName() + " to node "
+					+ this.node.getName() + " took " + (duration / 1000)
+					+ " seconds and ended in state "
+					+ measurementState.toString());
+			if (this.measurementState == MeasurementState.SUCCEEDED) {
+				resultWriter.writeOnlinePropagation(duration / 1000);
+			} else if (this.measurementState == MeasurementState.FAILED) {
+				resultWriter.writeOnlinePropagation(-1);
+			}
+		}
+
+		public synchronized void handleEvent(Event event) {
+
+			// only accept events when this measurement is running
+			if (measurementState != MeasurementState.STARTED) {
+				return;
+			}
+
+			if (event.getSource() == this.node
+					&& event.getType() == EventType.NODE_ROUTING_TABLE_CHANGED
+					&& event.getMessage().contains(this.hsdNodeID)) {
+				// when the node has added the node ID of the hidden service
+				// directory, succeed the measurement
+				this.measurementState = MeasurementState.SUCCEEDED;
+				notify();
+
+			} else if (event.getType() == EventType.NODE_STOPPED) {
+				// when either the node or the hidden service directory were
+				// stopped within the one hour period, the measurement cannot be
+				// succeeded anymore and is therefore aborted
+				this.measurementState = MeasurementState.ABORTED;
+				notify();
+			}
+		}
+	}
+
+	/**
+	 * Verifies that the offline status of a given hidden service directory is
+	 * propagated to a given running node, and measures how long that
+	 * propagation takes. If the propagation does not succeed within one hour,
+	 * it is considered as failed.
+	 */
+	private static class OfflinePropagationMeasurement extends Thread implements
+			EventListener {
+
+		/**
+		 * The state of this measurement.
+		 */
+		private MeasurementState measurementState;
+
+		/**
+		 * The node ID of the hidden service directory.
+		 */
+		private String hsdNodeID;
+
+		/**
+		 * The hidden service directory of which the offline status should be
+		 * propagated.
+		 */
+		private EventSource hsdNode;
+
+		/**
+		 * The node to which the offline status should be propagated.
+		 */
+		private EventSource node;
+
+		/**
+		 * Creates a new measurement, but does not start it yet.
+		 * 
+		 * @param node
+		 *            The node to which the offline status should be propagated.
+		 * @param hsdNode
+		 *            The hidden service directory of which the offline status
+		 *            should be propagated.
+		 * @param hsdNodeID
+		 *            The node ID of the hidden service directory.
+		 */
+		private OfflinePropagationMeasurement(EventSource node,
+				EventSource hsdNode, String hsdNodeID) {
+
+			// remember the args
+			this.hsdNodeID = hsdNodeID;
+			this.node = node;
+			this.hsdNode = hsdNode;
+
+			// register for events from the node that should observe the offline
+			// status
+			manager.addEventListener(node, this);
+		}
+
+		@Override
+		public synchronized void run() {
+
+			// start the measurement in state STARTED
+			this.measurementState = MeasurementState.STARTED;
+
+			// wait for a maximum of 90 minutes for the measurement to succeed
+			long startingTime = System.currentTimeMillis();
+			long endOfWaiting = startingTime + 90 * 60 * 1000;
+			long now;
+			while (this.measurementState == MeasurementState.STARTED
+					&& (now = System.currentTimeMillis()) < endOfWaiting) {
+				try {
+					wait(endOfWaiting - now);
+				} catch (InterruptedException e) {
+				}
+			}
+
+			// if the node did not learn about the offline status of the hidden
+			// service directory, fail the measurement
+			if (this.measurementState == MeasurementState.STARTED) {
+				measurementState = MeasurementState.FAILED;
+			}
+
+			// unregister event listener
+			manager.removeEventListener(this);
+
+			// print out measurement result
+			long duration = System.currentTimeMillis() - startingTime;
+			System.out.println(new Date() + ": Offline propagation for HSDir "
+					+ this.hsdNode.getName() + " to node "
+					+ this.node.getName() + " took " + (duration / 1000)
+					+ " seconds and ended in state "
+					+ measurementState.toString());
+			if (this.measurementState == MeasurementState.SUCCEEDED) {
+				resultWriter.writeOfflinePropagation(duration / 1000);
+			} else if (this.measurementState == MeasurementState.FAILED) {
+				resultWriter.writeOfflinePropagation(-1);
+			}
+		}
+
+		public synchronized void handleEvent(Event event) {
+
+			// only accept events when this measurement is running
+			if (measurementState != MeasurementState.STARTED) {
+				return;
+			}
+
+			if (event.getType() == EventType.NODE_ROUTING_TABLE_CHANGED
+					&& !event.getMessage().contains(this.hsdNodeID)) {
+				// when the node has removed the node ID of the hidden service
+				// directory, succeed the measurement
+				this.measurementState = MeasurementState.SUCCEEDED;
+				notify();
+
+			} else if (event.getType() == EventType.NODE_STOPPED) {
+				// when the node was stopped within the waiting period, the
+				// measurement cannot be
+				// succeeded anymore and is therefore aborted
+				this.measurementState = MeasurementState.ABORTED;
+				notify();
+			}
+		}
+	}
+
+	/**
+	 * Manages the global routing table of all hidden service directories. This
+	 * global view differs from the local views of the nodes, because of the
+	 * propagation latency which may take some tens of minutes.
+	 */
+	private static class GlobalRoutingTable {
+
+		private static Comparator<String> comparator = new Comparator<String>() {
+
+			int[] base32Lookup = { 0xFF, 0xFF, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E,
+					0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+					0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
+					0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13,
+					0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0xFF, 0xFF, 0xFF, 0xFF,
+					0xFF, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+					0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11,
+					0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0xFF, 0xFF,
+					0xFF, 0xFF, 0xFF };
+
+			private String base32toHex(String base32) {
+
+				int i, index, lookup, offset, digit;
+
+				byte[] bytes = new byte[base32.length() * 5 / 8];
+
+				for (i = 0, index = 0, offset = 0; i < base32.length(); i++) {
+					lookup = base32.charAt(i) - '0';
+
+					/* Skip chars outside the lookup table */
+					if (lookup < 0 || lookup >= base32Lookup.length)
+						continue;
+
+					digit = base32Lookup[lookup];
+
+					/* If this digit is not in the table, ignore it */
+					if (digit == 0xFF)
+						continue;
+
+					if (index <= 3) {
+						index = (index + 5) % 8;
+						if (index == 0) {
+							bytes[offset] |= digit;
+							offset++;
+							if (offset >= bytes.length)
+								break;
+						} else
+							bytes[offset] |= digit << (8 - index);
+					} else {
+						index = (index + 5) % 8;
+						bytes[offset] |= (digit >>> index);
+						offset++;
+
+						if (offset >= bytes.length)
+							break;
+						bytes[offset] |= digit << (8 - index);
+					}
+				}
+				StringBuilder result = new StringBuilder();
+				for (byte b : bytes) {
+					result.append(Integer
+							.toHexString(new Integer(b).intValue()));
+				}
+				return result.toString();
+			}
+
+			public int compare(String arg0, String arg1) {
+				return base32toHex(arg0).compareTo(base32toHex(arg1));
+			}
+		};
+
+		private SortedMap<String, EventSource> hsDirs = new TreeMap<String, EventSource>(
+				comparator);
+
+		private synchronized void addHiddenServiceDirectory(String nodeID,
+				EventSource hsdNode) {
+			this.hsDirs.put(nodeID, hsdNode);
+			notifyAll();
+		}
+
+		private synchronized void removeHiddenServiceDirectory(String nodeID) {
+			this.hsDirs.remove(nodeID);
+			notifyAll();
+		}
+
+		/**
+		 * Returns the set of responsible hidden service directories for the
+		 * given descriptor ID.
+		 * 
+		 * @param descID
+		 *            The descriptor ID for which the responsible hidden service
+		 *            directories shall be determined.
+		 * @return The set of responsible hidden service directories.
+		 */
+		private synchronized Set<EventSource> getResponsibleHSDirs(String descID) {
+
+			Set<EventSource> result = new HashSet<EventSource>();
+			if (this.hsDirs.size() < 3) {
+				return result;
+			}
+
+			for (EventSource s : this.hsDirs.tailMap(descID).values()) {
+				if (result.size() < 3) {
+					result.add(s);
+				} else {
+					break;
+				}
+			}
+
+			for (EventSource s : this.hsDirs.values()) {
+				if (result.size() < 3) {
+					result.add(s);
+				} else {
+					break;
+				}
+			}
+
+			return result;
+		}
+
+		/**
+		 * Waits for the given number of millis until either a node is added or
+		 * removed.
+		 * 
+		 * @param timeToWait
+		 *            The number of millis to wait.
+		 */
+		public synchronized void waitForRoutingTableChange(long timeToWait) {
+			try {
+				wait(timeToWait);
+			} catch (InterruptedException e) {
+			}
+		}
+	}
+
+	/**
+	 * The routing table containing the global state of all hidden service
+	 * directories in the network.
+	 */
+	private static GlobalRoutingTable globalRoutingTable = new GlobalRoutingTable();
+
+	/**
+	 * Observes all publications of descriptors by hidden service providers.
+	 * Whenever there is a novel descriptor, the observer launches measurements
+	 * of the ropagation of the new descriptor to the responsible hidden service
+	 * directories.
+	 */
+	private static class DescriptorObserverStarter implements EventListener {
+
+		/**
+		 * Set of all descriptor IDs that have been observed so far.
+		 */
+		private Set<String> knownDescIDs = new HashSet<String>();
+
+		/**
+		 * Creates a new observer that starts listening for events.
+		 */
+		private DescriptorObserverStarter() {
+			manager.addEventListener(this);
+		}
+
+		public void handleEvent(Event event) {
+			// listen for new desc-ids
+			if (event.getType() == EventType.BOB_SENDING_PUBLISH_DESC) {
+				// a descriptor was published by any hidden service provider;
+				// check if this descriptor ID is novel
+
+				// parse desc id from the following message:
+				// "Sending publish request for v2 descriptor for service '.*'
+				// with descriptor ID '.*' with validity of .* seconds [...]"
+				String message = event.getMessage();
+				String prefixDescID = "with descriptor ID '";
+				String descID = message.substring(message.indexOf(prefixDescID)
+						+ prefixDescID.length());
+				descID = descID.substring(0, 32);
+
+				if (!knownDescIDs.contains(descID)) {
+					String prefixSecondsValid = "with validity of ";
+					String secondsValidPlusRest = message.substring(message
+							.indexOf(prefixSecondsValid)
+							+ prefixSecondsValid.length());
+					String[] splitted = secondsValidPlusRest.split(" ");
+					long secondsValid = Long.parseLong(splitted[0]);
+
+					if (secondsValid > 30 * 60) {
+						new DescriptorObserver(descID, secondsValid).start();
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * Observes a descriptor from its first publication to 30 minutes before its
+	 * validity ends. Initiates a descriptor propagation measurement for every
+	 * hidden service directory that either is or becomes responsible for the
+	 * descriptor ID. (This does not include checks that a descriptor remains
+	 * stored on the responsible hidden service directories.)
+	 */
+	private static class DescriptorObserver extends Thread {
+
+		/**
+		 * The descriptor ID of the observed descriptor.
+		 */
+		private String descID;
+
+		/**
+		 * Time in millis when the validity of the observed descriptor amounts
+		 * 30 minutes.
+		 */
+		private long endOfWaiting;
+
+		/**
+		 * The set of hidden service directories that we think is responsible
+		 * for storing the observed descriptor.
+		 */
+		private Set<EventSource> hsDirsDeemedResponsible;
+
+		/**
+		 * Creates a new observer instance, but does not start it yet.
+		 * 
+		 * @param descID
+		 *            The descriptor ID of the observed descriptor.
+		 * @param validityInSeconds
+		 *            The validity of the descriptor in seconds.
+		 */
+		private DescriptorObserver(String descID, long validityInSeconds) {
+
+			// remember the args
+			this.descID = descID;
+
+			// determine when the validity of the observed descriptor amounts 30
+			// minutes
+			this.endOfWaiting = System.currentTimeMillis() + validityInSeconds
+					* 1000 - 30 * 60 * 1000;
+		}
+
+		@Override
+		public void run() {
+
+			if (System.currentTimeMillis() < this.endOfWaiting) {
+				// when the descriptor is not valid for at least 30 minutes, we
+				// don't need to perform any measurements at all, because it is
+				// quite unlikely that they would succeed
+				return;
+			}
+
+			// start measurements for the currently responsible hidden service
+			// directories
+			hsDirsDeemedResponsible = globalRoutingTable
+					.getResponsibleHSDirs(this.descID);
+			for (EventSource responsibleDir : hsDirsDeemedResponsible) {
+				new DescriptorPropagationMeasurement(responsibleDir,
+						this.descID).start();
+			}
+
+			// wait until the validity of the descriptor is 30 minutes or less
+			long now;
+			while ((now = System.currentTimeMillis()) < this.endOfWaiting) {
+
+				// wait for changes in the global routing table
+				globalRoutingTable.waitForRoutingTableChange(this.endOfWaiting
+						- now);
+
+				// check if the descriptor validity is still sufficient to
+				// initiate new measurements
+				if (now < this.endOfWaiting) {
+
+					// check if the change affects us
+					Set<EventSource> newResponsibleHSDirs = globalRoutingTable
+							.getResponsibleHSDirs(this.descID);
+					Set<EventSource> newcomers = new HashSet<EventSource>(
+							newResponsibleHSDirs);
+					newcomers.removeAll(this.hsDirsDeemedResponsible);
+					if (newcomers.size() > 0) {
+
+						// initiate a new measurement for every new responsible
+						// hidden service directory
+						for (EventSource responsibleDir : newcomers) {
+							new DescriptorPropagationMeasurement(
+									responsibleDir, this.descID).start();
+						}
+						this.hsDirsDeemedResponsible = newResponsibleHSDirs;
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * Verifies that a descriptor is propagated to a given hidden service
+	 * directory, and measures how long that propagation takes. If the
+	 * propagation does not succeed within 90 minutes, it is considered as
+	 * failed, unless a change in the routing table makes the hidden service
+	 * directory irresponsible for the given descriptor.
+	 */
+	private static class DescriptorPropagationMeasurement extends Thread
+			implements EventListener {
+
+		/**
+		 * The state of this measurement.
+		 */
+		private MeasurementState measurementState;
+
+		/**
+		 * The descriptor ID of the observed descriptor.
+		 */
+		private String descid;
+
+		/**
+		 * The hidden service directory that is deemed responsible to store the
+		 * given descriptor.
+		 */
+		private EventSource responsibleHSDir;
+
+		/**
+		 * Creates a new measurement instance, but does not start it yet.
+		 * 
+		 * @param responsibleHSDir
+		 *            The hidden service directory that is deemed responsible to
+		 *            store the given descriptor.
+		 * @param descid
+		 *            The descriptor ID of the observed descriptor.
+		 */
+		private DescriptorPropagationMeasurement(EventSource responsibleHSDir,
+				String descid) {
+
+			// remember the args
+			this.responsibleHSDir = responsibleHSDir;
+			this.descid = descid;
+
+			// register for events from the hidden service directory
+			manager.addEventListener(responsibleHSDir, this);
+		}
+
+		@Override
+		public synchronized void run() {
+
+			// start the measurement in state STARTED
+			this.measurementState = MeasurementState.STARTED;
+
+			// wait for a maximum of 90 minutes for the measurement to succeed
+			long startingTime = System.currentTimeMillis();
+			long endOfWaiting = startingTime + 90 * 60 * 1000;
+			long now;
+			while (this.measurementState == MeasurementState.STARTED
+					&& (now = System.currentTimeMillis()) < endOfWaiting) {
+
+				// wait for a change in the routing table, that might make the
+				// hidden service directory irresponsible for the given
+				// descriptor, or be interrupted by an incoming event
+				globalRoutingTable
+						.waitForRoutingTableChange(endOfWaiting - now);
+
+				if (this.measurementState == MeasurementState.STARTED
+						&& !globalRoutingTable
+								.getResponsibleHSDirs(this.descid).contains(
+										this.responsibleHSDir)) {
+					// routing table has changed, so that the hidden service
+					// directory is not responsible for the given descriptor any
+					// more
+					this.measurementState = MeasurementState.ABORTED;
+				}
+			}
+
+			// if the node did not learn about the hidden service directory
+			// within the given time, fail the measurement
+			if (this.measurementState == MeasurementState.STARTED) {
+				measurementState = MeasurementState.FAILED;
+			}
+
+			// unregister event listener
+			manager.removeEventListener(this);
+
+			// print out measurement result
+			long duration = System.currentTimeMillis() - startingTime;
+			System.out.println(new Date()
+					+ ": Descriptor propagation for desc ID " + this.descid
+					+ " took " + (duration / 1000)
+					+ " seconds to responsible HS directory "
+					+ this.responsibleHSDir.getName() + " and ended in state "
+					+ measurementState.toString());
+			if (this.measurementState == MeasurementState.SUCCEEDED) {
+				resultWriter.writeDescriptorPropagation(duration / 1000);
+			} else if (this.measurementState == MeasurementState.FAILED) {
+				resultWriter.writeDescriptorPropagation(-1);
+			}
+		}
+
+		public synchronized void handleEvent(Event event) {
+
+			if (event.getType() == EventType.HSDIR_DESC_STORED
+					&& event.getMessage().contains(this.descid)) {
+				// when the hidden service directory stores the given descriptor
+				// for the first time, the measurement succeeds
+				this.measurementState = MeasurementState.SUCCEEDED;
+				interrupt();
+			}
+		}
+	}
+
+	/**
+	 * wartet 20 min nach hinzufügen eines hidserv, um ihn anschließend als
+	 * verfügbar zu markieren
+	 * 
+	 * @author karsten
+	 * 
+	 */
+	/**
+	 * Observes a descriptor for the first 20 minutes after starting it before
+	 * adding it to the list of available hidden services. When the node is
+	 * stopped (within or after the 20 minutes), the hidden service will be
+	 * removed from the list of available hidden services.
+	 */
+	private static class HiddenServiceObserver extends Thread implements
+			EventListener {
+
+		/**
+		 * The onion address by which this hidden service can be accessed.
+		 */
+		private String onionAddress;
+
+		/**
+		 * The node that provides the hidden service.
+		 */
+		private EventSource providingNode;
+
+		/**
+		 * Creates a new observer instance, but does not start it yet.
+		 * 
+		 * @param providingNode
+		 *            The node that provides the hidden service.
+		 * @param onionAddress
+		 *            The onion address by which this hidden service can be
+		 *            accessed.
+		 */
+		private HiddenServiceObserver(EventSource providingNode,
+				String onionAddress) {
+
+			// remember the args
+			this.onionAddress = onionAddress;
+			this.providingNode = providingNode;
+
+			// listen for events coming from the providing node
+			manager.addEventListener(providingNode, this);
+		}
+
+		/**
+		 * Is the observed hidden service still available, or was the providing
+		 * node stopped?
+		 */
+		private boolean stopped = false;
+
+		@Override
+		public void run() {
+
+			// wait for 20 minutes until the hidden service can be considered
+			// available
+			long startingTime = System.currentTimeMillis();
+			long endOfWaiting = startingTime + 20 * 60 * 1000;
+			long now;
+			while (!this.stopped
+					&& (now = System.currentTimeMillis()) < endOfWaiting) {
+				try {
+					Thread.sleep(endOfWaiting - now);
+				} catch (InterruptedException e) {
+				}
+			}
+
+			// add it to the list of available hidden services
+			availableHiddenServices.put(this.onionAddress, this.providingNode);
+		}
+
+		public void handleEvent(Event event) {
+			if (event.getType() == EventType.NODE_STOPPED) {
+				// when the providing node is stopped, the hidden service will
+				// not be available any more
+				this.stopped = true;
+				availableHiddenServices.remove(this.onionAddress);
+			}
+		}
+	}
+
+	/**
+	 * A list of all hidden services that are available for testing.
+	 */
+	private static Map<String, EventSource> availableHiddenServices = new HashMap<String, EventSource>();
+
+	/**
+	 * Periodically (every 5 to 10 minutes) picks a hidden service that is
+	 * available and running for at least 20 minutes and performs a request to
+	 * it using an arbitrary node as proxy.
+	 */
+	private static class HiddenServiceRequestStarter extends Thread {
+
+		@Override
+		public void run() {
+			// first wait until HSDirs are up and descriptors distributed --
+			// stable state
+			// Thread.sleep(24 * 60 * 60 * 1000 + 90 * 60 * 1000);
+			try {
+				Thread.sleep(30 * 60 * 1000 + 90 * 60 * 1000);
+			} catch (InterruptedException e) {
+			}
+
+			Random rnd = new Random();
+			while (true) {
+				if (availableHiddenServices.size() > 0) {
+
+					// pick an available hidden service at random
+					String onionAddressToTry = new ArrayList<String>(
+							availableHiddenServices.keySet()).get(rnd
+							.nextInt(availableHiddenServices.size()));
+					EventSource providingNode = availableHiddenServices
+							.get(onionAddressToTry);
+
+					// pick an arbitrary running node as proxy
+					RouterNode useAsProxy = runningRouters.get(rnd
+							.nextInt(runningRouters.size()));
+
+					// start measurement
+					new HiddenServiceRequestMeasurement(onionAddressToTry,
+							providingNode, useAsProxy).start();
+				}
+
+				// wait for a random time between 5 to 10 minutes
+				try {
+					Thread.sleep(5 * 1000 + rnd.nextInt(5 * 1000));
+				} catch (InterruptedException e) {
+				}
+			}
+		}
+	}
+
+	/**
+	 * Verifies that a hidden service can be accessed, and measures how long
+	 * performing a request takes. If the request does not succeed within one
+	 * minute, it is considered as failed, unless either the node providing the
+	 * hidden service, or the node that is used as proxy fails.
+	 */
+	private static class HiddenServiceRequestMeasurement extends Thread
+			implements EventListener {
+
+		/**
+		 * The onion address to which the request shall be performed.
+		 */
+		private String onionAddress;
+
+		/**
+		 * The node that provides the hidden service.
+		 */
+		private EventSource providingNode;
+
+		/**
+		 * The node that is used as proxy for the request.
+		 */
+		private EventSource useAsProxy;
+
+		/**
+		 * The client application that performs the requests.
+		 */
+		private ClientApplication clientApp;
+
+		/**
+		 * The state of this measurement.
+		 */
+		private MeasurementState measurementState;
+
+		/**
+		 * The time when the request was sent from the client.
+		 */
+		private long requestSentFromClient;
+
+		/**
+		 * The time when a reply was received at the client.
+		 */
+		private long replyReceivedAtClient;
+
+		/**
+		 * Creates a new measurement instance, but does not start it yet.
+		 * 
+		 * @param onionAddress
+		 *            The onion address to which the request shall be performed.
+		 * @param providingNode
+		 *            The node that provides the hidden service.
+		 * @param useAsProxy
+		 *            The node that is used as proxy for the request.
+		 */
+		private HiddenServiceRequestMeasurement(String onionAddress,
+				EventSource providingNode, ProxyNode useAsProxy) {
+
+			// remember the args
+			this.onionAddress = onionAddress;
+			this.providingNode = providingNode;
+			this.useAsProxy = useAsProxy;
+
+			// register for events from the two involved nodes
+			manager.addEventListener(providingNode, this);
+			manager.addEventListener(useAsProxy, this);
+
+			// parse onion address into address and port parts
+			String[] parts = onionAddress.split(":");
+			String address = parts[0];
+			int port = Integer.parseInt(parts[1]);
+
+			// determine socks port of proxy
+			int socksPort = useAsProxy.getSocksPort();
+
+			// create client application and register for events originating
+			// from it
+			this.clientApp = network.createClient("client", address, port,
+					socksPort);
+			manager.addEventListener(this.clientApp, this);
+		}
+
+		@Override
+		public synchronized void run() {
+
+			// start the measurement in state STARTED
+			this.measurementState = MeasurementState.STARTED;
+
+			// perform the request
+			this.clientApp.performRequest(1, 60 * 1000, true);
+
+			// wait for a minute for the request to be performed
+			long startingTime = System.currentTimeMillis();
+			long endOfWaiting = startingTime + 60 * 1000;
+			long now;
+			while (this.measurementState == MeasurementState.STARTED
+					&& (now = System.currentTimeMillis()) < endOfWaiting) {
+				try {
+					wait(endOfWaiting - now);
+				} catch (InterruptedException e) {
+				}
+			}
+
+			// if the client application did not receive a reply within the
+			// given time, fail the measurement
+			if (this.measurementState == MeasurementState.STARTED) {
+				measurementState = MeasurementState.FAILED;
+			}
+
+			// unregister event listener
+			manager.removeEventListener(this);
+
+			// print out measurement result
+			System.out
+					.println(System.currentTimeMillis()
+							+ ": Hidden service request for onion address "
+							+ this.onionAddress
+							+ " running on node "
+							+ this.providingNode.getName()
+							+ " using node "
+							+ this.useAsProxy.getName()
+							+ " as proxy took "
+							+ (replyReceivedAtClient > 0
+									&& requestSentFromClient > 0 ? ((replyReceivedAtClient - requestSentFromClient) / 1000)
+									: -1) + " seconds and ended in state "
+							+ measurementState.toString());
+
+			if (this.measurementState == MeasurementState.SUCCEEDED) {
+				resultWriter
+						.writeHiddenServiceRequest((replyReceivedAtClient - requestSentFromClient) / 1000);
+			} else if (this.measurementState == MeasurementState.FAILED) {
+				resultWriter.writeHiddenServiceRequest(-1);
+			}
+		}
+
+		public void handleEvent(Event event) {
+			// only accept events when this measurement is running
+			if (measurementState != MeasurementState.STARTED) {
+				return;
+			}
+
+			if ((event.getSource() == this.useAsProxy || event.getSource() == this.providingNode)
+					&& event.getType() == EventType.NODE_STOPPED) {
+				// when either the node providing the hidden service, or the
+				// node that is used as proxy fails, abort measurement
+				this.measurementState = MeasurementState.ABORTED;
+				notify();
+
+			} else if (event.getSource() == this.clientApp
+					&& event.getType() == EventType.CLIENT_SENDING_REQUEST) {
+				// when the client application reports sending the request, note
+				// the time
+				this.requestSentFromClient = event.getOccurrenceTime();
+
+			} else if (event.getSource() == this.clientApp
+					&& event.getType() == EventType.CLIENT_REPLY_RECEIVED) {
+				// when the client application reports receiving a reply,
+				// succeed the measurement
+				this.replyReceivedAtClient = event.getOccurrenceTime();
+				this.measurementState = MeasurementState.SUCCEEDED;
+				notify();
+
+			} else if (event.getSource() == this.clientApp
+					&& event.getType() == EventType.CLIENT_GAVE_UP_REQUEST) {
+				// when the client application reports giving up the request,
+				// fail the measurement
+				this.measurementState = MeasurementState.FAILED;
+				notify();
+			}
+		}
+	}
+
+	/**
+	 * Writes the results of the measurements to files.
+	 */
+	private static class ResultWriter {
+
+		/**
+		 * Performs the actual writing to file.
+		 * 
+		 * @param fileName
+		 *            File name to write the measurement result to.
+		 * @param timeInSeconds
+		 *            Value to be written.
+		 */
+		private synchronized void writeToFile(String fileName,
+				long timeInSeconds) {
+			try {
+				File file = new File(network.getWorkingDirectory()
+						.getAbsolutePath()
+						+ File.separator + fileName);
+				if (!file.exists()) {
+					FileWriter fw = new FileWriter(file);
+					fw.append("" + timeInSeconds);
+					fw.close();
+				} else {
+					FileWriter fw = new FileWriter(file, true);
+					fw.append("," + timeInSeconds);
+					fw.close();
+				}
+			} catch (IOException e) {
+				System.err.println(new Date()
+						+ ": Could not write measurement result to file.");
+			}
+		}
+
+		/**
+		 * Writes the result of an online propagation measurement to file.
+		 * 
+		 * @param timeInSeconds
+		 *            Measurement result.
+		 * @throws IOException
+		 *             Thrown if the file could not be written for some reason.
+		 */
+		private synchronized void writeOnlinePropagation(long timeInSeconds) {
+			this.writeToFile("online-propagation", timeInSeconds);
+		}
+
+		/**
+		 * Writes the result of an offline propagation measurement to file.
+		 * 
+		 * @param timeInSeconds
+		 *            Measurement result.
+		 * @throws IOException
+		 *             Thrown if the file could not be written for some reason.
+		 */
+		private synchronized void writeOfflinePropagation(long timeInSeconds) {
+			this.writeToFile("offline-propagation", timeInSeconds);
+		}
+
+		/**
+		 * Writes the result of a descriptor propagation measurement to file.
+		 * 
+		 * @param timeInSeconds
+		 *            Measurement result.
+		 * @throws IOException
+		 *             Thrown if the file could not be written for some reason.
+		 */
+		private synchronized void writeDescriptorPropagation(long timeInSeconds) {
+			this.writeToFile("descriptor-propagation", timeInSeconds);
+		}
+
+		/**
+		 * Writes the result of a hidden service request measurement to file.
+		 * 
+		 * @param timeInSeconds
+		 *            Measurement result.
+		 * @throws IOException
+		 *             Thrown if the file could not be written for some reason.
+		 */
+		private synchronized void writeHiddenServiceRequest(long timeInSeconds) {
+			this.writeToFile("hidden-service-requests", timeInSeconds);
+		}
+	}
+
+	/**
+	 * Writes the results of the measurements to files.
+	 */
+	private static ResultWriter resultWriter = new ResultWriter();
+
+	/**
+	 * The network configuration.
+	 */
+	private static Network network;
+
+	/**
+	 * The event manager of this application.
+	 */
+	private static EventManager manager;
+
+	/**
+	 * List of all directory nodes.
+	 */
+	private static List<DirectoryNode> runningDirs;
+
+	/**
+	 * List of all router nodes.
+	 */
+	private static List<RouterNode> runningRouters;
+
+	/**
+	 * Sets up and runs the test.
+	 * 
+	 * @param args
+	 *            Optionally, a base port number can be passed so that the
+	 *            started Tor processes use ports starting from that number (up
+	 *            to the next few hundreds).
+	 * @throws TorProcessException
+	 *             Thrown if there is a problem with the JVM-external Tor
+	 *             processes that we cannot handle.
+	 */
+	public static void main(String[] args) throws TorProcessException {
+
+		int portStart = 7000;
+
+		if (args.length == 1) {
+			try {
+				portStart = Integer.parseInt(args[0]);
+			} catch (NumberFormatException e) {
+				System.out.println("Usage: java "
+						+ DistributedStorage.class.getCanonicalName()
+						+ " [basePort]");
+				System.exit(1);
+			}
+		}
+
+		// create a network to initialize a test case
+		network = NetworkFactory.createNetwork("distributed-storage");
+
+		System.out.println(new Date() + ": Starting test run "
+				+ network.getWorkingDirectory().getName());
+
+		// obtain reference to event manager to be able to respond to events
+		manager = network.getEventManager();
+
+		// add event type patterns for events that only occur in a modified Tor
+		manager.registerEventTypePattern(
+				"Hidden service routing table has changed",
+				EventType.NODE_ROUTING_TABLE_CHANGED);
+		manager.registerEventTypePattern("Sending publish request for "
+				+ "v2 descriptor for "
+				+ "service '.*' with descriptor ID '.*' with validity of .* "
+				+ "seconds to hidden service directory '.*' on port .*",
+				EventType.BOB_SENDING_PUBLISH_DESC);
+		manager.registerEventTypePattern("Successfully stored service "
+				+ "descriptor with desc ID " + "'.*' and len .*",
+				EventType.HSDIR_DESC_STORED);
+		manager.registerEventTypePattern("Sending fetch request for v2 "
+				+ "descriptor for "
+				+ "service '.*' with descriptor ID '.*' from hidden "
+				+ "service directory '.*' on port .*",
+				EventType.ALICE_SENDING_FETCH_DESC);
+		manager
+				.registerEventTypePattern(
+						"Successfully stored service descriptor with "
+								+ "desc ID '.*'", EventType.HSDIR_DESC_STORED);
+
+		// create two directory nodes with parameters (router name, control
+		// port, SOCKS port, OR port, dir port)
+		runningDirs = new ArrayList<DirectoryNode>();
+		DirectoryNode dir1 = network.createDirectory("dir1", portStart + 1,
+				portStart + 2, portStart + 3, portStart + 4);
+		DirectoryNode dir2 = network.createDirectory("dir2", portStart + 11,
+				portStart + 12, portStart + 13, portStart + 14);
+		runningDirs.add(dir1);
+		runningDirs.add(dir2);
+
+		runningRouters = new ArrayList<RouterNode>();
+
+		// create 9 router nodes with parameters (router name, control port,
+		// SOCKS port, OR port, dir mirror port)
+		int routerCounter = 1;
+		for (; routerCounter < 10; routerCounter++) {
+			RouterNode router = network.createRouter("router0" + routerCounter,
+					portStart + routerCounter * 10 + 11, portStart
+							+ routerCounter * 10 + 12, portStart
+							+ routerCounter * 10 + 13, portStart
+							+ routerCounter * 10 + 14);
+			router.addConfiguration("HSDir 1");
+			runningRouters.add(router);
+		}
+
+		// configure nodes of this network to be part of a private network
+		network.configureAsPrivateNetwork();
+
+		// write configuration of proxy node
+		network.writeConfigurations();
+		System.out.println(new Date()
+				+ ": Successfully written configurations!");
+
+		// start proxy node and wait until it has opened a circuit with a
+		// timeout of 10 seconds
+		if (!network.startNodes(10000)) {
+
+			// failed to start the proxy
+			System.out.println(new Date() + ": Failed to start nodes!");
+			System.exit(1);
+		}
+		System.out.println(new Date() + ": Successfully started nodes!");
+
+		// start observers for all initial routers which might become hidden
+		// service directories after some time (if not stopped before)
+		for (RouterNode router : runningRouters) {
+			new HiddenServiceDirectoryObserver(router, router
+					.determineFingerprintBase32()).start();
+		}
+
+		// start measurement of descriptor propagation
+		new DescriptorObserverStarter();
+
+		// start thread that will periodically try to access a hidden service
+		new HiddenServiceRequestStarter().start();
+
+		// hup until proxy has built circuits (6 retries, 10 seconds timeout
+		// each)
+		if (!network.hupUntilUp(6, 10000)) {
+
+			// failed to build circuits
+			System.out.println(new Date() + ": Failed to build circuits!");
+			System.exit(1);
+		}
+		System.out.println(new Date() + ": Successfully built circuits!");
+
+		int HOURS_TO_WAIT = 30;
+
+		// let it run for HOURS_TO_WAIT minutes...
+		System.out.println(new Date() + ": Waiting for " + HOURS_TO_WAIT
+				+ " hours, changing node population every hour...");
+
+		// TODO change after testing...
+		long hiddenServiceStableTime = System.currentTimeMillis() + 30 * 60 * 1000;
+
+		Random rnd = new Random();
+		long waitingTime = 0;
+
+		for (int i = 0; i < HOURS_TO_WAIT - 1; i++) {
+
+			// wait for 15 to 30 minutes (plus any remaining waiting time) now
+			waitingTime += 15 * 1000 + rnd.nextInt(15 * 1000);
+			try {
+				Thread.sleep(1L * 60L * 60L * 1000L);
+			} catch (InterruptedException e) {
+				// do nothing
+			}
+			// wait for the rest of the half hour later
+			waitingTime = 30 * 1000 - waitingTime;
+
+			// shut down one node
+			int candidate = rnd.nextInt(runningRouters.size());
+			RouterNode removedRouter = runningRouters.remove(candidate);
+			System.out.println(new Date() + ": Shutting down router "
+					+ removedRouter.getNodeName() + "...");
+			removedRouter.shutdown();
+
+			// wait for 15 to 30 minutes (plus any remaining waiting time) now
+			waitingTime += 15 * 1000 + rnd.nextInt(15 * 1000);
+			try {
+				Thread.sleep(1L * 60L * 60L * 1000L);
+			} catch (InterruptedException e) {
+				// do nothing
+			}
+			// wait for the rest of the half hour later
+			waitingTime = 30 * 1000 - waitingTime;
+
+			// start another node
+			RouterNode newRouter = network.createRouter("router"
+					+ routerCounter, portStart + routerCounter * 10 + 11,
+					portStart + routerCounter * 10 + 12, portStart
+							+ routerCounter * 10 + 13, portStart
+							+ routerCounter * 10 + 14);
+
+			newRouter.addConfiguration("HSDir 1");
+
+			// if the system is running for at least 24 hours, it can be
+			// considered stable, so that hidden services can be started
+			long now = System.currentTimeMillis();
+			if (now >= hiddenServiceStableTime) {
+
+				// add hidden service to the configuration of the new router
+				newRouter.addHiddenService("hidServ" + routerCounter, portStart
+						+ routerCounter * 10 + 15, 80);
+
+				// let the new router only publish v2 descriptors
+				newRouter.addConfiguration("PublishHidServDescriptors 0");
+				newRouter.addConfiguration("PublishV2HidServDescriptors 1");
+			}
+
+			// re-configure nodes of this network to be part of a private
+			// network
+			network.configureAsPrivateNetwork();
+
+			// manager.addEventListener(newRouter, new
+			runningRouters.add(newRouter);
+			newRouter.writeConfiguration();
+			System.out.println(new Date()
+					+ ": Starting router "
+					+ newRouter.getNodeName()
+					+ (now >= hiddenServiceStableTime ? " with hidden service"
+							: "") + "...");
+			newRouter.startNode(5000);
+
+			// if a hidden service was started, start an observer for it
+			if (now >= hiddenServiceStableTime) {
+				new HiddenServiceObserver(newRouter, newRouter.getOnionAddress(
+						"hidServ" + routerCounter, 2));
+			}
+
+			// start observer for the new hidden service directory
+			new HiddenServiceDirectoryObserver(newRouter, newRouter
+					.determineFingerprintBase32()).start();
+
+			routerCounter++;
+
+			System.out.println(new Date() + ": Waiting for another "
+					+ (HOURS_TO_WAIT - i - 1) + " hour"
+					+ (i == HOURS_TO_WAIT - 2 ? "" : "s") + " ...");
+		}
+
+		// waiting for the last hour
+		try {
+			Thread.sleep(1L * 60L * 60L * 1000L);
+		} catch (InterruptedException e) {
+			// do nothing
+		}
+
+		// shut down nodes
+		network.shutdownNodes();
+
+		System.out.println(new Date() + ": Exiting...");
+		System.exit(1);
+	}
+}

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/ClientApplicationImpl.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/ClientApplicationImpl.java	2007-08-11 14:38:11 UTC (rev 11077)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/ClientApplicationImpl.java	2007-08-11 15:39:12 UTC (rev 11078)
@@ -13,7 +13,7 @@
 import java.util.logging.Logger;
 
 import de.uniba.wiai.lspi.puppetor.ClientApplication;
-import de.uniba.wiai.lspi.puppetor.Event;
+import de.uniba.wiai.lspi.puppetor.EventType;
 
 /**
  * Implementation of <code>ClientApplication</code>.
@@ -121,8 +121,11 @@
 							.currentTimeMillis();
 
 					// send event to event manager
-					eventManager.observeEvent(ClientApplicationImpl.this,
-							Event.APPLICATION_SENDING_REQUEST);
+					eventManager.observeInternalEvent(
+							timeBeforeConnectionAttempt,
+							ClientApplicationImpl.this,
+							EventType.CLIENT_SENDING_REQUEST,
+							"Sending request.");
 
 					Socket s = null;
 					try {
@@ -146,8 +149,11 @@
 						in.read();
 
 						// send event to event manager
-						eventManager.observeEvent(ClientApplicationImpl.this,
-								Event.APPLICATION_REPLY_RECEIVED);
+						eventManager.observeInternalEvent(System
+								.currentTimeMillis(),
+								ClientApplicationImpl.this,
+								EventType.CLIENT_REPLY_RECEIVED,
+								"Received response.");
 
 						// if we should stop on success, stop further connection
 						// attempts
@@ -167,8 +173,11 @@
 								"Connection to remote server timed out!", e);
 
 						// send event to event manager
-						eventManager.observeEvent(ClientApplicationImpl.this,
-								Event.APPLICATION_GAVE_UP_REQUEST);
+						eventManager.observeInternalEvent(System
+								.currentTimeMillis(),
+								ClientApplicationImpl.this,
+								EventType.CLIENT_GAVE_UP_REQUEST,
+								"Giving up request.");
 
 						// try again immediately, if there are retries left
 
@@ -180,8 +189,11 @@
 										+ "established!", e);
 
 						// send event to event manager
-						eventManager.observeEvent(ClientApplicationImpl.this,
-								Event.APPLICATION_GAVE_UP_REQUEST);
+						eventManager.observeInternalEvent(System
+								.currentTimeMillis(),
+								ClientApplicationImpl.this,
+								EventType.CLIENT_GAVE_UP_REQUEST,
+								"Giving up request.");
 
 						// wait for the rest of the timeout
 						long timeOfTimeoutLeft = timeBeforeConnectionAttempt
@@ -226,8 +238,10 @@
 				logger.log(Level.FINE, "Requests performed!");
 
 				// send event to event manager
-				eventManager.observeEvent(ClientApplicationImpl.this,
-						Event.APPLICATION_REQUESTS_PERFORMED);
+				eventManager.observeInternalEvent(System.currentTimeMillis(),
+						ClientApplicationImpl.this,
+						EventType.CLIENT_REQUESTS_PERFORMED,
+						"Requests performed.");
 
 				// log exiting
 				logger.exiting(this.getClass().getName(), "run");
@@ -307,8 +321,8 @@
 	 * @param socksPort
 	 *            SOCKS port of the local Tor node.
 	 * @throws IllegalArgumentException
-	 *             If at least one of the parameters is <code>null</code> or has an invalid
-	 *             value.
+	 *             If at least one of the parameters is <code>null</code> or
+	 *             has an invalid value.
 	 */
 	ClientApplicationImpl(NetworkImpl network, String clientApplicationName,
 			String targetName, int targetPort, int socksPort) {
@@ -418,4 +432,8 @@
 				+ this.targetName + "\", targetPort=" + this.targetPort
 				+ ", socksPort=" + this.socksPort;
 	}
+
+	public String getName() {
+		return this.clientApplicationName;
+	}
 }

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/DirectoryNodeImpl.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/DirectoryNodeImpl.java	2007-08-11 14:38:11 UTC (rev 11077)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/DirectoryNodeImpl.java	2007-08-11 15:39:12 UTC (rev 11078)
@@ -65,7 +65,7 @@
 		// TODO make this a little bit more configurable---same as to
 		// location of tor executable?
 		this.configuration
-				.add("RecommendedVersions 0.1.2.12-rc,0.1.2.7-alpha-dev,0.2.0.0-alpha-dev,0.2.0.2-alpha-dev");
+				.add("RecommendedVersions 0.1.2.12-rc,0.1.2.7-alpha-dev,0.2.0.0-alpha-dev,0.2.0.2-alpha-dev,0.2.0.4-alpha-dev,0.2.0.4-alpha");
 
 		this.configuration.add("VersioningAuthoritativeDirectory 1");
 

Added: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/EventImpl.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/EventImpl.java	                        (rev 0)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/EventImpl.java	2007-08-11 15:39:12 UTC (rev 11078)
@@ -0,0 +1,104 @@
+package de.uniba.wiai.lspi.puppetor.impl;
+
+import java.util.Date;
+
+import de.uniba.wiai.lspi.puppetor.Event;
+import de.uniba.wiai.lspi.puppetor.EventSource;
+import de.uniba.wiai.lspi.puppetor.EventType;
+
+/**
+ * Implementation of <code>Event</code>.
+ * 
+ * @author kloesing
+ */
+public class EventImpl implements Event {
+
+	/**
+	 * The source of this event.
+	 */
+	private EventSource source;
+
+	/**
+	 * The type of this event.
+	 */
+	private EventType type;
+
+	/**
+	 * Either the log message that led to firing this event, or an internal
+	 * message.
+	 */
+	private String message;
+
+	/**
+	 * The occurrence time of the event or of the corresponding log statement.
+	 */
+	private long occurrenceTime;
+
+	/**
+	 * Creates a new <code>EventImpl</code>.
+	 * 
+	 * @param occurrenceTime
+	 *            The occurrence time of the event or of the corresponding log
+	 *            statement.
+	 * @param source
+	 *            The source of this event.
+	 * @param type
+	 *            The type of this event.
+	 * @param message
+	 *            Either the log message that led to firing this event, or an
+	 *            internal message.
+	 */
+	EventImpl(long occurrenceTime, EventSource source, EventType type,
+			String message) {
+		// time may be 0 and type null
+		this.occurrenceTime = occurrenceTime;
+		this.source = source;
+		this.type = type;
+		this.message = message;
+	}
+
+	public EventSource getSource() {
+		return this.source;
+	}
+
+	public EventType getType() {
+		return this.type;
+	}
+
+	/**
+	 * Sets the event type to the given type.
+	 * 
+	 * @param type
+	 *            The type of this event.
+	 */
+	void setType(EventType type) {
+		this.type = type;
+	}
+
+	public String getMessage() {
+		return this.message;
+	}
+
+	public long getOccurrenceTime() {
+		return this.occurrenceTime;
+	}
+
+	@Override
+	public String toString() {
+		return this.getClass().getSimpleName() + ": occurenceTime="
+				+ new Date(this.occurrenceTime) + ", source=\""
+				+ this.source.getName() + "\", type=" + this.type.toString()
+				+ ", message=\"" + this.message + "\"";
+	}
+
+	/**
+	 * Sets the occurrence time to the given time.
+	 * 
+	 * @param occurrenceTime
+	 *            The occurrence time of the event or of the corresponding log
+	 *            statement.
+	 */
+	public void setOccurenceTime(long occurrenceTime) {
+		this.occurrenceTime = occurrenceTime;
+	}
+}

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/EventManagerImpl.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/EventManagerImpl.java	2007-08-11 14:38:11 UTC (rev 11077)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/EventManagerImpl.java	2007-08-11 15:39:12 UTC (rev 11078)
@@ -1,18 +1,27 @@
 package de.uniba.wiai.lspi.puppetor.impl;
 
+import java.text.ParsePosition;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.Map.Entry;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import de.uniba.wiai.lspi.puppetor.Event;
 import de.uniba.wiai.lspi.puppetor.EventListener;
 import de.uniba.wiai.lspi.puppetor.EventManager;
 import de.uniba.wiai.lspi.puppetor.EventSource;
+import de.uniba.wiai.lspi.puppetor.EventType;
 
 /**
  * Implementation of <code>EventManager</code>.
@@ -20,11 +29,16 @@
 public class EventManagerImpl implements EventManager {
 
 	/**
-	 * Registered event handlers.
+	 * Registered event handlers for specific sources.
 	 */
 	private Map<EventSource, Set<EventListener>> eventHandlers;
 
 	/**
+	 * Registered event handlers for all sources.
+	 */
+	private Set<EventListener> eventHandlersForAllSources;
+
+	/**
 	 * Logger for this <code>EventManagerImpl</code> instance which is called
 	 * "event." plus the name of the network.
 	 */
@@ -64,7 +78,23 @@
 		// create data structures
 		this.observedEvents = new HashMap<EventSource, List<Event>>();
 		this.eventHandlers = new HashMap<EventSource, Set<EventListener>>();
+		this.eventHandlersForAllSources = new HashSet<EventListener>();
 
+		// start thread to parse events
+		Thread eventParseThread = new Thread() {
+			@Override
+			public void run() {
+				while (true) {
+					parseNextEvent();
+				}
+			}
+		};
+		eventParseThread.setDaemon(true);
+		eventParseThread.start();
+
+		// initialize event type patterns
+		initializeEventTypePatterns();
+
 		// log exiting
 		this.logger.exiting(this.getClass().getName(), "EventManagerImpl");
 	}
@@ -103,6 +133,31 @@
 		return result;
 	}
 
+	public synchronized void addEventListener(EventListener listener) {
+
+		// log entering
+		this.logger.entering(this.getClass().getName(), "addEventListener",
+				new Object[] { listener });
+
+		// check parameters
+		if (listener == null) {
+			IllegalArgumentException e = new IllegalArgumentException();
+			this.logger.throwing(this.getClass().getName(), "addEventListener",
+					e);
+			throw e;
+		}
+
+		// add listener
+		this.eventHandlersForAllSources.add(listener);
+
+		// log change
+		this.logger.log(Level.FINE, "Added event listener for all sources.");
+
+		// log exiting and return
+		this.logger.exiting(this.getClass().getName(), "addEventListener");
+		return;
+	}
+
 	public synchronized List<Event> getEventHistory(EventSource source) {
 
 		// log entering
@@ -132,14 +187,15 @@
 		return result;
 	}
 
-	public synchronized boolean hasEventOccured(EventSource source, Event event) {
+	public synchronized boolean hasEventOccured(EventSource source,
+			EventType type) {
 
 		// log entering
 		this.logger.entering(this.getClass().getName(), "hasEventOccured",
-				new Object[] { source, event });
+				new Object[] { source, type });
 
 		// check parameters
-		if (source == null || event == null) {
+		if (source == null || type == null) {
 			IllegalArgumentException e = new IllegalArgumentException();
 			this.logger.throwing(this.getClass().getName(), "hasEventOccured",
 					e);
@@ -147,8 +203,15 @@
 		}
 
 		// determine result
-		boolean result = this.observedEvents.containsKey(source)
-				&& this.observedEvents.get(source).contains(event);
+		boolean result = false;
+		if (this.observedEvents.containsKey(source)) {
+			for (Event event : this.observedEvents.get(source)) {
+				if (event.getType() == type) {
+					result = true;
+					break;
+				}
+			}
+		}
 
 		// log exiting and return result
 		this.logger.exiting(this.getClass().getName(), "hasEventOccured",
@@ -157,6 +220,176 @@
 	}
 
 	/**
+	 * An ordered list of all log statements that are yet unparsed.
+	 */
+	private List<EventImpl> unparsedLogStatements = new LinkedList<EventImpl>();
+
+	/**
+	 * stores either events produced by ourself or unparsed Tor log events for
+	 * later parsing by a background thread in invocation order
+	 * 
+	 * time and type will be parsed from Tor log message; if message does not
+	 * contain anything of interest, the event will be discarded
+	 * 
+	 * @param source
+	 * @param logMessage
+	 */
+	synchronized void observeUnparsedEvent(EventSource source, String logMessage) {
+		this.unparsedLogStatements.add(new EventImpl(0, source, null,
+				logMessage));
+		notifyAll();
+	}
+
+	/**
+	 * Add an internal event to the event queue.
+	 * 
+	 * @param occurrenceTime
+	 *            The occurrence time of the event.
+	 * @param source
+	 *            The event source.
+	 * @param type
+	 *            The event type.
+	 * @param message
+	 *            The event message.
+	 */
+	synchronized void observeInternalEvent(long occurrenceTime,
+			EventSource source, EventType type, String message) {
+		this.unparsedLogStatements.add(new EventImpl(occurrenceTime, source,
+				type, message));
+		notifyAll();
+	}
+
+	/**
+	 * Parse a log statement coming from Tor and see if it is interesting for
+	 * us.
+	 */
+	void parseNextEvent() {
+		EventImpl event = null;
+		synchronized (this) {
+			while (this.unparsedLogStatements.isEmpty()) {
+				try {
+					wait();
+				} catch (InterruptedException e) {
+				}
+			}
+
+			event = this.unparsedLogStatements.remove(0);
+		}
+
+		// does the event require parsing? if not, process immediately
+		if (event.getType() != null) {
+			observeEvent(event);
+		} else {
+
+			String line = event.getMessage();
+
+			/*
+			 * the logging output of Tor does not contain a year component; put
+			 * in the year at the time of parsing (which happens approx. 10 ms
+			 * after the logging took place) in the good hope that this tool is
+			 * not run at midnight on New Year's Eve...
+			 */
+			Calendar c = Calendar.getInstance();
+			int currentYear = c.get(Calendar.YEAR);
+
+			for (Entry<Pattern, EventType> entry : eventTypePatterns.entrySet()) {
+				Matcher matcher = entry.getKey().matcher(line);
+				if (matcher.find()) {
+					SimpleDateFormat sdf = new SimpleDateFormat(
+							"MMM dd HH:mm:ss.SSS");
+					Date logTime = sdf.parse(line, new ParsePosition(0));
+					c.setTimeInMillis(logTime.getTime());
+					c.set(Calendar.YEAR, currentYear);
+					long t = c.getTimeInMillis();
+					event.setOccurenceTime(t);
+					event.setType(entry.getValue());
+					observeEvent(event);
+					break;
+				}
+			}
+		}
+
+	}
+
+	/**
+	 * Map of all patterns, that should be included when parsing log statements
+	 * coming from Tor, and the respective event types, that should be fired.
+	 */
+	Map<Pattern, EventType> eventTypePatterns;
+
+	public synchronized void registerEventTypePattern(String patternString,
+			EventType eventType) {
+		eventTypePatterns.put(Pattern.compile(patternString), eventType);
+	}
+
+	/**
+	 * Initializes the parsing engine with the standard log message patterns
+	 * that should be included in current Tor. Any further patterns should be
+	 * added by the test application manually.
+	 */
+	private void initializeEventTypePatterns() {
+		eventTypePatterns = new HashMap<Pattern, EventType>();
+		registerEventTypePattern("Opening Control listener on .*",
+				EventType.NODE_CONTROL_PORT_OPENED);
+		registerEventTypePattern("Tor has successfully opened a circuit. "
+				+ "Looks like client functionality is working.",
+				EventType.NODE_CIRCUIT_OPENED);
+		registerEventTypePattern("Established circuit .* as introduction "
+				+ "point for service .*",
+				EventType.BOB_BUILT_INTRO_CIRC_SENDING_ESTABLISH_INTRO);
+		registerEventTypePattern("Received INTRO_ESTABLISHED cell on "
+				+ "circuit .* for service .*",
+				EventType.BOB_INTRO_ESTABLISHED_RECEIVED);
+		registerEventTypePattern("Sending publish request for hidden "
+				+ "service .*", EventType.BOB_SENDING_PUBLISH_DESC);
+		registerEventTypePattern("Uploaded rendezvous descriptor",
+				EventType.BOB_DESC_PUBLISHED_RECEIVED);
+		registerEventTypePattern("Received INTRODUCE2 cell for service .* "
+				+ "on circ .*", EventType.BOB_INTRODUCE2_RECEIVED);
+		registerEventTypePattern("Done building circuit .* to rendezvous "
+				+ "with cookie .* for service .*",
+				EventType.BOB_BUILT_REND_CIRC_SENDING_RENDEZVOUS1);
+		registerEventTypePattern("begin is for rendezvous",
+				EventType.BOB_APP_CONN_OPENED);
+		registerEventTypePattern("Got a hidden service request for ID '.*'",
+				EventType.ALICE_ONION_REQUEST_RECEIVED);
+		registerEventTypePattern("Fetching rendezvous descriptor for "
+				+ "service .*", EventType.ALICE_SENDING_FETCH_DESC);
+		registerEventTypePattern("Received rendezvous descriptor",
+				EventType.ALICE_DESC_FETCHED_RECEIVED);
+		registerEventTypePattern("Sending an ESTABLISH_RENDEZVOUS cell",
+				EventType.ALICE_BUILT_REND_CIRC_SENDING_ESTABLISH_RENDEZVOUS);
+		registerEventTypePattern("Got rendezvous ack. This circuit is now "
+				+ "ready for rendezvous",
+				EventType.ALICE_RENDEZVOUS_ESTABLISHED_RECEIVED);
+		registerEventTypePattern("introcirc is open",
+				EventType.ALICE_BUILT_INTRO_CIRC);
+		registerEventTypePattern("Sending an INTRODUCE1 cell",
+				EventType.ALICE_SENDING_INTRODUCE1);
+		registerEventTypePattern("Received ack. Telling rend circ",
+				EventType.ALICE_INTRODUCE_ACK_RECEIVED);
+		registerEventTypePattern("Got RENDEZVOUS2 cell from hidden service",
+				EventType.ALICE_RENDEZVOUS2_RECEIVED_APP_CONN_OPENED);
+		registerEventTypePattern("Handling rendezvous descriptor post",
+				EventType.DIR_PUBLISH_DESC_RECEIVED);
+		registerEventTypePattern("Handling rendezvous descriptor get",
+				EventType.DIR_FETCH_DESC_RECEIVED);
+		registerEventTypePattern(
+				"Received an ESTABLISH_INTRO request on circuit .*",
+				EventType.IPO_RECEIVED_ESTABLISH_INTRO_SENDING_INTRO_ESTABLISHED);
+		registerEventTypePattern(
+				"Received an INTRODUCE1 request on circuit .*",
+				EventType.IPO_RECEIVED_INTRODUCE1_SENDING_INTRODUCE2_AND_INTRODUCE_ACK);
+		registerEventTypePattern(
+				"Received an ESTABLISH_RENDEZVOUS request on circuit .*",
+				EventType.RPO_RECEIVED_ESTABLISH_RENDEZVOUS_SENDING_RENDEZVOUS_ESTABLISHED);
+		registerEventTypePattern(
+				"Got request for rendezvous from circuit .* to cookie .*",
+				EventType.RPO_RECEIVING_RENDEZVOUS1_SENDING_RENDEZVOUS2);
+
+	}
+
+	/**
 	 * Stores the given <code>event</code> from <code>source</code> to the
 	 * event history and propagates its occurrence to all registered event
 	 * handlers.
@@ -166,8 +399,10 @@
 	 * @param event
 	 *            The event type.
 	 */
-	synchronized void observeEvent(EventSource source, Event event) {
+	synchronized void observeEvent(Event event) {
 
+		EventSource source = event.getSource();
+
 		// log entering
 		this.logger.entering(this.getClass().getName(), "observeEvent",
 				new Object[] { source, event });
@@ -176,7 +411,7 @@
 				+ source + "!");
 
 		// remember observed event
-		if (!this.observedEvents.containsKey(source)) {
+		if (!this.observedEvents.containsKey(event.getSource())) {
 			this.observedEvents.put(source, new ArrayList<Event>());
 		}
 		this.observedEvents.get(source).add(event);
@@ -203,6 +438,20 @@
 			}
 		}
 
+		// make a copy of the event handler set for all sources, because some
+		// event handlers might want to remove themselves from this set while
+		// handling the event
+		Set<EventListener> copyOfEventHandlersForAllSources = new HashSet<EventListener>(
+				this.eventHandlersForAllSources);
+
+		for (EventListener eventHandler : copyOfEventHandlersForAllSources) {
+
+			this.logger.log(Level.FINE, "Informing event listener "
+					+ eventHandler + " about recently observed event " + event
+					+ " from source " + source + "!");
+			eventHandler.handleEvent(event);
+		}
+
 		// log exiting
 		this.logger.exiting(this.getClass().getName(), "observeEvent");
 	}
@@ -229,11 +478,17 @@
 			}
 		}
 
+		// remove from event listeners for all sources
+		if (this.eventHandlersForAllSources.remove(eventListener)) {
+			logger.log(Level.FINE, "Removed event listener!");
+		}
+
 		// log exiting
 		this.logger.exiting(this.getClass().getName(), "removeEventListener");
 	}
 
-	public synchronized void waitForAnyOccurence(EventSource source, Event event) {
+	public synchronized void waitForAnyOccurence(EventSource source,
+			EventType event) {
 
 		// log entering
 		this.logger.entering(this.getClass().getName(), "waitForAnyOccurence",
@@ -257,7 +512,7 @@
 	}
 
 	public synchronized boolean waitForAnyOccurence(EventSource source,
-			Event event, long maximumTimeToWaitInMillis) {
+			EventType event, long maximumTimeToWaitInMillis) {
 
 		// log entering
 		this.logger.entering(this.getClass().getName(), "waitForAnyOccurence",
@@ -291,7 +546,7 @@
 	}
 
 	public synchronized void waitForNextOccurence(EventSource source,
-			Event event) {
+			EventType event) {
 
 		// log entering
 		this.logger.entering(this.getClass().getName(), "waitForNextOccurence",
@@ -314,14 +569,14 @@
 	}
 
 	public synchronized boolean waitForNextOccurence(EventSource source,
-			Event event, long maximumTimeToWaitInMillis) {
+			EventType type, long maximumTimeToWaitInMillis) {
 
 		// log entering
 		this.logger.entering(this.getClass().getName(), "waitForNextOccurence",
-				new Object[] { source, event, maximumTimeToWaitInMillis });
+				new Object[] { source, type, maximumTimeToWaitInMillis });
 
 		// check parameters
-		if (source == null || event == null) {
+		if (source == null || type == null) {
 			IllegalArgumentException e = new IllegalArgumentException();
 			this.logger.throwing(this.getClass().getName(),
 					"waitForNextOccurence", e);
@@ -333,12 +588,12 @@
 		if (maximumTimeToWaitInMillis < 0) {
 
 			// wait forever
-			while (!this.hasEventOccured(source, event)) {
+			while (!this.hasEventOccured(source, type)) {
 
 				this.logger.log(Level.FINEST,
 						"We will wait infinetely for the next occurence of "
-								+ "event " + event + " from source " + source
-								+ "...");
+								+ "event type " + type + " from source "
+								+ source + "...");
 				try {
 					wait();
 				} catch (InterruptedException e) {
@@ -347,14 +602,14 @@
 
 				this.logger.log(Level.FINEST,
 						"We have been notified about an observed event while "
-								+ "waiting for events of type " + event
+								+ "waiting for events of type " + type
 								+ " from source " + source
 								+ "; need to check whether the observed event "
 								+ "is what we are looking for...");
 			}
 
-			this.logger.log(Level.FINE, "Waiting for occurence of event "
-					+ event + " succeeded!");
+			this.logger.log(Level.FINE, "Waiting for occurence of event type "
+					+ type + " succeeded!");
 
 			// log exiting and return result
 			this.logger.exiting(this.getClass().getName(),
@@ -367,12 +622,12 @@
 			long endOfTime = System.currentTimeMillis()
 					+ maximumTimeToWaitInMillis;
 			long timeLeft = 0;
-			while (!this.hasEventOccured(source, event)
+			while (!this.hasEventOccured(source, type)
 					&& (timeLeft = endOfTime - System.currentTimeMillis()) > 0) {
 
 				this.logger.log(Level.FINEST, "We will wait for " + timeLeft
-						+ " millis for the next occurence of event " + event
-						+ " from source " + source + "...");
+						+ " millis for the next occurence of event type "
+						+ type + " from source " + source + "...");
 
 				try {
 					wait(timeLeft);
@@ -382,18 +637,19 @@
 
 				this.logger.log(Level.FINEST,
 						"We have been notified about an observed event while "
-								+ "waiting for events of type " + event
+								+ "waiting for events of type " + type
 								+ " from source " + source
 								+ "; need to check whether the observed event "
 								+ "is what we are looking for...");
 			}
 
 			// determine result
-			boolean result = this.hasEventOccured(source, event);
+			boolean result = this.hasEventOccured(source, type);
 
-			this.logger.log(Level.FINE, "Waiting for next occurence of event "
-					+ event + " from source " + source
-					+ (result ? " succeeded!" : " did not succeed!"));
+			this.logger.log(Level.FINE,
+					"Waiting for next occurence of event type " + type
+							+ " from source " + source
+							+ (result ? " succeeded!" : " did not succeed!"));
 
 			// log exiting and return result
 			this.logger.exiting(this.getClass().getName(),

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/NetworkImpl.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/NetworkImpl.java	2007-08-11 14:38:11 UTC (rev 11077)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/NetworkImpl.java	2007-08-11 15:39:12 UTC (rev 11078)
@@ -11,6 +11,7 @@
 import de.uniba.wiai.lspi.puppetor.Event;
 import de.uniba.wiai.lspi.puppetor.EventListener;
 import de.uniba.wiai.lspi.puppetor.EventManager;
+import de.uniba.wiai.lspi.puppetor.EventType;
 import de.uniba.wiai.lspi.puppetor.Network;
 import de.uniba.wiai.lspi.puppetor.NetworkState;
 import de.uniba.wiai.lspi.puppetor.NodeState;
@@ -271,7 +272,8 @@
 
 		// fail on first node that is not up
 		for (ProxyNode node : this.nodes) {
-			if (!eventManager.hasEventOccured(node, Event.NODE_CIRCUIT_OPENED)) {
+			if (!eventManager.hasEventOccured(node,
+					EventType.NODE_CIRCUIT_OPENED)) {
 
 				// log exiting and return false
 				this.logger.exiting(this.getClass().getName(), "allNodesUp");
@@ -336,7 +338,6 @@
 				this.authorizedDirectoriesFingerprints.add(dirNode
 						.determineDirServerString());
 			}
-
 		}
 
 		// configure nodes
@@ -424,13 +425,6 @@
 		this.logger.entering(this.getClass().getName(), "createProxy",
 				new Object[] { nodeName, controlPort, socksPort });
 
-		// check state
-		if (this.networkState != NetworkState.CONFIGURING_NODES) {
-			IllegalStateException e = new IllegalStateException();
-			this.logger.throwing(this.getClass().getName(), "createProxy", e);
-			throw e;
-		}
-
 		// create proxy node; parameter checking is done in constructor
 		ProxyNodeImpl proxy = new ProxyNodeImpl(this, nodeName, controlPort,
 				socksPort);
@@ -451,13 +445,6 @@
 				new Object[] { nodeName, controlPort, socksPort, orPort,
 						dirPort });
 
-		// check state
-		if (this.networkState != NetworkState.CONFIGURING_NODES) {
-			IllegalStateException e = new IllegalStateException();
-			this.logger.throwing(this.getClass().getName(), "createRouter", e);
-			throw e;
-		}
-
 		// create router node; parameter checking is done in constructor
 		RouterNode router = new RouterNodeImpl(this, nodeName, controlPort,
 				socksPort, orPort, dirPort);
@@ -503,14 +490,8 @@
 		return this.networkState;
 	}
 
-	/**
-	 * Returns the working directory of this network configuration which is in
-	 * test-env/networkName/.
-	 * 
-	 * @return Working directory of this network.
-	 */
-	File getWorkingDir() {
-		return workingDir;
+	public File getWorkingDirectory() {
+		return this.workingDir;
 	}
 
 	public boolean hupUntilUp(int tries, long hupInterval)
@@ -540,7 +521,7 @@
 		for (ProxyNode node : this.nodes) {
 			eventManager.addEventListener(node, new EventListener() {
 				public void handleEvent(Event event) {
-					if (event == Event.NODE_CIRCUIT_OPENED) {
+					if (event.getType() == EventType.NODE_CIRCUIT_OPENED) {
 						sleepingThread.interrupt();
 						eventManager.removeEventListener(this);
 					}
@@ -605,16 +586,18 @@
 			throw e;
 		}
 
-		// iteratively shut down all nodes; if an exception is caught, continue
-		// shutting down the other nodes and throw the first exception
+		// iteratively shut down all running nodes; if an exception is caught,
+		// continue shutting down the other nodes and throw the first exception
 		// subsequently
 		TorProcessException firstCaughtException = null;
 		for (ProxyNode node : this.nodes) {
-			try {
-				node.shutdown();
-			} catch (TorProcessException e) {
-				if (firstCaughtException != null) {
-					firstCaughtException = e;
+			if (node.getNodeState() == NodeState.RUNNING) {
+				try {
+					node.shutdown();
+				} catch (TorProcessException e) {
+					if (firstCaughtException != null) {
+						firstCaughtException = e;
+					}
 				}
 			}
 		}
@@ -752,4 +735,8 @@
 		// log exiting
 		this.logger.exiting(this.getClass().getName(), "writeConfigurations");
 	}
+
+	public String getName() {
+		return this.networkName;
+	}
 }

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/ProxyNodeImpl.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/ProxyNodeImpl.java	2007-08-11 14:38:11 UTC (rev 11077)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/ProxyNodeImpl.java	2007-08-11 15:39:12 UTC (rev 11078)
@@ -3,14 +3,10 @@
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
 import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
 import java.io.FileReader;
 import java.io.FileWriter;
 import java.io.IOException;
-import java.io.InputStream;
 import java.io.InputStreamReader;
-import java.io.OutputStream;
 import java.net.Socket;
 import java.util.ArrayList;
 import java.util.List;
@@ -18,9 +14,8 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-import net.freehaven.tor.control.EventHandler;
 import net.freehaven.tor.control.TorControlConnection;
-import de.uniba.wiai.lspi.puppetor.Event;
+import de.uniba.wiai.lspi.puppetor.EventType;
 import de.uniba.wiai.lspi.puppetor.NodeState;
 import de.uniba.wiai.lspi.puppetor.ProxyNode;
 import de.uniba.wiai.lspi.puppetor.TorProcessException;
@@ -163,7 +158,7 @@
 		this.eventManager = network.getEventManagerImpl();
 
 		// create working directory
-		this.workingDir = new File(this.network.getWorkingDir()
+		this.workingDir = new File(this.network.getWorkingDirectory()
 				.getAbsolutePath()
 				+ File.separator + nodeName + File.separator);
 		this.workingDir.mkdirs();
@@ -182,14 +177,9 @@
 		this.configuration.add("ControlPort " + controlPort);
 		this.configuration.add("SocksPort " + socksPort);
 
-		// TODO why is this not the standard????
-		this.configuration.add("RunAsDaemon 0");
+		this.configuration.add("Log info stdout");
+		this.configuration.add("Log info file log");
 
-		// TODO setting log level to lower level than NOTICE leads to error when
-		// connecting via control port! why?
-		this.configuration.add("Log notice stdout");
-		this.configuration.add("Log debug file log");
-
 		// TODO do we need this in all nodes or only in directory nodes?!
 		this.configuration.add("DirAllowPrivateAddresses 1");
 
@@ -485,9 +475,10 @@
 		this.logger.entering(this.getClass().getName(), "hup");
 
 		// check state
-		if (this.nodeState != NodeState.RUNNING) {
+		if (this.nodeState != NodeState.RUNNING || this.conn == null) {
 			IllegalStateException e = new IllegalStateException(
-					"Cannot hup a process when it's not running!");
+					"Cannot hup a process when it's not running or there is "
+							+ "no connection to its control port!");
 			this.logger.throwing(this.getClass().getName(), "hup", e);
 			throw e;
 		}
@@ -502,6 +493,8 @@
 			throw ex;
 		} catch (NullPointerException e) {
 			// TODO sometimes, this throws a NullPointerException...
+			this.logger.log(Level.SEVERE, "is conn null? "
+					+ (this.conn == null));
 			this.logger.log(Level.SEVERE,
 					"NullPointerException while sending HUP signal to node "
 							+ this.toString());
@@ -541,6 +534,10 @@
 		// change state
 		this.nodeState = NodeState.SHUT_DOWN;
 
+		// fire event
+		eventManager.observeInternalEvent(System.currentTimeMillis(), this,
+				EventType.NODE_STOPPED, "Node stopped.");
+
 		// log exiting
 		this.logger.exiting(this.getClass().getName(), "shutdown");
 	}
@@ -588,28 +585,16 @@
 
 				// read output from Tor to parse it
 				String line = null;
-				boolean waitingForControlPort = true;
 				try {
-
 					while ((line = br.readLine()) != null) {
-						logger.log(Level.FINEST, line);
-
-						// if control port has not been opened, check log
-						// statement for Tor to say this
-						if (waitingForControlPort
-								&& line.contains("Opening Control listener on")) {
-							logger.log(Level.FINE, "Observed event of type "
-									+ "Event.NODE_CONTROL_PORT_OPENED");
-							eventManager.observeEvent(ProxyNodeImpl.this,
-									Event.NODE_CONTROL_PORT_OPENED);
-							waitingForControlPort = false;
-						}
+						eventManager.observeUnparsedEvent(ProxyNodeImpl.this,
+								line);
 					}
 				} catch (IOException e) {
 
 					// don't throw this exception, nobody will catch it!
 					String reason = "IOException when reading output from Tor "
-							+ "process!";
+							+ "process " + nodeName + "!";
 					logger.log(Level.WARNING, reason, e);
 				}
 
@@ -646,12 +631,12 @@
 		this.logger.log(Level.FINER,
 				"Waiting for Tor to open its control port...");
 		if (!this.eventManager.waitForAnyOccurence(this,
-				Event.NODE_CONTROL_PORT_OPENED, maximumTimeToWaitInMillis)) {
+				EventType.NODE_CONTROL_PORT_OPENED, maximumTimeToWaitInMillis)) {
 
 			// Tor did not open its control port
-			this.logger.log(Level.WARNING,
-					"Tor did not manage to open its control port within "
-							+ maximumTimeToWaitInMillis + " millis!");
+			this.logger.log(Level.WARNING, "Tor node " + this.nodeName
+					+ " did not manage to open its control port within "
+					+ maximumTimeToWaitInMillis + " millis!");
 
 			// log exiting
 			this.logger.exiting(this.getClass().getName(), "startNode", false);
@@ -686,93 +671,13 @@
 		}
 		this.logger.log(Level.FINE, "Connected to control port successfully!");
 
-		// register event handler at Tor process
-		EventHandler handler = new EventHandler() {
-
-			public void bandwidthUsed(long read, long written) {
-				// TODO do we need this information?
-				// logger.log(Level.FINEST, "bandwidthUsed(read, written) = "
-				// + read + ", " + written);
-			}
-
-			public void circuitStatus(String status, String circID, String path) {
-				// TODO do we need this information?
-				// logger.log(Level.FINEST,
-				// "circuitStatus(status, circID, path) = " + status
-				// + ", " + circID + ", " + path);
-			}
-
-			public void message(String severity, String msg) {
-				logger.log(Level.FINEST, "message(severity, msg) = " + severity
-						+ ", " + msg);
-				if (msg.contains("Uploading rendezvous descriptor")) {
-					logger.log(Level.FINER, "Observed event of type "
-							+ "NODE_RSD_PUBLISHED");
-					eventManager.observeEvent(ProxyNodeImpl.this,
-							Event.NODE_RSD_PUBLISHED);
-				} else if (msg
-						.contains("Tor has successfully opened a circuit.")) {
-					logger.log(Level.FINER, "Observed event of type "
-							+ "NODE_CIRCUIT_OPENED");
-					eventManager.observeEvent(ProxyNodeImpl.this,
-							Event.NODE_CIRCUIT_OPENED);
-				} else {
-					// log statement did not contain anything of interest for
-					// us...
-				}
-			}
-
-			public void newDescriptors(List orList) {
-				// TODO do we need this information?
-				// StringBuilder sb = new StringBuilder(
-				// "newDescriptors(orList) =\n");
-				// for (Object o : orList) {
-				// sb.append(o + "\n");
-				// }
-				// logger.log(Level.FINEST, sb.toString());
-			}
-
-			public void orConnStatus(String status, String orName) {
-				// TODO do we need this information?
-				// logger.log(Level.FINEST, "orConnStatus(status, orName) = "
-				// + status + ", " + orName);
-			}
-
-			public void streamStatus(String status, String streamID,
-					String target) {
-				// TODO do we need this information?
-				// logger.log(Level.FINEST,
-				// "streamStatus(status, streamID, target) = " + status
-				// + ", " + streamID + ", " + target);
-			}
-
-			public void unrecognized(String type, String msg) {
-				// TODO do we need this information?
-				// logger.log(Level.FINEST, "unrecognized(type, msg) = " + type
-				// + ", " + msg);
-			}
-		};
-		this.conn.setEventHandler(handler);
-
-		// register for logging events of level INFO and higher using controller
-		List<String> events = new ArrayList<String>();
-		events.add("INFO");
-		events.add("NOTICE");
-		events.add("WARN");
-		events.add("ERR");
-		try {
-			this.conn.setEvents(events);
-		} catch (IOException e) {
-			String reason = "Could not register event handler at Tor process!";
-			TorProcessException ex = new TorProcessException(reason, e);
-			this.logger.throwing(this.getClass().getName(), "startNode", ex);
-			throw ex;
-		}
-		this.logger.log(Level.FINE, "Registered event handler at Tor process!");
-
 		// set state to RUNNING
 		this.nodeState = NodeState.RUNNING;
 
+		// fire event
+		eventManager.observeInternalEvent(System.currentTimeMillis(), this,
+				EventType.NODE_STARTED, "Node started.");
+
 		// log exiting and return with success
 		this.logger.exiting(this.getClass().getName(), "startNode", true);
 		return true;
@@ -819,4 +724,12 @@
 		// log exiting
 		this.logger.exiting(this.getClass().getName(), "writeConfiguration");
 	}
+
+	public String getName() {
+		return this.nodeName;
+	}
+
+	public int getSocksPort() {
+		return this.socksPort;
+	}
 }

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/RouterNodeImpl.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/RouterNodeImpl.java	2007-08-11 14:38:11 UTC (rev 11077)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/RouterNodeImpl.java	2007-08-11 15:39:12 UTC (rev 11078)
@@ -129,6 +129,46 @@
 		this.logger.exiting(this.getClass().getName(), "RouterNodeImpl");
 	}
 
+	public synchronized String determineFingerprintBase32()
+			throws TorProcessException {
+		String fingerprint = determineFingerprint();
+		fingerprint = fingerprint.substring(fingerprint.indexOf(' ') + 1);
+		byte[] bytes = new byte[20];
+		int j = 0;
+		for (String part : fingerprint.split(" ")) {
+			bytes[j++] = (byte) Integer.parseInt(part.substring(0, 2), 16);
+			bytes[j++] = (byte) Integer.parseInt(part.substring(2), 16);
+		}
+		int i = 0, index = 0, digit = 0;
+		int currByte, nextByte;
+		StringBuffer base32 = new StringBuffer((bytes.length + 7) * 8 / 5);
+		String base32Chars = "abcdefghijklmnopqrstuvwxyz234567";
+		while (i < bytes.length) {
+			currByte = (bytes[i] >= 0) ? bytes[i] : (bytes[i] + 256);
+			if (index > 3) {
+				if ((i + 1) < bytes.length) {
+					nextByte = (bytes[i + 1] >= 0) ? bytes[i + 1]
+							: (bytes[i + 1] + 256);
+				} else {
+					nextByte = 0;
+				}
+				digit = currByte & (0xFF >> index);
+				index = (index + 5) % 8;
+				digit <<= index;
+				digit |= nextByte >> (8 - index);
+				i++;
+			} else {
+				digit = (currByte >> (8 - (index + 5))) & 0x1F;
+				index = (index + 5) % 8;
+				if (index == 0) {
+					i++;
+				}
+			}
+			base32.append(base32Chars.charAt(digit));
+		}
+		return base32.toString();
+	}
+
 	public synchronized String determineFingerprint()
 			throws TorProcessException {
 
@@ -247,4 +287,13 @@
 		return super.toString() + ", orPort=" + this.orPort + ", dirPort="
 				+ this.dirPort;
 	}
+
+	public String getName() {
+		String fp = "";
+		if (this.fingerprint != null) {
+			fp = this.fingerprint.substring(this.fingerprint.indexOf(" ") + 1);
+			fp = fp.substring(0, 4);
+		}
+		return this.nodeName + " (" + fp + ")";
+	}
 }

Modified: puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/ServerApplicationImpl.java
===================================================================
--- puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/ServerApplicationImpl.java	2007-08-11 14:38:11 UTC (rev 11077)
+++ puppetor/trunk/src/de/uniba/wiai/lspi/puppetor/impl/ServerApplicationImpl.java	2007-08-11 15:39:12 UTC (rev 11078)
@@ -9,7 +9,7 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-import de.uniba.wiai.lspi.puppetor.Event;
+import de.uniba.wiai.lspi.puppetor.EventType;
 import de.uniba.wiai.lspi.puppetor.ServerApplication;
 
 /**
@@ -63,8 +63,10 @@
 				in.read();
 
 				// send event to event manager
-				eventManager.observeEvent(ServerApplicationImpl.this,
-						Event.APPLICATION_REQUEST_RECEIVED);
+				eventManager.observeInternalEvent(System.currentTimeMillis(),
+						ServerApplicationImpl.this,
+						EventType.SERVER_RECEIVING_REQUEST_SENDING_REPLY,
+						"Receiving request.");
 
 				// write response
 				PrintStream out = new PrintStream(handleSocket
@@ -198,8 +200,8 @@
 	}
 
 	/**
-	 * Event manager to which all events concerning this server application are
-	 * notified.
+	 * Event manager to which all events concerning this server application
+	 * are notified.
 	 */
 	private EventManagerImpl eventManager;
 
@@ -327,4 +329,8 @@
 				+ this.serverApplicationName + "\", serverPort="
 				+ this.serverPort;
 	}
+
+	public String getName() {
+		return this.serverApplicationName;
+	}
 }