grr-3.1.0.2/000077500000000000000000000000001273104013200124365ustar00rootroot00000000000000grr-3.1.0.2/.dockerignore000066400000000000000000000007721273104013200151200ustar00rootroot00000000000000# Unfortunately the ** syntax isn't supported before docker 1.10 # https://github.com/docker/docker/issues/13113 # and installing a newer version is difficult. *.changes *.deb *.dsc *.egg-info */*/server.local.yaml *.pyc */*.pyc */*/*.pyc */*/*/*.pyc */*/*/*/*.pyc *_pb2.* */*_pb2.* */*/*_pb2.* .git .gitignore ACKNOWLEDGEMENTS AUTHORS build dist executables !executables/windows/templates/unzipsfx/*.exe grr/config/grr-response-templates grr/var grr-server*.tar.gz LICENSE README README.md travis vagrant grr-3.1.0.2/.gitignore000066400000000000000000000001551273104013200144270ustar00rootroot00000000000000*.pyc *_pb2.py *.swp *.o *.so *.pb.cc *.pb.h *~ .idea build/ dist/ artifacts/*.yaml grr.egg-info/ get-pip.py grr-3.1.0.2/.travis.yml000066400000000000000000000010671273104013200145530ustar00rootroot00000000000000language: python sudo: false cache: directories: - $HOME/.cache/pip - $HOME/protobuf python: - "2.7" before_install: /bin/bash travis/install_protobuf.sh env: - PROTOC="${HOME}/protobuf/bin/protoc" install: - pip install --upgrade pip wheel - pip install -e . - pip install -e grr/config/grr-response-server/ - pip install -e grr/config/grr-response-test/ - python makefile.py - cd grr/artifacts && python makefile.py && cd - script: grr_run_tests --processes=2 addons: apt: packages: - libssl-dev - python-dev - prelink grr-3.1.0.2/ACKNOWLEDGEMENTS000066400000000000000000000020761273104013200147200ustar00rootroot00000000000000 Please see the AUTHORS file for core developer details. We want to thank the following people for contributing to GRR (all lists in alphabetical order): * Johan Berggren * Paul Chaignon * Sean Gillespie * Kristinn Gudjonsson * Matthew Iselin * Andrew Krug * Eric Mak * Joachim Metz * Brian Olson * Ryan Peck * Jordi Sanchez * Elizabeth Schweinsberg * Adam Sindelar * Sebastian Welsh * Daniel White * Jessica Wilson Thanks go to the following people for providing documentation improvements: * Jordi Sanchez * Ben Uphoff * Sebastian Welsh We also want to thank the many people who have taken the time to send us bug reports when something went wrong! grr-3.1.0.2/AUTHORS000066400000000000000000000010171273104013200135050ustar00rootroot00000000000000GRR Rapid Response Framework https://github.com/google/grr GRR is developed by (in alphabetical order): * Darren Bilby * Mikhail Bushkov * Greg Castle * Michael Cohen * Ben Galehouse * Andreas Moser * Dionysis Zindros To reach the authors, please use the GRR development mailing list . GRR emeriti: * Germano Caronni grr-3.1.0.2/Dockerfile000066400000000000000000000032661273104013200144370ustar00rootroot00000000000000# A Docker container capable of running all GRR components. # Xenial has the correct version of the protobuf compiler (2.6.1). FROM ubuntu:xenial MAINTAINER Greg Castle github@mailgreg.com RUN apt-get update && \ apt-get install -y \ debhelper \ dpkg-dev \ libssl-dev \ prelink \ protobuf-compiler \ python-dev \ python-pip \ rpm \ wget \ zip && \ pip install --upgrade pip && \ pip install virtualenv && \ pip install setuptools --upgrade && \ virtualenv /usr/share/grr-server # Pull dependencies and templates from pypi and build wheels so docker can cache # them. This just makes the actual install go faster. RUN . /usr/share/grr-server/bin/activate && \ mkdir /wheelhouse && \ pip wheel --wheel-dir=/wheelhouse --pre grr-response-server && \ pip wheel --wheel-dir=/wheelhouse -f https://storage.googleapis.com/releases.grr-response.com/index.html grr-response-templates # Copy the GRR code over. ADD . /usr/src/grr/ # Make sdists and pip install # We require sdists so that the version.ini gets copied over properly. RUN . /usr/share/grr-server/bin/activate && \ cd /usr/src/grr/ && \ python /usr/src/grr/setup.py sdist --dist-dir="/sdists/core" --no-make-docs --no-sync-artifacts && \ cd /usr/src/grr/grr/config/grr-response-server/ && \ python setup.py sdist --dist-dir="/sdists/server" && \ pip install --find-links=/wheelhouse /sdists/core/*.tar.gz && \ pip install --find-links=/wheelhouse /sdists/server/*.tar.gz COPY scripts/docker-entrypoint.sh / ENTRYPOINT ["/docker-entrypoint.sh"] # Port for the admin UI GUI EXPOSE 8000 # Port for clients to talk to EXPOSE 8080 # Server config, logs, sqlite db VOLUME ["/etc/grr", "/var/log", "/var/grr-datastore"] CMD ["grr"] grr-3.1.0.2/LICENSE000066400000000000000000000261361273104013200134530ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. grr-3.1.0.2/MANIFEST.in000066400000000000000000000012161273104013200141740ustar00rootroot00000000000000include version.ini recursive-include * * recursive-include gui * recursive-exclude .git * recursive-exclude build * recursive-exclude dist * recursive-exclude vagrant * recursive-exclude travis * recursive-exclude grr/config/grr-response-* * recursive-exclude client/minicomm * recursive-exclude executables *.zip recursive-exclude executables/windows/installers *.exe recursive-exclude executables *.bin recursive-exclude executables/components * recursive-exclude executables/linux * recursive-exclude executables/darwin * recursive-exclude grr/var * recursive-exclude grr-response-* * recursive-exclude client/minicomm * recursive-exclude * *.pyc grr-3.1.0.2/README000066400000000000000000000002141273104013200133130ustar00rootroot00000000000000For detailed instructions on how to install the GRR Rapid Response Framework please see the project website: https://github.com/google/grr grr-3.1.0.2/README.md000066400000000000000000000113161273104013200137170ustar00rootroot00000000000000

GRR Rapid Response is an incident response framework focused on remote live forensics. [![Build Status](https://travis-ci.org/google/grr.svg?branch=master)](https://travis-ci.org/google/grr) [![Build status](https://ci.appveyor.com/api/projects/status/o30jv69p5muc12r5?svg=true)](https://ci.appveyor.com/project/destijl/grr) * [Quickstart: Fast automated installation](https://github.com/google/grr-doc/blob/master/quickstart.adoc) * [Downloads (installation files, client templates)](https://googledrive.com/host/0B1wsLqFoT7i2N3hveC1lSEpHUnM/) * [User Manual](https://github.com/google/grr-doc/blob/master/user_manual.adoc) * [Blog](http://grr-response.blogspot.com/) * [Administration Documentation (Setup and Configuration)](https://github.com/google/grr-doc/blob/master/admin.adoc) * [Publications: Papers, Presentations, Workshops etc.](https://github.com/google/grr-doc/blob/master/publications.adoc) * [Project FAQ](https://github.com/google/grr-doc/blob/master/faq.adoc) * [Developer and Implementation Documentation](https://github.com/google/grr-doc/blob/master/implementation.adoc) * [The GRR Configuration system](https://github.com/google/grr-doc/blob/master/configuration.adoc) * [Release Notes: check these when upgrading](https://github.com/google/grr-doc/blob/master/releasenotes.adoc) * [Project Roadmap](https://github.com/google/grr-doc/blob/master/roadmap.adoc) * [Search Documentation (using github search)](https://github.com/google/grr-doc) * [License Information](https://github.com/google/grr-doc/blob/master/licenses.adoc) * [Troubleshooting](https://github.com/google/grr-doc/blob/master/troubleshooting.adoc) GRR is a python agent (client) that is installed on target systems, and python server infrastructure that can manage and talk to the agent.
Client Features: * Cross-platform support for Linux, OS X and Windows clients. * Live remote memory analysis using open source memory drivers for Linux, OS X and Windows via the [Rekall](http://www.rekall-forensic.com/) memory analysis framework. * Powerful search and download capabilities for files and the Windows registry. * Secure communication infrastructure designed for Internet deployment. * Client automatic update support. * Detailed monitoring of client CPU, memory, IO usage and self-imposed limits. Server Features: * Fully fledged response capabilities handling most incident response and forensics tasks. * OS-level and raw file system access, using the SleuthKit (TSK). * Enterprise hunting (searching across a fleet of machines) support. * Fully scalable back-end to handle very large deployments. * Automated scheduling for recurring tasks. * Fast and simple collection of hundreds of digital forensic artifacts. * Asynchronous design allows future task scheduling for clients, designed to work with a large fleet of laptops. * AngularJS Web UI and RESTful JSON API. * Fully scriptable IPython console access. * Basic system timelining features. * Basic reporting infrastructure. See [quickstart](https://github.com/google/grr-doc/blob/master/quickstart.adoc) to start using it. Contact Us ---------- Mailing lists: * GRR Users: [grr-users](https://groups.google.com/forum/#!forum/grr-users) * GRR Developers: [grr-dev](https://groups.google.com/forum/#!forum/grr-dev) Follow us [on twitter](https://twitter.com/grrresponse) for announcements of GRR user meetups. We use [a gitter chat room](https://gitter.im/google/grr) during meetups. Screenshots ----------- [](https://github.com/google/grr/blob/gh-pages/screenshots/Screenshot from 2013-11-18 18-36-13.png) [](https://github.com/google/grr/blob/gh-pages/screenshots/Screenshot from 2013-11-18 18-36-46.png) [](https://github.com/google/grr/blob/gh-pages/screenshots/Screenshot from 2013-11-18 18-37-37.png) [](https://github.com/google/grr/blob/gh-pages/screenshots/Screenshot from 2013-11-18 18-40-49.png) [](https://github.com/google/grr/blob/gh-pages/screenshots/Screenshot from 2013-11-18 18-41-45.png) grr-3.1.0.2/accelerated/000077500000000000000000000000001273104013200146725ustar00rootroot00000000000000grr-3.1.0.2/accelerated/accelerated.c000066400000000000000000000217351273104013200173020ustar00rootroot00000000000000// Semantic Protobufs acceleration library. // // This file implementats some hot functions in c to accelerate python semantic // protobufs. // // author: Michael Cohen #include // Number of bits used to hold type info in a proto tag. #define TAG_TYPE_BITS 3 #define TAG_TYPE_MASK ((1 << TAG_TYPE_BITS) - 1) // 0x7 // These numbers identify the wire type of a protocol buffer value. // We use the least-significant TAG_TYPE_BITS bits of the varint-encoded // tag-and-type to store one of these WIRETYPE_* constants. // These values must match WireType enum in google/protobuf/wire_format.h. #define WIRETYPE_VARINT 0 #define WIRETYPE_FIXED64 1 #define WIRETYPE_LENGTH_DELIMITED 2 // We do not support these deprecated wire types any more. Nested protobufs are // stored using the normal WIRETYPE_LENGTH_DELIMITED tag. #define WIRETYPE_START_GROUP 3 #define WIRETYPE_END_GROUP 4 #define WIRETYPE_FIXED32 5 #define _WIRETYPE_MAX 5 // Encode the value into the buffer as a Varint. length contains the size of // the buffer, we set it to the total length of the written Varint. Returns 1 // on success and 0 if an error occurs. The only possible error is that value // can not be encoded into the buffer because it is too short. int varint_encode(unsigned PY_LONG_LONG value, unsigned char *buffer, Py_ssize_t *length) { Py_ssize_t index = 0; unsigned char bits = value & 0x7f; value >>= 7; while (value) { buffer[index] = bits | 0x80; index++; // Buffer is too short. if (index >= *length) return 0; bits = value & 0x7f; value >>= 7; } buffer[index] = bits; index++; *length = index; return 1; } PyObject *py_varint_encode(PyObject *self, PyObject *args) { unsigned char buffer[100]; Py_ssize_t index = sizeof(buffer); unsigned PY_LONG_LONG value; if (!PyArg_ParseTuple(args, "K", &value)) return NULL; // Can't really happen but just in case. if (!varint_encode(value, buffer, &index)) { PyErr_SetString( PyExc_RuntimeError, "Internal Error"); return NULL; } return Py_BuildValue("s#", buffer, index); } int varint_decode(unsigned PY_LONG_LONG *result, const char *buffer, Py_ssize_t length, Py_ssize_t *decoded_length) { Py_ssize_t pos = 0; unsigned int shift = 0; *result = 0; while (shift < (sizeof(*result) * 8) && pos < length) { unsigned char b = buffer[pos]; *result |= ((unsigned PY_LONG_LONG)(b) & 0x7F) << shift; pos++; if ( (b & 0x80) == 0 ) { if (decoded_length) { *decoded_length = pos; } return 1; } shift += 7; } while (shift < 64); // Error decoding varint - buffer too short. return 0; } PyObject *py_varint_decode(PyObject *self, PyObject *args) { const char *buffer; Py_ssize_t pos = 0; Py_ssize_t length = 0; unsigned PY_LONG_LONG result = 0; if (!PyArg_ParseTuple(args, "s#n", &buffer, &length, &pos)) return NULL; if (varint_decode(&result, buffer+pos, length, &length)) { return Py_BuildValue("Kn", result, pos + length); } PyErr_SetString(PyExc_RuntimeError, "Too many bytes when decoding varint."); return NULL; } PyObject *py_split_buffer(PyObject *self, PyObject *args, PyObject *kwargs) { char *buffer; Py_ssize_t buffer_len = 0; Py_ssize_t length = 0; Py_ssize_t index = 0; static const char *kwlist[] = {"buffer", "index", "length", NULL}; PyObject *encoded_tag = NULL; PyObject *result = PyList_New(0); if (!result) return NULL; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s#|nn", (char **)kwlist, &buffer, &buffer_len, &index, &length)) return NULL; if (index < 0 || length < 0 || index > buffer_len) { PyErr_SetString( PyExc_ValueError, "Invalid parameters."); return NULL; } // Advance the buffer to the required start index. buffer += index; // Determine the length we will be splitting. if (length == 0 || length > buffer_len - index) { length = buffer_len - index; } // We advance the buffer and decrement the length until there is no more // buffer space left. while (length > 0) { Py_ssize_t decoded_length = 0; unsigned PY_LONG_LONG tag; int tag_type; // Read the tag off the buffer. varint_decode(&tag, buffer, length, &decoded_length); // Prepare to pass the encoded tag into the result tuple. encoded_tag = PyString_FromStringAndSize(buffer, decoded_length); buffer += decoded_length; length -= decoded_length; // Handle the tag depending on its type. tag_type = tag & TAG_TYPE_MASK; switch (tag_type) { case WIRETYPE_VARINT: { // Decode the varint and position ourselves at the next tag. Py_ssize_t tag_length = 0; PyObject *entry = NULL; varint_decode(&tag, buffer, length, &tag_length); // Create an entry to add to the result set. Note: We use // PyTuple_SetItem which steals the references here instead of // PyTuple_Pack which does not (meaning its more involved to use). entry = PyTuple_New(3); PyTuple_SET_ITEM( entry, 0, encoded_tag); // Empty string "". PyTuple_SET_ITEM( entry, 1, PyString_FromStringAndSize(buffer, 0)); PyTuple_SET_ITEM( entry, 2, PyString_FromStringAndSize(buffer, tag_length)); PyList_Append(result, entry); Py_DECREF(entry); buffer += tag_length; length -= tag_length; break; } case WIRETYPE_FIXED64: { // Fixed size data. Py_ssize_t tag_length = 8; PyObject *entry = PyTuple_New(3); PyTuple_SET_ITEM( entry, 0, encoded_tag); // Empty string "". PyTuple_SET_ITEM( entry, 1, PyString_FromStringAndSize(buffer, 0)); PyTuple_SET_ITEM( entry, 2, PyString_FromStringAndSize(buffer, tag_length)); PyList_Append(result, entry); Py_DECREF(entry); buffer += tag_length; length -= tag_length; break; } case WIRETYPE_FIXED32: { // Fixed size data. Py_ssize_t tag_length = 4; PyObject *entry = PyTuple_New(3); PyTuple_SET_ITEM( entry, 0, encoded_tag); // Empty string "". PyTuple_SET_ITEM( entry, 1, PyString_FromStringAndSize(buffer, 0)); PyTuple_SET_ITEM( entry, 2, PyString_FromStringAndSize(buffer, tag_length)); PyList_Append(result, entry); Py_DECREF(entry); buffer += tag_length; length -= tag_length; break; } case WIRETYPE_LENGTH_DELIMITED: { // Decode the length varint and position ourselves at the start of the // data. Py_ssize_t decoded_length = 0; unsigned PY_LONG_LONG data_size; PyObject *entry = NULL; varint_decode(&data_size, buffer, length, &decoded_length); // Check that we do not exceed the available buffer here. if (data_size + decoded_length > (unsigned int)length) { PyErr_SetString( PyExc_ValueError, "Length tag exceeds available buffer."); goto error; } entry = PyTuple_New(3); PyTuple_SET_ITEM( entry, 0, encoded_tag); // Empty string "". PyTuple_SET_ITEM( entry, 1, PyString_FromStringAndSize(buffer, decoded_length)); PyTuple_SET_ITEM( entry, 2, PyString_FromStringAndSize(buffer + decoded_length, data_size)); PyList_Append(result, entry); Py_DECREF(entry); buffer += decoded_length + data_size; length -= decoded_length + data_size; break; } default: PyErr_SetString( PyExc_ValueError, "Unexpected Tag"); goto error; } } return result; error: Py_DECREF(encoded_tag); return NULL; } /* Retrieves the semantic protobuf version * Returns a Python object if successful or NULL on error */ PyObject *py_semantic_get_version(PyObject *self, PyObject *arguments) { const char *errors = NULL; return(PyUnicode_DecodeUTF8("20150518", (Py_ssize_t) 8, errors)); } static PyMethodDef _semantic_methods[] = { {"get_version", (PyCFunction)py_semantic_get_version, METH_NOARGS, "get_version() -> String\n" "\n" "Retrieves the version."}, {"varint_encode", (PyCFunction)py_varint_encode, METH_VARARGS, "Encode an integer into a varint."}, {"varint_decode", (PyCFunction)py_varint_decode, METH_VARARGS, "Decode a varing from a buffer."}, {"split_buffer", (PyCFunction)py_split_buffer, METH_VARARGS | METH_KEYWORDS, "Split a buffer into tags and wire format data."}, {NULL} /* Sentinel */ }; PyMODINIT_FUNC init_semantic(void) { /* create module */ Py_InitModule3("_semantic", _semantic_methods, "Semantic Protobuf accelerator."); } grr-3.1.0.2/accelerated/setup.py000066400000000000000000000020211273104013200163770ustar00rootroot00000000000000#!/usr/bin/env python # # Copyright 2015 Google Inc. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Acceleration module for semantic protobuf parsing.""" from distutils.core import Extension from distutils.core import setup SOURCES = ["accelerated.c"] setup(name="grr", version="0.1", long_description="Semantic protobufs are smart protocol buffers.", license="Apache 2.0", author="Michael Cohen", ext_modules=[ Extension("_semantic", SOURCES,) ],) grr-3.1.0.2/appveyor.yml000066400000000000000000000006241273104013200150300ustar00rootroot00000000000000branches: only: - master platform: - x64 clone_folder: C:\grr_src cache: - '%LOCALAPPDATA%\pip\Cache' install: - cmd: C:\grr_src\vagrant\windows\install_for_build.bat build_script: - cmd: C:\Python27-x64\python.exe C:\grr_src\vagrant\windows\build_windows_templates.py --grr_src=C:\grr_src --output_dir=C:\grr_src\output artifacts: - path: output name: templates type: zip grr-3.1.0.2/artifacts/000077500000000000000000000000001273104013200144165ustar00rootroot00000000000000grr-3.1.0.2/artifacts/README.md000066400000000000000000000010021273104013200156660ustar00rootroot00000000000000# This directory is reserved for external artifacts The Makefile removes ``*.yaml`` from this directory when syncing the external repo located [here] (https://github.com/ForensicArtifacts/artifacts). ## Where artifacts go - Private artifacts should go in ``artifacts/local`` - Public artifacts that are non GRR specific should be submitted to the external repo. - Public artifacts that call GRR functions with ``LIST_FILES``, ``GRR_CLIENT_ACTION``, ``GREP`` etc. should live in ``artifacts/flow_templates`` grr-3.1.0.2/binaries/000077500000000000000000000000001273104013200142325ustar00rootroot00000000000000grr-3.1.0.2/debian/000077500000000000000000000000001273104013200136605ustar00rootroot00000000000000grr-3.1.0.2/debian/changelog000066400000000000000000000077661273104013200155520ustar00rootroot00000000000000grr-server (3.1.0-2) unstable; urgency=low * Update -- GRR development team Thu, 14 Apr 2016 18:16:26 -0700 grr-server (3.1.0-1) unstable; urgency=low * Update -- GRR development team Mon, 11 Apr 2016 00:00:00 -0700 grr-server (0.3.0-8) unstable; urgency=low * Update -- GRR development team Fri, 19 Feb 2016 00:00:00 -0700 grr-server (0.3.0-7) unstable; urgency=low * Update -- GRR development team Mon, 20 Jul 2015 13:40:26 -0700 grr-server (0.3.0-6) unstable; urgency=low * Update -- GRR development team Wed, 17 Mar 2015 00:00:00 +0100 grr-server (0.3.0-2) unstable; urgency=low * Fixed some small client bugs. * Updated GRR to use Rekall v1.0.2, removed Volatility completely. -- GRR development team Wed, 30 Jun 2014 00:00:00 +0100 grr-server (0.3.0-1) unstable; urgency=low * Version change to make client versioning easier. -- GRR development team Tue, 26 Jun 2014 11:35:00 +0100 grr-server (0.2.10-1) unstable; urgency=low * Update -- GRR development team Tue, 15 Apr 2014 12:08:00 +0100 grr-server (0.2.9-1) unstable; urgency=low * Version correction -- GRR development team Fri, 06 Dec 2013 11:13:18 +0100 grr-server (0.2-9) unstable; urgency=low * Update -- GRR development team Sun, 20 Oct 2013 12:00:00 +0000 grr-server (0.2-8) unstable; urgency=low * Added Windows 32 bit client * Updated deployment documentation * Fix for TSK URN escaping issues * Added support for renaming Windows executables during repacking * Added verbose repacking to make debugging clients easier * Bugfixes -- GRR development team Thu, 4 Apr 2013 12:00:00 +0200 grr-server (0.2-7) unstable; urgency=low * Bugfixes for build and deployment * Fixed tests * Added OSX client automatic packaging * Resolved bad log paths for packaged Windows 64 bit client * Fixed mongo index error * Improved logging * Added initctl_switch.sh helper script * Updated winpmem drivers -- GRR development team Thu, 4 Apr 2013 12:00:00 +0200 grr-server (0.2-6) unstable; urgency=low * New Bootstrap UI * Expanded Hunt UI for scheduling * Config system complete overhaul * Additional mysql datastore option (currently low performance) * New client builds for OSX and Windows * New pmem memory drivers -- GRR development team Sun, 31 Mar 2013 12:00:00 +0200 grr-server (0.2-5) unstable; urgency=low * Numerous bug fixes * Memory drivers now ship included * Volatility integration updates * Hunt scheduling UI v1 ready * Refactor of flow typing system for faster development/testing -- GRR development team Thurs, 31 Oct 2012 12:00:00 +0200 grr-server (0.2-4) unstable; urgency=low * Update for memory improvements * Django 1.4 fixes * Numerous bug fixes -- GRR development team Thurs, 31 Oct 2012 12:00:00 +0200 grr-server (0.2-3) unstable; urgency=low * Improved build and update mechanisms * Add initial hunt scheduling UI * Compatibility fixes for Django 1.4 including XSRF changes * New flows GetProcessesBinariesVolatility, CacheGrep, Glob, SendFile * Scheduling performance improvements * Numerous bug fixes -- GRR development team Thurs, 31 Oct 2012 12:00:00 +0200 grr-server (0.2-2) unstable; urgency=low * Update build and update mechanisms to ease maintenance and install * Include OSX client builds * Add memory driver installation support * Numerous bug fixes -- GRR development team Thurs, 18 Oct 2012 12:00:00 +0200 grr-server (0.2-1) unstable; urgency=low * Initial release -- GRR development team Fri, 28 Sep 2012 12:00:00 +0200 grr-3.1.0.2/debian/compat000066400000000000000000000000021273104013200150560ustar00rootroot000000000000008 grr-3.1.0.2/debian/control000066400000000000000000000010601273104013200152600ustar00rootroot00000000000000Source: grr-server Section: misc Priority: extra Maintainer: GRR developers Build-Depends: debhelper (>= 9), dh-systemd (>= 1.5), dh-virtualenv (>= 0.6), lib32z1, libc6-i386, python2.7-dev Standards-Version: 3.8.3 Homepage: https://github.com/google/grr Package: grr-server Section: python Architecture: any Pre-Depends: Depends: debhelper, dpkg (>= 1.16.1), dpkg-dev, prelink, python2.7-dev, rpm, systemd, zip Description: GRR Rapid Response is an Incident Response Framework GRR Rapid Response is an Incident Response Framework. grr-3.1.0.2/debian/copyright000066400000000000000000000031251273104013200156140ustar00rootroot00000000000000This work was packaged for Debian by: GRR development team on Fri, 28 Sep 2012 12:00:00 +0200 It was downloaded from: https://github.com/google/grr Upstream Author(s): GRR development team Copyright: Copyright 2011 Google Inc. License: Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. On Debian systems, the complete text of the Apache-2.0 License can be found in `/usr/share/common-licenses/Apache-2.0'. The Debian packaging is: Copyright 2012 Google Inc. License: Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. grr-3.1.0.2/debian/grr-server.default000066400000000000000000000017031273104013200173250ustar00rootroot00000000000000# Configuration file for grr-response-server under Debian based systems. # The main location for the GRR virtualenv. If you want to run GRR from source, # simply create a new virtualenv, pip install into it (possibly with the -e # flag) and point this at the location of the virtualenv. All initd scripts will # then start up that GRR server instead of the one shipped with the deb package. GRR_PREFIX=/usr/share/grr-server/ # These args are appended to every command line invocation from /usr/bin/. The # debian scripts will use this to force the GRR writeback location to # /etc/grr/. If you want to store the local grr configuration file in another # location, change the below. If you remove this override the GRR installation # will write local configuration changes into a private location within the # virtualenv (this way you can have multiple different GRR installations running # at the same time). GRR_EXTRA_ARGS=(--context 'Global Install Context')grr-3.1.0.2/debian/grr-server.docs000066400000000000000000000000171273104013200166260ustar00rootroot00000000000000LICENSE README grr-3.1.0.2/debian/grr-server.postinst.in000066400000000000000000000021101273104013200201620ustar00rootroot00000000000000#!/bin/bash set -e case "$1" in configure) if [ "$DEBIAN_FRONTEND" != noninteractive ]; then echo "#################################################################" echo "Running grr_config_updater initialize" echo "To avoid this prompting, set DEBIAN_FRONTEND=noninteractive" echo "#################################################################" grr_config_updater initialize fi # Set filehandle max to a high value if it isn't already set. if ! grep -Fq "fs.file-max" /etc/sysctl.conf; then echo "Increasing our filehandle limit (for SQLite datastore)." echo "fs.file-max = 1048576" >> /etc/sysctl.conf sysctl -p fi echo "Filehandle limit now: $(cat /proc/sys/fs/file-max)" esac echo "#################################################################" echo "Install complete." echo "If upgrading, make sure you read the release notes:" echo "https://github.com/google/grr-doc/blob/master/releasenotes.adoc" echo "#################################################################" grr-3.1.0.2/debian/grr-server.service000066400000000000000000000014331273104013200173410ustar00rootroot00000000000000# This service is actually a systemd target, but we are using a service since # targets cannot be reloaded and we may want to implement reload in the future. [Unit] Description=GRR Service After=syslog.target network.target Documentation=https://github.com/google/grr [Service] Type=oneshot RemainAfterExit=yes ExecReload=/bin/systemctl --no-block reload grr-server@ui.service grr-server@http_server.service grr-server@worker.service grr-server@worker2.service ExecStart=/bin/systemctl --no-block start grr-server@ui.service grr-server@http_server.service grr-server@worker.service grr-server@worker2.service ExecStop=/bin/systemctl --no-block stop grr-server@ui.service grr-server@http_server.service grr-server@worker.service grr-server@worker2.service [Install] WantedBy=multi-user.target grr-3.1.0.2/debian/grr-server@.service000066400000000000000000000010021273104013200174310ustar00rootroot00000000000000[Unit] Description=GRR %I PartOf=grr-server.service ReloadPropagatedFrom=grr-server.service After=syslog.target network.target Documentation=https://github.com/google/grr [Service] Type=simple PrivateTmp=true Restart=on-failure Environment="MPLCONFIGDIR=/var/run/grr/tmp/%i" "PYTHON_EGG_CACHE=/var/run/grr/tmp/%i" ExecStartPre=/bin/mkdir -p /var/run/grr/tmp/%i ExecStart=/usr/bin/grr_server --component %i --disallow_missing_config_definitions -p StatsStore.process_id=%i_%m [Install] WantedBy=multi-user.target grr-3.1.0.2/debian/rules000066400000000000000000000031401273104013200147330ustar00rootroot00000000000000#!/usr/bin/make -f # debian/rules that uses debhelper >= 8. # Uncomment this to turn on verbose mode. export DH_VERBOSE=1 # This has to be exported to make some magic below work. export DH_OPTIONS export DH_VIRTUALENV_INSTALL_ROOT=/usr/share/ %: dh $@ --with python-virtualenv,systemd dh_python2: override_dh_pysupport: override_dh_auto_clean: override_dh_auto_test: override_dh_installinit: dh_installinit bash scripts/install_server_from_src.sh -i debian/grr-server # Add post installation instructions cat debian/grr-server.postinst.in >> debian/grr-server.postinst.debhelper override_dh_installdocs: override_dh_installmenu: override_dh_installmime: override_dh_installmodules: override_dh_installlogcheck: override_dh_installlogrotate: override_dh_installpam: override_dh_installppp: override_dh_installudev: override_dh_installwm: override_dh_installxfonts: override_dh_link: override_dh_gconf: override_dh_icons: override_dh_perl: # For pre-release testing put all the files in a directory in the src tree # called grr_release_testing and point dh_virtualenv at it like this: # --extra-pip-arg '-f' --extra-pip-arg 'file:///usr/src/grr/grr_release_testing' # You'll also need to modify .dockerignore to remove the lines that exclude the # python package names and tarballs. override_dh_virtualenv: dh_virtualenv --extra-pip-arg '-f' --extra-pip-arg 'https://storage.googleapis.com/releases.grr-response.com/index.html' --python python2.7 --preinstall 'setuptools>20' --preinstall 'pip>=8.1.1,<9' --preinstall 'wheel' --preinstall 'grr-response-templates' --preinstall 'grr-response-server' grr-3.1.0.2/docker/000077500000000000000000000000001273104013200137055ustar00rootroot00000000000000grr-3.1.0.2/docker/Dockerfile.build_server_deb000066400000000000000000000040351273104013200211770ustar00rootroot00000000000000# A Docker container that builds the server deb. # Template release for grr-responses-templates must be done before building the # server deb. # # See here for build instructions: # https://github.com/google/grr-doc/blob/master/admin.adoc#building-the-server-debian-package # Building on xenial gets us Python 2.7.11 FROM ubuntu:xenial MAINTAINER Greg Castle github@mailgreg.com # The 32bit libs listed here are required for PyInstaller, which isn't used on # the server but picked up by the deb library checker as missing. PyInstaller is # a client python package dependency and we need that package for the # ClientBuild entry point for repacking. Disabling the library check might # result in missing something important. Adding the build deps here seems like # the least bad option. RUN apt-get update && \ apt-get install -y \ debhelper \ dh-systemd \ dh-virtualenv \ dpkg-dev \ lib32z1 \ libc6-i386 \ libssl-dev \ python2.7-dev \ python-pip \ prelink \ rpm \ wget \ zip && \ pip install --upgrade pip && \ pip install virtualenv && \ pip install --upgrade setuptools && \ virtualenv /tmp/grr-env # Pull dependencies and templates from pypi and build wheels into a temp # virtualenv. All we are doing here is populating the pip cache so it can be # cached by docker and make the server build go fast. RUN . /tmp/grr-env/bin/activate && \ pip install wheel && \ pip install --pre grr-response-server && \ pip install -f https://storage.googleapis.com/releases.grr-response.com/index.html grr-response-templates && \ deactivate # Copy the GRR code over and build the deb. This will create a fresh virtualenv # and install from src, but re-use the precompiled wheels via pip and docker # caching. COPY . /usr/src/grr/ WORKDIR /usr/src/grr # You may see SyntaxError: invalid syntax from pexpect, this seems to be # harmless since this code is only used when building clients from source: # https://github.com/pexpect/pexpect/issues/220 # https://bugs.launchpad.net/ubuntu/+source/ubuntu-make/+bug/1507871 RUN dpkg-buildpackage -us -uc grr-3.1.0.2/docs/000077500000000000000000000000001273104013200133665ustar00rootroot00000000000000grr-3.1.0.2/docs/makefile.py000066400000000000000000000015161273104013200155200ustar00rootroot00000000000000#!/usr/bin/env python """Update the local documentation from upstream.""" import os import StringIO import subprocess import urllib2 import zipfile def main(): data = urllib2.urlopen( "https://github.com/google/grr-doc/archive/master.zip").read() zip_obj = zipfile.ZipFile(StringIO.StringIO(data)) for name in zip_obj.namelist(): if (os.path.basename(name) == "Makefile" or os.path.splitext(name)[1] in [".adoc", ".jpg", ".png"]): print "Extracting %s" % name out_filename = name.replace("grr-doc-master", ".") try: os.makedirs(os.path.dirname(out_filename)) except OSError: pass with open(out_filename, "wb") as fd: fd.write(zip_obj.open(name).read()) print "Generating html." subprocess.check_call(["make"], shell=True) if __name__ == "__main__": main() grr-3.1.0.2/executables/000077500000000000000000000000001273104013200147425ustar00rootroot00000000000000grr-3.1.0.2/executables/python_hacks/000077500000000000000000000000001273104013200174345ustar00rootroot00000000000000grr-3.1.0.2/executables/python_hacks/modify_network.py000066400000000000000000000115311273104013200230470ustar00rootroot00000000000000#!/usr/bin/env python """Shut down windows hosts.""" import platform import re def NetshStaticIp(interface, ip=u'127.0.0.9', subnet=u'255.255.255.255', gw=u'127.0.0.1'): """Changes interface to a staticly set IP. Sets IP configs to local if no paramaters passed. Args: interface: Name of the interface. ip: IP address. subnet: Subnet mask. gw: IP address of the default gateway. Returns: A tuple of stdout, stderr, exit_status. """ args = ['/c', 'netsh', 'interface', 'ip', 'set', 'address', interface, 'static', ip, subnet, gw, '1'] # pylint: disable=undefined-variable res = client_utils_common.Execute('cmd', args, time_limit=-1, bypass_whitelist=True) return res def DisableInterfaces(interface): """Tries to disable an interface. Only works on Vista and 7. Args: interface: Name of the interface to disable. Returns: res which is a tuple of (stdout, stderr, exit_status, time_taken). """ set_tested_versions = ['vista', '2008'] set_args = ['/c', 'netsh', 'set', 'interface', interface, 'DISABLED'] host_version = platform.platform().lower() for version in set_tested_versions: if host_version.find(version) != -1: # pylint: disable=undefined-variable res = client_utils_common.Execute('cmd', set_args, time_limit=-1, bypass_whitelist=True) return res return ('', 'Command not available for this version.', 99, '') def GetEnabledInterfaces(): """Gives a list of enabled interfaces. Should work on all windows versions. Returns: interfaces: Names of interfaces found enabled. """ interfaces = [] show_args = ['/c', 'netsh', 'show', 'interface'] # pylint: disable=undefined-variable res = client_utils_common.Execute('cmd', show_args, time_limit=-1, bypass_whitelist=True) pattern = re.compile(r'\s*') for line in res[0].split('\r\n'): # res[0] is stdout. interface_info = pattern.split(line) if 'Enabled' in interface_info: interfaces.extend(interface_info[-1:]) return interfaces def MsgUser(msg): """Sends a message to a user. Args: msg: Message to be displaied to user. Returns: res which is a tuple of (stdout, stderr, exit_status, time_taken). """ msg_tested_versions = ['xp', 'vista', '2008', '2003'] msg_args = ['/c', '%SystemRoot%\\System32\\msg.exe', '*', '/TIME:0'] host_version = platform.platform().lower() if not msg: return ('Command not ran.', 'Empty message.', -1) else: msg_args.extend([msg]) for version in msg_tested_versions: if host_version.find(version) != -1: # pylint: disable=undefined-variable res = client_utils_common.Execute('cmd', msg_args, time_limit=-1, bypass_whitelist=True) return res return ('', 'Command not available for this version.', -1) def main(): return_str = {} # pylint: disable=g-bad-name MSG_STRING = ('***WARNING for Acme Corp Security***\n' 'Your machine was found to be infected with a \n' 'very scary virus. As a security measure we are \n' 'shutting down your internet connection. Please \n' 'call 0800-OHNOES immediately.') # pylint: disable=undefined-variable if 'msg' in py_args: return_str['msg'] = MsgUser(py_args['msg']) else: return_str['msg'] = MsgUser(MSG_STRING) for interface in GetEnabledInterfaces(): if interface != 'Loopback' or interface != 'Internal': return_str[interface] = DisableInterfaces(interface) # Disabaling interface is not available. # Change interface config to be unroutable. if return_str[interface][2] == 99: if all([key in py_args for key in ['ip', 'subnet', 'gw']]): return_str[interface] = NetshStaticIp(interface, py_args['ip'], py_args['subnet'], py_args['gw']) else: return_str[interface] = NetshStaticIp(interface) # Build magic string. magic_list = [] for key in return_str: stdout, stderr, exit_status, time_taken = return_str[key] key_str = '%s, %s, %s, %s, %s' % (key, stdout.encode('base64'), stderr.encode('base64'), exit_status, time_taken) magic_list.append(key_str) magic_return_str = ''.join(magic_list) # pylint: disable=unused-variable if __name__ == '__main__': main() grr-3.1.0.2/executables/python_hacks/shutdown_host.py000066400000000000000000000015651273104013200227250ustar00rootroot00000000000000#!/usr/bin/env python """Shut down windows hosts.""" import platform tested_versions = ['xp', 'vista', '2008', '2003'] cmd = 'cmd' args = ['/c', '%SystemRoot%\\System32\\shutdown.exe', '/s', '/f'] os_version = platform.platform().lower() # pylint: disable=undefined-variable if 'time_in_seconds' in py_args: args.extend(['/t', py_args['time_in_seconds']]) else: args.extend(['/t', '20']) if 'reason' in py_args: args.extend(['/c', py_args['reason']]) for version in tested_versions: if os_version.find(version) != -1: stdout, stderr, exit_status, time_taken = client_utils_common.Execute( cmd, args, time_limit=-1, bypass_whitelist=True) magic_return_str = '%s, %s, %s, %s' % (stdout.encode('base64'), stderr.encode('base64'), exit_status, time_taken) break grr-3.1.0.2/executables/windows/000077500000000000000000000000001273104013200164345ustar00rootroot00000000000000grr-3.1.0.2/executables/windows/.gitignore000066400000000000000000000001121273104013200204160ustar00rootroot00000000000000templates/grr-client* templates/grr_* templates/GRR_* installers/ config/ grr-3.1.0.2/executables/windows/templates/000077500000000000000000000000001273104013200204325ustar00rootroot00000000000000grr-3.1.0.2/executables/windows/templates/unzipsfx/000077500000000000000000000000001273104013200223205ustar00rootroot00000000000000grr-3.1.0.2/grr/000077500000000000000000000000001273104013200132305ustar00rootroot00000000000000grr-3.1.0.2/grr/__init__.py000066400000000000000000000015211273104013200153400ustar00rootroot00000000000000#!/usr/bin/env python """GRR Rapid Response Framework.""" import ConfigParser import os def version(): """Return a dict with GRR version information.""" # Delay import until we have the config system to find the version.ini file. # pylint: disable=g-import-not-at-top from grr.lib import config_lib version_ini = config_lib.Resource().Filter("version.ini") if not os.path.exists(version_ini): raise RuntimeError("Can't find version.ini at %s" % version_ini) config = ConfigParser.SafeConfigParser() config.read(version_ini) return dict(packageversion=config.get("Version", "packageversion"), major=config.getint("Version", "major"), minor=config.getint("Version", "minor"), revision=config.getint("Version", "revision"), release=config.getint("Version", "release")) grr-3.1.0.2/grr/artifacts/000077500000000000000000000000001273104013200152105ustar00rootroot00000000000000grr-3.1.0.2/grr/artifacts/README.md000066400000000000000000000010021273104013200164600ustar00rootroot00000000000000# This directory is reserved for external artifacts The Makefile removes ``*.yaml`` from this directory when syncing the external repo located [here] (https://github.com/ForensicArtifacts/artifacts). ## Where artifacts go - Private artifacts should go in ``artifacts/local`` - Public artifacts that are non GRR specific should be submitted to the external repo. - Public artifacts that call GRR functions with ``LIST_FILES``, ``GRR_CLIENT_ACTION``, ``GREP`` etc. should live in ``artifacts/flow_templates`` grr-3.1.0.2/grr/artifacts/__init__.py000066400000000000000000000000271273104013200173200ustar00rootroot00000000000000#!/usr/bin/env python grr-3.1.0.2/grr/artifacts/flow_templates/000077500000000000000000000000001273104013200202355ustar00rootroot00000000000000grr-3.1.0.2/grr/artifacts/flow_templates/README000066400000000000000000000005401273104013200211140ustar00rootroot00000000000000These 'artifacts' are separate from the main repository because they don't describe digital forensic artifacts, instead they provide a way to call pre-defined GRR flows from YAML, the working name for which is 'flow templates'. We will be changing how this pre-defined flow calling works, starting with separating these out from the regular artifacts. grr-3.1.0.2/grr/artifacts/flow_templates/cron.yaml000066400000000000000000000014731273104013200220670ustar00rootroot00000000000000# This file has artifacts that collect stat entries only # This cannot be in ForensicArtifact repo as it uses LIST_FILES name: LinuxCronParentFolders doc: Collect stat information on parent folders of cron and at jobs. sources: - type: LIST_FILES attributes: paths: - '/etc/cron.daily' - '/etc/cron.hourly' - '/etc/cron.monthly' - '/etc/cron.weekly' - '/etc/cron.d' - '/var/spool/cron' - '/var/spool/at' labels: [Configuration Files] supported_os: [Linux] urls: ['https://help.ubuntu.com/community/CronHowto#How_Anacron_is_Arranged'] --- name: AllLinuxScheduleFiles doc: All Linux job scheduling files. sources: - type: ARTIFACT_GROUP attributes: names: [AnacronFiles, LinuxCronTabs, LinuxAtJobs, LinuxCronParentFolders] labels: [Configuration Files] supported_os: [Linux] grr-3.1.0.2/grr/artifacts/flow_templates/darwin.yaml000066400000000000000000000017321273104013200224100ustar00rootroot00000000000000# OS X flow templates. name: DarwinPersistenceMechanisms doc: Persistence mechanisms on Darwin. sources: - type: ARTIFACT_GROUP attributes: names: [OSXServices] returned_types: [PersistenceFile] labels: [System] supported_os: [Darwin] --- name: DarwinPersistenceMechanismFiles doc: Files that are run by Darwin persistence mechanisms. sources: - type: ARTIFACT_FILES attributes: artifact_list: [DarwinPersistenceMechanisms] returned_types: [StatEntry] labels: [System] supported_os: [Darwin] --- name: OSXServices doc: Running services from the Max OS X service management framework. sources: - type: GRR_CLIENT_ACTION attributes: {client_action: OSXEnumerateRunningServices} labels: [System] supported_os: [Darwin] --- name: OSXSPHardwareDataType doc: Mac OS X system profiler. sources: - type: COMMAND attributes: args: ["-xml", "SPHardwareDataType"] cmd: /usr/sbin/system_profiler returned_types: [HardwareInfo] labels: [System] supported_os: [Darwin] grr-3.1.0.2/grr/artifacts/flow_templates/disk.yaml000066400000000000000000000004361273104013200220560ustar00rootroot00000000000000# Disk flow templates. name: RootDiskVolumeUsage doc: | Volume info for disk mounted at "/". Includes size and free space. sources: - type: GRR_CLIENT_ACTION attributes: client_action: StatFS action_args: {path_list: ["/"]} labels: [System] supported_os: [Linux, Darwin] grr-3.1.0.2/grr/artifacts/flow_templates/grr_actions.yaml000066400000000000000000000021371273104013200234360ustar00rootroot00000000000000# GRR client action flow templates. name: NetstatGrr doc: List open network connections using the GRR netstat client action. sources: - type: GRR_CLIENT_ACTION attributes: {client_action: Netstat} returned_types: [NetworkConnection] labels: [Network] --- name: EnumerateFilesystemsGrr doc: List mounted file systems using GRR EnumerateFilesystems client action. sources: - type: GRR_CLIENT_ACTION attributes: {client_action: EnumerateFilesystems} returned_types: [Filesystem] labels: [System] --- name: HostnameGrr doc: Get Hostname using the GRR GetHostname client action. sources: - type: GRR_CLIENT_ACTION attributes: {client_action: GetHostname} returned_types: [DataBlob] labels: [System] --- name: EnumerateInterfacesGrr doc: List network interfaces using the GRR EnumerateInterfaces client action. sources: - type: GRR_CLIENT_ACTION attributes: {client_action: EnumerateInterfaces} labels: [Network] --- name: ListProcessesGrr doc: List system processes using the GRR ListProcesses client action. sources: - type: GRR_CLIENT_ACTION attributes: {client_action: ListProcesses} labels: [Processes] grr-3.1.0.2/grr/artifacts/flow_templates/linux.yaml000066400000000000000000000042221273104013200222600ustar00rootroot00000000000000# Linux flow templates. name: LinuxUserProfiles doc: | Linux user profile information. * recent logins in wtmp; * user metadata in the output of getpwnam. sources: - type: GRR_CLIENT_ACTION attributes: {client_action: EnumerateUsers} labels: [Users] provides: [users.homedir, users.username, users.last_logon, users.full_name] supported_os: [Linux] --- name: LinuxPasswdHomedirs doc: Grep passwd file for user homedirs. sources: - type: GREP attributes: paths: ['/etc/passwd'] content_regex_list: ["^%%users.username%%:[^:]*:[^:]*:[^:]*:[^:]*:[^:]+:[^:]*\n"] provides: [users.homedir, users.full_name] labels: [Authentication] supported_os: [Linux] --- name: NssCacheLinuxPasswdHomedirs doc: Grep /etc/passwd.cache file for user homedirs. sources: - type: GREP attributes: paths: ['/etc/passwd.cache'] content_regex_list: ["^%%users.username%%:[^:]*:[^:]*:[^:]*:[^:]*:[^:]+:[^:]*\n"] provides: [users.homedir, users.full_name] labels: [Authentication] supported_os: [Linux] urls: ['https://code.google.com/p/nsscache/'] --- name: RedhatYumPackagesList doc: Linux output of yum list installed. sources: - type: COMMAND attributes: args: ["list", "installed", "-q"] cmd: /usr/bin/yum labels: [Software] supported_os: [Linux] --- name: RedhatPackagesList doc: Linux output of rpm -qa. sources: - type: COMMAND attributes: args: [-qa] cmd: /bin/rpm labels: [Software] supported_os: [Linux] --- name: RedhatYumRepoList doc: Linux output of yum repolist -q -a. sources: - type: COMMAND attributes: args: ["repolist", "-v", "-q"] cmd: /usr/bin/yum labels: [Software] supported_os: [Linux] --- name: DebianPackagesList doc: Linux output of dpkg --list. sources: - type: COMMAND attributes: args: [--list] cmd: /usr/bin/dpkg labels: [Software] supported_os: [Linux] --- name: SshdConfigCmd doc: Output of sshd -T. sources: - type: COMMAND attributes: args: [-T] cmd: /usr/sbin/sshd labels: [Configuration Files] supported_os: [Linux] --- name: LinuxHardwareInfo doc: dmidecode Baseboard Serial Number sources: - type: COMMAND attributes: args: [-q] cmd: /usr/sbin/dmidecode labels: [System] supported_os: [Linux] grr-3.1.0.2/grr/artifacts/flow_templates/memory.yaml000066400000000000000000000004331273104013200224310ustar00rootroot00000000000000# Memory-related flow templates. name: RekallPsList doc: Process listing using Rekall. sources: - type: REKALL_PLUGIN attributes: attributes: {} plugin: pslist labels: [Rekall, Processes] urls: ['http://www.rekall-forensic.com/docs/Manual/Plugins/Windows/WinPsList.html'] grr-3.1.0.2/grr/artifacts/flow_templates/processes.yaml000066400000000000000000000005141273104013200231270ustar00rootroot00000000000000# Process-related flow templates. name: AllRunningProcessBinaryFiles doc: Download binaries of all the running processes. sources: - type: ARTIFACT_FILES attributes: artifact_list: [ListProcessesGrr] pathspec_attribute: exe returned_types: [Process] labels: [Processes, Software] supported_os: [Windows, Linux, Darwin] grr-3.1.0.2/grr/artifacts/flow_templates/stat.yaml000066400000000000000000000027011273104013200220740ustar00rootroot00000000000000# This file contains miscellaneous artifacts that collect only the stat of # files/folder. This cannot be in ForensicArtifact repo as it uses LIST_FILES name: RootEnvPath doc: Collect stat on files in root's $PATH. sources: - type: LIST_FILES attributes: paths: - '/usr/local/sbin/*' - '/usr/local/bin/*' - '/usr/sbin/*' - '/usr/bin/*' - '/sbin/*' - '/bin/*' labels: [Software] supported_os: [Linux] --- name: RootEnvPathDirs doc: "Collect stat on directories (including parents) containing the files in root's $PATH." sources: - type: LIST_FILES attributes: paths: - '/usr/local/sbin' - '/usr/local/bin' - '/usr/local' - '/usr/sbin' - '/usr/bin' - '/usr' - '/sbin' - '/bin' - '/' labels: [Software] supported_os: [Linux] --- name: LinuxLogFiles doc: Collect stat of all linux log files/folders sources: - type: LIST_FILES attributes: paths: - '/var/log' - '/var/log/**' labels: [Logs] supported_os: [Linux] --- name: UserHomeDirs doc: Collect stat on users' home directories sources: - type: LIST_FILES attributes: paths: - '%%users.homedir%%' - '/root' labels: [Users] supported_os: [Linux] --- name: UserDotFiles doc: Collect stat on dot files in users' home directories sources: - type: LIST_FILES attributes: paths: - '%%users.homedir%%/.*' - '/root/.*' labels: [Configuration Files] supported_os: [Linux] grr-3.1.0.2/grr/artifacts/flow_templates/windows.yaml000066400000000000000000000013651273104013200226200ustar00rootroot00000000000000# Windows flow templates. name: AllVADBinaryFiles doc: Download all currently running binaries on Windows. sources: - type: ARTIFACT_FILES attributes: artifact_list: [FullVADBinaryList] returned_types: [PathSpec] labels: [Rekall, Processes, Software] supported_os: [Windows] --- name: FullVADBinaryList doc: Extract list of currently running binaries on Windows. sources: - type: REKALL_PLUGIN attributes: plugin: vad labels: [Rekall, Processes] supported_os: [Windows] --- name: WindowsPersistenceMechanismFiles doc: Files that are run by Windows persistence mechanisms. sources: - type: ARTIFACT_FILES attributes: artifact_list: [WindowsPersistenceMechanisms] returned_types: [StatEntry] labels: [Software] supported_os: [Windows] grr-3.1.0.2/grr/artifacts/local/000077500000000000000000000000001273104013200163025ustar00rootroot00000000000000grr-3.1.0.2/grr/artifacts/local/__init__.py000066400000000000000000000003461273104013200204160ustar00rootroot00000000000000#!/usr/bin/env python """This directory contains local site-specific artifacts. All .yaml files in this directory will be automatically loaded by the artifact library (See the configuration parameter Artifacts.artifact_dirs. """ grr-3.1.0.2/grr/artifacts/makefile.py000066400000000000000000000012721273104013200173410ustar00rootroot00000000000000#!/usr/bin/env python """Update the artifacts directory from upstream.""" import fnmatch import glob import os import StringIO import urllib2 import zipfile def main(): data = urllib2.urlopen( "https://github.com/ForensicArtifacts/artifacts/archive/master.zip").read( ) zip_obj = zipfile.ZipFile(StringIO.StringIO(data)) # Remove all existing yaml files. for filename in glob.glob("*.yaml"): os.unlink(filename) for name in zip_obj.namelist(): if fnmatch.fnmatch(name, "*/definitions/*.yaml"): print "Extracting %s" % name with open(os.path.basename(name), "wb") as fd: fd.write(zip_obj.open(name).read()) if __name__ == "__main__": main() grr-3.1.0.2/grr/checks/000077500000000000000000000000001273104013200144705ustar00rootroot00000000000000grr-3.1.0.2/grr/checks/__init__.py000066400000000000000000000000271273104013200166000ustar00rootroot00000000000000#!/usr/bin/env python grr-3.1.0.2/grr/checks/cron.yaml000066400000000000000000000073751273104013200163310ustar00rootroot00000000000000check_id: 'CIS-CRON-PERMISSIONS' method: - target: {os: ['Linux']} probe: # artifact defined in grr/artifacts/cron.yaml not in ForensicArtifacts - artifact: 'AllLinuxScheduleFiles' hint: problem: 'System crontabs can be modified by non-privileged users.' fix: > Make sure crontabs are owned by root and are not modifiable by any other users. format: > {pathspec.path} user: {st_uid}, group: {st_gid}, mode: {st_mode} mode: PARALLEL result_context: 'RAW' filters: - type: 'StatFilter' expression: 'uid:!0' - type: 'StatFilter' expression: 'gid:!0 mode:0020 mask:7020' - type: 'StatFilter' expression: 'mode:0002 mask:7002' - artifact: 'CronAtAllowDenyFiles' hint: problem: > System cron or at allow/deny files can be modified by non-privileged users. fix: > Make sure cron or at allow/deny files are owned by root and are not modifiable by any other users. format: > {pathspec.path} user: {st_uid}, group: {st_gid}, mode: {st_mode} mode: PARALLEL result_context: 'RAW' filters: - type: 'StatFilter' expression: 'uid:!0' - type: 'StatFilter' expression: 'gid:!0 mode:0020 mask:7020' - type: 'StatFilter' expression: 'mode:0002 mask:7002' --- check_id: 'CIS-AT-CRON-ALLOW-DOES-NOT-EXIST' method: - target: {os: ['Linux']} probe: - artifact: 'CronAtAllowDenyFiles' hint: problem: '/etc/cron.allow does not exist on the system.' fix: 'Make sure /etc/cron.allow exists and only contains root.' match: NONE result_context: 'RAW' filters: - type: 'StatFilter' expression: 'path_re:"/etc/cron\.allow"' - artifact: 'CronAtAllowDenyFiles' hint: problem: '/etc/at.allow does not exist on the system.' fix: 'Make sure /etc/at.allow exists and only contains root.' match: NONE result_context: 'RAW' filters: - type: 'StatFilter' expression: 'path_re:"/etc/at\.allow"' --- check_id: 'CIS-AT-CRON-DENY-EXISTS' method: - target: {os: ['Linux']} probe: - artifact: 'CronAtAllowDenyFiles' hint: format: > {pathspec.path} user: {st_uid}, group: {st_gid}, mode: {st_mode} problem: '/etc/cron.deny exists on the system.' fix: 'Remove /etc/cron.deny from the system.' result_context: 'RAW' mode: 'PARALLEL' filters: - type: 'StatFilter' expression: 'path_re:"/etc/cron\.deny"' - artifact: 'CronAtAllowDenyFiles' hint: format: > {pathspec.path} user: {st_uid}, group: {st_gid}, mode: {st_mode} problem: '/etc/at.deny exists on the system.' fix: 'Remove /etc/at.deny from the system.' result_context: 'RAW' mode: 'PARALLEL' filters: - type: 'StatFilter' expression: 'path_re:"/etc/at\.deny"' --- check_id: 'CIS-CRON-AT-ALLOW-ONLY-CONTAINS-ROOT' method: - target: {os: ['Linux']} probe: - artifact: 'CronAtAllowDenyFiles' hint: problem: > at.allow or cron.allow contains non-root users or does not contain root. format: '{filename}: {users}' mode: PARALLEL result_context: 'PARSER' filters: - type: 'ObjectFilter' expression: 'filename is "/etc/cron.allow" and users isnot ["root"]' - type: 'ObjectFilter' expression: 'filename is "/etc/at.allow" and users isnot ["root"]' grr-3.1.0.2/grr/checks/cron_test.py000066400000000000000000000216731273104013200170530ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- """Tests for cron checks.""" from grr.lib import flags from grr.lib import test_lib from grr.lib.checks import checks from grr.lib.checks import checks_test_lib from grr.lib.rdfvalues import anomaly as rdf_anomaly from grr.parsers import config_file class CronCheckTests(checks_test_lib.HostCheckTest): @classmethod def setUpClass(cls): cls.LoadCheck("cron.yaml") def _CheckMultipleSymPerCheck(self, check_id, results, sym_list, found_list): """Ensure results for a check containing multiple symptoms match.""" anom = [] for sym, found in zip(sym_list, found_list): anom.append(rdf_anomaly.Anomaly(symptom=sym, finding=found, type="ANALYSIS_ANOMALY")) expected = checks.CheckResult(check_id=check_id, anomaly=anom) self.assertResultEqual(expected, results[check_id]) def testCronPermisionsCheck(self): """Ensure cron permissions check detects files modifiable by non-root.""" check_id = "CIS-CRON-PERMISSIONS" artifact_crontab = "AllLinuxScheduleFiles" data_crontab = [self.CreateStat("/etc/cron.d", 0, 0, 0o0040640), self.CreateStat("/etc/cron.daily/test1", 0, 60, 0o0100660), self.CreateStat("/etc/cron.daily/test2", 50, 0, 0o0100444), self.CreateStat("/var/spool/cron/cronfile", 0, 0, 0o0100640), self.CreateStat("/etc/cron.d/cronfile2", 0, 0, 0o0100664)] sym_crontab = ("Found: System crontabs can be modified by non-privileged " "users.") found_crontab = [("/etc/cron.daily/test1 user: 0, group: 60, " "mode: -rw-rw----"), ("/etc/cron.daily/test2 user: 50, group: 0, " "mode: -r--r--r--")] artifact_allow_deny = "CronAtAllowDenyFiles" data_allow_deny = [self.CreateStat("/etc/cron.allow", 5, 0, 0o0100640), self.CreateStat("/etc/cron.deny", 0, 60, 0o0100640), self.CreateStat("/etc/at.allow", 0, 0, 0o0100440), self.CreateStat("/etc/at.deny", 0, 0, 0o0100666)] sym_allow_deny = ("Found: System cron or at allow/deny files can be " "modified by non-privileged users.") found_allow_deny = ["/etc/cron.allow user: 5, group: 0, mode: -rw-r-----", "/etc/at.deny user: 0, group: 0, mode: -rw-rw-rw-"] # Run checks only with results from only one artifact each results = self.GenResults([artifact_crontab], [data_crontab]) self.assertCheckDetectedAnom(check_id, results, sym_crontab, found_crontab) results = self.GenResults([artifact_allow_deny], [data_allow_deny]) self.assertCheckDetectedAnom(check_id, results, sym_allow_deny, found_allow_deny) # Run checks with results from both artifacts results = self.GenResults( [artifact_crontab, artifact_allow_deny], [data_crontab, data_allow_deny]) self._CheckMultipleSymPerCheck(check_id, results, [sym_crontab, sym_allow_deny], [found_crontab, found_allow_deny]) def testCronAllowDoesNotExistCheck(self): """Ensure check detects if /etc/(at|cron).allow doesn't exist.""" check_id = "CIS-AT-CRON-ALLOW-DOES-NOT-EXIST" artifact = "CronAtAllowDenyFiles" # both files exist in this data data1 = [self.CreateStat("/etc/cron.allow", 0, 0, 0o0100640), self.CreateStat("/etc/crondallow", 200, 60, 0o0100640), self.CreateStat("/etc/at.allow", 0, 0, 0o0100640), self.CreateStat("/etc/mo/cron.allow", 300, 70, 0o0100640), self.CreateStat("/root/at.allow", 400, 70, 0o0100640)] # only one file exists in this data data2 = [self.CreateStat("/etc/at.allow", 0, 0, 0o0100640), self.CreateStat("/etc/cronMallow", 200, 60, 0o0100640), self.CreateStat("/etc/cron/cron.allow", 300, 70, 0o0100640), self.CreateStat("/home/user1/at.allow", 400, 70, 0o0100640)] # neither file exists in this data data3 = [self.CreateStat("/etc/random/at.allow", 0, 0, 0o0100640), self.CreateStat("/etc/cronZallow", 200, 60, 0o0100640), self.CreateStat("/etc/cron/cron.allow", 300, 70, 0o0100640), self.CreateStat("/home/user1/at.allow", 400, 70, 0o0100640)] sym_cron_allow = ("Missing attribute: /etc/cron.allow does not exist " "on the system.") sym_at_allow = ("Missing attribute: /etc/at.allow does not exist " "on the system.") found = ["Expected state was not found"] # check with both files existing - no hits results = self.GenResults([artifact], [data1]) self.assertCheckUndetected(check_id, results) # check with only one file existing - one hit results = self.GenResults([artifact], [data2]) self.assertCheckDetectedAnom(check_id, results, sym_cron_allow, found) # check when both files don't exist - two hits results = self.GenResults([artifact], [data3]) self._CheckMultipleSymPerCheck(check_id, results, [sym_cron_allow, sym_at_allow], [found, found]) # Provide empty host data - check both files don't exist - two hits results = self.GenResults([artifact], [None]) self._CheckMultipleSymPerCheck(check_id, results, [sym_cron_allow, sym_at_allow], [found, found]) def testCronDenyExistCheck(self): """Ensure cron/at deny check detects if /etc/(at|cron).deny exists.""" check_id = "CIS-AT-CRON-DENY-EXISTS" artifact = "CronAtAllowDenyFiles" # both files exist in this data data1 = [self.CreateStat("/etc/cron.deny", 0, 0, 0o0100640), self.CreateStat("/etc/cronTdeny", 200, 60, 0o0100640), self.CreateStat("/etc/at.deny", 0, 0, 0o0100640), self.CreateStat("/etc/hi/cron.deny", 300, 70, 0o0100640), self.CreateStat("/root/at.deny", 400, 70, 0o0100640)] # only one file exists in this data data2 = [self.CreateStat("/etc/at.deny", 0, 0, 0o0100640), self.CreateStat("/etc/cronDdeny", 200, 60, 0o0100640), self.CreateStat("/etc/cron/cron.deny", 300, 70, 0o0100640), self.CreateStat("/home/user1/at.deny", 400, 70, 0o0100640)] # neither file exists in this data data3 = [self.CreateStat("/etc/random/at.deny", 0, 0, 0o0100640), self.CreateStat("/etc/cronDdeny", 200, 60, 0o0100640), self.CreateStat("/etc/cron/cron.deny", 300, 70, 0o0100640), self.CreateStat("/home/user1/at.deny", 400, 70, 0o0100640)] sym_cron_deny = "Found: /etc/cron.deny exists on the system." sym_at_deny = "Found: /etc/at.deny exists on the system." found_cron_deny = ["/etc/cron.deny user: 0, group: 0, mode: -rw-r-----"] found_at_deny = ["/etc/at.deny user: 0, group: 0, mode: -rw-r-----"] # check when both files exists results = self.GenResults([artifact], [data1]) self._CheckMultipleSymPerCheck(check_id, results, [sym_cron_deny, sym_at_deny], [found_cron_deny, found_at_deny]) # check with only one file existing - one hit results = self.GenResults([artifact], [data2]) self.assertCheckDetectedAnom(check_id, results, sym_at_deny, found_at_deny) # check with both file not existing - no hits results = self.GenResults([artifact], [data3]) self.assertCheckUndetected(check_id, results) def testCronAllowOnlyContainsRoot(self): """Ensure cron/at allow only contains "root".""" check_id = "CIS-CRON-AT-ALLOW-ONLY-CONTAINS-ROOT" artifact = "CronAtAllowDenyFiles" sym = ("Found: at.allow or cron.allow contains non-root users or does " "not contain root.") parser = config_file.CronAtAllowDenyParser() data = {"/etc/at.allow": "root", "/etc/cron.allow": "user1", "/etc/at.deny": "blah\nblah blah"} found = ["/etc/cron.allow: user1"] results = self.GenResults([artifact], [data], [parser]) self.assertCheckDetectedAnom(check_id, results, sym, found) data = {"/etc/at.allow": "", "/etc/cron.allow": "root"} found = ["/etc/at.allow:"] results = self.GenResults([artifact], [data], [parser]) self.assertCheckDetectedAnom(check_id, results, sym, found) data = {"/etc/at.allow": "", "/etc/cron.allow": ""} found = ["/etc/at.allow:", "/etc/cron.allow:"] results = self.GenResults([artifact], [data], [parser]) self.assertCheckDetectedAnom(check_id, results, sym, found) data = {"/etc/at.allow": "root", "/etc/cron.allow": "root"} results = self.GenResults([artifact], [data], [parser]) self.assertCheckUndetected(check_id, results) def main(argv): test_lib.GrrTestProgram(argv=argv) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/checks/format_test.py000066400000000000000000000016531273104013200173760ustar00rootroot00000000000000#!/usr/bin/env python """Unit test for check definitions.""" import glob import os from grr.lib import config_lib from grr.lib import flags from grr.lib import test_lib from grr.lib.checks import checks_test_lib class ValidFormatTest(checks_test_lib.HostCheckTest): def testParseChecks(self): """Tests if checks verify, collates errors to diagnose invalid checks.""" # Find the configs. check_configs = [] for path in config_lib.CONFIG["Checks.config_dir"]: check_configs.extend(glob.glob(os.path.join(path, "*.yaml"))) # Check each config file and collate errors. errors = "" for f in check_configs: try: self.assertValidCheckFile(f) except AssertionError as e: errors += "%s\n" % e self.assertFalse(errors, "Errors in check configurations:\n%s" % errors) def main(argv): test_lib.GrrTestProgram(argv=argv) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/checks/local/000077500000000000000000000000001273104013200155625ustar00rootroot00000000000000grr-3.1.0.2/grr/checks/local/__init__.py000066400000000000000000000000271273104013200176720ustar00rootroot00000000000000#!/usr/bin/env python grr-3.1.0.2/grr/checks/mounts.yaml000066400000000000000000000034441273104013200167060ustar00rootroot00000000000000#7.1 Add 'nodev' Option To Appropriate Partitions In /etc/fstab #7.2 Add 'nosuid' and 'nodev' Option To Removable Media in /etc/fstab #7.3 Disable User-Mounted Removable File Systems check_id: 'CIS-MOUNT-OPTION-NO-DEV' hint: format: '{mount_point}: {device} mounted with {options}' method: - target: {os: ['Linux']} probe: - artifact: 'LinuxFstab' hint: problem: 'Non-system mountpoints allow devices' fix: | Add "nodev" option to appropriate partitions. baseline: # White-list mount points where we expect to see device files. - type: 'ObjectFilter' expression: 'mount_point notinset ["/", "/dev", "/boot", "/dev/cgroup/devices"]' # White-list known non-device file supporting filesystem types. # i.e. Assume every other type can support device files. Black # listing filesystem filesystem types is a whack-a-mole problem. - type: 'ObjectFilter' expression: 'type notinset ["proc", "swap", "sysfs", "rpc_pipefs", "fusectl", "securityfs", "devtmpfs", "devpts", "debugfs", "pstore", "devfsd", "devfs"]' filters: - type: 'ObjectFilter' expression: 'options notcontains "nodev"' --- check_id: 'CIS-MOUNT-OPTION-NO-USER-SUID' hint: format: '{mount_point}: {device} mounted with {options}' method: - target: {os: ['Linux']} probe: - artifact: 'LinuxFstab' hint: problem: 'User mountable media allows suid' fix: 'Add "nosuid" option to appropriate partitions.' baseline: - type: 'ObjectFilter' expression: 'options contains "user"' filters: - type: 'ObjectFilter' expression: 'options notcontains "nosuid"' grr-3.1.0.2/grr/checks/mounts_test.py000066400000000000000000000051651273104013200174350ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- """Tests for service state checks.""" from grr.lib import flags from grr.lib import test_lib from grr.lib.checks import checks_test_lib from grr.parsers import config_file class LinuxMountsTests(checks_test_lib.HostCheckTest): @classmethod def setUpClass(cls): cls.LoadCheck("mounts.yaml") cls.parser = config_file.MtabParser() def testNoIssuesNoAnomalies(self): fstab = """ proc /proc proc defaults 0 0 /dev/sda1 / ext4 defaults,errors=remount-ro 0 1 /dev/sda4 /dev ext4 defaults 0 2 /dev/sdb1 /boot ext4 defaults 0 0 /dev/sda2 none swap sw 0 0 """ data = {"/etc/fstab": fstab} host_data = self.GenFileData("LinuxFstab", data, self.parser) check_id = "CIS-MOUNT-OPTION-NO-DEV" results = self.RunChecks(host_data) self.assertCheckUndetected(check_id, results) check_id = "CIS-MOUNT-OPTION-NO-USER-SUID" results = self.RunChecks(host_data) self.assertCheckUndetected(check_id, results) def testDeviceAllowed(self): fstab = """ /dev/sda1 / ext4 defaults,errors=remount-ro 0 1 /dev/sda2 /media ext4 defaults 0 1 /dev/sda3 /tmp/media ext3 noexec,ro 0 1 """ data = {"/etc/fstab": fstab} host_data = self.GenFileData("LinuxFstab", data, self.parser) check_id = "CIS-MOUNT-OPTION-NO-DEV" results = self.RunChecks(host_data) sym = "Found: Non-system mountpoints allow devices" # Mount options have variable ordering, so do a substring match. found = ["/media: /dev/sda2 mounted", "/tmp/media: /dev/sda3 mounted"] self.assertCheckDetectedAnom(check_id, results, sym, found) def testNoUserSUIDAllowed(self): fstab = """ /dev/sda1 / ext4 defaults,errors=remount-ro 0 1 /dev/sda2 /media ext2 user 0 1 /dev/sda3 /tmp/media xfs nosuid,user 0 1 """ data = {"/etc/fstab": fstab} host_data = self.GenFileData("LinuxFstab", data, self.parser) check_id = "CIS-MOUNT-OPTION-NO-USER-SUID" results = self.RunChecks(host_data) sym = "Found: User mountable media allows suid" found = ["/media: /dev/sda2 mounted with user:True"] self.assertCheckDetectedAnom(check_id, results, sym, found) def main(argv): test_lib.GrrTestProgram(argv=argv) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/checks/nfs.yaml000066400000000000000000000037761273104013200161570ustar00rootroot00000000000000check_id: 'CCE-4350-5' hint: fix: Limit read/write access to specific hosts. method: - target: {os: ['Linux']} probe: - artifact: 'NfsExportsFile' hint: problem: Wildcard clients with r/w NFS exports are too permissive. format: 'hosts:{value.host} options:{value.options}' fix: Limit r/w access to specific hosts. filters: - type: 'AttrFilter' expression: clients - type: 'ObjectFilter' expression: > value.options contains "rw" and value.host contains "*" - artifact: 'NfsExportsFile' hint: problem: Default r/w NFS exports are too permissive. format: '{share}: defaults:{defaults} hosts:{clients.host} options:{clients.options}' fix: Limit r/w access to specific hosts. filters: - type: 'ObjectFilter' expression: defaults contains "rw" --- check_id: 'CCE-4544-3' hint: format: '{share}: defaults:{defaults} hosts:{clients.host} options:{clients.options}' fix: If this system defaults to root_squash remove the no_root_squash entries, otherwise set the default to either root_squash or all_squash. problem: NFS defaults allow access to the share as root. method: - target: {os: ['Linux']} probe: - artifact: 'NfsExportsFile' filters: - type: 'ObjectFilter' expression: defaults contains "no_root_squash" --- check_id: 'CCE-5669-7' hint: format: '{share}: defaults:{defaults} options:{clients.options}' problem: NFS shares use no/weak authentication methods. fix: Use Kerberized NFS. method: - target: {os: ['Linux']} probe: - artifact: 'NfsExportsFile' filters: - type: 'ObjectFilter' expression: clients.options contains "sec=none" or clients.options contains "sec=sys" or defaults contains "sec=none" or defaults contains "sec=sys" grr-3.1.0.2/grr/checks/nfs_test.py000066400000000000000000000043211273104013200166670ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- """Tests for nfs export checks.""" from grr.lib import flags from grr.lib import test_lib from grr.lib.checks import checks_test_lib from grr.parsers import config_file class NfsExportsTests(checks_test_lib.HostCheckTest): results = None @classmethod def setUpClass(cls): cls.LoadCheck("nfs.yaml") def setUp(self, *args, **kwargs): super(NfsExportsTests, self).setUp(*args, **kwargs) if not NfsExportsTests.results: parser = config_file.NfsExportsParser() host_data = self.SetKnowledgeBase() with open(self.TestDataPath("exports")) as export_fd: parsed = list(parser.Parse(None, export_fd, None)) host_data["NfsExportsFile"] = self.SetArtifactData(parsed=parsed) NfsExportsTests.results = self.RunChecks(host_data) def testNfsExportsCheck(self): """Ensure NFS export checks work as expected.""" check_id = "CCE-4350-5" sym = "Found: Default r/w NFS exports are too permissive." found = [("/path/to/foo: defaults:rw,sync,no_root_squash " "hosts:host1,host2 options:ro,sec=sys"), ("/path/to/bar: defaults:rw hosts:*.example.org,192.168.1.0/24 " "options:all_squash,ro")] self.assertCheckDetectedAnom(check_id, self.results, sym, found) sym = "Found: Wildcard clients with r/w NFS exports are too permissive." found = ["hosts:*.example.org options:rw"] self.assertCheckDetectedAnom(check_id, self.results, sym, found) def testNfsRootSquashCheck(self): check_id = "CCE-4544-3" sym = "Found: NFS defaults allow access to the share as root." found = [("/path/to/foo: defaults:rw,sync,no_root_squash " "hosts:host1,host2 options:ro")] self.assertCheckDetectedAnom(check_id, self.results, sym, found) def testNfsAuthCheck(self): check_id = "CCE-5669-7" sym = "Found: NFS shares use no/weak authentication methods." found = ["/path/to/foo: defaults:rw,sync,no_root_squash options:ro,sec=sys", "/path/to/bad: defaults:sec=none options:rw"] self.assertCheckDetectedAnom(check_id, self.results, sym, found) def main(argv): test_lib.GrrTestProgram(argv=argv) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/checks/pam.yaml000066400000000000000000000132341273104013200161340ustar00rootroot00000000000000check_id: 'PAM-SSH-PAMACCESS' method: - target: {os: ['Linux']} probe: - artifact: 'PamConfig' hint: problem: 'PAM ssh service must require an account.' fix: 'Add "account required pam_access.so" to the PAM ssh config.' match: 'NONE' filters: - type: 'ForEach' expression: entries - type: 'ObjectFilter' expression: 'item.service is "ssh"' - type: 'ObjectFilter' expression: 'item.type is "account"' - type: 'ObjectFilter' expression: 'item.control is "required"' - type: 'ObjectFilter' expression: 'item.module_path contains "pam_access.so"' --- check_id: 'PAM-SSH-UNCONDITIONAL-PERMIT' method: - target: {os: ['Linux']} probe: - artifact: 'PamConfig' hint: problem: 'PAM ssh service has unconditional authentication.' fix: 'Remove "auth done pam_permit.so" from the PAM ssh config.' format: > In service '{item.service}': {item.type} {item.control} {item.module_path} {item.module_args} match: 'ANY' filters: - type: 'ForEach' expression: entries - type: 'ObjectFilter' expression: 'item.service is "ssh"' - type: 'ObjectFilter' expression: 'item.type is "auth"' - type: 'ObjectFilter' expression: 'item.control is "done"' - type: 'ObjectFilter' expression: 'item.module_path is "pam_permit.so"' --- check_id: 'PAM-SSH-DEFAULT-DENIES-AUTH' method: - target: {os: ['Linux']} probe: - artifact: 'PamConfig' hint: problem: 'PAM ssh service must default to denying auth.' fix: > 'Add "auth required pam_deny.so" or similar to the PAM ssh config.' match: 'NONE' baseline: - type: 'ForEach' expression: entries - type: 'ObjectFilter' expression: 'item.service is "ssh"' - type: 'ObjectFilter' expression: 'item.type is "auth"' filters: - type: 'ObjectFilter' expression: | ( item.control inset ['required', 'requisite'] AND item.module_path is 'pam_deny.so' ) OR ( item.control is '[success=ok new_authtok_reqd=ok default=die]' AND item.module_path is 'pam_unix.so' AND item.module_args is 'try_first_pass' ) --- check_id: 'PAM-SSH-NO-NULL-PASSWORDS' method: - target: {os: ['Linux']} probe: - artifact: 'PamConfig' hint: problem: 'PAM ssh service allows unix null password accounts to login.' fix: | 'Remove any password lines with "nullok" from the PAM ssh config.' format: > In service '{item.service}': {item.type} {item.control} {item.module_path} {item.module_args} match: 'ANY' baseline: - type: 'ForEach' expression: entries - type: 'ObjectFilter' expression: 'item.service is "ssh"' - type: 'ObjectFilter' expression: 'item.type is "password"' - type: 'ObjectFilter' expression: > item.control inset ["required", "requisite", "sufficient"] - type: 'ObjectFilter' expression: 'item.module_path contains "pam_unix.so"' filters: - type: 'ObjectFilter' expression: 'item.module_args contains "nullok"' --- check_id: 'PAM-SECURE-DEFAULTS' method: - target: {os: ['Linux']} probe: - artifact: 'PamConfig' hint: problem: "PAM 'other'(the default) config should only be used for denying/logging access." fix: "Remove any non pam_(deny|warn).so lines from the PAM 'other' config." format: > In service '{item.service}': {item.type} {item.control} {item.module_path} {item.module_args}" match: 'ANY' baseline: - type: 'ForEach' expression: entries - type: 'ObjectFilter' expression: 'item.service is "other"' filters: - type: 'ObjectFilter' expression: 'item.module_path notcontains "pam_deny.so"' - type: 'ObjectFilter' expression: 'item.module_path notcontains "pam_warn.so"' --- check_id: 'PAM-EXTERNAL-CONFIG' method: - target: {os: ['Linux']} probe: - artifact: 'PamConfig' hint: problem: 'PAM configuration refers to files outside of /etc/pam.d.' fix: 'Move all PAM configuration files to under /etc/pam.d' format: '{external_config}' match: 'ANY' filters: - type: 'ObjectFilter' expression: 'external_config isnot ""' --- check_id: 'PAM-CONFIG-FILES-WRITABLE-BY-NON-ROOT-USER' method: - target: {os:['Linux']} probe: - artifact: 'LinuxPamConfigs' hint: problem: > Files or folders in Pam configuration can be modified by non-privileged users. fix: > Make sure all files and folders used by Pam are owned by root and not modifable by any other users. format: > {pathspec.path} user: {st_uid}, group: {st_gid}, mode: {st_mode} mode: PARALLEL result_context: 'RAW' filters: - type: 'StatFilter' expression: 'uid:!0' - type: 'StatFilter' expression: 'gid:!0 mode:0020 mask:7020' - type: 'StatFilter' expression: 'mode:0002 mask:7002' grr-3.1.0.2/grr/checks/pam_test.py000066400000000000000000000175631273104013200166720ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- """Tests for the PAM config checks.""" from grr.lib import flags from grr.lib import test_lib from grr.lib.checks import checks_test_lib from grr.parsers import linux_pam_parser class PamConfigTests(checks_test_lib.HostCheckTest): @classmethod def setUpClass(cls): cls.LoadCheck("pam.yaml") cls.parser = linux_pam_parser.PAMParser() def testPamSshAccess(self): """Test we handle when PAM ssh service doesn't require an account.""" good1_contents = "account required pam_access.so\n" good2_contents = "account required /lib/security/pam_access.so foo\n" good3_contents = "account required /lib64/security/pam_access.so f b\n" bad_contents = "account required test.so\n" pam_good1 = {"/etc/pam.d/ssh": good1_contents} pam_good2 = {"/etc/pam.d/ssh": good2_contents} pam_good3 = {"/etc/pam.d/ssh": good3_contents} pam_bad = {"/etc/pam.d/ssh": bad_contents} sym = "Missing attribute: PAM ssh service must require an account." found = ["Expected state was not found"] results = self.RunChecks(self.GenFileData( "PamConfig", pam_bad, parser=self.parser)) self.assertCheckDetectedAnom("PAM-SSH-PAMACCESS", results, sym, found) # Now the successful cases. results = self.RunChecks(self.GenFileData( "PamConfig", pam_good1, parser=self.parser)) self.assertCheckUndetected("PAM-SSH-PAMACCESS", results) results = self.RunChecks(self.GenFileData( "PamConfig", pam_good2, parser=self.parser)) self.assertCheckUndetected("PAM-SSH-PAMACCESS", results) results = self.RunChecks(self.GenFileData( "PamConfig", pam_good3, parser=self.parser)) self.assertCheckUndetected("PAM-SSH-PAMACCESS", results) def testPamSshUnconditionalPermit(self): """Test we find when PAM ssh service allows an unconditional auth permit.""" good_contents = "auth done pam_deny.so\n" bad_contents = "auth done pam_permit.so\n" pam_good = {"/etc/pam.d/ssh": good_contents} pam_bad = {"/etc/pam.d/ssh": bad_contents} # Check the detection case. sym = "Found: PAM ssh service has unconditional authentication." found = ["In service 'ssh': auth done pam_permit.so"] results = self.RunChecks(self.GenFileData( "PamConfig", pam_bad, parser=self.parser)) self.assertCheckDetectedAnom("PAM-SSH-UNCONDITIONAL-PERMIT", results, sym, found) # Now the pass case. results = self.RunChecks(self.GenFileData( "PamConfig", pam_good, parser=self.parser)) self.assertCheckUndetected("PAM-SSH-UNCONDITIONAL-PERMIT", results) def testPamSshDefaultDeniesAuth(self): """Test we detect when PAM ssh service doesn't deny auth by default.""" good1_contents = "auth required pam_deny.so\n" good2_contents = ("auth [success=ok new_authtok_reqd=ok default=die] " "pam_unix.so try_first_pass\n") bad_contents = "auth required pam_foobar.so\n" pam_good1 = {"/etc/pam.d/ssh": good1_contents} pam_good2 = {"/etc/pam.d/ssh": good2_contents} pam_bad = {"/etc/pam.d/ssh": bad_contents} # Check the detection case. sym = "Missing attribute: PAM ssh service must default to denying auth." found = ["Expected state was not found"] results = self.RunChecks(self.GenFileData( "PamConfig", pam_bad, parser=self.parser)) self.assertCheckDetectedAnom("PAM-SSH-DEFAULT-DENIES-AUTH", results, sym, found) # Now the pass cases. results = self.RunChecks(self.GenFileData( "PamConfig", pam_good1, parser=self.parser)) self.assertCheckUndetected("PAM-SSH-DEFAULT-DENIES-AUTH", results) results = self.RunChecks(self.GenFileData( "PamConfig", pam_good2, parser=self.parser)) self.assertCheckUndetected("PAM-SSH-DEFAULT-DENIES-AUTH", results) def testPamSshNoNullPasswords(self): """Test we find when PAM ssh service allows an unconditional auth permit.""" good_contents = "password sufficient pam_unix.so\n" bad_contents = "password requisite /lib/security/pam_unix.so nullok\n" pam_good = {"/etc/pam.d/ssh": good_contents} pam_bad = {"/etc/pam.d/ssh": bad_contents} # Check the detection case. sym = "Found: PAM ssh service allows unix null password accounts to login." found = ["In service 'ssh': password requisite /lib/security/pam_unix.so " "nullok"] results = self.RunChecks(self.GenFileData( "PamConfig", pam_bad, parser=self.parser)) self.assertCheckDetectedAnom("PAM-SSH-NO-NULL-PASSWORDS", results, sym, found) # Now the pass case. results = self.RunChecks(self.GenFileData( "PamConfig", pam_good, parser=self.parser)) self.assertCheckUndetected("PAM-SSH-NO-NULL-PASSWORDS", results) def testPamSecureDefaults(self): """Test we detect when PAM ssh service doesn't deny auth by default.""" good_contents = """ auth required pam_deny.so foobar password sufficient /lib64/security/pam_warn.so session requisite /lib/security/pam_deny.so """ bad_contents = good_contents + """ auth required pam_permit.so password done pam_foobar.so test args """ pam_good = {"/etc/pam.d/other": good_contents} pam_bad = {"/etc/pam.d/other": bad_contents} # Check the detection case. sym = ("Found: PAM 'other'(the default) config should only be " "used for denying/logging access.") found = ["In service 'other': auth required pam_permit.so", "In service 'other': password done pam_foobar.so test args"] results = self.RunChecks(self.GenFileData( "PamConfig", pam_bad, parser=self.parser)) self.assertCheckDetectedAnom("PAM-SECURE-DEFAULTS", results, sym, found) # Now the pass cases. results = self.RunChecks(self.GenFileData( "PamConfig", pam_good, parser=self.parser)) self.assertCheckUndetected("PAM-SECURE-DEFAULTS", results) def testPamExternalConfigs(self): """Test we detect when PAM ssh service doesn't deny auth by default.""" pam_good = {"/etc/pam.d/ssh": "auth include other", "/etc/pam.d/other": ""} pam_bad = {"/etc/pam.d/ssh": "auth include non-existant", "/etc/pam.d/other": "password include /tmp/non-existant"} # Check the detection case. sym = "Found: PAM configuration refers to files outside of /etc/pam.d." found = ["/etc/pam.d/ssh -> /etc/pam.d/non-existant", "/etc/pam.d/other -> /tmp/non-existant"] results = self.RunChecks(self.GenFileData( "PamConfig", pam_bad, parser=self.parser)) self.assertCheckDetectedAnom("PAM-EXTERNAL-CONFIG", results, sym, found) # Now the pass cases. results = self.RunChecks(self.GenFileData( "PamConfig", pam_good, parser=self.parser)) self.assertCheckUndetected("PAM-SECURE-DEFAULTS", results) def testPamConfigPermissions(self): """Ensure check detects Pam config files that non-root users can edit.""" data = [self.CreateStat("/etc/pam.d/hit-123", 50, 0, 0o0100640), self.CreateStat("/etc/pam.d/hit-234", 0, 60, 0o0040777), self.CreateStat("/etc/pam.d/no-hit-123", 0, 6000, 0o0100440), self.CreateStat("/etc/pam.d/no-hit-234", 0, 0, 0o0100640), self.CreateStat("/etc/pam.d/hit-345", 70, 0, 0o0100660)] results = self.GenResults(["LinuxPamConfigs"], [data]) check_id = "PAM-CONFIG-FILES-WRITABLE-BY-NON-ROOT-USER" sym = ("Found: Files or folders in Pam configuration can be modified by " "non-privileged users.") found = ["/etc/pam.d/hit-123 user: 50, group: 0, mode: -rw-r-----", "/etc/pam.d/hit-234 user: 0, group: 60, mode: drwxrwxrwx", "/etc/pam.d/hit-345 user: 70, group: 0, mode: -rw-rw----",] self.assertCheckDetectedAnom(check_id, results, sym, found) def main(argv): test_lib.GrrTestProgram(argv=argv) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/checks/paths.yaml000066400000000000000000000032701273104013200164750ustar00rootroot00000000000000check_id: 'CIS-PATH-UNSAFE-VALUE' hint: problem: 'Paths include unsafe values.' format: '{config} sets {name} to {vals}' method: - target: {os: ['Linux']} probe: - artifact: 'AllShellConfigs' filters: - type: 'ObjectFilter' expression: 'vals contains "."' --- check_id: 'CIS-DOTFILE-FILE-PERMISSIONS' hint: problem: 'Dotfile permissions allow modification by others.' format: '{pathspec.path} user: {st_uid}, group: {st_gid}, mode: {st_mode}' fix: 'Remove group/other write permissions on these files.' method: - target: {os: ['Linux']} probe: - artifact: 'AllShellConfigs' result_context: 'RAW' mode: PARALLEL filters: # Note: Ensure a regular file to limit false positives on symlinks. - type: 'StatFilter' expression: 'mode:0002 mask:7002 file_type:REGULAR' - type: 'StatFilter' expression: 'mode:0020 mask:7020 file_type:REGULAR' --- check_id: 'CIS-DOTFILE-FILE-OWNERS' hint: problem: 'Dotfiles are not owned by the root user.' format: '{pathspec.path} user: {st_uid}, group: {st_gid}, mode: {st_mode}' fix: 'Change the ownership to root:root.' method: - target: {os: ['Linux']} probe: - artifact: 'GlobalShellConfigs' result_context: 'RAW' mode: PARALLEL filters: - type: 'StatFilter' expression: 'uid:!0' - type: 'StatFilter' expression: 'gid:!0' - artifact: 'RootUserShellConfigs' result_context: 'RAW' mode: PARALLEL filters: - type: 'StatFilter' expression: 'uid:!0' - type: 'StatFilter' expression: 'gid:!0' grr-3.1.0.2/grr/checks/paths_test.py000066400000000000000000000056651273104013200172340ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- """Tests for path misconfiguration checks.""" from grr.lib import flags from grr.lib import test_lib from grr.lib.checks import checks_test_lib from grr.parsers import linux_file_parser class PathsCheckTests(checks_test_lib.HostCheckTest): """Test the rsyslog checks.""" check_loaded = False parser = None def setUp(self, *args, **kwargs): super(PathsCheckTests, self).setUp(*args, **kwargs) if not self.check_loaded: self.check_loaded = self.LoadCheck("paths.yaml") if not self.parser: self.parser = linux_file_parser.PathParser() def testDetectCwdOk(self): chk_id = "CIS-PATH-UNSAFE-VALUE" paths = {"/root/.bashrc": "PATH=/foo/bar:$PATH", "/etc/csh.login": "set path=(/foo/bar)", "/home/user1": "export PYTHONPATH="} host_data = self.GenFileData("AllShellConfigs", paths, self.parser) results = self.RunChecks(host_data) self.assertCheckUndetected(chk_id, results) def testDetectIssues(self): paths = {"/root/.bashrc": "PATH=$PATH::other", "/etc/csh.login": "set path=(/foo/bar . /baz)", "/home/user1": "export PYTHONPATH=."} modes = {"/root/.bashrc": {"st_uid": 1, "st_gid": 0, "st_mode": 0o100666}, "/etc/csh.login": {"st_uid": 0, "st_gid": 1, "st_mode": 0o100644}, "/home/user1": {"st_uid": 1, "st_gid": 1, "st_mode": 0o100664}} host_data = self.GenFileData("AllShellConfigs", paths, self.parser, modes) host_data.update(self.GenFileData("GlobalShellConfigs", paths, self.parser, modes, include=["/etc/csh.login"])) host_data.update(self.GenFileData("RootUserShellConfigs", paths, self.parser, modes, include=["/root.bashrc"])) results = self.RunChecks(host_data) chk_id = "CIS-PATH-UNSAFE-VALUE" exp = "Found: Paths include unsafe values." found = ["/root/.bashrc sets PATH to $PATH,.,other", "/etc/csh.login sets PATH to /foo/bar,.,/baz", "/home/user1 sets PYTHONPATH to ."] self.assertCheckDetectedAnom(chk_id, results, exp, found) chk_id = "CIS-DOTFILE-FILE-PERMISSIONS" exp = "Found: Dotfile permissions allow modification by others." found = ["/root/.bashrc user: 1, group: 0, mode: -rw-rw-rw-", "/home/user1 user: 1, group: 1, mode: -rw-rw-r--"] self.assertCheckDetectedAnom(chk_id, results, exp, found) def main(argv): test_lib.GrrTestProgram(argv=argv) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/checks/pkg_sources.yaml000066400000000000000000000015721273104013200177050ustar00rootroot00000000000000check_id: 'CIS-PKG-SOURCE-UNSUPPORTED-TRANSPORT' method: - target: {os: ['Linux']} - probe: - artifact: 'APTSources' hint: problem: 'APT sources use unsupported transport.' fix: 'Make sure all APT sources use a trusted protocol.' format: '{filename}: transport: {uris.transport}' filters: - type: 'ObjectFilter' expression: > @uris( transport notequals 'https' ) - artifact: 'YumSources' hint: problem: 'Yum sources use unsupported transport.' fix: 'Make sure all Yum sources use a trusted protocol.' format: '{filename}: transport: {uris.transport}' filters: - type: 'ObjectFilter' expression: > @uris( transport notequals 'https' ) grr-3.1.0.2/grr/checks/pkg_sources_test.py000066400000000000000000000100211273104013200204170ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- """Tests for package source checks.""" from grr.lib import flags from grr.lib import test_lib from grr.lib.checks import checks_test_lib from grr.parsers import config_file class PkgSourceCheckTests(checks_test_lib.HostCheckTest): @classmethod def setUpClass(cls): cls.LoadCheck("pkg_sources.yaml") def testAPTDetectUnsupportedTransport(self): artifact = "APTSources" parser = config_file.APTPackageSourceParser() sources = { "/etc/apt/sources.list": r""" # APT sources.list providing the default Ubuntu packages # deb https://httpredir.debian.org/debian jessie-updates main deb https://security.debian.org/ wheezy/updates main # comment 2 """, "/etc/apt/sources.list.d/test.list": r""" deb file:/tmp/debs/ distro main deb [arch=amd64,blah=blah] [meh=meh] https://securitytestasdf.debian.org/ wheezy/updates main contrib non-free deb [arch=amd64] https://dl.google.com/linux/chrome/deb/ stable main """, "/etc/apt/sources.list.d/test2.list": r""" deb http://dl.google.com/linux/chrome/deb/ stable main """, "/etc/apt/sources.list.d/test3.list": r""" deb https://security.debian.org/ wheezy/updates main contrib non-free """, "/etc/apt/sources.list.d/file-test.list": r""" deb file:/mnt/debian/debs/ distro main """, "/etc/apt/sources.list.d/rfc822.list": r""" Type: deb deb-src URI: http://security.example.com https://dl.google.com Suite: testing Section: main contrib """ } chk_id = "CIS-PKG-SOURCE-UNSUPPORTED-TRANSPORT" sym = "Found: APT sources use unsupported transport." found = ["/etc/apt/sources.list.d/test.list: transport: file,https,https", "/etc/apt/sources.list.d/test2.list: transport: http", "/etc/apt/sources.list.d/file-test.list: transport: file", "/etc/apt/sources.list.d/rfc822.list: transport: http,https"] results = self.GenResults([artifact], [sources], [parser]) self.assertCheckDetectedAnom(chk_id, results, sym, found) def testYumDetectUnsupportedTransport(self): artifact = "YumSources" parser = config_file.YumPackageSourceParser() sources = { "/etc/yum.repos.d/noproblems.repo": r""" # comment 1 [centosdvdiso] name=CentOS DVD ISO baseurl=https://mirror1.centos.org/CentOS/6/os/i386/ enabled=1 gpgcheck=1 gpgkey=file:///mnt/RPM-GPG-KEY-CentOS-6 # comment2 [examplerepo] name=Example Repository baseurl = https://mirror3.centos.org/CentOS/6/os/i386/ enabled=1 gpgcheck=1 gpgkey=http://mirror.centos.org/CentOS/6/os/i386/RPM-GPG-KEY """, "/etc/yum.repos.d/test.repo": r""" [centosdvdiso] name=CentOS DVD ISO baseurl=file:///mnt/ https://mirror1.centos.org/CentOS/6/os/i386/ """, "/etc/yum.repos.d/test2.repo": r""" [centosdvdiso] name=CentOS DVD ISO baseurl=http://mirror1.centos.org/CentOS/6/os/i386/ """, "/etc/yum.repos.d/file-test.repo": r""" [centosdvdiso] name=CentOS DVD ISO baseurl=file:///mnt/ """ } chk_id = "CIS-PKG-SOURCE-UNSUPPORTED-TRANSPORT" sym = "Found: Yum sources use unsupported transport." found = ["/etc/yum.repos.d/test.repo: transport: file,https", "/etc/yum.repos.d/test2.repo: transport: http", "/etc/yum.repos.d/file-test.repo: transport: file"] results = self.GenResults([artifact], [sources], [parser]) self.assertCheckDetectedAnom(chk_id, results, sym, found) def main(argv): test_lib.GrrTestProgram(argv=argv) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/checks/rsyslog.yaml000066400000000000000000000024151273104013200170600ustar00rootroot00000000000000check_id: 'CIS-LOGGING-AUTH-REMOTE' hint: problem: 'No remote destination for auth logs.' fix: 'Modify log configurations to log authentication events, e.g. in rsyslog: auth.* @@logserver.example.org.:514;RSYSLOG_ForwardFormat' method: - target: {os: ['Linux']} probe: - artifact: 'LinuxRsyslogConfigs' match: NONE baseline: - type: 'ObjectFilter' expression: 'targets.facility inset ["auth","priv","authpriv","*"]' filters: - type: 'ObjectFilter' expression: 'targets.transport inset ["TCP", "UDP"]' --- check_id: 'CIS-LOGGING-FILE-PERMISSIONS' hint: problem: 'Log configurations can be modified by non-privileged users.' format: '{pathspec.path} user: {st_uid}, group: {st_gid}, mode: {st_mode}' fix: 'Remove writable permissions from these files.' method: - target: {os: ['Linux']} probe: - artifact: 'LinuxRsyslogConfigs' result_context: 'RAW' mode: PARALLEL baseline: - type: 'RDFFilter' expression: 'StatEntry' filters: - type: 'StatFilter' expression: 'uid:!0' - type: 'StatFilter' expression: 'gid:!0' - type: 'StatFilter' expression: 'mode:0002 mask:7002' grr-3.1.0.2/grr/checks/rsyslog_test.py000066400000000000000000000033751273104013200176130ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- """Tests for rsyslog state checks.""" from grr.lib import flags from grr.lib import test_lib from grr.lib.checks import checks_test_lib from grr.parsers import config_file class RsyslogCheckTests(checks_test_lib.HostCheckTest): """Test the rsyslog checks.""" @classmethod def setUpClass(cls): cls.LoadCheck("rsyslog.yaml") cls.parser = config_file.RsyslogParser() def testLoggingAuthRemoteOK(self): chk_id = "CIS-LOGGING-AUTH-REMOTE" test_data = { "/etc/rsyslog.conf": "*.* @@tcp.example.com.:514;RSYSLOG_ForwardFormat" } host_data = self.GenFileData("LinuxRsyslogConfigs", test_data, self.parser) results = self.RunChecks(host_data) self.assertCheckUndetected(chk_id, results) def testLoggingAuthRemoteFail(self): chk_id = "CIS-LOGGING-AUTH-REMOTE" test_data = {"/etc/rsyslog.conf": "*.* /var/log/messages"} host_data = self.GenFileData("LinuxRsyslogConfigs", test_data, self.parser) sym = "Missing attribute: No remote destination for auth logs." found = ["Expected state was not found"] results = self.RunChecks(host_data) self.assertCheckDetectedAnom(chk_id, results, sym, found) def testLoggingFilePermissions(self): chk_id = "CIS-LOGGING-FILE-PERMISSIONS" ro = self.CreateStat("/test/ro", 0, 0, 0o0100640) rw = self.CreateStat("/test/rw", 0, 0, 0o0100666) sym = "Found: Log configurations can be modified by non-privileged users." found = ["/test/rw user: 0, group: 0, mode: -rw-rw-rw-"] results = self.GenResults(["LinuxRsyslogConfigs"], [[ro, rw]]) self.assertCheckDetectedAnom(chk_id, results, sym, found) def main(argv): test_lib.GrrTestProgram(argv=argv) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/checks/services.yaml000066400000000000000000000122761273104013200172070ustar00rootroot00000000000000check_id: CIS-INETD-WITH-NO-SERVICES method: - target: {os:['Linux']} hint: problem: xinetd running with no xinetd-managed services. fix: | Disable xinetd as the service is not required. (ref) CIS Debian Benchmark v1.0-4.1 match: ALL probe: - artifact: 'LinuxServices' filters: - type: 'ObjectFilter' expression: name is "xinetd" and starts is 1 - artifact: 'LinuxServices' match: NONE filters: - type: 'ObjectFilter' expression: start_mode is "XINETD" --- check_id: CIS-SERVICE-LEGACY-SERVICE-ENABLED method: - target: {os:['Linux']} hint: problem: Legacy services are running. fix: | This system has legacy services enabled that are insecure and should not be running. In some cases, there may be more suitable replacements for these services. If a similar service is needed, use a secure replacement. Otherwise, services should simply be disabled. (ref) CIS Debian Benchmark v1.0-3.* and 1.0-4.* format: "{name} is started by {start_mode}" probe: - artifact: 'LinuxServices' baseline: - type: 'ObjectFilter' expression: starts is 1 mode: PARALLEL filters: - type: 'ObjectFilter' expression: name contains "chargen" - type: 'ObjectFilter' expression: name contains "discard" - type: 'ObjectFilter' expression: name contains "echo" - type: 'ObjectFilter' expression: name contains "fingerd" - type: 'ObjectFilter' expression: name contains "ftpd" - type: 'ObjectFilter' expression: name contains "telnet" - type: 'ObjectFilter' expression: name contains "whois" - type: 'ObjectFilter' expression: name contains "xfont-server" - type: 'ObjectFilter' expression: | name inset ["telnet", "ntalkd", "lpd", "lpdng", "rcp", "rlogin", "rsh", "ident","nis","ypserv"] --- check_id: CIS-SERVICE-SHOULD-NOT-RUN method: - target: {os:['Linux']} hint: problem: Remote administration services are running. fix: | Disable services that provide remote administration facilities. If services must run, ensure that access to them is: - restricted to trusted hosts and networks. - strongly authenticated. - only accessible over an encrypted connection. (ref) CIS Debian Benchmark v1.0-3.* and 1.0-4.* format: "{name} is started by {start_mode}" probe: - artifact: 'LinuxServices' baseline: - type: 'ObjectFilter' expression: starts is 1 filters: - type: 'ObjectFilter' expression: | name inset ["snmp","webmin"] --- check_id: CIS-SERVICE-SHOULD-RUN method: - target: {os:['Linux']} hint: problem: Recommended services are not started at boot time. fix: | Configure these services to start by default. (ref) CIS Debian Benchmark v1.0-2.4 and 1.0-3.2 probe: - artifact: 'LinuxServices' hint: problem: Sysstat is not started at boot time. match: NONE filters: - type: 'ObjectFilter' expression: 'name is "sysstat" and start is 1' - artifact: 'LinuxServices' hint: problem: A firewall is not started at boot time. match: NONE filters: - type: 'ObjectFilter' expression: 'name inset ["iptables", "ufw"] and start is 1' --- check_id: CIS-SERVICE-SHOULD-NOT-LISTEN method: - target: {os:['Linux']} hint: problem: Insecure services are accessible over the network. fix: | Either disable these services or configure them to only allow access via the loopback address. (ref) CIS Debian Benchmark v1.0-3.* and 1.0-4.* format: "{name} (pid {pid}) listens on {connections.local_address.ip}" match: ALL probe: - artifact: 'ListProcessesGrr' result_context: 'RAW' baseline: - type: 'ObjectFilter' expression: | @connections ( state is "LISTEN" AND ( ( family is "INET" and local_address.ip isnot "127.0.0.1" ) OR ( family is "INET6" and local_address.ip isnot "::1" ) ) ) filters: - type: 'ObjectFilter' expression: 'name inset ["x11","xorg"]' --- check_id: CIS-SERVICE-LOGSERVER-RUNNING method: - target: {os:['Linux']} hint: problem: Logging software is not running. fix: "Configure a logserver to run at boot time." match: 'NONE' probe: - artifact: 'ListProcessesGrr' result_context: 'RAW' filters: - type: 'ObjectFilter' expression: name inset ["rsyslogd", "syslog", "syslog-ng"] grr-3.1.0.2/grr/checks/services_test.py000066400000000000000000000224621273104013200177320ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- """Tests for service state checks.""" from grr.lib import flags from grr.lib import test_lib from grr.lib.checks import checks_test_lib from grr.lib.rdfvalues import client as rdf_client from grr.parsers import linux_service_parser from grr.parsers import linux_service_parser_test class XinetdServiceStateTests(checks_test_lib.HostCheckTest): @classmethod def setUpClass(cls): cls.LoadCheck("services.yaml") cls.parser = linux_service_parser.LinuxXinetdParser().ParseMultiple def RunXinetdCheck(self, chk_id, svc, disabled, sym, found, xinetd=False, should_detect=True): host_data = self.SetKnowledgeBase() cfgs = linux_service_parser_test.GenXinetd(svc, disabled) stats, files = linux_service_parser_test.GenTestData(cfgs, cfgs.values()) data = list(self.parser(stats, files, None)) # create entries on whether xinetd itself is setup to start or not if xinetd: cfgs = linux_service_parser_test.GenInit( "xinetd", "the extended Internet services daemon") stats, files = linux_service_parser_test.GenTestData(cfgs, cfgs.values()) lsb_parser = linux_service_parser.LinuxLSBInitParser() data.extend(list(lsb_parser.ParseMultiple(stats, files, None))) host_data["LinuxServices"] = self.SetArtifactData(parsed=data) results = self.RunChecks(host_data) if should_detect: self.assertCheckDetectedAnom(chk_id, results, sym, found) else: self.assertCheckUndetected(chk_id, results) def testEmptyXinetdCheck(self): chk_id = "CIS-INETD-WITH-NO-SERVICES" sym = "Missing attribute: xinetd running with no xinetd-managed services." found = ["Expected state was not found"] # xinetd is running and the only service is disabled - there should be a hit self.RunXinetdCheck(chk_id, "finger", "yes", sym, found, xinetd=True, should_detect=True) # xinetd is running and there is a service enabled - no hit self.RunXinetdCheck(chk_id, "finger", "no", sym, found, xinetd=True, should_detect=False) # xinetd not running and the only service is disabled - no hit self.RunXinetdCheck(chk_id, "finger", "yes", sym, found, xinetd=False, should_detect=False) # xinetd not running and there is a service enabled - no hit self.RunXinetdCheck(chk_id, "finger", "no", sym, found, xinetd=False, should_detect=False) def testLegacyXinetdServicesCheck(self): chk_id = "CIS-SERVICE-LEGACY-SERVICE-ENABLED" sym = "Found: Legacy services are running." found = ["telnet is started by XINETD"] self.RunXinetdCheck(chk_id, "telnet", "no", sym, found) self.RunXinetdCheck(chk_id, "telnet", "yes", sym, found, should_detect=False) def testUnwantedServicesCheck(self): chk_id = "CIS-SERVICE-SHOULD-NOT-RUN" sym = "Found: Remote administration services are running." found = ["webmin is started by XINETD"] self.RunXinetdCheck(chk_id, "webmin", "no", sym, found) self.RunXinetdCheck(chk_id, "webmin", "yes", sym, found, should_detect=False) class SysVInitStateTests(checks_test_lib.HostCheckTest): results = None @classmethod def setUpClass(cls): cls.LoadCheck("services.yaml") cls.parser = linux_service_parser.LinuxSysVInitParser().ParseMultiple def setUp(self, *args, **kwargs): super(SysVInitStateTests, self).setUp(*args, **kwargs) self.RunSysVChecks() def RunSysVChecks(self): host_data = self.SetKnowledgeBase() links = ["/etc/rc2.d/S50xinetd", "/etc/rc2.d/S60wu-ftpd", "/etc/rc2.d/S10ufw"] stats, files = linux_service_parser_test.GenTestData(links, [""] * len(links), st_mode=41471) parsed = list(self.parser(stats, files, None)) host_data["LinuxServices"] = self.SetArtifactData(parsed=parsed) self.results = self.RunChecks(host_data) def testEmptyXinetdCheck(self): chk_id = "CIS-INETD-WITH-NO-SERVICES" sym = "Missing attribute: xinetd running with no xinetd-managed services." self.assertCheckDetectedAnom(chk_id, self.results, sym) def testLegacyServicesCheck(self): chk_id = "CIS-SERVICE-LEGACY-SERVICE-ENABLED" sym = "Found: Legacy services are running." found = ["wu-ftpd is started by INIT"] self.assertCheckDetectedAnom(chk_id, self.results, sym, found) def testRequiredServicesNotRunningCheck(self): chk_id = "CIS-SERVICE-SHOULD-RUN" sym = "Missing attribute: Sysstat is not started at boot time." self.assertCheckDetectedAnom(chk_id, self.results, sym) class ListeningServiceTests(checks_test_lib.HostCheckTest): @classmethod def setUpClass(cls): cls.LoadCheck("services.yaml") def GenHostData(self): # Create some host_data.. host_data = self.SetKnowledgeBase() loop4 = self.AddListener("127.0.0.1", 6000) loop6 = self.AddListener("::1", 6000, "INET6") ext4 = self.AddListener("10.1.1.1", 6000) ext6 = self.AddListener("fc00::1", 6000, "INET6") x11 = rdf_client.Process(name="x11", pid=1233, connections=[loop4, loop6]) xorg = rdf_client.Process(name="xorg", pid=1234, connections=[loop4, loop6, ext4, ext6]) sshd = rdf_client.Process(name="sshd", pid=1235, connections=[loop4, loop6, ext4, ext6]) # Note: ListProcessesGrr is a flow artifact, hence it needs to be of # raw context. host_data["ListProcessesGrr"] = self.SetArtifactData(raw=[x11, xorg, sshd]) return host_data def testFindListeningServicesCheck(self): chk_id = "CIS-SERVICE-SHOULD-NOT-LISTEN" sym = "Found: Insecure services are accessible over the network." found = ["xorg (pid 1234) listens on 127.0.0.1,::1,10.1.1.1,fc00::1"] host_data = self.GenHostData() results = self.RunChecks(host_data) self.assertCheckDetectedAnom(chk_id, results, sym, found) def testFindNoRunningLogserver(self): chk_id = "CIS-SERVICE-LOGSERVER-RUNNING" sym = "Missing attribute: Logging software is not running." context = "RAW" found = ["Expected state was not found"] host_data = self.GenHostData() # Try it without rsyslog. results = self.RunChecks(host_data) self.assertCheckDetectedAnom(chk_id, results, sym, found) # Now rsyslog is running. logs = rdf_client.Process(name="rsyslogd", pid=1236) host_data["ListProcessesGrr"][context].append(logs) results = self.RunChecks(host_data) self.assertCheckUndetected(chk_id, results) # Check with some problematic real-world data. host_data = self.GenHostData() # Reset the host_data. # Added a non-logger process. We expect to raise an anom. proc1 = rdf_client.Process(name="python", pid=10554, ppid=1, exe="/usr/bin/python", cmdline=["/usr/bin/python", "-E", "/usr/sbin/foo_agent", "/etc/foo/conf.d/rsyslogd.conf", "/etc/foo/foobar.conf"]) host_data["ListProcessesGrr"][context].append(proc1) results = self.RunChecks(host_data) self.assertCheckDetectedAnom(chk_id, results, sym, found) # Now added a logging service proc. We expect no anom. this time. proc2 = rdf_client.Process(name="rsyslogd", pid=10200, ppid=1, exe="/sbin/rsyslogd", cmdline=["/sbin/rsyslogd", "-i", "/var/run/rsyslogd.pid", "-m", "0"]) host_data["ListProcessesGrr"][context].append(proc2) results = self.RunChecks(host_data) self.assertCheckUndetected(chk_id, results) # Add yet another non-logger process. We should still raise no anom. proc3 = rdf_client.Process(name="foobar", pid=31337, ppid=1, exe="/usr/local/bin/foobar", cmdline=["/usr/local/bin/foobar", "--test", "args"]) host_data["ListProcessesGrr"][context].append(proc3) results = self.RunChecks(host_data) self.assertCheckUndetected(chk_id, results) def main(argv): test_lib.GrrTestProgram(argv=argv) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/checks/sshd.yaml000066400000000000000000000066511273104013200163250ustar00rootroot00000000000000check_id: 'CIS-SSH-PROTOCOL' method: - target: {os: ['Linux', 'Darwin']} probe: - artifact: 'SshdConfigFile' hint: problem: 'Sshd configuration supports protocol 1.' format: 'Protocol = {config.protocol}' filters: - type: 'ObjectFilter' expression: 'config.protocol contains 1' --- check_id: 'CIS-SSH-PERMIT-ROOT-LOGIN' method: - target: {os: ['Linux', 'Darwin']} probe: - artifact: 'SshdConfigFile' hint: problem: 'Sshd configuration permits direct root login.' format: 'PermitRootLogin = {config.permitrootlogin}' filters: - type: 'ObjectFilter' expression: 'config.permitrootlogin isnot "no"' --- check_id: 'CIS-SSH-IGNORE-RHOSTS' method: - target: {os: ['Linux', 'Darwin']} probe: - artifact: 'SshdConfigFile' hint: problem: 'Sshd configuration allows rhosts based login.' format: 'IgnoreRhosts = {config.ignorerhosts}' filters: - type: 'ObjectFilter' expression: 'config.ignorerhosts is 0' --- check_id: 'CIS-SSH-HOST-BASED-AUTH' method: - target: {os: ['Linux', 'Darwin']} probe: - artifact: 'SshdConfigFile' hint: problem: 'Sshd configuration allows host based authentication.' format: 'HostBasedAuthentication = {config.hostbasedauthentication}' filters: - type: 'ObjectFilter' expression: 'config.hostbasedauthentication is 1' --- check_id: 'CIS-SSH-RHOSTS-RSA-AUTH' method: - target: {os: ['Linux', 'Darwin']} probe: - artifact: 'SshdConfigFile' hint: problem: 'Sshd configuration allows RSA host based authentication.' format: 'RhostsRSAAuthentication = {config.rhostsrsaauthentication}' filters: - type: 'ObjectFilter' expression: 'config.rhostsrsaauthentication is 1' --- check_id: 'CIS-SSH-PERMIT-EMPTY-PASSWORDS' method: - target: {os: ['Linux', 'Darwin']} probe: - artifact: 'SshdConfigFile' hint: problem: 'Sshd configuration allows accounts with empty passwords to log in.' format: 'PermitEmptyPasswords = {config.permitemptypasswords}' filters: - type: 'ObjectFilter' expression: 'config.permitemptypasswords is 1' --- check_id: 'SSH-AUTHORIZED-KEYS' method: - target: {os: ['Linux', 'Darwin']} probe: - artifact: 'SshdConfigFile' hint: problem: 'Sshd configuration sets an authorized key command.' format: 'AuthorizedKeysCommand = {config.authorizedkeyscommand}' filters: - type: 'ObjectFilter' expression: > config contains "authorizedkeyscommand" and config.authorizedkeyscommand isnot "none" - artifact: 'SshdConfigFile' hint: problem: 'Sshd configuration sets an authorized key file.' format: 'AuthorizedKeysFile = {item}' filters: # AuthorizedKeysFile may contain a list of values. We iterate # through it to detect anything different from 'none'. 'value' is # implicitly generated by AttrFilter, 'item' is implicitly # generated by ForEach. - type: 'AttrFilter' expression: config.authorizedkeysfile - type: 'ForEach' expression: value - type: 'ObjectFilter' expression: item isnot 'none' grr-3.1.0.2/grr/checks/sshd_test.py000066400000000000000000000066511273104013200170520ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- """Tests for SSHd state checks.""" from grr.lib import flags from grr.lib import test_lib from grr.lib.checks import checks_test_lib from grr.parsers import config_file class SshdCheckTests(checks_test_lib.HostCheckTest): """Test the sshd checks.""" @classmethod def setUpClass(cls): cls.LoadCheck("sshd.yaml") cls.parser = config_file.SshdConfigParser() def testProtocolFail(self): chk_id = "CIS-SSH-PROTOCOL" test_data = {"/etc/ssh/sshd_config": "# Comment line\nProtocol 2,1"} host_data = self.GenFileData("SshdConfigFile", test_data, self.parser) results = self.RunChecks(host_data) sym = "Found: Sshd configuration supports protocol 1." found = ["Protocol = 2,1"] self.assertCheckDetectedAnom(chk_id, results, sym, found) def testPermitRootLoginFail(self): chk_id = "CIS-SSH-PERMIT-ROOT-LOGIN" test_data = {"/etc/ssh/sshd_config": "PermitRootLogin without-password"} host_data = self.GenFileData("SshdConfigFile", test_data, self.parser) results = self.RunChecks(host_data) sym = "Found: Sshd configuration permits direct root login." found = ["PermitRootLogin = without-password"] self.assertCheckDetectedAnom(chk_id, results, sym, found) def testPermitRootLoginSucceed(self): chk_id = "CIS-SSH-PERMIT-ROOT-LOGIN" test_data = {"/etc/ssh/sshd_config": "PermitRootLogin no"} host_data = self.GenFileData("SshdConfigFile", test_data, self.parser) results = self.RunChecks(host_data) self.assertCheckUndetected(chk_id, results) def testAuthorizedKeysCommandSucceed(self): chk_id = "SSH-AUTHORIZED-KEYS" test_data = {"/etc/ssh/sshd_config": ""} host_data = self.GenFileData("SshdConfigFile", test_data, self.parser) results = self.RunChecks(host_data) self.assertCheckUndetected(chk_id, results) test_data = {"/etc/ssh/sshd_config": "AuthorizedKeysCommand none"} host_data = self.GenFileData("SshdConfigFile", test_data, self.parser) results = self.RunChecks(host_data) self.assertCheckUndetected(chk_id, results) def testAuthorizedKeysCommandFail(self): chk_id = "SSH-AUTHORIZED-KEYS" test_data = {"/etc/ssh/sshd_config": "AuthorizedKeysCommand \"/bin/pubkey-helper -s %u\""} host_data = self.GenFileData("SshdConfigFile", test_data, self.parser) results = self.RunChecks(host_data) sym = "Found: Sshd configuration sets an authorized key command." found = ["AuthorizedKeysCommand = \"/bin/pubkey-helper -s %u\""] self.assertCheckDetectedAnom(chk_id, results, sym, found) def testAuthorizedKeysFileSucceed(self): chk_id = "SSH-AUTHORIZED-KEYS" test_data = {"/etc/ssh/sshd_config": "AuthorizedKeysFile none"} host_data = self.GenFileData("SshdConfigFile", test_data, self.parser) results = self.RunChecks(host_data) self.assertCheckUndetected(chk_id, results) def testAuthorizedKeysFileFail(self): chk_id = "SSH-AUTHORIZED-KEYS" test_data = {"/etc/ssh/sshd_config": "AuthorizedKeysFile none /etc/ssh_keys" } host_data = self.GenFileData("SshdConfigFile", test_data, self.parser) results = self.RunChecks(host_data) sym = "Found: Sshd configuration sets an authorized key file." found = ["AuthorizedKeysFile = /etc/ssh_keys"] self.assertCheckDetectedAnom(chk_id, results, sym, found) def main(argv): test_lib.GrrTestProgram(argv=argv) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/checks/stat.yaml000066400000000000000000000171221273104013200163320ustar00rootroot00000000000000check_id: 'CIS-ROOT-PATH-HAS-FILES-WRITABLE-BY-NON-ROOT' method: - target: {os:['Linux']} probe: - artifact: 'RootEnvPath' hint: problem: > Files in default $PATH of root can be modified by non-privileged users. fix: > Make sure all files in $PATH of root are owned by root and not modifiable by any other users. format: > {pathspec.path} user: {st_uid}, group: {st_gid}, mode: {st_mode} mode: PARALLEL result_context: 'RAW' filters: # Anything not owned by root (0). and that is a file or a symlink. - type: 'StatFilter' expression: 'uid:!0 file_type:REGULAR' - type: 'StatFilter' expression: 'uid:!0 file_type:SYMLINK' # Anything not owned by group root, and group writable, and a file. - type: 'StatFilter' expression: 'gid:!0 mode:0020 mask:7020 file_type:REGULAR' # Anything world writable, and a file. - type: 'StatFilter' expression: 'mode:0002 mask:7002 file_type:REGULAR' --- check_id: 'CIS-ROOT-PATH-HAS-FOLDERS-WRITABLE-BY-NON-ROOT' method: - target: {os:['Linux']} probe: - artifact: 'RootEnvPathDirs' hint: problem: > Folders that comprise the default $PATH of root can be modified by non-privileged users. fix: > Make sure all folders that comprise the $PATH of root are owned by root and not modifiable by any other users. format: > {pathspec.path} user: {st_uid}, group: {st_gid}, mode: {st_mode} mode: PARALLEL result_context: 'RAW' filters: # Anything not owned by root (0). - type: 'StatFilter' expression: 'uid:!0' # Anything not owned by group root (0). - type: 'StatFilter' expression: 'gid:!0' # Anything that is world writable, and either a file or directory. - type: 'StatFilter' expression: 'mode:0002 mask:7002 file_type:DIRECTORY' - type: 'StatFilter' expression: 'mode:0002 mask:7002 file_type:REGULAR' --- check_id: 'CIS-HOME-DIRS-WRITABLE-BY-NON-OWNERS' method: - target: {os:['Linux']} probe: - artifact: 'UserHomeDirs' hint: problem: > User home directory can be written to by group or others. fix: > Remove write permissions from group and others: chmod go-w format: > {pathspec.path} user: {st_uid}, group: {st_gid}, mode: {st_mode} mode: PARALLEL result_context: 'RAW' filters: # Ensure it's a directory. This avoids a false positive on symlinks. - type: 'StatFilter' expression: 'mode:0020 mask:0020 file_type:DIRECTORY' - type: 'StatFilter' expression: 'mode:0002 mask:0002 file_type:DIRECTORY' --- check_id: 'CIS-USER-DOT-FILES-DIRS-WORLD-WRITABLE' method: - target: {os:['Linux']} probe: - artifact: 'UserDotFiles' hint: problem: > Dot files or folders in user home directory are world writable. fix: 'Please remove write permission from others: chmod o-w.' format: > {pathspec.path} user: {st_uid}, group: {st_gid}, mode: {st_mode} mode: PARALLEL result_context: 'RAW' filters: # We want every file type _except_ SYMLINK. Symlinks are 'lrwxrwxrwx'. - type: 'StatFilter' expression: 'mode:0002 mask:0002 file_type:REGULAR' - type: 'StatFilter' expression: 'mode:0002 mask:0002 file_type:DIRECTORY' - type: 'StatFilter' expression: 'mode:0002 mask:0002 file_type:BLOCK' - type: 'StatFilter' expression: 'mode:0002 mask:0002 file_type:FIFO' - type: 'StatFilter' expression: 'mode:0002 mask:0002 file_type:SOCKET' - type: 'StatFilter' expression: 'mode:0002 mask:0002 file_type:CHARACTER' --- check_id: 'CIS-DOT-NETRC-FILE-EXISTS' method: - target: {os:['Linux']} probe: - artifact: 'UserDotFiles' hint: problem: > The .netrc file exists in a user's home directory. fix: Please remove the .netrc file - they contain passwords in plain text. format: > {pathspec.path} user: {st_uid}, group: {st_gid}, mode: {st_mode} result_context: 'RAW' filters: - type: 'StatFilter' expression: 'file_re:"\.netrc"' --- # make sure none of the log files in /var/log are world writable check_id: 'CIS-LOG-FILES-PERMISSIONS-WORLD-WRITABLE' method: - target: {os:['Linux']} probe: - artifact: 'LinuxLogFiles' hint: problem: 'Log files are world writable.' fix: 'Remove write permissions from others: chmod o-w' format: > {pathspec.path} user: {st_uid}, group: {st_gid}, mode: {st_mode} mode: PARALLEL result_context: 'RAW' filters: # We want every file type _except_ SYMLINK. Symlinks are 'lrwxrwxrwx'. - type: 'StatFilter' expression: 'mode:0002 mask:0002 file_type:REGULAR' - type: 'StatFilter' expression: 'mode:0002 mask:0002 file_type:DIRECTORY' - type: 'StatFilter' expression: 'mode:0002 mask:0002 file_type:BLOCK' - type: 'StatFilter' expression: 'mode:0002 mask:0002 file_type:FIFO' - type: 'StatFilter' expression: 'mode:0002 mask:0002 file_type:SOCKET' - type: 'StatFilter' expression: 'mode:0002 mask:0002 file_type:CHARACTER' --- # Next two checks deals with vital system log files whose owner and group # we know has to be uid=0 and gid=(0 or 4). Since /var/log/ can have many # log files with different owners/groups, this check prevents throwing up # unnecessary red flags for non-vital log files. check_id: 'CIS-LOG-FILES-PERMISSIONS-WRONG-OWNER' method: - target: {os:['Linux']} probe: - artifact: 'LinuxLogFiles' hint: problem: 'Vital system log files have wrong owner.' fix: 'Make sure the file is owned by root.' format: > {pathspec.path} user: {st_uid}, group: {st_gid}, mode: {st_mode} result_context: 'RAW' filters: - type: 'StatFilter' expression: > path_re:"/var/log/(syslog|auth\.log|daemon\.log|debug|dmesg|udev|dpkg\.log|boot\.log|cron\.log|apport\.log|kern\.log|mail\.(info|log|warn)|messages|user\.log)(.[0-9]+(\.gz)?)?" uid:!0 --- check_id: 'CIS-LOG-FILES-PERMISSIONS-WRONG-GROUP' method: - target: {os:['Linux']} probe: - artifact: 'LinuxLogFiles' hint: problem: 'Vital system log files have wrong group.' fix: 'Make sure the file group is set as root or adm.' format: > {pathspec.path} user: {st_uid}, group: {st_gid}, mode: {st_mode} result_context: 'RAW' filters: - type: 'StatFilter' expression: > path_re:"/var/log/(syslog|auth\.log|daemon\.log|debug|dmesg|udev|dpkg\.log|boot\.log|cron\.log|apport\.log|kern\.log|mail\.(info|log|warn)|messages|user\.log)(.[0-9]+(\.gz)?)?" gid:!0 - type: 'StatFilter' expression: > path_re:"/var/log/(syslog|auth\.log|daemon\.log|debug|dmesg|udev|dpkg\.log|boot\.log|cron\.log|apport\.log|kern\.log|mail\.(info|log|warn)|messages|user\.log)(.[0-9]+(\.gz)?)?" gid:!4 grr-3.1.0.2/grr/checks/stat_test.py000066400000000000000000000162451273104013200170640ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- """Tests for stat checks.""" from grr.lib import flags from grr.lib import test_lib from grr.lib.checks import checks_test_lib class StatOnlyTests(checks_test_lib.HostCheckTest): @classmethod def setUpClass(cls): cls.LoadCheck("stat.yaml") def testRootPATHCheck(self): """Ensure root $PATH check detects files that non-root users can edit.""" data = [self.CreateStat("/usr/local/bin/hit-123", 50, 0, 0o0100640), self.CreateStat("/usr/local/bin/no-hit-123", 0, 6000, 0o0100440), self.CreateStat("/usr/local/bin/no-hit-234", 0, 0, 0o0100640), self.CreateStat("/usr/local/bin/hit-345", 70, 0, 0o0100660), self.CreateStat("/bin/hit-symlink-567", 70, 0, 0o0120777), self.CreateStat("/bin/no-hit-symlink-456", 0, 0, 0o0120777)] results = self.GenResults(["RootEnvPath"], [data]) check_id = "CIS-ROOT-PATH-HAS-FILES-WRITABLE-BY-NON-ROOT" sym = ("Found: Files in default $PATH of root can be modified " "by non-privileged users.") found = ["/usr/local/bin/hit-123 user: 50, group: 0, mode: -rw-r-----", "/usr/local/bin/hit-345 user: 70, group: 0, mode: -rw-rw----", "/bin/hit-symlink-567 user: 70, group: 0, mode: lrwxrwxrwx"] self.assertCheckDetectedAnom(check_id, results, sym, found) def testRootPATHDirCheck(self): """Ensure root $PATH directory entries are editable only by root.""" data = [ # Bad cases: # Non-root group ownership & permissions. self.CreateStat("/usr/local/bin", 0, 60, 0o0040775), # File & Non-root owner. self.CreateStat("/bin", 70, 0, 0o0100660), # A non-root symlink. self.CreateStat("/usr/local/sbin", 1, 0, 0o0120777), # File not owned by root but has no write permissions. self.CreateStat("/sbin", 1, 0, 0o0100400), # Fully root owned dir, but world writable. self.CreateStat("/usr", 0, 0, 0o0040666), # Safe cases: self.CreateStat("/usr/local", 0, 0, 0o0040755), # Root owned directory. self.CreateStat("/usr/bin", 0, 0, 0o0120777), # Root owned symlink. self.CreateStat("/usr/sbin", 0, 0, 0o0100775) ] # Root owned file. results = self.GenResults(["RootEnvPathDirs"], [data]) check_id = "CIS-ROOT-PATH-HAS-FOLDERS-WRITABLE-BY-NON-ROOT" sym = ("Found: Folders that comprise the default $PATH of root can be " "modified by non-privileged users.") found = ["/usr/local/bin user: 0, group: 60, mode: drwxrwxr-x", "/bin user: 70, group: 0, mode: -rw-rw----", "/usr/local/sbin user: 1, group: 0, mode: lrwxrwxrwx", "/sbin user: 1, group: 0, mode: -r--------", "/usr user: 0, group: 0, mode: drw-rw-rw-"] self.assertCheckDetectedAnom(check_id, results, sym, found) def testUserHomeDirCheck(self): """Ensure user home dir check detect folders modifiable by non-owners.""" data = [self.CreateStat("/root", 0, 0, 0o0040750), self.CreateStat("/home/non-matching-user1", 1000, 600, 0o0040700), self.CreateStat("/home/user2", 200, 60, 0o0040770), self.CreateStat("/home/user3", 300, 70, 0o0040777), self.CreateStat("/home/user4", 400, 70, 0o0040760), self.CreateStat("/home/non-matching-user2", 500, 80, 0o0040755), self.CreateStat("/home/non-matching-user3", 2000, 800, 0o0040750), self.CreateStat("/home/non-matching-user4", 6000, 600, 0o0040751), self.CreateStat("/home/user8", 700, 70, 0o0040752)] results = self.GenResults(["UserHomeDirs"], [data]) check_id = "CIS-HOME-DIRS-WRITABLE-BY-NON-OWNERS" sym = ("Found: User home directory can be written to by " "group or others.") found = ["/home/user2 user: 200, group: 60, mode: drwxrwx---", "/home/user3 user: 300, group: 70, mode: drwxrwxrwx", "/home/user4 user: 400, group: 70, mode: drwxrw----", "/home/user8 user: 700, group: 70, mode: drwxr-x-w-",] self.assertCheckDetectedAnom(check_id, results, sym, found) def testUserDotFilesCheck(self): """Ensure user dot files check detects files that are world writable.""" data = [self.CreateStat("/root/.bash_history", 0, 0, 0o0100755), self.CreateStat("/root/.bash_logout", 0, 0, 0o0100775), self.CreateStat("/root/.bashrc", 0, 0, 0o0100772), # match self.CreateStat("/root/.gitconfig", 0, 0, 0o0100773), # match self.CreateStat("/home/user/.mozilla", 100, 70, 0o0100755), self.CreateStat("/home/user/.vim", 100, 70, 0o0040777), # match self.CreateStat("/home/user/.netrc", 100, 70, 0o0100664)] results = self.GenResults(["UserDotFiles"], [data]) check_id = "CIS-USER-DOT-FILES-DIRS-WORLD-WRITABLE" sym = ("Found: Dot files or folders in user home directory are world " "writable.") found = ["/root/.bashrc user: 0, group: 0, mode: -rwxrwx-w-", "/root/.gitconfig user: 0, group: 0, mode: -rwxrwx-wx", "/home/user/.vim user: 100, group: 70, mode: drwxrwxrwx",] self.assertCheckDetectedAnom(check_id, results, sym, found) check_id = "CIS-DOT-NETRC-FILE-EXISTS" sym = "Found: The .netrc file exists in a user's home directory." found = ["/home/user/.netrc user: 100, group: 70, mode: -rw-rw-r--"] self.assertCheckDetectedAnom(check_id, results, sym, found) def testLogFilesCheck(self): """Ensure log files check detects files modifiable by non-root.""" data = [self.CreateStat("/var/log/syslog", 0, 0, 0o0100666), self.CreateStat("/var/log/auth.log.1", 0, 4, 0o0100774), self.CreateStat("/var/log/debug.1.gz", 10, 0, 0o0100774), self.CreateStat("/var/log/mail.log", 0, 2, 0o0100770), self.CreateStat("/var/log/user.log.1.gz", 0, 4, 0o0100642), self.CreateStat("/var/log/puppet/mail.log", 30, 70, 0o0100777), self.CreateStat("/var/log/dpkg.log", 200, 70, 0o0100664)] results = self.GenResults(["LinuxLogFiles"], [data]) check_id = "CIS-LOG-FILES-PERMISSIONS-WRONG-OWNER" sym = "Found: Vital system log files have wrong owner." found = ["/var/log/debug.1.gz user: 10, group: 0, mode: -rwxrwxr--", "/var/log/dpkg.log user: 200, group: 70, mode: -rw-rw-r--"] self.assertCheckDetectedAnom(check_id, results, sym, found) check_id = "CIS-LOG-FILES-PERMISSIONS-WRONG-GROUP" sym = "Found: Vital system log files have wrong group." found = ["/var/log/mail.log user: 0, group: 2, mode: -rwxrwx---", "/var/log/dpkg.log user: 200, group: 70, mode: -rw-rw-r--"] self.assertCheckDetectedAnom(check_id, results, sym, found) check_id = "CIS-LOG-FILES-PERMISSIONS-WORLD-WRITABLE" sym = "Found: Log files are world writable." found = ["/var/log/syslog user: 0, group: 0, mode: -rw-rw-rw-", "/var/log/puppet/mail.log user: 30, group: 70, mode: -rwxrwxrwx", "/var/log/user.log.1.gz user: 0, group: 4, mode: -rw-r---w-"] self.assertCheckDetectedAnom(check_id, results, sym, found) def main(argv): test_lib.GrrTestProgram(argv=argv) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/checks/sysctl.yaml000066400000000000000000000136531273104013200167050ustar00rootroot00000000000000check_id: CIS-NET-ICMP-BROADCAST method: - target: {os:['Linux']} hint: problem: System responds to ICMP echo broadcasts. probe: - artifact: 'LinuxProcSysHardeningSettings' hint: fix: | Prevent the host from responding to broadcast ICMP packets. - add "net.ipv4.icmp_echo_ignore_broadcasts = 1" to sysctl.conf - sysctl -w net.ipv4.icmp_echo_ignore_broadcasts 1 (ref) CIS Debian Benchmark v1.0-5.1 format: "{key}: {value}" filters: - type: 'ItemFilter' expression: net_ipv4_icmp_echo_ignore_broadcasts is "0" --- check_id: CIS-NET-SEND-REDIRECT method: - target: {os:['Linux']} hint: problem: System allows sending redirects. probe: - artifact: 'LinuxProcSysHardeningSettings' hint: fix: | Disable sending redirects. - sysctl -w net.ipv4.conf.all.send_redirects 0 - add "net.ipv4.conf.all.send_redirects = 0" to sysctl.conf (ref) CIS Debian Benchmark v1.0-5.2 format: "{key}: {value}" filters: - type: 'ItemFilter' expression: net_ipv4_conf_all_send_redirects is "1" --- check_id: CIS-NET-RP-FILTER method: - target: {os:['Linux']} hint: problem: System does not perform path filtering. probe: - artifact: 'LinuxProcSysHardeningSettings' hint: fix: | Enable reverse path filtering unless the host is a multihomed router. - sysctl -w net.ipv4.conf.default.rp_filter 1 - add "net.ipv4.conf.default.rp_filter = 1" to sysctl.conf (ref) CIS Debian Benchmark v1.0-5.1 format: "{key}: {value}" filters: - type: 'ItemFilter' expression: net_ipv4_conf_default_rp_filter isnot "1" --- check_id: CIS-NET-FORWARD-IP method: - target: {os:['Linux']} hint: problem: IP forwarding is enabled. probe: - artifact: 'LinuxProcSysHardeningSettings' mode: 'PARALLEL' hint: fix: | Disable IP forwarding if the host is not used as a gateway or firewall - sysctl -w net.ipv4.conf.all.forwarding 0 - sysctl -w net.ipv4.conf.default.forwarding 0 - sysctl -w net.ipv4.ip_forward 0 - sysctl -w net.ipv4.conf.all.mc_forwarding 0 - add "net.ipv4.conf.all.forwarding = 0" to sysctl.conf - add "net.ipv4.conf.default.forwarding = " to sysctl.conf - add "net.ipv4.ip_forward = 0" to sysctl.conf - add "net.ipv4.conf.all.mc_forwarding = 0" to sysctl.conf (ref) CIS Debian Benchmark v1.0-5.2 format: "{key}: {value}" filters: - type: 'ItemFilter' expression: net_ipv4_conf_all_forwarding is "1" - type: 'ItemFilter' expression: net_ipv4_conf_default_forwarding is "1" - type: 'ItemFilter' expression: net_ipv4_ip_forward is "1" - type: 'ItemFilter' expression: net_ipv4_conf_all_mc_forwarding is "1" --- check_id: CIS-NET-SYNCOOKIES method: - target: {os:['Linux']} hint: problem: TCP SYN cookies are not enabled. probe: - artifact: 'LinuxProcSysHardeningSettings' hint: fix: | Enable TCP SYN cookies - sysctl -w net.ipv4.tcp_syncookies 1 - add "net.ipv4.tcp_syncookies = 1" to sysctl.conf (ref) CIS Debian Benchmark v1.0-5.1 format: "{key}: {value}" filters: - type: 'ItemFilter' expression: net_ipv4_tcp_syncookies is "0" --- check_id: CIS-NET-REDIRECT method: - target: {os:['Linux']} hint: problem: System accepts routing redirects. probe: - artifact: 'LinuxProcSysHardeningSettings' mode: 'PARALLEL' hint: fix: | Disable accepting redirects under any circumstances. - sysctl -w net.ipv4.conf.all.secure_redirects 0 - sysctl -w net.ipv4.conf.all.accept_redirects 0 - sysctl -w net.ipv6.conf.all.accept_redirects 0 - add "net.ipv4.conf.all.secure_redirects = 0" to sysctl.conf - add "net.ipv4.conf.all.accept_redirects = 0" to sysctl.conf - add "net.ipv6.conf.all.accept_redirects = 0" to sysctl.conf (ref) CIS Debian Benchmark v1.0-5.1 format: "{key}: {value}" filters: - type: 'ItemFilter' expression: net_ipv4_conf_default_secure_redirects is "1" - type: 'ItemFilter' expression: net_ipv4_conf_all_accept_redirects is "1" - type: 'ItemFilter' expression: net_ipv6_conf_all_accept_redirects is "1" --- check_id: CIS-NET-LOGMART method: - target: {os:['Linux']} hint: problem: System does not log martian addresses. probe: - artifact: 'LinuxProcSysHardeningSettings' hint: fix: | Enable martian logging. - sysctl -w net.ipv4.conf.all.log_martians 1 - add "net.ipv4.conf.all.log_martians = 1" to sysctl.conf (ref) CIS Debian Benchmark v1.0-13.9 format: "{key}: {value}" filters: - type: 'ItemFilter' expression: net_ipv4_conf_all_log_martians is "0" --- check_id: CIS-NET-SRCRT-ACCEPT method: - target: {os:['Linux']} hint: problem: System accepts source routing instructions. probe: - artifact: 'LinuxProcSysHardeningSettings' hint: fix: | Disable source routing from any device. - sysctl -w net.ipv4.conf.all.accept_source_route 0 - add "net.ipv4.conf.all.accept_source_route = 0" to sysctl.conf (ref) CIS Debian Benchmark v1.0-5.1 format: "{key}: {value}" filters: - type: 'ItemFilter' expression: net_ipv4_conf_all_accept_source_route is "1" grr-3.1.0.2/grr/checks/sysctl_test.py000066400000000000000000000027321273104013200174260ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- """Tests for sysctl checks.""" from grr.lib import flags from grr.lib import test_lib from grr.lib.checks import checks_test_lib from grr.parsers import linux_sysctl_parser class SysctlTests(checks_test_lib.HostCheckTest): @classmethod def setUpClass(cls): cls.LoadCheck("sysctl.yaml") cls.parser = linux_sysctl_parser.ProcSysParser() def testRPFilter(self): """Ensure rp_filter is set to Strict mode. rp_filter may be set to three values: 0 - Disabled 1 - Strict Reverse Path 2 - Loose Reverse Path See https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt """ chk_id = "CIS-NET-RP-FILTER" test_data = {"/proc/sys/net/ipv4/conf/default/rp_filter": "2"} host_data = self.GenFileData("LinuxProcSysHardeningSettings", test_data, self.parser) results = self.RunChecks(host_data) sym = "Found: System does not perform path filtering." found = ["net_ipv4_conf_default_rp_filter: 2"] self.assertCheckDetectedAnom(chk_id, results, sym, found) test_data = {"/proc/sys/net/ipv4/conf/default/rp_filter": "1"} host_data = self.GenFileData("LinuxProcSysHardeningSettings", test_data, self.parser) results = self.RunChecks(host_data) self.assertCheckUndetected(chk_id, results) def main(argv): test_lib.GrrTestProgram(argv=argv) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/checks/tests.py000066400000000000000000000012601273104013200162030ustar00rootroot00000000000000#!/usr/bin/env python """GRR check tests. This module loads and registers tests of check configurations. """ # These need to register plugins so, # pylint: disable=unused-import,g-import-not-at-top from grr.checks import cron_test from grr.checks import format_test from grr.checks import mounts_test from grr.checks import nfs_test from grr.checks import pam_test from grr.checks import paths_test from grr.checks import pkg_sources_test from grr.checks import rsyslog_test from grr.checks import services_test from grr.checks import sshd_test from grr.checks import stat_test from grr.checks import sysctl_test from grr.checks import time_test from grr.checks import unix_login_test grr-3.1.0.2/grr/checks/time.yaml000066400000000000000000000037401273104013200163160ustar00rootroot00000000000000check_id: 'TIME-SYNC-BOOT' method: - target: {os: ['Linux']} probe: - artifact: 'LinuxServices' hint: problem: 'No time synchronization service is started at boot time.' fix: 'Ensure a time synchronization service is started at boot.' match: 'NONE' filters: - type: 'ObjectFilter' expression: 'name inset ["ntp", "ntpd"] and starts is 1' --- check_id: 'TIME-SYNC-RUNNING' method: - target: {os: ['Linux']} probe: - artifact: 'ListProcessesGrr' hint: problem: 'A time synchronization service is not running.' fix: 'Start a time synchronization service.' match: 'NONE' result_context: 'RAW' filters: - type: 'ObjectFilter' expression: 'name is "ntpd"' --- check_id: 'TIME-NTP-NO-OPEN-QUERIES' method: - target: {os: ['Linux']} probe: - artifact: 'NtpConfFile' hint: problem: 'ntpd.conf is configured or defaults to open queries. Can allow DDoS. This configuration is an on-going recommendation following the Ntp December 2014 Vulnerability notice. (http://support.ntp.org/bin/view/Main/SecurityNotice)' fix: 'Ensure "restrict default noquery" is added to ntp.conf.' result_context: 'PARSER' match: 'NONE' filters: - type: 'ObjectFilter' expression: 'restrict.address is "default" and restrict.options contains "noquery"' --- check_id: 'TIME-NTP-REFLECTION' method: - target: {os: ['Linux']} probe: - artifact: 'NtpConfFile' hint: format: 'ntpd.conf has monitor flag set to {config.monitor}.' problem: 'ntpd.conf is configured to allow monlist NTP reflection attacks.' fix: 'Ensure "monitor" is disabled in ntp.conf.' result_context: 'PARSER' filters: - type: 'ObjectFilter' expression: 'config.monitor is 1' grr-3.1.0.2/grr/checks/time_test.py000066400000000000000000000121521273104013200170400ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- """Tests for the time synchronization state checks.""" from grr.lib import flags from grr.lib import test_lib from grr.lib.checks import checks_test_lib from grr.parsers import config_file class TimeSyncTests(checks_test_lib.HostCheckTest): checks_loaded = False def setUp(self, *args, **kwargs): super(TimeSyncTests, self).setUp(*args, **kwargs) if not self.checks_loaded: self.LoadCheck("time.yaml") self.checks_loaded = True def testTimeSyncBoot(self): """Test we handle the cases for when a time service is started at boot.""" sym = ("Missing attribute: No time synchronization service is started " "at boot time.") found = ["Expected state was not found"] bad = [] good = ["/etc/rc2.d/S07ntp"] # The failure cases. I.e. No startup file for a time service. results = self.RunChecks(self.GenSysVInitData(bad)) self.assertCheckDetectedAnom("TIME-SYNC-BOOT", results, sym, found) # Now the successful cases. results = self.RunChecks(self.GenSysVInitData(good)) self.assertCheckUndetected("TIME-SYNC-BOOT", results) def testTimeSyncRunning(self): """Test we handle the cases for when a time service is running or not.""" found = ["Expected state was not found"] bad = [("foo", 233, ["/usr/local/foo", "-flags"])] good = [("ntpd", 42, ["/usr/sbin/ntpd", "-p", "/var/run/ntpd.pid", "-g", "-u", "117:125"])] # Check for when it is not running. self.assertCheckDetectedAnom( "TIME-SYNC-RUNNING", self.RunChecks(self.GenProcessData(bad)), "Missing attribute: A time synchronization service is not running.", found) # Now check for when it is. self.assertCheckUndetected("TIME-SYNC-RUNNING", self.RunChecks(self.GenProcessData(good))) def testNtpDoesntAllowOpenQueries(self): """Test for checking we don't allow queries by default.""" parser = config_file.NtpdParser() check_id = "TIME-NTP-NO-OPEN-QUERIES" artifact_id = "NtpConfFile" good_config = {"/etc/ntp.conf": """ restrict default nomodify noquery nopeer """} bad_config = {"/etc/ntp.conf": """ restrict default nomodify nopeer """} bad_default_config = {"/etc/ntp.conf": """ """} # A good config should pass. results = self.RunChecks(self.GenFileData("NtpConfFile", good_config, parser)) self.assertCheckUndetected(check_id, results) found = ["Expected state was not found"] sym = ("Missing attribute: ntpd.conf is configured or defaults to open " "queries. Can allow DDoS. This configuration is an on-going " "recommendation following the Ntp December 2014 Vulnerability " "notice. (http://support.ntp.org/bin/view/Main/SecurityNotice)") # A bad one should detect a problem. results = self.RunChecks(self.GenFileData(artifact_id, bad_config, parser)) self.assertCheckDetectedAnom(check_id, results, sym, found) # And as the default is to be queryable, check we detect an empty config. results = self.RunChecks(self.GenFileData(artifact_id, bad_default_config, parser)) self.assertCheckDetectedAnom(check_id, results, sym, found) def testNtpHasMonitorDisabled(self): """Test for checking that monitor is disabled.""" parser = config_file.NtpdParser() check_id = "TIME-NTP-REFLECTION" artifact_id = "NtpConfFile" good_config = {"/etc/ntp.conf": """ disable monitor """} good_tricky_config = {"/etc/ntp.conf": """ disable monitor auth enable kernel monitor auth disable kernel monitor """} bad_config = {"/etc/ntp.conf": """ enable monitor """} bad_default_config = {"/etc/ntp.conf": """ """} bad_tricky_config = {"/etc/ntp.conf": """ enable kernel monitor auth disable monitor auth enable kernel monitor """} found = ["ntpd.conf has monitor flag set to True."] sym = ("Found: ntpd.conf is configured to allow monlist NTP reflection " "attacks.") results = self.RunChecks(self.GenFileData(artifact_id, good_config, parser)) self.assertCheckUndetected(check_id, results) results = self.RunChecks(self.GenFileData(artifact_id, good_tricky_config, parser)) self.assertCheckUndetected(check_id, results) results = self.RunChecks(self.GenFileData(artifact_id, bad_config, parser)) self.assertCheckDetectedAnom(check_id, results, sym, found) results = self.RunChecks(self.GenFileData(artifact_id, bad_default_config, parser)) self.assertCheckDetectedAnom(check_id, results, sym, found) results = self.RunChecks(self.GenFileData(artifact_id, bad_tricky_config, parser)) self.assertCheckDetectedAnom(check_id, results, sym, found) def main(argv): test_lib.GrrTestProgram(argv=argv) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/checks/unix_login.yaml000066400000000000000000000103041273104013200175250ustar00rootroot00000000000000check_id: 'CIS-LOGIN-UNIX-HASH' method: - target: {os: ['Linux']} hint: format: 'password for {username} uses {pw_entry.hash_type}' fix: Use a secure hash method for passwords (SHA512 or SHA256). problem: Insecure password hash method. probe: - artifact: 'LoginPolicyConfiguration' baseline: - type: 'RDFFilter' expression: User filters: - type: 'ObjectFilter' expression: "pw_entry.hash_type inset ['DES','MD5','NTHASH','UNUSED']" --- check_id: 'CIS-LOGIN-UNIX-EMPTY' method: - target: {os: ['Linux']} hint: format: 'password for {username} in {pw_entry.store} is empty.' fix: Lock logins for accounts with empty passwords e.g. passwd -l problem: Empty password string. probe: - artifact: 'LoginPolicyConfiguration' baseline: - type: 'RDFFilter' expression: User filters: - type: 'ObjectFilter' expression: pw_entry.hash_type is "EMPTY" --- check_id: 'CIS-LOGIN-UNIX-SHADOW-MAXAGE' method: - target: {os: ['Linux']} hint: format: 'Weak password aging for {username} in {pw_entry.store}.' fix: Make sure password hashes are correct/valid and have a reasonable password age set in /etc/shadow. problem: Weak password aging settings in /etc/shadow. probe: - artifact: 'LoginPolicyConfiguration' baseline: - type: 'RDFFilter' expression: User - type: 'ObjectFilter' expression: "pw_entry.hash_type notinset ['DISABLED', 'UNSET']" filters: - type: 'ObjectFilter' expression: pw_entry.max_age > 365 --- check_id: 'CIS-LOGIN-UNIX-NIS-MARKER' match: ANY method: - target: {os: ['Linux']} hint: fix: Remove this account from the system. problem: NIS entries present. probe: - artifact: 'LoginPolicyConfiguration' hint: format: 'User account {username} is a NIS account marker.' baseline: - type: 'RDFFilter' expression: User filters: - type: 'ObjectFilter' expression: username regexp "\+\w*" - artifact: 'LoginPolicyConfiguration' hint: format: 'Group entry {name} is a NIS account marker.' baseline: - type: 'RDFFilter' expression: Group filters: - type: 'ObjectFilter' expression: name regexp "\+\w*" --- check_id: 'CIS-LOGIN-UNIX-WRITABLE' method: - target: {os: ['Linux']} hint: format: > {pathspec.path}: user: {st_uid}, group: {st_gid}, mode: {st_mode} fix: > Set permissions such that all files are owned by root and are not modifiable by other users. problem: 'System account files can be modified by non-privileged users.' probe: - artifact: 'LoginPolicyConfiguration' mode: 'PARALLEL' result_context: 'RAW' filters: - type: 'StatFilter' expression: 'uid:!0' - type: 'StatFilter' expression: 'gid:!0 mode:0020 mask:7020' - type: 'StatFilter' expression: 'mode:0002 mask:7002' --- check_id: 'CIS-LOGIN-UNIX-SHADOW-PERMS' method: - target: {os: ['Linux']} hint: format: > {pathspec.path}: user: {st_uid}, group: {st_gid}, mode: {st_mode} fix: > Set permissions such that shadow files are owned by and only readable by root. problem: 'Incorrect shadow file permissions.' probe: - artifact: 'LoginPolicyConfiguration' mode: 'PARALLEL' result_context: 'RAW' baseline: - type: 'StatFilter' expression: 'file_re:"shadow"' filters: - type: 'StatFilter' expression: 'gid:!0' - type: 'StatFilter' expression: 'mode:0044 mask:7044' --- check_id: 'CIS-LOGIN-UNIX-INCONSISTENCIES' method: - target: {os: ['Linux']} hint: format: '{symptom}' fix: 'Keep password and shadow files consistent for all system accounts.' problem: 'System account entries are anomalous.' probe: - artifact: 'LoginPolicyConfiguration' result_context: 'ANOMALY' grr-3.1.0.2/grr/checks/unix_login_test.py000066400000000000000000000104151273104013200202550ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- """Tests for service state checks.""" from grr.lib import flags from grr.lib import test_lib from grr.lib.checks import checks_test_lib from grr.parsers import linux_file_parser class LoginPolicyConfigurationTests(checks_test_lib.HostCheckTest): results = None @classmethod def setUpClass(cls): cls.LoadCheck("unix_login.yaml") def setUp(self, *args, **kwargs): super(LoginPolicyConfigurationTests, self).setUp(*args, **kwargs) if not LoginPolicyConfigurationTests.results: LoginPolicyConfigurationTests.results = self._GenResults() def _GenResults(self): parser = linux_file_parser.LinuxSystemPasswdParser() if self.results is None: host_data = self.SetKnowledgeBase() login = { "/etc/passwd": """ nopasswd:x:1000:1000::/home/nopasswd:/bin/bash md5:x:1001:1001::/home/md5:/bin/bash undying:x:1002:1002::/home/undying:/bin/bash disabled:x:1003:1003::/home/disabled:/bin/bash +nisuser:acr.7pt3dpA5s::::::/bin/zsh""", "/etc/shadow": """ nopasswd::16000:0:365:7::: md5:$1$rootrootrootrootrootro:16000:0:365:7::: undying:$6$saltsalt${0}:16000:0:99999:7::: disabled:!:16000:0:99999:7:::""".format("r" * 86), "/etc/group": """ nopasswd:x:1000:nopasswd +::: md5:x:1001:md5 undying:x:1002:undying disabled:x:1003:disabled""", "/etc/gshadow": """ nopasswd:::nopasswd md5:::md5 undying:::undying disabled:::disabled""" } modes = {"/etc/passwd": {"st_mode": 0o100666}, # Bad write perm. "/etc/group": {"st_uid": 1}, # Bad owner. "/etc/shadow": {"st_mode": 0o100444}, # Bad read perm. "/etc/gshadow": {"st_gid": 1, "st_mode": 0o100400}} # Bad group. host_data = self.GenFileData("LoginPolicyConfiguration", login, parser, modes) return self.RunChecks(host_data) def testPasswdHash(self): chk_id = "CIS-LOGIN-UNIX-HASH" sym = "Found: Insecure password hash method." found = ["password for +nisuser uses DES", "password for md5 uses MD5"] self.assertCheckDetectedAnom(chk_id, self.results, sym, found) def testEmptyPasswordCheck(self): chk_id = "CIS-LOGIN-UNIX-EMPTY" sym = "Found: Empty password string." found = ["password for nopasswd in SHADOW is empty."] self.assertCheckDetectedAnom(chk_id, self.results, sym, found) def testPasswdMaxageCheck(self): chk_id = "CIS-LOGIN-UNIX-SHADOW-MAXAGE" sym = "Found: Weak password aging settings in /etc/shadow." found = ["Weak password aging for undying in SHADOW."] self.assertCheckDetectedAnom(chk_id, self.results, sym, found) def testNisPasswordCheck(self): chk_id = "CIS-LOGIN-UNIX-NIS-MARKER" sym = "Found: NIS entries present." found = ["Group entry + is a NIS account marker.", "User account +nisuser is a NIS account marker."] self.assertCheckDetectedAnom(chk_id, self.results, sym, found) def testDetectWeakPermissions(self): chk_id = "CIS-LOGIN-UNIX-WRITABLE" sym = "Found: System account files can be modified by non-privileged users." found = ["/etc/group: user: 1, group: 0, mode: -rw-r--r--", "/etc/passwd: user: 0, group: 0, mode: -rw-rw-rw-"] self.assertCheckDetectedAnom(chk_id, self.results, sym, found) def testDetectShadowReadable(self): chk_id = "CIS-LOGIN-UNIX-SHADOW-PERMS" sym = "Found: Incorrect shadow file permissions." found = ["/etc/gshadow: user: 0, group: 1, mode: -r--------", "/etc/shadow: user: 0, group: 0, mode: -r--r--r--"] self.assertCheckDetectedAnom(chk_id, self.results, sym, found) def testReportDetectedAnomalies(self): chk_id = "CIS-LOGIN-UNIX-INCONSISTENCIES" sym = "Found: System account entries are anomalous." found = ["Mismatched group and gshadow files.", "Mismatched passwd and shadow files."] self.assertCheckDetectedAnom(chk_id, self.results, sym, found) def main(argv): test_lib.GrrTestProgram(argv=argv) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/client/000077500000000000000000000000001273104013200145065ustar00rootroot00000000000000grr-3.1.0.2/grr/client/__init__.py000066400000000000000000000000631273104013200166160ustar00rootroot00000000000000#!/usr/bin/env python """The GRR client agent.""" grr-3.1.0.2/grr/client/actions.py000066400000000000000000000411431273104013200165230ustar00rootroot00000000000000#!/usr/bin/env python """This file contains common grr jobs.""" import gc import logging import pdb import threading import time import traceback import psutil from grr.client import client_utils from grr.lib import config_lib from grr.lib import flags from grr.lib import rdfvalue from grr.lib import registry from grr.lib import utils from grr.lib.rdfvalues import flows as rdf_flows from grr.lib.rdfvalues import protodict as rdf_protodict # Our first response in the session is this: INITIAL_RESPONSE_ID = 1 class Error(Exception): pass class CPUExceededError(Error): pass class NetworkBytesExceededError(Error): """Exceeded the maximum number of bytes allowed to be sent for this action.""" class ThreadNotFoundError(Error): """A suspended thread was requested that doesn't exist on the client.""" class ActionPlugin(object): """Baseclass for plugins. An action is a plugin abstraction which receives an rdfvalue and sends another rdfvalue in response. The code is specified in the Run() method, while the data is specified in the in_rdfvalue and out_rdfvalues classes. Windows and OS X client actions cannot be imported on the linux server since they require OS-specific libraries. If you are adding a client action that doesn't have a linux implementation, you will need to register it in libs/server_stubs.py Windows and OS X implementations of client actions with the same name (e.g. EnumerateInterfaces) as linux actions must accept and return the same rdfvalue types as their linux counterparts. """ # The rdfvalue used to encode this message. in_rdfvalue = None # TODO(user): The RDFValue instance for the output protobufs. This is # required temporarily until the client sends RDFValue instances instead of # protobufs. out_rdfvalues = [None] # Authentication Required for this Action: _authentication_required = True __metaclass__ = registry.MetaclassRegistry priority = rdf_flows.GrrMessage.Priority.MEDIUM_PRIORITY require_fastpoll = True last_progress_time = 0 def __init__(self, grr_worker=None): """Initializes the action plugin. Args: grr_worker: The grr client worker object which may be used to e.g. send new actions on. """ self.grr_worker = grr_worker self.response_id = INITIAL_RESPONSE_ID self.cpu_used = None self.nanny_controller = None self.status = rdf_flows.GrrStatus( status=rdf_flows.GrrStatus.ReturnedStatus.OK) self._last_gc_run = rdfvalue.RDFDatetime().Now() self._gc_frequency = config_lib.CONFIG["Client.gc_frequency"] self.proc = psutil.Process() self.cpu_start = self.proc.cpu_times() self.cpu_limit = rdf_flows.GrrMessage().cpu_limit def Execute(self, message): """This function parses the RDFValue from the server. The Run method will be called with the specified RDFValue. Args: message: The GrrMessage that we are called to process. Returns: Upon return a callback will be called on the server to register the end of the function and pass back exceptions. Raises: RuntimeError: The arguments from the server do not match the expected rdf type. """ self.message = message if message: self.priority = message.priority self.require_fastpoll = message.require_fastpoll args = None try: if self.message.args_rdf_name: if not self.in_rdfvalue: raise RuntimeError("Did not expect arguments, got %s." % self.message.args_rdf_name) if self.in_rdfvalue.__name__ != self.message.args_rdf_name: raise RuntimeError("Unexpected arg type %s != %s." % (self.message.args_rdf_name, self.in_rdfvalue.__name__)) args = self.message.payload # Only allow authenticated messages in the client if self._authentication_required and ( self.message.auth_state != rdf_flows.GrrMessage.AuthorizationState.AUTHENTICATED): raise RuntimeError("Message for %s was not Authenticated." % self.message.name) self.cpu_start = self.proc.cpu_times() self.cpu_limit = self.message.cpu_limit self.network_bytes_limit = self.message.network_bytes_limit if getattr(flags.FLAGS, "debug_client_actions", False): pdb.set_trace() try: self.Run(args) # Ensure we always add CPU usage even if an exception occurred. finally: used = self.proc.cpu_times() self.cpu_used = (used.user - self.cpu_start.user, used.system - self.cpu_start.system) except NetworkBytesExceededError as e: self.SetStatus(rdf_flows.GrrStatus.ReturnedStatus.NETWORK_LIMIT_EXCEEDED, "%r: %s" % (e, e), traceback.format_exc()) # We want to report back all errors and map Python exceptions to # Grr Errors. except Exception as e: # pylint: disable=broad-except self.SetStatus(rdf_flows.GrrStatus.ReturnedStatus.GENERIC_ERROR, "%r: %s" % (e, e), traceback.format_exc()) if flags.FLAGS.debug: self.DisableNanny() pdb.post_mortem() if self.status.status != rdf_flows.GrrStatus.ReturnedStatus.OK: logging.info("Job Error (%s): %s", self.__class__.__name__, self.status.error_message) if self.status.backtrace: logging.debug(self.status.backtrace) if self.cpu_used: self.status.cpu_time_used.user_cpu_time = self.cpu_used[0] self.status.cpu_time_used.system_cpu_time = self.cpu_used[1] # This returns the error status of the Actions to the flow. self.SendReply(self.status, message_type=rdf_flows.GrrMessage.Type.STATUS) self._RunGC() def _RunGC(self): # After each action we can run the garbage collection to reduce our memory # footprint a bit. We don't do it too frequently though since this is # a bit expensive. now = rdfvalue.RDFDatetime().Now() if now - self._last_gc_run > self._gc_frequency: gc.collect() self._last_gc_run = now def ForceGC(self): self._last_gc_run = rdfvalue.RDFDatetime(0) self._RunGC() def Run(self, unused_args): """Main plugin entry point. This function will always be overridden by real plugins. Args: unused_args: An already initialised protobuf object. Raises: KeyError: if not implemented. """ raise KeyError("Action %s not available on this platform." % self.message.name) def SetStatus(self, status, message="", backtrace=None): """Set a status to report back to the server.""" self.status.status = status self.status.error_message = utils.SmartUnicode(message) if backtrace: self.status.backtrace = utils.SmartUnicode(backtrace) def SendReply(self, rdf_value=None, message_type=rdf_flows.GrrMessage.Type.MESSAGE, **kw): """Send response back to the server.""" if rdf_value is None: # The only client actions with multiple out_rdfvalues have them for # server-side checks that allow for backwards compatibility. In the future # if an action genuinely returns multiple rdfvalues it should pass them in # using the rdf_value keyword. rdf_value = self.out_rdfvalues[0](**kw) # pylint: disable=not-callable self.grr_worker.SendReply( rdf_value, # This is not strictly necessary but adds context # to this response. name=self.__class__.__name__, session_id=self.message.session_id, response_id=self.response_id, request_id=self.message.request_id, message_type=message_type, task_id=self.message.task_id, priority=self.priority, require_fastpoll=self.require_fastpoll) self.response_id += 1 def Progress(self): """Indicate progress of the client action. This function should be called periodically during client actions that do not finish instantly. It will notify the nanny that the action is not stuck and avoid the timeout and it will also check if the action has reached its cpu limit. Raises: CPUExceededError: CPU limit exceeded. """ now = time.time() if now - self.last_progress_time <= 2: return self.last_progress_time = now # Prevent the machine from sleeping while the action is running. client_utils.KeepAlive() if self.nanny_controller is None: self.nanny_controller = client_utils.NannyController() self.nanny_controller.Heartbeat() user_start, system_start = self.cpu_start user_end, system_end = self.proc.cpu_times() used_cpu = user_end - user_start + system_end - system_start if used_cpu > self.cpu_limit: self.grr_worker.SendClientAlert("Cpu limit exceeded.") raise CPUExceededError("Action exceeded cpu limit.") def SyncTransactionLog(self): """This flushes the transaction log. This function should be called by the client before performing potential dangerous actions so the server can get notified in case the whole machine crashes. """ if self.nanny_controller is None: self.nanny_controller = client_utils.NannyController() self.nanny_controller.SyncTransactionLog() def ChargeBytesToSession(self, length): self.grr_worker.ChargeBytesToSession(self.message.session_id, length, limit=self.network_bytes_limit) def DisableNanny(self): try: self.nanny_controller.nanny.Stop() except AttributeError: logging.info("Can't disable Nanny on this OS.") class IteratedAction(ActionPlugin): """An action which can restore its state from an iterator. Implement iterating actions by extending this class and overriding the Iterate() method. """ def Run(self, request): """Munge the iterator to the server and abstract it away.""" # Pass the client_state as a dict to the action. This is often more # efficient than manipulating a protobuf. client_state = request.iterator.client_state.ToDict() # Derived classes should implement this. self.Iterate(request, client_state) # Update the iterator client_state from the dict. request.iterator.client_state = rdf_protodict.Dict(client_state) # Return the iterator self.SendReply(request.iterator, message_type=rdf_flows.GrrMessage.Type.ITERATOR) def Iterate(self, request, client_state): """Actions should override this.""" class ClientActionWorker(threading.Thread): """A worker thread for the suspendable client action.""" daemon = True def __init__(self, action=None, *args, **kw): super(ClientActionWorker, self).__init__(*args, **kw) self.cond = threading.Condition(lock=threading.RLock()) self.id = None self.action_obj = action self.exception_status = None def Resume(self): with self.cond: self.cond.notify() self.cond.wait() def Suspend(self): with self.cond: self.cond.notify() self.cond.wait() def run(self): # Suspend right after starting. self.Suspend() try: # Do the actual work. self.action_obj.Iterate() except Exception: # pylint: disable=broad-except if flags.FLAGS.debug: pdb.post_mortem() # Record the exception status so the main thread can propagate it to the # server. self.exception_status = traceback.format_exc() raise finally: # Notify the action that we are about to exit. This always has to happen # or the main thread will stop. self.action_obj.Done() with self.cond: self.cond.notify() class SuspendableAction(ActionPlugin): """An action that can be suspended on the client. How suspended client actions work? The GRRClientWorker maintains a store of suspended client actions. A suspended client action is one where the thread of execution can be suspended by the client at any time, and control is passed back to the server flow. The server flow then can resume the client action. Since only a single thread can run on the client worker at the same time, the suspendable client action and the worker thread are exclusively blocked. 1) Initially the server issues a regular request to this suspendable action. 2) Since the Iterator field in the request is initially empty, the GRRClientWorker() will instantiate a new ActionPlugin() instance. 3) The SuspendableAction() instance is then added to the GRRClientWorker's suspended_actions store using a unique ID. The unique ID is also copied to the request's Iterator.client_state dict. 4) We then call the client action's Execute method. 5) The suspendable client action does all its work in a secondary thread, in order to allow it to be suspended arbitrarily. We therefore create a ClientActionWorker() thread, and pass control it - while the main thread is waiting for it. 6) The ClientActionWorker() thread calls back into the Iterate() method of the SuspendableAction() - this is where all the work is done. 7) When the client action wants to suspend it called its Suspend() method. This will block the ClientActionWorker() thread and release the main GRRClientWorker() thread. The request is then completed by sending the server an ITERATOR and a STATUS message. The corresponding thread is now allowed to process all replies so far. The SuspendableAction() is blocked until further notice. 8) The server processes the responses, and then sends a new request, containing the same Iterator object that the client gave it. The Iterator contains an opaque client_state dict. 9) The client finds the unique key in the Iterator.client_state dict, which allows it to retrieve the SuspendableAction() from the GRRClientWorker()'s suspended_actions store. We then call the Run method, which switched execution to the ClientActionWorker() thread. """ def __init__(self, *args, **kw): # We allow specifying the worker class. self.worker_cls = kw.pop("action_worker_cls", None) super(SuspendableAction, self).__init__(*args, **kw) self.exceptions = [] # A SuspendableAction does all its main work in a subthread controlled # through a condition variable. self.worker = None def Run(self, request): """Process a server request.""" # This method will be called multiple times for each new client request, # therefore we need to resent the response_id each time. self.response_id = INITIAL_RESPONSE_ID self.request = request # We need to start a new worker thread. if not self.worker: worker_cls = self.worker_cls or ClientActionWorker self.worker = worker_cls(action=self) # Grab the lock before the thread is started. self.worker.cond.acquire() self.worker.start() # The worker will be blocked trying to get the lock that we are already # holding it so we call Resume() and enter a state where the main thread # waits for the condition variable and, at the same time, releases the # lock. Next the worker will notify the condition variable and suspend # itself. This guarantees that we are now in a defined state where the # worker is suspended and waiting on the condition variable and the main # thread is running. After the next call to Resume() below, the worker # will wake up and actually begin running the client action. self.worker.Resume() # Store ourselves in the worker thread's suspended_actions store. self.grr_worker.suspended_actions[id(self)] = self # Mark our ID in the iterator's client_state area. The server will return # this (opaque) client_state to us on subsequent calls. The client worker # thread will be able to retrieve us in this case. self.request.iterator.suspended_action = id(self) # We stop running, and let the worker run instead. self.worker.Resume() # An exception occured in the worker thread and it was terminated. We # re-raise it here. if self.worker.exception_status: raise RuntimeError("Exception in child thread: %s" % (self.worker.exception_status)) # Return the iterator self.SendReply(self.request.iterator, message_type=rdf_flows.GrrMessage.Type.ITERATOR) def Done(self): # Let the server know we finished. self.request.iterator.state = self.request.iterator.State.FINISHED # Remove the action from the suspended_actions store. del self.grr_worker.suspended_actions[id(self)] def Suspend(self): self.worker.Suspend() def Iterate(self): """Actions should override this.""" grr-3.1.0.2/grr/client/client.py000066400000000000000000000035341273104013200163430ustar00rootroot00000000000000#!/usr/bin/env python """This is the GRR client.""" import pdb import logging # pylint: disable=unused-import from grr.client import client_plugins # pylint: enable=unused-import from grr.client import comms from grr.client import installer # pylint: disable=unused-import from grr.client import stdlib # pylint: enable=unused-import from grr.lib import config_lib from grr.lib import flags from grr.lib import startup flags.DEFINE_bool("install", False, "Specify this to install the client.") flags.DEFINE_bool("break_on_start", False, "If True break into a pdb shell immediately on startup. This" " can be used for debugging the client manually.") flags.DEFINE_bool("debug_client_actions", False, "If True break into a pdb shell before executing any client" " action.") def main(unused_args): # Allow per platform configuration. config_lib.CONFIG.AddContext( "Client Context", "Context applied when we run the client process.") startup.ClientInit() if flags.FLAGS.install: installer.RunInstaller() errors = config_lib.CONFIG.Validate(["Client", "CA", "Logging"]) if errors and errors.keys() != ["Client.private_key"]: raise config_lib.ConfigFormatError(errors) enrollment_necessary = not config_lib.CONFIG.Get("Client.private_key") # Instantiating the client will create a private_key so we need to use a flag. client = comms.GRRHTTPClient( ca_cert=config_lib.CONFIG["CA.certificate"], private_key=config_lib.CONFIG.Get("Client.private_key", default=None)) if enrollment_necessary: logging.info("No private key found, starting enrollment.") client.InitiateEnrolment() if flags.FLAGS.break_on_start: pdb.set_trace() else: client.Run() if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/client/client_actions/000077500000000000000000000000001273104013200175045ustar00rootroot00000000000000grr-3.1.0.2/grr/client/client_actions/__init__.py000066400000000000000000000020111273104013200216070ustar00rootroot00000000000000#!/usr/bin/env python """A module to load all client plugins.""" # pylint: disable=unused-import,g-bad-import-order import platform import logging # These imports populate the Action registry from grr.lib import rdfvalue from grr.lib import rdfvalues from grr.client import actions from grr.client.client_actions import admin from grr.client.client_actions import components from grr.client.client_actions import enrol from grr.client.client_actions import file_fingerprint from grr.client.client_actions import network from grr.client.client_actions import plist from grr.client.client_actions import searching from grr.client.client_actions import standard from grr.client.client_actions import tempfiles # pylint: disable=g-import-not-at-top # pylint: disable=g-wrong-blank-lines if platform.system() == "Linux": from grr.client.client_actions import linux elif platform.system() == "Windows": from grr.client.client_actions import windows elif platform.system() == "Darwin": from grr.client.client_actions import osx grr-3.1.0.2/grr/client/client_actions/action_test.py000066400000000000000000000346771273104013200224130ustar00rootroot00000000000000#!/usr/bin/env python # -*- mode: python; encoding: utf-8 -*- """Test client actions.""" import __builtin__ import collections import logging import os import platform import posix import stat import mock import psutil # Populate the action registry # pylint: disable=unused-import, g-bad-import-order from grr.client import client_plugins from grr.client import client_utils from grr.client.client_actions import standard # pylint: enable=unused-import, g-bad-import-order from grr.client import actions from grr.lib import flags from grr.lib import test_lib from grr.lib import utils from grr.lib import worker_mocks from grr.lib.rdfvalues import client as rdf_client from grr.lib.rdfvalues import flows as rdf_flows from grr.lib.rdfvalues import paths as rdf_paths # pylint: mode=test # pylint: disable=g-bad-name class MockWindowsProcess(object): """A mock windows process.""" pid = 10 def ppid(self): return 1 def name(self): return "cmd" def exe(self): return "cmd.exe" def username(self): return "test" def cmdline(self): return ["c:\\Windows\\cmd.exe", "/?"] def create_time(self): return 1217061982.375000 def status(self): return "running" def cwd(self): return "X:\\RECEP\xc3\x87\xc3\x95ES" def num_threads(self): return 1 def cpu_times(self): return (1.0, 1.0) def cpu_percent(self): return 10.0 def memory_info(self): meminfo = collections.namedtuple("Meminfo", ["rss", "vms"]) return meminfo(rss=100000, vms=150000) def memory_percent(self): return 10.0 def open_files(self): return [] def connections(self): return [] def nice(self): return 10 def as_dict(self, attrs=None): dic = {} if attrs is None: return dic for name in attrs: if hasattr(self, name): attr = getattr(self, name) if callable(attr): dic[name] = attr() else: dic[name] = attr else: dic[name] = None return dic class ProgressAction(actions.ActionPlugin): """A mock action which just calls Progress.""" in_rdfvalue = rdf_client.LogMessage out_rdfvalues = [rdf_client.LogMessage] time = 100 def Run(self, message): _ = message for _ in range(3): self.time += 5 with test_lib.FakeTime(self.time): self.Progress() def process_iter(): return iter([MockWindowsProcess()]) class ActionTest(test_lib.EmptyActionTest): """Test the client Actions.""" def testReadBuffer(self): """Test reading a buffer.""" path = os.path.join(self.base_path, "morenumbers.txt") p = rdf_paths.PathSpec(path=path, pathtype=rdf_paths.PathSpec.PathType.OS) result = self.RunAction("ReadBuffer", rdf_client.BufferReference(pathspec=p, offset=100, length=10))[0] self.assertEqual(result.offset, 100) self.assertEqual(result.length, 10) self.assertEqual(result.data, "7\n38\n39\n40") def testListDirectory(self): """Tests listing directories.""" p = rdf_paths.PathSpec(path=self.base_path, pathtype=0) results = self.RunAction("ListDirectory", rdf_client.ListDirRequest(pathspec=p)) # Find the number.txt file result = None for result in results: if os.path.basename(result.pathspec.path) == "morenumbers.txt": break self.assertTrue(result) self.assertEqual(result.__class__, rdf_client.StatEntry) self.assertEqual(result.pathspec.Basename(), "morenumbers.txt") self.assertEqual(result.st_size, 3893) self.assertTrue(stat.S_ISREG(result.st_mode)) def testIteratedListDirectory(self): """Tests iterated listing of directories.""" p = rdf_paths.PathSpec(path=self.base_path, pathtype=rdf_paths.PathSpec.PathType.OS) non_iterated_results = self.RunAction("ListDirectory", rdf_client.ListDirRequest(pathspec=p)) # Make sure we get some results. l = len(non_iterated_results) self.assertTrue(l > 0) iterated_results = [] request = rdf_client.ListDirRequest(pathspec=p) request.iterator.number = 2 while True: responses = self.RunAction("IteratedListDirectory", request) results = responses[:-1] if not results: break for result in results: iterated_results.append(result) for x, y in zip(non_iterated_results, iterated_results): # Reset the st_atime in the results to avoid potential flakiness. x.st_atime = y.st_atime = 0 self.assertRDFValuesEqual(x, y) def testSuspendableListDirectory(self): request = rdf_client.ListDirRequest() request.pathspec.path = self.base_path request.pathspec.pathtype = "OS" request.iterator.number = 2 results = [] grr_worker = worker_mocks.FakeClientWorker() while request.iterator.state != request.iterator.State.FINISHED: responses = self.RunAction("SuspendableListDirectory", request, grr_worker=grr_worker) results.extend(responses) for response in responses: if isinstance(response, rdf_client.Iterator): request.iterator = response filenames = [os.path.basename(r.pathspec.path) for r in results if isinstance(r, rdf_client.StatEntry)] self.assertItemsEqual(filenames, os.listdir(self.base_path)) iterators = [r for r in results if isinstance(r, rdf_client.Iterator)] # One for two files plus one extra with the FINISHED status. nr_files = len(os.listdir(self.base_path)) expected_iterators = (nr_files / 2) + 1 if nr_files % 2: expected_iterators += 1 self.assertEqual(len(iterators), expected_iterators) # Make sure the thread has been deleted. self.assertEqual(grr_worker.suspended_actions, {}) def testSuspendableActionException(self): class testActionWorker(actions.ClientActionWorker): def run(self): try: return super(testActionWorker, self).run() except Exception as e: # pylint: disable=broad-except logging.info("Expected exception: %s", e) class RaisingListDirectory(standard.SuspendableListDirectory): iterations = 3 def Suspend(self): RaisingListDirectory.iterations -= 1 if not RaisingListDirectory.iterations: raise IOError("Ran out of iterations.") return super(RaisingListDirectory, self).Suspend() p = rdf_paths.PathSpec(path=self.base_path, pathtype=rdf_paths.PathSpec.PathType.OS) request = rdf_client.ListDirRequest(pathspec=p) request.iterator.number = 2 results = [] grr_worker = worker_mocks.FakeClientWorker() while request.iterator.state != request.iterator.State.FINISHED: responses = self.ExecuteAction("RaisingListDirectory", request, grr_worker=grr_worker, action_worker_cls=testActionWorker) results.extend(responses) for response in responses: if isinstance(response, rdf_client.Iterator): request.iterator = response status = responses[-1] self.assertTrue(isinstance(status, rdf_flows.GrrStatus)) if status.status != rdf_flows.GrrStatus.ReturnedStatus.OK: break if len(results) > 100: self.fail("Endless loop detected.") self.assertIn("Ran out of iterations", status.error_message) self.assertEqual(grr_worker.suspended_actions, {}) def testEnumerateUsersLinux(self): """Enumerate users from the wtmp file.""" # Linux only if platform.system() != "Linux": return path = os.path.join(self.base_path, "VFSFixture/var/log/wtmp") old_open = __builtin__.open old_listdir = os.listdir # Mock the open call def MockedOpen(requested_path, mode="r"): # Any calls to open the wtmp get the mocked out version. if "wtmp" in requested_path: self.assertEqual(requested_path, "/var/log/wtmp") return old_open(path) # Everything else has to be opened normally. return old_open(requested_path, mode) __builtin__.open = MockedOpen os.listdir = lambda x: ["wtmp"] try: results = self.RunAction("EnumerateUsers") finally: # Restore the original methods. __builtin__.open = old_open os.listdir = old_listdir found = 0 for result in results: # This appears in ut_type RUN_LVL, not ut_type USER_PROCESS. self.assertNotEqual("runlevel", result.username) if result.username == "user1": found += 1 self.assertEqual(result.last_logon, 1296552099 * 1000000) elif result.username == "user2": found += 1 self.assertEqual(result.last_logon, 1296552102 * 1000000) elif result.username == "user3": found += 1 self.assertEqual(result.last_logon, 1296569997 * 1000000) self.assertEqual(found, 3) def testProcessListing(self): """Tests if listing processes works.""" old_process_iter = psutil.process_iter psutil.process_iter = process_iter try: results = self.RunAction("ListProcesses", None) self.assertEqual(len(results), 1) result = results[0] self.assertEqual(result.pid, 10) self.assertEqual(result.ppid, 1) self.assertEqual(result.name, "cmd") self.assertEqual(result.exe, "cmd.exe") self.assertEqual(result.cmdline, ["c:\\Windows\\cmd.exe", "/?"]) self.assertEqual(result.ctime, 1217061982375000) self.assertEqual(result.username, "test") self.assertEqual(result.status, "running") self.assertEqual(result.cwd, ur"X:\RECEPÇÕES") self.assertEqual(result.num_threads, 1) self.assertEqual(result.user_cpu_time, 1.0) self.assertEqual(result.system_cpu_time, 1.0) # This is disabled in the flow since it takes too long. # self.assertEqual(result.cpu_percent, 10.0) self.assertEqual(result.RSS_size, 100000) self.assertEqual(result.VMS_size, 150000) self.assertEqual(result.memory_percent, 10.0) self.assertEqual(result.nice, 10) finally: psutil.process_iter = old_process_iter def testCPULimit(self): received_messages = [] class MockWorker(object): def SendClientAlert(self, msg): received_messages.append(msg) class FakeProcess(object): times = [(1, 0), (2, 0), (3, 0), (10000, 0), (10001, 0)] def __init__(self, unused_pid=None): self.pcputimes = collections.namedtuple("pcputimes", ["user", "system"]) def cpu_times(self): return self.pcputimes(*self.times.pop(0)) results = [] def MockSendReply(unused_self, reply=None, **kwargs): results.append(reply or rdf_client.LogMessage(**kwargs)) message = rdf_flows.GrrMessage(name="ProgressAction", cpu_limit=3600) action_cls = actions.ActionPlugin.classes[message.name] with utils.MultiStubber( (psutil, "Process", FakeProcess), (action_cls, "SendReply", MockSendReply)): action_cls._authentication_required = False action = action_cls(grr_worker=MockWorker()) action.Execute(message) self.assertTrue("Action exceeded cpu limit." in results[0].error_message) self.assertTrue("CPUExceededError" in results[0].error_message) self.assertEqual(len(received_messages), 1) self.assertEqual(received_messages[0], "Cpu limit exceeded.") def testSendReplyMultipleOutputTypes(self): """Check we can SendReply with multiple out_rdfvalues.""" fake_worker = mock.MagicMock() actionplugin = actions.ActionPlugin(grr_worker=fake_worker) actionplugin.message = mock.MagicMock() actionplugin.out_rdfvalues = [rdf_client.BufferReference, rdf_client.Process] actionplugin.SendReply(data="blah") self.assertTrue(isinstance(fake_worker.SendReply.call_args[0][0], rdf_client.BufferReference)) with self.assertRaises(AttributeError): actionplugin.SendReply(badkeyword=10) def testStatFS(self): f_bsize = 4096 # Simulate pre-2.6 kernel f_frsize = 0 f_blocks = 9743394 f_bfree = 5690052 f_bavail = 5201809 f_files = 2441216 f_ffree = 2074221 f_favail = 2074221 f_flag = 4096 f_namemax = 255 def MockStatFS(unused_path): return posix.statvfs_result((f_bsize, f_frsize, f_blocks, f_bfree, f_bavail, f_files, f_ffree, f_favail, f_flag, f_namemax)) def MockIsMount(path): """Only return True for the root path.""" return path == "/" with utils.MultiStubber( (os, "statvfs", MockStatFS), (os.path, "ismount", MockIsMount)): # This test assumes "/" is the mount point for /usr/bin results = self.RunAction( "StatFS", rdf_client.StatFSRequest(path_list=["/usr/bin", "/"])) self.assertEqual(len(results), 2) # Both results should have mount_point as "/" self.assertEqual(results[0].unixvolume.mount_point, results[1].unixvolume.mount_point) result = results[0] self.assertEqual(result.bytes_per_sector, f_bsize) self.assertEqual(result.sectors_per_allocation_unit, 1) self.assertEqual(result.total_allocation_units, f_blocks) self.assertEqual(result.actual_available_allocation_units, f_bavail) self.assertAlmostEqual(result.FreeSpacePercent(), 53.388, delta=0.001) self.assertEqual(result.unixvolume.mount_point, "/") self.assertEqual(result.Name(), "/") # Test we get a result even if one path is bad results = self.RunAction( "StatFS", rdf_client.StatFSRequest(path_list=["/does/not/exist", "/"])) self.assertEqual(len(results), 1) self.assertEqual(result.Name(), "/") def testProgressThrottling(self): action = actions.ActionPlugin.classes["ProgressAction"]() with test_lib.Instrument(client_utils, "KeepAlive") as instrument: for time, expected_count in [(100, 1), (101, 1), (102, 1), (103, 2), (104, 2), (105, 2), (106, 3)]: with test_lib.FakeTime(time): action.Progress() self.assertEqual(instrument.call_count, expected_count) class ActionTestLoader(test_lib.GRRTestLoader): base_class = test_lib.EmptyActionTest def main(argv): test_lib.GrrTestProgram(argv=argv, testLoader=ActionTestLoader()) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/client/client_actions/admin.py000066400000000000000000000231141273104013200211470ustar00rootroot00000000000000#!/usr/bin/env python """Client actions related to administrating the client and its configuration.""" import os import socket import time import traceback import M2Crypto import pkg_resources import psutil import pytsk3 import logging from grr.client import actions from grr.lib import config_lib from grr.lib import queues from grr.lib import rdfvalue from grr.lib import stats from grr.lib import utils from grr.lib.rdfvalues import client as rdf_client from grr.lib.rdfvalues import flows as rdf_flows from grr.lib.rdfvalues import protodict as rdf_protodict class Echo(actions.ActionPlugin): """Returns a message to the server.""" in_rdfvalue = rdf_client.EchoRequest out_rdfvalues = [rdf_client.LogMessage] def Run(self, args): self.SendReply(args) class GetHostname(actions.ActionPlugin): """Retrieves the host name of the client.""" out_rdfvalues = [rdf_protodict.DataBlob] def Run(self, unused_args): self.SendReply(string=socket.gethostname()) class GetPlatformInfo(actions.ActionPlugin): """Retrieves platform information.""" out_rdfvalues = [rdf_client.Uname] def Run(self, unused_args): """Populate platform information into a Uname response.""" self.SendReply(rdf_client.Uname.FromCurrentSystem()) class Kill(actions.ActionPlugin): """A client action for terminating (killing) the client. Used for testing process respawn. """ out_rdfvalues = [rdf_flows.GrrMessage] def Run(self, unused_arg): """Run the kill.""" # Send a message back to the service to say that we are about to shutdown. reply = rdf_flows.GrrStatus(status=rdf_flows.GrrStatus.ReturnedStatus.OK) # Queue up the response message, jump the queue. self.SendReply(reply, message_type=rdf_flows.GrrMessage.Type.STATUS, priority=rdf_flows.GrrMessage.Priority.HIGH_PRIORITY + 1) # Give the http thread some time to send the reply. self.grr_worker.Sleep(10) # Die ourselves. logging.info("Dying on request.") os._exit(242) # pylint: disable=protected-access class Hang(actions.ActionPlugin): """A client action for simulating the client becoming unresponsive (hanging). Used for testing nanny terminating the client. """ in_rdfvalue = rdf_protodict.DataBlob def Run(self, arg): # Sleep a really long time. time.sleep(arg.integer or 6000) class BusyHang(actions.ActionPlugin): """A client action that burns cpu cycles. Used for testing cpu limits.""" in_rdfvalue = rdf_protodict.DataBlob def Run(self, arg): duration = 5 if arg and arg.integer: duration = arg.integer end = time.time() + duration while time.time() < end: pass class Bloat(actions.ActionPlugin): """A client action that uses lots of memory for testing.""" in_rdfvalue = rdf_protodict.DataBlob def Run(self, arg): iterations = arg.integer or 1024 # Gives 1 gb. l = [] for _ in range(iterations): l.append("X" * 1048576) # 1 mb. time.sleep(60) class GetConfiguration(actions.ActionPlugin): """Retrieves the running configuration parameters.""" in_rdfvalue = None out_rdfvalues = [rdf_protodict.Dict] BLOCKED_PARAMETERS = ["Client.private_key"] def Run(self, unused_arg): """Retrieve the configuration except for the blocked parameters.""" out = self.out_rdfvalues[0]() for descriptor in config_lib.CONFIG.type_infos: if descriptor.name in self.BLOCKED_PARAMETERS: value = "[Redacted]" else: try: value = config_lib.CONFIG.Get(descriptor.name, default=None) except (config_lib.Error, KeyError, AttributeError, ValueError) as e: logging.info("Config reading error: %s", e) continue if value is not None: out[descriptor.name] = value self.SendReply(out) class GetLibraryVersions(actions.ActionPlugin): """Retrieves version information for installed libraries.""" in_rdfvalue = None out_rdfvalues = [rdf_protodict.Dict] def GetSSLVersion(self): return M2Crypto.m2.OPENSSL_VERSION_TEXT def GetM2CryptoVersion(self): return M2Crypto.version def GetPSUtilVersion(self): return ".".join(map(utils.SmartUnicode, psutil.version_info)) def GetProtoVersion(self): return pkg_resources.get_distribution("protobuf").version def GetTSKVersion(self): return pytsk3.TSK_VERSION_STR def GetPyTSKVersion(self): return pytsk3.get_version() library_map = { "pytsk": GetPyTSKVersion, "TSK": GetTSKVersion, "M2Crypto": GetM2CryptoVersion, "SSL": GetSSLVersion, "psutil": GetPSUtilVersion, } error_str = "Unable to determine library version: %s" def Run(self, unused_arg): result = self.out_rdfvalues[0]() for lib, f in self.library_map.iteritems(): try: result[lib] = f(self) except Exception: # pylint: disable=broad-except result[lib] = self.error_str % traceback.format_exc() self.SendReply(result) class UpdateConfiguration(actions.ActionPlugin): """Updates configuration parameters on the client.""" in_rdfvalue = rdf_protodict.Dict UPDATEABLE_FIELDS = ["Client.compression", "Client.foreman_check_frequency", "Client.server_urls", "Client.max_post_size", "Client.max_out_queue", "Client.poll_min", "Client.poll_max", "Client.poll_slew", "Client.rss_max"] # pyformat: disable def Run(self, arg): """Does the actual work.""" disallowed_fields = [] for field, value in arg.items(): if field in self.UPDATEABLE_FIELDS: config_lib.CONFIG.Set(field, value) else: disallowed_fields.append(field) if disallowed_fields: logging.warning("Received an update request for restricted field(s) %s.", ",".join(disallowed_fields)) try: config_lib.CONFIG.Write() except (IOError, OSError): pass def GetClientInformation(): return rdf_client.ClientInformation( client_name=config_lib.CONFIG["Client.name"], client_description=config_lib.CONFIG["Client.description"], client_version=int(config_lib.CONFIG["Source.version_numeric"]), build_time=config_lib.CONFIG["Client.build_time"], labels=config_lib.CONFIG.Get("Client.labels", default=None)) class GetClientInfo(actions.ActionPlugin): """Obtains information about the GRR client installed.""" out_rdfvalues = [rdf_client.ClientInformation] def Run(self, unused_args): self.SendReply(GetClientInformation()) class GetClientStats(actions.ActionPlugin): """This retrieves some stats about the GRR process.""" in_rdfvalue = rdf_client.GetClientStatsRequest out_rdfvalues = [rdf_client.ClientStats] def Run(self, arg): """Returns the client stats.""" if arg is None: arg = rdf_client.GetClientStatsRequest() proc = psutil.Process(os.getpid()) meminfo = proc.memory_info() response = rdf_client.ClientStats( RSS_size=meminfo.rss, VMS_size=meminfo.vms, memory_percent=proc.memory_percent(), bytes_received=stats.STATS.GetMetricValue("grr_client_received_bytes"), bytes_sent=stats.STATS.GetMetricValue("grr_client_sent_bytes"), create_time=long(proc.create_time() * 1e6), boot_time=long(psutil.boot_time() * 1e6)) samples = self.grr_worker.stats_collector.cpu_samples for (timestamp, user, system, percent) in samples: if arg.start_time < timestamp < arg.end_time: sample = rdf_client.CpuSample(timestamp=timestamp, user_cpu_time=user, system_cpu_time=system, cpu_percent=percent) response.cpu_samples.Append(sample) samples = self.grr_worker.stats_collector.io_samples for (timestamp, read_bytes, write_bytes) in samples: if arg.start_time < timestamp < arg.end_time: sample = rdf_client.IOSample(timestamp=timestamp, read_bytes=read_bytes, write_bytes=write_bytes) response.io_samples.Append(sample) self.Send(response) def Send(self, response): self.SendReply(response) class GetClientStatsAuto(GetClientStats): """This class is used to send the reply to a well known flow on the server.""" def Send(self, response): if isinstance(response, rdf_client.ClientStats): response.DownSample() self.grr_worker.SendReply( response, session_id=rdfvalue.SessionID(queue=queues.STATS, flow_name="Stats"), response_id=0, request_id=0, priority=rdf_flows.GrrMessage.Priority.LOW_PRIORITY, message_type=rdf_flows.GrrMessage.Type.MESSAGE, require_fastpoll=False) class SendStartupInfo(actions.ActionPlugin): in_rdfvalue = None out_rdfvalues = [rdf_client.StartupInfo] well_known_session_id = rdfvalue.SessionID(flow_name="Startup") def Run(self, unused_arg, ttl=None): """Returns the startup information.""" logging.debug("Sending startup information.") response = rdf_client.StartupInfo(boot_time=long(psutil.boot_time() * 1e6), client_info=GetClientInformation()) self.grr_worker.SendReply( response, session_id=self.well_known_session_id, response_id=0, request_id=0, priority=rdf_flows.GrrMessage.Priority.LOW_PRIORITY, message_type=rdf_flows.GrrMessage.Type.MESSAGE, require_fastpoll=False, ttl=ttl) grr-3.1.0.2/grr/client/client_actions/admin_test.py000066400000000000000000000210441273104013200222060ustar00rootroot00000000000000#!/usr/bin/env python """Tests client actions related to administrating the client.""" import os import StringIO import psutil from grr.client import comms from grr.lib import config_lib from grr.lib import flags from grr.lib import rdfvalue from grr.lib import stats from grr.lib import test_lib from grr.lib import utils from grr.lib.rdfvalues import client as rdf_client from grr.lib.rdfvalues import protodict as rdf_protodict class ConfigActionTest(test_lib.EmptyActionTest): """Tests the client actions UpdateConfiguration and GetConfiguration.""" def setUp(self): super(ConfigActionTest, self).setUp() # These tests change the config so we preserve state. self.config_stubber = test_lib.PreserveConfig() self.config_stubber.Start() def tearDown(self): super(ConfigActionTest, self).tearDown() self.config_stubber.Stop() def testUpdateConfiguration(self): """Test that we can update the config.""" # A unique name on the filesystem for the writeback. self.config_file = os.path.join(self.temp_dir, "ConfigActionTest.yaml") # In a real client, the writeback location should be set to something real, # but for this test we make it the same as the config file.. config_lib.CONFIG.SetWriteBack(self.config_file) # Make sure the file is gone self.assertRaises(IOError, open, self.config_file) location = ["http://www.example1.com/", "http://www.example2.com/"] request = rdf_protodict.Dict() request["Client.server_urls"] = location request["Client.foreman_check_frequency"] = 3600 result = self.RunAction("UpdateConfiguration", request) self.assertEqual(result, []) self.assertEqual(config_lib.CONFIG["Client.foreman_check_frequency"], 3600) # Test the config file got written. data = open(self.config_file).read() self.assertTrue("server_urls: {0}".format(",".join(location)) in data) self.urls = [] # Now test that our location was actually updated. def FakeUrlOpen(req, timeout=10): _ = timeout self.urls.append(req.get_full_url()) return StringIO.StringIO() with utils.Stubber(comms.urllib2, "urlopen", FakeUrlOpen): client_context = comms.GRRHTTPClient(worker=MockClientWorker) client_context.MakeRequest("") # Since the request is successful we only connect to one location. self.assertTrue(location[0] in self.urls[0]) def testUpdateConfigBlacklist(self): """Tests that disallowed fields are not getting updated.""" with test_lib.ConfigOverrider({ "Client.server_urls": ["http://something.com/"], "Client.server_serial_number": 1 }): location = ["http://www.example.com"] request = rdf_protodict.Dict() request["Client.server_urls"] = location request["Client.server_serial_number"] = 10 self.RunAction("UpdateConfiguration", request) # Location can be set. self.assertEqual(config_lib.CONFIG["Client.server_urls"], location) # But the server serial number can not be updated. self.assertEqual(config_lib.CONFIG["Client.server_serial_number"], 1) def testGetConfig(self): """Check GetConfig client action works.""" # Use UpdateConfig to generate a config. location = ["http://example.com"] request = rdf_protodict.Dict() request["Client.server_urls"] = location request["Client.foreman_check_frequency"] = 3600 self.RunAction("UpdateConfiguration", request) # Check that our GetConfig actually gets the real data. self.RunAction("GetConfiguration") self.assertEqual(config_lib.CONFIG["Client.foreman_check_frequency"], 3600) self.assertEqual(config_lib.CONFIG["Client.server_urls"], location) class MockStatsCollector(object): """Mock stats collector for GetClientStatsActionTest.""" # First value in every tuple is a timestamp (as if it was returned by # time.time()). cpu_samples = [ (rdfvalue.RDFDatetime().FromSecondsFromEpoch(100), 0.1, 0.1, 10.0), (rdfvalue.RDFDatetime().FromSecondsFromEpoch(110), 0.1, 0.2, 15.0), (rdfvalue.RDFDatetime().FromSecondsFromEpoch(120), 0.1, 0.3, 20.0) ] # pyformat: disable io_samples = [(rdfvalue.RDFDatetime().FromSecondsFromEpoch(100), 100, 100), (rdfvalue.RDFDatetime().FromSecondsFromEpoch(110), 200, 200), (rdfvalue.RDFDatetime().FromSecondsFromEpoch(120), 300, 300)] class MockClientWorker(object): """Mock client worker for GetClientStatsActionTest.""" def __init__(self): self.stats_collector = MockStatsCollector() class GetClientStatsActionTest(test_lib.EmptyActionTest): """Test GetClientStats client action.""" def setUp(self): super(GetClientStatsActionTest, self).setUp() self.old_boot_time = psutil.boot_time psutil.boot_time = lambda: 100 def tearDown(self): super(GetClientStatsActionTest, self).tearDown() psutil.boot_time = self.old_boot_time def testReturnsAllDataByDefault(self): """Checks that stats collection works.""" stats.STATS.RegisterCounterMetric("grr_client_received_bytes") stats.STATS.IncrementCounter("grr_client_received_bytes", 1566) stats.STATS.RegisterCounterMetric("grr_client_sent_bytes") stats.STATS.IncrementCounter("grr_client_sent_bytes", 2000) results = self.RunAction("GetClientStats", grr_worker=MockClientWorker(), arg=rdf_client.GetClientStatsRequest()) response = results[0] self.assertEqual(response.bytes_received, 1566) self.assertEqual(response.bytes_sent, 2000) self.assertEqual(len(response.cpu_samples), 3) for i in range(3): self.assertEqual( response.cpu_samples[i].timestamp, rdfvalue.RDFDatetime().FromSecondsFromEpoch(100 + i * 10)) self.assertAlmostEqual(response.cpu_samples[i].user_cpu_time, 0.1) self.assertAlmostEqual(response.cpu_samples[i].system_cpu_time, 0.1 * (i + 1)) self.assertAlmostEqual(response.cpu_samples[i].cpu_percent, 10.0 + 5 * i) self.assertEqual(len(response.io_samples), 3) for i in range(3): self.assertEqual( response.io_samples[i].timestamp, rdfvalue.RDFDatetime().FromSecondsFromEpoch(100 + i * 10)) self.assertEqual(response.io_samples[i].read_bytes, 100 * (i + 1)) self.assertEqual(response.io_samples[i].write_bytes, 100 * (i + 1)) self.assertEqual(response.boot_time, long(100 * 1e6)) def testFiltersDataPointsByStartTime(self): start_time = rdfvalue.RDFDatetime().FromSecondsFromEpoch(117) results = self.RunAction( "GetClientStats", grr_worker=MockClientWorker(), arg=rdf_client.GetClientStatsRequest(start_time=start_time)) response = results[0] self.assertEqual(len(response.cpu_samples), 1) self.assertEqual(response.cpu_samples[0].timestamp, rdfvalue.RDFDatetime().FromSecondsFromEpoch(120)) self.assertEqual(len(response.io_samples), 1) self.assertEqual(response.io_samples[0].timestamp, rdfvalue.RDFDatetime().FromSecondsFromEpoch(120)) def testFiltersDataPointsByEndTime(self): end_time = rdfvalue.RDFDatetime().FromSecondsFromEpoch(102) results = self.RunAction( "GetClientStats", grr_worker=MockClientWorker(), arg=rdf_client.GetClientStatsRequest(end_time=end_time)) response = results[0] self.assertEqual(len(response.cpu_samples), 1) self.assertEqual(response.cpu_samples[0].timestamp, rdfvalue.RDFDatetime().FromSecondsFromEpoch(100)) self.assertEqual(len(response.io_samples), 1) self.assertEqual(response.io_samples[0].timestamp, rdfvalue.RDFDatetime().FromSecondsFromEpoch(100)) def testFiltersDataPointsByStartAndEndTimes(self): start_time = rdfvalue.RDFDatetime().FromSecondsFromEpoch(109) end_time = rdfvalue.RDFDatetime().FromSecondsFromEpoch(113) results = self.RunAction("GetClientStats", grr_worker=MockClientWorker(), arg=rdf_client.GetClientStatsRequest( start_time=start_time, end_time=end_time)) response = results[0] self.assertEqual(len(response.cpu_samples), 1) self.assertEqual(response.cpu_samples[0].timestamp, rdfvalue.RDFDatetime().FromSecondsFromEpoch(110)) self.assertEqual(len(response.io_samples), 1) self.assertEqual(response.io_samples[0].timestamp, rdfvalue.RDFDatetime().FromSecondsFromEpoch(110)) def main(argv): test_lib.main(argv) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/client/client_actions/components.py000066400000000000000000000161401273104013200222450ustar00rootroot00000000000000#!/usr/bin/env python """Implement client side components. Client components are managed, versioned modules which can be loaded at runtime. """ import importlib import logging import os import StringIO import sys import zipfile from grr.client import actions from grr.lib import config_lib from grr.lib import utils from grr.lib.rdfvalues import client as rdf_client from grr.lib.rdfvalues import crypto as rdf_crypto LOADED_COMPONENTS = {} class Site(object): """A copy of the relevant functions of the site Python package. PyInstaller removes site.py and replaces it with its own version for some reason so if we want to use site.addsitedir(), we need to provide it ourselves. This code is basically based on https://github.com/python-git/python/blob/715a6e5035bb21ac49382772076ec4c630d6e960/Lib/site.py """ def MakePath(self, *paths): dir_ = os.path.abspath(os.path.join(*paths)) return dir_, os.path.normcase(dir_) def InitPathinfo(self): """Return a set containing all existing directory entries from sys.path.""" d = set() for dir_ in sys.path: try: if os.path.isdir(dir_): dir_, dircase = self.MakePath(dir_) d.add(dircase) except TypeError: continue return d def AddSiteDir(self, sitedir): """Add 'sitedir' argument to sys.path if missing.""" known_paths = self.InitPathinfo() sitedir, sitedircase = self.MakePath(sitedir) if sitedircase not in known_paths and os.path.exists(sitedir): sys.path.append(sitedir) try: names = os.listdir(sitedir) except os.error: return dotpth = os.extsep + "pth" names = [name for name in names if name.endswith(dotpth)] for name in sorted(names): self.AddPackage(sitedir, name, known_paths) def AddPackage(self, sitedir, name, known_paths): """Process a .pth file within the site-packages directory.""" if known_paths is None: self.InitPathinfo() fullname = os.path.join(sitedir, name) try: f = open(fullname, "rU") except IOError: return with f: for line in f: if line.startswith("#"): continue if line.startswith(("import ", "import\t")): exec line # pylint: disable=exec-used continue line = line.rstrip() dir_, dircase = self.MakePath(sitedir, line) if dircase not in known_paths and os.path.exists(dir_): sys.path.append(dir_) known_paths.add(dircase) class LoadComponent(actions.ActionPlugin): """Launches an external client action through a component.""" in_rdfvalue = rdf_client.LoadComponent out_rdfvalues = [rdf_client.LoadComponent] def LoadComponent(self, summary): """Import all the required modules as specified in the request.""" if (summary.name in LOADED_COMPONENTS and summary.version != LOADED_COMPONENTS[summary.name]): logging.error("Component %s is already loaded at version %s. Exiting!", summary.name, LOADED_COMPONENTS[summary.name]) os._exit(0) # pylint: disable=protected-access for mod_name in summary.modules: logging.debug("Will import %s", mod_name) importlib.import_module(mod_name) def Run(self, request): """Load the component requested. The component defines a set of python imports which should be imported into the running program. The purpose of this client action is to ensure that the imports are available and of the correct version. We ensure this by: 1) Attempt to import the relevant modules. 2) If that fails checks for the presence of a component installed at the require path. Attempt to import the modules again. 3) If no component is installed, we fetch and install the component from the server. We then attempt to use it. If all imports succeed we return a success status, otherwise we raise an exception. Args: request: The LoadComponent request. Raises: RuntimeError: If the component is invalid. """ summary = request.summary # Just try to load the required modules. try: self.LoadComponent(summary) # If we succeed we just report this component is done. self.SendReply(request) return except ImportError: pass # Try to add an existing component path. component_path = utils.JoinPath( config_lib.CONFIG.Get("Client.component_path"), summary.name, summary.version) # Add the component path to the site packages: site = Site() site.AddSiteDir(component_path) LOADED_COMPONENTS[summary.name] = summary.version try: self.LoadComponent(summary) logging.info("Component %s already present.", summary.name) self.SendReply(request) return except ImportError: pass # Could not import component - will have to fetch it. logging.info("Unable to import component %s.", summary.name) # Derive the name of the component that we need depending on the current # architecture. The client build system should have burned its environment # into the client config file. This is the best choice because it will # choose the same component that was built together with the client # itself (on the same build environment). build_environment = config_lib.CONFIG.Get("Client.build_environment") if not build_environment: # Failing this we try to get something similar to the running system. build_environment = rdf_client.Uname.FromCurrentSystem().signature() url = "%s/%s" % (summary.url, build_environment) logging.info("Fetching component from %s", url) http_result = self.grr_worker.http_manager.OpenServerEndpoint(url) if http_result.code != 200: raise RuntimeError("Error %d while downloading component %s." % (http_result.code, url)) crypted_data = http_result.data # Decrypt and check signature. The cipher is created when the component is # uploaded and contains the key to decrypt it. signed_blob = rdf_crypto.SignedBlob(summary.cipher.Decrypt(crypted_data)) # Ensure the blob is signed with the correct key. signed_blob.Verify(config_lib.CONFIG[ "Client.executable_signing_public_key"]) component = rdf_client.ClientComponent(signed_blob.data) # Make sure its the component we actually want. if (component.summary.name != summary.name or component.summary.version != summary.version): raise RuntimeError("Downloaded component is not the correct version") # Make intermediate directories. try: os.makedirs(component_path) except (OSError, IOError): pass # Unzip the component into the path. logging.info("Installing component to %s", component_path) component_zip = zipfile.ZipFile(StringIO.StringIO(component.raw_data)) component_zip.extractall(component_path) # Add the component to the site packages: site.AddSiteDir(component_path) LOADED_COMPONENTS[component.summary.name] = component.summary.version # If this does not work now, we just fail. self.LoadComponent(summary) # If we succeed we just report this component is done. self.SendReply(request) grr-3.1.0.2/grr/client/client_actions/components_test.py000066400000000000000000000051201273104013200233000ustar00rootroot00000000000000#!/usr/bin/env python # -*- mode: python; encoding: utf-8 -*- """Tests for components. This test can be used to ensure that a component is self contained by replacing the component in grr/test_data/ with the real component. """ import os import StringIO import zipfile from grr.client import comms from grr.lib import aff4 from grr.lib import flags from grr.lib import test_lib from grr.lib.rdfvalues import client as rdf_client class MockHTTPManager(object): def __init__(self, token): self.token = token def OpenServerEndpoint(self, url): fd = aff4.FACTORY.Open("aff4:/web" + url, token=self.token) return comms.HTTPObject(data=fd.read(100e6), code=200) class MockClientWorker(object): """Mock client worker.""" def __init__(self, token): self.http_manager = MockHTTPManager(token) class TestComponents(test_lib.EmptyActionTest): """Test the ability to load arbitrary components.""" # This component will leave its mark on the os module when imported. component_payload = """ import os os._grr_component_was_here = True """ def setUp(self): super(TestComponents, self).setUp() # Create a mock component. fp = StringIO.StringIO() new_zip_file = zipfile.ZipFile(fp, mode="w") new_zip_file.writestr("mock_mod.py", self.component_payload) new_zip_file.close() self.component = test_lib.WriteComponent(name="mock_component", version="1.0", token=self.token, modules=["mock_mod"], raw_data=fp.getvalue()) def testComponentLoading(self): """Ensure we can load the component.""" message = rdf_client.LoadComponent(summary=self.component.summary) # The client uses its build_environment configuration to call the correct # version of the component. It is normally populated by the build system but # in this test we set it to a known value which is the same as we created # earlier. with test_lib.ConfigOverrider({ "Client.build_environment": self.component.build_system.signature(), "Client.component_path": os.path.join(self.temp_dir, "components") }): self.RunAction("LoadComponent", message, grr_worker=MockClientWorker(self.token)) # Make sure that the component was loaded. self.assertTrue(getattr(os, "_grr_component_was_here", False)) def main(argv): # Run the full test suite test_lib.GrrTestProgram(argv=argv) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/client/client_actions/enrol.py000066400000000000000000000007331273104013200212000ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2010 Google Inc. All Rights Reserved. """Actions required for CA enrolment.""" from grr.client import actions class SaveCert(actions.ActionPlugin): """Accepts a signed certificate from the server and saves it to disk.""" def Run(self, args): """Receive the certificate and store it to disk.""" # We dont really care about the certificate any more. The ca_enroller flow # is changed to not issue this client action now. grr-3.1.0.2/grr/client/client_actions/file_fingerprint.py000066400000000000000000000066571273104013200234220ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2011 Google Inc. All Rights Reserved. """Action to fingerprint files on the client.""" import hashlib from grr.lib import fingerprint from grr.client import vfs from grr.client.client_actions import standard from grr.lib.rdfvalues import client as rdf_client class Fingerprinter(fingerprint.Fingerprinter): """A fingerprinter with heartbeat.""" def __init__(self, progress_cb, file_obj): super(Fingerprinter, self).__init__(file_obj) self.progress_cb = progress_cb def _GetNextInterval(self): self.progress_cb() return super(Fingerprinter, self)._GetNextInterval() class FingerprintFile(standard.ReadBuffer): """Apply a set of fingerprinting methods to a file.""" in_rdfvalue = rdf_client.FingerprintRequest out_rdfvalues = [rdf_client.FingerprintResponse] _hash_types = { rdf_client.FingerprintTuple.HashType.MD5: hashlib.md5, rdf_client.FingerprintTuple.HashType.SHA1: hashlib.sha1, rdf_client.FingerprintTuple.HashType.SHA256: hashlib.sha256, } _fingerprint_types = { rdf_client.FingerprintTuple.Type.FPT_GENERIC: ( fingerprint.Fingerprinter.EvalGeneric), rdf_client.FingerprintTuple.Type.FPT_PE_COFF: ( fingerprint.Fingerprinter.EvalPecoff), } def Run(self, args): """Fingerprint a file.""" with vfs.VFSOpen(args.pathspec, progress_callback=self.Progress) as file_obj: fingerprinter = Fingerprinter(self.Progress, file_obj) response = rdf_client.FingerprintResponse() response.pathspec = file_obj.pathspec if args.tuples: tuples = args.tuples else: # There are none selected -- we will cover everything tuples = list() for k in self._fingerprint_types.iterkeys(): tuples.append(rdf_client.FingerprintTuple(fp_type=k)) for finger in tuples: hashers = [self._hash_types[h] for h in finger.hashers] or None if finger.fp_type in self._fingerprint_types: invoke = self._fingerprint_types[finger.fp_type] res = invoke(fingerprinter, hashers) if res: response.matching_types.append(finger.fp_type) else: raise RuntimeError("Encountered unknown fingerprint type. %s" % finger.fp_type) # Structure of the results is a list of dicts, each containing the # name of the hashing method, hashes for enabled hash algorithms, # and auxilliary data where present (e.g. signature blobs). # Also see Fingerprint:HashIt() response.results = fingerprinter.HashIt() # We now return data in a more structured form. for result in response.results: if result.GetItem("name") == "generic": for hash_type in ["md5", "sha1", "sha256"]: value = result.GetItem(hash_type) if value is not None: setattr(response.hash, hash_type, value) if result["name"] == "pecoff": for hash_type in ["md5", "sha1", "sha256"]: value = result.GetItem(hash_type) if value: setattr(response.hash, "pecoff_" + hash_type, value) signed_data = result.GetItem("SignedData", []) for data in signed_data: response.hash.signed_data.Append(revision=data[0], cert_type=data[1], certificate=data[2]) self.SendReply(response) grr-3.1.0.2/grr/client/client_actions/file_fingerprint_test.py000066400000000000000000000037271273104013200244540ustar00rootroot00000000000000#!/usr/bin/env python # -*- mode: python; encoding: utf-8 -*- # Copyright 2010 Google Inc. All Rights Reserved. """Test client vfs.""" import hashlib import os # Populate the action registry # pylint: disable=unused-import from grr.client import client_actions # pylint: enable=unused-import from grr.lib import flags from grr.lib import test_lib from grr.lib.rdfvalues import client as rdf_client from grr.lib.rdfvalues import paths as rdf_paths class FilehashTest(test_lib.EmptyActionTest): """Test fingerprinting files.""" def testHashFile(self): """Can we hash a file?""" path = os.path.join(self.base_path, "numbers.txt") p = rdf_paths.PathSpec(path=path, pathtype=rdf_paths.PathSpec.PathType.OS) result = self.RunAction("FingerprintFile", rdf_client.FingerprintRequest(pathspec=p)) types = result[0].matching_types fingers = {} for f in result[0].results: fingers[f["name"]] = f generic_sha256 = fingers["generic"]["sha256"] self.assertEqual(generic_sha256, hashlib.sha256(open(path).read()).digest()) # Make sure all fingers are listed in types and vice versa. t_map = {rdf_client.FingerprintTuple.Type.FPT_GENERIC: "generic", rdf_client.FingerprintTuple.Type.FPT_PE_COFF: "pecoff"} ti_map = dict((v, k) for k, v in t_map.iteritems()) for t in types: self.assertTrue(t_map[t] in fingers) for f in fingers: self.assertTrue(ti_map[f] in types) self.assertEqual(result[0].pathspec.path, path) def testMissingFile(self): """Fail on missing file?""" path = os.path.join(self.base_path, "this file does not exist") p = rdf_paths.PathSpec(path=path, pathtype=rdf_paths.PathSpec.PathType.OS) self.assertRaises(IOError, self.RunAction, "FingerprintFile", rdf_client.FingerprintRequest(pathspec=p)) def main(argv): test_lib.main(argv) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/client/client_actions/linux/000077500000000000000000000000001273104013200206435ustar00rootroot00000000000000grr-3.1.0.2/grr/client/client_actions/linux/__init__.py000066400000000000000000000003711273104013200227550ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2012 Google Inc. All Rights Reserved. """A module to load all linux client plugins.""" # pylint: disable=unused-import # These import populate the Action registry from grr.client.client_actions.linux import linux grr-3.1.0.2/grr/client/client_actions/linux/linux.py000066400000000000000000000310511273104013200223540ustar00rootroot00000000000000#!/usr/bin/env python """Linux specific actions.""" import ctypes import ctypes.util import os import pwd import time from grr.client import actions from grr.client import client_utils_common from grr.client.client_actions import standard from grr.lib import utils from grr.lib.rdfvalues import client as rdf_client from grr.lib.rdfvalues import protodict as rdf_protodict # struct sockaddr_ll # { # unsigned short int sll_family; # unsigned short int sll_protocol; # int sll_ifindex; # unsigned short int sll_hatype; # unsigned char sll_pkttype; # unsigned char sll_halen; # unsigned char sll_addr[8]; # }; class Sockaddrll(ctypes.Structure): """The sockaddr_ll struct.""" _fields_ = [ ("sll_family", ctypes.c_ushort), ("sll_protocol", ctypes.c_ushort), ("sll_ifindex", ctypes.c_byte * 4), ("sll_hatype", ctypes.c_ushort), ("sll_pkttype", ctypes.c_ubyte), ("sll_halen", ctypes.c_ubyte), ("sll_addr", ctypes.c_ubyte * 8), ] # struct sockaddr_in { # sa_family_t sin_family; /* Address family */ # __be16 sin_port; /* Port number */ # struct in_addr sin_addr; /* Internet address */ # /* Pad to size of `struct sockaddr'. */ # unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) - # sizeof(unsigned short int) - sizeof(struct in_addr)]; # }; class Sockaddrin(ctypes.Structure): """The sockaddr_in struct.""" _fields_ = [ ("sin_family", ctypes.c_ubyte), ("sin_port", ctypes.c_ushort), ("sin_addr", ctypes.c_ubyte * 4), ("sin_zero", ctypes.c_char * 8) ] # pyformat: disable # struct sockaddr_in6 { # unsigned short int sin6_family; /* AF_INET6 */ # __be16 sin6_port; /* Transport layer port # */ # __be32 sin6_flowinfo; /* IPv6 flow information */ # struct in6_addr sin6_addr; /* IPv6 address */ # __u32 sin6_scope_id; /* scope id */ # }; class Sockaddrin6(ctypes.Structure): """The sockaddr_in6 struct.""" _fields_ = [ ("sin6_family", ctypes.c_ubyte), ("sin6_port", ctypes.c_ushort), ("sin6_flowinfo", ctypes.c_ubyte * 4), ("sin6_addr", ctypes.c_ubyte * 16), ("sin6_scope_id", ctypes.c_ubyte * 4) ] # pyformat: disable # struct ifaddrs *ifa_next; /* Pointer to next struct */ # char *ifa_name; /* Interface name */ # u_int ifa_flags; /* Interface flags */ # struct sockaddr *ifa_addr; /* Interface address */ # struct sockaddr *ifa_netmask; /* Interface netmask */ # struct sockaddr *ifa_broadaddr; /* Interface broadcast address */ # struct sockaddr *ifa_dstaddr; /* P2P interface destination */ # void *ifa_data; /* Address specific data */ class Ifaddrs(ctypes.Structure): pass Ifaddrs._fields_ = [ # pylint: disable=protected-access ("ifa_next", ctypes.POINTER(Ifaddrs)), ("ifa_name", ctypes.POINTER(ctypes.c_char)), ("ifa_flags", ctypes.c_uint), ("ifa_addr", ctypes.POINTER(ctypes.c_char)), ("ifa_netmask", ctypes.POINTER(ctypes.c_char)), ("ifa_broadaddr", ctypes.POINTER(ctypes.c_char)), ("ifa_destaddr", ctypes.POINTER(ctypes.c_char)), ("ifa_data", ctypes.POINTER(ctypes.c_char)) ] # pyformat: disable class EnumerateInterfaces(actions.ActionPlugin): """Enumerates all MAC addresses on this system.""" out_rdfvalues = [rdf_client.Interface] def Run(self, unused_args): """Enumerate all interfaces and collect their MAC addresses.""" libc = ctypes.cdll.LoadLibrary(ctypes.util.find_library("c")) ifa = Ifaddrs() p_ifa = ctypes.pointer(ifa) libc.getifaddrs(ctypes.pointer(p_ifa)) addresses = {} macs = {} ifs = set() m = p_ifa while m: ifname = ctypes.string_at(m.contents.ifa_name) ifs.add(ifname) try: iffamily = ord(m.contents.ifa_addr[0]) if iffamily == 0x2: # AF_INET data = ctypes.cast(m.contents.ifa_addr, ctypes.POINTER(Sockaddrin)) ip4 = "".join(map(chr, data.contents.sin_addr)) address_type = rdf_client.NetworkAddress.Family.INET address = rdf_client.NetworkAddress(address_type=address_type, packed_bytes=ip4) addresses.setdefault(ifname, []).append(address) if iffamily == 0x11: # AF_PACKET data = ctypes.cast(m.contents.ifa_addr, ctypes.POINTER(Sockaddrll)) addlen = data.contents.sll_halen macs[ifname] = "".join(map(chr, data.contents.sll_addr[:addlen])) if iffamily == 0xA: # AF_INET6 data = ctypes.cast(m.contents.ifa_addr, ctypes.POINTER(Sockaddrin6)) ip6 = "".join(map(chr, data.contents.sin6_addr)) address_type = rdf_client.NetworkAddress.Family.INET6 address = rdf_client.NetworkAddress(address_type=address_type, packed_bytes=ip6) addresses.setdefault(ifname, []).append(address) except ValueError: # Some interfaces don't have a iffamily and will raise a null pointer # exception. We still want to send back the name. pass m = m.contents.ifa_next libc.freeifaddrs(p_ifa) for interface in ifs: mac = macs.setdefault(interface, "") address_list = addresses.setdefault(interface, "") args = {"ifname": interface} if mac: args["mac_address"] = mac if addresses: args["addresses"] = address_list self.SendReply(rdf_client.Interface(**args)) class GetInstallDate(actions.ActionPlugin): """Estimate the install date of this system.""" out_rdfvalues = [rdf_protodict.DataBlob] def Run(self, unused_args): self.SendReply(integer=int(os.stat("/lost+found").st_ctime)) class UtmpStruct(utils.Struct): """Parse wtmp file from utmp.h.""" _fields = [ ("h", "ut_type"), ("i", "ut_pid"), ("32s", "ut_line"), ("4s", "ut_id"), ("32s", "ut_user"), ("256s", "ut_host"), ("i", "ut_exit"), ("i", "ut_session"), ("i", "tv_sec"), ("i", "tv_usec"), ("4i", "ut_addr_v6"), ("20s", "unused"), ] class EnumerateUsers(actions.ActionPlugin): """Enumerates all the users on this system. While wtmp can be collected and parsed server-side using artifacts, we keep this client action to avoid collecting every wtmp on every interrogate, and to allow for the metadata (homedir) expansion to occur on the client, where we have access to LDAP. """ # Client versions 3.0.7.1 and older used to return KnowledgeBaseUser. # KnowledgeBaseUser was renamed to User. out_rdfvalues = [rdf_client.User, rdf_client.KnowledgeBaseUser] def ParseWtmp(self): """Parse wtmp and extract the last logon time.""" users = {} wtmp_struct_size = UtmpStruct.GetSize() for filename in sorted(os.listdir("/var/log")): if filename.startswith("wtmp"): try: wtmp = open(os.path.join("/var/log", filename)).read() except IOError: continue for offset in xrange(0, len(wtmp), wtmp_struct_size): try: record = UtmpStruct(wtmp[offset:offset + wtmp_struct_size]) except RuntimeError: break # Users only appear for USER_PROCESS events, others are system. if record.ut_type != 7: continue try: if users[record.ut_user] < record.tv_sec: users[record.ut_user] = record.tv_sec except KeyError: users[record.ut_user] = record.tv_sec return users def Run(self, unused_args): """Enumerates all the users on this system.""" users = self.ParseWtmp() for user, last_login in users.iteritems(): # Lose the null termination username = user.split("\x00", 1)[0] if username: try: pwdict = pwd.getpwnam(username) homedir = pwdict[5] # pw_dir full_name = pwdict[4] # pw_gecos except KeyError: homedir = "" full_name = "" # Somehow the last login time can be < 0. There is no documentation # what this means so we just set it to 0 (the rdfvalue field is # unsigned so we can't send negative values). if last_login < 0: last_login = 0 self.SendReply(username=utils.SmartUnicode(username), homedir=utils.SmartUnicode(homedir), full_name=utils.SmartUnicode(full_name), last_logon=last_login * 1000000) class EnumerateFilesystems(actions.ActionPlugin): """Enumerate all unique filesystems local to the system. Filesystems picked from: https://www.kernel.org/doc/Documentation/filesystems/ """ acceptable_filesystems = set(["ext2", "ext3", "ext4", "vfat", "ntfs", "btrfs", "Reiserfs", "XFS", "JFS", "squashfs"]) out_rdfvalues = [rdf_client.Filesystem] def CheckMounts(self, filename): """Parses the currently mounted devices.""" # This handles the case where the same filesystem is mounted on # multiple places. with open(filename) as fd: for line in fd: try: device, mnt_point, fs_type, _ = line.split(" ", 3) if fs_type in self.acceptable_filesystems: try: os.stat(device) self.devices[device] = (fs_type, mnt_point) except OSError: pass except ValueError: pass def Run(self, unused_args): """List all the filesystems mounted on the system.""" self.devices = {} # For now we check all the mounted filesystems. self.CheckMounts("/proc/mounts") self.CheckMounts("/etc/mtab") for device, (fs_type, mnt_point) in self.devices.items(): self.SendReply(mount_point=mnt_point, type=fs_type, device=device) class EnumerateRunningServices(actions.ActionPlugin): """List running daemons. TODO(user): This is a placeholder and needs to be implemented. """ in_rdfvalue = None out_rdfvalues = [None] def Run(self, unused_arg): raise RuntimeError("Not implemented") class Uninstall(actions.ActionPlugin): """Uninstall GRR. Place holder, does nothing. Note this needs to handle the different distributions separately, e.g. Redhat vs Debian. """ out_rdfvalues = [rdf_protodict.DataBlob] def Run(self, unused_arg): raise RuntimeError("Not implemented") class UpdateAgent(standard.ExecuteBinaryCommand): """Updates the GRR agent to a new version.""" def ProcessFile(self, path, args): if path.endswith(".deb"): self._InstallDeb(path, args) elif path.endswith(".rpm"): self._InstallRpm(path) else: raise ValueError("Unknown suffix for file %s." % path) def _InstallDeb(self, path, args): cmd = "/usr/bin/dpkg" cmd_args = ["-i", path] time_limit = args.time_limit client_utils_common.Execute(cmd, cmd_args, time_limit=time_limit, bypass_whitelist=True, daemon=True) # The installer will run in the background and kill the main process # so we just wait. If something goes wrong, the nanny will restart the # service after a short while and the client will come back to life. time.sleep(1000) def _InstallRpm(self, path): """Client update for rpm based distros. Upgrading rpms is a bit more tricky than upgrading deb packages since there is a preinstall script that kills the running GRR daemon and, thus, also the installer process. We need to make sure we detach the child process properly and therefore cannot use client_utils_common.Execute(). Args: path: Path to the .rpm. """ pid = os.fork() if pid == 0: # This is the child that will become the installer process. cmd = "/bin/rpm" cmd_args = [cmd, "-U", "--replacepkgs", "--replacefiles", path] # We need to clean the environment or rpm will fail - similar to the # use_client_context=False parameter. env = os.environ.copy() env.pop("LD_LIBRARY_PATH", None) env.pop("PYTHON_PATH", None) # This call doesn't return. os.execve(cmd, cmd_args, env) else: # The installer will run in the background and kill the main process # so we just wait. If something goes wrong, the nanny will restart the # service after a short while and the client will come back to life. time.sleep(1000) grr-3.1.0.2/grr/client/client_actions/network.py000066400000000000000000000022071273104013200215500ustar00rootroot00000000000000#!/usr/bin/env python """Get Information about network states.""" import psutil import logging from grr.client import actions from grr.lib.rdfvalues import client as rdf_client class Netstat(actions.ActionPlugin): """Gather open network connection stats.""" in_rdfvalue = None out_rdfvalues = [rdf_client.NetworkConnection] def Run(self, unused_args): netstat = [] for proc in psutil.process_iter(): try: netstat.append((proc.pid, proc.connections())) except (psutil.NoSuchProcess, psutil.AccessDenied): pass for pid, connections in netstat: for conn in connections: res = rdf_client.NetworkConnection() res.pid = pid res.family = conn.family res.type = conn.type try: if conn.status: res.state = conn.status except ValueError: logging.warn("Encountered unknown connection status (%s).", conn.status) res.local_address.ip, res.local_address.port = conn.laddr if conn.raddr: res.remote_address.ip, res.remote_address.port = conn.raddr self.SendReply(res) grr-3.1.0.2/grr/client/client_actions/osx/000077500000000000000000000000001273104013200203155ustar00rootroot00000000000000grr-3.1.0.2/grr/client/client_actions/osx/__init__.py000066400000000000000000000005021273104013200224230ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2011 Google Inc. All Rights Reserved. """A module to load all windows client plugins.""" # These import populate the Action registry # pylint: disable=unused-import,g-import-not-at-top import platform if platform.system() == "Darwin": from grr.client.client_actions.osx import osx grr-3.1.0.2/grr/client/client_actions/osx/osx.py000066400000000000000000000303451273104013200215050ustar00rootroot00000000000000#!/usr/bin/env python """OSX specific actions. Most of these actions share an interface (in/out rdfvalues) with linux actions of the same name. OSX-only actions are registered with the server via libs/server_stubs.py """ import ctypes import logging import os import re import shutil import sys import pytsk3 from grr.client import actions from grr.client import client_utils_common from grr.client import client_utils_osx from grr.client.client_actions import standard from grr.client.osx.objc import ServiceManagement from grr.lib import config_lib from grr.lib.rdfvalues import client as rdf_client from grr.lib.rdfvalues import protodict as rdf_protodict from grr.parsers import osx_launchd class Error(Exception): """Base error class.""" class UnsupportedOSVersionError(Error): """This action not supported on this os version.""" # struct sockaddr_dl { # u_char sdl_len; /* Total length of sockaddr */ # u_char sdl_family; /* AF_LINK */ # u_short sdl_index; /* if != 0, system given index for interface */ # u_char sdl_type; /* interface type */ # u_char sdl_nlen; /* interface name length, no trailing 0 reqd. */ # u_char sdl_alen; /* link level address length */ # u_char sdl_slen; /* link layer selector length */ # char sdl_data[12]; /* minimum work area, can be larger; # contains both if name and ll address */ # }; # Interfaces can have names up to 15 chars long and sdl_data contains name + mac # but no separators - we need to make sdl_data at least 15+6 bytes. class Sockaddrdl(ctypes.Structure): """The sockaddr_dl struct.""" _fields_ = [ ("sdl_len", ctypes.c_ubyte), ("sdl_family", ctypes.c_ubyte), ("sdl_index", ctypes.c_ushort), ("sdl_type", ctypes.c_ubyte), ("sdl_nlen", ctypes.c_ubyte), ("sdl_alen", ctypes.c_ubyte), ("sdl_slen", ctypes.c_ubyte), ("sdl_data", ctypes.c_ubyte * 24), ] # struct sockaddr_in { # __uint8_t sin_len; # sa_family_t sin_family; # in_port_t sin_port; # struct in_addr sin_addr; # char sin_zero[8]; # }; class Sockaddrin(ctypes.Structure): """The sockaddr_in struct.""" _fields_ = [ ("sin_len", ctypes.c_ubyte), ("sin_family", ctypes.c_ubyte), ("sin_port", ctypes.c_ushort), ("sin_addr", ctypes.c_ubyte * 4), ("sin_zero", ctypes.c_char * 8) ] # pyformat: disable # struct sockaddr_in6 { # __uint8_t sin6_len; /* length of this struct */ # sa_family_t sin6_family; /* AF_INET6 (sa_family_t) */ # in_port_t sin6_port; /* Transport layer port */ # __uint32_t sin6_flowinfo; /* IP6 flow information */ # struct in6_addr sin6_addr; /* IP6 address */ # __uint32_t sin6_scope_id; /* scope zone index */ # }; class Sockaddrin6(ctypes.Structure): """The sockaddr_in6 struct.""" _fields_ = [ ("sin6_len", ctypes.c_ubyte), ("sin6_family", ctypes.c_ubyte), ("sin6_port", ctypes.c_ushort), ("sin6_flowinfo", ctypes.c_ubyte * 4), ("sin6_addr", ctypes.c_ubyte * 16), ("sin6_scope_id", ctypes.c_ubyte * 4) ] # pyformat: disable # struct ifaddrs *ifa_next; /* Pointer to next struct */ # char *ifa_name; /* Interface name */ # u_int ifa_flags; /* Interface flags */ # struct sockaddr *ifa_addr; /* Interface address */ # struct sockaddr *ifa_netmask; /* Interface netmask */ # struct sockaddr *ifa_broadaddr; /* Interface broadcast address */ # struct sockaddr *ifa_dstaddr; /* P2P interface destination */ # void *ifa_data; /* Address specific data */ class Ifaddrs(ctypes.Structure): pass setattr(Ifaddrs, "_fields_", [ ("ifa_next", ctypes.POINTER(Ifaddrs)), ("ifa_name", ctypes.POINTER(ctypes.c_char)), ("ifa_flags", ctypes.c_uint), ("ifa_addr", ctypes.POINTER(ctypes.c_char)), ("ifa_netmask", ctypes.POINTER(ctypes.c_char)), ("ifa_broadaddr", ctypes.POINTER(ctypes.c_char)), ("ifa_destaddr", ctypes.POINTER(ctypes.c_char)), ("ifa_data", ctypes.POINTER(ctypes.c_char)) ]) # pyformat: disable class EnumerateInterfaces(actions.ActionPlugin): """Enumerate all MAC addresses of all NICs.""" out_rdfvalues = [rdf_client.Interface] def Run(self, unused_args): """Enumerate all MAC addresses.""" libc = ctypes.cdll.LoadLibrary(ctypes.util.find_library("c")) ifa = Ifaddrs() p_ifa = ctypes.pointer(ifa) libc.getifaddrs(ctypes.pointer(p_ifa)) addresses = {} macs = {} ifs = set() m = p_ifa while m: ifname = ctypes.string_at(m.contents.ifa_name) ifs.add(ifname) try: iffamily = ord(m.contents.ifa_addr[1]) if iffamily == 0x2: # AF_INET data = ctypes.cast(m.contents.ifa_addr, ctypes.POINTER(Sockaddrin)) ip4 = "".join(map(chr, data.contents.sin_addr)) address_type = rdf_client.NetworkAddress.Family.INET address = rdf_client.NetworkAddress(address_type=address_type, packed_bytes=ip4) addresses.setdefault(ifname, []).append(address) if iffamily == 0x12: # AF_LINK data = ctypes.cast(m.contents.ifa_addr, ctypes.POINTER(Sockaddrdl)) iflen = data.contents.sdl_nlen addlen = data.contents.sdl_alen macs[ifname] = "".join(map(chr, data.contents.sdl_data[iflen:iflen + addlen])) if iffamily == 0x1E: # AF_INET6 data = ctypes.cast(m.contents.ifa_addr, ctypes.POINTER(Sockaddrin6)) ip6 = "".join(map(chr, data.contents.sin6_addr)) address_type = rdf_client.NetworkAddress.Family.INET6 address = rdf_client.NetworkAddress(address_type=address_type, packed_bytes=ip6) addresses.setdefault(ifname, []).append(address) except ValueError: # Some interfaces don't have a iffamily and will raise a null pointer # exception. We still want to send back the name. pass m = m.contents.ifa_next libc.freeifaddrs(p_ifa) for interface in ifs: mac = macs.setdefault(interface, "") address_list = addresses.setdefault(interface, "") args = {"ifname": interface} if mac: args["mac_address"] = mac if address_list: args["addresses"] = address_list self.SendReply(**args) class GetInstallDate(actions.ActionPlugin): """Estimate the install date of this system.""" out_rdfvalues = [rdf_protodict.DataBlob] def Run(self, unused_args): for f in ["/var/log/CDIS.custom", "/var", "/private"]: try: stat = os.stat(f) self.SendReply(integer=int(stat.st_ctime)) return except OSError: pass self.SendReply(integer=0) class EnumerateFilesystems(actions.ActionPlugin): """Enumerate all unique filesystems local to the system.""" out_rdfvalues = [rdf_client.Filesystem] def Run(self, unused_args): """List all local filesystems mounted on this system.""" for fs_struct in client_utils_osx.GetFileSystems(): self.SendReply(device=fs_struct.f_mntfromname, mount_point=fs_struct.f_mntonname, type=fs_struct.f_fstypename) drive_re = re.compile("r?disk[0-9].*") for drive in os.listdir("/dev"): if not drive_re.match(drive): continue path = os.path.join("/dev", drive) try: img_inf = pytsk3.Img_Info(path) # This is a volume or a partition - we send back a TSK device. self.SendReply(device=path) vol_inf = pytsk3.Volume_Info(img_inf) for volume in vol_inf: if volume.flags == pytsk3.TSK_VS_PART_FLAG_ALLOC: offset = volume.start * vol_inf.info.block_size self.SendReply(device=path + ":" + str(offset), type="partition") except (IOError, RuntimeError): continue class OSXEnumerateRunningServices(actions.ActionPlugin): """Enumerate all running launchd jobs.""" in_rdfvalue = None out_rdfvalues = [rdf_client.OSXServiceInformation] def GetRunningLaunchDaemons(self): """Get running launchd jobs from objc ServiceManagement framework.""" sm = ServiceManagement() return sm.SMGetJobDictionaries("kSMDomainSystemLaunchd") def Run(self, unused_arg): """Get running launchd jobs. Raises: UnsupportedOSVersionError: for OS X earlier than 10.6 """ osxversion = client_utils_osx.OSXVersion() version_array = osxversion.VersionAsMajorMinor() if version_array[:2] < [10, 6]: raise UnsupportedOSVersionError( "ServiceManagment API unsupported on < 10.6. This client is %s" % osxversion.VersionString()) launchd_list = self.GetRunningLaunchDaemons() self.parser = osx_launchd.OSXLaunchdJobDict(launchd_list) for job in self.parser.Parse(): response = self.CreateServiceProto(job) self.SendReply(response) def CreateServiceProto(self, job): """Create the Service protobuf. Args: job: Launchdjobdict from servicemanagement framework. Returns: sysinfo_pb2.OSXServiceInformation proto """ service = rdf_client.OSXServiceInformation( label=job.get("Label"), program=job.get("Program"), sessiontype=job.get("LimitLoadToSessionType"), lastexitstatus=int(job["LastExitStatus"]), timeout=int(job["TimeOut"]), ondemand=bool(job["OnDemand"])) for arg in job.get("ProgramArguments", "", stringify=False): # Returns CFArray of CFStrings service.args.Append(unicode(arg)) mach_dict = job.get("MachServices", {}, stringify=False) for key, value in mach_dict.iteritems(): service.machservice.Append("%s:%s" % (key, value)) job_mach_dict = job.get("PerJobMachServices", {}, stringify=False) for key, value in job_mach_dict.iteritems(): service.perjobmachservice.Append("%s:%s" % (key, value)) if "PID" in job: service.pid = job["PID"].value return service class Uninstall(actions.ActionPlugin): """Remove the service that starts us at startup.""" out_rdfvalues = [rdf_protodict.DataBlob] def Run(self, unused_arg): """This kills us with no cleanups.""" logging.debug("Disabling service") msg = "Service disabled." if hasattr(sys, "frozen"): grr_binary = os.path.abspath(sys.executable) elif __file__: grr_binary = os.path.abspath(__file__) try: os.remove(grr_binary) except OSError: msg = "Could not remove binary." try: os.remove(config_lib.CONFIG["Client.plist_path"]) except OSError: if "Could not" in msg: msg += " Could not remove plist file." else: msg = "Could not remove plist file." # Get the directory we are running in from pyinstaller. This is either the # GRR directory which we should delete (onedir mode) or a generated temp # directory which we can delete without problems in onefile mode. directory = getattr(sys, "_MEIPASS", None) if directory: shutil.rmtree(directory, ignore_errors=True) self.SendReply(string=msg) class UpdateAgent(standard.ExecuteBinaryCommand): """Updates the GRR agent to a new version.""" def ProcessFile(self, path, args): cmd = "/usr/sbin/installer" cmd_args = ["-pkg", path, "-target", "/"] time_limit = args.time_limit res = client_utils_common.Execute(cmd, cmd_args, time_limit=time_limit, bypass_whitelist=True) (stdout, stderr, status, time_used) = res # Limit output to 10MB so our response doesn't get too big. stdout = stdout[:10 * 1024 * 1024] stderr = stderr[:10 * 1024 * 1024] result = rdf_client.ExecuteBinaryResponse(stdout=stdout, stderr=stderr, exit_status=status, # We have to return microseconds. time_used=int(1e6 * time_used)) self.SendReply(result) grr-3.1.0.2/grr/client/client_actions/osx/osx_test.py000066400000000000000000000107001273104013200225350ustar00rootroot00000000000000#!/usr/bin/env python # -*- mode: python; encoding: utf-8 -*- # Copyright 2011 Google Inc. All Rights Reserved. """OSX tests.""" import os import mock import mox from grr.lib import flags from grr.lib import osx_launchd as testdata from grr.lib import test_lib class OSXClientTests(test_lib.OSSpecificClientTests): """OSX client action tests.""" def setUp(self): super(OSXClientTests, self).setUp() modules = { # Necessary to stop the import of client.osx.installers registering the # actions.ActionPlugin.classes "grr.client.osx": mock.MagicMock(), "grr.client.osx.objc": mock.MagicMock(), # Necessary to stop the import of client_actions.standard re-populating # actions.ActionPlugin.classes ("grr.client.client_actions" ".standard"): mock.MagicMock(), } self.module_patcher = mock.patch.dict("sys.modules", modules) self.module_patcher.start() # pylint: disable=g-import-not-at-top from grr.client.client_actions.osx import osx # pylint: enable=g-import-not-at-top self.osx = osx def tearDown(self): self.module_patcher.stop() super(OSXClientTests, self).tearDown() class OSXFilesystemTests(OSXClientTests): """Test reading osx file system.""" def testFileSystemEnumeration64Bit(self): """Ensure we can enumerate file systems successfully.""" path = os.path.join(self.base_path, "osx_fsdata") results = self.osx.client_utils_osx.ParseFileSystemsStruct( self.osx.client_utils_osx.StatFS64Struct, 7, open(path).read()) self.assertEqual(len(results), 7) self.assertEqual(results[0].f_fstypename, "hfs") self.assertEqual(results[0].f_mntonname, "/") self.assertEqual(results[0].f_mntfromname, "/dev/disk0s2") self.assertEqual(results[2].f_fstypename, "autofs") self.assertEqual(results[2].f_mntonname, "/auto") self.assertEqual(results[2].f_mntfromname, "map auto.auto") class OSXEnumerateRunningServicesTest(OSXClientTests): def setUp(self): super(OSXEnumerateRunningServicesTest, self).setUp() self.mox = mox.Mox() self.action = self.osx.OSXEnumerateRunningServices(None) self.mock_version = self.mox.CreateMock( self.osx.client_utils_osx.OSXVersion) self.mox.StubOutWithMock(self.action, "GetRunningLaunchDaemons") self.mox.StubOutWithMock(self.action, "SendReply") self.mox.StubOutWithMock(self.osx, "client_utils_osx") def ValidResponseProto(self, proto): self.assertTrue(proto.label) return True def ValidResponseProtoSingle(self, proto): td = testdata.JOB[0] self.assertEqual(proto.label, td["Label"]) self.assertEqual(proto.lastexitstatus, td["LastExitStatus"].value) self.assertEqual(proto.sessiontype, td["LimitLoadToSessionType"]) self.assertEqual(len(proto.machservice), len(td["MachServices"])) self.assertEqual(proto.ondemand, td["OnDemand"].value) self.assertEqual(len(proto.args), len(td["ProgramArguments"])) self.assertEqual(proto.timeout, td["TimeOut"].value) return True def testOSXEnumerateRunningServicesAll(self): self.osx.client_utils_osx.OSXVersion().AndReturn(self.mock_version) self.mock_version.VersionAsMajorMinor().AndReturn([10, 7]) self.action.GetRunningLaunchDaemons().AndReturn(testdata.JOBS) num_results = len(testdata.JOBS) - testdata.FILTERED_COUNT for _ in range(0, num_results): self.action.SendReply(mox.Func(self.ValidResponseProto)) self.mox.ReplayAll() self.action.Run(None) self.mox.VerifyAll() def testOSXEnumerateRunningServicesSingle(self): self.osx.client_utils_osx.OSXVersion().AndReturn(self.mock_version) self.mock_version.VersionAsMajorMinor().AndReturn([10, 7, 1]) self.action.GetRunningLaunchDaemons().AndReturn(testdata.JOB) self.action.SendReply(mox.Func(self.ValidResponseProtoSingle)) self.mox.ReplayAll() self.action.Run(None) self.mox.VerifyAll() def testOSXEnumerateRunningServicesVersionError(self): self.osx.client_utils_osx.OSXVersion().AndReturn(self.mock_version) self.mock_version.VersionAsMajorMinor().AndReturn([10, 5, 1]) self.mock_version.VersionString().AndReturn("10.5.1") self.mox.ReplayAll() self.assertRaises(self.osx.UnsupportedOSVersionError, self.action.Run, None) self.mox.VerifyAll() def tearDown(self): self.mox.UnsetStubs() super(OSXEnumerateRunningServicesTest, self).tearDown() def main(argv): test_lib.main(argv) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/client/client_actions/plist.py000066400000000000000000000047201273104013200212140ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2012 Google Inc. All Rights Reserved. """Client actions related to plist files.""" import cStringIO import types from binplist import binplist from grr.client import actions from grr.client import vfs from grr.lib import plist as plist_lib from grr.lib.rdfvalues import plist as rdfplist from grr.lib.rdfvalues import protodict class PlistQuery(actions.ActionPlugin): """Parses the plist request specified and returns the results. PlistQuery allows you to obtain data from a plist, optionally only if it matches the given filter. Querying for a plist is done in two steps. First, its contents are retrieved. For plists where the top level element is a dict, you can use the key parameter of the PlistRequest to specify a path into the dict to retrieve. When specifying a key, the requested key values are places under a dictionary key called "key". Whether you've specified a key or not, the query parameter allows you to filter based on the """ in_rdfvalue = rdfplist.PlistRequest out_rdfvalues = [protodict.RDFValueArray] MAX_PLIST_SIZE = 1024 * 1024 * 100 # 100 MB def Run(self, args): self.context = args.context self.filter_query = args.query with vfs.VFSOpen(args.pathspec, progress_callback=self.Progress) as fd: data = fd.Read(self.MAX_PLIST_SIZE) plist = binplist.readPlist(cStringIO.StringIO(data)) # Create the query parser parser = plist_lib.PlistFilterParser(self.filter_query).Parse() filter_imp = plist_lib.PlistFilterImplementation matcher = parser.Compile(filter_imp) if self.context: # Obtain the values for the context using the value expander value_expander = filter_imp.FILTERS["ValueExpander"] iterator = value_expander().Expand(plist, self.context) else: # If we didn't get a context, the context is the whole plist iterator = [plist] reply = protodict.RDFValueArray() for item in iterator: # As we're setting the context manually, we need to account for types if isinstance(item, types.ListType): for sub_item in item: partial_plist = plist_lib.PlistValueToPlainValue(sub_item) if matcher.Matches(partial_plist): reply.Append(sub_item) else: partial_plist = plist_lib.PlistValueToPlainValue(item) if matcher.Matches(partial_plist): reply.Append(partial_plist) self.SendReply(reply) grr-3.1.0.2/grr/client/client_actions/plist_test.py000066400000000000000000000103741273104013200222550ustar00rootroot00000000000000#!/usr/bin/env python # -*- mode: python; encoding: utf-8 -*- # Copyright 2010 Google Inc. All Rights Reserved. """Tests for grr.client.client_actions.plist.""" import os # pylint: disable=unused-import from grr.client import client_plugins # pylint: enable=unused-import from grr.lib import flags from grr.lib import plist as plist_lib from grr.lib import test_lib from grr.lib.rdfvalues import paths as rdf_paths from grr.lib.rdfvalues import plist as rdf_plist # This variable holds the same contents as the ondisk test plist test_plist_dict = { "date": 978307200000000, "nested1": { "nested11": { "data113": "\xde\xad\xbe\xef", "key111": "value111", "key112": "value112" } }, "numbers": [1, "2", "3"] } # y Safari History plist safari_plist_dict = { "WebHistoryDates": [ {"": "http://www.google.com", "title": "Google", "lastVisited": "374606652.9", "visitCount": 2}, {"": "http://www.apple.com", "title": "Apple", "lastVisited": "374606652.9", "visitCount": 1}, ], "WebHistoryFileVersion": 1, } class PlistTest(test_lib.EmptyActionTest): def testParseFilter(self): queries = [ ('bla is "red"', True), ('bla.bla is "red"', True), ('bla."bla bliek" is "red"', True), ('bla.bla bliek is "red"', False), ] for query, result in queries: if result: plist_lib.PlistFilterParser(query).Parse() else: filter_parser = plist_lib.PlistFilterParser(query) self.assertRaises(Exception, filter_parser.Parse) def testMatches(self): query = '"nested1"."nested11"."key112" contains "value112"' parser = plist_lib.PlistFilterParser(query).Parse() matcher = parser.Compile(plist_lib.PlistFilterImplementation) self.assertEqual(matcher.Matches(test_plist_dict), True) def testActionFullRetrievalOfAPlist(self): results = self._RunQuery(query="", context="") if not results: raise Exception("no results were found...") self.assertDictEqual(results[0][0].ToDict(), test_plist_dict) def testActionSingleValueRetrieval(self): results = self._RunQuery(query="", context="date") if not results: raise Exception("no results were found...") self.assertEqual(results[0][0], 978307200000000) def testActionFilteredValueRetrieval(self): # Numbers does NOT contain a 2, but a "2", this should return nothing results = self._RunQuery(query="numbers contains 2", context="") self.assertListEqual(list(list(results)[0]), []) # This one should return the full dict results = self._RunQuery(query="numbers contains '2'", context="") self.assertEqual(results[0][0], test_plist_dict) # SAFARI PLIST results = self._RunQuery(plist="History.plist", query='title contains "oogle"', context="WebHistoryDates") self.assertEqual(results[0][0], safari_plist_dict["WebHistoryDates"][0]) # And now SAFARI XML results = self._RunQuery(plist="History.xml.plist", query='title contains "oogle"', context="WebHistoryDates") self.assertEqual(results[0][0], safari_plist_dict["WebHistoryDates"][0]) def testActionNonexistantFile(self): self.assertRaises(IOError, self._RunQuery, query="", context="", plist="nonexistantfile") def testActionInvalidFile(self): self.assertRaises(Exception, self._RunQuery, query="", context="", plist="History") def _RunQuery(self, plist="test.plist", query="", context=""): path = os.path.join(self.base_path, plist) pathspec = rdf_paths.PathSpec(path=path, pathtype=rdf_paths.PathSpec.PathType.OS) plistrequest = rdf_plist.PlistRequest() plistrequest.query = query plistrequest.context = context plistrequest.pathspec = pathspec return self.RunAction("PlistQuery", plistrequest) def main(argv): test_lib.main(argv) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/client/client_actions/searching.py000066400000000000000000000300771273104013200220300ustar00rootroot00000000000000#!/usr/bin/env python """Client actions related to searching files and directories.""" import functools import stat import logging from grr.client import actions from grr.client import vfs from grr.lib import utils from grr.lib.rdfvalues import client as rdf_client from grr.lib.rdfvalues import flows as rdf_flows class Find(actions.IteratedAction): """Recurses through a directory returning files which match conditions.""" in_rdfvalue = rdf_client.FindSpec out_rdfvalues = [rdf_client.FindSpec] # If this is true we cross filesystem boundaries. # This defaults to true so you can see mountpoints with ListDirectory. # It defaults to false in the actual find flow, and the find proto. cross_devs = True # The filesystem we are limiting ourselves to, if cross_devs is false. filesystem_id = None def ListDirectory(self, pathspec, state, depth=0): """A Recursive generator of files.""" # Limit recursion depth if depth >= self.request.max_depth: return try: fd = vfs.VFSOpen(pathspec, progress_callback=self.Progress) files = fd.ListFiles() except (IOError, OSError) as e: if depth == 0: # We failed to open the directory the server asked for because dir # doesn't exist or some other reason. So we set status and return # back to the caller ending the Iterator. self.SetStatus(rdf_flows.GrrStatus.ReturnedStatus.IOERROR, e) else: # Can't open the directory we're searching, ignore the directory. logging.info("Find failed to ListDirectory for %s. Err: %s", pathspec, e) return # If we are not supposed to cross devices, and don't know yet # which device we are on, we need to find out. if not self.request.cross_devs and self.filesystem_id is None: dir_stat = fd.Stat() self.filesystem_id = dir_stat.st_dev # Recover the start point for this directory from the state dict so we can # resume. start = state.get(pathspec.CollapsePath(), 0) for i, file_stat in enumerate(files): # Skip the files we already did before if i < start: continue if stat.S_ISDIR(file_stat.st_mode): # Do not traverse directories in a different filesystem. if self.request.cross_devs or self.filesystem_id == file_stat.st_dev: for child_stat in self.ListDirectory(file_stat.pathspec, state, depth + 1): yield child_stat state[pathspec.CollapsePath()] = i + 1 yield file_stat # Now remove this from the state dict to prevent it from getting too large try: del state[pathspec.CollapsePath()] except KeyError: pass def TestFileContent(self, file_stat): """Checks the file for the presence of the regular expression.""" # Content regex check try: data = "" with vfs.VFSOpen(file_stat.pathspec, progress_callback=self.Progress) as fd: # Only read this much data from the file. while fd.Tell() < self.request.max_data: data_read = fd.read(1024000) if not data_read: break data += data_read # Got it. if self.request.data_regex.Search(data): return True # Keep a bit of context from the last buffer to ensure we dont miss a # match broken by buffer. We do not expect regex's to match something # larger than about 100 chars. data = data[-100:] except (IOError, KeyError): pass return False def BuildChecks(self, request): """Parses request and returns a list of filter callables. Each callable will be called with the StatEntry and returns True if the entry should be suppressed. Args: request: A FindSpec that describes the search. Returns: a list of callables which return True if the file is to be suppressed. """ result = [] if request.HasField("start_time") or request.HasField("end_time"): def FilterTimestamp(file_stat, request=request): return file_stat.HasField("st_mtime") and ( file_stat.st_mtime < request.start_time or file_stat.st_mtime > request.end_time) result.append(FilterTimestamp) if request.HasField("min_file_size") or request.HasField("max_file_size"): def FilterSize(file_stat, request=request): return file_stat.HasField("st_size") and ( file_stat.st_size < request.min_file_size or file_stat.st_size > request.max_file_size) result.append(FilterSize) if request.HasField("perm_mode"): def FilterPerms(file_stat, request=request): return (file_stat.st_mode & request.perm_mask) != request.perm_mode result.append(FilterPerms) if request.HasField("uid"): def FilterUID(file_stat, request=request): return file_stat.st_uid != request.uid result.append(FilterUID) if request.HasField("gid"): def FilterGID(file_stat, request=request): return file_stat.st_gid != request.gid result.append(FilterGID) if request.HasField("path_regex"): regex = request.path_regex def FilterPath(file_stat, regex=regex): """Suppress any filename not matching the regular expression.""" return not regex.Search(file_stat.pathspec.Basename()) result.append(FilterPath) if request.HasField("data_regex"): def FilterData(file_stat, **_): """Suppress files that do not match the content.""" return not self.TestFileContent(file_stat) result.append(FilterData) return result def Iterate(self, request, client_state): """Restores its way through the directory using an Iterator.""" self.request = request filters = self.BuildChecks(request) limit = request.iterator.number # TODO(user): What is a reasonable measure of work here? for count, f in enumerate(self.ListDirectory(request.pathspec, client_state)): self.Progress() # Ignore this file if any of the checks fail. if not any((check(f) for check in filters)): self.SendReply(rdf_client.FindSpec(hit=f)) # We only check a limited number of files in each iteration. This might # result in returning an empty response - but the iterator is not yet # complete. Flows must check the state of the iterator explicitly. if count >= limit - 1: logging.debug("Processed %s entries, quitting", count) return # End this iterator request.iterator.state = rdf_client.Iterator.State.FINISHED class Grep(actions.ActionPlugin): """Search a file for a pattern.""" in_rdfvalue = rdf_client.GrepSpec out_rdfvalues = [rdf_client.BufferReference] def FindRegex(self, regex, data): """Search the data for a hit.""" for match in regex.FindIter(data): yield (match.start(), match.end()) def FindLiteral(self, pattern, data): """Search the data for a hit.""" utils.XorByteArray(pattern, self.xor_in_key) offset = 0 while 1: # We assume here that data.find does not make a copy of pattern. offset = data.find(pattern, offset) if offset < 0: break yield (offset, offset + len(pattern)) offset += 1 utils.XorByteArray(pattern, self.xor_in_key) BUFF_SIZE = 1024 * 1024 * 10 ENVELOPE_SIZE = 1000 HIT_LIMIT = 10000 def Run(self, args): """Search the file for the pattern. This implements the grep algorithm used to scan files. It reads the data in chunks of BUFF_SIZE (10 MB currently) and can use different functions to search for matching patterns. In every step, a buffer that is a bit bigger than the block size is used in order to return all the requested results. Specifically, a preamble is used in order to not miss any patterns that start in one block of data and end in the next and also a postscript buffer is kept such that the algorithm can return bytes trailing the pattern even if the pattern is at the end of one block. One block: ----------------------------- | Pre | Data | Post | ----------------------------- Searching the pattern is done here: <-------------------> The following block is constructed like this: ----------------------------- | Pre | Data | Post | ----------------------------- | ----------------------------- | Pre | Data | Post | ----------------------------- The preamble is filled from Data so every hit that happens to fall entirely into the preamble has to be discarded since it has already been discovered in the step before. Grepping for memory If this action is used to grep the memory of a client machine using one of the GRR memory acquisition drivers, we have to be very careful not to have any hits in the GRR process memory space itself. Therefore, if the input is a literal, it is XOR encoded and only visible in memory when the pattern is matched. This is done using bytearrays which guarantees in place updates and no leaking patterns. Also the returned data is encoded using a different XOR 'key'. This should guarantee that there are no hits when the pattern is not present in memory. However, since the data will be copied to the preamble and the postscript, a single pattern might in some cases produce multiple hits. Args: args: A protobuf describing the grep request. Raises: RuntimeError: No search pattern has been given in the request. """ fd = vfs.VFSOpen(args.target, progress_callback=self.Progress) fd.Seek(args.start_offset) base_offset = args.start_offset self.xor_in_key = args.xor_in_key self.xor_out_key = args.xor_out_key if args.regex: find_func = functools.partial(self.FindRegex, args.regex) elif args.literal: find_func = functools.partial(self.FindLiteral, bytearray(utils.SmartStr(args.literal))) else: raise RuntimeError("Grep needs a regex or a literal.") preamble_size = 0 postscript_size = 0 hits = 0 data = "" while fd.Tell() < args.start_offset + args.length: # Base size to read is at most the buffer size. to_read = min(args.length, self.BUFF_SIZE, args.start_offset + args.length - fd.Tell()) # Read some more data for the snippet. to_read += self.ENVELOPE_SIZE - postscript_size read_data = fd.Read(to_read) data = data[-postscript_size - self.ENVELOPE_SIZE:] + read_data postscript_size = max(0, self.ENVELOPE_SIZE - (to_read - len(read_data))) data_size = len(data) - preamble_size - postscript_size if data_size == 0 and postscript_size == 0: break for (start, end) in find_func(data): # Ignore hits in the preamble. if end <= preamble_size: continue # Ignore hits in the postscript. if end > preamble_size + data_size: continue # Offset of file in the end after length. if end + base_offset - preamble_size > args.start_offset + args.length: break out_data = "" for i in xrange( max(0, start - args.bytes_before), min(len(data), end + args.bytes_after)): # pyformat: disable out_data += chr(ord(data[i]) ^ self.xor_out_key) hits += 1 self.SendReply(offset=base_offset + start - preamble_size, data=out_data, length=len(out_data), pathspec=fd.pathspec) if args.mode == rdf_client.GrepSpec.Mode.FIRST_HIT: return if hits >= self.HIT_LIMIT: msg = utils.Xor("This Grep has reached the maximum number of hits" " (%d)." % self.HIT_LIMIT, self.xor_out_key) self.SendReply(offset=0, data=msg, length=len(msg)) return self.Progress() base_offset += data_size # Allow for overlap with previous matches. preamble_size = min(len(data), self.ENVELOPE_SIZE) grr-3.1.0.2/grr/client/client_actions/searching_test.py000066400000000000000000000675721273104013200231010ustar00rootroot00000000000000#!/usr/bin/env python # -*- mode: python; encoding: utf-8 -*- """Test client vfs.""" import functools import os from grr.client import vfs from grr.client.client_actions import searching from grr.lib import flags from grr.lib import test_lib from grr.lib import utils from grr.lib.rdfvalues import client as rdf_client from grr.lib.rdfvalues import paths as rdf_paths class MockVFSHandlerFind(vfs.VFSHandler): """A mock VFS handler for finding files. This is used to create the /mock2/ client vfs branch which is utilized in the below tests. """ supported_pathtype = rdf_paths.PathSpec.PathType.OS filesystem = {"/": ["mock2"], "/mock2": ["directory1", "directory3"], "/mock2/directory1": ["file1.txt", "file2.txt", "directory2"], "/mock2/directory1/file1.txt": "Secret 1", "/mock2/directory1/file2.txt": "Another file", "/mock2/directory1/directory2": ["file.jpg", "file.mp3"], "/mock2/directory1/directory2/file.jpg": "JPEG", "/mock2/directory1/directory2/file.mp3": "MP3 movie", "/mock2/directory3": ["file1.txt", "long_file.text"], "/mock2/directory3/file1.txt": "A text file", "/mock2/directory3/long_file.text": ( "space " * 100000 + "A Secret")} def __init__(self, base_fd, pathspec=None, progress_callback=None, full_pathspec=None): super(MockVFSHandlerFind, self).__init__( base_fd, pathspec=pathspec, progress_callback=progress_callback, full_pathspec=full_pathspec) self.pathspec.Append(pathspec) self.path = self.pathspec.CollapsePath() try: self.content = self.filesystem[self.path] if isinstance(self.content, str): self.size = len(self.content) except KeyError: raise IOError("not mocking %s" % self.path) def Read(self, length): # Reading the mocked directory raises. if isinstance(self.content, list): raise IOError() result = self.content[self.offset:self.offset + length] self.offset = min(self.size, self.offset + len(result)) return result def ListNames(self): return self.content def DoStat(self, path): result = rdf_client.StatEntry() if path.startswith("/mock2/directory3"): result.st_dev = 1 else: result.st_dev = 2 f = self.filesystem[path] if isinstance(f, str): if path.startswith("/mock2/directory1/directory2"): result.st_mode = 0o0100644 # u=rw,g=r,o=r on regular file result.st_uid = 50 result.st_gid = 500 elif path.startswith("/mock2/directory3"): result.st_mode = 0o0100643 # u=rw,g=r,o=wx on regular file result.st_uid = 60 result.st_gid = 600 else: result.st_mode = 0o0104666 # setuid, u=rw,g=rw,o=rw on regular file result.st_uid = 90 result.st_gid = 900 else: result.st_mode = 0o0040775 # u=rwx,g=rwx,o=rx on directory result.st_uid = 0 result.st_gid = 4 result.st_size = len(f) result.st_mtime = 1373185602 return result def ListFiles(self): """Mock the filesystem.""" for child in self.content: # We have a mock FS here that only uses "/". path = "/".join([self.path, child]) result = self.DoStat(path) ps = self.pathspec.Copy() ps.Append(path=child, pathtype=self.supported_pathtype) result.pathspec = ps yield result def IsDirectory(self): return bool(self.content) def Stat(self): result = self.DoStat(self.path) result.pathspec = self.pathspec return result def SearchParams(block_size, envelope_size): def Decorator(func): @functools.wraps(func) def _SearchParams(*args, **kwargs): """Wrapper function that sets and restores search parameters.""" old_sizes = (searching.Grep.BUFF_SIZE, searching.Grep.ENVELOPE_SIZE) searching.Grep.BUFF_SIZE = block_size searching.Grep.ENVELOPE_SIZE = envelope_size try: return func(*args, **kwargs) finally: searching.Grep.BUFF_SIZE, searching.Grep.ENVELOPE_SIZE = old_sizes return _SearchParams return Decorator class FindTest(test_lib.EmptyActionTest): """Test the find client Actions.""" def setUp(self): super(FindTest, self).setUp() # Install the mock self.vfs_overrider = test_lib.VFSOverrider(rdf_paths.PathSpec.PathType.OS, MockVFSHandlerFind) self.vfs_overrider.Start() def tearDown(self): super(FindTest, self).tearDown() self.vfs_overrider.Stop() def testFindAction(self): """Test the find action.""" # First get all the files at once pathspec = rdf_paths.PathSpec(path="/mock2/", pathtype=rdf_paths.PathSpec.PathType.OS) request = rdf_client.FindSpec(pathspec=pathspec, path_regex=".") request.iterator.number = 200 result = self.RunAction("Find", request) all_files = [x.hit for x in result if isinstance(x, rdf_client.FindSpec)] # Ask for the files one at the time files = [] request = rdf_client.FindSpec(pathspec=pathspec, path_regex=".") request.iterator.number = 1 while True: result = self.RunAction("Find", request) if request.iterator.state == rdf_client.Iterator.State.FINISHED: break self.assertEqual(len(result), 2) self.assertTrue(isinstance(result[0], rdf_client.FindSpec)) self.assertTrue(isinstance(result[1], rdf_client.Iterator)) files.append(result[0].hit) request.iterator = result[1].Copy() for x, y in zip(all_files, files): self.assertRDFValuesEqual(x, y) # Make sure the iterator is finished self.assertEqual(request.iterator.state, rdf_client.Iterator.State.FINISHED) # Ensure we remove old states from client_state self.assertEqual(len(request.iterator.client_state.dat), 0) def testFindAction2(self): """Test the find action path regex.""" pathspec = rdf_paths.PathSpec(path="/mock2/", pathtype=rdf_paths.PathSpec.PathType.OS) request = rdf_client.FindSpec(pathspec=pathspec, path_regex=".*mp3") request.iterator.number = 200 result = self.RunAction("Find", request) all_files = [x.hit for x in result if isinstance(x, rdf_client.FindSpec)] self.assertEqual(len(all_files), 1) self.assertEqual(all_files[0].pathspec.Basename(), "file.mp3") def testFindAction3(self): """Test the find action data regex.""" # First get all the files at once pathspec = rdf_paths.PathSpec(path="/mock2/", pathtype=rdf_paths.PathSpec.PathType.OS) request = rdf_client.FindSpec(pathspec=pathspec, data_regex="Secret", cross_devs=True) request.iterator.number = 200 result = self.RunAction("Find", request) all_files = [x.hit for x in result if isinstance(x, rdf_client.FindSpec)] self.assertEqual(len(all_files), 2) self.assertEqual(all_files[0].pathspec.Basename(), "file1.txt") self.assertEqual(all_files[1].pathspec.Basename(), "long_file.text") def testFindSizeLimits(self): """Test the find action size limits.""" # First get all the files at once request = rdf_client.FindSpec(min_file_size=4, max_file_size=15, cross_devs=True) request.pathspec.Append(path="/mock2/", pathtype=rdf_paths.PathSpec.PathType.OS) request.iterator.number = 200 results = self.RunAction("Find", request) all_files = [] for result in results: if isinstance(result, rdf_client.FindSpec): all_files.append(result.hit.pathspec.Basename()) self.assertEqual(len(all_files), 5) for filename in all_files: # Our mock filesize is the length of the base filename, check all the # files we got match the size criteria self.assertTrue(4 <= len(filename) <= 15) def testNoFilters(self): """Test the we get all files with no filters in place.""" # First get all the files at once pathspec = rdf_paths.PathSpec(path="/mock2/", pathtype=rdf_paths.PathSpec.PathType.OS) request = rdf_client.FindSpec(pathspec=pathspec, cross_devs=True) request.iterator.number = 200 result = self.RunAction("Find", request) all_files = [x.hit for x in result if isinstance(x, rdf_client.FindSpec)] self.assertEqual(len(all_files), 9) def testFindActionCrossDev(self): """Test that devices boundaries don't get crossed, also by default.""" pathspec = rdf_paths.PathSpec(path="/mock2/", pathtype=rdf_paths.PathSpec.PathType.OS) request = rdf_client.FindSpec(pathspec=pathspec, cross_devs=True, path_regex=".") request.iterator.number = 200 results = self.RunAction("Find", request) all_files = [x.hit for x in results if isinstance(x, rdf_client.FindSpec)] self.assertEqual(len(all_files), 9) request = rdf_client.FindSpec(pathspec=pathspec, cross_devs=False, path_regex=".") request.iterator.number = 200 results = self.RunAction("Find", request) all_files = [x.hit for x in results if isinstance(x, rdf_client.FindSpec)] self.assertEqual(len(all_files), 7) request = rdf_client.FindSpec(pathspec=pathspec, path_regex=".") request.iterator.number = 200 results = self.RunAction("Find", request) all_files = [x.hit for x in results if isinstance(x, rdf_client.FindSpec)] self.assertEqual(len(all_files), 7) def testPermissionFilter(self): """Test filtering based on file/folder permission happens correctly.""" pathspec = rdf_paths.PathSpec(path="/mock2/", pathtype=rdf_paths.PathSpec.PathType.OS) # Look for files that match exact permissions request = rdf_client.FindSpec(pathspec=pathspec, path_regex=".", perm_mode=0o644, cross_devs=True) request.iterator.number = 200 result = self.RunAction("Find", request) all_files = [x.hit for x in result if isinstance(x, rdf_client.FindSpec)] self.assertEqual(len(all_files), 2) self.assertEqual(all_files[0].pathspec.Dirname().Basename(), "directory2") self.assertEqual(all_files[0].pathspec.Basename(), "file.jpg") self.assertEqual(all_files[1].pathspec.Dirname().Basename(), "directory2") self.assertEqual(all_files[1].pathspec.Basename(), "file.mp3") # Look for files/folders where 'others' have 'write' permission. All other # attributes don't matter. Setuid bit must also be set and guid or sticky # bit must not be set. request = rdf_client.FindSpec(pathspec=pathspec, path_regex=".", perm_mode=0o4002, perm_mask=0o7002, cross_devs=True) request.iterator.number = 200 result = self.RunAction("Find", request) all_files = [x.hit for x in result if isinstance(x, rdf_client.FindSpec)] self.assertEqual(len(all_files), 2) self.assertEqual(all_files[0].pathspec.Dirname().Basename(), "directory1") self.assertEqual(all_files[0].pathspec.Basename(), "file1.txt") self.assertEqual(all_files[1].pathspec.Dirname().Basename(), "directory1") self.assertEqual(all_files[1].pathspec.Basename(), "file2.txt") # Look for files where 'others' have 'execute' permission. All other # attributes don't matter. Only look for 'regular' files. request = rdf_client.FindSpec(pathspec=pathspec, path_regex=".", perm_mode=0o0100001, perm_mask=0o0100001, cross_devs=True) request.iterator.number = 200 result = self.RunAction("Find", request) all_files = [x.hit for x in result if isinstance(x, rdf_client.FindSpec)] self.assertEqual(len(all_files), 2) self.assertEqual(all_files[0].pathspec.Dirname().Basename(), "directory3") self.assertEqual(all_files[0].pathspec.Basename(), "file1.txt") self.assertEqual(all_files[1].pathspec.Dirname().Basename(), "directory3") self.assertEqual(all_files[1].pathspec.Basename(), "long_file.text") # Look for folders where 'group' have 'execute' permission. All other # attributes don't matter. Only look for folders. request = rdf_client.FindSpec(pathspec=pathspec, path_regex=".", perm_mode=0o0040010, perm_mask=0o0040010, cross_devs=True) request.iterator.number = 200 result = self.RunAction("Find", request) all_files = [x.hit for x in result if isinstance(x, rdf_client.FindSpec)] self.assertEqual(len(all_files), 3) self.assertEqual(all_files[0].pathspec.Basename(), "directory2") self.assertEqual(all_files[1].pathspec.Basename(), "directory1") self.assertEqual(all_files[2].pathspec.Basename(), "directory3") def testUIDFilter(self): """Test filtering based on uid happens correctly.""" pathspec = rdf_paths.PathSpec(path="/mock2/", pathtype=rdf_paths.PathSpec.PathType.OS) # Look for files that have uid of 60 request = rdf_client.FindSpec(pathspec=pathspec, path_regex=".", uid=60, cross_devs=True) request.iterator.number = 200 result = self.RunAction("Find", request) all_files = [x.hit for x in result if isinstance(x, rdf_client.FindSpec)] self.assertEqual(len(all_files), 2) self.assertEqual(all_files[0].pathspec.Dirname().Basename(), "directory3") self.assertEqual(all_files[0].pathspec.Basename(), "file1.txt") self.assertEqual(all_files[1].pathspec.Dirname().Basename(), "directory3") self.assertEqual(all_files[1].pathspec.Basename(), "long_file.text") # Look for files that have uid of 0 request = rdf_client.FindSpec(pathspec=pathspec, path_regex=".", uid=0, cross_devs=True) request.iterator.number = 200 result = self.RunAction("Find", request) all_files = [x.hit for x in result if isinstance(x, rdf_client.FindSpec)] self.assertEqual(len(all_files), 3) self.assertEqual(all_files[0].pathspec.Basename(), "directory2") self.assertEqual(all_files[1].pathspec.Basename(), "directory1") self.assertEqual(all_files[2].pathspec.Basename(), "directory3") def testGIDFilter(self): """Test filtering based on gid happens correctly.""" pathspec = rdf_paths.PathSpec(path="/mock2/", pathtype=rdf_paths.PathSpec.PathType.OS) # Look for files that have gid of 500 request = rdf_client.FindSpec(pathspec=pathspec, path_regex=".", gid=500, cross_devs=True) request.iterator.number = 200 result = self.RunAction("Find", request) all_files = [x.hit for x in result if isinstance(x, rdf_client.FindSpec)] self.assertEqual(len(all_files), 2) self.assertEqual(all_files[0].pathspec.Dirname().Basename(), "directory2") self.assertEqual(all_files[0].pathspec.Basename(), "file.jpg") self.assertEqual(all_files[1].pathspec.Dirname().Basename(), "directory2") self.assertEqual(all_files[1].pathspec.Basename(), "file.mp3") # Look for files that have uid of 900 request = rdf_client.FindSpec(pathspec=pathspec, path_regex=".", gid=900, cross_devs=True) request.iterator.number = 200 result = self.RunAction("Find", request) all_files = [x.hit for x in result if isinstance(x, rdf_client.FindSpec)] self.assertEqual(len(all_files), 2) self.assertEqual(all_files[0].pathspec.Dirname().Basename(), "directory1") self.assertEqual(all_files[0].pathspec.Basename(), "file1.txt") self.assertEqual(all_files[1].pathspec.Dirname().Basename(), "directory1") self.assertEqual(all_files[1].pathspec.Basename(), "file2.txt") def testUIDAndGIDFilter(self): """Test filtering based on combination of uid and gid happens correctly.""" pathspec = rdf_paths.PathSpec(path="/mock2/", pathtype=rdf_paths.PathSpec.PathType.OS) # Look for files that have uid of 90 and gid of 500 request = rdf_client.FindSpec(pathspec=pathspec, path_regex=".", uid=90, gid=500, cross_devs=True) request.iterator.number = 200 result = self.RunAction("Find", request) all_files = [x.hit for x in result if isinstance(x, rdf_client.FindSpec)] self.assertEqual(len(all_files), 0) # Look for files that have uid of 50 and gid of 500 request = rdf_client.FindSpec(pathspec=pathspec, path_regex=".", uid=50, gid=500, cross_devs=True) request.iterator.number = 200 result = self.RunAction("Find", request) all_files = [x.hit for x in result if isinstance(x, rdf_client.FindSpec)] self.assertEqual(len(all_files), 2) self.assertEqual(all_files[0].pathspec.Dirname().Basename(), "directory2") self.assertEqual(all_files[0].pathspec.Basename(), "file.jpg") self.assertEqual(all_files[1].pathspec.Dirname().Basename(), "directory2") self.assertEqual(all_files[1].pathspec.Basename(), "file.mp3") class GrepTest(test_lib.EmptyActionTest): """Test the find client Actions.""" XOR_IN_KEY = 0 XOR_OUT_KEY = 0 def setUp(self): super(GrepTest, self).setUp() # Install the mock self.vfs_overrider = test_lib.VFSOverrider(rdf_paths.PathSpec.PathType.OS, MockVFSHandlerFind) self.vfs_overrider.Start() self.filename = "/mock2/directory1/grepfile.txt" def tearDown(self): super(GrepTest, self).tearDown() self.vfs_overrider.Stop() def testGrep(self): # Use the real file system. vfs.VFSInit().Run() request = rdf_client.GrepSpec(literal=utils.Xor("10", self.XOR_IN_KEY), xor_in_key=self.XOR_IN_KEY, xor_out_key=self.XOR_OUT_KEY) request.target.path = os.path.join(self.base_path, "numbers.txt") request.target.pathtype = rdf_paths.PathSpec.PathType.OS request.start_offset = 0 result = self.RunAction("Grep", request) hits = [x.offset for x in result] self.assertEqual(hits, [18, 288, 292, 296, 300, 304, 308, 312, 316, 320, 324, 329, 729, 1129, 1529, 1929, 2329, 2729, 3129, 3529, 3888]) for x in result: self.assertTrue("10" in utils.Xor(x.data, self.XOR_OUT_KEY)) self.assertEqual(request.target.path, x.pathspec.path) def testGrepRegex(self): # Use the real file system. vfs.VFSInit().Run() request = rdf_client.GrepSpec( regex="1[0]", xor_out_key=self.XOR_OUT_KEY, start_offset=0, target=rdf_paths.PathSpec( path=os.path.join(self.base_path, "numbers.txt"), pathtype=rdf_paths.PathSpec.PathType.OS)) result = self.RunAction("Grep", request) hits = [x.offset for x in result] self.assertEqual(hits, [18, 288, 292, 296, 300, 304, 308, 312, 316, 320, 324, 329, 729, 1129, 1529, 1929, 2329, 2729, 3129, 3529, 3888]) for x in result: self.assertTrue("10" in utils.Xor(x.data, self.XOR_OUT_KEY)) def testGrepLength(self): data = "X" * 100 + "HIT" MockVFSHandlerFind.filesystem[self.filename] = data request = rdf_client.GrepSpec(literal=utils.Xor("HIT", self.XOR_IN_KEY), xor_in_key=self.XOR_IN_KEY, xor_out_key=self.XOR_OUT_KEY) request.target.path = self.filename request.target.pathtype = rdf_paths.PathSpec.PathType.OS request.start_offset = 0 result = self.RunAction("Grep", request) self.assertEqual(len(result), 1) self.assertEqual(result[0].offset, 100) request = rdf_client.GrepSpec(literal=utils.Xor("HIT", self.XOR_IN_KEY), xor_in_key=self.XOR_IN_KEY, xor_out_key=self.XOR_OUT_KEY) request.target.path = self.filename request.target.pathtype = rdf_paths.PathSpec.PathType.OS request.start_offset = 0 request.length = 100 result = self.RunAction("Grep", request) self.assertEqual(len(result), 0) def testGrepOffset(self): data = "X" * 10 + "HIT" + "X" * 100 MockVFSHandlerFind.filesystem[self.filename] = data request = rdf_client.GrepSpec(literal=utils.Xor("HIT", self.XOR_IN_KEY), xor_in_key=self.XOR_IN_KEY, xor_out_key=self.XOR_OUT_KEY) request.target.path = self.filename request.target.pathtype = rdf_paths.PathSpec.PathType.OS request.start_offset = 0 result = self.RunAction("Grep", request) self.assertEqual(len(result), 1) self.assertEqual(result[0].offset, 10) request = rdf_client.GrepSpec(literal=utils.Xor("HIT", self.XOR_IN_KEY), xor_in_key=self.XOR_IN_KEY, xor_out_key=self.XOR_OUT_KEY) request.target.path = self.filename request.target.pathtype = rdf_paths.PathSpec.PathType.OS request.start_offset = 5 result = self.RunAction("Grep", request) self.assertEqual(len(result), 1) # This should still report 10. self.assertEqual(result[0].offset, 10) request = rdf_client.GrepSpec(literal=utils.Xor("HIT", self.XOR_IN_KEY), xor_in_key=self.XOR_IN_KEY, xor_out_key=self.XOR_OUT_KEY) request.target.path = self.filename request.target.pathtype = rdf_paths.PathSpec.PathType.OS request.start_offset = 11 result = self.RunAction("Grep", request) self.assertEqual(len(result), 0) def testOffsetAndLength(self): data = "X" * 10 + "HIT" + "X" * 100 + "HIT" + "X" * 10 MockVFSHandlerFind.filesystem[self.filename] = data request = rdf_client.GrepSpec(literal=utils.Xor("HIT", self.XOR_IN_KEY), xor_in_key=self.XOR_IN_KEY, xor_out_key=self.XOR_OUT_KEY) request.target.path = self.filename request.target.pathtype = rdf_paths.PathSpec.PathType.OS request.start_offset = 11 request.length = 100 result = self.RunAction("Grep", request) self.assertEqual(len(result), 0) @SearchParams(1000, 100) def testSecondBuffer(self): data = "X" * 1500 + "HIT" + "X" * 100 MockVFSHandlerFind.filesystem[self.filename] = data request = rdf_client.GrepSpec(literal=utils.Xor("HIT", self.XOR_IN_KEY), xor_in_key=self.XOR_IN_KEY, xor_out_key=self.XOR_OUT_KEY) request.target.path = self.filename request.target.pathtype = rdf_paths.PathSpec.PathType.OS request.start_offset = 0 result = self.RunAction("Grep", request) self.assertEqual(len(result), 1) self.assertEqual(result[0].offset, 1500) @SearchParams(1000, 100) def testBufferBoundaries(self): for offset in xrange(-20, 20): data = "X" * (1000 + offset) + "HIT" + "X" * 100 MockVFSHandlerFind.filesystem[self.filename] = data request = rdf_client.GrepSpec(literal=utils.Xor("HIT", self.XOR_IN_KEY), xor_in_key=self.XOR_IN_KEY, xor_out_key=self.XOR_OUT_KEY) request.target.path = self.filename request.target.pathtype = rdf_paths.PathSpec.PathType.OS request.start_offset = 0 result = self.RunAction("Grep", request) self.assertEqual(len(result), 1) self.assertEqual(result[0].offset, 1000 + offset) expected = "X" * 10 + "HIT" + "X" * 10 self.assertEqual(result[0].length, len(expected)) self.assertEqual(utils.Xor(result[0].data, self.XOR_OUT_KEY), expected) def testSnippetSize(self): data = "X" * 100 + "HIT" + "X" * 100 MockVFSHandlerFind.filesystem[self.filename] = data for before in [50, 10, 1, 0]: for after in [50, 10, 1, 0]: request = rdf_client.GrepSpec(literal=utils.Xor("HIT", self.XOR_IN_KEY), xor_in_key=self.XOR_IN_KEY, xor_out_key=self.XOR_OUT_KEY) request.target.path = self.filename request.target.pathtype = rdf_paths.PathSpec.PathType.OS request.start_offset = 0 request.bytes_before = before request.bytes_after = after result = self.RunAction("Grep", request) self.assertEqual(len(result), 1) self.assertEqual(result[0].offset, 100) expected = "X" * before + "HIT" + "X" * after self.assertEqual(result[0].length, len(expected)) self.assertEqual(utils.Xor(result[0].data, self.XOR_OUT_KEY), expected) @SearchParams(100, 50) def testGrepEverywhere(self): for offset in xrange(500): data = "X" * offset + "HIT" + "X" * (500 - offset) MockVFSHandlerFind.filesystem[self.filename] = data request = rdf_client.GrepSpec(literal=utils.Xor("HIT", self.XOR_IN_KEY), xor_in_key=self.XOR_IN_KEY, xor_out_key=self.XOR_OUT_KEY) request.target.path = self.filename request.target.pathtype = rdf_paths.PathSpec.PathType.OS request.start_offset = 0 request.bytes_before = 10 request.bytes_after = 10 result = self.RunAction("Grep", request) self.assertEqual(len(result), 1) self.assertEqual(result[0].offset, offset) expected = data[max(0, offset - 10):offset + 3 + 10] self.assertEqual(result[0].length, len(expected)) self.assertEqual(utils.Xor(result[0].data, self.XOR_OUT_KEY), expected) def testHitLimit(self): limit = searching.Grep.HIT_LIMIT hit = "x" * 10 + "HIT" + "x" * 10 data = hit * (limit + 100) MockVFSHandlerFind.filesystem[self.filename] = data request = rdf_client.GrepSpec(literal=utils.Xor("HIT", self.XOR_IN_KEY), xor_in_key=self.XOR_IN_KEY, xor_out_key=self.XOR_OUT_KEY) request.target.path = self.filename request.target.pathtype = rdf_paths.PathSpec.PathType.OS request.start_offset = 0 request.bytes_before = 10 request.bytes_after = 10 result = self.RunAction("Grep", request) self.assertEqual(len(result), limit + 1) error = "maximum number of hits" self.assertTrue(error in utils.Xor(result[-1].data, self.XOR_OUT_KEY)) class XoredSearchingTest(GrepTest): """Test the searching client Actions using XOR.""" XOR_IN_KEY = 37 XOR_OUT_KEY = 57 class FindBenchmarks(test_lib.AverageMicroBenchmarks, test_lib.EmptyActionTest): REPEATS = 100 units = "us" def testFindAction(self): # First get all the files at once def RunFind(): pathspec = rdf_paths.PathSpec(path=self.base_path, pathtype=rdf_paths.PathSpec.PathType.OS) request = rdf_client.FindSpec(pathspec=pathspec) request.iterator.number = 80 result = self.RunAction("Find", request) # 80 results plus one iterator. self.assertEqual(len(result), 81) self.TimeIt(RunFind, "Find files with no filters.") def main(argv): test_lib.main(argv) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/client/client_actions/standard.py000066400000000000000000000552471273104013200216730ustar00rootroot00000000000000#!/usr/bin/env python """Standard actions that happen on the client.""" import cStringIO as StringIO import ctypes import gzip import hashlib import os import platform import socket import sys import time import zlib import psutil import logging from grr.client import actions from grr.client import client_utils_common from grr.client import vfs from grr.client.client_actions import tempfiles from grr.lib import config_lib from grr.lib import flags from grr.lib import rdfvalue from grr.lib import utils from grr.lib.rdfvalues import client as rdf_client from grr.lib.rdfvalues import crypto as rdf_crypto from grr.lib.rdfvalues import flows as rdf_flows from grr.lib.rdfvalues import paths as rdf_paths from grr.lib.rdfvalues import protodict as rdf_protodict # We do not send larger buffers than this: MAX_BUFFER_SIZE = 640 * 1024 class ReadBuffer(actions.ActionPlugin): """Reads a buffer from a file and returns it to a server callback.""" in_rdfvalue = rdf_client.BufferReference out_rdfvalues = [rdf_client.BufferReference] def Run(self, args): """Reads a buffer on the client and sends it to the server.""" # Make sure we limit the size of our output if args.length > MAX_BUFFER_SIZE: raise RuntimeError("Can not read buffers this large.") try: fd = vfs.VFSOpen(args.pathspec, progress_callback=self.Progress) fd.Seek(args.offset) offset = fd.Tell() data = fd.Read(args.length) except (IOError, OSError), e: self.SetStatus(rdf_flows.GrrStatus.ReturnedStatus.IOERROR, e) return # Now return the data to the server self.SendReply(offset=offset, data=data, length=len(data), pathspec=fd.pathspec) HASH_CACHE = utils.FastStore(100) class TransferBuffer(actions.ActionPlugin): """Reads a buffer from a file and returns it to the server efficiently.""" in_rdfvalue = rdf_client.BufferReference out_rdfvalues = [rdf_client.BufferReference] def Run(self, args): """Reads a buffer on the client and sends it to the server.""" # Make sure we limit the size of our output if args.length > MAX_BUFFER_SIZE: raise RuntimeError("Can not read buffers this large.") data = vfs.ReadVFS(args.pathspec, args.offset, args.length, progress_callback=self.Progress) result = rdf_protodict.DataBlob( data=zlib.compress(data), compression=rdf_protodict.DataBlob.CompressionType.ZCOMPRESSION) digest = hashlib.sha256(data).digest() # Ensure that the buffer is counted against this response. Check network # send limit. self.ChargeBytesToSession(len(data)) # Now return the data to the server into the special TransferStore well # known flow. self.grr_worker.SendReply( result, session_id=rdfvalue.SessionID(flow_name="TransferStore")) # Now report the hash of this blob to our flow as well as the offset and # length. self.SendReply(offset=args.offset, length=len(data), data=digest) class HashBuffer(actions.ActionPlugin): """Hash a buffer from a file and returns it to the server efficiently.""" in_rdfvalue = rdf_client.BufferReference out_rdfvalues = [rdf_client.BufferReference] def Run(self, args): """Reads a buffer on the client and sends it to the server.""" # Make sure we limit the size of our output if args.length > MAX_BUFFER_SIZE: raise RuntimeError("Can not read buffers this large.") data = vfs.ReadVFS(args.pathspec, args.offset, args.length) digest = hashlib.sha256(data).digest() # Now report the hash of this blob to our flow as well as the offset and # length. self.SendReply(offset=args.offset, length=len(data), data=digest) class HashFile(actions.ActionPlugin): """Hash an entire file using multiple algorithms.""" in_rdfvalue = rdf_client.FingerprintRequest out_rdfvalues = [rdf_client.FingerprintResponse] _hash_types = { "MD5": hashlib.md5, "SHA1": hashlib.sha1, "SHA256": hashlib.sha256, } def Run(self, args): hashers = {} for t in args.tuples: for hash_name in t.hashers: hashers[str(hash_name).lower()] = self._hash_types[str(hash_name)]() with vfs.VFSOpen(args.pathspec, progress_callback=self.Progress) as file_obj: # Only read as many bytes as we were told. bytes_read = 0 while bytes_read < args.max_filesize: self.Progress() to_read = min(MAX_BUFFER_SIZE, args.max_filesize - bytes_read) data = file_obj.Read(to_read) if not data: break for hasher in hashers.values(): hasher.update(data) bytes_read += len(data) response = rdf_client.FingerprintResponse( pathspec=file_obj.pathspec, bytes_read=bytes_read, hash=rdf_crypto.Hash(**dict((k, v.digest()) for k, v in hashers.iteritems()))) self.SendReply(response) class CopyPathToFile(actions.ActionPlugin): """Copy contents of a pathspec to a file on disk.""" in_rdfvalue = rdf_client.CopyPathToFileRequest out_rdfvalues = [rdf_client.CopyPathToFileRequest] BLOCK_SIZE = 10 * 1024 * 1024 def _Copy(self, src_fd, dest_fd, length): """Copy from VFS to file until no more data or length is reached. Args: src_fd: File object to read from. dest_fd: File object to write to. length: Number of bytes to write. Returns: Bytes written. """ written = 0 while written < length: to_read = min(length - written, self.BLOCK_SIZE) data = src_fd.read(to_read) if not data: break dest_fd.write(data) written += len(data) # Send heartbeats for long files. self.Progress() return written def Run(self, args): """Read from a VFS file and write to a GRRTempFile on disk. If file writing doesn't complete files won't be cleaned up. Args: args: see CopyPathToFile in jobs.proto """ src_fd = vfs.VFSOpen(args.src_path, progress_callback=self.Progress) src_fd.Seek(args.offset) offset = src_fd.Tell() length = args.length or (1024**4) # 1 TB suffix = ".gz" if args.gzip_output else "" dest_fd, dest_pathspec = tempfiles.CreateGRRTempFileVFS( directory=args.dest_dir, lifetime=args.lifetime, suffix=suffix) dest_file = dest_fd.name with dest_fd: if args.gzip_output: gzip_fd = gzip.GzipFile(dest_file, "wb", 9, dest_fd) # Gzip filehandle needs its own close method called with gzip_fd: written = self._Copy(src_fd, gzip_fd, length) else: written = self._Copy(src_fd, dest_fd, length) self.SendReply(offset=offset, length=written, src_path=args.src_path, dest_dir=args.dest_dir, dest_path=dest_pathspec, gzip_output=args.gzip_output) class ListDirectory(ReadBuffer): """Lists all the files in a directory.""" in_rdfvalue = rdf_client.ListDirRequest out_rdfvalues = [rdf_client.StatEntry] def Run(self, args): """Lists a directory.""" try: directory = vfs.VFSOpen(args.pathspec, progress_callback=self.Progress) except (IOError, OSError), e: self.SetStatus(rdf_flows.GrrStatus.ReturnedStatus.IOERROR, e) return files = list(directory.ListFiles()) files.sort(key=lambda x: x.pathspec.path) for response in files: self.SendReply(response) class DumpProcessMemory(actions.ActionPlugin): """This action creates a memory dump of a process.""" in_rdfvalue = rdf_client.DumpProcessMemoryRequest out_rdfvalues = [rdf_paths.PathSpec] class IteratedListDirectory(actions.IteratedAction): """Lists a directory as an iterator.""" in_rdfvalue = rdf_client.ListDirRequest out_rdfvalues = [rdf_client.StatEntry] def Iterate(self, request, client_state): """Restores its way through the directory using an Iterator.""" try: fd = vfs.VFSOpen(request.pathspec, progress_callback=self.Progress) except (IOError, OSError), e: self.SetStatus(rdf_flows.GrrStatus.ReturnedStatus.IOERROR, e) return files = list(fd.ListFiles()) files.sort(key=lambda x: x.pathspec.path) index = client_state.get("index", 0) length = request.iterator.number for response in files[index:index + length]: self.SendReply(response) # Update the state client_state["index"] = index + length class SuspendableListDirectory(actions.SuspendableAction): """Lists a directory as a suspendable client action.""" in_rdfvalue = rdf_client.ListDirRequest out_rdfvalues = [rdf_client.StatEntry] def Iterate(self): try: fd = vfs.VFSOpen(self.request.pathspec, progress_callback=self.Progress) except (IOError, OSError), e: self.SetStatus(rdf_flows.GrrStatus.ReturnedStatus.IOERROR, e) return length = self.request.iterator.number for group in utils.Grouper(fd.ListFiles(), length): for response in group: self.SendReply(response) self.Suspend() class StatFile(ListDirectory): """Sends a StatEntry for a single file.""" in_rdfvalue = rdf_client.ListDirRequest out_rdfvalues = [rdf_client.StatEntry] def Run(self, args): """Sends a StatEntry for a single file.""" try: fd = vfs.VFSOpen(args.pathspec, progress_callback=self.Progress) res = fd.Stat() self.SendReply(res) except (IOError, OSError), e: self.SetStatus(rdf_flows.GrrStatus.ReturnedStatus.IOERROR, e) return class ExecuteCommand(actions.ActionPlugin): """Executes one of the predefined commands.""" in_rdfvalue = rdf_client.ExecuteRequest out_rdfvalues = [rdf_client.ExecuteResponse] def Run(self, command): """Run.""" cmd = command.cmd args = command.args time_limit = command.time_limit res = client_utils_common.Execute(cmd, args, time_limit) (stdout, stderr, status, time_used) = res # Limit output to 10MB so our response doesn't get too big. stdout = stdout[:10 * 1024 * 1024] stderr = stderr[:10 * 1024 * 1024] result = rdf_client.ExecuteResponse(request=command, stdout=stdout, stderr=stderr, exit_status=status, # We have to return microseconds. time_used=int(1e6 * time_used)) self.SendReply(result) class ExecuteBinaryCommand(actions.ActionPlugin): """Executes a command from a passed in binary. Obviously this is a dangerous function, it provides for arbitrary code exec by the server running as root/SYSTEM. This is protected by the CONFIG[PrivateKeys.executable_signing_private_key], which should be stored offline and well protected. This method can be utilized as part of an autoupdate mechanism if necessary. NOTE: If the binary is too large to fit inside a single request, the request will have the more_data flag enabled, indicating more data is coming. """ in_rdfvalue = rdf_client.ExecuteBinaryRequest out_rdfvalues = [rdf_client.ExecuteBinaryResponse] def WriteBlobToFile(self, request): """Writes the blob to a file and returns its path.""" lifetime = 0 # Only set the lifetime thread on the last chunk written. if not request.more_data: lifetime = request.time_limit # Keep the file for at least 5 seconds after execution. if lifetime > 0: lifetime += 5 # First chunk truncates the file, later chunks append. if request.offset == 0: mode = "w+b" else: mode = "r+b" temp_file = tempfiles.CreateGRRTempFile(filename=request.write_path, mode=mode) with temp_file: path = temp_file.name temp_file.seek(0, 2) if temp_file.tell() != request.offset: raise IOError("Chunks out of order Error.") # Write the new chunk. temp_file.write(request.executable.data) return path def CleanUp(self, path): """Removes the temp file.""" try: if os.path.exists(path): os.remove(path) except (OSError, IOError), e: logging.info("Failed to remove temporary file %s. Err: %s", path, e) def Run(self, args): """Run.""" # Verify the executable blob. args.executable.Verify(config_lib.CONFIG[ "Client.executable_signing_public_key"]) path = self.WriteBlobToFile(args) # Only actually run the file on the last chunk. if not args.more_data: self.ProcessFile(path, args) self.CleanUp(path) def ProcessFile(self, path, args): res = client_utils_common.Execute(path, args.args, args.time_limit, bypass_whitelist=True) (stdout, stderr, status, time_used) = res # Limit output to 10MB so our response doesn't get too big. stdout = stdout[:10 * 1024 * 1024] stderr = stderr[:10 * 1024 * 1024] result = rdf_client.ExecuteBinaryResponse(stdout=stdout, stderr=stderr, exit_status=status, # We have to return microseconds. time_used=int(1e6 * time_used)) self.SendReply(result) class ExecutePython(actions.ActionPlugin): """Executes python code with exec. Obviously this is a dangerous function, it provides for arbitrary code exec by the server running as root/SYSTEM. This is protected by CONFIG[PrivateKeys.executable_signing_private_key], which should be stored offline and well protected. """ in_rdfvalue = rdf_client.ExecutePythonRequest out_rdfvalues = [rdf_client.ExecutePythonResponse] def Run(self, args): """Run.""" time_start = time.time() class StdOutHook(object): def __init__(self, buf): self.buf = buf def write(self, text): self.buf.write(text) args.python_code.Verify(config_lib.CONFIG[ "Client.executable_signing_public_key"]) # The execed code can assign to this variable if it wants to return data. logging.debug("exec for python code %s", args.python_code.data[0:100]) context = globals().copy() context["py_args"] = args.py_args.ToDict() context["magic_return_str"] = "" # Export the Progress function to allow python hacks to call it. context["Progress"] = self.Progress stdout = StringIO.StringIO() with utils.Stubber(sys, "stdout", StdOutHook(stdout)): exec (args.python_code.data, context) # pylint: disable=exec-used stdout_output = stdout.getvalue() magic_str_output = context.get("magic_return_str") if stdout_output and magic_str_output: output = "Stdout: %s\nMagic Str:%s\n" % (stdout_output, magic_str_output) else: output = stdout_output or magic_str_output time_used = time.time() - time_start # We have to return microseconds. result = rdf_client.ExecutePythonResponse(time_used=int(1e6 * time_used), return_val=utils.SmartStr(output)) self.SendReply(result) class Segfault(actions.ActionPlugin): """This action is just for debugging. It induces a segfault.""" in_rdfvalue = None out_rdfvalues = [None] def Run(self, unused_args): """Does the segfaulting.""" if flags.FLAGS.debug: logging.warning("Segfault action requested :(") print ctypes.cast(1, ctypes.POINTER(ctypes.c_void_p)).contents else: logging.warning("Segfault requested but not running in debug mode.") class ListProcesses(actions.ActionPlugin): """This action lists all the processes running on a machine.""" in_rdfvalue = None out_rdfvalues = [rdf_client.Process] def Run(self, unused_arg): # psutil will cause an active loop on Windows 2000 if platform.system() == "Windows" and platform.version().startswith("5.0"): raise RuntimeError("ListProcesses not supported on Windows 2000") for proc in psutil.process_iter(): response = rdf_client.Process() process_fields = ["pid", "ppid", "name", "exe", "username", "terminal"] for field in process_fields: try: value = getattr(proc, field) if value is None: continue if callable(value): value = value() if not isinstance(value, (int, long)): value = utils.SmartUnicode(value) setattr(response, field, value) except (psutil.NoSuchProcess, psutil.AccessDenied, AttributeError): pass try: for arg in proc.cmdline(): response.cmdline.append(utils.SmartUnicode(arg)) except (psutil.NoSuchProcess, psutil.AccessDenied): pass try: response.nice = proc.nice() except (psutil.NoSuchProcess, psutil.AccessDenied): pass try: # Not available on Windows. if hasattr(proc, "uids"): (response.real_uid, response.effective_uid, response.saved_uid) = proc.uids() (response.real_gid, response.effective_gid, response.saved_gid) = proc.gids() except (psutil.NoSuchProcess, psutil.AccessDenied): pass try: response.ctime = long(proc.create_time() * 1e6) response.status = str(proc.status()) except (psutil.NoSuchProcess, psutil.AccessDenied): pass try: # Not available on OSX. if hasattr(proc, "cwd"): response.cwd = utils.SmartUnicode(proc.cwd()) except (psutil.NoSuchProcess, psutil.AccessDenied): pass try: response.num_threads = proc.num_threads() except (psutil.NoSuchProcess, psutil.AccessDenied, RuntimeError): pass try: (response.user_cpu_time, response.system_cpu_time) = proc.cpu_times() # This is very time consuming so we do not collect cpu_percent here. # response.cpu_percent = proc.get_cpu_percent() except (psutil.NoSuchProcess, psutil.AccessDenied): pass try: pmem = proc.memory_info() response.RSS_size = pmem.rss response.VMS_size = pmem.vms response.memory_percent = proc.memory_percent() except (psutil.NoSuchProcess, psutil.AccessDenied): pass # Due to a bug in psutil, this function is disabled for now # (https://github.com/giampaolo/psutil/issues/340) # try: # for f in proc.open_files(): # response.open_files.append(utils.SmartUnicode(f.path)) # except (psutil.NoSuchProcess, psutil.AccessDenied): # pass try: for c in proc.connections(): conn = response.connections.Append(family=c.family, type=c.type, pid=proc.pid) try: conn.state = c.status except ValueError: logging.info("Encountered unknown connection status (%s).", c.status) try: conn.local_address.ip, conn.local_address.port = c.laddr # Could be in state LISTEN. if c.raddr: conn.remote_address.ip, conn.remote_address.port = c.raddr except AttributeError: conn.local_address.ip, conn.local_address.port = c.local_address # Could be in state LISTEN. if c.remote_address: (conn.remote_address.ip, conn.remote_address.port) = c.remote_address except (psutil.NoSuchProcess, psutil.AccessDenied): pass self.SendReply(response) # Reading information here is slow so we heartbeat between processes. self.Progress() class SendFile(actions.ActionPlugin): """This action encrypts and sends a file to a remote listener.""" in_rdfvalue = rdf_client.SendFileRequest out_rdfvalues = [rdf_client.StatEntry] BLOCK_SIZE = 1024 * 1024 * 10 # 10 MB def Send(self, sock, msg): totalsent = 0 n = len(msg) while totalsent < n: sent = sock.send(msg[totalsent:]) if sent == 0: raise RuntimeError("socket connection broken") totalsent += sent def Run(self, args): """Run.""" # Open the file. fd = vfs.VFSOpen(args.pathspec, progress_callback=self.Progress) if args.address_family == rdf_client.NetworkAddress.Family.INET: family = socket.AF_INET elif args.address_family == rdf_client.NetworkAddress.Family.INET6: family = socket.AF_INET6 else: raise RuntimeError("Socket address family not supported.") s = socket.socket(family, socket.SOCK_STREAM) try: s.connect((args.host, args.port)) except socket.error as e: raise RuntimeError(str(e)) cipher = rdf_crypto.AES128CBCCipher(args.key, args.iv, rdf_crypto.Cipher.OP_ENCRYPT) while True: data = fd.read(self.BLOCK_SIZE) if not data: break self.Send(s, cipher.Update(data)) # Send heartbeats for long files. self.Progress() self.Send(s, cipher.Final()) s.close() self.SendReply(fd.Stat()) class StatFS(actions.ActionPlugin): """Call os.statvfs for a given list of paths. OS X and Linux only. Note that a statvfs call for a network filesystem (e.g. NFS) that is unavailable, e.g. due to no network, will result in the call blocking. """ in_rdfvalue = rdf_client.StatFSRequest out_rdfvalues = [rdf_client.Volume] def Run(self, args): if platform.system() == "Windows": raise RuntimeError("os.statvfs not available on Windows") for path in args.path_list: try: fd = vfs.VFSOpen( rdf_paths.PathSpec(path=path, pathtype=args.pathtype), progress_callback=self.Progress) st = fd.StatFS() mount_point = fd.GetMountPoint() except (IOError, OSError) as e: self.SetStatus(rdf_flows.GrrStatus.ReturnedStatus.IOERROR, e) continue unix = rdf_client.UnixVolume(mount_point=mount_point) # On linux pre 2.6 kernels don't have frsize, so we fall back to bsize. # The actual_available_allocation_units attribute is set to blocks # available to the unprivileged user, root may have some additional # reserved space. result = rdf_client.Volume(bytes_per_sector=(st.f_frsize or st.f_bsize), sectors_per_allocation_unit=1, total_allocation_units=st.f_blocks, actual_available_allocation_units=st.f_bavail, unixvolume=unix) self.SendReply(result) class GetMemorySize(actions.ActionPlugin): out_rdfvalues = [rdfvalue.ByteSize] def Run(self, args): _ = args self.SendReply(rdfvalue.ByteSize(psutil.virtual_memory()[0])) grr-3.1.0.2/grr/client/client_actions/standard_test.py000066400000000000000000000274571273104013200227340ustar00rootroot00000000000000#!/usr/bin/env python # -*- mode: python; encoding: utf-8 -*- # Copyright 2012 Google Inc. All Rights Reserved. """Test client standard actions.""" import gzip import hashlib import os import time from grr.client.client_actions import standard from grr.lib import action_mocks from grr.lib import config_lib from grr.lib import flags from grr.lib import rdfvalue from grr.lib import test_lib from grr.lib import utils from grr.lib.rdfvalues import client as rdf_client from grr.lib.rdfvalues import crypto as rdf_crypto from grr.lib.rdfvalues import flows as rdf_flows from grr.lib.rdfvalues import paths as rdf_paths from grr.lib.rdfvalues import protodict as rdf_protodict class TestExecutePython(test_lib.EmptyActionTest): """Test the client execute actions.""" def setUp(self): super(TestExecutePython, self).setUp() self.signing_key = config_lib.CONFIG[ "PrivateKeys.executable_signing_private_key"] def testExecutePython(self): """Test the basic ExecutePython action.""" utils.TEST_VAL = "original" python_code = "utils.TEST_VAL = 'modified'" signed_blob = rdf_crypto.SignedBlob() signed_blob.Sign(python_code, self.signing_key) request = rdf_client.ExecutePythonRequest(python_code=signed_blob) result = self.RunAction("ExecutePython", request)[0] self.assertTrue(result.time_used > 0) self.assertEqual(result.return_val, "") self.assertEqual(utils.TEST_VAL, "modified") def testExecutePythonEnvironment(self): """Test the basic ExecutePython action.""" python_code = """ import StringIO import uu def decode(encoded): # Use the import (uu) inside a function. This will fail if the environment # for exec is not set up properly. i = StringIO.StringIO(s) o = StringIO.StringIO() uu.decode(i, o) return o.getvalue() s = "626567696e20363636202d0a2c3226354c3b265c4035565d523b2630410a200a656e640a" s = s.decode("hex") magic_return_str = decode(s) """ signed_blob = rdf_crypto.SignedBlob() signed_blob.Sign(python_code, self.signing_key) request = rdf_client.ExecutePythonRequest(python_code=signed_blob) result = self.RunAction("ExecutePython", request)[0] self.assertTrue(result.time_used > 0) self.assertEqual(result.return_val, "Hello World!") def testStdoutHooking(self): python_code = """ def f(n): print "F called:", n print "Calling f." f(1) print "Done." """ signed_blob = rdf_crypto.SignedBlob() signed_blob.Sign(python_code, self.signing_key) request = rdf_client.ExecutePythonRequest(python_code=signed_blob) result = self.RunAction("ExecutePython", request)[0] self.assertTrue(result.time_used > 0) self.assertEqual(result.return_val, "Calling f.\nF called: 1\nDone.\n") def testProgress(self): python_code = """ def f(): # This should also work inside a function. Progress() f() Progress() print "Done." """ signed_blob = rdf_crypto.SignedBlob() signed_blob.Sign(python_code, self.signing_key) request = rdf_client.ExecutePythonRequest(python_code=signed_blob) result = self.RunAction("ExecutePython", request)[0] self.assertTrue(result.time_used > 0) self.assertEqual(result.return_val, "Done.\n") def testExecuteModifiedPython(self): """Test that rejects invalid ExecutePython action.""" utils.TEST_VAL = "original" python_code = "utils.TEST_VAL = 'modified'" signed_blob = rdf_crypto.SignedBlob() signed_blob.Sign(python_code, self.signing_key) # Modify the data so the signature does not match. signed_blob.data = "utils.TEST_VAL = 'notmodified'" request = rdf_client.ExecutePythonRequest(python_code=signed_blob) # Should raise since the code has been modified. self.assertRaises(rdfvalue.DecodeError, self.RunAction, "ExecutePython", request) # Lets also adjust the hash. signed_blob.digest = hashlib.sha256(signed_blob.data).digest() request = rdf_client.ExecutePythonRequest(python_code=signed_blob) self.assertRaises(rdfvalue.DecodeError, self.RunAction, "ExecutePython", request) # Make sure the code never ran. self.assertEqual(utils.TEST_VAL, "original") def testExecuteBrokenPython(self): """Test broken code raises back to the original flow.""" python_code = "raise ValueError" signed_blob = rdf_crypto.SignedBlob() signed_blob.Sign(python_code, self.signing_key) request = rdf_client.ExecutePythonRequest(python_code=signed_blob) self.assertRaises(ValueError, self.RunAction, "ExecutePython", request) def testExecuteBinary(self): """Test the basic ExecuteBinaryCommand action.""" signed_blob = rdf_crypto.SignedBlob() signed_blob.Sign(open("/bin/ls").read(), self.signing_key) writefile = utils.Join(self.temp_dir, "binexecute", "ablob") os.makedirs(os.path.dirname(writefile)) request = rdf_client.ExecuteBinaryRequest(executable=signed_blob, args=[__file__], write_path=writefile) result = self.RunAction("ExecuteBinaryCommand", request)[0] self.assertTrue(result.time_used > 0) self.assertTrue(__file__ in result.stdout) def testReturnVals(self): """Test return values.""" python_code = "magic_return_str = 'return string'" signed_blob = rdf_crypto.SignedBlob() signed_blob.Sign(python_code, self.signing_key) request = rdf_client.ExecutePythonRequest(python_code=signed_blob) result = self.RunAction("ExecutePython", request)[0] self.assertEqual(result.return_val, "return string") def testWrongKey(self): """Test return values.""" python_code = "print 'test'" # Generate a test valid RSA key that isn't the real one. signing_key = rdf_crypto.PEMPrivateKey.GenKey(2048, 65537) signed_blob = rdf_crypto.SignedBlob() signed_blob.Sign(python_code, signing_key) request = rdf_client.ExecutePythonRequest(python_code=signed_blob) self.assertRaises(rdfvalue.DecodeError, self.RunAction, "ExecutePython", request) def testArgs(self): """Test passing arguments.""" utils.TEST_VAL = "original" python_code = """ magic_return_str = py_args['test'] utils.TEST_VAL = py_args[43] """ signed_blob = rdf_crypto.SignedBlob() signed_blob.Sign(python_code, self.signing_key) pdict = rdf_protodict.Dict({"test": "dict_arg", 43: "dict_arg2"}) request = rdf_client.ExecutePythonRequest(python_code=signed_blob, py_args=pdict) result = self.RunAction("ExecutePython", request)[0] self.assertEqual(result.return_val, "dict_arg") self.assertEqual(utils.TEST_VAL, "dict_arg2") class TestCopyPathToFile(test_lib.EmptyActionTest): """Test CopyPathToFile client actions.""" def setUp(self): super(TestCopyPathToFile, self).setUp() self.path_in = os.path.join(self.base_path, "morenumbers.txt") self.hash_in = hashlib.sha1(open(self.path_in).read()).hexdigest() self.pathspec = rdf_paths.PathSpec(path=self.path_in, pathtype=rdf_paths.PathSpec.PathType.OS) def testCopyPathToFile(self): request = rdf_client.CopyPathToFileRequest(offset=0, length=0, src_path=self.pathspec, dest_dir=self.temp_dir, gzip_output=False) result = self.RunAction("CopyPathToFile", request)[0] hash_out = hashlib.sha1(open(result.dest_path.path).read()).hexdigest() self.assertEqual(self.hash_in, hash_out) def testCopyPathToFileLimitLength(self): request = rdf_client.CopyPathToFileRequest(offset=0, length=23, src_path=self.pathspec, dest_dir=self.temp_dir, gzip_output=False) result = self.RunAction("CopyPathToFile", request)[0] output = open(result.dest_path.path).read() self.assertEqual(len(output), 23) def testCopyPathToFileOffsetandLimit(self): with open(self.path_in) as f: f.seek(38) out = f.read(25) hash_in = hashlib.sha1(out).hexdigest() request = rdf_client.CopyPathToFileRequest(offset=38, length=25, src_path=self.pathspec, dest_dir=self.temp_dir, gzip_output=False) result = self.RunAction("CopyPathToFile", request)[0] output = open(result.dest_path.path).read() self.assertEqual(len(output), 25) hash_out = hashlib.sha1(output).hexdigest() self.assertEqual(hash_in, hash_out) def testCopyPathToFileGzip(self): request = rdf_client.CopyPathToFileRequest(offset=0, length=0, src_path=self.pathspec, dest_dir=self.temp_dir, gzip_output=True) result = self.RunAction("CopyPathToFile", request)[0] self.assertEqual( hashlib.sha1(gzip.open(result.dest_path.path).read()).hexdigest(), self.hash_in) def testCopyPathToFileLifetimeLimit(self): request = rdf_client.CopyPathToFileRequest(offset=0, length=23, src_path=self.pathspec, dest_dir=self.temp_dir, gzip_output=False, lifetime=0.1) result = self.RunAction("CopyPathToFile", request)[0] self.assertTrue(os.path.exists(result.dest_path.path)) time.sleep(1) self.assertFalse(os.path.exists(result.dest_path.path)) class TestNetworkByteLimits(test_lib.EmptyActionTest): """Test CopyPathToFile client actions.""" def setUp(self): super(TestNetworkByteLimits, self).setUp() pathspec = rdf_paths.PathSpec(path="/nothing", pathtype=rdf_paths.PathSpec.PathType.OS) self.buffer_ref = rdf_client.BufferReference(pathspec=pathspec, length=5000) self.data = "X" * 500 self.old_read = standard.vfs.ReadVFS standard.vfs.ReadVFS = lambda x, y, z, progress_callback=None: self.data self.transfer_buf = action_mocks.ActionMock("TransferBuffer") def testTransferNetworkByteLimitError(self): message = rdf_flows.GrrMessage(name="TransferBuffer", payload=self.buffer_ref, network_bytes_limit=300) # We just get a client alert and a status message back. responses = self.transfer_buf.HandleMessage(message) client_alert = responses[0].payload self.assertTrue("Network limit exceeded" in str(client_alert)) status = responses[1].payload self.assertTrue("Action exceeded network send limit" in str( status.backtrace)) self.assertEqual(status.status, rdf_flows.GrrStatus.ReturnedStatus.NETWORK_LIMIT_EXCEEDED) def testTransferNetworkByteLimit(self): message = rdf_flows.GrrMessage(name="TransferBuffer", payload=self.buffer_ref, network_bytes_limit=900) responses = self.transfer_buf.HandleMessage(message) for response in responses: if isinstance(response, rdf_flows.GrrStatus): self.assertEqual(response.payload.status, rdf_flows.GrrStatus.ReturnedStatus.OK) def tearDown(self): super(TestNetworkByteLimits, self).tearDown() standard.vfs.ReadVFS = self.old_read def main(argv): test_lib.main(argv) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/client/client_actions/tempfiles.py000066400000000000000000000230701273104013200220500ustar00rootroot00000000000000#!/usr/bin/env python """Create and delete GRR temporary files. Utilities for working with GRR temp files. """ import os import stat import sys import tempfile import threading import psutil from grr.client import actions from grr.client import client_utils from grr.client.vfs_handlers import files from grr.lib import config_lib from grr.lib import utils from grr.lib.rdfvalues import client as rdf_client from grr.lib.rdfvalues import paths as rdf_paths class Error(Exception): """Base error class.""" class ErrorBadPath(Error): """OS file path errors.""" class ErrorNotTempFile(Error): """Attempt to delete a file that isn't a GRR tempfile.""" class ErrorNotAFile(Error): """Attempt to delete a file that doesn't exist.""" def GetTempDirForRoot(root): return os.path.join(root, config_lib.CONFIG["Client.grr_tempdir"]) def GetDefaultGRRTempDirectory(): # Check if any of the roots exists. for candidate_dir in config_lib.CONFIG["Client.tempdir_roots"]: if os.path.isdir(candidate_dir): return GetTempDirForRoot(candidate_dir) # If none of the options exist, fall back to the first directory. return GetTempDirForRoot(config_lib.CONFIG["Client.tempdir_roots"][0]) def CreateGRRTempFile(directory=None, filename=None, lifetime=0, mode="w+b", suffix=""): """Open file with GRR prefix in directory to allow easy deletion. Missing parent dirs will be created. If an existing directory is specified its permissions won't be modified to avoid breaking system functionality. Permissions on the destination file will be set to root/SYSTEM rw. On windows the file is created, then permissions are set. So there is potentially a race condition where the file is readable by other users. If the caller doesn't specify a directory on windows we use the directory we are executing from as a safe default. If lifetime is specified a housekeeping thread is created to delete the file after lifetime seconds. Files won't be deleted by default. Args: directory: string representing absolute directory where file should be written. If None, use 'tmp' under the directory we're running from. filename: The name of the file to use. Note that setting both filename and directory name is not allowed. lifetime: time in seconds before we should delete this tempfile. mode: The mode to open the file. suffix: optional suffix to use for the temp file Returns: Python file object Raises: OSError: on permission denied ErrorBadPath: if path is not absolute ValueError: if Client.tempfile_prefix is undefined in the config. """ if filename and directory: raise ErrorBadPath("Providing both filename and directory name forbidden.") if not directory: directory = GetDefaultGRRTempDirectory() if not os.path.isabs(directory): raise ErrorBadPath("Directory %s is not absolute" % directory) if not os.path.isdir(directory): os.makedirs(directory) # Make directory 700 before we write the file if sys.platform == "win32": client_utils.WinChmod(directory, ["FILE_GENERIC_READ", "FILE_GENERIC_WRITE"]) else: os.chmod(directory, stat.S_IXUSR | stat.S_IRUSR | stat.S_IWUSR) prefix = config_lib.CONFIG.Get("Client.tempfile_prefix") if filename is None: outfile = tempfile.NamedTemporaryFile(prefix=prefix, suffix=suffix, dir=directory, delete=False) else: if suffix: filename = "%s.%s" % (filename, suffix) outfile = open(os.path.join(directory, filename), mode) if lifetime > 0: cleanup = threading.Timer(lifetime, DeleteGRRTempFile, (outfile.name,)) cleanup.start() # Fix perms on the file, since this code is used for writing executable blobs # we apply RWX. if sys.platform == "win32": client_utils.WinChmod(outfile.name, ["FILE_ALL_ACCESS"]) else: os.chmod(outfile.name, stat.S_IXUSR | stat.S_IRUSR | stat.S_IWUSR) return outfile def CreateGRRTempFileVFS(directory=None, filename=None, lifetime=0, mode="w+b", suffix=""): """Creates a GRR VFS temp file. This function is analogous to CreateGRRTempFile but returns an open VFS handle to the newly created file. Arguments are the same as for CreateGRRTempFile: Args: directory: string representing absolute directory where file should be written. If None, use 'tmp' under the directory we're running from. filename: The name of the file to use. Note that setting both filename and directory name is not allowed. lifetime: time in seconds before we should delete this tempfile. mode: The mode to open the file. suffix: optional suffix to use for the temp file Returns: An open file handle to the new file and the corresponding pathspec. """ fd = CreateGRRTempFile(directory=directory, filename=filename, lifetime=lifetime, mode=mode, suffix=suffix) pathspec = rdf_paths.PathSpec(path=fd.name, pathtype=rdf_paths.PathSpec.PathType.TMPFILE) return fd, pathspec def _CheckIfPathIsValidForDeletion(path, prefix=None, directories=None): if prefix and os.path.basename(path).startswith(prefix): return True for directory in directories or []: if os.path.commonprefix([directory, path]) == directory: return True return False def DeleteGRRTempFile(path): """Delete a GRR temp file. To limit possible damage the path must be absolute and either the file must be within any of the Client.tempdir_roots or the file name must begin with Client.tempfile_prefix. Args: path: path string to file to be deleted. Raises: OSError: Permission denied, or file not found. ErrorBadPath: Path must be absolute. ErrorNotTempFile: Filename must start with Client.tempfile_prefix. ErrorNotAFile: File to delete does not exist. """ if not os.path.isabs(path): raise ErrorBadPath("Path must be absolute") prefix = config_lib.CONFIG["Client.tempfile_prefix"] directories = [GetTempDirForRoot(root) for root in config_lib.CONFIG["Client.tempdir_roots"]] if not _CheckIfPathIsValidForDeletion( path, prefix=prefix, directories=directories): msg = ("Can't delete temp file %s. Filename must start with %s " "or lie within any of %s.") raise ErrorNotTempFile(msg % (path, prefix, directories)) if os.path.exists(path): # Clear our file handle cache so the file can be deleted. files.FILE_HANDLE_CACHE.Flush() os.remove(path) else: raise ErrorNotAFile("%s does not exist." % path) class DeleteGRRTempFiles(actions.ActionPlugin): """Delete all the GRR temp files in a directory.""" in_rdfvalue = rdf_paths.PathSpec out_rdfvalues = [rdf_client.LogMessage] def Run(self, args): """Delete all the GRR temp files in path. If path is a directory, look in the top level for filenames beginning with Client.tempfile_prefix, and delete them. If path is a regular file and starts with Client.tempfile_prefix delete it. Args: args: pathspec pointing to directory containing temp files to be deleted, or a single file to be deleted. Returns: deleted: array of filename strings that were deleted Raises: ErrorBadPath: if path doesn't exist or is not a regular file or directory """ allowed_temp_dirs = [GetTempDirForRoot(root) for root in config_lib.CONFIG["Client.tempdir_roots"]] if args.path: # Normalize the path, so DeleteGRRTempFile can correctly check if # it is within Client.tempdir. paths = [ client_utils.CanonicalPathToLocalPath(utils.NormalizePath(args.path)) ] else: paths = allowed_temp_dirs deleted = [] errors = [] for path in paths: if os.path.isdir(path): for filename in os.listdir(path): abs_filename = os.path.join(path, filename) try: DeleteGRRTempFile(abs_filename) deleted.append(abs_filename) except Exception as e: # pylint: disable=broad-except # The error we are most likely to get is ErrorNotTempFile but # especially on Windows there might be locking issues that raise # various WindowsErrors so we just catch them all and continue # deleting all other temp files in this directory. errors.append(e) elif os.path.isfile(path): DeleteGRRTempFile(path) deleted = [path] elif path not in allowed_temp_dirs: if not os.path.exists(path): raise ErrorBadPath("File %s does not exist" % path) else: raise ErrorBadPath("Not a regular file or directory: %s" % path) reply = "" if deleted: reply = "Deleted: %s." % deleted else: reply = "Nothing deleted." if errors: reply += "\n%s" % errors self.SendReply(rdf_client.LogMessage(data=reply)) class CheckFreeGRRTempSpace(actions.ActionPlugin): in_rdfvalue = rdf_paths.PathSpec out_rdfvalues = [rdf_client.DiskUsage] def Run(self, args): if args.path: path = args.CollapsePath() else: path = GetDefaultGRRTempDirectory() total, used, free, _ = psutil.disk_usage(path) self.SendReply(path=path, total=total, used=used, free=free) grr-3.1.0.2/grr/client/client_actions/tempfiles_test.py000066400000000000000000000227511273104013200231140ustar00rootroot00000000000000#!/usr/bin/env python """Tests for grr.client.client_actions.tempfiles.""" import os import tempfile import time from grr.client.client_actions import tempfiles from grr.lib import config_lib from grr.lib import flags from grr.lib import test_lib from grr.lib import utils from grr.lib.rdfvalues import paths as rdf_paths class GRRTempFileTestDirectory(test_lib.GRRBaseTest): """Tests for GRR temp file utils when directory is provided.""" def setUp(self): """Create fake filesystem.""" super(GRRTempFileTestDirectory, self).setUp() self.prefix = config_lib.CONFIG.Get("Client.tempfile_prefix") self.existsdir = os.path.join(self.temp_dir, "this/exists/") os.makedirs(self.existsdir) self.not_exists = os.path.join(self.temp_dir, "does/not/exist/") self.new_temp_file = os.path.join(self.not_exists, self.prefix) def _CheckPermissions(self, filename, expected): # Just look at the last 3 octets. file_mode = os.stat(filename).st_mode & 0777 self.assertEqual(file_mode, expected) def testCreateGRRTempFile(self): fd = tempfiles.CreateGRRTempFile(self.not_exists, suffix=".exe") self.assertTrue(fd.name.startswith(self.new_temp_file)) self.assertTrue(fd.name.endswith(".exe")) self.assertTrue(os.path.exists(fd.name)) self._CheckPermissions(fd.name, 0700) self._CheckPermissions(os.path.dirname(fd.name), 0700) def testCreateGRRTempFileRelativePath(self): self.assertRaises(tempfiles.ErrorBadPath, tempfiles.CreateGRRTempFile, "../../blah") def testCreateGRRTempFileWithLifetime(self): fd = tempfiles.CreateGRRTempFile(self.not_exists, lifetime=0.1) self.assertTrue(os.path.exists(fd.name)) time.sleep(1) self.assertFalse(os.path.exists(fd.name)) def testDeleteGRRTempFile(self): grr_tempfile = os.path.join(self.existsdir, self.prefix) open(grr_tempfile, "w").write("something") tempfiles.DeleteGRRTempFile(grr_tempfile) self.assertFalse(os.path.exists(grr_tempfile)) def testDeleteGRRTempFileBadPrefix(self): self.assertRaises(tempfiles.ErrorNotTempFile, tempfiles.DeleteGRRTempFile, os.path.join(self.existsdir, "/blah")) def testDeleteGRRTempFileRelativePath(self): self.assertRaises(tempfiles.ErrorBadPath, tempfiles.DeleteGRRTempFile, "../../blah") class GRRTempFileTestFilename(test_lib.GRRBaseTest): """Tests for GRR temp file utils when filename is provided.""" def setUp(self): """Create fake filesystem.""" super(GRRTempFileTestFilename, self).setUp() # This is where temp files go if a directory is not provided. # For this test it has to be different from the temp directory # so we create a new one. self.client_tempdir = tempfile.mkdtemp( dir=config_lib.CONFIG.Get("Client.tempdir_roots")[0]) self.tempdir_overrider = test_lib.ConfigOverrider({ "Client.tempdir_roots": [os.path.dirname(self.client_tempdir)], "Client.grr_tempdir": os.path.basename(self.client_tempdir) }) self.tempdir_overrider.Start() def tearDown(self): super(GRRTempFileTestFilename, self).tearDown() # The actual GRR temp dir. os.rmdir(tempfiles.GetDefaultGRRTempDirectory()) self.tempdir_overrider.Stop() def testCreateAndDelete(self): fd = tempfiles.CreateGRRTempFile(filename="process.42.exe", mode="wb") fd.close() self.assertTrue(os.path.exists(fd.name)) self.assertTrue(os.path.basename(fd.name) == "process.42.exe") tempfiles.DeleteGRRTempFile(fd.name) self.assertFalse(os.path.exists(fd.name)) fd = open(os.path.join(self.temp_dir, "notatmpfile"), "w") fd.write("something") fd.close() self.assertTrue(os.path.exists(fd.name)) self.assertRaises(tempfiles.ErrorNotTempFile, tempfiles.DeleteGRRTempFile, fd.name) self.assertTrue(os.path.exists(fd.name)) class DeleteGRRTempFiles(test_lib.EmptyActionTest): """Test DeleteGRRTempFiles client action.""" def setUp(self): super(DeleteGRRTempFiles, self).setUp() filename = "%s_blah" % config_lib.CONFIG["Client.tempfile_prefix"] self.tempfile = utils.JoinPath(self.temp_dir, "delete_test", filename) self.dirname = os.path.dirname(self.tempfile) os.makedirs(self.dirname) self.tempdir_overrider = test_lib.ConfigOverrider({ "Client.tempdir_roots": [os.path.dirname(self.dirname)], "Client.grr_tempdir": os.path.basename(self.dirname) }) self.tempdir_overrider.Start() self.not_tempfile = os.path.join(self.temp_dir, "notatempfile") open(self.not_tempfile, "w").write("something") self.temp_fd = tempfiles.CreateGRRTempFile(self.dirname) self.temp_fd2 = tempfiles.CreateGRRTempFile(self.dirname) self.assertTrue(os.path.exists(self.not_tempfile)) self.assertTrue(os.path.exists(self.temp_fd.name)) self.assertTrue(os.path.exists(self.temp_fd2.name)) self.pathspec = rdf_paths.PathSpec(path=self.dirname, pathtype=rdf_paths.PathSpec.PathType.OS) def tearDown(self): super(DeleteGRRTempFiles, self).tearDown() self.tempdir_overrider.Stop() def _SetUpTempDirStructure(self, grr_tempdir="grr_temp"): temproot1 = utils.JoinPath(self.temp_dir, "del_test1") temproot2 = utils.JoinPath(self.temp_dir, "del_test2") temproot3 = utils.JoinPath(self.temp_dir, "del_test3") tempdir1 = utils.JoinPath(temproot1, grr_tempdir) tempdir2 = utils.JoinPath(temproot2, grr_tempdir) tempdir3 = utils.JoinPath(temproot3, grr_tempdir) os.makedirs(tempdir1) os.makedirs(tempdir2) # Omit tempdir3. file1 = utils.JoinPath(tempdir1, "file1") file2 = utils.JoinPath(tempdir2, "file2") open(file1, "w").write("something") open(file2, "w").write("something") # Unrelated file in the tempdir_roots should be left alone. not_a_grr_file1 = utils.JoinPath(temproot1, "file1") not_a_grr_file2 = utils.JoinPath(temproot1, "file2") open(not_a_grr_file1, "w").write("something") open(not_a_grr_file2, "w").write("something") self.assertTrue(os.path.exists(file1)) self.assertTrue(os.path.exists(file2)) self.assertTrue(os.path.exists(not_a_grr_file1)) self.assertTrue(os.path.exists(not_a_grr_file2)) return ([temproot1, temproot2, temproot3], [tempdir1, tempdir2], [tempdir3], [file1, file2], [not_a_grr_file1, not_a_grr_file1]) def testDeleteMultipleRoots(self): temp_dir = "grr_temp" test_data = self._SetUpTempDirStructure(temp_dir) roots, _, invalid_temp_dirs, temp_files, other_files = test_data with test_lib.ConfigOverrider({ "Client.tempdir_roots": roots, "Client.grr_tempdir": temp_dir }): result = self.RunAction("DeleteGRRTempFiles", rdf_paths.PathSpec()) self.assertEqual(len(result), 1) log = result[0].data for f in temp_files: self.assertIn(f, log) for f in invalid_temp_dirs: self.assertNotIn(f, log) for f in temp_files: self.assertFalse(os.path.exists(f)) for f in other_files: self.assertTrue(os.path.exists(f)) def testDeleteFilesInRoot(self): temp_dir = "grr_temp" test_data = self._SetUpTempDirStructure(temp_dir) roots, _, _, temp_files, other_files = test_data with test_lib.ConfigOverrider({ "Client.tempdir_roots": roots, "Client.grr_tempdir": temp_dir }): for f in temp_files: result = self.RunAction("DeleteGRRTempFiles", rdf_paths.PathSpec(path=f)) self.assertEqual(len(result), 1) self.assertIn(f, result[0].data) for f in other_files: self.assertRaises(tempfiles.ErrorNotTempFile, self.RunAction, "DeleteGRRTempFiles", rdf_paths.PathSpec(path=f)) def testDeleteGRRTempFilesInDirectory(self): result = self.RunAction("DeleteGRRTempFiles", self.pathspec)[0] self.assertTrue(os.path.exists(self.not_tempfile)) self.assertFalse(os.path.exists(self.temp_fd.name)) self.assertFalse(os.path.exists(self.temp_fd2.name)) self.assertTrue(self.temp_fd.name in result.data) self.assertTrue(self.temp_fd2.name in result.data) def testDeleteGRRTempFilesSpecificPath(self): self.pathspec = rdf_paths.PathSpec(path=self.temp_fd.name, pathtype=rdf_paths.PathSpec.PathType.OS) result = self.RunAction("DeleteGRRTempFiles", self.pathspec)[0] self.assertTrue(os.path.exists(self.not_tempfile)) self.assertFalse(os.path.exists(self.temp_fd.name)) self.assertTrue(os.path.exists(self.temp_fd2.name)) self.assertTrue(self.temp_fd.name in result.data) self.assertFalse(self.temp_fd2.name in result.data) def testDeleteGRRTempFilesPathDoesNotExist(self): self.pathspec = rdf_paths.PathSpec(path="/does/not/exist", pathtype=rdf_paths.PathSpec.PathType.OS) self.assertRaises(tempfiles.ErrorBadPath, self.RunAction, "DeleteGRRTempFiles", self.pathspec) def testOneFileFails(self): # Sneak in a non existing file. def listdir(path): _ = path res = [] res.append(os.path.basename(self.temp_fd.name)) res.append("not_really_a_file") res.append(os.path.basename(self.temp_fd2.name)) return res with utils.Stubber(os, "listdir", listdir): result = self.RunAction("DeleteGRRTempFiles", self.pathspec)[0] self.assertIn("not_really_a_file does not exist", result.data) def main(argv): test_lib.main(argv) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/client/client_actions/tests.py000066400000000000000000000013321273104013200212170ustar00rootroot00000000000000#!/usr/bin/env python # -*- mode: python; encoding: utf-8 -*- """Loads up all client action tests.""" # pylint: disable=unused-import import logging # These import populate the action test registry from grr.client.client_actions import action_test from grr.client.client_actions import admin_test from grr.client.client_actions import components_test from grr.client.client_actions import file_fingerprint_test from grr.client.client_actions import plist_test from grr.client.client_actions import searching_test from grr.client.client_actions import standard_test from grr.client.client_actions import tempfiles_test from grr.client.client_actions.osx import osx_test from grr.client.client_actions.windows import windows_test grr-3.1.0.2/grr/client/client_actions/windows/000077500000000000000000000000001273104013200211765ustar00rootroot00000000000000grr-3.1.0.2/grr/client/client_actions/windows/__init__.py000066400000000000000000000005121273104013200233050ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2011 Google Inc. All Rights Reserved. """A module to load all windows client plugins.""" # pylint: disable=unused-import,g-import-not-at-top # These import populate the Action registry import platform if platform.system() == "Windows": from grr.client.client_actions.windows import windows grr-3.1.0.2/grr/client/client_actions/windows/windows.py000066400000000000000000000160741273104013200232520ustar00rootroot00000000000000#!/usr/bin/env python """Windows specific actions. Most of these actions share an interface (in/out rdfvalues) with linux actions of the same name. Windows-only actions are registered with the server via libs/server_stubs.py """ import binascii import ctypes import logging import _winreg import pythoncom import win32api import win32com.client import win32file import win32service import win32serviceutil import wmi from grr.client import actions from grr.client.client_actions import standard from grr.lib import config_lib from grr.lib.rdfvalues import client as rdf_client from grr.lib.rdfvalues import protodict as rdf_protodict # Properties to remove from results sent to the server. # These properties are included with nearly every WMI object and use space. IGNORE_PROPS = ["CSCreationClassName", "CreationClassName", "OSName", "OSCreationClassName", "WindowsVersion", "CSName", "__NAMESPACE", "__SERVER", "__PATH"] def UnicodeFromCodePage(string): """Attempt to coerce string into a unicode object.""" # get the current code page codepage = ctypes.windll.kernel32.GetOEMCP() try: return string.decode("cp%s" % codepage) except UnicodeError: try: return string.decode("utf16", "ignore") except UnicodeError: # Fall back on utf8 but ignore errors return string.decode("utf8", "ignore") class GetInstallDate(actions.ActionPlugin): """Estimate the install date of this system.""" out_rdfvalues = [rdf_protodict.DataBlob] def Run(self, unused_args): """Estimate the install date of this system.""" # Don't use _winreg.KEY_WOW64_64KEY since it breaks on Windows 2000 subkey = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows NT\\CurrentVersion", 0, _winreg.KEY_READ) install_date = _winreg.QueryValueEx(subkey, "InstallDate") self.SendReply(integer=install_date[0]) class EnumerateInterfaces(actions.ActionPlugin): """Enumerate all MAC addresses of all NICs. Win32_NetworkAdapterConfiguration definition: http://msdn.microsoft.com/en-us/library/aa394217(v=vs.85).aspx """ out_rdfvalues = [rdf_client.Interface] def RunNetAdapterWMIQuery(self): pythoncom.CoInitialize() for interface in wmi.WMI().Win32_NetworkAdapterConfiguration(IPEnabled=1): addresses = [] for ip_address in interface.IPAddress: addresses.append(rdf_client.NetworkAddress( human_readable_address=ip_address)) args = {"ifname": interface.Description} args["mac_address"] = binascii.unhexlify(interface.MACAddress.replace(":", "")) if addresses: args["addresses"] = addresses yield args def Run(self, unused_args): """Enumerate all MAC addresses.""" for interface_dict in self.RunNetAdapterWMIQuery(): self.SendReply(**interface_dict) class EnumerateFilesystems(actions.ActionPlugin): """Enumerate all unique filesystems local to the system.""" out_rdfvalues = [rdf_client.Filesystem] def Run(self, unused_args): """List all local filesystems mounted on this system.""" for drive in win32api.GetLogicalDriveStrings().split("\x00"): if drive: try: volume = win32file.GetVolumeNameForVolumeMountPoint(drive).rstrip( "\\") label, _, _, _, fs_type = win32api.GetVolumeInformation(drive) self.SendReply(device=volume, mount_point="/%s:/" % drive[0], type=fs_type, label=UnicodeFromCodePage(label)) except win32api.error: pass class Uninstall(actions.ActionPlugin): """Remove the service that starts us at startup.""" out_rdfvalues = [rdf_protodict.DataBlob] def Run(self, unused_arg): """This kills us with no cleanups.""" logging.debug("Disabling service") win32serviceutil.ChangeServiceConfig( None, config_lib.CONFIG["Nanny.service_name"], startType=win32service.SERVICE_DISABLED) svc_config = QueryService(config_lib.CONFIG["Nanny.service_name"]) if svc_config[1] == win32service.SERVICE_DISABLED: logging.info("Disabled service successfully") self.SendReply(string="Service disabled.") else: self.SendReply(string="Service failed to disable.") def QueryService(svc_name): """Query service and get its config.""" hscm = win32service.OpenSCManager(None, None, win32service.SC_MANAGER_ALL_ACCESS) result = None try: hs = win32serviceutil.SmartOpenService(hscm, svc_name, win32service.SERVICE_ALL_ACCESS) result = win32service.QueryServiceConfig(hs) win32service.CloseServiceHandle(hs) finally: win32service.CloseServiceHandle(hscm) return result class WmiQuery(actions.ActionPlugin): """Runs a WMI query and returns the results to a server callback.""" in_rdfvalue = rdf_client.WMIRequest out_rdfvalues = [rdf_protodict.Dict] def Run(self, args): """Run the WMI query and return the data.""" query = args.query base_object = args.base_object or r"winmgmts:\root\cimv2" if not query.upper().startswith("SELECT "): raise RuntimeError("Only SELECT WMI queries allowed.") for response_dict in RunWMIQuery(query, baseobj=base_object): self.SendReply(response_dict) def RunWMIQuery(query, baseobj=r"winmgmts:\root\cimv2"): """Run a WMI query and return a result. Args: query: the WMI query to run. baseobj: the base object for the WMI query. Yields: rdf_protodict.Dicts containing key value pairs from the resulting COM objects. """ pythoncom.CoInitialize() # Needs to be called if using com from a thread. wmi_obj = win32com.client.GetObject(baseobj) # This allows our WMI to do some extra things, in particular # it gives it access to find the executable path for all processes. wmi_obj.Security_.Privileges.AddAsString("SeDebugPrivilege") # Run query try: query_results = wmi_obj.ExecQuery(query) except pythoncom.com_error as e: raise RuntimeError("Failed to run WMI query \'%s\' err was %s" % (query, e)) # Extract results from the returned COMObject and return dicts. try: for result in query_results: response = rdf_protodict.Dict() properties = list(result.Properties_) + list(result.SystemProperties_) for prop in properties: if prop.Name not in IGNORE_PROPS: # Protodict can handle most of the types we care about, but we may # get some objects that we don't know how to serialize, so we tell the # dict to set the value to an error message and keep going response.SetItem(prop.Name, prop.Value, raise_on_error=False) yield response except pythoncom.com_error as e: raise RuntimeError("WMI query data error on query \'%s\' err was %s" % (e, query)) class UpdateAgent(standard.ExecuteBinaryCommand): """Updates the GRR agent to a new version.""" # For Windows this is just an alias to ExecuteBinaryCommand. grr-3.1.0.2/grr/client/client_actions/windows/windows_test.py000066400000000000000000000410341273104013200243030ustar00rootroot00000000000000#!/usr/bin/env python import os import stat import time import mock from grr.client import vfs from grr.lib import action_mocks from grr.lib import aff4 from grr.lib import client_fixture from grr.lib import flags from grr.lib import test_lib from grr.lib import utils from grr.lib.aff4_objects import collects # For RegistryFinder pylint: disable=unused-import from grr.lib.flows.general import registry as _ # pylint: enable=unused-import from grr.lib.rdfvalues import paths as rdf_paths from grr.lib.rdfvalues import protodict as rdf_protodict class WindowsActionTests(test_lib.OSSpecificClientTests): def setUp(self): super(WindowsActionTests, self).setUp() self.win32com = mock.MagicMock() self.win32com.client = mock.MagicMock() modules = { "_winreg": mock.MagicMock(), # Requires mocking because exceptions.WindowsError does not exist "exceptions": mock.MagicMock(), "pythoncom": mock.MagicMock(), "pywintypes": mock.MagicMock(), "win32api": mock.MagicMock(), # Necessary to stop the import of client_actions.standard re-populating # actions.ActionPlugin.classes ("grr.client.client_actions" ".standard"): mock.MagicMock(), "win32com": self.win32com, "win32com.client": self.win32com.client, "win32file": mock.MagicMock(), "win32service": mock.MagicMock(), "win32serviceutil": mock.MagicMock(), "winerror": mock.MagicMock(), "wmi": mock.MagicMock() } self.module_patcher = mock.patch.dict("sys.modules", modules) self.module_patcher.start() # pylint: disable= g-import-not-at-top from grr.client.client_actions.windows import windows # pylint: enable=g-import-not-at-top self.windows = windows def tearDown(self): super(WindowsActionTests, self).tearDown() self.module_patcher.stop() def testEnumerateInterfaces(self): # Stub out wmi.WMI().Win32_NetworkAdapterConfiguration(IPEnabled=1) wmi_object = self.windows.wmi.WMI.return_value wmi_object.Win32_NetworkAdapterConfiguration.return_value = [ client_fixture.WMIWin32NetworkAdapterConfigurationMock() ] enumif = self.windows.EnumerateInterfaces() interface_dict_list = list(enumif.RunNetAdapterWMIQuery()) self.assertEqual(len(interface_dict_list), 1) interface = interface_dict_list[0] self.assertEqual(len(interface["addresses"]), 4) addresses = [x.human_readable_address for x in interface["addresses"]] self.assertItemsEqual(addresses, ["192.168.1.20", "ffff::ffff:aaaa:1111:aaaa", "dddd:0:8888:6666:bbbb:aaaa:eeee:bbbb", "dddd:0:8888:6666:bbbb:aaaa:ffff:bbbb"]) def testRunWMI(self): wmi_obj = self.windows.win32com.client.GetObject.return_value mock_query_result = mock.MagicMock() mock_query_result.Properties_ = [] mock_config = client_fixture.WMIWin32NetworkAdapterConfigurationMock wmi_properties = mock_config.__dict__.iteritems() for key, value in wmi_properties: keyval = mock.MagicMock() keyval.Name, keyval.Value = key, value mock_query_result.Properties_.append(keyval) wmi_obj.ExecQuery.return_value = [mock_query_result] result_list = list(self.windows.RunWMIQuery("select blah")) self.assertEqual(len(result_list), 1) result = result_list.pop() self.assertTrue(isinstance(result, rdf_protodict.Dict)) nest = result["NestingTest"] self.assertEqual(nest["one"]["two"], [3, 4]) self.assertTrue("Unsupported type" in nest["one"]["broken"]) self.assertTrue(isinstance(nest["one"]["three"], rdf_protodict.Dict)) self.assertEqual(nest["four"], []) self.assertEqual(nest["five"], "astring") self.assertEqual(nest["six"], [None, None, ""]) self.assertEqual(nest["seven"], None) self.assertItemsEqual(nest["rdfvalue"].keys(), ["a"]) self.assertEqual(result["GatewayCostMetric"], [0, 256]) self.assertTrue(isinstance(result["OpaqueObject"], basestring)) self.assertTrue("Unsupported type" in result["OpaqueObject"]) class FakeKeyHandle(object): def __init__(self, value): self.value = value.replace("\\", "/") def __enter__(self): return self def __exit__(self, exc_type=None, exc_val=None, exc_tb=None): return False class RegistryFake(test_lib.FakeRegistryVFSHandler): def __init__(self, **kwargs): self.PopulateCache() super(RegistryFake, self).__init__(**kwargs) def OpenKey(self, key, sub_key): res = "%s/%s" % (key.value, sub_key.replace("\\", "/")) res = res.lower().rstrip("/") if not res.startswith("/"): res = "/" + res if res in self.cache[self.prefix]: return FakeKeyHandle(res) raise IOError() def QueryValueEx(self, key, value_name): full_key = os.path.join(key.value, value_name).rstrip("/") try: stat_entry = self.cache[self.prefix][full_key][1] data = stat_entry.registry_data.GetValue() if data: return data, str except KeyError: pass raise IOError() def QueryInfoKey(self, key): modification_time = 10000000 * (11644473600 + time.time()) return len(self._GetKeys(key)), len(self._GetValues(key)), modification_time def EnumKey(self, key, index): try: return self._GetKeys(key)[index] except IndexError: raise IOError() def _GetKeys(self, key): res = [] for path in self.cache[self.prefix]: if os.path.dirname(path) == key.value: sub_type, stat_entry = self.cache[self.prefix][path] if sub_type.__name__ == "VFSDirectory": res.append(os.path.basename(stat_entry.pathspec.path)) return sorted(res) def EnumValue(self, key, index): try: subkey = self._GetValues(key)[index] value, value_type = self.QueryValueEx(key, subkey) return subkey, value, value_type except IndexError: raise IOError() def _GetValues(self, key): res = [] for path in self.cache[self.prefix]: if os.path.dirname(path) == key.value: sub_type, stat_entry = self.cache[self.prefix][path] if sub_type.__name__ == "VFSFile": res.append(os.path.basename(stat_entry.pathspec.path)) return sorted(res) class RegistryVFSTests(test_lib.EmptyActionTest): def setUp(self): super(RegistryVFSTests, self).setUp() modules = { "_winreg": mock.MagicMock(), "ctypes": mock.MagicMock(), "ctypes.wintypes": mock.MagicMock(), # Requires mocking because exceptions.WindowsError does not exist "exceptions": mock.MagicMock(), } self.module_patcher = mock.patch.dict("sys.modules", modules) self.module_patcher.start() # pylint: disable= g-import-not-at-top from grr.client.vfs_handlers import registry import exceptions import _winreg # pylint: enable=g-import-not-at-top fixture = RegistryFake() self.stubber = utils.MultiStubber( (registry, "KeyHandle", FakeKeyHandle), (registry, "OpenKey", fixture.OpenKey), (registry, "QueryValueEx", fixture.QueryValueEx), (registry, "QueryInfoKey", fixture.QueryInfoKey), (registry, "EnumValue", fixture.EnumValue), (registry, "EnumKey", fixture.EnumKey)) self.stubber.Start() # Add the Registry handler to the vfs. vfs.VFSInit().Run() _winreg.HKEY_USERS = "HKEY_USERS" _winreg.HKEY_LOCAL_MACHINE = "HKEY_LOCAL_MACHINE" exceptions.WindowsError = IOError def tearDown(self): super(RegistryVFSTests, self).tearDown() self.module_patcher.stop() self.stubber.Stop() def testRegistryListing(self): pathspec = rdf_paths.PathSpec(pathtype=rdf_paths.PathSpec.PathType.REGISTRY, path=( "/HKEY_USERS/S-1-5-20/Software/Microsoft" "/Windows/CurrentVersion/Run")) expected_names = {"MctAdmin": stat.S_IFDIR, "Sidebar": stat.S_IFDIR} expected_data = [u"%ProgramFiles%\\Windows Sidebar\\Sidebar.exe /autoRun", u"%TEMP%\\Sidebar.exe"] for f in vfs.VFSOpen(pathspec).ListFiles(): base, name = os.path.split(f.pathspec.CollapsePath()) self.assertEqual(base, pathspec.CollapsePath()) self.assertIn(name, expected_names) self.assertIn(f.registry_data.GetValue(), expected_data) def _RunRegistryFinder(self, paths=None): client_mock = action_mocks.ActionMock("Find", "TransferBuffer", "HashBuffer", "FingerprintFile", "FingerprintFile", "Grep", "StatFile") output_path = "analysis/file_finder" client_id = self.SetupClients(1)[0] aff4.FACTORY.Delete(client_id.Add(output_path), token=self.token) for _ in test_lib.TestFlowHelper("RegistryFinder", client_mock, client_id=client_id, keys_paths=paths, conditions=[], token=self.token, output=output_path): pass try: return list(aff4.FACTORY.Open( client_id.Add(output_path), aff4_type=collects.RDFValueCollection, token=self.token)) except aff4.InstantiationError: return [] def testRegistryFinder(self): # Listing inside a key gives the values. results = self._RunRegistryFinder( ["HKEY_LOCAL_MACHINE/SOFTWARE/ListingTest/*"]) self.assertEqual(len(results), 2) self.assertEqual( sorted([x.stat_entry.registry_data.GetValue() for x in results]), ["Value1", "Value2"]) # This is a key so we should get back the default value. results = self._RunRegistryFinder( ["HKEY_LOCAL_MACHINE/SOFTWARE/ListingTest"]) self.assertEqual(len(results), 1) self.assertEqual(results[0].stat_entry.registry_data.GetValue(), "DefaultValue") # The same should work using a wildcard. results = self._RunRegistryFinder(["HKEY_LOCAL_MACHINE/SOFTWARE/*"]) self.assertTrue(results) paths = [x.stat_entry.pathspec.path for x in results] expected_path = u"/HKEY_LOCAL_MACHINE/SOFTWARE/ListingTest" self.assertIn(expected_path, paths) idx = paths.index(expected_path) self.assertEqual(results[idx].stat_entry.registry_data.GetValue(), "DefaultValue") def testRecursiveRegistryListing(self): """Test our ability to walk over a registry tree.""" pathspec = rdf_paths.PathSpec(pathtype=rdf_paths.PathSpec.PathType.REGISTRY) walk_tups_0 = list(vfs.VFSOpen(pathspec).RecursiveListNames()) self.assertEqual(walk_tups_0, [(r"", [r"HKEY_LOCAL_MACHINE", r"HKEY_USERS"], [])]) walk_tups_1 = list(vfs.VFSOpen(pathspec).RecursiveListNames(depth=1)) self.assertEqual(walk_tups_1, [(r"", [r"HKEY_LOCAL_MACHINE", r"HKEY_USERS"], []), (r"HKEY_LOCAL_MACHINE", [r"SOFTWARE", r"SYSTEM"], []), (r"HKEY_USERS", [r"S-1-5-20", r"S-1-5-21-2911950750-476812067-1487428992-1001", r"S-1-5-21-702227000-2140022111-3110739999-1990"], [])]) walk_tups_inf = list(vfs.VFSOpen(pathspec).RecursiveListNames(depth=float( "inf"))) self.assertEqual( walk_tups_inf, [(r"", [r"HKEY_LOCAL_MACHINE", r"HKEY_USERS"], []), (r"HKEY_LOCAL_MACHINE", [r"SOFTWARE", r"SYSTEM"], []), (r"HKEY_LOCAL_MACHINE\SOFTWARE", [r"ListingTest", r"Microsoft"], []), (r"HKEY_LOCAL_MACHINE\SOFTWARE\ListingTest", [], [r"Value1", r"Value2"]), (r"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft", [r"Windows", r"Windows NT"], []), (r"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows", [r"CurrentVersion"], []), (r"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion", [], [r"ProgramFilesDir", r"ProgramFilesDir (x86)"]), (r"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT", [r"CurrentVersion"], []), (r"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion", [r"ProfileList"], [r"SystemRoot"]), (r"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" r"\ProfileList", [r"S-1-5-21-702227000-2140022111-3110739999-1990", r"S-1-5-21-702227068-2140022151-3110739409-1000"], [r"ProfilesDirectory", r"ProgramData"]), (r"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" r"\ProfileList\S-1-5-21-702227000-2140022111-3110739999-1990", [], [r"ProfileImagePath"]), (r"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" r"\ProfileList\S-1-5-21-702227068-2140022151-3110739409-1000", [], [r"ProfileImagePath"]), (r"HKEY_LOCAL_MACHINE\SYSTEM", [r"ControlSet001", r"Select"], []), (r"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001", [r"Control"], []), (r"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control", [r"Nls", r"Session Manager", r"TimeZoneInformation"], []), (r"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Nls", [r"CodePage"], []), (r"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Nls\CodePage", [], [r"ACP"]), (r"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager", [r"Environment"], []), (r"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager" r"\Environment", [], [r"Path", r"TEMP", r"windir"]), (r"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control" r"\TimeZoneInformation", [], [r"StandardName"]), (r"HKEY_LOCAL_MACHINE\SYSTEM\Select", [], [r"Current"]), (r"HKEY_USERS", [r"S-1-5-20", r"S-1-5-21-2911950750-476812067-1487428992-1001", r"S-1-5-21-702227000-2140022111-3110739999-1990"], []), (r"HKEY_USERS\S-1-5-20", [r"Software"], []), (r"HKEY_USERS\S-1-5-20\Software", [r"Microsoft"], []), (r"HKEY_USERS\S-1-5-20\Software\Microsoft", [r"Windows"], []), (r"HKEY_USERS\S-1-5-20\Software\Microsoft\Windows", [r"CurrentVersion"], []), (r"HKEY_USERS\S-1-5-20\Software\Microsoft\Windows\CurrentVersion", [r"Run"], []), (r"HKEY_USERS\S-1-5-20\Software\Microsoft\Windows\CurrentVersion\Run", [], [r"MctAdmin", r"Sidebar"]), (r"HKEY_USERS\S-1-5-21-2911950750-476812067-1487428992-1001", [r"Software"], []), (r"HKEY_USERS\S-1-5-21-2911950750-476812067-1487428992-1001\Software", [r"Microsoft"], []), (r"HKEY_USERS\S-1-5-21-2911950750-476812067-1487428992-1001\Software" r"\Microsoft", [r"Windows"], []), (r"HKEY_USERS\S-1-5-21-2911950750-476812067-1487428992-1001\Software" r"\Microsoft\Windows", [r"CurrentVersion"], []), (r"HKEY_USERS\S-1-5-21-2911950750-476812067-1487428992-1001\Software" r"\Microsoft\Windows\CurrentVersion", [r"Explorer"], []), (r"HKEY_USERS\S-1-5-21-2911950750-476812067-1487428992-1001\Software" r"\Microsoft\Windows\CurrentVersion\Explorer", [r"ComDlg32"], []), (r"HKEY_USERS\S-1-5-21-2911950750-476812067-1487428992-1001\Software" r"\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32", [r"OpenSavePidlMRU"], []), (r"HKEY_USERS\S-1-5-21-2911950750-476812067-1487428992-1001\Software" r"\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32" r"\OpenSavePidlMRU", [r"dd"], []), (r"HKEY_USERS\S-1-5-21-2911950750-476812067-1487428992-1001\Software" r"\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\OpenSavePidlMRU" r"\dd", [], [r"0"]), (r"HKEY_USERS\S-1-5-21-702227000-2140022111-3110739999-1990", [r"Software"], []), (r"HKEY_USERS\S-1-5-21-702227000-2140022111-3110739999-1990\Software", [r"Microsoft"], []), (r"HKEY_USERS\S-1-5-21-702227000-2140022111-3110739999-1990\Software" r"\Microsoft", [r"Windows"], []), (r"HKEY_USERS\S-1-5-21-702227000-2140022111-3110739999-1990\Software" r"\Microsoft\Windows", [r"CurrentVersion"], []), (r"HKEY_USERS\S-1-5-21-702227000-2140022111-3110739999-1990\Software" r"\Microsoft\Windows\CurrentVersion", [r"Run"], []), (r"HKEY_USERS\S-1-5-21-702227000-2140022111-3110739999-1990\Software" r"\Microsoft\Windows\CurrentVersion\Run", [], [r"NothingToSeeHere"])]) def main(argv): test_lib.main(argv) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/client/client_build.py000066400000000000000000000344541273104013200175270ustar00rootroot00000000000000#!/usr/bin/env python """This tool builds or repacks the client binaries. This handles invocations for the build across the supported platforms including handling Visual Studio, pyinstaller and other packaging mechanisms. """ import getpass import logging import os import platform import time # pylint: disable=unused-import from grr.client import client_plugins # pylint: enable=unused-import from grr.lib import builders from grr.lib import config_lib from grr.lib import flags from grr.lib import repacking from grr.lib import startup from grr.lib.builders import signing try: # pylint: disable=g-import-not-at-top from grr.lib.builders import component except ImportError: component = None parser = flags.PARSER # Guess which arch we should be building based on where we are running. if platform.architecture()[0] == "32bit": default_arch = "i386" else: default_arch = "amd64" default_platform = platform.system().lower() parser.add_argument( "--platform", choices=["darwin", "linux", "windows"], default=default_platform, help="The platform to build or repack for. This will default to " "the current platform: %s." % platform.system()) parser.add_argument("--arch", choices=["amd64", "i386"], default=default_arch, help="The architecture to build or repack for.") parser.add_argument("--sign", action="store_true", default=False, help="Sign executables.") # Guess which package format we should be building based on where we are # running. if default_platform == "linux": distro = platform.linux_distribution()[0] if distro in ["Ubuntu", "debian"]: default_package = "deb" elif distro in ["CentOS Linux", "CentOS", "centos", "redhat", "fedora"]: default_package = "rpm" else: default_package = None elif default_platform == "darwin": default_package = "dmg" elif default_platform == "windows": default_package = "exe" parser.add_argument( "--package_format", choices=["deb", "rpm", "dmg"], default=default_package, help="The packaging format to use when building a Linux client.") # Initialize sub parsers and their arguments. subparsers = parser.add_subparsers(title="subcommands", dest="subparser_name", description="valid subcommands") # Build arguments. parser_build = subparsers.add_parser("build", help="Build a client from source.") parser_build.add_argument("--output", default=None, help="The path to write the output template.") parser_repack = subparsers.add_parser( "repack", help="Build a deployable self installer from a package.") parser_repack.add_argument("--template", default=None, required=True, help="The template zip file to repack.") parser_repack.add_argument("--outputdir", default="", required=True, help="The directory to which we should write the " "output installer. Installers will be named " "automatically from config options. Incompatible" " with --output") parser_buildandrepack = subparsers.add_parser( "buildandrepack", help="Build and repack clients for multiple labels and architectures.") parser_buildandrepack.add_argument("--templatedir", default="", help="Directory" "containing template zip files to repack.") parser_buildandrepack.add_argument("--debug_build", action="store_true", default=False, help="Create a debug client.") if component: parser_build_component = subparsers.add_parser( "build_component", help="Build a client component.") parser_build_component.add_argument( "setup_file", help="Path to the setup.py file for the component.") parser_build_component.add_argument( "output", help="Path to store the compiled component.") parser_build_components = subparsers.add_parser( "build_components", help="Builds all client components.") parser_build_components.add_argument( "--output", default="", help="Path to store the compiled component.") args = parser.parse_args() def GetBuilder(context): """Get instance of builder class based on flags.""" try: if "Target:Darwin" in context: builder_class = builders.DarwinClientBuilder elif "Target:Windows" in context: builder_class = builders.WindowsClientBuilder elif "Target:LinuxDeb" in context: builder_class = builders.LinuxClientBuilder elif "Target:LinuxRpm" in context: builder_class = builders.CentosClientBuilder else: parser.error("Bad build context: %s" % context) except AttributeError: raise RuntimeError("Unable to build for platform %s when running " "on current platform." % args.platform) return builder_class(context=context) def GetSigner(context): if args.subparser_name in ["repack", "buildandrepack"]: if args.platform == "windows": print "Enter passphrase for code signing cert:" passwd = getpass.getpass() cert = config_lib.CONFIG.Get("ClientBuilder.windows_signing_cert", context=context) key = config_lib.CONFIG.Get("ClientBuilder.windows_signing_key", context=context) app_name = config_lib.CONFIG.Get( "ClientBuilder.windows_signing_application_name", context=context) return signing.WindowsCodeSigner(cert, key, passwd, app_name) elif args.platform == "linux" and args.package_format == "rpm": pub_keyfile = config_lib.CONFIG.Get( "ClientBuilder.rpm_signing_key_public_keyfile", context=context) gpg_name = config_lib.CONFIG.Get("ClientBuilder.rpm_gpg_name", context=context) print "Enter passphrase for code signing key %s:" % (gpg_name) passwd = getpass.getpass() return signing.RPMCodeSigner(passwd, pub_keyfile, gpg_name) else: parser.error("Signing only supported on windows and linux rpms for " "repack, buildandrepack") def TemplateInputFilename(context): """Build template file name from config.""" if args.templatedir: filename = config_lib.CONFIG.Get("PyInstaller.template_filename", context=context) return os.path.join(args.templatedir, filename) return None def BuildAndRepackWindows(signer=None): """Run buildandrepack for 32/64 dbg/prod.""" build_combos = [ {"arch": "amd64", "debug_build": True}, {"arch": "amd64", "debug_build": False}, {"arch": "i386", "debug_build": True}, {"arch": "i386", "debug_build": False} ] timestamp = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()) args.package_format = "exe" # TODO(user): Build components here. # component.BuildComponents(output_dir=output_dir) context_orig = SetOSContextFromArgs([]) # Take a copy of the context list so we can reset back to clean state for each # buildandrepack run context = list(context_orig) for argset in build_combos: for key, value in argset.items(): setattr(args, key, value) context = SetArchContextFromArgs(context) context = SetDebugContextFromArgs(context) print "Building for: %s" % context BuildAndRepack(context, timestamp=timestamp, signer=signer) context = list(context_orig) def BuildAndRepack(context, signer=None, timestamp=None): """Run build and repack to create installers.""" # ISO 8601 date timestamp = timestamp or time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()) # Output directory like: 2015-02-13T21:48:47-0800/linux_amd64_deb/ spec = "_".join((args.platform, args.arch, args.package_format)) output_dir = os.path.join( config_lib.CONFIG.Get("ClientBuilder.executables_dir", context=context), timestamp, spec) # If we weren't passed a template, build one if args.templatedir: template_path = TemplateInputFilename(context) else: component.BuildComponents(output_dir=output_dir) template_path = os.path.join(output_dir, config_lib.CONFIG.Get( "PyInstaller.template_filename", context=context)) builder_obj = GetBuilder(context) builder_obj.MakeExecutableTemplate(output_file=template_path) # Get the list of contexts which we should be building. context_list = config_lib.CONFIG.Get("ClientBuilder.BuildTargets") logging.info("Building installers for: %s", context_list) repacked_list = [] for repackcontext in context_list: # Add the settings for this context for newcontext in repackcontext.split(","): context.append(newcontext) try: # If the ClientBuilder.target_platforms doesn't match our environment, # skip. if not config_lib.CONFIG.MatchBuildContext(args.platform, args.arch, args.package_format, context=context): continue # Make a nicer filename out of the context string. context_filename = repackcontext.replace( "AllPlatforms Context,", "").replace(",", "_").replace(" ", "_") logging.info("Repacking %s as %s with labels: %s", repackcontext, config_lib.CONFIG.Get("Client.name", context=context), config_lib.CONFIG.Get("Client.labels", context=context)) repacking.TemplateRepacker().RepackTemplate( template_path, os.path.join(output_dir, context_filename), signer=signer, context=context) repacked_list.append(context_filename) finally: # Remove the custom settings for the next repack for newcontext in repackcontext.split(","): context.remove(newcontext) logging.info("Complete, installers for %s are in %s", repacked_list, output_dir) def Repack(context, signer=None): """Reconfigure a client template to match config. Args: context: config_lib context signer: lib.builders.signing.CodeSigner object """ repacking.TemplateRepacker().RepackTemplate(args.template, args.outputdir, context=context, signer=signer) def SetOSContextFromArgs(context): """Set OS context sections based on args.""" context.append("ClientBuilder Context") if args.platform == "darwin": context = ["Platform:Darwin", "Target:Darwin"] + context elif args.platform == "windows": context = ["Platform:Windows", "Target:Windows"] + context elif args.platform == "linux": context = ["Platform:Linux", "Target:Linux"] + context if args.package_format == "deb": context = ["Target:LinuxDeb"] + context elif args.package_format == "rpm": context = ["Target:LinuxRpm"] + context else: parser.error("Couldn't guess packaging format for: %s" % platform.linux_distribution()[0]) else: parser.error("Unsupported build platform: %s" % args.platform) return context def SetArchContextFromArgs(context): if args.arch == "amd64": context.append("Arch:amd64") else: context.append("Arch:i386") return context def SetDebugContextFromArgs(context): if args.subparser_name != "build" and getattr(args, "debug_build", None): context += ["DebugClientBuild Context"] return context def SetContextFromArgs(context): context = SetArchContextFromArgs(context) context = SetDebugContextFromArgs(context) return SetOSContextFromArgs(context) def main(_): """Launch the appropriate builder.""" config_lib.CONFIG.AddContext( "ClientBuilder Context", "Context applied when we run the client builder script.") startup.ClientInit() # Use basic console output logging so we can see what is happening. logger = logging.getLogger() handler = logging.StreamHandler() handler.setLevel(logging.INFO) logger.handlers = [handler] context = flags.FLAGS.context context = SetContextFromArgs(context) signer = None if args.sign: if not args.templatedir: raise RuntimeError("Signing must be performed on the host system since " "that's where the keys are. If you want signed " "binaries you need to build templates in the vagrant " "vms then pass the templatedir here to do the repack " "and sign operation on the host.") signer = GetSigner(context) if args.subparser_name == "build": template_path = None if flags.FLAGS.output: template_path = os.path.join(flags.FLAGS.output, config_lib.CONFIG.Get( "PyInstaller.template_filename", context=context)) builder_obj = GetBuilder(context) builder_obj.MakeExecutableTemplate(output_file=template_path) elif args.subparser_name == "repack": # Don't set any context from this machine, it's all in the template. context = flags.FLAGS.context Repack(context, signer=signer) elif args.subparser_name == "buildandrepack": if args.platform == "windows": # Handle windows differently because we do 32, 64, and debug builds all at # once. BuildAndRepackWindows(signer=signer) else: BuildAndRepack(context, signer=signer) elif args.subparser_name == "build_components": component.BuildComponents(output_dir=flags.FLAGS.output) elif args.subparser_name == "build_component": component.BuildComponent(flags.FLAGS.setup_file, output_dir=flags.FLAGS.output) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/client/client_plugins.py000066400000000000000000000016611273104013200201030ustar00rootroot00000000000000#!/usr/bin/env python """Centralized import point for client plugins. This acts as a centralized point for modules that need to be loaded for the client components so that the startup.Init() function will find and register them. This also acts as a sensible single place to add deployment specific plugin modules that have been customized for your deployment. """ import sys # pylint: disable=g-import-not-at-top,unused-import,g-bad-import-order # Load the os specific modules. if sys.platform == "win32": from grr.client import windows elif sys.platform == "darwin": from grr.client import osx elif "linux" in sys.platform: from grr.client import linux from grr.client import client_actions from grr.client import comms from grr.client import local from grr.client import vfs_handlers from grr.lib import log from grr.lib.rdfvalues import registry_init # Config definitions use Semantic Values from plugins. from grr import config grr-3.1.0.2/grr/client/client_stats.py000066400000000000000000000040511273104013200175540ustar00rootroot00000000000000#!/usr/bin/env python """CPU/IO stats collector.""" import os import threading import time import psutil from grr.lib import rdfvalue from grr.lib import stats class ClientStatsCollector(threading.Thread): """This thread keeps track of client stats.""" exit = False def __init__(self, worker, sleep_time=10): super(ClientStatsCollector, self).__init__() self.sleep_time = sleep_time self.daemon = True self.proc = psutil.Process(os.getpid()) self.cpu_samples = [] self.io_samples = [] self.worker = worker stats.STATS.RegisterGaugeMetric("grr_client_cpu_usage", str) stats.STATS.SetGaugeCallback("grr_client_cpu_usage", self.PrintCpuSamples) stats.STATS.RegisterGaugeMetric("grr_client_io_usage", str) stats.STATS.SetGaugeCallback("grr_client_io_usage", self.PrintIOSample) def run(self): while not self.exit: time.sleep(self.sleep_time) self.Collect() # Let the worker check if it should send back the stats. self.worker.CheckStats() def Collect(self): """Collects the stats.""" user, system = self.proc.cpu_times() percent = self.proc.cpu_percent() self.cpu_samples.append((rdfvalue.RDFDatetime().Now(), user, system, percent )) # Keep stats for one hour. self.cpu_samples = self.cpu_samples[-3600 / self.sleep_time:] # Not supported on MacOS. try: _, _, read_bytes, write_bytes = self.proc.io_counters() self.io_samples.append((rdfvalue.RDFDatetime().Now(), read_bytes, write_bytes)) self.io_samples = self.io_samples[-3600 / self.sleep_time:] except (AttributeError, NotImplementedError, psutil.Error): pass def PrintCpuSamples(self): """Returns a string with last 20 cpu load samples.""" samples = [str(sample[3]) for sample in self.cpu_samples[-20:]] return ", ".join(samples) def PrintIOSample(self): try: return str(self.proc.io_counters()) except (NotImplementedError, AttributeError): return "Not available on this platform." grr-3.1.0.2/grr/client/client_test.py000066400000000000000000000133111273104013200173740ustar00rootroot00000000000000#!/usr/bin/env python """Tests for the client.""" # Need to import client to add the flags. from grr.client import actions # Load all the standard actions. # pylint: disable=unused-import from grr.client import client_actions # pylint: enable=unused-import from grr.client import comms from grr.lib import flags from grr.lib import rdfvalue from grr.lib import test_lib from grr.lib.rdfvalues import client as rdf_client from grr.lib.rdfvalues import flows as rdf_flows class MockAction(actions.ActionPlugin): in_rdfvalue = rdf_client.LogMessage out_rdfvalues = [rdf_client.LogMessage] def Run(self, message): self.SendReply(rdf_client.EchoRequest(data="Received Message: %s. Data %s" % (message.data, "x" * 100))) class RaiseAction(actions.ActionPlugin): """A mock action which raises an error.""" in_rdfvalue = rdf_client.LogMessage out_rdfvalues = [rdf_client.LogMessage] def Run(self, unused_args): raise RuntimeError("I dont like.") class TestedContext(comms.GRRClientWorker): """We test a simpler Context without crypto here.""" def LoadCertificates(self): self.certs_loaded = True class BasicContextTests(test_lib.GRRBaseTest): """Test the GRR contexts.""" to_test_context = TestedContext def setUp(self): super(BasicContextTests, self).setUp() self.context = self.to_test_context() self.context.LoadCertificates() self.session_id = rdfvalue.RDFURN("W:1234") def testHandleMessage(self): """Test handling of a normal request with a response.""" args = rdf_client.LogMessage(data="hello") # Push a request on it message = rdf_flows.GrrMessage( name="MockAction", session_id=self.session_id, auth_state=rdf_flows.GrrMessage.AuthorizationState.AUTHENTICATED, payload=args, request_id=1) self.context.HandleMessage(message) # Check the response - one data and one status message_list = self.context.Drain().job self.assertEqual(message_list[0].session_id, self.session_id) self.assertEqual(message_list[0].response_id, 1) self.assertIn("hello", message_list[0].payload.data) self.assertEqual(message_list[1].response_id, 2) self.assertEqual(message_list[1].type, rdf_flows.GrrMessage.Type.STATUS) def testHandleError(self): """Test handling of a request which raises.""" # Push a request on it message = rdf_flows.GrrMessage( name="RaiseAction", session_id=self.session_id, auth_state=rdf_flows.GrrMessage.AuthorizationState.AUTHENTICATED, request_id=1) self.context.HandleMessage(message) # Check the response - one data and one status message_list = self.context.Drain().job self.assertEqual(message_list[0].session_id, self.session_id) self.assertEqual(message_list[0].response_id, 1) status = rdf_flows.GrrStatus(message_list[0].payload) self.assertIn("RuntimeError", status.error_message) self.assertNotEqual(status.status, rdf_flows.GrrStatus.ReturnedStatus.OK) def testUnauthenticated(self): """What happens if an unauthenticated message is sent to the client? RuntimeError needs to be issued, and the client needs to send a GrrStatus message with the traceback in it. """ # Push a request on it message = rdf_flows.GrrMessage( name="MockAction", session_id=self.session_id, auth_state=rdf_flows.GrrMessage.AuthorizationState.UNAUTHENTICATED, request_id=1) self.context.HandleMessage(message) # We expect to receive an GrrStatus to indicate an exception was # raised: # Check the response - one data and one status message_list = self.context.Drain().job self.assertEqual(len(message_list), 1) self.assertEqual(message_list[0].session_id, self.session_id) self.assertEqual(message_list[0].response_id, 1) status = rdf_flows.GrrStatus(message_list[0].payload) self.assertIn("not Authenticated", status.error_message) self.assertIn("RuntimeError", status.error_message) self.assertNotEqual(status.status, rdf_flows.GrrStatus.ReturnedStatus.OK) def testPriorityAndFastPoll(self): """Test priority and fast poll settings propagated to status results.""" for i in range(10): message = rdf_flows.GrrMessage( name="MockAction", session_id=self.session_id.Basename() + str(i), auth_state=rdf_flows.GrrMessage.AuthorizationState.UNAUTHENTICATED, request_id=1, priority=i % 3, require_fastpoll=i % 2) self.context.HandleMessage(message) message_list = self.context.Drain(max_size=1000000).job self.assertEqual(len(message_list), 10) self.assertEqual([m.priority for m in message_list], [2, 2, 2, 1, 1, 1, 0, 0, 0, 0]) self.assertEqual([m.require_fastpoll for m in message_list], [0, 1, 0, 1, 0, 1, 0, 1, 0, 1]) def testSizeQueue(self): queue = comms.SizeQueue(maxsize=10000000) for _ in range(10): queue.Put("A", 1) queue.Put("B", 1) queue.Put("C", 2) result = [] for item in queue.Get(): result.append(item) self.assertEqual(result, ["C"] * 10 + ["A", "B"] * 10) # Tests a partial Get(). for _ in range(7): queue.Put("A", 1) queue.Put("B", 1) queue.Put("C", 2) result = [] for item in queue.Get(): result.append(item) if len(result) == 5: break self.assertEqual(result, ["C"] * 5) for _ in range(3): queue.Put("A", 1) queue.Put("B", 1) queue.Put("C", 2) for item in queue.Get(): result.append(item) self.assertEqual(result, ["C"] * 10 + ["A", "B"] * 10) def main(argv): test_lib.main(argv) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/client/client_utils.py000066400000000000000000000031041273104013200175540ustar00rootroot00000000000000#!/usr/bin/env python """Client utilities.""" import sys # Select the version of what we want based on the OS: # pylint: disable=g-bad-name # pylint: disable=g-import-not-at-top if sys.platform == "win32": from grr.client import client_utils_windows FindProxies = client_utils_windows.WinFindProxies GetRawDevice = client_utils_windows.WinGetRawDevice CanonicalPathToLocalPath = client_utils_windows.CanonicalPathToLocalPath LocalPathToCanonicalPath = client_utils_windows.LocalPathToCanonicalPath NannyController = client_utils_windows.NannyController KeepAlive = client_utils_windows.KeepAlive WinChmod = client_utils_windows.WinChmod elif sys.platform == "darwin": from grr.client import client_utils_osx from grr.client import client_utils_linux FindProxies = client_utils_osx.OSXFindProxies GetRawDevice = client_utils_osx.OSXGetRawDevice # Should be the same as linux. CanonicalPathToLocalPath = client_utils_linux.CanonicalPathToLocalPath LocalPathToCanonicalPath = client_utils_linux.LocalPathToCanonicalPath # Should be the same as linux. NannyController = client_utils_linux.NannyController KeepAlive = client_utils_osx.KeepAlive else: from grr.client import client_utils_linux # Linux platform FindProxies = client_utils_linux.LinFindProxies GetRawDevice = client_utils_linux.LinGetRawDevice CanonicalPathToLocalPath = client_utils_linux.CanonicalPathToLocalPath LocalPathToCanonicalPath = client_utils_linux.LocalPathToCanonicalPath NannyController = client_utils_linux.NannyController KeepAlive = client_utils_linux.KeepAlive grr-3.1.0.2/grr/client/client_utils_common.py000066400000000000000000000143011273104013200211250ustar00rootroot00000000000000#!/usr/bin/env python """Client utilities common to all platforms.""" import os import platform import subprocess import threading import time import logging from grr.lib import config_lib from grr.lib import utils def HandleAlarm(process): try: logging.info("Killing child process due to timeout") process.kill() # There is a race condition here where the process terminates # just before it would be killed. We ignore the exception # in that case as the process is already gone. except OSError: pass def Execute(cmd, args, time_limit=-1, bypass_whitelist=False, daemon=False, use_client_context=False): """Executes commands on the client. This function is the only place where commands will be executed by the GRR client. This makes sure that all issued commands are compared to a white list and no malicious commands are issued on the client machine. Args: cmd: The command to be executed. args: List of arguments. time_limit: Time in seconds the process is allowed to run. bypass_whitelist: Allow execution of things that are not in the whitelist. Note that this should only ever be called on a binary that passes the VerifySignedBlob check. daemon: Start the new process in the background. use_client_context: Run this script in the client's context. Defaults to system context. Returns: A tuple of stdout, stderr, return value and time taken. """ if not bypass_whitelist and not IsExecutionWhitelisted(cmd, args): # Whitelist doesn't contain this cmd/arg pair logging.info("Execution disallowed by whitelist: %s %s.", cmd, " ".join(args)) return ("", "Execution disallowed by whitelist.", -1, -1) if daemon: pid = os.fork() if pid == 0: # This is the child, it will run the daemon process. We call os.setsid # here to become the session leader of this new session and the process # group leader of the new process group so we don't get killed when the # main process exits. try: os.setsid() except OSError: # This only works if the process is running as root. pass _Execute(cmd, args, time_limit, use_client_context=use_client_context) os._exit(0) # pylint: disable=protected-access else: return _Execute(cmd, args, time_limit, use_client_context=use_client_context) def _Execute(cmd, args, time_limit=-1, use_client_context=False): """Executes cmd.""" run = [cmd] run.extend(args) env = os.environ.copy() if use_client_context: env.pop("LD_LIBRARY_PATH", None) env.pop("PYTHON_PATH", None) context = "client" else: context = "system" logging.info("Executing %s in %s context.", " ".join(run), context) p = subprocess.Popen(run, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env) alarm = None if time_limit > 0: alarm = threading.Timer(time_limit, HandleAlarm, (p,)) alarm.setDaemon(True) alarm.start() stdout, stderr, exit_status = "", "", -1 start_time = time.time() try: stdout, stderr = p.communicate() exit_status = p.returncode except IOError: # If we end up here, the time limit was exceeded pass finally: if alarm: alarm.cancel() return (stdout, stderr, exit_status, time.time() - start_time) def IsExecutionWhitelisted(cmd, args): """Check if a binary and args is whitelisted. Args: cmd: Canonical path to the binary. args: List of arguments to be passed to the binary. Returns: Bool, True if it is whitelisted. These whitelists could also go in the platform specific client files client_utils_.py. We chose to leave them here instead of putting them in global arrays to discourage people coding other modules from adding new commands to the whitelist before running them. The idea is to have a single place that lists every command we can run during normal operation (obviously doesn't catch the special cases where we bypass the list). """ if platform.system() == "Windows": whitelist = [ ("driverquery.exe", ["/v"]), ("ipconfig.exe", ["/all"]), ("tasklist.exe", ["/SVC"]), ("tasklist.exe", ["/v"]), ] elif platform.system() == "Linux": whitelist = [ ("/bin/df", []), ("/bin/echo", ["1"]), ("/bin/rpm", ["-qa"]), ("/bin/sleep", ["10"]), ("/sbin/auditctl", ["-l"]), ("/sbin/ifconfig", ["-a"]), ("/sbin/iptables", ["-L", "-n", "-v"]), ("/sbin/lsmod", []), ("/usr/bin/dpkg", ["--list"]), ("/usr/bin/last", []), ("/usr/bin/yum", ["list", "installed", "-q"]), ("/usr/bin/yum", ["repolist", "-v", "-q"]), ("/usr/bin/who", []), ("/usr/sbin/dmidecode", ["-q"]), ("/usr/sbin/sshd", ["-T"]), ] elif platform.system() == "Darwin": whitelist = [ ("/bin/echo", ["1"]), ("/bin/launchctl", ["unload", config_lib.CONFIG["Client.plist_path"]]), ("/usr/bin/hdiutil", ["info"]), ("/usr/bin/last", []), ("/usr/bin/who", []), ("/usr/sbin/kextstat", []), ("/usr/sbin/system_profiler", ["-xml", "SPHardwareDataType"]), ] else: whitelist = [] for (allowed_cmd, allowed_args) in whitelist: if cmd == allowed_cmd and args == allowed_args: return True return False LOG_THROTTLE_CACHE = utils.TimeBasedCache(max_size=10, max_age=60 * 60) def ErrorOnceAnHour(msg, *args, **kwargs): """Logging helper function mirroring logging but reduces spam. Read notes. Args: msg: The message. *args: Passthrough to logging function. **kwargs: Passthrough to logging function. Note: The same msg will only be logged once per hour. Note that args will be ignored so the following will only output one line. ThrottledLog(logging.WARN, "oh no %s", "joe") ThrottledLog(logging.WARN, "oh no %s", "bob") """ try: LOG_THROTTLE_CACHE.Get(msg) except KeyError: logging.error(msg, *args, **kwargs) LOG_THROTTLE_CACHE.Put(msg, msg) grr-3.1.0.2/grr/client/client_utils_linux.py000066400000000000000000000204211273104013200207740ustar00rootroot00000000000000#!/usr/bin/env python # -*- mode: python; encoding: utf-8 -*- """Linux specific utils.""" import locale import os import sys import threading import time import psutil from google.protobuf import message import logging from grr.lib import config_lib from grr.lib import rdfvalue from grr.lib import utils from grr.lib.rdfvalues import flows as rdf_flows from grr.lib.rdfvalues import paths as rdf_paths # TODO(user): Find a reliable way to do this for Linux. def LinFindProxies(): return [] MOUNTPOINT_CACHE = [0, None] def GetMountpoints(data=None): """List all the filesystems mounted on the system.""" expiry = 60 # 1 min insert_time = MOUNTPOINT_CACHE[0] if insert_time + expiry > time.time(): return MOUNTPOINT_CACHE[1] devices = {} # Check all the mounted filesystems. if data is None: data = "\n".join([open(x).read() for x in ["/proc/mounts", "/etc/mtab"]]) for line in data.splitlines(): try: device, mnt_point, fs_type, _ = line.split(" ", 3) mnt_point = os.path.normpath(mnt_point) # What if several devices are mounted on the same mount point? devices[mnt_point] = (device, fs_type) except ValueError: pass MOUNTPOINT_CACHE[0] = time.time() MOUNTPOINT_CACHE[1] = devices return devices def LinGetRawDevice(path): """Resolve the raw device that contains the path.""" device_map = GetMountpoints() path = utils.SmartUnicode(path) mount_point = path = utils.NormalizePath(path, "/") result = rdf_paths.PathSpec(pathtype=rdf_paths.PathSpec.PathType.OS) # Assign the most specific mount point to the result while mount_point: try: result.path, fs_type = device_map[mount_point] if fs_type in ["ext2", "ext3", "ext4", "vfat", "ntfs"]: # These are read filesystems result.pathtype = rdf_paths.PathSpec.PathType.OS else: result.pathtype = rdf_paths.PathSpec.PathType.UNSET # Drop the mount point path = utils.NormalizePath(path[len(mount_point):]) result.mount_point = mount_point return result, path except KeyError: mount_point = os.path.dirname(mount_point) def CanonicalPathToLocalPath(path): """Linux uses a normal path. If sys.getfilesystemencoding() returns None normally any call to a system function will try to encode the string to ASCII. A modern version of Linux will use UTF-8 as (narrow) string encoding. locale.getpreferredencoding() seems to return ASCII at this point. So for older versions of Linux we'll need to rely on locale.getdefaultlocale()[1]. If everything fails we fallback to UTF-8. Args: path: the canonical path as an Unicode string Returns: a unicode string or an encoded (narrow) string dependent on system settings """ canonical_path = utils.NormalizePath(path) if sys.getfilesystemencoding(): return canonical_path encoding = locale.getdefaultlocale()[1] or "UTF-8" return canonical_path.encode(encoding) def LocalPathToCanonicalPath(path): """Linux uses a normal path.""" return utils.NormalizePath(path) class NannyThread(threading.Thread): """This is the thread which watches the nanny running.""" def __init__(self, unresponsive_kill_period): """Constructor. Args: unresponsive_kill_period: The time in seconds which we wait for a heartbeat. """ super(NannyThread, self).__init__(name="Nanny") self.last_heart_beat_time = time.time() self.unresponsive_kill_period = unresponsive_kill_period self.running = True self.daemon = True self.proc = psutil.Process() self.memory_quota = config_lib.CONFIG["Client.rss_max_hard"] * 1024 * 1024 def run(self): self.WriteNannyStatus("Nanny running.") while self.running: now = time.time() # When should we check the next heartbeat? check_time = self.last_heart_beat_time + self.unresponsive_kill_period # Missed the deadline, we need to die. if check_time < now: msg = "Suicide by nanny thread." logging.error(msg) self.WriteNannyStatus(msg) # Die hard here to prevent hangs due to non daemonized threads. os._exit(-1) # pylint: disable=protected-access else: # Sleep until the next heartbeat is due. self.Sleep(check_time - now) def Sleep(self, seconds): """Sleep a given time in 1 second intervals. When a machine is suspended during a time.sleep(n) call for more than n seconds, sometimes the sleep is interrupted and all threads wake up at the same time. This leads to race conditions between the threads issuing the heartbeat and the one checking for it. By sleeping in small intervals, we make sure that even if one sleep call is interrupted, we do not check for the heartbeat too early. Args: seconds: Number of seconds to sleep. Raises: MemoryError: if the process exceeds memory quota. """ time.sleep(seconds - int(seconds)) for _ in xrange(int(seconds)): time.sleep(1) # Check that we do not exceeded our memory allowance. if self.GetMemoryUsage() > self.memory_quota: raise MemoryError("Exceeded memory allowance.") def Stop(self): """Exits the main thread.""" self.running = False self.WriteNannyStatus("Nanny stopping.") def GetMemoryUsage(self): return self.proc.memory_info().rss def Heartbeat(self): self.last_heart_beat_time = time.time() def WriteNannyStatus(self, status): try: with open(config_lib.CONFIG["Nanny.statusfile"], "w") as fd: fd.write(status) except (IOError, OSError): pass class NannyController(object): """Controls communication with the nanny.""" # Nanny should be a global singleton thread. nanny = None nanny_logfile = None max_log_size = 100000000 def StartNanny(self, unresponsive_kill_period=None, nanny_logfile=None): # The nanny thread is a singleton. if NannyController.nanny is None: if unresponsive_kill_period is None: unresponsive_kill_period = config_lib.CONFIG[ "Nanny.unresponsive_kill_period"] NannyController.nanny_logfile = nanny_logfile NannyController.nanny = NannyThread(unresponsive_kill_period) NannyController.nanny.start() def StopNanny(self): if NannyController.nanny: NannyController.nanny.Stop() NannyController.nanny = None def Heartbeat(self): """Notifies the nanny of a heartbeat.""" if self.nanny: self.nanny.Heartbeat() def _GetLogFilename(self): return self.nanny_logfile or config_lib.CONFIG["Nanny.logfile"] def WriteTransactionLog(self, grr_message): """Write the message into the transaction log.""" try: grr_message = grr_message.SerializeToString() except AttributeError: grr_message = str(grr_message) logfile = self._GetLogFilename() try: with open(logfile, "w") as fd: fd.write(grr_message) except (IOError, OSError): # Check if we're missing directories and try to create them. if not os.path.isdir(os.path.dirname(logfile)): try: os.makedirs(os.path.dirname(logfile)) with open(logfile, "w") as fd: fd.write(grr_message) except (IOError, OSError): logging.exception("Couldn't write nanny transaction log to %s", logfile) def SyncTransactionLog(self): # Not implemented on Linux. pass def CleanTransactionLog(self): """Wipes the transaction log.""" try: with open(self._GetLogFilename(), "w") as fd: fd.write("") except (IOError, OSError): pass def GetTransactionLog(self): """Return a GrrMessage instance from the transaction log or None.""" try: with open(self._GetLogFilename(), "r") as fd: data = fd.read(self.max_log_size) except (IOError, OSError): return try: if data: return rdf_flows.GrrMessage(data) except (message.Error, rdfvalue.Error): return def GetNannyMessage(self): # Not implemented on Linux. return None def ClearNannyMessage(self): # Not implemented on Linux. pass def GetNannyStatus(self): try: with open(config_lib.CONFIG["Nanny.statusfile"], "r") as fd: return fd.read(self.max_log_size) except (IOError, OSError): return None def KeepAlive(): # Not yet supported for Linux. pass grr-3.1.0.2/grr/client/client_utils_osx.py000066400000000000000000000211301273104013200204440ustar00rootroot00000000000000#!/usr/bin/env python """OSX specific utils.""" import ctypes import ctypes.util import os import platform import logging from grr.client import client_utils_linux from grr.client.osx import objc from grr.lib import utils from grr.lib.rdfvalues import paths as rdf_paths def OSXFindProxies(): """This reads the OSX system configuration and gets the proxies.""" sc = objc.SystemConfiguration() # Get the dictionary of network proxy settings settings = sc.dll.SCDynamicStoreCopyProxies(None) if not settings: return [] try: cf_http_enabled = sc.CFDictRetrieve(settings, "kSCPropNetProxiesHTTPEnable") if cf_http_enabled and bool(sc.CFNumToInt32(cf_http_enabled)): # Proxy settings for HTTP are enabled cfproxy = sc.CFDictRetrieve(settings, "kSCPropNetProxiesHTTPProxy") cfport = sc.CFDictRetrieve(settings, "kSCPropNetProxiesHTTPPort") if cfproxy and cfport: proxy = sc.CFStringToPystring(cfproxy) port = sc.CFNumToInt32(cfport) return ["http://%s:%d/" % (proxy, port)] cf_auto_enabled = sc.CFDictRetrieve( settings, "kSCPropNetProxiesProxyAutoConfigEnable") if cf_auto_enabled and bool(sc.CFNumToInt32(cf_auto_enabled)): cfurl = sc.CFDictRetrieve(settings, "kSCPropNetProxiesProxyAutoConfigURLString") if cfurl: unused_url = sc.CFStringToPystring(cfurl) # TODO(user): Auto config is enabled, what is the plan here? # Basically, all we get is the URL of a javascript file. To get the # correct proxy for a given URL, browsers call a Javascript function # that returns the correct proxy URL. The question is now, do we really # want to start running downloaded js on the client? return [] finally: sc.dll.CFRelease(settings) return [] def GetMountpoints(): """List all the filesystems mounted on the system.""" devices = {} for filesys in GetFileSystems(): devices[filesys.f_mntonname] = (filesys.f_mntfromname, filesys.f_fstypename) return devices class StatFSStruct(utils.Struct): """Parse filesystems getfsstat.""" _fields = [ ("h", "f_otype;"), ("h", "f_oflags;"), ("l", "f_bsize;"), ("l", "f_iosize;"), ("l", "f_blocks;"), ("l", "f_bfree;"), ("l", "f_bavail;"), ("l", "f_files;"), ("l", "f_ffree;"), ("Q", "f_fsid;"), ("l", "f_owner;"), ("h", "f_reserved1;"), ("h", "f_type;"), ("l", "f_flags;"), ("2l", "f_reserved2"), ("15s", "f_fstypename"), ("90s", "f_mntonname"), ("90s", "f_mntfromname"), ("x", "f_reserved3"), ("16x", "f_reserved4") ] # pyformat:disable class StatFS64Struct(utils.Struct): """Parse filesystems getfsstat for 64 bit.""" _fields = [ (" 0) def testUnicodeFile(self): """Test ability to read unicode files from images.""" path = os.path.join(self.base_path, "test_img.dd") path2 = os.path.join(u"×יןד ןד ש ×קד×", u"×יןד.txt") ps2 = rdf_paths.PathSpec(path=path2, pathtype=rdf_paths.PathSpec.PathType.TSK) ps = rdf_paths.PathSpec(path=path, pathtype=rdf_paths.PathSpec.PathType.OS) ps.Append(ps2) fd = vfs.VFSOpen(ps) self.TestFileHandling(fd) def testListDirectory(self): """Test our ability to list a directory.""" directory = vfs.VFSOpen(rdf_paths.PathSpec( path=self.base_path, pathtype=rdf_paths.PathSpec.PathType.OS)) self.CheckDirectoryListing(directory, "morenumbers.txt") def testTSKListDirectory(self): """Test directory listing in sleuthkit.""" path = os.path.join(self.base_path, u"test_img.dd") ps2 = rdf_paths.PathSpec(path=u"入乡éšä¿— 海外春节别样过法", pathtype=rdf_paths.PathSpec.PathType.TSK) ps = rdf_paths.PathSpec(path=path, pathtype=rdf_paths.PathSpec.PathType.OS) ps.Append(ps2) directory = vfs.VFSOpen(ps) self.CheckDirectoryListing(directory, u"入乡éšä¿—.txt") def testRecursiveImages(self): """Test directory listing in sleuthkit.""" p3 = rdf_paths.PathSpec(path="/home/a.txt", pathtype=rdf_paths.PathSpec.PathType.TSK) p2 = rdf_paths.PathSpec(path="/home/image2.img", pathtype=rdf_paths.PathSpec.PathType.TSK) p1 = rdf_paths.PathSpec(path=os.path.join(self.base_path, "test_img.dd"), pathtype=rdf_paths.PathSpec.PathType.OS) p2.Append(p3) p1.Append(p2) f = vfs.VFSOpen(p1) self.assertEqual(f.read(3), "yay") def testGuessPathSpec(self): """Test that we can guess a pathspec from a path.""" path = os.path.join(self.base_path, "test_img.dd", "home/image2.img", "home/a.txt") pathspec = rdf_paths.PathSpec(path=path, pathtype=rdf_paths.PathSpec.PathType.OS) fd = vfs.VFSOpen(pathspec) self.assertEqual(fd.read(3), "yay") def testFileNotFound(self): """Test that we raise an IOError for file not found.""" path = os.path.join(self.base_path, "test_img.dd", "home/image2.img", "home/nosuchfile.txt") pathspec = rdf_paths.PathSpec(path=path, pathtype=rdf_paths.PathSpec.PathType.OS) self.assertRaises(IOError, vfs.VFSOpen, pathspec) def testGuessPathSpecPartial(self): """Test that we can guess a pathspec from a partial pathspec.""" path = os.path.join(self.base_path, "test_img.dd") pathspec = rdf_paths.PathSpec(path=path, pathtype=rdf_paths.PathSpec.PathType.OS) pathspec.nested_path.path = "/home/image2.img/home/a.txt" pathspec.nested_path.pathtype = rdf_paths.PathSpec.PathType.TSK fd = vfs.VFSOpen(pathspec) self.assertEqual(fd.read(3), "yay") # Open as a directory pathspec.nested_path.path = "/home/image2.img/home/" fd = vfs.VFSOpen(pathspec) names = [] for s in fd.ListFiles(): # Make sure that the stat pathspec is correct - it should be 3 levels # deep. self.assertEqual(s.pathspec.nested_path.path, "/home/image2.img") names.append(s.pathspec.nested_path.nested_path.path) self.assertTrue("home/a.txt" in names) def testRegistryListing(self): """Test our ability to list registry keys.""" reg = rdf_paths.PathSpec.PathType.REGISTRY with test_lib.VFSOverrider(reg, test_lib.FakeRegistryVFSHandler): pathspec = rdf_paths.PathSpec( pathtype=rdf_paths.PathSpec.PathType.REGISTRY, path=("/HKEY_USERS/S-1-5-20/Software/Microsoft" "/Windows/CurrentVersion/Run")) expected_names = {"MctAdmin": stat.S_IFDIR, "Sidebar": stat.S_IFDIR} expected_data = [u"%ProgramFiles%\\Windows Sidebar\\Sidebar.exe /autoRun", u"%TEMP%\\Sidebar.exe"] for f in vfs.VFSOpen(pathspec).ListFiles(): base, name = os.path.split(f.pathspec.CollapsePath()) self.assertEqual(base, pathspec.CollapsePath()) self.assertIn(name, expected_names) self.assertIn(f.registry_data.GetValue(), expected_data) def CheckDirectoryListing(self, directory, test_file): """Check that the directory listing is sensible.""" found = False for f in directory.ListFiles(): # TSK makes virtual files with $ if front of them path = f.pathspec.Basename() if path.startswith("$"): continue # Check the time is reasonable self.assertGreater(f.st_mtime, 10000000) self.assertGreater(f.st_atime, 10000000) self.assertGreater(f.st_ctime, 10000000) if path == test_file: found = True # Make sure its a regular file with the right size self.assertTrue(stat.S_ISREG(f.st_mode)) self.assertEqual(f.st_size, 3893) self.assertEqual(found, True) # Raise if we try to read the contents of a directory object. self.assertRaises(IOError, directory.Read, 5) def testVFSVirtualRoot(self): # Let's open a file in the virtual root. os_root = "os:%s" % self.base_path with test_lib.ConfigOverrider({"Client.vfs_virtualroots": [os_root]}): # We need to reset the vfs.VFS_VIRTUALROOTS too. vfs.VFSInit().Run() fd = vfs.VFSOpen(rdf_paths.PathSpec( path="/morenumbers.txt", pathtype=rdf_paths.PathSpec.PathType.OS)) data = fd.read(10) self.assertEqual(data, "1\n2\n3\n4\n5\n") # This should also work with TSK. tsk_root = "tsk:%s" % os.path.join(self.base_path, "test_img.dd") with test_lib.ConfigOverrider({"Client.vfs_virtualroots": [tsk_root]}): vfs.VFSInit().Run() image_file_ps = rdf_paths.PathSpec( path=u"×יןד ןד ש ×קד×/×יןד.txt", pathtype=rdf_paths.PathSpec.PathType.TSK) fd = vfs.VFSOpen(image_file_ps) data = fd.read(10) self.assertEqual(data, "1\n2\n3\n4\n5\n") # This should not influence vfs handlers other than OS and TSK. reg_type = rdf_paths.PathSpec.PathType.REGISTRY os_handler = vfs.VFS_HANDLERS[rdf_paths.PathSpec.PathType.OS] with test_lib.VFSOverrider(reg_type, os_handler): with self.assertRaises(IOError): image_file_ps.pathtype = reg_type vfs.VFSOpen(image_file_ps) def testFileSizeOverride(self): # We assume /dev/null exists and has a 0 size. fname = "/dev/null" try: st = os.stat(fname) except OSError: self.skipTest("%s not accessible." % fname) if st.st_size != 0: self.skipTest("%s doesn't have 0 size." % fname) pathspec = rdf_paths.PathSpec(path=fname, pathtype="OS", file_size_override=100000000) fd = vfs.VFSOpen(pathspec) self.assertEqual(fd.size, 100000000) def testRecursiveListNames(self): """Test our ability to walk over a directory tree.""" path = os.path.join(self.base_path, "a") directory = vfs.VFSOpen(rdf_paths.PathSpec( path=path, pathtype=rdf_paths.PathSpec.PathType.OS)) # Test the helper method self.assertEqual(directory._GetDepth("/"), 0) self.assertEqual(directory._GetDepth("/foo/bar/baz"), 3) # Relative paths aren't supported with self.assertRaises(RuntimeError): directory._GetDepth("foo/bar") # Multiple separators are redundant self.assertEqual(directory._GetDepth("/////foo///bar//////baz//"), 3) # Test the whole thing walk_tups_0 = list(directory.RecursiveListNames()) walk_tups_1 = list(directory.RecursiveListNames(depth=1)) walk_tups_inf = list(directory.RecursiveListNames(depth=float("inf"))) self.assertEqual(walk_tups_0, [(path, ["b"], [])]) self.assertEqual(walk_tups_1, [ (path, ["b"], []), ("%s/b" % path, ["c", "d"], []) ]) self.assertEqual(walk_tups_inf, [ (path, ["b"], []), ("%s/b" % path, ["c", "d"], []), ("%s/b/c" % path, [], ["helloc.txt"]), ("%s/b/d" % path, [], ["hellod.txt"]) ]) def testTskRecursiveListNames(self): path = os.path.join(self.base_path, u"test_img.dd") ps2 = rdf_paths.PathSpec(pathtype=rdf_paths.PathSpec.PathType.TSK) ps = rdf_paths.PathSpec(path=path, pathtype=rdf_paths.PathSpec.PathType.OS) ps.Append(ps2) directory = vfs.VFSOpen(ps) walk_tups_0 = list(directory.RecursiveListNames()) walk_tups_1 = list(directory.RecursiveListNames(depth=1)) walk_tups_inf = list(directory.RecursiveListNames(depth=float("inf"))) self.assertEqual(walk_tups_0, [ (u"/", [u"Test Directory", u"glob_test", u"home", u"lost+found", u"×יןד ןד ש ×קד×", u"入乡éšä¿— 海外春节别样过法"], []), ]) self.assertEqual(walk_tups_1, [ (u"/", [u"Test Directory", u"glob_test", u"home", u"lost+found", u"×יןד ןד ש ×קד×", u"入乡éšä¿— 海外春节别样过法"], []), (u"/Test Directory", [], [u"numbers.txt"]), (u"/glob_test", [u"a"], []), (u"/home", [u"test"], [u"image2.img"]), (u"/lost+found", [], []), (u"/×יןד ןד ש ×קד×", [], [u"×יןד.txt"]), (u"/入乡éšä¿— 海外春节别样过法", [], [u"入乡éšä¿—.txt"]) ]) self.assertEqual(walk_tups_inf, [ (u"/", [u"Test Directory", u"glob_test", u"home", u"lost+found", u"×יןד ןד ש ×קד×", u"入乡éšä¿— 海外春节别样过法"], []), (u"/Test Directory", [], [u"numbers.txt"]), (u"/glob_test", [u"a"], []), (u"/glob_test/a", [u"b"], []), (u"/glob_test/a/b", [], [u"foo"]), (u"/home", [u"test"], [u"image2.img"]), (u"/home/test", [u".config", u".mozilla"], []), (u"/home/test/.config", [u"google-chrome"], []), (u"/home/test/.config/google-chrome", [u"Default"], []), (u"/home/test/.config/google-chrome/Default", [u"Cache", u"Extensions"], [u"History"]), (u"/home/test/.config/google-chrome/Default/Cache", [], [u"data_0", u"data_0", u"data_1", u"data_1", u"data_2", u"data_3", u"f_000001", u"f_000001", u"f_000002", u"f_000002", u"f_000003", u"f_000003", u"f_000004", u"f_000004", u"f_000005", u"f_000006", u"f_000007", u"f_000008", u"f_000009", u"f_00000a", u"f_00000b", u"f_00000c", u"f_00000e", u"f_00000f", u"f_000011", u"f_000012", u"f_000013", u"f_000014", u"f_000015", u"f_000016", u"f_000017", u"f_000018", u"f_00001a", u"f_00001c", u"f_00001d", u"f_00001e", u"f_00001f", u"f_000020", u"f_000021", u"f_000023", u"f_000024", u"f_000025", u"f_000026", u"f_000027", u"f_000028", u"f_000029", u"f_00002c", u"f_00002d", u"f_00002e", u"f_00002f", u"f_000030", u"f_000031", u"f_000032", u"f_000034", u"f_000035", u"f_000037", u"f_000038", u"f_000039", u"f_00003a", u"f_00003c", u"f_00003d", u"index"]), (u"/home/test/.config/google-chrome/Default/Extensions", [u"nlbjncdgjeocebhnmkbbbdekmmmcbfjd"], []), (u"/home/test/.config/google-chrome/Default/Extensions/" u"nlbjncdgjeocebhnmkbbbdekmmmcbfjd", [u"2.1.3_0"], []), (u"/home/test/.config/google-chrome/Default/Extensions/" u"nlbjncdgjeocebhnmkbbbdekmmmcbfjd/2.1.3_0", [u"_locales"], [u".#testfile.txt", u"manifest.json", u"testfile.txt"]), (u"/home/test/.config/google-chrome/Default/Extensions/" u"nlbjncdgjeocebhnmkbbbdekmmmcbfjd/2.1.3_0/_locales", [u"en"], []), (u"/home/test/.config/google-chrome/Default/Extensions/" u"nlbjncdgjeocebhnmkbbbdekmmmcbfjd/2.1.3_0/_locales/en", [], [u"messages.json"]), (u"/home/test/.mozilla", [u"firefox"], []), (u"/home/test/.mozilla/firefox", [u"adts404t.default"], []), (u"/home/test/.mozilla/firefox/adts404t.default", [], [u"places.sqlite"]), (u"/lost+found", [], []), (u"/×יןד ןד ש ×קד×", [], [u"×יןד.txt"]), (u"/入乡éšä¿— 海外春节别样过法", [], [u"入乡éšä¿—.txt"]) ]) def main(argv): vfs.VFSInit() test_lib.main(argv) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/client/comms.py000066400000000000000000001543111273104013200162030ustar00rootroot00000000000000#!/usr/bin/env python """This class handles the GRR Client Communication. The GRR client uses HTTP to communicate with the server. The client connections are controlled via a number of config parameters: - Client.retry_error_limit: Number of times the client will try existing connections before giving up. - Client.connection_error_limit: The client will exit after this many consecutive errors. - Client.error_poll_min: Time to wait between retries in an ERROR state. - Client.server_urls: A list of URLs for the base control server. - Client.proxy_servers: A list of proxies to try to connect through. - Client.poll_max, Client.poll_min: Parameters for timing of SLOW POLL and FAST POLL modes. The client goes through a state machine: 1) In the INITIAL state, the client has no active server URL or active proxy and it is therefore searching through the list of proxies and connection URLs for one that works. The client will try each combination of proxy/URL in turn without delay until a 200 or a 406 message is seen. If all possibilities are exhausted, and a connection is not established, the client will switch to SLOW POLL mode (and retry connection every Client.poll_max). 2) In SLOW POLL mode the client will wait Client.poll_max between re-connection attempts. 3) If a server is detected, the client will communicate with it. If the server returns a 406 error, the client will send an enrollment request. Enrollment requests are only re-sent every 10 minutes (regardless of the frequency of 406 responses). Note that a 406 message is considered a valid connection and the client will not search for URL/Proxy combinations as long as it keep receiving 406 responses. 4) During CONNECTED state, the client has a valid server certificate, receives 200 responses from the server and is able to send messages to the server. The polling frequency in this state is determined by the polling mode requested by the messages received or send. If any message from the server or from the worker queue (to the server) has the require_fastpoll flag set, the client switches into FAST POLL mode. 5) When not in FAST POLL mode, the polling frequency is controlled by the Timer() object. It is currently a geometrically decreasing function which starts at the Client.poll_min and approaches the Client.poll_max setting. 6) If a 500 error occurs in the CONNECTED state, the client will assume that the server is temporarily down. The client will switch to the RETRY state and retry sending the data with a fixed frequency determined by Client.error_poll_min to the same URL/Proxy combination. The client will retry for Client.retry_error_limit times (default 10) before exiting the CONNECTED state and returning to the INITIAL state (i.e. the client will start searching for a new URL/Proxy combination). If a retry is successful, the client will return to its designated polling frequency. 7) If there are Client.connection_error_limit failures, the client will exit. Hopefully the nanny will restart the client. Examples: 1) Client starts up on a disconnected network: Client will try every URL/Proxy combination once every Client.poll_max (default 10 minutes). 2) Client connects successful but loses network connectivity. Client will re-try Client.retry_error_limit (10 times) every Client.error_poll_min (1 Min) to resent the last message. If it does not succeed it starts searching for a new URL/Proxy combination as in example 1. """ import hashlib import os import pdb import posixpath import Queue import socket import sys import threading import time import traceback import urllib2 from M2Crypto import BIO from M2Crypto import EVP from M2Crypto import RSA from M2Crypto import X509 import psutil import logging from grr.client import actions from grr.client import client_stats from grr.client import client_utils from grr.lib import communicator from grr.lib import config_lib from grr.lib import flags from grr.lib import queues from grr.lib import rdfvalue from grr.lib import registry from grr.lib import stats from grr.lib import type_info from grr.lib import utils from grr.lib.rdfvalues import client as rdf_client from grr.lib.rdfvalues import crypto as rdf_crypto from grr.lib.rdfvalues import flows as rdf_flows from grr.lib.rdfvalues import protodict as rdf_protodict class HTTPObject(object): """Data returned from a HTTP connection.""" def __init__(self, url="", data="", proxy="", code=500, duration=0): self.url = url self.data = data self.proxy = proxy self.code = code # Contains the decoded data from the 'control' endpoint. self.messages = self.source = self.nonce = None self.duration = duration def Success(self): """Returns if the request was successful.""" return self.code in (200, 406) class HTTPManager(object): """A manager for all HTTP/S connections. NOTE: This HTTPManager is not thread safe and should not be shared between threads. """ def __init__(self, heart_beat_cb=None): self.heart_beat_cb = heart_beat_cb self.proxies = self._GetProxies() self.base_urls = self._GetBaseURLs() # We start checking with this proxy. self.last_proxy_index = 0 self.last_base_url_index = 0 # If we have connected previously but now suddenly fail to connect, we try # the connection a few times (Client.retry_error_limit) before we determine # that it is failed. self.consecutive_connection_errors = 0 self.retry_error_limit = config_lib.CONFIG["Client.retry_error_limit"] self.active_base_url = None self.error_poll_min = config_lib.CONFIG["Client.error_poll_min"] def _GetBaseURLs(self): """Gathers a list of base URLs we will try.""" result = config_lib.CONFIG["Client.server_urls"] if not result: # Backwards compatibility - deduce server_urls from Client.control_urls. for control_url in config_lib.CONFIG["Client.control_urls"]: result.append(posixpath.dirname(control_url) + "/") # Check the URLs for trailing /. This traps configuration errors. for url in result: if not url.endswith("/"): raise RuntimeError("Bad URL: %s URLs must end with /" % url) return result def _GetProxies(self): """Gather a list of proxies to use.""" # Detect proxies from the OS environment. result = client_utils.FindProxies() # Also try to connect directly if all proxies fail. result.append("") # Also try all proxies configured in the config system. result.extend(config_lib.CONFIG["Client.proxy_servers"]) return result def _ConcatenateURL(self, base, url): if not url.startswith("/"): url = "/" + url if base.endswith("/"): base = base[:-1] return base + url def OpenServerEndpoint(self, path, verify_cb=lambda x: True, data=None, request_opts=None): """Search through all the base URLs to connect to one that works.""" tries = 0 last_error = HTTPObject(code=404) while tries < len(self.base_urls): base_url_index = self.last_base_url_index % len(self.base_urls) active_base_url = self.base_urls[base_url_index] result = self.OpenURL( self._ConcatenateURL(active_base_url, path), data=data, verify_cb=verify_cb, request_opts=request_opts) if not result.Success(): tries += 1 self.last_base_url_index += 1 last_error = result continue # The URL worked - we record that. self.active_base_url = active_base_url return result # No connection is possible at all. logging.info("Could not connect to GRR servers %s, directly or through " "these proxies: %s.", self.base_urls, self.proxies) return last_error def OpenURL(self, url, verify_cb=lambda x: True, data=None, request_opts=None): """Get the requested URL. Note that we do not have any concept of timing here - we try to connect through all proxies as fast as possible until one works. Timing and poll frequency is left to the calling code. Args: url: The URL to fetch verify_cb: An optional callback which can be used to validate the URL. It receives the HTTPObject and return True if this seems OK, False otherwise. For example, if we are behind a captive portal we might receive invalid object even though HTTP status is 200. data: If specified, we POST this data to the server. request_opts: A dict containing optional headers. Returns: An HTTPObject instance or None if a connection could not be made. """ # Start checking the proxy from the last value found. tries = 0 last_error = 500 while tries < len(self.proxies): proxy_index = self.last_proxy_index % len(self.proxies) proxy = self.proxies[proxy_index] try: proxydict = {} if proxy: proxydict["http"] = proxy proxydict["https"] = proxy proxy_support = urllib2.ProxyHandler(proxydict) opener = urllib2.build_opener(proxy_support) urllib2.install_opener(opener) request_opts = (request_opts or {}).copy() request_opts["Cache-Control"] = "no-cache" request = urllib2.Request(url, data, request_opts) duration, handle = self._RetryRequest(request) data = handle.read() result = HTTPObject(url=url, data=data, proxy=proxy, code=200, duration=duration) if not verify_cb(result): raise urllib2.HTTPError(url=url, code=500, msg="Data not verified.", hdrs=[], fp=handle) # The last connection worked. self.consecutive_connection_errors = 0 return result except urllib2.HTTPError as e: # Especially trap a 406 error message - it means the client needs to # enroll. if e.code == 406: # A 406 is not considered an error as the frontend is reachable. If we # considered it as an error the client would be unable to send the # enrollment request since connection errors disable message draining. self.consecutive_connection_errors = 0 return HTTPObject(code=406) # Try the next proxy self.last_proxy_index = proxy_index + 1 tries += 1 last_error = e.code except urllib2.URLError as e: # Try the next proxy self.last_proxy_index = proxy_index + 1 tries += 1 last_error = 500 # We failed to connect at all here. return HTTPObject(code=last_error) def _RetryRequest(self, request): """Retry the request a few times before we determine it failed. Sometimes the frontend becomes loaded and issues a 500 error to throttle the clients. We wait Client.error_poll_min seconds between each attempt to back off the frontend. Note that this does not affect any timing algorithm in the client itself which is controlled by the Timer() class. Args: request: A urllib2 request object. Returns: a tuple of duration, urllib2.urlopen response. """ while True: try: now = time.time() result = urllib2.urlopen( request, timeout=config_lib.CONFIG["Client.http_timeout"]) return time.time() - now, result except (urllib2.HTTPError, urllib2.URLError, socket.timeout) as e: self.consecutive_connection_errors += 1 # Request failed. If we connected successfully before we attempt a few # connections before we determine that it really failed. This might # happen if the front end is loaded and returns a few throttling 500 # messages. if self.active_base_url is not None: # Propagate 406 immediately without retrying, as 406 is a valid # response that inidicate a need for enrollment. if getattr(e, "code", None) == 406: raise if self.consecutive_connection_errors >= self.retry_error_limit: # We tried several times but this really did not work, just fail it. logging.info( "Too many connection errors to %s, retrying another URL", self.active_base_url) self.active_base_url = None raise e # Back off hard to allow the front end to recover. logging.debug( "Unable to connect to frontend. Backing off %s seconds.", self.error_poll_min) self.Wait(self.error_poll_min) # We never previously connected, maybe the URL/proxy is wrong? Just fail # right away to allow callers to try a different URL. else: raise e def Wait(self, timeout): """Wait for the specified timeout.""" time.sleep(timeout - int(timeout)) # Split a long sleep interval into 1 second intervals so we can heartbeat. for _ in xrange(int(timeout)): time.sleep(1) if self.heart_beat_cb: self.heart_beat_cb() class Timer(object): """Implements the polling policy. External code simply calls our Wait() method without regard to the exact timing policy. """ def __init__(self, heart_beat_cb=None): self.heart_beat_cb = heart_beat_cb self.poll_min = config_lib.CONFIG["Client.poll_min"] self.sleep_time = self.poll_max = config_lib.CONFIG["Client.poll_max"] self.poll_slew = config_lib.CONFIG["Client.poll_slew"] def FastPoll(self): """Switch to fast poll mode.""" self.sleep_time = self.poll_min def SlowPoll(self): """Switch to slow poll mode.""" self.sleep_time = self.poll_max def Wait(self): """Wait until the next action is needed.""" time.sleep(self.sleep_time - int(self.sleep_time)) # Split a long sleep interval into 1 second intervals so we can heartbeat. for _ in xrange(int(self.sleep_time)): time.sleep(1) if self.heart_beat_cb: self.heart_beat_cb() # Back off slowly at first and fast if no answer. self.sleep_time = min(self.poll_max, max(self.poll_min, self.sleep_time) * self.poll_slew) class CommsInit(registry.InitHook): def RunOnce(self): # Counters used here stats.STATS.RegisterGaugeMetric("grr_client_last_stats_sent_time", long) stats.STATS.RegisterCounterMetric("grr_client_received_bytes") stats.STATS.RegisterCounterMetric("grr_client_received_messages") stats.STATS.RegisterCounterMetric("grr_client_slave_restarts") stats.STATS.RegisterCounterMetric("grr_client_sent_bytes") stats.STATS.RegisterCounterMetric("grr_client_sent_messages") class Status(object): """An abstraction to encapsulate results of the HTTP Post.""" # Number of messages received received_count = 0 # Number of messages sent to server. sent_count = 0 sent_len = 0 # Messages sent by priority. sent = {} require_fastpoll = False # Server status code (200 is OK) code = 200 def __init__(self, **kwargs): self.__dict__.update(kwargs) class GRRClientWorker(object): """The main GRR Client worker. This provides access to the GRR framework to plugins and other code. The client worker is the main thread in the client which processes requests from the server. """ stats_collector = None IDLE_THRESHOLD = 0.3 sent_bytes_per_flow = {} # Client sends stats notifications at least every 50 minutes. STATS_MAX_SEND_INTERVAL = rdfvalue.Duration("50m") # Client sends stats notifications at most every 60 seconds. STATS_MIN_SEND_INTERVAL = rdfvalue.Duration("60s") def __init__(self): """Create a new GRRClientWorker.""" super(GRRClientWorker, self).__init__() # Queue of messages from the server to be processed. self._in_queue = [] # Queue of messages to be sent to the server. self._out_queue = [] # A tally of the total byte count of messages self._out_queue_size = 0 self._is_active = False # If True, ClientStats will be forcibly sent to server during next # CheckStats() call, if less than STATS_MIN_SEND_INTERVAL time has passed # since last stats notification was sent. self._send_stats_on_check = False # Last time when we've sent stats back to the server. self.last_stats_sent_time = None self.proc = psutil.Process(os.getpid()) # We store suspended actions in this dict. We can retrieve the suspended # client action from here if needed. self.suspended_actions = {} # Use this to control the nanny transaction log. self.nanny_controller = client_utils.NannyController() self.nanny_controller.StartNanny() if not GRRClientWorker.stats_collector: GRRClientWorker.stats_collector = client_stats.ClientStatsCollector(self) GRRClientWorker.stats_collector.start() self.lock = threading.RLock() # The worker may communicate over HTTP independently from the comms # thread. This way we do not need to synchronize the HTTP manager between # the two threads. self.http_manager = HTTPManager( heart_beat_cb=self.nanny_controller.Heartbeat) def Sleep(self, timeout): """Sleeps the calling thread with heartbeat.""" self.nanny_controller.Heartbeat() time.sleep(timeout - int(timeout)) # Split a long sleep interval into 1 second intervals so we can heartbeat. for _ in xrange(int(timeout)): time.sleep(1) self.nanny_controller.Heartbeat() def ClientMachineIsIdle(self): return psutil.cpu_percent(0.05) <= 100 * self.IDLE_THRESHOLD def __del__(self): self.nanny_controller.StopNanny() def Drain(self, max_size=1024): """Return a GrrQueue message list from the queue, draining it. This is used to get the messages going _TO_ the server when the client connects. Args: max_size: The size of the returned protobuf will be at most one message length over this size. Returns: A MessageList protobuf """ queue = rdf_flows.MessageList() length = 0 self._out_queue.sort(key=lambda msg: msg[0]) # Front pops are quadratic so we reverse the queue. self._out_queue.reverse() while self._out_queue and length < max_size: message = self._out_queue.pop()[1] queue.job.Append(message) stats.STATS.IncrementCounter("grr_client_sent_messages") # We deliberately look at the serialized length as bytes here. message_length = len(message.Get("args")) # Maintain the output queue tally length += message_length self._out_queue_size -= message_length # Restore the old order. self._out_queue.reverse() return queue def SendReply(self, rdf_value=None, request_id=None, response_id=None, priority=None, session_id="W:0", message_type=None, name=None, require_fastpoll=None, ttl=None, blocking=True, task_id=None): """Send the protobuf to the server. Args: rdf_value: The RDFvalue to return. request_id: The id of the request this is a response to. response_id: The id of this response. priority: The priority of this message, used to jump the scheduling queue. session_id: The session id of the flow. message_type: The contents of this message, MESSAGE, STATUS, ITERATOR or RDF_VALUE. name: The name of the client action that sends this response. require_fastpoll: If set, this will set the client to fastpoll mode after sending this message. ttl: The time to live of this message. blocking: If the output queue is full, block until there is space. task_id: The task ID that the request was queued at. We send this back to the server so it can de-queue the request. Raises: RuntimeError: An object other than an RDFValue was passed for sending. """ if not isinstance(rdf_value, rdfvalue.RDFValue): raise RuntimeError("Sending objects other than RDFValues not supported.") message = rdf_flows.GrrMessage(session_id=session_id, task_id=task_id, name=name, response_id=response_id, request_id=request_id, priority=priority, require_fastpoll=require_fastpoll, ttl=ttl, type=message_type) if rdf_value: message.payload = rdf_value serialized_message = message.SerializeToString() self.ChargeBytesToSession(session_id, len(serialized_message)) if message.type == rdf_flows.GrrMessage.Type.STATUS: rdf_value.network_bytes_sent = self.sent_bytes_per_flow[session_id] del self.sent_bytes_per_flow[session_id] message.payload = rdf_value try: self.QueueResponse(message, priority=message.priority, blocking=blocking) except Queue.Full: # In the case of a non blocking send, we reraise the exception to notify # the caller that something went wrong. if not blocking: raise # There is nothing we can do about it here - we just lose the message and # keep going. logging.info("Queue is full, dropping messages.") @utils.Synchronized def ChargeBytesToSession(self, session_id, length, limit=0): self.sent_bytes_per_flow.setdefault(session_id, 0) self.sent_bytes_per_flow[session_id] += length # Check after incrementing so that sent_bytes_per_flow goes over the limit # even though we don't send those bytes. This makes sure flow_runner will # die on the flow. if limit and (self.sent_bytes_per_flow[session_id] > limit): self.SendClientAlert("Network limit exceeded.") raise actions.NetworkBytesExceededError( "Action exceeded network send limit.") def QueueResponse(self, message, priority=rdf_flows.GrrMessage.Priority.MEDIUM_PRIORITY, blocking=True): """Push the Serialized Message on the output queue.""" # The simple queue has no size restrictions so we never block and ignore # this parameter. _ = blocking self._out_queue.append((-1 * priority, message)) # Maintain the tally of the output queue size. We estimate the size of the # message by only considering the args member. This is usually close enough # estimate to the overall size and avoids us un-necessarily serializing # here. self._out_queue_size += len(message.Get("args")) def HandleMessage(self, message): """Entry point for processing jobs. Args: message: The GrrMessage that was delivered from the server. """ self._is_active = True try: # Try to retrieve a suspended action from the client worker. try: suspended_action_id = message.payload.iterator.suspended_action action = self.suspended_actions[suspended_action_id] except (AttributeError, KeyError): # Otherwise make a new action instance. action_cls = actions.ActionPlugin.classes.get(message.name) if action_cls is None: raise RuntimeError("Client action %r not known" % message.name) action = action_cls(grr_worker=self) # Write the message to the transaction log. self.nanny_controller.WriteTransactionLog(message) # Heartbeat so we have the full period to work on this message. action.Progress() action.Execute(message) # If we get here without exception, we can remove the transaction. self.nanny_controller.CleanTransactionLog() finally: self._is_active = False # We want to send ClientStats when client action is complete. self._send_stats_on_check = True def QueueMessages(self, messages): """Queue a message from the server for processing. We maintain all the incoming messages in a queue. These messages are consumed until the outgoing queue fills to the allowable level. This mechanism allows us to throttle the server messages and limit the size of the outgoing queue on the client. Note that we can only limit processing of single request messages so if a single request message generates huge amounts of response messages we will still overflow the output queue. Therefore actions must be written in such a way that each request generates a limited and known maximum number and size of responses. (e.g. do not write a single client action to fetch the entire disk). Args: messages: List of parsed protobuf arriving from the server. """ # Push all the messages to our input queue for message in messages: self._in_queue.append(message) stats.STATS.IncrementCounter("grr_client_received_messages") # As long as our output queue has some room we can process some # input messages: while self._in_queue and ( self._out_queue_size < config_lib.CONFIG["Client.max_out_queue"]): message = self._in_queue.pop(0) try: self.HandleMessage(message) # Catch any errors and keep going here except Exception as e: # pylint: disable=broad-except self.SendReply( rdf_flows.GrrStatus( status=rdf_flows.GrrStatus.ReturnedStatus.GENERIC_ERROR, error_message=utils.SmartUnicode(e)), request_id=message.request_id, response_id=message.response_id, session_id=message.session_id, task_id=message.task_id, message_type=rdf_flows.GrrMessage.Type.STATUS) if flags.FLAGS.debug: pdb.post_mortem() def MemoryExceeded(self): """Returns True if our memory footprint is too large.""" rss_size = self.proc.memory_info().rss return rss_size / 1024 / 1024 > config_lib.CONFIG["Client.rss_max"] def InQueueSize(self): """Returns the number of protobufs ready to be sent in the queue.""" return len(self._in_queue) def OutQueueSize(self): """Returns the total size of messages ready to be sent.""" return len(self._out_queue) def IsActive(self): """Returns True if worker is currently handling a message.""" return self._is_active def CheckStats(self): """Checks if the last transmission of client stats is too long ago.""" if self.last_stats_sent_time is None: self.last_stats_sent_time = rdfvalue.RDFDatetime().Now() stats.STATS.SetGaugeValue("grr_client_last_stats_sent_time", self.last_stats_sent_time.AsSecondsFromEpoch()) time_since_last_check = ( rdfvalue.RDFDatetime().Now() - self.last_stats_sent_time) # No matter what, we don't want to send stats more often than # once per STATS_MIN_SEND_INTERVAL. if time_since_last_check < self.STATS_MIN_SEND_INTERVAL: return if (time_since_last_check > self.STATS_MAX_SEND_INTERVAL or self._is_active or self._send_stats_on_check): self._send_stats_on_check = False logging.info("Sending back client statistics to the server.") action_cls = actions.ActionPlugin.classes.get("GetClientStatsAuto", actions.ActionPlugin) action = action_cls(grr_worker=self) action.Run(rdf_client.GetClientStatsRequest( start_time=self.last_stats_sent_time)) self.last_stats_sent_time = rdfvalue.RDFDatetime().Now() stats.STATS.SetGaugeValue("grr_client_last_stats_sent_time", self.last_stats_sent_time.AsSecondsFromEpoch()) def SendNannyMessage(self): msg = self.nanny_controller.GetNannyMessage() if msg: self.SendReply( rdf_protodict.DataBlob(string=msg), session_id=rdfvalue.FlowSessionID(flow_name="NannyMessage"), priority=rdf_flows.GrrMessage.Priority.LOW_PRIORITY, require_fastpoll=False) self.nanny_controller.ClearNannyMessage() def SendClientAlert(self, msg): self.SendReply( rdf_protodict.DataBlob(string=msg), session_id=rdfvalue.FlowSessionID(flow_name="ClientAlert"), priority=rdf_flows.GrrMessage.Priority.LOW_PRIORITY, require_fastpoll=False) class SizeQueue(object): """A Queue which limits the total size of its elements. The standard Queue implementations uses the total number of elements to block on. In the client we want to limit the total memory footprint, hence we need to use the total size as a measure of how full the queue is. TODO(user): this class needs some attention to ensure it is thread safe. """ total_size = 0 def __init__(self, maxsize=1024, nanny=None): self.lock = threading.RLock() self.queue = [] self._reversed = [] self.total_size = 0 self.maxsize = maxsize self.nanny = nanny def Put(self, item, priority=rdf_flows.GrrMessage.Priority.MEDIUM_PRIORITY, block=True, timeout=1000): """Put an item on the queue, blocking if it is too full. This is a slightly modified Queue.put method which blocks when the queue contains more than the threshold. Args: item: The item to put - must have a __len__() method. priority: The priority of this message. block: If True we block indefinitely. timeout: Maximum time we spend waiting on the queue (1 sec resolution). Raises: Queue.Full: if the queue is full and block is False, or timeout is exceeded. """ # We only queue already serialized objects so we know how large they are. if isinstance(item, rdfvalue.RDFValue): item = item.SerializeToString() if priority >= rdf_flows.GrrMessage.Priority.HIGH_PRIORITY: pass # If high priority is set we dont care about the size of the queue. elif not block: if self.total_size >= self.maxsize: raise Queue.Full else: count = 0 # Wait until the queue has more space. We do not hold the lock here to # ensure that the posting thread can drain this queue while we block here. while self.total_size >= self.maxsize: time.sleep(1) self.nanny.Heartbeat() count += 1 if timeout and count > timeout: raise Queue.Full with self.lock: self.queue.append((-1 * priority, item)) self.total_size += len(item) def Get(self): """Retrieves the items from the queue.""" with self.lock: if self._reversed: # We have leftovers from a partial Get(). self._reversed.reverse() self.queue = self._reversed + self.queue self.queue.sort(key=lambda msg: msg[0]) # by priority only. self.queue.reverse() self._reversed, self.queue = self.queue, [] while self._reversed: item = self._reversed.pop()[1] self.total_size -= len(item) yield item def Size(self): return self.total_size def Full(self): return self.total_size >= self.maxsize class GRRThreadedWorker(GRRClientWorker, threading.Thread): """This client worker runs the main loop in another thread. The client which uses this worker is not blocked while queuing messages to be worked on. There is only a single working thread though. The overall effect is that the HTTP client is not blocked waiting for actions to be executed, and at the same time, the client working thread is not blocked waiting on network latency. """ def __init__(self): super(GRRThreadedWorker, self).__init__() # This queue should never hit its maximum since the server will throttle # messages before this. self._in_queue = utils.HeartbeatQueue( callback=self.nanny_controller.Heartbeat, maxsize=1024) # The size of the output queue controls the worker thread. Once this queue # is too large, the worker thread will block until the queue is drained. self._out_queue = SizeQueue( maxsize=config_lib.CONFIG["Client.max_out_queue"], nanny=self.nanny_controller) self.daemon = True # Start our working thread. self.start() def Sleep(self, timeout): """Sleeps the calling thread with heartbeat.""" self.nanny_controller.Heartbeat() time.sleep(timeout - int(timeout)) # Split a long sleep interval into 1 second intervals so we can heartbeat. for _ in xrange(int(timeout)): time.sleep(1) # If the output queue is full, we are ready to do a post - no # point in waiting. if self._out_queue.Full(): return self.nanny_controller.Heartbeat() def Drain(self, max_size=1024): """Return a GrrQueue message list from the queue, draining it. This is used to get the messages going _TO_ the server when the client connects. Args: max_size: The size (in bytes) of the returned protobuf will be at most one message length over this size. Returns: A MessageList protobuf """ queue = rdf_flows.MessageList() length = 0 for message in self._out_queue.Get(): queue.job.Append(rdf_flows.GrrMessage(message)) stats.STATS.IncrementCounter("grr_client_sent_messages") length += len(message) if length > max_size: break return queue def QueueResponse(self, message, priority=rdf_flows.GrrMessage.Priority.MEDIUM_PRIORITY, blocking=True): """Push the Serialized Message on the output queue.""" self._out_queue.Put(message, priority=priority, block=blocking) def QueueMessages(self, messages): """Push the message to the input queue.""" # Push all the messages to our input queue for message in messages: self._in_queue.put(message, block=True) stats.STATS.IncrementCounter("grr_client_received_messages") def InQueueSize(self): """Returns the number of protobufs ready to be sent in the queue.""" return self._in_queue.qsize() def OutQueueSize(self): """Returns the total size of messages ready to be sent.""" return self._out_queue.Size() def __del__(self): # This signals our worker thread to quit. self._in_queue.put(None, block=True) self.nanny_controller.StopNanny() def OnStartup(self): """A handler that is called on client startup.""" # We read the transaction log and fail any requests that are in it. If there # is anything in the transaction log we assume its there because we crashed # last time and let the server know. last_request = self.nanny_controller.GetTransactionLog() if last_request: status = rdf_flows.GrrStatus( status=rdf_flows.GrrStatus.ReturnedStatus.CLIENT_KILLED, error_message="Client killed during transaction") nanny_status = self.nanny_controller.GetNannyStatus() if nanny_status: status.nanny_status = nanny_status self.SendReply(status, request_id=last_request.request_id, response_id=1, session_id=last_request.session_id, message_type=rdf_flows.GrrMessage.Type.STATUS) self.nanny_controller.CleanTransactionLog() # Inform the server that we started. action_cls = actions.ActionPlugin.classes.get("SendStartupInfo", actions.ActionPlugin) action = action_cls(grr_worker=self) action.Run(None, ttl=1) def run(self): """Main thread for processing messages.""" self.OnStartup() # As long as our output queue has some room we can process some # input messages: while True: message = self._in_queue.get() # A message of None is our terminal message. if message is None: break try: self.HandleMessage(message) # Catch any errors and keep going here except Exception as e: # pylint: disable=broad-except logging.warn("%s", e) self.SendReply( rdf_flows.GrrStatus( status=rdf_flows.GrrStatus.ReturnedStatus.GENERIC_ERROR, error_message=utils.SmartUnicode(e)), request_id=message.request_id, response_id=1, session_id=message.session_id, task_id=message.task_id, message_type=rdf_flows.GrrMessage.Type.STATUS) if flags.FLAGS.debug: pdb.post_mortem() class GRRHTTPClient(object): """A class which abstracts away HTTP communications. To create a new GRR HTTP client, intantiate this class and generate its Run() method. The HTTP client starts up by loading a communicator which will read the client's public key (or create a new random key). Since the client ID is based on the key (its a hash of the public key), the communicator controls the client name. The client worker is then created - this will be the main thread for executing server messages. The client then creates a HTTPManager() instance to control communication with the front end over HTTP, and a Timer() instance to control polling policy. The HTTP client simply reads pending messages from the client worker queues and makes POST requests to the server. The POST request may return the following error conditions: - A successful POST is signified by a status of 200: The client worker is given any requests the server has sent. - A status code of 406 means that the server is unable to communicate with the client. The client will then prepare an enrollment request CSR and send that as a high priority. Enrollment requests are throttled to a maximum of one every 10 minutes. - A status code of 500 is an error, the messages are re-queued and the client waits and retried to send them later. """ http_manager_class = HTTPManager def __init__(self, ca_cert=None, worker=None, private_key=None): """Constructor. Args: ca_cert: String representation of a CA certificate to use for checking server certificate. worker: The client worker class to use. Defaults to GRRThreadedWorker(). private_key: The private key for this client. Defaults to config Client.private_key. """ self.ca_cert = ca_cert if private_key is None: private_key = config_lib.CONFIG.Get("Client.private_key", default=None) # The server's PEM encoded certificate. self.server_certificate = None # This manages our HTTP connections. Note: The comms thread is allowed to # block indefinitely since the worker thread is responsible for # heart-beating the nanny. We assume that HTTP requests can not block # indefinitely. self.http_manager = self.http_manager_class() # The communicator manages our crypto with the server. self.communicator = ClientCommunicator(private_key=private_key) # This controls our polling frequency. self.timer = Timer() # The time we last sent an enrollment request. Enrollment requests are # throttled especially to a maximum of one every 10 minutes. self.last_enrollment_time = 0 # The time we last checked with the foreman. self.last_foreman_check = 0 # The client worker does all the real work here. if worker: self.client_worker = worker() else: self.client_worker = GRRThreadedWorker() def VerifyServerPEM(self, http_object): """Check the server PEM for validity. This is used to determine connectivity to the server. Sometimes captive portals return a valid HTTP status, but the data is corrupted. Args: http_object: The response received from the server. Returns: True if the response contains a valid server certificate. """ try: server_pem = http_object.data server_url = http_object.url if "BEGIN CERTIFICATE" in server_pem: # Now we know that this proxy is working. We still have to verify the # certificate. This will raise if the server cert is invalid. self.communicator.LoadServerCertificate(server_certificate=server_pem, ca_certificate=self.ca_cert) logging.info("Server PEM re-keyed.") return True except Exception as e: # pylint: disable=broad-except logging.info("Unable to verify server certificate at %s: %s", server_url, e) return False def VerifyServerControlResponse(self, http_object): """Verify the server response to a 'control' endpoint POST message. We consider the message correct if and only if we can decrypt it properly. Note that in practice we can not use the HTTP status to figure out if the request worked because captive proxies have a habit of lying and returning a HTTP success code even when there is no connectivity. Args: http_object: The HTTPObject returned from the HTTP transaction. Returns: True if the http_object is correct. False if it is not valid. Side Effect: Fill in the decoded_data attribute in the http_object. """ if http_object.code != 200: return False # Try to decrypt the message into the http_object. try: http_object.messages, http_object.source, http_object.nonce = ( self.communicator.DecryptMessage(http_object.data)) return True # Something went wrong - the response seems invalid! except communicator.DecodingError as e: logging.info("Protobuf decode error: %s.", e) return False def MakeRequest(self, data): """Make a HTTP Post request to the server 'control' endpoint.""" stats.STATS.IncrementCounter("grr_client_sent_bytes", len(data)) # Verify the response is as it should be from the control endpoint. response = self.http_manager.OpenServerEndpoint( path="control?api=%s" % config_lib.CONFIG["Network.api"], verify_cb=self.VerifyServerControlResponse, data=data, request_opts={"Content-Type": "binary/octet-stream"}) if response.code == 406: self.InitiateEnrolment() return response if response.code == 200: stats.STATS.IncrementCounter("grr_client_received_bytes", len(response.data)) return response # An unspecified error occured. return response def RunOnce(self): """Makes a single request to the GRR server. Returns: A Status() object indicating how the last POST went. """ # Attempt to fetch and load server certificate. if not self._FetchServerCertificate(): self.timer.Wait() return HTTPObject(code=500) # Here we only drain messages if we were able to connect to the server in # the last poll request. Otherwise we just wait until the connection comes # back so we don't expire our messages too fast. if self.http_manager.consecutive_connection_errors == 0: # Grab some messages to send message_list = self.client_worker.Drain( max_size=config_lib.CONFIG["Client.max_post_size"]) else: message_list = rdf_flows.MessageList() # If any outbound messages require fast poll we switch to fast poll mode. for message in message_list.job: if message.require_fastpoll: self.timer.FastPoll() break # Make new encrypted ClientCommunication rdfvalue. payload = rdf_flows.ClientCommunication() # If our memory footprint is too large, we advertise that our input queue # is full. This will prevent the server from sending us any messages, and # hopefully allow us to work down our memory usage, by processing any # outstanding messages. if self.client_worker.MemoryExceeded(): logging.info("Memory exceeded, will not retrieve jobs.") payload.queue_size = 1000000 else: # Let the server know how many messages are currently queued in # the input queue. payload.queue_size = self.client_worker.InQueueSize() nonce = self.communicator.EncodeMessages(message_list, payload) payload_data = payload.SerializeToString() response = self.MakeRequest(payload_data) # Unable to decode response or response not valid. if response.code != 200 or response.messages is None: # We don't print response here since it should be encrypted and will # cause ascii conversion errors. logging.info("%s: Could not connect to server at %s, status %s", self.communicator.common_name, self.http_manager.active_base_url, response.code) # Force the server pem to be reparsed on the next connection. self.server_certificate = None # Reschedule the tasks back on the queue so they get retried next time. messages = list(message_list.job) for message in messages: message.priority = rdf_flows.GrrMessage.Priority.HIGH_PRIORITY message.require_fastpoll = False message.ttl -= 1 if message.ttl > 0: # Schedule with high priority to make it jump the queue. self.client_worker.QueueResponse( message, rdf_flows.GrrMessage.Priority.HIGH_PRIORITY + 1) else: logging.info("Dropped message due to retransmissions.") return response # Check the decoded nonce was as expected. if response.nonce != nonce: logging.info("Nonce not matched.") response.code = 500 return response if response.source != self.communicator.server_name: logging.info("Received a message not from the server " "%s, expected %s.", response.source, self.communicator.server_name) response.code = 500 return response # Check to see if any inbound messages want us to fastpoll. This means we # drop to fastpoll immediately on a new request rather than waiting for the # next beacon to report results. for message in response.messages: if message.require_fastpoll: self.timer.FastPoll() break # Process all messages. Messages can be processed by clients in # any order since clients do not have state. self.client_worker.QueueMessages(response.messages) cn = self.communicator.common_name logging.info("%s: Sending %s(%s), Received %s messages in %s sec. " "Sleeping for %s", cn, len(message_list), len(payload_data), len(response.messages), response.duration, self.timer.sleep_time) return response def SendForemanRequest(self): self.client_worker.SendReply( rdf_protodict.DataBlob(), session_id=rdfvalue.FlowSessionID(flow_name="Foreman"), priority=rdf_flows.GrrMessage.Priority.LOW_PRIORITY, require_fastpoll=False) def _FetchServerCertificate(self): """Attempts to fetch the server cert. Returns: True if we succeed. """ # Certificate is loaded and still valid. if self.server_certificate: return True response = self.http_manager.OpenServerEndpoint( "server.pem", verify_cb=self.VerifyServerPEM) if response.Success(): self.server_certificate = response.data return True # We failed to fetch the cert, switch to slow poll mode. self.timer.SlowPoll() return False def Run(self): """The main run method of the client. This method does not normally return. Only if there have been more than Client.connection_error_limit failures, the method returns and allows the client to exit. """ while True: if self.http_manager.consecutive_connection_errors > config_lib.CONFIG[ "Client.connection_error_limit"]: return # Check if there is a message from the nanny to be sent. self.client_worker.SendNannyMessage() now = time.time() # Check with the foreman if we need to if (now > self.last_foreman_check + config_lib.CONFIG["Client.foreman_check_frequency"]): # We must not queue messages from the comms thread with blocking=True # or we might deadlock. If the output queue is full, we can't accept # more work from the foreman anyways so it's ok to drop the message. try: self.client_worker.SendReply( rdf_protodict.DataBlob(), session_id=rdfvalue.FlowSessionID(flow_name="Foreman"), priority=rdf_flows.GrrMessage.Priority.LOW_PRIORITY, require_fastpoll=False, blocking=False) self.last_foreman_check = now except Queue.Full: pass try: self.RunOnce() except Exception: # pylint: disable=broad-except # Catch everything, yes, this is terrible but necessary logging.warn("Uncaught exception caught: %s", traceback.format_exc()) if flags.FLAGS.debug: pdb.post_mortem() # We suicide if our memory is exceeded, and there is no more work to do # right now. Our death should not result in loss of messages since we are # not holding any requests in our input queues. if (self.client_worker.MemoryExceeded() and not self.client_worker.IsActive() and self.client_worker.InQueueSize() == 0 and self.client_worker.OutQueueSize() == 0): logging.warning("Memory exceeded - exiting.") self.client_worker.SendClientAlert("Memory limit exceeded, exiting.") # Make sure this will return True so we don't get more work. # pylint: disable=g-bad-name self.client_worker.MemoryExceeded = lambda: True # pylint: enable=g-bad-name # Now send back the client message. self.RunOnce() # And done for now. sys.exit(-1) self.timer.Wait() def InitiateEnrolment(self): """Initiate the enrollment process. We do not sent more than one enrollment request every 10 minutes. Note that we still communicate to the server in fast poll mode, but these requests are not carrying any payload. """ logging.debug("sending enrollment request") now = time.time() if now > self.last_enrollment_time + 10 * 60: if not self.last_enrollment_time: # This is the first enrollment request - we should enter fastpoll mode. self.timer.FastPoll() self.last_enrollment_time = now # Send registration request: self.client_worker.SendReply( rdf_crypto.Certificate(type=rdf_crypto.Certificate.Type.CSR, pem=self.communicator.GetCSR()), session_id=rdfvalue.SessionID(queue=queues.ENROLLMENT, flow_name="Enrol")) class ClientCommunicator(communicator.Communicator): """A communicator implementation for clients. This extends the generic communicator to include verification of server side certificates. """ def _ParseRSAKey(self, rsa): """Use the RSA private key to initialize our parameters. We set our client name as the hash of the RSA private key. Args: rsa: An RSA key pair. """ # Our CN will be the first 64 bits of the hash of the public key. public_key = rsa.pub()[1] self.common_name = rdf_client.ClientURN("C.%s" % ( hashlib.sha256(public_key).digest()[:8].encode("hex"))) def _LoadOurCertificate(self): """Loads an RSA key from the certificate. If no certificate is found, or it is invalid, we make a new random RSA key, and store it as our certificate. Returns: An RSA key - either from the certificate or a new random key. """ if self.private_key: try: # This is our private key - make sure it has no password set. self.private_key.Validate() rsa = self.private_key.GetPrivateKey() self._ParseRSAKey(rsa) logging.info("Starting client %s", self.common_name) return rsa except type_info.TypeValueError: pass # We either have an invalid key or no key. We just generate a new one. # 65537 is the standard value for e rsa = RSA.gen_key(config_lib.CONFIG["Client.rsa_key_length"], 65537, lambda: None) self._ParseRSAKey(rsa) logging.info("Client pending enrolment %s", self.common_name) # Make new keys pk = EVP.PKey() pk.assign_rsa(rsa) # Save the keys self.SavePrivateKey(pk) return rsa def GetCSR(self): """Return our CSR in pem format.""" csr = X509.Request() pk = EVP.PKey() rsa = self._LoadOurCertificate() pk.assign_rsa(rsa) csr.set_pubkey(pk) name = csr.get_subject() name.CN = str(self.common_name) csr.sign(pk, "sha1") return csr.as_pem() def SavePrivateKey(self, pkey): """Store the new private key on disk.""" bio = BIO.MemoryBuffer() pkey.save_key_bio(bio, cipher=None) self.private_key = rdf_crypto.PEMPrivateKey(bio.read_all()) config_lib.CONFIG.Set("Client.private_key", self.private_key) config_lib.CONFIG.Write() def LoadServerCertificate(self, server_certificate=None, ca_certificate=None): """Loads and verifies the server certificate.""" try: server_cert = X509.load_cert_string(str(server_certificate)) ca_cert = X509.load_cert_string(str(ca_certificate)) # Check that the server certificate verifies if server_cert.verify(ca_cert.get_pubkey()) != 1: self.server_name = None raise IOError("Server cert is invalid.") # Make sure that the serial number is higher. server_cert_serial = server_cert.get_serial_number() if server_cert_serial < config_lib.CONFIG["Client.server_serial_number"]: # We can not accept this serial number... raise IOError("Server cert is too old.") elif server_cert_serial > config_lib.CONFIG[ "Client.server_serial_number"]: logging.info("Server serial number updated to %s", server_cert_serial) config_lib.CONFIG.Set("Client.server_serial_number", server_cert_serial) # Save the new data to the config file. config_lib.CONFIG.Write() except X509.X509Error: raise IOError("Server cert is invalid.") self.server_name = self.pub_key_cache.GetCNFromCert(server_cert) self.server_certificate = server_certificate self.ca_certificate = ca_certificate # We need to store the serialised version of the public key due # to M2Crypto memory referencing bugs self.pub_key_cache.Put(self.server_name, self.pub_key_cache.PubKeyFromCert(server_cert)) def EncodeMessages(self, message_list, result, **kwargs): # Force the right API to be used kwargs["api_version"] = config_lib.CONFIG["Network.api"] return super(ClientCommunicator, self).EncodeMessages(message_list, result, **kwargs) grr-3.1.0.2/grr/client/comms_test.py000066400000000000000000000166411273104013200172450ustar00rootroot00000000000000#!/usr/bin/env python """Test for client comms.""" import StringIO import time import urllib2 from grr.client import comms from grr.lib import flags from grr.lib import test_lib from grr.lib import utils def _make_http_exception(code=500, msg="Error"): """A helper for creating a HTTPError exception.""" return urllib2.HTTPError(url="", code=code, msg=msg, hdrs=[], fp=None) class URLLibInstrumentor(object): """Instrument the urllib2 library.""" def __init__(self): self.time = 0 self.current_opener = None # Record the actions in order. self.actions = [] # These are the responses we will do. self.responses = [] def install_opener(self, opener): self.current_opener = opener def _extract_proxy(self, opener): """Deduce the proxy location for the urllib opener.""" for handler in opener.handlers: if isinstance(handler, urllib2.ProxyHandler): return handler.proxies.get("http") def _extract_url(self, request): if isinstance(request, basestring): return request return request.get_full_url() def urlopen(self, request, **_): # We only care about how urllib2 will try to connect - the proxy and the # URL. self.actions.append([ self.time, self._extract_url(request), self._extract_proxy( self.current_opener) ]) if self.responses: result = self.responses.pop(0) else: result = _make_http_exception(404, "404 Not found") if isinstance(result, IOError): raise result return StringIO.StringIO(result) def sleep(self, timeout): self.time += timeout def instrument(self): """Install the mocks required. Returns: A context manager that when exits restores the mocks. """ self.actions = [] return utils.MultiStubber( (urllib2, "install_opener", self.install_opener), (urllib2, "urlopen", self.urlopen), (time, "sleep", self.sleep)) class URLFilter(URLLibInstrumentor): """Emulate only a single server url that works.""" def urlopen(self, request, **kwargs): url = self._extract_url(request) try: return super(URLFilter, self).urlopen(request, **kwargs) except IOError: # If request is from server2 - return a valid response. Assume, server2 is # reachable from all proxies. if "server2" in url: return StringIO.StringIO("Good") raise class MockHTTPManager(comms.HTTPManager): def _GetBaseURLs(self): return ["http://server1/", "http://server2/", "http://server3/"] def _GetProxies(self): """Do not test the proxy gathering logic itself.""" return ["proxy1", "proxy2", "proxy3"] class HTTPManagerTest(test_lib.GRRBaseTest): """Tests the HTTP Manager.""" def MakeRequest(self, instrumentor, manager, path, verify_cb=lambda x: True): with utils.MultiStubber( (urllib2, "install_opener", instrumentor.install_opener), (urllib2, "urlopen", instrumentor.urlopen), (time, "sleep", instrumentor.sleep)): return manager.OpenServerEndpoint(path, verify_cb=verify_cb) def testBaseURLConcatenation(self): instrumentor = URLLibInstrumentor() with instrumentor.instrument(): manager = MockHTTPManager() manager.OpenServerEndpoint("/control") # Make sure that the URL is concatenated properly (no //). self.assertEqual(instrumentor.actions[0][1], "http://server1/control") def testProxySearch(self): """Check that all proxies will be searched in order.""" # Do not specify a response - all requests will return a 404 message. instrumentor = URLLibInstrumentor() with instrumentor.instrument(): manager = MockHTTPManager() result = manager.OpenURL("http://www.google.com/") # Three requests are made. self.assertEqual(len(instrumentor.actions), 3) self.assertEqual([x[2] for x in instrumentor.actions], manager.proxies) # Result is an error since no requests succeeded. self.assertEqual(result.code, 404) def testVerifyCB(self): """Check that we can handle captive portals via the verify CB. Captive portals do not cause an exception but return bad data. """ def verify_cb(http_object): return http_object.data == "Good" instrumentor = URLLibInstrumentor() # First request is an exception, next is bad and the last is good. instrumentor.responses = [_make_http_exception(code="404"), "Bad", "Good"] with instrumentor.instrument(): manager = MockHTTPManager() result = manager.OpenURL("http://www.google.com/", verify_cb=verify_cb) self.assertEqual(result.data, "Good") def testURLSwitching(self): """Ensure that the manager switches URLs to one that works.""" # Only server2 works and returns Good response. instrumentor = URLFilter() with instrumentor.instrument(): manager = MockHTTPManager() result = manager.OpenServerEndpoint("control") # The result is correct. self.assertEqual(result.data, "Good") self.assertEqual(instrumentor.actions, # First search for server1 through all proxies. [[0, "http://server1/control", "proxy1"], [0, "http://server1/control", "proxy2"], [0, "http://server1/control", "proxy3"], # Now search for server2 through all proxies. [0, "http://server2/control", "proxy1"]]) def testTemporaryFailure(self): """If the front end gives an intermittent 500, we must back off.""" instrumentor = URLLibInstrumentor() # First response good, then a 500 error, then another good response. instrumentor.responses = ["Good", _make_http_exception(code=500), "Also Good"] manager = MockHTTPManager() with instrumentor.instrument(): # First request - should be fine. result = manager.OpenServerEndpoint("control") self.assertEqual(result.data, "Good") with instrumentor.instrument(): # Second request - should appear fine. result = manager.OpenServerEndpoint("control") self.assertEqual(result.data, "Also Good") # But we actually made two requests. self.assertEqual(len(instrumentor.actions), 2) # And we waited 60 seconds to make the second one. self.assertEqual(instrumentor.actions[0][0], 0) self.assertEqual(instrumentor.actions[1][0], manager.error_poll_min) # Make sure that the manager cleared its consecutive_connection_errors. self.assertEqual(manager.consecutive_connection_errors, 0) def test406Errors(self): """Ensure that 406 enrollment requests are propagated immediately. Enrollment responses (406) are sent by the server when the client is not suitable enrolled. The http manager should treat those as correct responses and stop searching for proxy/url combinations in order to allow the client to commence enrollment workflow. """ instrumentor = URLLibInstrumentor() instrumentor.responses = [_make_http_exception(code=406)] manager = MockHTTPManager() with instrumentor.instrument(): # First request - should raise a 406 error. result = manager.OpenServerEndpoint("control") self.assertEqual(result.code, 406) # We should not search for proxy/url combinations. self.assertEqual(len(instrumentor.actions), 1) # A 406 message is not considered an error. self.assertEqual(manager.consecutive_connection_errors, 0) def main(argv): test_lib.main(argv) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/client/components/000077500000000000000000000000001273104013200166735ustar00rootroot00000000000000grr-3.1.0.2/grr/client/components/README.txt000066400000000000000000000131121273104013200203670ustar00rootroot00000000000000Client Components. ================== What is a client component? The GRR Client componets are versioned modules which can be loaded into the client at runtime. The component is essentially a separate Virtual Env site-packages directory which is added to the client at runtime. The goals of GRR client components are: 1) To separate functionality in the client. Decoupling componentns into separate modules allows individual modules to be tested, upgraded and distributed independently. 2) To be able to update a client's running code in a persistent way during deployment. Without needing to re-deploy new clients through standard mechansims. 3) By separating complex modules from the basic client, we can keep the basic client functionality simple. A failure in a component only affect clients which are running the relevant flow - once the client restart the component is no longer used in the client. How do I make a new component? ------------------------------ It is important to note that a client component is only modular from the client's point of view. For the server, new functionality typically involves writing new flows, artifacts, GUI components etc. The goal of client component is not to insert new code into the running server - only to affect the client. The server part of the new functionality is developed as normal therefore. Usually the new functionality involves implementing new client actions, which do not exist on a bare client. The client will need to load the component to be able to handle requests for these new client actions. The new client actions would also typically have some dependencies in terms of third party libraries the code might need. Step 1: Create a directory for the component. Step 2: Write the relevant client actions in that directory. Step 3: Add a setup.py file. This file packages the grr specific code in its own package and also introduces the dependencies this code needs. For example consider the rekall_support component: ``` setup_args = dict( name="grr-rekall", version="0.1", description="Rekall GRR Integration module.", license="GPL", url="https://www.rekall-forensic.com/", author="The Rekall team", author_email="rekall-discuss@googlegroups.com", classifiers=[ "Development Status :: 4 - Beta", "Environment :: Console", "Operating System :: OS Independent", "Programming Language :: Python", ], py_modules=[ "grr_rekall", "memory", ], install_requires=[ "rekall-core >= 1.4.1", ], ) if __name__ == "__main__": setup(**setup_args) ``` NOTE: The current tooling for manipulating components need to be able to parse the setup.py file. Currently it is done by looking for a setup_args dict inside the module - therefore currently the setup.py file must be written in this exact way. The most important fields are: - name: This is the name of the component. We recommend prefixing it with "grr-". - version: This is the version of the component. - py_modules: The client will import these modules after installing the component. These are normally files which define the new client actions which must be registered. - install_requires: This lists all the dependencies required for this package. (NOTE: you can use any of the usual formats supported by setuptools - including github commit IDs). Step 4: Finally we build the component binary. This basically installs the component into a zip file, and packages it up in a protobuf. ``` $ python grr/client/client_build.py --config grr-server.yaml build_component \ grr/client/components/rekall_support/setup.py /tmp/rekall_component.bin Building component grr-rekall, Version 0.1 Creating Virtual Env /tmp/tmpc8ggGP New python executable in /tmp/tmpc8ggGP/bin/python Installing setuptools, pip...done. running sdist running egg_info creating grr_rekall.egg-info writing dependency_links to grr_rekall.egg-info/dependency_links.txt writing requirements to grr_rekall.egg-info/requires.txt writing grr_rekall.egg-info/PKG-INFO .... Using /usr/lib/python2.7 Finished processing dependencies for grr-rekall==0.1 message ClientComponent { summary : message ClientComponentSummary { build_system : message Uname { libc_ver : u'glibc_2.4' machine : u'x86_64' release : u'Ubuntu' system : u'Linux' version : u'14.04' } cipher : message SymmetricCipher { _algorithm : AES128CBC _iv : '>\x18\x1f\xe7%\x8f\xd6G\xb9\xe47\xa7c\xa1\x84\xbb' _key : '\x1d\xc2\xb1[\x99\xd7\xe7\t\x05\xde\xf6\x19\x0e<\xac\xbc' } modules : [ u'grr_rekall' u'memory' ] name : u'grr-rekall' version : u'0.1' } } ``` Finally the `build_component.py` tool prints the details about the component. Note that this component is build for a single architecture (x86_64 linux). If you want to have it supported on multiple architectures you need to repeat this step on these different architectures. Step 5: Sign and upload the component to the data store. Copy the binary file produced in the last step to a system with access to the GRR data store, and then sign and upload the component. ``` $ python grr/tools/config_updater.py --config grr-server.yaml upload_component \ /tmp/rekall_component.bin Opened component grr-rekall from /tmp/rekall_component.bin Storing component summary at aff4:/config/component/grr-rekall_0.1 Storing signed component at aff4:/web/static/components/9b4b177a56699091/glibc_2.4_x86_64_Ubuntu_Linux ``` Now, flows that use the component can simply tell the client to load it if required. grr-3.1.0.2/grr/client/components/__init__.py000066400000000000000000000017401273104013200210060ustar00rootroot00000000000000#!/usr/bin/env python """Components are optionally imported on the client.""" import os import traceback import logging from grr.lib import config_lib from grr.lib import registry # Keep track on how we are imported in case we need to report the error. IMPORT_TB = "".join(traceback.format_stack()) class ComponentInit(registry.InitHook): """This is a safety feature. We need to make sure that ensures that this component can not be imported into the virgin client. If this code ends up baked into the client, it will be impossible to update this component in the future. Therefore we make sure that we are not running in the client context - if we are this is a bug mostly likely caused by a stray import. """ def RunOnce(self): if "Client Context" in config_lib.CONFIG.context: logging.exception( "Client component is included in client build! This is a bug!") logging.error(IMPORT_TB) os._exit(-1) # pylint: disable=protected-access grr-3.1.0.2/grr/client/components/chipsec_support/000077500000000000000000000000001273104013200221055ustar00rootroot00000000000000grr-3.1.0.2/grr/client/components/chipsec_support/__init__.py000066400000000000000000000000271273104013200242150ustar00rootroot00000000000000#!/usr/bin/env python grr-3.1.0.2/grr/client/components/chipsec_support/chipsec.proto000066400000000000000000000020451273104013200246110ustar00rootroot00000000000000syntax = "proto2"; import "grr/proto/semantic.proto"; import "grr/proto/jobs.proto"; message DumpFlashImageRequest { optional uint32 log_level = 1 [(sem_type) = { description: "Set the log level. If set, the log returned " "will include additional information reported by Chipsec." }]; optional uint32 chunk_size = 2 [(sem_type) = { description: "A heartbeat will be emitted every chunk_size." "This could be reduced in case the process times out.", label: ADVANCED, }, default=0x10000]; optional bool notify_syslog = 3 [(sem_type) = { description: "If true, a message will be written by the client to the " "syslog before running the action. This can be used for debugging in " "case the client crashes during the image dumping process.", }]; } message DumpFlashImageResponse { optional PathSpec path = 1 [(sem_type) = { description: "Temporary path to the flash image.", }]; repeated string logs = 2 [(sem_type) = { description: "Extra debug information.", }]; } grr-3.1.0.2/grr/client/components/chipsec_support/chipsec_types.py000066400000000000000000000013721273104013200253240ustar00rootroot00000000000000#!/usr/bin/env python """RDFValues used to communicate with Chipsec.""" __author__ = "tweksteen@gmail.com (Thiebaud Weksteen)" # pylint: disable=g-import-not-at-top, g-statement-before-imports try: import chipsec_pb2 except ImportError: from grr.client.components.chipsec_support import chipsec_pb2 # pylint: enable=g-import-not-at-top, g-statement-before-imports from grr.lib.rdfvalues import structs as rdf_structs class DumpFlashImageRequest(rdf_structs.RDFProtoStruct): """A request to Chipsec to dump the flash image (BIOS).""" protobuf = chipsec_pb2.DumpFlashImageRequest class DumpFlashImageResponse(rdf_structs.RDFProtoStruct): """A response from Chipsec to dump the flash image (BIOS).""" protobuf = chipsec_pb2.DumpFlashImageResponse grr-3.1.0.2/grr/client/components/chipsec_support/grr_chipsec.py000066400000000000000000000102261273104013200247500ustar00rootroot00000000000000#!/usr/bin/env python """Execute a Chipsec plugin on the client.""" __author__ = "tweksteen@gmail.com (Thiebaud Weksteen)" import logging from logging import handlers from grr.client import actions from grr.client.client_actions import tempfiles from grr.lib import config_lib # pylint: disable=g-import-not-at-top # When deployed as a component, import the dependency directly # Otherwise (unittest), load according to the grr package try: import chipsec_types except ImportError: from grr.client.components.chipsec_support import chipsec_types # This file is included when running the test case. try: # Initialize the Chipsec plugins, so pylint: disable=unused-import from chipsec import chipset from chipsec.hal import spi from chipsec.logger import logger # pylint: enable=unused-import except ImportError: pass # pylint: enable=g-import-not-at-top class DumpFlashImage(actions.ActionPlugin): """A client action to collect the BIOS via SPI using Chipsec.""" in_rdfvalue = chipsec_types.DumpFlashImageRequest out_rdfvalues = [chipsec_types.DumpFlashImageResponse] def ReadAndDeleteChipsecLogs(self): logger().close() with open(self.log_pathspec.path) as log_f: logs = log_f.read().splitlines() tempfiles.DeleteGRRTempFile(self.log_pathspec.path) return logs def Run(self, args): # Due to talking raw to hardware, this action has some inevitable risk of # crashing the machine, so we need to flush the transaction log to ensure # we know when this happens. self.SyncTransactionLog() # Temporary extra logging for Ubuntu # TODO(user): Add generic hunt flag to notify syslog before running each # client action. if args.notify_syslog: syslog = logging.getLogger("chipsec_grr") syslog.setLevel(logging.INFO) syslog.addHandler(handlers.SysLogHandler(address="/dev/log")) syslog.info("%s: Runnning DumpFlashImage", config_lib.CONFIG["Client.name"]) logs = [] if args.log_level: # Create a temporary file to store the log output as # Chipsec does not support in-memory logging. _, self.log_pathspec = tempfiles.CreateGRRTempFileVFS() logger().UTIL_TRACE = True if args.log_level == 2: logger().VERBOSE = True logger().set_log_file(self.log_pathspec.path) # Create a temporary file to store the flash image. dest_fd, dest_pathspec = tempfiles.CreateGRRTempFileVFS() # Wrap most of Chipsec code to gather its logs in case of failure. try: # Initialise Chipsec (die early if unknown chipset) c = chipset.cs() # Platform = None, Start Driver = False c.init(None, False) s = spi.SPI(c) # Use hal.spi from chipsec to write BIOS to that file. with dest_fd: # Based on Chipsec code, rely on the address of BIOS(=1) region to # determine the size of the flash. _, limit, _ = s.get_SPI_region(1) spi_size = limit + 1 # Read args.chunk_size bytes at a time and heartbeat. bios = [] for i in range(0, spi_size, args.chunk_size): bios.extend(s.read_spi(i, args.chunk_size)) self.Progress() dest_fd.write("".join(bios)) except Exception as err: # pylint: disable=broad-except # In case an exception is raised, if the verbose mode # is enabled, return the raw logs from Chipsec. if args.log_level: logs = self.ReadAndDeleteChipsecLogs() logs.append("%r: %s" % (err, err)) self.SendReply(chipsec_types.DumpFlashImageResponse(logs=logs)) tempfiles.DeleteGRRTempFile(dest_pathspec.path) if isinstance(err, chipset.UnknownChipsetError): # If the chipset is unknown, simply returns an error message self.SendReply(chipsec_types.DumpFlashImageResponse(logs=["%s" % err],)) return raise if args.log_level: logs = self.ReadAndDeleteChipsecLogs() if args.notify_syslog: syslog.info("%s: DumpFlashImage has completed successfully", config_lib.CONFIG["Client.name"]) self.SendReply(chipsec_types.DumpFlashImageResponse(path=dest_pathspec, logs=logs)) grr-3.1.0.2/grr/client/components/chipsec_support/grr_chipsec_test.py000066400000000000000000000063041273104013200260110ustar00rootroot00000000000000#!/usr/bin/env python """Test Chipsec client actions.""" __author__ = "Thiebaud Weksteen " import mock from grr.client import vfs from grr.client.components.chipsec_support import chipsec_types from grr.client.components.chipsec_support import grr_chipsec from grr.lib import flags from grr.lib import test_lib from grr.lib import utils class MockUnknownChipsetError(RuntimeError): pass class MockSPI(mock.MagicMock): def __init__(self, chipset): pass def get_SPI_region(self, region): return (0, 0xffff, 0) def read_spi(self, offset, size): return "\xff" * size class FaultyChipset(mock.MagicMock): def init(self, platform, load_driver): msg = "Unsupported Platform: VID = 0x0000, DID = 0x0000" raise MockUnknownChipsetError(msg) class TestDumpFlashImage(test_lib.EmptyActionTest): """Test the client dump flash image action.""" def setUp(self): super(TestDumpFlashImage, self).setUp() spi_mock = mock.MagicMock() spi_mock.SPI = MockSPI chipset_mock = mock.MagicMock() chipset_mock.UnknownChipsetError = MockUnknownChipsetError self.chipset_patch = utils.Stubber(grr_chipsec, "chipset", chipset_mock) self.spi_patch = utils.Stubber(grr_chipsec, "spi", spi_mock) self.logger_patch = utils.Stubber(grr_chipsec, "logger", mock.MagicMock()) self.chipset_patch.Start() self.spi_patch.Start() self.logger_patch.Start() def tearDown(self): self.chipset_patch.Stop() self.spi_patch.Stop() self.logger_patch.Stop() super(TestDumpFlashImage, self).tearDown() def testDumpFlashImage(self): """Test the basic dump.""" args = chipsec_types.DumpFlashImageRequest() result = self.RunAction("DumpFlashImage", args)[0] with vfs.VFSOpen(result.path) as image: self.assertEqual(image.read(0x20000), "\xff" * 0x10000) def testDumpFlashImageVerbose(self): """Test the basic dump with the verbose mode enabled.""" args = chipsec_types.DumpFlashImageRequest(log_level=1) result = self.RunAction("DumpFlashImage", args)[0] with vfs.VFSOpen(result.path) as image: self.assertEqual(image.read(0x20000), "\xff" * 0x10000) self.assertNotEqual(grr_chipsec.logger.call_count, 0) def testDumpFlashImageUnknownChipset(self): """By default, if the chipset is unknown, no exception is raised.""" with utils.Stubber(grr_chipsec.chipset, "cs", FaultyChipset): args = chipsec_types.DumpFlashImageRequest() self.RunAction("DumpFlashImage", args) def testDumpFlashImageUnknownChipsetVerbose(self): """Test unknown chipset with verbose mode. If the chipset is unknown but verbose enabled, no exception is raised and at least one response should be returned with non-empty logs. """ with utils.Stubber(grr_chipsec.chipset, "cs", FaultyChipset): args = chipsec_types.DumpFlashImageRequest(log_level=1) self.RunAction("DumpFlashImage", args) self.assertNotEquals(grr_chipsec.logger.call_count, 0) self.assertGreaterEqual(len(self.results), 1) self.assertNotEquals(len(self.results[0].logs), 0) self.assertEquals(self.results[0].path.path, "") def main(argv): test_lib.main(argv) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/client/components/chipsec_support/setup.py000066400000000000000000000025041273104013200236200ustar00rootroot00000000000000#!/usr/bin/env python """Chipsec GRR integration.""" __author__ = "Thiebaud Weksteen " import platform from setuptools import setup # Note this component was renamed from grr-chipsec so as not to conflict with # the grr-chipsec module published on pypi. setup_args = dict(name="grr-chipsec-component", version="1.2.2", description="Chipsec GRR Integration module.", license="GPL", url="https://github.com/chipsec/chipsec/", author="Thiebaud Weksteen", author_email="tweksteen@gmail.com", classifiers=[ "Development Status :: 4 - Beta", "Environment :: Console", "Operating System :: OS Independent", "Programming Language :: Python", ], py_modules=[ "grr_chipsec", "chipsec_types", "chipsec_pb2" ], install_requires=[ "grr-chipsec == 1.2.2", ], zip_safe=False) # Currently this is only enabled in Linux. if platform.system() != "Linux": setup_args["install_requires"] = [] setup_args["py_modules"] = [] if __name__ == "__main__": setup(**setup_args) grr-3.1.0.2/grr/client/components/rekall_support/000077500000000000000000000000001273104013200217415ustar00rootroot00000000000000grr-3.1.0.2/grr/client/components/rekall_support/__init__.py000066400000000000000000000000271273104013200240510ustar00rootroot00000000000000#!/usr/bin/env python grr-3.1.0.2/grr/client/components/rekall_support/grr_rekall.py000066400000000000000000000253011273104013200244400ustar00rootroot00000000000000#!/usr/bin/env python """Execute a Rekall plugin on the client memory. This module implements the Rekall enabled client actions. """ import logging import pdb import sys import traceback import psutil # Initialize the Rekall plugins, so pylint: disable=unused-import from rekall import addrspace from rekall import config from rekall import constants from rekall import io_manager from rekall import obj from rekall import plugins from rekall import session from rekall.plugins.addrspaces import standard from rekall.plugins.renderers import data_export from rekall.plugins.tools import caching_url_manager from rekall.ui import json_renderer # pylint: enable=unused-import import rekall_types import logging from grr.client import actions from grr.client import vfs from grr.client.client_actions import tempfiles from grr.lib import config_lib from grr.lib import flags from grr.lib.rdfvalues import flows as rdf_flows from grr.lib.rdfvalues import paths as rdf_paths class Error(Exception): pass class ProfileNotFoundError(ValueError): pass class GRRObjectRenderer(data_export.NativeDataExportObjectRenderer): """A default object renderer for the GRRRekallRenderer. GRR Renders all Rekall objects using the Rekall DataExportRenderer. By default we just delegate everything to DataExportRenderer. """ renders_type = "object" renderers = ["GRRRekallRenderer"] def _GetDelegateObjectRenderer(self, item): return self.FromEncoded(item, "DataExportRenderer")(renderer=self.renderer, session=self.session) def EncodeToJsonSafe(self, item, **options): object_renderer = self.ForTarget(item, "DataExportRenderer") return object_renderer(renderer=self.renderer, session=self.session).EncodeToJsonSafe(item, **options) def DecodeFromJsonSafe(self, value, options): return self._GetDelegateObjectRenderer(value).DecodeFromJsonSafe(value, options) def RawHTML(self, item, **options): raise NotImplementedError("Not producing HTML on the client.") def Summary(self, item, **options): return self._GetDelegateObjectRenderer(item).Summary(item, **options) class GRRRekallRenderer(data_export.DataExportRenderer): """This renderer sends all messages to the server encoded as JSON. Note that this renderer is used to encode and deliver Rekall objects to the server. Additionally Rekall ObjectRenderer implementations specific to GRR will be attached to this renderer. """ name = None # Maximum number of statements to queue before sending a reply. RESPONSE_CHUNK_SIZE = 1000 def __init__(self, rekall_session=None, action=None, **kwargs): """Collect Rekall rendering commands and send to the server. Args: rekall_session: The Rekall session object. action: The GRR Client Action which owns this renderer. We will use it to actually send messages back to the server. **kwargs: Passthrough. """ try: sys.stdout.isatty() except AttributeError: sys.stdout.isatty = lambda: False super(GRRRekallRenderer, self).__init__(session=rekall_session, **kwargs) # A handle to the client action we can use for sending responses. self.action = action # The current plugin we are running. self.plugin = None self.context_messages = {} self.new_context_messages = {} self.robust_encoder = json_renderer.RobustEncoder( logging=rekall_session.logging) def start(self, plugin_name=None, kwargs=None): self.plugin = plugin_name return super(GRRRekallRenderer, self).start(plugin_name=plugin_name, kwargs=kwargs) def write_data_stream(self): """Prepares a RekallResponse and send to the server.""" if self.data: response_msg = rekall_types.RekallResponse( json_messages=self.robust_encoder.encode(self.data), json_context_messages=self.robust_encoder.encode( self.context_messages.items()), plugin=self.plugin) self.context_messages = self.new_context_messages self.new_context_messages = {} # Queue the response to the server. self.action.SendReply(response_msg) def SendMessage(self, statement): super(GRRRekallRenderer, self).SendMessage(statement) if statement[0] in ["s", "t"]: self.new_context_messages[statement[0]] = statement[1] if len(self.data) > self.RESPONSE_CHUNK_SIZE: self.flush() def open(self, directory=None, filename=None, mode="rb"): fd, pathspec = tempfiles.CreateGRRTempFileVFS(filename=filename, mode=mode) self.SendMessage(["file", pathspec.ToPrimitiveDict()]) return fd def report_error(self, message): super(GRRRekallRenderer, self).report_error(message) if flags.FLAGS.debug: pdb.post_mortem() class GrrRekallSession(session.Session): """A GRR Specific Rekall session.""" def __init__(self, fhandle=None, action=None, initial_profiles=None, **session_args): super(GrrRekallSession, self).__init__( cache_dir=config_lib.CONFIG["Client.rekall_profile_cache_path"]) self.action = action # Just hard code the initial repository manager. Note this can be # overwritten later if needed. self._repository_managers = [ (None, RekallCachingIOManager(initial_profiles=initial_profiles, session=self)) ] # Apply default configuration options to the session state, unless # explicitly overridden by the session_args. with self.state: for k, v in session_args.iteritems(): self.state.Set(k, v) for name, options in config.OPTIONS.args.iteritems(): # We don't want to override configuration options passed via # **session_args. if name not in session_args: self.state.Set(name, options.get("default")) # Ensure the action's Progress() method is called when Rekall reports # progress. self.proc = psutil.Process() self.memory_quota = config_lib.CONFIG["Client.rss_max"] * 1024 * 1024 self.progress.Register(id(self), lambda *_, **__: self._CheckQuota()) def _CheckQuota(self): """Ensures we do not exceed the allowed memory limit.""" # Check the memory use is not exceeded. if self.proc.memory_info().rss > self.memory_quota: raise MemoryError("Exceeded memory quota") # Ensure the action progress is reported so we do not get killed. self.action.Progress() def GetRenderer(self, **kwargs): # We will use this renderer to push results to the server. return GRRRekallRenderer(rekall_session=self, action=self.action, **kwargs) # Short term storage for profile data. UPLOADED_PROFILES = {} class WriteRekallProfile(actions.ActionPlugin): """A client action to write a Rekall profile to the local cache.""" in_rdfvalue = rekall_types.RekallProfile def Run(self, args): logging.info("Received profile for %s", args.name) UPLOADED_PROFILES[args.name] = args class RekallIOManager(io_manager.IOManager): """An IO manager to talk with the GRR server.""" def GetData(self, name, raw=False, default=None): # Cant load the profile, we need to ask the server for it. self.session.logging.info("Asking server for profile %s", name) UPLOADED_PROFILES.pop(name, None) self.session.action.SendReply(rekall_types.RekallResponse( missing_profile=name, repository_version=constants.PROFILE_REPOSITORY_VERSION,)) # Wait for the server to wake us up. When we wake up the server should # have sent the profile over by calling the WriteRekallProfile. self.session.action.Suspend() # We expect the profile to be here if all went well. result = UPLOADED_PROFILES.get(name, obj.NoneObject()).payload if result: return self.Decoder(result) return result def SetInventory(self, inventory): self._inventory = inventory class RekallCachingIOManager(caching_url_manager.CachingManager): DELEGATE = RekallIOManager def __init__(self, initial_profiles, **kwargs): self.initial_profiles = initial_profiles super(RekallCachingIOManager, self).__init__(**kwargs) def CheckUpstreamRepository(self): for profile in (self.initial_profiles or []): # Copy the inventory to the remote IO manager. if profile.name == "inventory": self.url_manager.SetInventory(self.Decoder(profile.payload)) else: # Everything else, save locally to the cache. self.StoreData(profile.name, self.Decoder(profile.payload)) super(RekallCachingIOManager, self).CheckUpstreamRepository() class RekallAction(actions.SuspendableAction): """Runs a Rekall command on live memory.""" in_rdfvalue = rekall_types.RekallRequest out_rdfvalues = [rekall_types.RekallResponse] def Iterate(self): """Run a Rekall plugin and return the result.""" # Create a session and run all the plugins with it. session_args = self.request.session.ToDict() if "filename" not in session_args and self.request.device: session_args["filename"] = self.request.device.path rekal_session = GrrRekallSession(action=self, initial_profiles=self.request.profiles, **session_args) plugin_errors = [] for plugin_request in self.request.plugins: # Get the keyword args to this plugin. plugin_args = plugin_request.args.ToDict() try: rekal_session.RunPlugin(plugin_request.plugin, **plugin_args) except Exception: # pylint: disable=broad-except tb = traceback.format_exc() logging.error("While running plugin (%s): %s", plugin_request.plugin, tb) plugin_errors.append(tb) finally: rekal_session.Flush() if plugin_errors: self.SetStatus(rdf_flows.GrrStatus.ReturnedStatus.GENERIC_ERROR, u"\n\n".join(plugin_errors)) # Rekall uses quite a bit of memory so we force a garbage collection here # even though it may cost a second or two of cpu time. self.Progress() self.ForceGC() class GetMemoryInformation(actions.ActionPlugin): """Loads the driver for memory access and returns a Stat for the device.""" in_rdfvalue = rdf_paths.PathSpec out_rdfvalues = [rekall_types.MemoryInformation] def Run(self, args): """Run.""" # This action might crash the box so we need to flush the transaction log. self.SyncTransactionLog() if args.pathtype != "MEMORY": raise RuntimeError("Can only GetMemoryInformation on memory devices.") with vfs.VFSOpen(args) as fd: self.SendReply(fd.GetMemoryInformation()) grr-3.1.0.2/grr/client/components/rekall_support/grr_rekall_test.py000066400000000000000000000232771273104013200255110ustar00rootroot00000000000000#!/usr/bin/env python """Tests for grr.client.client_actions.grr_rekall.""" import functools import gzip import json import os import logging from grr.client.components.rekall_support import rekall_types as rdf_rekall_types from grr.lib import action_mocks from grr.lib import aff4 from grr.lib import config_lib from grr.lib import flags from grr.lib import test_lib from grr.lib.aff4_objects import aff4_grr # This test runs flows from these modules. pylint: disable=unused-import from grr.lib.flows.general import memory from grr.lib.flows.general import registry from grr.lib.flows.general import transfer # pylint: enable=unused-import class RekallTestSuite(test_lib.EmptyActionTest): """A test suite for testing Rekall plugins. Note that since the Rekall plugin is a SuspendableAction it is impossible to test it in isolation from the AnalyzeClientMemory Flow. The flow is needed to load profiles, and allow the client action to proceed. We therefore have flow tests here instead of simply a client action test (Most other client actions are very simple so it is possible to test them in isolation). """ def setUp(self): super(RekallTestSuite, self).setUp() self.client_id = self.SetupClients(1)[0] test_lib.WriteComponent(token=self.token) def CreateClient(self): client = aff4.FACTORY.Create(self.client_id, aff4_grr.VFSGRRClient, token=self.token) client.Set(client.Schema.ARCH("AMD64")) client.Set(client.Schema.OS_RELEASE("7")) client.Set(client.Schema.SYSTEM("Windows")) client.Close() def LaunchRekallPlugin(self, request): """Launch AnalyzeClientMemory flow and return its output as a string. Args: request: A RekallRequest() proto. """ # For this test we force the client to write the profile cache in the temp # directory. This forces the profiles to always be downloaded from the # server (since each test run gets a new temp directory). with test_lib.ConfigOverrider( {"Client.rekall_profile_cache_path": self.temp_dir}): image_path = os.path.join(self.base_path, "win7_trial_64bit.raw") request.device.path = image_path self.CreateClient() # Allow the real RekallAction to run against the image. for _ in test_lib.TestFlowHelper("AnalyzeClientMemory", action_mocks.MemoryClientMock( "RekallAction", "WriteRekallProfile", "DeleteGRRTempFiles"), token=self.token, client_id=self.client_id, request=request, output="analysis/memory"): pass # Check that the profiles are also cached locally. test_profile_dir = os.path.join(config_lib.CONFIG["Test.data_dir"], "profiles") self.assertEqual( json.load(gzip.open(os.path.join(self.temp_dir, "v1.0/pe.gz"))), json.load(gzip.open(os.path.join(test_profile_dir, "v1.0/pe.gz")))) p_name = "v1.0/nt/GUID/F8E2A8B5C9B74BF4A6E4A48F180099942.gz" self.assertEqual( json.load(gzip.open(os.path.join(self.temp_dir, p_name))), json.load(gzip.open(os.path.join(test_profile_dir, p_name)))) def RequireTestImage(f): """Decorator that skips tests if we don't have the memory image.""" @functools.wraps(f) def Decorator(testinstance): image_path = os.path.join(testinstance.base_path, "win7_trial_64bit.raw") if os.access(image_path, os.R_OK): return f(testinstance) else: return testinstance.skipTest("No win7_trial_64bit.raw memory image," "skipping test. Download it here: " "goo.gl/19AJGl and put it in test_data.") return Decorator class RekallTests(RekallTestSuite): """Test some core Rekall modules.""" @RequireTestImage def testRekallModules(self): """Tests the end to end Rekall memory analysis.""" request = rdf_rekall_types.RekallRequest() request.plugins = [ # Only use these methods for listing processes. rdf_rekall_types.PluginRequest( plugin="pslist", args=dict(method=["PsActiveProcessHead", "CSRSS"])), rdf_rekall_types.PluginRequest(plugin="modules") ] self.LaunchRekallPlugin(request) # Get the result collection - it should be a RekallResponseCollection. fd = aff4.FACTORY.Open( self.client_id.Add("analysis/memory"), token=self.token) # Ensure that the client_id is set on each message. This helps us demux # messages from different clients, when analyzing the collection from a # hunt. json_blobs = [] for x in fd: self.assertEqual(x.client_urn, self.client_id) json_blobs.append(x.json_messages) json_blobs = "".join(json_blobs) for knownresult in ["DumpIt.exe", "DumpIt.sys"]: self.assertTrue(knownresult in json_blobs) @RequireTestImage def testFileOutput(self): """Tests that a file can be written by a plugin and retrieved.""" request = rdf_rekall_types.RekallRequest() request.plugins = [ # Run procdump to create one file. rdf_rekall_types.PluginRequest(plugin="procdump", args=dict(pid=2860)) ] with test_lib.Instrument(transfer.MultiGetFile, "StoreStat") as storestat_instrument: self.LaunchRekallPlugin(request) # Expect one file to be downloaded. self.assertEqual(storestat_instrument.call_count, 1) @RequireTestImage def testParameters(self): request = rdf_rekall_types.RekallRequest() request.plugins = [ # Only use these methods for listing processes. rdf_rekall_types.PluginRequest(plugin="pslist", args=dict(pid=[4, 2860], method="PsActiveProcessHead")), ] self.LaunchRekallPlugin(request) # Get the result collection - it should be a RekallResponseCollection. fd = aff4.FACTORY.Open( self.client_id.Add("analysis/memory"), token=self.token) json_blobs = [x.json_messages for x in fd] json_blobs = "".join(json_blobs) for knownresult in ["System", "DumpIt.exe"]: self.assertTrue(knownresult in json_blobs) @RequireTestImage def testDLLList(self): """Tests that we can run a simple DLLList Action.""" request = rdf_rekall_types.RekallRequest() request.plugins = [ # Only use these methods for listing processes. rdf_rekall_types.PluginRequest(plugin="dlllist", args=dict(proc_regex="dumpit", method="PsActiveProcessHead")), ] self.LaunchRekallPlugin(request) # Get the result collection - it should be a RekallResponseCollection. fd = aff4.FACTORY.Open( self.client_id.Add("analysis/memory"), token=self.token) json_blobs = [x.json_messages for x in fd] json_blobs = "".join(json_blobs) for knownresult in ["DumpIt", "wow64win", "wow64", "wow64cpu", "ntdll"]: self.assertTrue(knownresult in json_blobs) @RequireTestImage def DisabledTestAllPlugins(self): """Tests that we can run a wide variety of plugins. Some of those plugins are very expensive to run so this test is disabled by default. """ plugins = [ "atoms", "atomscan", "build_index", "callbacks", "cc", "cert_vad_scan", "certscan", "cmdscan", "consoles", "convert_profile", "desktops", "devicetree", "dis", "dlldump", "dlllist", "driverirp", "driverscan", "dt", "dtbscan", "dtbscan2", "dump", "dwarfparser", "eifconfig", "enetstat", "eventhooks", "fetch_pdb", "filescan", "find_dtb", "gahti", "getservicesids", "grep", "guess_guid", "handles", "hivedump", "hives", "imagecopy", "imageinfo", "impscan", "info", "json_render", "kdbgscan", "kpcr", "l", "ldrmodules", "load_as", "load_plugin", "malfind", "memdump", "memmap", "messagehooks", "moddump", "modscan", "modules", "mutantscan", "netscan", "netstat", "notebook", "null", "object_tree", "object_types", "p", "parse_pdb", "pas2vas", "pedump", "peinfo", "pfn", "phys_map", "pool_tracker", "pools", "printkey", "procdump", "procinfo", "pslist", "psscan", "pstree", "psxview", "pte", "ptov", "raw2dmp", "regdump", "rekal", "sessions", "ssdt", "svcscan", "symlinkscan", "thrdscan", "threads", "timers", "tokens", "unloaded_modules", "userassist", "userhandles", "users", "vad", "vaddump", "vadinfo", "vadtree", "vadwalk", "version_modules", "version_scan", "vmscan", "vtop", "windows_stations" ] output_urn = self.client_id.Add("analysis/memory") failed_plugins = [] for plugin in plugins: logging.info("Running plugin: %s", plugin) try: aff4.FACTORY.Delete(output_urn, token=self.token) request = rdf_rekall_types.RekallRequest() request.plugins = [rdf_rekall_types.PluginRequest(plugin=plugin)] self.LaunchRekallPlugin(request) # Get the result collection - it should be a RekallResponseCollection. fd = aff4.FACTORY.Open(output_urn, token=self.token) # Try to render the result. fd.RenderAsText() except Exception: # pylint: disable=broad-except failed_plugins.append(plugin) logging.error("Plugin %s failed.", plugin) if failed_plugins: self.fail("Some plugins failed: %s" % failed_plugins) def main(argv): test_lib.main(argv) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/client/components/rekall_support/memory.py000066400000000000000000000050371273104013200236300ustar00rootroot00000000000000#!/usr/bin/env python """VFS Handler which provides access to the raw physical memory. Memory access is provided by use of a special driver. Note that it is preferred to use this VFS handler rather than directly access the raw handler since this handler protects the system from access to unmapped memory regions such as DMA regions. It is always safe to access all of memory using this handler. """ from rekall import session import rekall_types as rdf_rekall_types from grr.client import vfs from grr.lib.rdfvalues import client as rdf_client from grr.lib.rdfvalues import paths as rdf_paths class MemoryVFS(vfs.VFSHandler): """Access memory via the GRR Client VFS abstraction.""" page_size = 0x1000 supported_pathtype = rdf_paths.PathSpec.PathType.MEMORY auto_register = True def __init__(self, base_fd, pathspec=None, progress_callback=None, full_pathspec=None): super(MemoryVFS, self).__init__(None, progress_callback=progress_callback, full_pathspec=full_pathspec) if base_fd is not None: raise IOError("Memory handler can not be stacked on another handler.") self.pathspec = full_pathspec self.session = session.Session(filename=full_pathspec.path) load_as_plugin = self.session.plugins.load_as() self.address_space = load_as_plugin.GetPhysicalAddressSpace() if not self.address_space: raise IOError("Unable to open device") self.size = self.address_space.end() @classmethod def Open(cls, fd, component, pathspec=None, full_pathspec=None, progress_callback=None): if fd is None: return cls(base_fd=None, full_pathspec=full_pathspec) return fd def IsDirectory(self): return False def Stat(self): result = rdf_client.StatEntry(st_size=self.size, pathspec=self.pathspec) return result def GetMemoryInformation(self): result = rdf_rekall_types.MemoryInformation( cr3=self.session.GetParameter("dtb", 0), device=self.pathspec) for run in self.address_space.get_address_ranges(): result.runs.Append(offset=run.start, length=run.length) return result def Read(self, length): """Read from the memory device, null padding the ranges.""" to_read = min(length, self.size - self.offset) result = self.address_space.read(self.offset, to_read) self.offset += len(result) return result vfs.VFS_HANDLERS[MemoryVFS.supported_pathtype] = MemoryVFS grr-3.1.0.2/grr/client/components/rekall_support/rekall.proto000066400000000000000000000072171273104013200243070ustar00rootroot00000000000000// Copyright 2011 Google Inc. All Rights Reserved // LINT: LEGACY_NAMES // These are the messages used in GRR syntax = "proto2"; import "grr/proto/semantic.proto"; import "grr/proto/jobs.proto"; // Next field ID: 4 message MemoryInformation { option (semantic) = { description: "Describe the memory geometry." }; optional PathSpec device = 1; repeated BufferReference runs = 2; optional uint64 cr3 = 3; } // Next field ID: 4 message PluginRequest { optional string plugin = 2 [(sem_type) = { description: "The plugin name to run.", }]; optional Dict args = 3 [(sem_type) = { description: "The args to the plugin.", }]; } // Issue a request for Rekall memory analysis. // Next field ID: 10 message RekallRequest { optional Iterator iterator = 1 [(sem_type) = { label: HIDDEN }]; repeated PluginRequest plugins = 2 [(sem_type) = { description: "We can execute multiple plugins in the same session. " "This can take advantage of caching in the session to be more efficient." }]; optional PathSpec device = 4 [(sem_type) = { description: "The raw device to use.", }]; optional Dict session = 6 [(sem_type) = { description: "These parameters are used to initialize the session.", }]; repeated RekallProfile profiles = 9 [(sem_type) = { description: "Profiles sent by the server to store on the client.", label: HIDDEN }]; } // Next field: 9 message RekallResponse { // Deprecated. Anything written in this field will be compressed and placed // into the compressed_json_messages field upon serialization. optional string json_messages = 1; optional bytes compressed_json_messages = 7 [(sem_type) = { type: "ZippedJSONBytes" }]; optional string json_context_messages = 5; optional string plugin = 2; optional string client_urn = 3 [(sem_type) = { type: "ClientURN", description: "The client this response comes from." }]; optional string missing_profile = 4 [(sem_type) = { description: "Missing profiles that should be retrieved from " "the server." }]; optional string repository_version = 6 [(sem_type) = { description: "The version of the repository we want to use." }, default="v1.0"]; repeated string downloaded_files = 8 [(sem_type) = { description: "A list of downloaded files.", type: "RDFURN", }]; } // Next field ID: 5 message RekallProfile { optional string name = 1 [(sem_type) = { description: "The name of this profile." }]; optional bytes data = 2 [(sem_type) = { description: "A Rekall profile as a data blob." }]; optional string version = 3 [(sem_type) = { description: "The version of this profile." }]; enum Compression { NONE = 0; GZIP = 1; } optional Compression compression = 4 [(sem_type) = { description: "Type of compression carried in the data field." }, default=GZIP]; } // The Rekall AnalyzeClientMemory flow. // Next field ID: 7 message AnalyzeClientMemoryArgs { optional RekallRequest request = 2 [(sem_type) = { description: "A request for the client's Rekall subsystem.", }]; optional bool debug_logging = 4 [(sem_type) = { description: "Use DEBUG level logging.", friendly_name: "DEBUG logging." }, default=false]; optional uint64 max_file_size_download = 5 [(sem_type) = { description: "Obtain at most max_file_size_download bytes of each file " "outputted by Rekall." }, default=35433480192]; // 33 Gb optional string component_version = 6 [(sem_type) = { description: "The version of component to use.", label: ADVANCED, }, default="0.4"]; } grr-3.1.0.2/grr/client/components/rekall_support/rekall_types.py000066400000000000000000000035701273104013200250160ustar00rootroot00000000000000#!/usr/bin/env python """RDFValues used to communicate with the Rekall memory analysis framework.""" import gzip import StringIO import zlib import rekall_pb2 from grr.lib import rdfvalue from grr.lib.rdfvalues import structs as rdf_structs class PluginRequest(rdf_structs.RDFProtoStruct): """A request to the Rekall subsystem on the client.""" protobuf = rekall_pb2.PluginRequest class RekallRequest(rdf_structs.RDFProtoStruct): """A request to the Rekall subsystem on the client.""" protobuf = rekall_pb2.RekallRequest class MemoryInformation(rdf_structs.RDFProtoStruct): """Information about the client's memory geometry.""" protobuf = rekall_pb2.MemoryInformation class RekallResponse(rdf_structs.RDFProtoStruct): """The result of running a plugin.""" protobuf = rekall_pb2.RekallResponse def SerializeToString(self): json_messages = self.Get("json_messages") if json_messages: self.Set("compressed_json_messages", zlib.compress(json_messages)) self.Set("json_messages", None) return super(RekallResponse, self).SerializeToString() @property def json_messages(self): json_messages = self.Get("compressed_json_messages") if json_messages: return json_messages.Uncompress() json_messages = self.Get("json_messages") if json_messages: return json_messages return "" @json_messages.setter def json_messages(self, value): self.Set("json_messages", value) # Clear any compressed data the proto already has. self.Set("compressed_json_messages", None) class ZippedJSONBytes(rdfvalue.RDFZippedBytes): """Byte array containing zipped JSON bytes.""" class RekallProfile(rdf_structs.RDFProtoStruct): protobuf = rekall_pb2.RekallProfile @property def payload(self): if self.compression == "GZIP": return gzip.GzipFile(fileobj=StringIO.StringIO(self.data)).read() return self.data grr-3.1.0.2/grr/client/components/rekall_support/rekall_types_test.py000066400000000000000000000025131273104013200260510ustar00rootroot00000000000000#!/usr/bin/env python """Tests for the RekallResponse protobuf.""" from grr.lib.rdfvalues import rekall_types from grr.lib.rdfvalues import test_base class RekallResponseTest(test_base.RDFProtoTestCase): """Test the PathSpec implementation.""" rdfvalue_class = rekall_types.RekallResponse def GenerateSample(self, number=0): result = self.rdfvalue_class(plugin="foo%s" % number) return result def testCompressionOnSerialization(self): json_message = "hello world" sample = self.rdfvalue_class(plugin="test") sample.json_messages = json_message self.assertEqual(sample.json_messages, json_message) data = sample.SerializeToString() # After serialization, the json_messages field should be cleared, and the # compressed_json_messages should contain the data. self.assertFalse(sample.HasField("json_messages")) self.assertTrue(sample.HasField("compressed_json_messages")) self.assertEqual(sample.json_messages, json_message) # Test assignment. The new parameters should overwrite the old values. sample.json_messages = "goodbye world" self.assertEqual(sample.json_messages, "goodbye world") # On access we should be able to read the fields with transparent # decompression. sample2 = self.rdfvalue_class(data) self.assertEqual(sample2.json_messages, json_message) grr-3.1.0.2/grr/client/components/rekall_support/setup.py000066400000000000000000000021471273104013200234570ustar00rootroot00000000000000#!/usr/bin/env python """Rekall GRR integration.""" __author__ = "Michael Cohen " from setuptools import setup setup_args = dict(name="grr-rekall", version="0.4", description="Rekall GRR Integration module.", license="GPL", url="https://www.rekall-forensic.com/", author="The Rekall team", author_email="rekall-discuss@googlegroups.com", classifiers=[ "Development Status :: 4 - Beta", "Environment :: Console", "Operating System :: OS Independent", "Programming Language :: Python", ], py_modules=[ "grr_rekall", "memory", "rekall_types", "rekall_pb2", ], install_requires=[ "rekall-core == 1.5.2rc1", ], zip_safe=False,) if __name__ == "__main__": setup(**setup_args) grr-3.1.0.2/grr/client/components/test/000077500000000000000000000000001273104013200176525ustar00rootroot00000000000000grr-3.1.0.2/grr/client/components/test/grr_test_component.py000066400000000000000000000005441273104013200241420ustar00rootroot00000000000000#!/usr/bin/env python """This is a test component.""" from grr.client import actions from grr.lib.rdfvalues import client as rdf_client class TestComponentAction(actions.ActionPlugin): in_rdfvalue = rdf_client.ListDirRequest out_rdfvalues = [rdf_client.StatEntry] def Run(self, args): print args self.SendReply(symlink="I am a symlink") grr-3.1.0.2/grr/client/components/test/setup.py000066400000000000000000000005411273104013200213640ustar00rootroot00000000000000#!/usr/bin/env python """A Test component.""" from setuptools import setup setup_args = dict(name="grr-test-component", version="1.0", description="GRR Test component", py_modules=[ "grr_test_component" ],) if __name__ == "__main__": setup(**setup_args) grr-3.1.0.2/grr/client/installer.py000066400000000000000000000075711273104013200170670ustar00rootroot00000000000000#!/usr/bin/env python """This is the GRR client installer module. GRR allows several installers to be registered as plugins. The installers are executed when the client is deployed to a target system in their specified order (according to the registry plugin system). Installers are usually used to upgrade existing clients and setup clients in unusual situations. """ import logging import os import sys from grr.client import comms from grr.lib import config_lib from grr.lib import flags from grr.lib import rdfvalue from grr.lib import registry from grr.lib.rdfvalues import flows as rdf_flows class Installer(registry.HookRegistry): """A GRR installer plugin. Modules can register special actions which only run on installation by extending this base class. Execution order is controlled using the same mechanism provided by HookRegistry - i.e. by declaring "pre" and "order" attributes. """ __metaclass__ = registry.MetaclassRegistry def InstallerNotifyServer(): """An emergency function Invoked when the client installation failed.""" # We make a temporary emergency config file to contain the new client id. Note # that the notification callback does not really mean anything to us, since # the client is not installed and we dont have basic interrogate information. config_lib.CONFIG.SetWriteBack("temp.yaml") try: log_data = open(config_lib.CONFIG["Installer.logfile"], "rb").read() except (IOError, OSError): log_data = "" # Start the client and send the server a message, then terminate. The # private key may be empty if we did not install properly yet. In this case, # the client will automatically generate a random client ID and private key # (and the message will be unauthenticated since we never enrolled.). comms.CommsInit().RunOnce() client = comms.GRRHTTPClient( ca_cert=config_lib.CONFIG["CA.certificate"], private_key=config_lib.CONFIG.Get("Client.private_key")) client.client_worker.SendReply( session_id=rdfvalue.FlowSessionID(flow_name="InstallationFailed"), message_type=rdf_flows.GrrMessage.Type.STATUS, request_id=0, response_id=0, rdf_value=rdf_flows.GrrStatus( status=rdf_flows.GrrStatus.ReturnedStatus.GENERIC_ERROR, error_message="Installation failed.", backtrace=log_data[-10000:])) client.RunOnce() def RunInstaller(): """Run all registered installers. Run all the current installers and then exit the process. """ try: os.makedirs(os.path.dirname(config_lib.CONFIG["Installer.logfile"])) except OSError: pass # Always log to the installer logfile at debug level. This way if our # installer fails we can send detailed diagnostics. handler = logging.FileHandler(config_lib.CONFIG["Installer.logfile"], mode="wb") handler.setLevel(logging.DEBUG) # Add this to the root logger. logging.getLogger().addHandler(handler) # Ordinarily when the client starts up, the local volatile # configuration is read. Howevwer, when running the installer, we # need to ensure that only the installer configuration is used so # nothing gets overridden by local settings. We there must reload # the configuration from the flag and ignore the Config.writeback # location. config_lib.CONFIG.Initialize(filename=flags.FLAGS.config, reset=True) config_lib.CONFIG.AddContext( "Installer Context", "Context applied when we run the client installer.") logging.warn("Starting installation procedure for GRR client.") try: Installer().Init() except Exception as e: # pylint: disable=broad-except # Ouch! we failed to install... Not a lot we can do # here - just log the error and give up. logging.exception("Installation failed: %s", e) # Let the server know about this just in case. InstallerNotifyServer() # Error return status. sys.exit(-1) # Exit successfully. sys.exit(0) grr-3.1.0.2/grr/client/linux/000077500000000000000000000000001273104013200156455ustar00rootroot00000000000000grr-3.1.0.2/grr/client/linux/__init__.py000066400000000000000000000002231273104013200177530ustar00rootroot00000000000000#!/usr/bin/env python """This module contains linux specific client code.""" # These need to register plugins so, pylint: disable=unused-import grr-3.1.0.2/grr/client/local/000077500000000000000000000000001273104013200156005ustar00rootroot00000000000000grr-3.1.0.2/grr/client/local/__init__.py000066400000000000000000000001321273104013200177050ustar00rootroot00000000000000#!/usr/bin/env python """This directory contains local site-specific implementations.""" grr-3.1.0.2/grr/client/minicomm/000077500000000000000000000000001273104013200163165ustar00rootroot00000000000000grr-3.1.0.2/grr/client/minicomm/CMakeLists.txt000066400000000000000000000062341273104013200210630ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.8) SET(CMAKE_VERBOSE_MAKEFILE on) project(grr_minicomm) include_directories(../../..) list(APPEND CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS} -g") add_library(core_lib ../../proto/jobs.pb.cc ../../proto/semantic.pb.cc comms_utils.cc compression.cc config.cc config.pb.cc crypto.cc message_queue.cc util.cc ) set(core_lib_DEPS boost_regex crypto protobuf z) add_library(http_comms_lib http_connection.cc resource_monitor.cc) set(http_comms_lib_DEPS core_lib curl ${core_lib_DEPS}) add_library(subprocess_delegator_lib subprocess_delegator.cc) set(subprocess_delegator_lib_DEPS core_lib ${core_lib_DEPS}) add_library(client_actions_lib client_action.cc client_action_dispatcher.cc ../../proto/sysinfo.pb.cc ../../proto/knowledge_base.pb.cc client_actions/dump_process_memory.cc client_actions/enumerate_filesystems.cc client_actions/enumerate_interfaces.cc client_actions/enumerate_users.cc client_actions/find.cc client_actions/fingerprint_file.cc client_actions/get_client_info.cc client_actions/get_configuration.cc client_actions/get_install_date.cc client_actions/get_library_versions.cc client_actions/get_platform_info.cc client_actions/grep.cc client_actions/list_directory.cc client_actions/list_processes.cc client_actions/stat_file.cc client_actions/delete_grr_temp_files.cc client_actions/transfer_buffer.cc file_contents.cc file_operations.cc paths.cc tempfiles.cc ) set(set_client_actions_lib_DEPS core_lib ${core_lib_DEPS}) add_executable(minicomm client_main.cc client.cc) set(minicom_external_DEPS ${http_comms_lib_DEPS} ${client_actions_lib_DEPS} ${core_lib_DEPS}) list(REMOVE_DUPLICATES minicom_external_DEPS) target_link_libraries(minicomm core_lib http_comms_lib client_actions_lib ${minicom_external_DEPS} ) install(TARGETS minicomm DESTINATION bin) # Tests Libraries find_package(GTest REQUIRED) include_directories(${GTEST_INCLUDE_DIR}) add_library(test_helper_lib client_test_base.cc logging_control.cc test_util.cc) set(test_helper_lib_DEPS gtest pthread) add_executable(unit_tests grr_test_main.cc client_action_dispatcher_test.cc client_action_test.cc client_actions/delete_grr_temp_files_test.cc client_actions/enumerate_filesystems_test.cc client_actions/enumerate_interfaces_test.cc client_actions/enumerate_users_test.cc client_actions/find_test.cc client_actions/fingerprint_file_test.cc client_actions/get_platform_info_test.cc client_actions/grep_test.cc client_actions/list_directory_test.cc client_actions/list_processes_test.cc client_actions/transfer_buffer_test.cc comms_utils_test.cc compression_test.cc config_test.cc crypto_test.cc file_contents_test.cc file_operations_test.cc message_queue_test.cc paths_test.cc # subprocess_delegator_test.cc tempfiles_test.cc util_test.cc ) set(unit_tests_external_DEPS ${client_actions_lib_DEPS} ${core_lib_DEPS} ${subprocess_delegator_lib_DEPS} ${test_helper_lib_DEPS}) list(REMOVE_DUPLICATES unit_tests_external_DEPS) target_link_libraries(unit_tests client_actions_lib core_lib subprocess_delegator_lib test_helper_lib ${unit_tests_external_DEPS} ) grr-3.1.0.2/grr/client/minicomm/base.h000066400000000000000000000010071273104013200173770ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_BASE_H_ #define GRR_CLIENT_MINICOMM_BASE_H_ #include "google/protobuf/stubs/common.h" typedef google::protobuf::uint8 uint8; typedef google::protobuf::uint16 uint16; typedef google::protobuf::uint32 uint32; typedef google::protobuf::uint64 uint64; typedef google::protobuf::int8 int8; typedef google::protobuf::int16 int16; typedef google::protobuf::int32 int32; typedef google::protobuf::int64 int64; typedef google::protobuf::LogLevel LogLevel; #endif // GRR_CLIENT_MINICOMM_BASE_H_ grr-3.1.0.2/grr/client/minicomm/client.cc000066400000000000000000000102311273104013200201000ustar00rootroot00000000000000#include "grr/client/minicomm/client.h" #include #include "grr/client/minicomm/base.h" #include "grr/client/minicomm/client_actions/delete_grr_temp_files.h" #include "grr/client/minicomm/client_actions/dump_process_memory.h" #include "grr/client/minicomm/client_actions/enumerate_filesystems.h" #include "grr/client/minicomm/client_actions/enumerate_interfaces.h" #include "grr/client/minicomm/client_actions/enumerate_users.h" #include "grr/client/minicomm/client_actions/find.h" #include "grr/client/minicomm/client_actions/fingerprint_file.h" #include "grr/client/minicomm/client_actions/get_client_info.h" #include "grr/client/minicomm/client_actions/get_configuration.h" #include "grr/client/minicomm/client_actions/get_install_date.h" #include "grr/client/minicomm/client_actions/get_library_versions.h" #include "grr/client/minicomm/client_actions/get_platform_info.h" #include "grr/client/minicomm/client_actions/grep.h" #include "grr/client/minicomm/client_actions/list_directory.h" #include "grr/client/minicomm/client_actions/list_processes.h" #include "grr/client/minicomm/client_actions/stat_file.h" #include "grr/client/minicomm/client_actions/transfer_buffer.h" namespace grr { Client::Client(const std::string& filename) : config_(filename), inbox_(5000, 1000000), outbox_(5000, 1000000), connection_manager_(&config_, &inbox_, &outbox_), client_action_dispatcher_(&inbox_, &outbox_, &config_) { if (!config_.ReadConfig()) { GOOGLE_LOG(FATAL) << "Unable to read config."; } if (config_.ClientId().empty()) { config_.ResetKey(); } GOOGLE_LOG(INFO) << "I am " << config_.ClientId(); } void Client::StaticInit() { GOOGLE_PROTOBUF_VERIFY_VERSION; HttpConnectionManager::StaticInit(); } void Client::Run() { client_action_dispatcher_.AddAction("DumpProcessMemory", new actions::DumpProcessMemory()); client_action_dispatcher_.AddAction("DeleteGRRTempFiles", new actions::DeleteGRRTempFiles()); client_action_dispatcher_.AddAction("EnumerateFilesystems", new actions::EnumerateFilesystems()); client_action_dispatcher_.AddAction("EnumerateInterfaces", new actions::EnumerateInterfaces()); client_action_dispatcher_.AddAction("EnumerateUsers", new actions::EnumerateUsers()); client_action_dispatcher_.AddAction("GetClientInfo", new actions::GetClientInfo()); client_action_dispatcher_.AddAction("GetConfiguration", new actions::GetConfiguration()); client_action_dispatcher_.AddAction("GetInstallDate", new actions::GetInstallDate()); client_action_dispatcher_.AddAction("GetLibraryVersions", new actions::GetLibraryVersions()); client_action_dispatcher_.AddAction("GetPlatformInfo", new actions::GetPlatformInfo()); client_action_dispatcher_.AddAction("Grep", new actions::Grep()); client_action_dispatcher_.AddAction("Find", new actions::Find()); client_action_dispatcher_.AddAction("FingerprintFile", new actions::FingerprintFile()); client_action_dispatcher_.AddAction("HashFile", new actions::FingerprintFile()); client_action_dispatcher_.AddAction("ListDirectory", new actions::ListDirectory()); client_action_dispatcher_.AddAction("ListProcesses", new actions::ListProcesses()); client_action_dispatcher_.AddAction("StatFile", new actions::StatFile()); client_action_dispatcher_.AddAction("HashBuffer", new actions::TransferBuffer()); client_action_dispatcher_.AddAction("TransferBuffer", new actions::TransferBuffer()); client_action_dispatcher_.StartProcessing(); std::thread connection_manager_thread( [this] { this->connection_manager_.Run(); }); connection_manager_thread.join(); } } // namespace grr grr-3.1.0.2/grr/client/minicomm/client.h000066400000000000000000000016671273104013200177570ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_CLIENT_H_ #define GRR_CLIENT_MINICOMM_CLIENT_H_ #include #include #include "grr/client/minicomm/client_action_dispatcher.h" #include "grr/client/minicomm/comms_utils.h" #include "grr/client/minicomm/config.h" #include "grr/client/minicomm/http_connection.h" #include "grr/client/minicomm/message_queue.h" namespace grr { class Client { public: // Create a client configured by the config file referenced by filename. explicit Client(const std::string& filename); void Run(); // Performs necessary static initialization. Must be called before any threads // are spawned. static void StaticInit(); private: ClientConfig config_; MessageQueue inbox_; MessageQueue outbox_; HttpConnectionManager connection_manager_; std::unique_ptr session_; ClientActionDispatcher client_action_dispatcher_; }; } // namespace grr #endif // GRR_CLIENT_MINICOMM_CLIENT_H_ grr-3.1.0.2/grr/client/minicomm/client_action.cc000066400000000000000000000030241273104013200214370ustar00rootroot00000000000000#include "grr/client/minicomm/client_action.h" namespace grr { bool ActionContext::PopulateArgs(google::protobuf::Message* args) { if (!grr_message_.has_args()) { SetError("Expected args of type: " + args->GetTypeName() + ", but no args provided."); return false; } if (args->GetTypeName() != grr_message_.args_rdf_name()) { SetError("Expected args of type: " + args->GetTypeName() + ", but received args of type: " + grr_message_.args_rdf_name()); return false; } if (!args->ParseFromString(grr_message_.args())) { SetError("Unable to parse args."); return false; } return true; } bool ActionContext::SendResponse(const google::protobuf::Message& payload, GrrMessage::Type type) { GrrMessage message; message.set_args_rdf_name(payload.GetTypeName()); if (!payload.SerializeToString(message.mutable_args())) { SetError("Unable to serialize response."); return false; } // Leave unset if we were passed the default. if (type != message.type()) { message.set_type(type); } message.set_name(grr_message_.name()); message.set_request_id(grr_message_.request_id()); message.set_response_id(response_id_++); message.set_session_id(grr_message_.session_id()); message.set_task_id(grr_message_.task_id()); SendMessage(message); return true; } void ActionContext::SetError(const std::string& error_message) { status_.set_status(GrrStatus::GENERIC_ERROR); status_.set_error_message(error_message); } } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_action.h000066400000000000000000000043561273104013200213120ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_CLIENT_ACTION_H_ #define GRR_CLIENT_MINICOMM_CLIENT_ACTION_H_ #include "grr/proto/jobs.pb.h" #include "grr/client/minicomm/config.h" #include "grr/client/minicomm/message_queue.h" namespace grr { class ActionContext; // Represents a client action. class ClientAction { public: ClientAction() {} ~ClientAction() {} // Attempt to handle the request contained in context. Should send all // necessary responses, except for the final status message. virtual void ProcessRequest(ActionContext* context) = 0; }; // Contains the data and helper methods to read a request and report back to the // server. class ActionContext { public: ActionContext(const GrrMessage& grr_message, MessageQueue* outbox, ClientConfig* config) : response_id_(1), outbox_(outbox), grr_message_(grr_message), config_(config) {} ~ActionContext() {} // The message which we are responding to. const GrrMessage& Message() const { return grr_message_; } // Helper method to populate an args protocol buffer. Returns true on success, // sets an error status on failure. bool PopulateArgs(google::protobuf::Message* args); // Helper method to send a response to the server for the current // request. Encodes payload into the response's args field. Returns true on // success, otherwise returns false and sets an error status. bool SendResponse(const google::protobuf::Message& payload, GrrMessage::Type type); // Fail this action, setting GENERIC_ERROR status with error_message. void SetError(const std::string& error_message); // Send a message to the server verbatim. void SendMessage(const GrrMessage& message) { outbox_->AddMessage(message); } // Report the current status. const GrrStatus& Status() const { return status_; } // Reference to ClientConfig. const ClientConfig& Config() const { GOOGLE_DCHECK_NE(config_, nullptr); return *config_; } private: ClientConfig* const config_; MessageQueue* const outbox_; const GrrMessage grr_message_; // The next response id that we should use. int response_id_; // The status of this action. GrrStatus status_; }; } // namespace grr #endif // GRR_CLIENT_MINICOMM_CLIENT_ACTION_H_ grr-3.1.0.2/grr/client/minicomm/client_action_dispatcher.cc000066400000000000000000000043431273104013200236520ustar00rootroot00000000000000#include "grr/client/minicomm/client_action_dispatcher.h" namespace grr { ClientActionDispatcher::ClientActionDispatcher(MessageQueue* inbox, MessageQueue* outbox, ClientConfig* config) : inbox_(inbox), outbox_(outbox), shutting_down_(false), config_(config) {} ClientActionDispatcher::~ClientActionDispatcher() { { std::unique_lock l(shutting_down_mutex_); shutting_down_ = true; } if (processing_thread_.joinable()) { // Worker thread might now be waiting to read from the inbox. Add an empty // message to unstick it. inbox_->AddMessage(GrrMessage()); processing_thread_.join(); } } void ClientActionDispatcher::StartProcessing() { processing_thread_ = std::thread([this]() { this->ActionLoop(); }); } void ClientActionDispatcher::AddAction(const char* name, ClientAction* action) { actions_[name].reset(action); } bool ClientActionDispatcher::CanHandle(const GrrMessage& message) const { return actions_.count(message.name()); } void ClientActionDispatcher::ActionLoop() { while (true) { std::vector messages = inbox_->GetMessages(100, 100000, true); GOOGLE_DCHECK_GT(messages.size(), 0); for (const auto& m : messages) { { std::unique_lock l(shutting_down_mutex_); if (shutting_down_) { return; } } ActionContext context(m, outbox_, config_); const auto found = actions_.find(m.name()); if (found == actions_.end()) { GOOGLE_LOG(ERROR) << "Unrecognized action: [" << m.name() << "]"; context.SetError("Unrecognized action: " + m.name()); } else { GOOGLE_LOG(INFO) << "Performing action: " + m.name(); try { found->second->ProcessRequest(&context); } catch (std::exception e) { // We try to minimize the use of exceptions, but if one happens during // a client action we still prefer to report it and not die. context.SetError(std::string("Exception in ProcessRequest: ") + e.what()); } } context.SendResponse(context.Status(), GrrMessage::STATUS); } } } } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_action_dispatcher.h000066400000000000000000000023301273104013200235060ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_CLIENT_ACTION_DISPATCHER_H_ #define GRR_CLIENT_MINICOMM_CLIENT_ACTION_DISPATCHER_H_ #include #include "grr/client/minicomm/client_action.h" #include "grr/client/minicomm/config.h" #include "grr/client/minicomm/message_queue.h" namespace grr { class ClientActionDispatcher { public: ClientActionDispatcher(MessageQueue* inbox, MessageQueue* outbox, ClientConfig* config); ~ClientActionDispatcher(); // Setup method. All calls should be made before StartProcessing. Takes // ownership. void AddAction(const char* name, ClientAction* action); // Begins monitoring inbox, and processing messages using added actions. void StartProcessing(); // Returns whether we know how to handle message. bool CanHandle(const GrrMessage& message) const; private: // The thread and method which process actions. std::thread processing_thread_; void ActionLoop(); ClientConfig* const config_; MessageQueue* const inbox_; MessageQueue* const outbox_; std::mutex shutting_down_mutex_; bool shutting_down_; std::map > actions_; }; } // namespace grr #endif // GRR_CLIENT_MINICOMM_CLIENT_ACTION_DISPATCHER_H_ grr-3.1.0.2/grr/client/minicomm/client_action_dispatcher_test.cc000066400000000000000000000066251273104013200247160ustar00rootroot00000000000000#include "grr/client/minicomm/client_action_dispatcher.h" #include #include #include "gtest/gtest.h" #include "google/protobuf/text_format.h" #include "grr/client/minicomm/message_queue.h" #include "grr/client/minicomm/test_util.h" namespace grr { namespace testing { std::vector GetMessagesExact(int message_count, MessageQueue* queue) { std::vector r; r.reserve(message_count); while (r.size() < message_count) { auto results = queue->GetMessages(message_count - r.size(), 100000, true); for (auto& result : results) { r.insert(r.end(), std::move(result)); } } return r; } } // namespace testing // A fast action which sends PathSpec args back. class FastAction : public ClientAction { void ProcessRequest(ActionContext* context) override { PathSpec spec; context->PopulateArgs(&spec); context->SendResponse(spec, GrrMessage::MESSAGE); } }; // A slow action which sends back an error message. class SlowAction : public ClientAction { void ProcessRequest(ActionContext* context) override { std::this_thread::sleep_for(std::chrono::seconds(1)); context->SetError("Timeout copying path."); } }; TEST(ClientActionDispatcherTest, SimpleTest) { MessageQueue inbox(10, 100000); MessageQueue outbox(10, 100000); ClientActionDispatcher dispatcher(&inbox, &outbox, nullptr); dispatcher.AddAction("FastAction", new FastAction()); dispatcher.AddAction("SlowAction", new SlowAction()); dispatcher.StartProcessing(); GrrMessage request_1; ASSERT_TRUE(google::protobuf::TextFormat::ParseFromString( "request_id: 1 name: 'SlowAction'", &request_1)); PathSpec path_spec; path_spec.set_pathtype(PathSpec::OS); path_spec.set_path("/etc/passwd"); GrrMessage request_2; ASSERT_TRUE(google::protobuf::TextFormat::ParseFromString( "request_id: 2 name: 'FastAction' args_rdf_name: 'PathSpec'", &request_2)); request_2.set_args(path_spec.SerializeAsString()); GrrMessage request_3; ASSERT_TRUE(google::protobuf::TextFormat::ParseFromString( "request_id: 3 name: 'SlowAction'", &request_3)); inbox.AddMessage(request_1); inbox.AddMessage(request_2); inbox.AddMessage(request_3); const auto results = testing::GetMessagesExact(4, &outbox); // Expect one status for each action. std::set statuses_seen; for (const auto& result : results) { if (result.type() == GrrMessage::STATUS) { statuses_seen.insert(result.request_id()); } switch (result.request_id()) { case 1: { EXPECT_EQ(result.name(), "SlowAction"); EXPECT_EQ(result.response_id(), 1); EXPECT_EQ(result.type(), GrrMessage::STATUS); } break; case 2: { EXPECT_EQ(result.name(), "FastAction"); if (result.response_id() == 1) { EXPECT_EQ(result.type(), GrrMessage::MESSAGE); PathSpec path_spec_result; EXPECT_TRUE(path_spec_result.ParseFromString(result.args())); EXPECT_EQ(path_spec_result.path(), "/etc/passwd"); } else { EXPECT_EQ(result.response_id(), 2); EXPECT_EQ(result.type(), GrrMessage::STATUS); } } break; case 3: { EXPECT_EQ(result.name(), "SlowAction"); EXPECT_EQ(result.response_id(), 1); EXPECT_EQ(result.type(), GrrMessage::STATUS); } break; } } EXPECT_EQ(statuses_seen.size(), 3); } } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_action_test.cc000066400000000000000000000106341273104013200225030ustar00rootroot00000000000000#include "grr/client/minicomm/client_action.h" #include "gtest/gtest.h" #include "google/protobuf/text_format.h" #include "grr/proto/jobs.pb.h" #include "grr/client/minicomm/message_queue.h" namespace grr { class ActionContextTest : public ::testing::Test { public: ActionContextTest() : message_queue_(5, 20000) { request_message_.set_session_id("Session26"); request_message_.set_request_id(2600); request_message_.set_name("TestAction"); } bool GetOneResponse(GrrMessage* dest) { const auto r = message_queue_.GetMessages(5, 20000, true); if (r.size() != 1) { return false; } dest->Clear(); dest->CopyFrom(r[0]); return true; } GrrMessage request_message_; MessageQueue message_queue_; }; TEST_F(ActionContextTest, SendMessage) { ActionContext context(request_message_, &message_queue_, nullptr); GrrMessage response_message; response_message.set_session_id("Session42"); context.SendMessage(response_message); GrrMessage result_message; EXPECT_TRUE(GetOneResponse(&result_message)); EXPECT_EQ(result_message.session_id(), "Session42"); } TEST_F(ActionContextTest, SendResponse) { ActionContext context(request_message_, &message_queue_, nullptr); Uname args; args.set_system("Nouveau Linux"); context.SendResponse(args, GrrMessage::MESSAGE); GrrMessage result_message; EXPECT_TRUE(GetOneResponse(&result_message)); EXPECT_EQ("Session26", result_message.session_id()); EXPECT_EQ(1, result_message.response_id()); EXPECT_EQ(GrrMessage::MESSAGE, result_message.type()); EXPECT_EQ("Uname", result_message.args_rdf_name()); EXPECT_EQ(args.SerializeAsString(), result_message.args()); context.SendResponse(args, GrrMessage::MESSAGE); EXPECT_TRUE(GetOneResponse(&result_message)); EXPECT_EQ("Session26", result_message.session_id()); EXPECT_EQ(2, result_message.response_id()); EXPECT_EQ(GrrMessage::MESSAGE, result_message.type()); } TEST_F(ActionContextTest, SetError) { ActionContext context(request_message_, &message_queue_, nullptr); EXPECT_EQ(GrrStatus::OK, context.Status().status()); context.SetError("Unable to fizz or buzz."); EXPECT_EQ(GrrStatus::GENERIC_ERROR, context.Status().status()); EXPECT_EQ("Unable to fizz or buzz.", context.Status().error_message()); } TEST_F(ActionContextTest, PopulateArgsNoArgs) { // Can't import if request doesn't have args attached. ActionContext context(request_message_, &message_queue_, nullptr); BufferReference ref; EXPECT_FALSE(context.PopulateArgs(&ref)); // Should set an error code. EXPECT_EQ(GrrStatus::GENERIC_ERROR, context.Status().status()); EXPECT_EQ("Expected args of type: BufferReference, but no args provided.", context.Status().error_message()); } TEST_F(ActionContextTest, PopulateArgsBadType) { request_message_.set_args_rdf_name("FingerprintRequest"); request_message_.set_args(""); ActionContext context(request_message_, &message_queue_, nullptr); BufferReference ref; EXPECT_FALSE(context.PopulateArgs(&ref)); // Should set an error code. EXPECT_EQ(GrrStatus::GENERIC_ERROR, context.Status().status()); EXPECT_EQ( "Expected args of type: BufferReference, but received args of type: " "FingerprintRequest", context.Status().error_message()); } TEST_F(ActionContextTest, PopulateArgsBadData) { request_message_.set_args_rdf_name("BufferReference"); request_message_.set_args("not a protocol buffer"); ActionContext context(request_message_, &message_queue_, nullptr); BufferReference ref; EXPECT_FALSE(context.PopulateArgs(&ref)); // Should set an error code. EXPECT_EQ(GrrStatus::GENERIC_ERROR, context.Status().status()); EXPECT_EQ("Unable to parse args.", context.Status().error_message()); } TEST_F(ActionContextTest, PopulateArgsEmptyArgs) { // Empty args is fine, so long as the rdf name is correct. request_message_.set_args_rdf_name("BufferReference"); request_message_.set_args(""); ActionContext context(request_message_, &message_queue_, nullptr); BufferReference ref; EXPECT_TRUE(context.PopulateArgs(&ref)); } TEST_F(ActionContextTest, PopulateArgsSuccess) { BufferReference ref; ref.set_offset(2600); request_message_.set_args_rdf_name("BufferReference"); request_message_.set_args(ref.SerializeAsString()); ref.Clear(); ActionContext context(request_message_, &message_queue_, nullptr); EXPECT_TRUE(context.PopulateArgs(&ref)); EXPECT_EQ(ref.offset(), 2600); } } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_actions/000077500000000000000000000000001273104013200213145ustar00rootroot00000000000000grr-3.1.0.2/grr/client/minicomm/client_actions/delete_grr_temp_files.cc000066400000000000000000000013451273104013200261510ustar00rootroot00000000000000#include "grr/client/minicomm/client_actions/delete_grr_temp_files.h" #include #include #include #include "grr/client/minicomm/tempfiles.h" #include "grr/client/minicomm/paths.h" namespace grr { namespace actions { void DeleteGRRTempFiles::ProcessRequest(ActionContext* context) { PathSpec req; if (!context->PopulateArgs(&req)) { return; } std::string error; std::string log; TemporaryFiles temp_files(context->Config()); if (temp_files.DeleteGRRTempFiles(req.path(), &log, &error)) { PrintStr log_str; log_str.set_data(log); context->SendResponse(log_str, GrrMessage::MESSAGE); } else { context->SetError(error); } } } // namespace actions } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_actions/delete_grr_temp_files.h000066400000000000000000000010771273104013200260150ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_DELETE_GRR_TEMP_FILES_H_ #define GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_DELETE_GRR_TEMP_FILES_H_ #include #include #include #include #include #include "grr/client/minicomm/client_action.h" namespace grr { namespace actions { class DeleteGRRTempFiles : public ClientAction { public: DeleteGRRTempFiles() {} void ProcessRequest(ActionContext* args) override; }; } // namespace actions } // namespace grr #endif // GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_DELETE_GRR_TEMP_FILES_H_ grr-3.1.0.2/grr/client/minicomm/client_actions/delete_grr_temp_files_test.cc000066400000000000000000000026271273104013200272140ustar00rootroot00000000000000#include "grr/client/minicomm/client_actions/delete_grr_temp_files.h" #include #include #include #include "gtest/gtest.h" #include "grr/client/minicomm/client_test_base.h" #include "grr/client/minicomm/file_operations.h" #include "grr/client/minicomm/tempfiles.h" #include "grr/client/minicomm/test_util.h" #include "grr/client/minicomm/util.h" namespace grr { namespace {} class DeleteGRRTempFiles : public grr::ClientTestBase {}; TEST_F(DeleteGRRTempFiles, ActionTest) { std::vector files; WriteValidConfigFile(false, true); ASSERT_TRUE(config_.ReadConfig()); TemporaryFiles temp_files(config_); for (int i = 0; i < 50; ++i) { std::string path; std::string error; path = temp_files.CreateGRRTempFile("Testing", &error); ASSERT_GT(path.size(), 0); ASSERT_EQ(access(path.c_str(), R_OK), 0); files.emplace_back(path); } PathSpec spec; spec.set_path(config_.TemporaryDirectory()); spec.set_pathtype(PathSpec::OS); GrrMessage message; message.set_args(spec.SerializeAsString()); message.set_args_rdf_name("PathSpec"); MessageQueue queue(5, 20000); ActionContext context(message, &queue, &config_); actions::DeleteGRRTempFiles action; action.ProcessRequest(&context); const auto r = queue.GetMessages(10, 20000, true); for (auto& file : files) { ASSERT_EQ(access(file.c_str(), R_OK), -1); } } } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_actions/dump_process_memory.cc000066400000000000000000000111431273104013200257160ustar00rootroot00000000000000#include "grr/client/minicomm/client_actions/dump_process_memory.h" #include #include #include #include #include #include #include "grr/client/minicomm/file_operations.h" #include "grr/client/minicomm/paths.h" #include "grr/client/minicomm/tempfiles.h" #include "grr/client/minicomm/util.h" namespace grr { namespace actions { void DumpProcessMemory::ProcessRequest(ActionContext *context) { DumpProcessMemoryRequest req; if (!context->PopulateArgs(&req)) { return; } PathSpec res; const int pid = req.pid(); const bool pause = req.pause(); std::string error; std::string dump_location = DumpImage(pid, pause, &error, context->Config()); if (dump_location.size() > 0) { res.set_path(dump_location); res.set_pathtype(PathSpec::OS); context->SendResponse(res, GrrMessage::MESSAGE); } else { context->SetError(error); } } std::string DumpProcessMemory::DumpImage(const int pid, const bool pause, std::string *const error, const ClientConfig &config) const { ProcessAttachmentHandle handle(pid, pause, error, config); if (handle.good() == false) { return std::string(); } std::string line; // Maximum size of the buffer should not be larger than 512KiB. const int MAXBUFF = 512 * 1024; char buff[MAXBUFF]; while (std::getline(handle.MapsHandle(), line)) { uint64 a, b; std::istringstream line_stream(line); std::string range, permissions, junk, filehandle; line_stream >> range >> permissions >> junk >> junk >> filehandle; std::istringstream range_stream(range); char junk_chr; range_stream >> std::hex >> a >> junk_chr >> std::hex >> b; if (range_stream.fail()) continue; // If the region is not readable, skip it. if (permissions[0] != 'r') continue; // If the file is mapped to this region don't aquire it. if (filehandle[0] != '0') continue; if (a >= b) continue; int64 offset = a; if (lseek64(handle.MemHandle(), offset, SEEK_SET) != offset) continue; while (offset < b) { const int size = static_cast(std::min(b - offset, static_cast(MAXBUFF))); int len = read(handle.MemHandle(), buff, size); if (len <= 0) break; if (write(handle.DumpHandle(), buff, len) == -1) { *error += "Unable to write memory to file." + ErrorName(errno) + "\n"; return std::string(); } offset += len; } } return handle.TempFileLocation(); } DumpProcessMemory::ProcessAttachmentHandle::ProcessAttachmentHandle( const int pid, const bool pause, std::string *const error, const ClientConfig &config) : pid_(pid), error_(error), pause_(pause), mem_(error), dump_(error) { TemporaryFiles temp_files(config); std::ostringstream mem_file_name; mem_file_name << "/proc/" << pid << "/mem"; std::ostringstream maps_file_name; maps_file_name << "/proc/" << pid << "/maps"; mem_.set_fd(open(mem_file_name.str().c_str(), O_RDONLY)); if (mem_.get_fd() == -1) { *error += "Could not open /proc/pid/mem.\n"; return; } const std::string prefix = "DumpProcessMemory"; temp_file_path_ = temp_files.CreateGRRTempFile(prefix, error); if (temp_file_path_.size()) { dump_.set_fd(open(temp_file_path_.c_str(), O_RDWR)); if (dump_.get_fd() == -1) { *error += "Could not open temporary file.\n"; return; } } else { *error += "Could not create a temporary file.\n"; return; } maps_stream_.open(maps_file_name.str()); if (maps_stream_.good() == false) { *error += "Could not open /proc/pid/maps.\n"; return; } if (pause_) { // Process shouldn't try to pause itself. if (getpid() == pid_) { *error += "This process can't pause itself.\n"; return; } else { if (ptrace(PTRACE_ATTACH, pid_, NULL, NULL) != 0) { *error += "Unable to attach to process.\n"; return; } if (waitpid(pid_, NULL, 0) != pid_) { *error += "Process did not change state.\n"; return; } paused_ = true; } } } DumpProcessMemory::ProcessAttachmentHandle::~ProcessAttachmentHandle() { if (paused_) { if (ptrace(PTRACE_DETACH, pid_, NULL, NULL) != 0) { *error_ += "Could not unpause the process.\n"; } } } bool DumpProcessMemory::ProcessAttachmentHandle::good() const { if (mem_.get_fd() == -1) return false; if (dump_.get_fd() == -1) return false; if (paused_ != pause_) return false; if (maps_stream_.good() == false) return false; return true; } } // namespace actions } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_actions/dump_process_memory.h000066400000000000000000000040751273104013200255660ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_DUMP_PROCESS_MEMORY_H_ #define GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_DUMP_PROCESS_MEMORY_H_ #include #include #include #include #include #include "grr/client/minicomm/client_action.h" namespace grr { namespace actions { class DumpProcessMemory : public ClientAction { public: DumpProcessMemory() {} void ProcessRequest(ActionContext* args) override; class ProcessAttachmentHandle { public: ProcessAttachmentHandle(const int, const bool, std::string* const error, const ClientConfig&); ~ProcessAttachmentHandle(); bool good() const; int MemHandle() const { return mem_.get_fd(); } int DumpHandle() const { return dump_.get_fd(); } std::ifstream& MapsHandle() { return maps_stream_; } std::string TempFileLocation() { return temp_file_path_; } private: class FileHandle { public: explicit FileHandle(std::string* const error) : fd_(-1), error_(error) {} ~FileHandle() { close_fd(); } int get_fd() const { return fd_; } void set_fd(int fd) { close_fd(); fd_ = fd; } private: void close_fd() { if (fd_ != -1) { if (close(fd_) != 0) { if (error_ != nullptr) { *error_ += "Could not close file descriptor.\n"; } } else { fd_ = -1; } } } int fd_; std::string* const error_; }; const int pid_; const bool pause_; bool paused_ = 0; FileHandle mem_; FileHandle dump_; std::string temp_file_path_; std::string* const error_; std::ifstream maps_stream_; }; private: std::string DumpImage(const int, const bool, std::string* const, const ClientConfig&) const; }; class DeleteFile : public ClientAction { public: DeleteFile() {} void ProcessRequest(ActionContext* args) override; }; } // namespace actions } // namespace grr #endif // GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_DUMP_PROCESS_MEMORY_H_ grr-3.1.0.2/grr/client/minicomm/client_actions/enumerate_filesystems.cc000066400000000000000000000033751273104013200262470ustar00rootroot00000000000000#include "grr/client/minicomm/client_actions/enumerate_filesystems.h" #include #include #include "grr/client/minicomm/util.h" namespace grr { namespace actions { EnumerateFilesystems::EnumerateFilesystems() : to_report_{"ext2", "ext3", "ext4", "vfat", "ntfs", "btrfs", "Reiserfs", "XFS", "JFS", "squashfs"} {} void EnumerateFilesystems::ProcessRequest(ActionContext* context) { ResultMap results; ProcessFile("/proc/mounts", &results); ProcessFile("/etc/mtab", &results); for (const auto& p : results) { context->SendResponse(p.second, GrrMessage::MESSAGE); } } void EnumerateFilesystems::ProcessFile(const std::string& filename, ResultMap* results) { std::ifstream file(filename); if (!file.good()) { return; } std::string line; while (std::getline(file, line)) { Filesystem f = ProcessLine(line); if (f.has_mount_point()) { auto& result = (*results)[f.mount_point()]; // Only use result if it is new - give the first record of the mount point // priority. if (result.mount_point() == "") { result = std::move(f); } } } } Filesystem EnumerateFilesystems::ProcessLine(std::string line) { Filesystem f; // Cut off any comments. const auto comment_pos = line.find("#"); if (comment_pos != std::string::npos) { line = line.substr(0, comment_pos); } // Tokenize the rest, using the default istream whitespace setting. std::istringstream tokens(line); std::string device, mnt, fs; tokens >> device >> mnt >> fs; if (!tokens.fail() && to_report_.count(fs)) { f.set_device(device); f.set_mount_point(mnt); f.set_type(fs); } return f; } } // namespace actions } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_actions/enumerate_filesystems.h000066400000000000000000000022301273104013200260760ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_ENUMERATE_FILESYSTEMS_H_ #define GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_ENUMERATE_FILESYSTEMS_H_ #include #include #include #include "grr/proto/sysinfo.pb.h" #include "gtest/gtest_prod.h" #include "grr/client/minicomm/client_action.h" namespace grr { namespace actions { class EnumerateFilesystems : public ClientAction { public: EnumerateFilesystems(); void ProcessRequest(ActionContext* args) override; private: // Map from mount point to a filesystem record for it. typedef std::map ResultMap; // Open and process the named file. Each filesystem is added to result if we // haven't already found a filesystem for that mount point, so the first entry // has priority. void ProcessFile(const std::string& filename, ResultMap* results); Filesystem ProcessLine(std::string line); const std::set to_report_; FRIEND_TEST(EnumerateFilesystemsTest, ProcessFileComments); FRIEND_TEST(EnumerateFilesystemsTest, ProcessFileNormal); }; } // namespace actions } // namespace grr #endif // GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_ENUMERATE_FILESYSTEMS_H_ grr-3.1.0.2/grr/client/minicomm/client_actions/enumerate_filesystems_test.cc000066400000000000000000000044241273104013200273020ustar00rootroot00000000000000#include "grr/client/minicomm/client_actions/enumerate_filesystems.h" #include #include "gtest/gtest.h" #include "grr/client/minicomm/test_util.h" namespace grr { namespace actions { TEST(EnumerateFilesystemsTest, ProcessFileNormal) { EnumerateFilesystems action; EnumerateFilesystems::ResultMap results; const std::string temp_dir = testing::MakeTempDir(); const std::string file_name = temp_dir + "/fstab"; std::ofstream file; file.open(file_name); file << R"(rootfs / rootfs rw 0 0 proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0 tmpfs /run tmpfs rw,nosuid,noexec,relatime,size=3285532k,mode=755 0 0 /dev/mapper/svg-root / ext4 rw,relatime,errors=remount-ro,i_version, /dev/mapper/svg-usr+local+google /usr/local/google ext4 rw,relatime,i_version,data=writeback 0 0 /dev/sda1 /boot ext2 rw,relatime,i_version,stripe=4 0 0 )"; file.close(); action.ProcessFile(file_name, &results); EXPECT_EQ(3, results.size()); EXPECT_EQ("/dev/mapper/svg-root", results["/"].device()); EXPECT_EQ("/", results["/"].mount_point()); EXPECT_EQ("ext4", results["/"].type()); EXPECT_EQ("/dev/sda1", results["/boot"].device()); EXPECT_EQ("/boot", results["/boot"].mount_point()); EXPECT_EQ("ext2", results["/boot"].type()); } TEST(EnumerateFilesystemsTest, ProcessFileComments) { EnumerateFilesystems action; EnumerateFilesystems::ResultMap results; const std::string temp_dir = testing::MakeTempDir(); const std::string file_name = temp_dir + "/fstab"; std::ofstream file; file.open(file_name); file << R"(#/dev/sdb1 /boot vfat /dev/sdb1 /boot ext4 /dev/sdb2 /home Reiserfs /dev/sdb3 # ext4 misplace comment /dev/sdb3 /mnt/windows ntfs)"; file.close(); action.ProcessFile(file_name, &results); EXPECT_EQ(3, results.size()); EXPECT_EQ("/dev/sdb1", results["/boot"].device()); EXPECT_EQ("/boot", results["/boot"].mount_point()); EXPECT_EQ("ext4", results["/boot"].type()); EXPECT_EQ("/dev/sdb2", results["/home"].device()); EXPECT_EQ("/home", results["/home"].mount_point()); EXPECT_EQ("Reiserfs", results["/home"].type()); EXPECT_EQ("/dev/sdb3", results["/mnt/windows"].device()); EXPECT_EQ("/mnt/windows", results["/mnt/windows"].mount_point()); EXPECT_EQ("ntfs", results["/mnt/windows"].type()); } } // namespace actions } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_actions/enumerate_interfaces.cc000066400000000000000000000051541273104013200260200ustar00rootroot00000000000000#include "grr/client/minicomm/client_actions/enumerate_interfaces.h" #include #include #include #include #include #include #include "grr/client/minicomm/util.h" namespace grr { namespace actions { template std::string ToBytes(const T& input) { return std::string(static_cast(static_cast(&input)), sizeof(input)); } void EnumerateInterfaces::ProcessRequest(ActionContext* context) { struct ifaddrs* addresses = nullptr; if (getifaddrs(&addresses)) { context->SetError("Getifaddr failed with error: " + ErrorName(errno)); if (addresses != nullptr) { freeifaddrs(addresses); } return; } InterfaceMap interfaces = ProcessIfaddrList(addresses); freeifaddrs(addresses); for (const auto& p : interfaces) { context->SendResponse(p.second, GrrMessage::MESSAGE); } } EnumerateInterfaces::InterfaceMap EnumerateInterfaces::ProcessIfaddrList( const struct ifaddrs* addresses) { InterfaceMap interfaces; for (auto p = addresses; p != nullptr; p = p->ifa_next) { const std::string name(p->ifa_name); Interface& result = interfaces[name]; if (result.ifname() == "") { result.set_ifname(name); } // This will occur typically on Android's usb interfaces, but it's possible // to occur on *nix as well if (p->ifa_addr == nullptr) { continue; } switch (p->ifa_addr->sa_family) { case AF_INET: { const auto ip_addr = reinterpret_cast(p->ifa_addr); NetworkAddress* net_address = result.add_addresses(); net_address->set_address_type(NetworkAddress::INET); // It seems that s_addr is already in network byte order. net_address->set_packed_bytes(ToBytes(ip_addr->sin_addr.s_addr)); } break; case AF_INET6: { const auto ip6_addr = reinterpret_cast(p->ifa_addr); NetworkAddress* net_address = result.add_addresses(); net_address->set_address_type(NetworkAddress::INET6); net_address->set_packed_bytes(ToBytes(ip6_addr->sin6_addr.s6_addr)); } break; case AF_PACKET: { const auto sock_addr = reinterpret_cast(p->ifa_addr); result.set_mac_address( std::string(reinterpret_cast(sock_addr->sll_addr), std::min(size_t(sock_addr->sll_halen), sizeof(sock_addr->sll_addr)))); } break; } } return interfaces; } } // namespace actions } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_actions/enumerate_interfaces.h000066400000000000000000000015311273104013200256550ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_ENUMERATE_INTERFACES_H_ #define GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_ENUMERATE_INTERFACES_H_ #include #include #include "gtest/gtest_prod.h" #include "grr/client/minicomm/client_action.h" namespace grr { namespace actions { class EnumerateInterfaces : public ClientAction { public: void ProcessRequest(ActionContext* args) override; private: // Map from interface name to interface information. typedef std::map InterfaceMap; // Process a linked list of addresses, as returned by the getifaddrs system // call. InterfaceMap ProcessIfaddrList(const struct ifaddrs* addresses); FRIEND_TEST(EnumerateInterfacesTest, ProcessIfaddrList); }; } // namespace actions } // namespace grr #endif // GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_ENUMERATE_INTERFACES_H_ grr-3.1.0.2/grr/client/minicomm/client_actions/enumerate_interfaces_test.cc000066400000000000000000000043511273104013200270550ustar00rootroot00000000000000#include "grr/client/minicomm/client_actions/enumerate_interfaces.h" #include #include #include #include #include "gtest/gtest.h" #include "grr/client/minicomm/base.h" #include "grr/client/minicomm/util.h" namespace grr { namespace actions { TEST(EnumerateInterfacesTest, ProcessIfaddrList) { char kEth0[] = "eth0"; const char kMacAddr[] = "\xFF\x00\xFE\x01\xFD\x02"; const char kIp6Addr[] = "\xFF\x00\xFE\x01\xFD\x02\xFC\x03\xFB\x04\xFA\x05\xF9\x06\xF8\x07"; constexpr uint32 kIp4Addr = 0xC0A80102ul; // 192.168.1.2 const char kIp4AddrBytes[] = "\xC0\xA8\x01\x02"; struct sockaddr_ll eth0_mac_addr = {}; eth0_mac_addr.sll_family = AF_PACKET; eth0_mac_addr.sll_halen = 6; std::memcpy(ð0_mac_addr.sll_addr, kMacAddr, 6); struct ifaddrs eth0_mac = {}; eth0_mac.ifa_name = kEth0; eth0_mac.ifa_addr = reinterpret_cast(ð0_mac_addr); struct sockaddr_in eth0_ip_addr = {}; eth0_ip_addr.sin_family = AF_INET; eth0_ip_addr.sin_addr.s_addr = htonl(kIp4Addr); struct ifaddrs eth0_ip = {}; eth0_ip.ifa_name = kEth0; eth0_ip.ifa_addr = reinterpret_cast(ð0_ip_addr); eth0_ip.ifa_next = ð0_mac; struct sockaddr_in6 eth0_ip6_addr = {}; eth0_ip6_addr.sin6_family = AF_INET6; std::memcpy(ð0_ip6_addr.sin6_addr.s6_addr, kIp6Addr, 16); struct ifaddrs eth0_null = {}; eth0_null.ifa_name = kEth0; eth0_null.ifa_addr = nullptr; eth0_null.ifa_next = ð0_ip; struct ifaddrs eth0_ip6 = {}; eth0_ip6.ifa_name = kEth0; eth0_ip6.ifa_addr = reinterpret_cast(ð0_ip6_addr); eth0_ip6.ifa_next = ð0_null; EnumerateInterfaces action; auto result = action.ProcessIfaddrList(ð0_ip6); EXPECT_EQ(1, result.size()); EXPECT_EQ(std::string(kMacAddr, 6), result[kEth0].mac_address()); EXPECT_EQ(2, result[kEth0].addresses_size()); for (const auto& addr : result[kEth0].addresses()) { if (addr.address_type() == NetworkAddress::INET) { EXPECT_EQ(std::string(kIp4AddrBytes, 4), addr.packed_bytes()); } if (addr.address_type() == NetworkAddress::INET6) { EXPECT_EQ(std::string(kIp6Addr, 16), addr.packed_bytes()); } } } } // namespace actions } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_actions/enumerate_users.cc000066400000000000000000000042321273104013200250320ustar00rootroot00000000000000#include "grr/client/minicomm/client_actions/enumerate_users.h" #include #include "grr/proto/knowledge_base.pb.h" #include "grr/client/minicomm/base.h" #include "grr/client/minicomm/util.h" #include "grr/client/minicomm/file_operations.h" // Needs to come after knowledge_base.pb.h due to name clash. // TODO(user): Fix properly (put protos in namespace?). #include namespace grr { namespace actions { void EnumerateUsers::ProcessRequest(ActionContext* args) { auto users = UsersFromWtmp("/var/log/wtmp"); constexpr int kBuffSize = 32 * 1024; char buff[kBuffSize]; struct passwd pwd; struct passwd* result; for (const auto& user : users) { User u; u.set_username(user.first); u.set_last_logon(std::max(0, user.second)); #ifdef ANDROID continue; #else int s = getpwnam_r(user.first.c_str(), &pwd, buff, kBuffSize, &result); if (result != nullptr) { u.set_homedir(result->pw_dir); u.set_full_name(result->pw_gecos); } #endif args->SendResponse(u, GrrMessage::MESSAGE); } } std::map EnumerateUsers::UsersFromWtmp( const std::string& wtmp) { std::map res; auto file = OpenedPath::Open(wtmp, nullptr); if (file != nullptr) { char buff[sizeof(utmp) * 100]; size_t bytes_read; if (!file->Read(buff, &bytes_read, nullptr)) { return res; } utmp* utmp_buff = reinterpret_cast(buff); for (int i = 0; i < bytes_read / sizeof(utmp); i++) { const utmp& u = utmp_buff[i]; if (u.ut_type == USER_PROCESS) { const std::string user = ArrayToString(u.ut_user); const std::string device = ArrayToString(u.ut_line); if (device.find("pts") != 0 && device.find("tty") != 0) { GOOGLE_LOG(ERROR) << "Apparent utmp mismatch, found login device: [" << device << "]"; continue; } auto it = res.find(user); if (it == res.end()) { res[user] = u.ut_tv.tv_sec; } else { it->second = std::max(it->second, static_cast(u.ut_tv.tv_sec)); } } } } return res; } } // namespace actions } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_actions/enumerate_users.h000066400000000000000000000011171273104013200246730ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_ENUMERATE_USERS_H_ #define GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_ENUMERATE_USERS_H_ #include #include "grr/client/minicomm/base.h" #include "grr/client/minicomm/client_action.h" namespace grr { namespace actions { class EnumerateUsers : public ClientAction { public: EnumerateUsers() {} void ProcessRequest(ActionContext* args) override; private: std::map UsersFromWtmp(const std::string& wtmp); }; } // namespace actions } // namespace grr #endif // GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_ENUMERATE_USERS_H_ grr-3.1.0.2/grr/client/minicomm/client_actions/enumerate_users_test.cc000066400000000000000000000012701273104013200260700ustar00rootroot00000000000000#include "grr/client/minicomm/client_actions/enumerate_users.h" #include "gtest/gtest.h" #include "grr/proto/knowledge_base.pb.h" #include "grr/client/minicomm/client_action.h" #include "grr/client/minicomm/message_queue.h" #include "grr/proto/jobs.pb.h" namespace grr { TEST(EnumerateUsersTest, SimpleTest) { GrrMessage message; MessageQueue queue(5, 20000); ActionContext context(message, &queue, nullptr); actions::EnumerateUsers action; action.ProcessRequest(&context); const auto r = queue.GetMessages(10, 20000, true); for (const auto& m : r) { User u; ASSERT_TRUE(u.ParseFromString(m.args())); GOOGLE_LOG(INFO) << u.DebugString(); } } } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_actions/find.cc000066400000000000000000000130421273104013200225430ustar00rootroot00000000000000#include "grr/client/minicomm/client_actions/find.h" #include "grr/client/minicomm/paths.h" #include "boost/regex.hpp" namespace grr { namespace actions { namespace { std::vector> MakeStatFilters( const FindSpec& req) { std::vector> r; if (req.has_min_file_size()) { r.emplace_back([&req](const StatEntry& stats) { return stats.has_st_size() && req.min_file_size() > stats.st_size(); }); } if (req.has_max_file_size()) { r.emplace_back([&req](const StatEntry& stats) { return stats.has_st_size() && req.max_file_size() < stats.st_size(); }); } if (req.has_perm_mode()) { r.emplace_back([&req](const StatEntry& stats) { return stats.has_st_mode() && (req.perm_mask() & stats.st_mode() != req.perm_mode()); }); } if (req.has_uid()) { r.emplace_back([&req](const StatEntry& stats) { return stats.has_st_uid() && req.uid() != stats.st_uid(); }); } if (req.has_gid()) { r.emplace_back([&req](const StatEntry& stats) { return stats.has_st_gid() && req.gid() != stats.st_gid(); }); } return r; } } // namespace void Find::ProcessRequest(ActionContext* context) { FindSpec req; if (!context->PopulateArgs(&req)) { return; } if (req.max_depth() == 0) { context->SetError("Max depth of 0."); return; } if (req.has_path_glob() && !req.has_path_regex()) { context->SetError("Path glob not supported."); return; } std::string error; auto base = Paths::NormalizeAndOpen(req.mutable_pathspec(), &error); if (base == nullptr) { context->SetError(error); return; } if (!base->is_directory()) { context->SetError("Find pathspec is not a directory:[" + base->Path() + "]"); return; } FilterSet filters; std::unique_ptr path_pattern; if (req.has_path_regex()) { path_pattern.reset(new boost::regex(req.path_regex(), boost::regex_constants::ECMAScript | boost::regex_constants::no_except)); if (path_pattern->status()) { context->SetError("Unable to parse regex [" + req.path_regex() + "]"); return; } filters.name.emplace_back([&path_pattern](const std::string& name) { return !boost::regex_match(name, *path_pattern); }); } filters.stat = MakeStatFilters(req); std::unique_ptr data_pattern; if (req.has_data_regex()) { data_pattern.reset(new boost::regex(req.data_regex(), boost::regex_constants::ECMAScript | boost::regex_constants::no_except)); if (data_pattern->status()) { context->SetError("Unable to parse regex [" + req.data_regex() + "]"); return; } filters.contents.emplace_back([&data_pattern](FileContents* contents) { typedef boost::regex_iterator re_iter; return re_iter(contents->begin(), contents->end(), *data_pattern) != re_iter(); }); } ProcessRecursive(filters, std::move(base), req.max_depth(), req.cross_devs(), context); Iterator terminator = req.iterator(); terminator.set_state(Iterator::FINISHED); context->SendResponse(terminator, GrrMessage::ITERATOR); } typedef std::function FileFilter; bool Find::ProcessRecursive(const FilterSet& filters, std::unique_ptr path, int remaining_depth, bool cross_devices, ActionContext* context) { if (remaining_depth == 0) { context->SetError("Internal error: reached depth 0"); return false; } if (path == nullptr || !path->is_directory()) { context->SetError( "Internal error: recursive path not open or not directory."); return false; } const StatEntry base_stats = path->Stats(); const std::string base_path = path->Path(); OpenedPath::Directory dir; std::string error; if (!OpenedPath::ReadDirectory(std::move(path), &dir, &error)) { context->SetError(error); return false; } for (const auto& d : dir) { if (d.first == "." || d.first == "..") { continue; } bool filtered = false; for (const auto& f : filters.name) { if (f(d.first)) { filtered = true; break; } } auto child_path = OpenedPath::Open(base_path + "/" + d.first, &error); if (child_path == nullptr) { continue; } const StatEntry child_stats = child_path->Stats(); for (const auto& f : filters.stat) { if (!filtered && f(child_stats)) { filtered = true; break; } } if (!filtered && filters.contents.size()) { FileContents contents(child_path.get()); for (const auto& f : filters.contents) { if (f(&contents)) { filtered = true; break; } } } if (!filtered) { FindSpec res; *res.mutable_hit() = child_stats; res.mutable_hit()->mutable_pathspec()->set_path(child_path->Path()); res.mutable_hit()->mutable_pathspec()->set_pathtype(PathSpec::OS); context->SendResponse(res, GrrMessage::MESSAGE); } if (remaining_depth > 2 && child_path->is_directory() && (cross_devices || (child_stats.st_dev() == base_stats.st_dev()))) { ProcessRecursive(filters, std::move(child_path), remaining_depth - 1, cross_devices, context); } } } } // namespace actions } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_actions/find.h000066400000000000000000000034531273104013200224120ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_FIND_H_ #define GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_FIND_H_ #include #include #include "grr/client/minicomm/client_action.h" #include "grr/client/minicomm/file_contents.h" #include "grr/client/minicomm/file_operations.h" namespace grr { namespace actions { class Find : public ClientAction { public: Find() {} void ProcessRequest(ActionContext* context) override; private: // Each filter takes some information about a file and returns true if the // file should be filtered. typedef std::function NameFilter; typedef std::function StatFilter; typedef std::function ContentsFilter; // A full set of filters. struct FilterSet { std::vector name; std::vector stat; std::vector contents; }; // Recurse through the directory tree beginning at path, sending a FindSpec // back to the server for each file or directory which is not // filtered. Returns true on success. In case of error, sets an error message // in context and returns false. // // remaining_depth: How deep to recurse, remaining_depth=1 indicates to check // the direct contents of path, remaining_depths=2 indicates // to check the direct contents of path, and the direct // contents of any subdirectories within path. // cross_devices: Whether to cross device boundaries while recursing. bool ProcessRecursive(const FilterSet& filters, std::unique_ptr path, int remaining_depth, bool cross_devices, ActionContext* context); }; } // namespace actions } // namespace grr #endif // GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_FIND_H_ grr-3.1.0.2/grr/client/minicomm/client_actions/find_test.cc000066400000000000000000000047111273104013200236050ustar00rootroot00000000000000#include "grr/client/minicomm/client_actions/find.h" #include #include #include "gtest/gtest.h" #include "grr/client/minicomm/test_util.h" #include "grr/client/minicomm/util.h" namespace grr { namespace { void WriteFile(const std::string& file_name) { std::ofstream file; file.open(file_name); file << "foo"; file.close(); } // This is the regex that the server sends to match the glob "*.conf". const char kConfRegex[] = "(?i)^.*\\.conf\\Z(?ms)$"; } // namespace TEST(Find, RegexMatching) { const std::string temp_dir = testing::MakeTempDir(); WriteFile(temp_dir + "/fox.txt"); WriteFile(temp_dir + "/host.conf"); WriteFile(temp_dir + "/pam.conf"); WriteFile(temp_dir + "/hosts"); FindSpec spec; spec.mutable_pathspec()->set_path(temp_dir); spec.mutable_pathspec()->set_pathtype(PathSpec::OS); spec.set_path_regex(kConfRegex); GrrMessage message; message.set_args(spec.SerializeAsString()); message.set_args_rdf_name("FindSpec"); MessageQueue queue(5, 20000); ActionContext context(message, &queue, nullptr); actions::Find action; action.ProcessRequest(&context); const auto results = queue.GetMessages(5, 20000, false); EXPECT_EQ(3, results.size()); std::set found; for (const auto& result : results) { if (result.type() == GrrMessage::MESSAGE) { FindSpec res_spec; ASSERT_TRUE(res_spec.ParseFromString(result.args())); found.insert(res_spec.hit().pathspec().path()); } } EXPECT_EQ(found.count(temp_dir + "/host.conf"), 1); EXPECT_EQ(found.count(temp_dir + "/pam.conf"), 1); } TEST(Find, RegexDeepMatching) { const std::string temp_dir = testing::MakeTempDir(); std::string sub_dir = temp_dir; for (int i = 0; i < 10; i++) { WriteFile(sub_dir + "/host.conf"); sub_dir += "/sub_dir"; ASSERT_EQ(mkdir(sub_dir.c_str(), S_IRWXU), 0); } FindSpec spec; spec.mutable_pathspec()->set_path(temp_dir); spec.mutable_pathspec()->set_pathtype(PathSpec::OS); spec.set_path_regex(kConfRegex); spec.set_max_depth(5); GrrMessage message; message.set_args(spec.SerializeAsString()); message.set_args_rdf_name("FindSpec"); MessageQueue queue(20, 20000); ActionContext context(message, &queue, nullptr); actions::Find action; action.ProcessRequest(&context); const auto results = queue.GetMessages(20, 20000, false); // Expect 4 hits, from depths 1-5, plus the terminating iterator. EXPECT_EQ(5, results.size()); } } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_actions/fingerprint_file.cc000066400000000000000000000026161273104013200251560ustar00rootroot00000000000000#include "grr/client/minicomm/client_actions/fingerprint_file.h" #include "grr/client/minicomm/crypto.h" #include "grr/client/minicomm/paths.h" namespace grr { namespace actions { void FingerprintFile::ProcessRequest(ActionContext* context) { FingerprintRequest req; if (!context->PopulateArgs(&req)) { return; } std::string error; auto f = Paths::NormalizeAndOpen(req.mutable_pathspec(), &error); if (f == nullptr) { context->SetError(error); return; } Digest md5(Digest::Type::MD5); Digest sha1(Digest::Type::SHA1); Digest sha256(Digest::Type::SHA256); const size_t max_size = req.max_filesize(); size_t total_bytes_read = 0; size_t bytes_read = (size_t)-1; char buffer[64 * 1024]; while (bytes_read != 0 && total_bytes_read < max_size) { if (!f->Read(buffer, max_size - total_bytes_read, &bytes_read, &error)) { context->SetError(error); return; } md5.Update(buffer, bytes_read); sha1.Update(buffer, bytes_read); sha256.Update(buffer, bytes_read); total_bytes_read += bytes_read; } FingerprintResponse res; *res.mutable_pathspec() = req.pathspec(); res.set_bytes_read(total_bytes_read); res.mutable_hash()->set_md5(md5.Final()); res.mutable_hash()->set_sha1(sha1.Final()); res.mutable_hash()->set_sha256(sha256.Final()); context->SendResponse(res, GrrMessage::MESSAGE); } } // namespace actions } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_actions/fingerprint_file.h000066400000000000000000000007111273104013200250120ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_FINGERPRINT_FILE_H_ #define GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_FINGERPRINT_FILE_H_ #include "grr/client/minicomm/client_action.h" namespace grr { namespace actions { class FingerprintFile : public ClientAction { public: FingerprintFile() {} void ProcessRequest(ActionContext* args) override; }; } // namespace actions } // namespace grr #endif // GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_FINGERPRINT_FILE_H_ grr-3.1.0.2/grr/client/minicomm/client_actions/fingerprint_file_test.cc000066400000000000000000000043711273104013200262150ustar00rootroot00000000000000#include "grr/client/minicomm/client_actions/fingerprint_file.h" #include #include "gtest/gtest.h" #include "grr/client/minicomm/test_util.h" #include "grr/client/minicomm/util.h" namespace grr { TEST(FingerprintFile, FingerprintNormal) { MessageQueue queue(5, 20000); actions::FingerprintFile action; const std::string temp_dir = testing::MakeTempDir(); const std::string file_name = temp_dir + "/text"; const char kSentance[] = "The quick brown fox jumped over the lazy dogs.\n"; std::ofstream file; file.open(file_name); file << kSentance; file << '\0'; file << kSentance; file.close(); FingerprintRequest req; req.mutable_pathspec()->set_pathtype(PathSpec::OS); req.mutable_pathspec()->set_path(file_name); { // Hash the whole file. GrrMessage message; message.set_args(req.SerializeAsString()); message.set_args_rdf_name("FingerprintRequest"); ActionContext context(message, &queue, nullptr); action.ProcessRequest(&context); const auto r = queue.GetMessages(5, 20000, true); ASSERT_EQ(r.size(), 1); FingerprintResponse res; ASSERT_TRUE(res.ParseFromString(r[0].args())); EXPECT_EQ(BytesToHex(res.hash().md5()), "8867b7f850558298085205d03b823d1f"); EXPECT_EQ(BytesToHex(res.hash().sha1()), "72022185a5d49398619aff380c50989e9946c7b9"); EXPECT_EQ( BytesToHex(res.hash().sha256()), "2d3f76350c1db96e23e90d5ea05e6d1c3a78cf3c2a370e67da7d8d8f85cb57c6"); } { // Hash the first sentance only. GrrMessage message; req.set_max_filesize(sizeof(kSentance) - 1); message.set_args(req.SerializeAsString()); message.set_args_rdf_name("FingerprintRequest"); ActionContext context(message, &queue, nullptr); action.ProcessRequest(&context); const auto r = queue.GetMessages(5, 20000, true); ASSERT_EQ(r.size(), 1); FingerprintResponse res; ASSERT_TRUE(res.ParseFromString(r[0].args())); EXPECT_EQ(BytesToHex(res.hash().md5()), "b261610902182c0581c791ac874f588c"); EXPECT_EQ(BytesToHex(res.hash().sha1()), "87344ca7264d0f3e1d4e1350aeb71ffb597af8e2"); EXPECT_EQ( BytesToHex(res.hash().sha256()), "4ef5816c41c74bcf9528330db5fe259c1fadec92c5318d18f8bb223a308f97e3"); } } } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_actions/get_client_info.cc000066400000000000000000000010761273104013200247570ustar00rootroot00000000000000#include "grr/client/minicomm/client_actions/get_client_info.h" #include "grr/proto/jobs.pb.h" #include "grr/client/minicomm/client_info.h" namespace grr { namespace actions { void GetClientInfo::ProcessRequest(ActionContext* context) { ClientInformation res; res.set_client_name(client_info::kName); res.set_client_description(client_info::kDescription); res.set_build_time(std::string(client_info::kBuildDate) + " " + client_info::kBuildTime); context->SendResponse(res, GrrMessage::MESSAGE); } } // namespace actions } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_actions/get_client_info.h000066400000000000000000000006541273104013200246220ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_GET_CLIENT_INFO_H_ #define GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_GET_CLIENT_INFO_H_ #include "grr/client/minicomm/client_action.h" namespace grr { namespace actions { class GetClientInfo : public ClientAction { public: void ProcessRequest(ActionContext* args) override; }; } // namespace actions } // namespace grr #endif // GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_GET_CLIENT_INFO_H_ grr-3.1.0.2/grr/client/minicomm/client_actions/get_configuration.cc000066400000000000000000000004661273104013200253370ustar00rootroot00000000000000#include "grr/client/minicomm/client_actions/get_configuration.h" #include "grr/proto/jobs.pb.h" namespace grr { namespace actions { void GetConfiguration::ProcessRequest(ActionContext* context) { Dict res; context->SendResponse(res, GrrMessage::MESSAGE); } } // namespace actions } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_actions/get_configuration.h000066400000000000000000000006651273104013200252020ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_GET_CONFIGURATION_H_ #define GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_GET_CONFIGURATION_H_ #include "grr/client/minicomm/client_action.h" namespace grr { namespace actions { class GetConfiguration : public ClientAction { public: void ProcessRequest(ActionContext* args) override; }; } // namespace actions } // namespace grr #endif // GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_GET_CONFIGURATION_H_ grr-3.1.0.2/grr/client/minicomm/client_actions/get_install_date.cc000066400000000000000000000012101273104013200251170ustar00rootroot00000000000000#include "grr/client/minicomm/client_actions/get_install_date.h" #include "grr/client/minicomm/file_operations.h" namespace grr { namespace actions { void GetInstallDate::ProcessRequest(ActionContext* context) { std::string error; auto result = OpenedPath::Open("/lost+found", &error); if (result == nullptr) { context->SetError(error); GOOGLE_LOG(ERROR) << "Unable to open lost+found: " << error; return; } DataBlob res; res.set_integer(result->Stats().st_ctime()); GOOGLE_LOG(INFO) << "Returning: " << res.DebugString(); context->SendResponse(res, GrrMessage::MESSAGE); } } // namespace actions } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_actions/get_install_date.h000066400000000000000000000006601273104013200247710ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_GET_INSTALL_DATE_H_ #define GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_GET_INSTALL_DATE_H_ #include "grr/client/minicomm/client_action.h" namespace grr { namespace actions { class GetInstallDate : public ClientAction { public: void ProcessRequest(ActionContext* args) override; }; } // namespace actions } // namespace grr #endif // GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_GET_INSTALL_DATE_H_ grr-3.1.0.2/grr/client/minicomm/client_actions/get_library_versions.cc000066400000000000000000000015031273104013200260550ustar00rootroot00000000000000#include "grr/client/minicomm/client_actions/get_library_versions.h" #include "curl/curl.h" #include "openssl/crypto.h" #include "grr/proto/jobs.pb.h" #include "google/protobuf/stubs/common.h" namespace grr { namespace actions { namespace { void AddKeyValue(const std::string& key, const std::string& value, Dict* dict) { KeyValue* kv = dict->add_dat(); kv->mutable_k()->set_string(key); kv->mutable_v()->set_string(value); } } void GetLibraryVersions::ProcessRequest(ActionContext* context) { Dict res; AddKeyValue("openssl", SSLeay_version(SSLEAY_VERSION), &res); AddKeyValue("curl", curl_version(), &res); AddKeyValue( "protobuf", google::protobuf::internal::VersionString(GOOGLE_PROTOBUF_VERSION), &res); context->SendResponse(res, GrrMessage::MESSAGE); } } // namespace actions } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_actions/get_library_versions.h000066400000000000000000000007001273104013200257150ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_GET_LIBRARY_VERSIONS_H_ #define GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_GET_LIBRARY_VERSIONS_H_ #include "grr/client/minicomm/client_action.h" namespace grr { namespace actions { class GetLibraryVersions : public ClientAction { public: void ProcessRequest(ActionContext* args) override; }; } // namespace actions } // namespace grr #endif // GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_GET_LIBRARY_VERSIONS_H_ grr-3.1.0.2/grr/client/minicomm/client_actions/get_platform_info.cc000066400000000000000000000020231273104013200253160ustar00rootroot00000000000000#include "grr/client/minicomm/client_actions/get_platform_info.h" #include #include #include #include #include #include #include "grr/client/minicomm/util.h" namespace grr { namespace actions { void GetPlatformInfo::ProcessRequest(ActionContext* context) { // Get what we can from uname. struct utsname result; if (uname(&result)) { context->SetError("Uname failed with errno: " + ErrorName(errno)); return; } Uname response; response.set_system(ArrayToString(result.sysname)); response.set_node(ArrayToString(result.nodename)); response.set_kernel(ArrayToString(result.release)); response.set_version(ArrayToString(result.version)); response.set_machine(ArrayToString(result.machine)); if (response.node().find(".") != std::string::npos) { response.set_fqdn(response.node()); } // TODO(user): Add distribution detection. context->SendResponse(response, GrrMessage::MESSAGE); } } // namespace actions } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_actions/get_platform_info.h000066400000000000000000000006641273104013200251710ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_GET_PLATFORM_INFO_H_ #define GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_GET_PLATFORM_INFO_H_ #include "grr/client/minicomm/client_action.h" namespace grr { namespace actions { class GetPlatformInfo : public ClientAction { public: void ProcessRequest(ActionContext* args) override; }; } // namespace actions } // namespace grr #endif // GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_GET_PLATFORM_INFO_H_ grr-3.1.0.2/grr/client/minicomm/client_actions/get_platform_info_test.cc000066400000000000000000000015361273104013200263650ustar00rootroot00000000000000#include "grr/client/minicomm/client_actions/get_platform_info.h" #include "gtest/gtest.h" #include "grr/client/minicomm/client_action.h" #include "grr/client/minicomm/message_queue.h" #include "grr/proto/jobs.pb.h" namespace grr { TEST(GetPlatformInfoTest, SimpleTest) { GrrMessage message; MessageQueue queue(5, 20000); ActionContext context(message, &queue, nullptr); actions::GetPlatformInfo action; action.ProcessRequest(&context); const auto r = queue.GetMessages(5, 20000, true); ASSERT_EQ(1, r.size()); EXPECT_EQ("Uname", r[0].args_rdf_name()); Uname response; ASSERT_TRUE(response.ParseFromString(r[0].args())); // Most of the fields with vary with the machine running the test, but // since this is currently just a Linux client, we can at least check that. EXPECT_EQ(response.system(), "Linux"); } } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_actions/grep.cc000066400000000000000000000074711273104013200225710ustar00rootroot00000000000000#include "grr/client/minicomm/client_actions/grep.h" #include #include "grr/client/minicomm/file_contents.h" #include "grr/client/minicomm/paths.h" #include "boost/regex.hpp" namespace grr { namespace actions { void Grep::ProcessRequest(ActionContext* context) { GrepSpec req; if (!context->PopulateArgs(&req)) { return; } std::string error; auto result = Paths::NormalizeAndOpen(req.mutable_target(), &error); if (result == nullptr) { context->SetError(error); return; } if (result->size() == 0) { return; } // Try to be careful to avoid overflows. const uint64 start_idx = std::min(req.start_offset(), result->size()); const uint64 end_idx = start_idx + std::min(result->size() - start_idx, req.length()); if (start_idx == end_idx) { context->SetError( "Attempt to grep empty interval. Start offset too large?"); return; } FileContents contents(result.get()); const FileContentsIterator start_pos(start_idx, &contents); const FileContentsIterator end_pos(end_idx, &contents); std::vector matches; if (req.has_literal()) { matches = SearchLiteral(req.literal(), start_pos, end_pos, req.mode() == GrepSpec::ALL_HITS); } else { error = ""; matches = SearchRegex(req.regex(), start_pos, end_pos, req.mode() == GrepSpec::ALL_HITS, &error); if (!error.empty()) { context->SetError(error); return; } } for (Match m : matches) { BufferReference res; *res.mutable_pathspec() = req.target(); // Start and end expanded to include any needed extra bytes. const auto expanded_match_start = m.match_start - std::min(static_cast(m.match_start.FileOffset()), static_cast(req.bytes_before())); const auto expanded_match_end = m.match_end + std::min(static_cast(req.bytes_after()), static_cast(result->size() - m.match_end.FileOffset())); res.set_offset(expanded_match_start.FileOffset()); res.set_length(expanded_match_end.FileOffset() - expanded_match_start.FileOffset()); res.set_data(std::string(expanded_match_start, expanded_match_end)); context->SendResponse(res, GrrMessage::MESSAGE); } } std::vector Grep::SearchLiteral(const std::string& literal, FileContentsIterator start_pos, FileContentsIterator end_pos, bool all_hits) { std::vector res; while (end_pos != (start_pos = std::search(start_pos, end_pos, literal.begin(), literal.end()))) { res.emplace_back(Match{start_pos, start_pos + literal.size()}); if (!all_hits) { return res; } start_pos += literal.size(); } return res; } std::vector Grep::SearchRegex(const std::string& regex, FileContentsIterator start_pos, FileContentsIterator end_pos, bool all_hits, std::string* error) { std::vector res; boost::regex pattern(regex, (boost::regex_constants::ECMAScript | boost::regex_constants::no_except)); if (pattern.status()) { *error = "Unable to parse regex [" + regex + "]"; return res; } typedef boost::regex_iterator re_iter; for (auto i = re_iter(start_pos, end_pos, pattern); i != re_iter(); ++i) { auto& m = *i; res.emplace_back(Match{m[0].first, m[0].second}); if (!all_hits) { return res; } } return res; } } // namespace actions } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_actions/grep.h000066400000000000000000000020431273104013200224210ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_GREP_H_ #define GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_GREP_H_ #include #include "grr/client/minicomm/client_action.h" #include "grr/client/minicomm/file_contents.h" namespace grr { namespace actions { class Grep : public ClientAction { public: Grep() {} void ProcessRequest(ActionContext* args) override; private: struct Match { FileContentsIterator match_start; FileContentsIterator match_end; }; std::vector SearchLiteral(const std::string& literal, FileContentsIterator begin, FileContentsIterator end, bool all_hits); std::vector SearchRegex(const std::string& regex, FileContentsIterator begin, FileContentsIterator end, bool all_hits, std::string* error); }; } // namespace actions } // namespace grr #endif // GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_GREP_H_ grr-3.1.0.2/grr/client/minicomm/client_actions/grep_test.cc000066400000000000000000000201311273104013200236140ustar00rootroot00000000000000#include "grr/client/minicomm/client_actions/grep.h" #include #include "gtest/gtest.h" #include "grr/client/minicomm/test_util.h" namespace grr { namespace actions { TEST(GrepTest, SimpleLiteralSearch) { const std::string temp_dir = testing::MakeTempDir(); const std::string file_name = temp_dir + "/fox.txt"; std::ofstream file; file.open(file_name); file << R"(The quick sly fox jumped over the lazy dogs.)"; file.close(); GrepSpec spec; spec.mutable_target()->set_path(file_name); spec.mutable_target()->set_pathtype(PathSpec::OS); spec.set_bytes_before(0); spec.set_bytes_after(0); spec.set_literal("fox"); GrrMessage message; message.set_args(spec.SerializeAsString()); message.set_args_rdf_name("GrepSpec"); MessageQueue queue(5, 20000); ActionContext context(message, &queue, nullptr); Grep action; action.ProcessRequest(&context); const auto r = queue.GetMessages(5, 20000, false); ASSERT_EQ(1, r.size()); EXPECT_EQ("BufferReference", r[0].args_rdf_name()); BufferReference res; ASSERT_TRUE(res.ParseFromString(r[0].args())); EXPECT_EQ(14, res.offset()); EXPECT_EQ(3, res.length()); } TEST(GrepTest, MultipleHitLiteralSearch) { const std::string temp_dir = testing::MakeTempDir(); const std::string file_name = temp_dir + "/fox.txt"; static const char kSentance[] = "The quick sly fox jumped over the lazy dogs. "; std::ofstream file; file.open(file_name); for (int i = 0; i < 5; i++) { file << kSentance; } file.close(); GrepSpec spec; spec.mutable_target()->set_path(file_name); spec.mutable_target()->set_pathtype(PathSpec::OS); spec.set_bytes_before(0); spec.set_bytes_after(0); spec.set_literal("fox"); GrrMessage message; message.set_args(spec.SerializeAsString()); message.set_args_rdf_name("GrepSpec"); MessageQueue queue(5, 20000); ActionContext context(message, &queue, nullptr); Grep action; action.ProcessRequest(&context); const auto r = queue.GetMessages(5, 20000, false); ASSERT_EQ(5, r.size()); EXPECT_EQ("BufferReference", r[0].args_rdf_name()); BufferReference res; ASSERT_TRUE(res.ParseFromString(r[0].args())); EXPECT_EQ(14, res.offset()); EXPECT_EQ(3, res.length()); ASSERT_TRUE(res.ParseFromString(r[1].args())); EXPECT_EQ(14 + (sizeof(kSentance) - 1), res.offset()); EXPECT_EQ(3, res.length()); ASSERT_TRUE(res.ParseFromString(r[4].args())); EXPECT_EQ(14 + 4 * (sizeof(kSentance) - 1), res.offset()); EXPECT_EQ(3, res.length()); } TEST(GrepTest, FirstHitLiteralSearch) { const std::string temp_dir = testing::MakeTempDir(); const std::string file_name = temp_dir + "/fox.txt"; static const char kSentance[] = "The quick sly fox jumped over the lazy dogs. "; std::ofstream file; file.open(file_name); for (int i = 0; i < 5; i++) { file << kSentance; } file.close(); GrepSpec spec; spec.mutable_target()->set_path(file_name); spec.mutable_target()->set_pathtype(PathSpec::OS); spec.set_bytes_before(0); spec.set_bytes_after(0); spec.set_mode(GrepSpec::FIRST_HIT); spec.set_literal("fox"); GrrMessage message; message.set_args(spec.SerializeAsString()); message.set_args_rdf_name("GrepSpec"); MessageQueue queue(5, 20000); ActionContext context(message, &queue, nullptr); Grep action; action.ProcessRequest(&context); const auto r = queue.GetMessages(5, 20000, false); ASSERT_EQ(1, r.size()); EXPECT_EQ("BufferReference", r[0].args_rdf_name()); BufferReference res; ASSERT_TRUE(res.ParseFromString(r[0].args())); EXPECT_EQ(14, res.offset()); EXPECT_EQ(3, res.length()); } TEST(GrepTest, BytesBeforeLiteralSearch) { const std::string temp_dir = testing::MakeTempDir(); const std::string file_name = temp_dir + "/fox.txt"; static const char kSentance[] = "The quick sly fox jumped over the lazy dogs. "; std::ofstream file; file.open(file_name); for (int i = 0; i < 5; i++) { file << kSentance; } file.close(); GrepSpec spec; spec.mutable_target()->set_path(file_name); spec.mutable_target()->set_pathtype(PathSpec::OS); spec.set_bytes_before(20); spec.set_bytes_after(0); spec.set_literal("fox"); GrrMessage message; message.set_args(spec.SerializeAsString()); message.set_args_rdf_name("GrepSpec"); MessageQueue queue(5, 20000); ActionContext context(message, &queue, nullptr); Grep action; action.ProcessRequest(&context); const auto r = queue.GetMessages(5, 20000, false); ASSERT_EQ(5, r.size()); EXPECT_EQ("BufferReference", r[0].args_rdf_name()); BufferReference res; ASSERT_TRUE(res.ParseFromString(r[0].args())); // Offset should be bounded at 0. EXPECT_EQ(0, res.offset()); EXPECT_EQ(17, res.length()); ASSERT_TRUE(res.ParseFromString(r[1].args())); EXPECT_EQ(14 + (sizeof(kSentance) - 1) - 20, res.offset()); EXPECT_EQ(23, res.length()); ASSERT_TRUE(res.ParseFromString(r[4].args())); EXPECT_EQ(14 + 4 * (sizeof(kSentance) - 1) - 20, res.offset()); EXPECT_EQ(23, res.length()); } TEST(GrepTest, BytesAfterLiteralSearch) { const std::string temp_dir = testing::MakeTempDir(); const std::string file_name = temp_dir + "/fox.txt"; static const char kSentance[] = "The quick sly fox jumped over the lazy dogs. "; std::ofstream file; file.open(file_name); for (int i = 0; i < 5; i++) { file << kSentance; } file.close(); GrepSpec spec; spec.mutable_target()->set_path(file_name); spec.mutable_target()->set_pathtype(PathSpec::OS); spec.set_bytes_before(0); spec.set_bytes_after(10); spec.set_literal("dogs"); GrrMessage message; message.set_args(spec.SerializeAsString()); message.set_args_rdf_name("GrepSpec"); MessageQueue queue(5, 20000); ActionContext context(message, &queue, nullptr); Grep action; action.ProcessRequest(&context); const auto r = queue.GetMessages(5, 20000, false); ASSERT_EQ(5, r.size()); EXPECT_EQ("BufferReference", r[0].args_rdf_name()); BufferReference res; ASSERT_TRUE(res.ParseFromString(r[0].args())); EXPECT_EQ(39, res.offset()); EXPECT_EQ(14, res.length()); ASSERT_TRUE(res.ParseFromString(r[4].args())); EXPECT_EQ(39 + 4 * (sizeof(kSentance) - 1), res.offset()); // The file ends 6 characters after the start of the last occurence of dogs. EXPECT_EQ(6, res.length()); } TEST(GrepTest, SimpleRegexSearch) { const std::string temp_dir = testing::MakeTempDir(); const std::string file_name = temp_dir + "/fox.txt"; std::ofstream file; file.open(file_name); file << R"(The quick sly fox jumped over the lazy dogs.)"; file.close(); GrepSpec spec; spec.mutable_target()->set_path(file_name); spec.mutable_target()->set_pathtype(PathSpec::OS); spec.set_bytes_before(0); spec.set_bytes_after(0); spec.set_regex("fox"); GrrMessage message; message.set_args(spec.SerializeAsString()); message.set_args_rdf_name("GrepSpec"); MessageQueue queue(5, 20000); ActionContext context(message, &queue, nullptr); Grep action; action.ProcessRequest(&context); const auto r = queue.GetMessages(5, 20000, false); ASSERT_EQ(1, r.size()); EXPECT_EQ("BufferReference", r[0].args_rdf_name()); BufferReference res; ASSERT_TRUE(res.ParseFromString(r[0].args())); EXPECT_EQ(14, res.offset()); EXPECT_EQ(3, res.length()); } TEST(GrepTest, BrokenRegexSearch) { const std::string temp_dir = testing::MakeTempDir(); const std::string file_name = temp_dir + "/fox.txt"; std::ofstream file; file.open(file_name); file << R"(The quick sly fox jumped over the lazy dogs.)"; file.close(); GrepSpec spec; spec.mutable_target()->set_path(file_name); spec.mutable_target()->set_pathtype(PathSpec::OS); spec.set_bytes_before(0); spec.set_bytes_after(0); spec.set_regex("fo[x(])"); GrrMessage message; message.set_args(spec.SerializeAsString()); message.set_args_rdf_name("GrepSpec"); MessageQueue queue(5, 20000); ActionContext context(message, &queue, nullptr); Grep action; action.ProcessRequest(&context); const auto r = queue.GetMessages(5, 20000, false); EXPECT_EQ(0, r.size()); EXPECT_EQ(GrrStatus::GENERIC_ERROR, context.Status().status()); GOOGLE_LOG(INFO) << context.Status().DebugString(); } } // namespace actions } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_actions/list_directory.cc000066400000000000000000000025441273104013200246670ustar00rootroot00000000000000#include "grr/client/minicomm/client_actions/list_directory.h" #include "grr/client/minicomm/file_operations.h" #include "grr/client/minicomm/paths.h" namespace grr { namespace actions { void ListDirectory::ProcessRequest(ActionContext* context) { ListDirRequest req; if (!context->PopulateArgs(&req)) { return; } std::string error; auto result = Paths::NormalizeAndOpen(req.mutable_pathspec(), &error); if (result == nullptr) { context->SetError(error); return; } StatEntry res = result->Stats(); *res.mutable_pathspec() = req.pathspec(); context->SendResponse(res, GrrMessage::MESSAGE); OpenedPath::Directory dir; std::string base_path = result->Path(); if (!OpenedPath::ReadDirectory(std::move(result), &dir, &error)) { context->SetError(error); return; } for (const auto& d : dir) { if (d.first == "." || d.first == "..") { continue; } auto child_path = OpenedPath::Open(base_path + "/" + d.first, &error); if (child_path == nullptr) { continue; } StatEntry res = child_path->Stats(); res.mutable_pathspec()->set_path(base_path + "/" + d.first); res.mutable_pathspec()->set_pathtype(PathSpec::OS); res.mutable_pathspec()->set_path_options(PathSpec::CASE_LITERAL); context->SendResponse(res, GrrMessage::MESSAGE); } } } // namespace actions } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_actions/list_directory.h000066400000000000000000000006771273104013200245360ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_LIST_DIRECTORY_H_ #define GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_LIST_DIRECTORY_H_ #include "grr/client/minicomm/client_action.h" namespace grr { namespace actions { class ListDirectory : public ClientAction { public: ListDirectory() {} void ProcessRequest(ActionContext* args) override; }; } // namespace actions } // namespace grr #endif // GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_LIST_DIRECTORY_H_ grr-3.1.0.2/grr/client/minicomm/client_actions/list_directory_test.cc000066400000000000000000000025731273104013200257300ustar00rootroot00000000000000#include "grr/client/minicomm/client_actions/list_directory.h" #include #include "gtest/gtest.h" #include "grr/client/minicomm/file_operations.h" #include "grr/client/minicomm/test_util.h" #include "grr/client/minicomm/util.h" namespace grr { namespace { void WriteFile(const std::string& file_name) { std::ofstream file; file.open(file_name); file << "foo"; file.close(); } } TEST(ListDirectory, SimpleTest) { const std::string temp_dir = testing::MakeTempDir(); const std::set inserted = { temp_dir + "/fox.txt", temp_dir + "/host.conf", temp_dir + "/pam.conf", temp_dir + "/host"}; for (auto& s : inserted) { WriteFile(s); } ListDirRequest spec; spec.mutable_pathspec()->set_path(temp_dir); spec.mutable_pathspec()->set_pathtype(PathSpec::OS); GrrMessage message; message.set_args(spec.SerializeAsString()); message.set_args_rdf_name("ListDirRequest"); MessageQueue queue(5, 20000); ActionContext context(message, &queue, nullptr); actions::ListDirectory action; action.ProcessRequest(&context); const auto r = queue.GetMessages(10, 20000, true); std::set check; for (const auto& m : r) { StatEntry u; ASSERT_TRUE(u.ParseFromString(m.args())); check.insert(u.mutable_pathspec()->path()); } ASSERT_EQ(check.erase(temp_dir), 1); ASSERT_EQ(check, inserted); } } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_actions/list_processes.cc000066400000000000000000000060041273104013200246640ustar00rootroot00000000000000#include "grr/client/minicomm/client_actions/list_processes.h" #include #include #include #include "grr/client/minicomm/file_operations.h" #include "grr/client/minicomm/paths.h" #include "grr/client/minicomm/util.h" namespace grr { namespace actions { void ListProcesses::ProcessRequest(ActionContext* context) { std::string error; auto result = OpenedPath::Open("/proc", &error); if (result == nullptr) { context->SetError(error); return; } OpenedPath::Directory dir; std::string base_path = result->Path(); if (!OpenedPath::ReadDirectory(std::move(result), &dir, &error)) { context->SetError(error); return; } for (const auto& d : dir) { if (d.first == "." || d.first == ".." || IsNumber(d.first) == false) { continue; } const std::string procDir = base_path + "/" + d.first; Process res; if (PopulateProcessInfo(procDir, &res, &error) == false) { // maybe some more information can be given back to the server? continue; } context->SendResponse(res, GrrMessage::MESSAGE); } } bool ListProcesses::PopulateProcessInfo(const std::string& procDir, Process* res, std::string* error) { std::ifstream file(procDir + "/status"); if (file.good() == true) { std::string line; while (std::getline(file, line)) { std::string field, data; const size_t pos = line.find(":"); if (pos == std::string::npos) { continue; } field = line.substr(0, pos); data = line.substr(pos + 1, std::string::npos); const size_t trim_pos = data.find_first_not_of(" \t"); if (trim_pos != std::string::npos) data = data.substr(trim_pos, std::string::npos); if (field == "Name") { res->set_name(data); } if (field == "Pid") { res->set_pid(strtol(data.c_str(), nullptr, 10)); } if (field == "PPid") { res->set_ppid(strtol(data.c_str(), nullptr, 10)); } if (field == "Threads") { res->set_num_threads(strtol(data.c_str(), nullptr, 10)); } } } else { *error = "Error while reading process status."; return false; } file.close(); file.open(procDir + "/cmdline"); if (file.good() == true) { std::string arg; while (file.eof() == false) { const char c = file.get(); if (c == 0) { if (arg.size() > 0) { res->add_cmdline(arg); arg.clear(); } } else { arg += c; } } } else { *error = "Error while opening cmdline."; return false; } const std::string exeLocation = procDir + "/exe"; const int size = 64 * 1024; static char buff[size]; size_t read; const ssize_t sz = readlink(exeLocation.c_str(), buff, size); if (sz == -1) { *error = "Error while reading process location."; return false; } else { buff[sz] = 0; // readlink does not return null-terminated strings res->set_exe(buff); } return true; } } // namespace actions } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_actions/list_processes.h000066400000000000000000000014161273104013200245300ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_LIST_PROCESSES_H_ #define GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_LIST_PROCESSES_H_ #include "grr/proto/sysinfo.pb.h" #include "gtest/gtest_prod.h" #include "grr/client/minicomm/client_action.h" #include "grr/client/minicomm/file_operations.h" #include "grr/client/minicomm/paths.h" namespace grr { namespace actions { class ListProcesses : public ClientAction { public: ListProcesses() {} void ProcessRequest(ActionContext* args) override; private: bool PopulateProcessInfo(const std::string& procDir, Process* res, std::string* error); FRIEND_TEST(ListProcessesTest, PopulateProcessInfo); }; } // namespace actions } // namespace grr #endif // GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_LIST_PROCESSES_H_ grr-3.1.0.2/grr/client/minicomm/client_actions/list_processes_test.cc000066400000000000000000000072131273104013200257260ustar00rootroot00000000000000#include "grr/client/minicomm/client_actions/list_processes.h" #include #include #include #include "gtest/gtest.h" #include "grr/client/minicomm/file_operations.h" #include "grr/client/minicomm/test_util.h" #include "grr/client/minicomm/util.h" namespace grr { namespace actions { namespace { void WriteFile(const std::string& file_name, const std::string& data) { std::ofstream file; file.open(file_name); ASSERT_TRUE(file.good()); file << data; file.close(); } void CreateProcessDir(const std::string& dir, const Process& proc) { const std::string name = proc.name(); const int pid = proc.pid(); const int ppid = proc.ppid(); const int threads = proc.num_threads(); const std::string path = dir + "/" + std::to_string(pid); ASSERT_EQ(mkdir(path.c_str(), 0700), 0); WriteFile(path + "/status", "Name: " + name + "\n" + "Pid: " + std::to_string(pid) + "\n" + "PPid: " + std::to_string(ppid) + "\n" + "Threads: " + std::to_string(threads)); WriteFile(path + "/cmdline", proc.cmdline(0) + '\0'); const std::string path_exe_real = proc.exe(); WriteFile(path_exe_real, "executable:data"); const std::string path_exe = path + "/exe"; ASSERT_EQ(symlink(path_exe_real.c_str(), path_exe.c_str()), 0); } } // namespace TEST(ListProcessesTest, ProcessRequest) { GrrMessage message; MessageQueue queue(1000, 20000); ActionContext context(message, &queue, nullptr); actions::ListProcesses action; action.ProcessRequest(&context); const auto r = queue.GetMessages(10, 20000, true); ASSERT_GT(r.size(), 0); for (const auto& m : r) { Process u; ASSERT_TRUE(u.ParseFromString(m.args())); GOOGLE_LOG(INFO) << u.DebugString(); } } TEST(ListProcessesTest, PopulateProcessInfo) { const std::string temp_dir = testing::MakeTempDir(); const int test_num = 10; const int test_int_parameters = 3; const int test_str_parameters = 3; Process proc[test_num]; Process response[test_num]; std::vector rand_integers; std::vector rand_strings; for (int i = 0; i < test_int_parameters * test_num; ++i) { rand_integers.push_back(i); } for (int i = 0; i < test_str_parameters * test_num; ++i) { const int len = 10; std::string str; for (int j = 0; j < len; ++j) { str += static_cast(rand() % 26 + 'a'); } rand_strings.push_back(str); } std::random_shuffle(rand_integers.begin(), rand_integers.end()); std::random_shuffle(rand_strings.begin(), rand_strings.end()); actions::ListProcesses action; Process tmp; std::string error; for (int i = 0; i < test_num; ++i) { proc[i].set_pid(rand_integers[i * test_int_parameters + 0]); proc[i].set_ppid(rand_integers[i * test_int_parameters + 1]); proc[i].set_num_threads(rand_integers[i * test_int_parameters + 2]); proc[i].set_name(rand_strings[i * test_str_parameters + 0]); // exe requires full path proc[i].set_exe(temp_dir + "/" + std::to_string(proc[i].pid()) + "/" + rand_strings[i * test_str_parameters + 1]); proc[i].add_cmdline(rand_strings[i * test_str_parameters + 2]); CreateProcessDir(temp_dir, proc[i]); action.PopulateProcessInfo(temp_dir + "/" + std::to_string(proc[i].pid()), response + i, &error); } std::set original, output; for (int i = 0; i < test_num; ++i) { original.insert(proc[i].SerializeAsString()); output.insert(response[i].SerializeAsString()); } ASSERT_GT(original.size(), 0); ASSERT_EQ(original, output); } } // namespace actions } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_actions/stat_file.cc000066400000000000000000000011431273104013200235740ustar00rootroot00000000000000#include "grr/client/minicomm/client_actions/stat_file.h" #include "grr/client/minicomm/paths.h" namespace grr { namespace actions { void StatFile::ProcessRequest(ActionContext* context) { ListDirRequest req; if (!context->PopulateArgs(&req)) { return; } std::string error; auto result = Paths::NormalizeAndOpen(req.mutable_pathspec(), &error); if (result == nullptr) { context->SetError(error); return; } StatEntry res = result->Stats(); *res.mutable_pathspec() = req.pathspec(); context->SendResponse(res, GrrMessage::MESSAGE); } } // namespace actions } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_actions/stat_file.h000066400000000000000000000006451273104013200234440ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_STAT_FILE_H_ #define GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_STAT_FILE_H_ #include "grr/client/minicomm/client_action.h" namespace grr { namespace actions { class StatFile : public ClientAction { public: StatFile() {} void ProcessRequest(ActionContext* args) override; }; } // namespace actions } // namespace grr #endif // GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_STAT_FILE_H_ grr-3.1.0.2/grr/client/minicomm/client_actions/transfer_buffer.cc000066400000000000000000000036221273104013200250030ustar00rootroot00000000000000#include "grr/client/minicomm/client_actions/transfer_buffer.h" #include "grr/client/minicomm/compression.h" #include "grr/client/minicomm/crypto.h" #include "grr/client/minicomm/paths.h" namespace grr { namespace actions { void TransferBuffer::ProcessRequest(ActionContext* context) { BufferReference req; if (!context->PopulateArgs(&req)) { return; } // Don't transfer if this is really a HashBuffer request. const bool transfer = context->Message().name() == "TransferBuffer"; std::string error; auto file = Paths::NormalizeAndOpen(req.mutable_pathspec(), &error); if (file == nullptr) { context->SetError(error); return; } if (req.offset() > 0) { if (!file->Seek(req.offset(), &error)) { context->SetError(error); return; } } Digest sha256(Digest::Type::SHA256); std::unique_ptr compressed(transfer ? new ZDeflate : nullptr); char buff[64 * 1024]; size_t bytes_remaining = req.length(); size_t bytes_read = (size_t)-1; while (bytes_read != 0 && bytes_remaining > 0) { if (!file->Read(buff, bytes_remaining, &bytes_read, &error)) { context->SetError(error); return; } sha256.Update(buff, bytes_read); if (transfer) { compressed->Update(buff, bytes_read); } bytes_remaining -= bytes_read; } if (transfer) { GrrMessage blob_message; { DataBlob blob; blob.set_compression(DataBlob::ZCOMPRESSION); *blob.mutable_data() = compressed->Final(); blob.SerializeToString(blob_message.mutable_args()); } blob_message.set_args_rdf_name("DataBlob"); blob_message.set_session_id("F:TransferStore"); context->SendMessage(blob_message); } BufferReference res; res.set_offset(req.offset()); res.set_length(req.length() - bytes_remaining); res.set_data(sha256.Final()); context->SendResponse(res, GrrMessage::MESSAGE); } } // namespace actions } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_actions/transfer_buffer.h000066400000000000000000000007031273104013200246420ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_TRANSFER_BUFFER_H_ #define GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_TRANSFER_BUFFER_H_ #include "grr/client/minicomm/client_action.h" namespace grr { namespace actions { class TransferBuffer : public ClientAction { public: TransferBuffer() {} void ProcessRequest(ActionContext* args) override; }; } // namespace actions } // namespace grr #endif // GRR_CLIENT_MINICOMM_CLIENT_ACTIONS_TRANSFER_BUFFER_H_ grr-3.1.0.2/grr/client/minicomm/client_actions/transfer_buffer_test.cc000066400000000000000000000054301273104013200260410ustar00rootroot00000000000000#include "grr/client/minicomm/client_actions/transfer_buffer.h" #include #include "gtest/gtest.h" #include "grr/client/minicomm/compression.h" #include "grr/client/minicomm/test_util.h" #include "grr/client/minicomm/util.h" namespace grr { TEST(TransferBuffer, SmallFile) { const std::string temp_dir = testing::MakeTempDir(); const std::string file_name = temp_dir + "/text"; const char kText[] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod " "tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim " "veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea " "commodo consequat. Duis aute irure dolor in reprehenderit in voluptate " "velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint " "occaecat cupidatat non proident, sunt in culpa qui officia deserunt " "mollit anim id est laborum. "; std::ofstream file; file.open(file_name); file << kText; file.close(); MessageQueue queue(5, 20000); actions::TransferBuffer action; BufferReference req; req.mutable_pathspec()->set_pathtype(PathSpec::OS); req.mutable_pathspec()->set_path(file_name); req.set_offset(0); req.set_length(sizeof(kText) - 1); { // Hash. GrrMessage message; message.set_args(req.SerializeAsString()); message.set_args_rdf_name("BufferReference"); message.set_name("HashBuffer"); ActionContext context(message, &queue, nullptr); action.ProcessRequest(&context); const auto r = queue.GetMessages(5, 20000, true); ASSERT_EQ(r.size(), 1); BufferReference res; ASSERT_TRUE(res.ParseFromString(r[0].args())); EXPECT_EQ(0, res.offset()); EXPECT_EQ(sizeof(kText) - 1, res.length()); EXPECT_EQ( "cca04536113e16feaa3fe109e5410ca96ce51661476e12bf501ada46619069c1", BytesToHex(res.data())); } { // Transfer. GrrMessage message; message.set_args(req.SerializeAsString()); message.set_args_rdf_name("BufferReference"); message.set_name("TransferBuffer"); ActionContext context(message, &queue, nullptr); action.ProcessRequest(&context); const auto r = queue.GetMessages(5, 20000, true); ASSERT_EQ(r.size(), 2); DataBlob blob; ASSERT_EQ("DataBlob", r[0].args_rdf_name()); ASSERT_TRUE(blob.ParseFromString(r[0].args())); EXPECT_EQ(DataBlob::ZCOMPRESSION, blob.compression()); EXPECT_EQ(kText, ZLib::Inflate(blob.data())); BufferReference res; ASSERT_EQ("BufferReference", r[1].args_rdf_name()); ASSERT_TRUE(res.ParseFromString(r[1].args())); EXPECT_EQ(0, res.offset()); EXPECT_EQ(sizeof(kText) - 1, res.length()); EXPECT_EQ( "cca04536113e16feaa3fe109e5410ca96ce51661476e12bf501ada46619069c1", BytesToHex(res.data())); } } } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_info.h000066400000000000000000000006271273104013200207650ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_CLIENT_INFO_H_ #define GRR_CLIENT_MINICOMM_CLIENT_INFO_H_ namespace grr { namespace client_info { constexpr char kName[] = "minicom-p-alpha"; constexpr char kDescription[] = "Minicom pre-alpha client."; constexpr char kBuildDate[] = __DATE__; constexpr char kBuildTime[] = __TIME__; } // namespace client_info } // namespace grr #endif // GRR_CLIENT_MINICOMM_CLIENT_INFO_H_ grr-3.1.0.2/grr/client/minicomm/client_main.cc000066400000000000000000000003641273104013200211120ustar00rootroot00000000000000 #include "grr/client/minicomm/client.h" int main(int argc, char* argv[]) { grr::Client::StaticInit(); if (argc != 2) { GOOGLE_LOG(FATAL) << "Usage is: client "; } grr::Client client(argv[1]); client.Run(); return 0; } grr-3.1.0.2/grr/client/minicomm/client_test_base.cc000066400000000000000000000155721273104013200221460ustar00rootroot00000000000000#include "grr/client/minicomm/client_test_base.h" #include #include #include "grr/client/minicomm/logging_control.h" #include "grr/client/minicomm/test_util.h" namespace grr { ClientTestBase::ClientTestBase() : tmp_dir_(testing::MakeTempDir()), config_filename_(tmp_dir_ + "/config"), writeback_filename_(tmp_dir_ + "/writeback"), config_(config_filename_) {} ClientTestBase::~ClientTestBase() {} void ClientTestBase::WriteConfigFile(const std::string& data) { std::ofstream file; file.open(config_filename_); file << data; file.close(); } void ClientTestBase::SetUpDefaultConfig() { WriteValidConfigFile(false, false); } void ClientTestBase::WriteValidConfigFile(bool include_private_key, bool use_writeback) { ClientConfiguration config_proto; config_proto.add_control_url("http://localhost:8001/control"); config_proto.set_ca_cert_pem(kCertPEM); config_proto.set_temporary_directory(tmp_dir_); if (include_private_key) { config_proto.set_client_private_key_pem(kPrivateRSAPEM); } if (use_writeback) { config_proto.set_writeback_filename(writeback_filename_); } WriteConfigFile(config_proto.DebugString()); } std::string ClientTestBase::ReadWritebackFile() { std::ifstream file; file.open(writeback_filename_); const std::string r((std::istreambuf_iterator(file)), std::istreambuf_iterator()); file.close(); return r; } const char ClientTestBase::kCertPEM[] = R"(-----BEGIN CERTIFICATE----- MIIGSzCCBDOgAwIBAgIJANuxiXoZSEeoMA0GCSqGSIb3DQEBBQUAMFYxCzAJBgNV BAYTAlVTMRQwEgYDVQQDEwtHUlIgVGVzdCBDQTExMC8GCSqGSIb3DQEJARYic2Vj dXJpdHktaW5jaWRlbnRzLXRlYW1AZ29vZ2xlLmNvbTAeFw0xMTAyMTcxMDEyMTNa Fw0yMTAyMTQxMDEyMTNaMFYxCzAJBgNVBAYTAlVTMRQwEgYDVQQDEwtHUlIgVGVz dCBDQTExMC8GCSqGSIb3DQEJARYic2VjdXJpdHktaW5jaWRlbnRzLXRlYW1AZ29v Z2xlLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFhTdYWwBp8 yU/+jn7ea6ZNPAJByiUxufBLKy8uKLB20VjMBdUmOp9Vo0MN4aoZSNvT1w5zNBmd 09OTG5+XX9FcxND18i5ZlT3ZaHqpUk3Yk7M5xPLQqG8ySwv0iq6j0hIqUe8P40u5 Jf7cLPK4x6bkuzAsHa1YHgCX30Vn/gVIqfn7b0JY0mObAe3OYVNlhwepFgD1LawP 3FdgXhSQDpBuXdE/A+pVwMN0BlGQF8aycWrNQzM0xCxQy2LP+gin6yJjNRYyBGNY pNd6942/zaOH04L6M+10E7w/AsAxrT5nr+dIHZnL+I1odN/ZosesGhsqGaqsXVkl pi5JIu+60Zf6aGXJX461rJloDQR1JGwFvVLGJjV4ug/TyQ3h5PIm3Ef4rZLIpu3s 0quwrIpKKxcH9INk2n3YP8GxV0+wyTTiU67mQarU31gKqEfgwCQTFvr8dZZoZbtC AJTZOGvlpju4w5X0mGwlsL44XKfIpDkexSRZsj6dZuGyfxRpbn71+Ti9jC7KlZBM wvX2Os3yVY/PLGz3VBPB45s2IrR3M33sB4DWtPrU/mWwVOpfX68hSae97qxqLPVN UO6jCayTtitRPK5Wx55MM3xgqspVOmqfX7EwGO40QIPLbwk5XGezXcxdfjdsB4iC YUYwy0Q1YmnnxT4LQIpyu8BpzS0WZIf9AgMBAAGjggEaMIIBFjAdBgNVHQ4EFgQU NH/EbH8MewdxaZzmD8+SEDBxAhIwgYYGA1UdIwR/MH2AFDR/xGx/DHsHcWmc5g/P khAwcQISoVqkWDBWMQswCQYDVQQGEwJVUzEUMBIGA1UEAxMLR1JSIFRlc3QgQ0Ex MTAvBgkqhkiG9w0BCQEWInNlY3VyaXR5LWluY2lkZW50cy10ZWFtQGdvb2dsZS5j b22CCQDbsYl6GUhHqDAPBgNVHRMBAf8EBTADAQH/MBEGCWCGSAGG+EIBAQQEAwIB BjAJBgNVHRIEAjAAMC0GA1UdEQQmMCSBInNlY3VyaXR5LWluY2lkZW50cy10ZWFt QGdvb2dsZS5jb20wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4ICAQBv aC5mlaYxaYa0A/mfnWl2jiRw2oOAPmSTiOeaD+ifT130VO4Z41Td/nw3UHaxvvxy g062EkVVpUNnbR3VdZKmeEcrL894vmWjDxSrX6a6ryxj/oio5JXetrGEz/073TOO eNgsbFu14qg4BQ/w2POvtT8trYdLsKVcAXvyIqLkbi9E86TsMFaR1x5QtlTwQu6H lSxVAXp+w9qmKC8mCt/075JB673YxWI0xvsltOmECCk24oWYWtuLNX++ky0MmIJe z/NfrM3ilG8DlI+RlLBm4sQhNV4W7GptYUBq95RSf1WTCPLpIgNLjzGhNWZDhe56 XZqymiwNhJwBmHwZf9B5joigACOKgs3CkWpwu3S57mR9XEfDJynJi8kZEL1QgVU/ 87irCllMm/g0DqygEe+4eGEUH6YRfz34ATL/grT+1iFCg2nVOQ7ougJf8ACB4T2O /bXEzcPGCOTvAO5qM+vNzsvPTqgfpBZ8vYJVN0zfSyj79JlVcnswt4VRUu8m4FHi nuxV6Jjx7uKOUpyyKJQn9qCtFSUGqs1nj8ZmcSHR1epKOqFYdNB2MFEkVnLhi7a5 rGpa2OCau5VObCfY25ldCr0lAa2HiJjbIjA1upxho6/TBtaV6E01ez9c5WI4uo+U ZApQ9jiqXUt8XvHtAM1rWXECV6beFXpZbqKmbQ+yxg== -----END CERTIFICATE----- )"; const char ClientTestBase::kPrivateRSAPEM[] = R"(-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAvI1Jn+IoMe02PS20/pry1PcU0Uv57NodJZ70YyQM8sO3SRxW kxnQX9FZGZ42iURAOdQVuAMfvjIcUa6p++l2T4mBBG/YhmKQF8hoFIse9Kp6WGV8 76o+xoDIUqok36UmtwiRmdPVo/XGek7GdhWE+14wbF57J25AiXokBZfg+57pzucw s5AZUGRa5f5r+bSyHdu4Jg82/Bd32A26XREo+954N6G19QCYOR4qTNBjt6l98W+s YGBeQpyr1h5hveeWWgNDKV8+k+72njxktiNy8w/8n7JIMXT2dCNzia5/j3RrX73k gFU+x5w8g/0QruPvjAJSs1jkxjJIX2TWIPrQMwIDAQABAoIBAQCOp5b8kG841vAi eWJm/3SaDBaEA6eju6IxxIHCQJRLWChj+DzILs+orwtqhnlcgXbWSc/k2Pg7Pk6O vkd9gLUymCY05So9AnViiQ21/Uv+cL0ABEjySywTo3vsjy42xwzzjlgaulr5Igp4 nwEodj+WrzyTwSgMPS421WJLmQ1vUQ+1FT3yPU4ljtvoyxNagaVTY9ZbTxtCqcmt CliP5WgC6vsqcV8VbK5LQT1ycyeNXsxpFwGEUn7FVDmT9XetvN2G3uu+56lRa35Z ai6baECDspVBvoaSDkKWqUFhZAgnzW8KFOTLpxHFFLESSFRNuSdiTAqIA8C+SPUV fcSxuLIBAoGBAN9183iDdUt9Lmk3912KOfl9rf4NlOjogH+2un/5OmM6PMNb9ONc fAMJCMdF0jGKkIC2p1f4VseKYYrMT20r1XV/p4jbVkfTVTBG6ys2GFrO+Rgjx7/9 sciiE87SewY/Cqg48aQ5Iy1nNX+wLg+K1+PRKZODKSsqVuy+bk75PqaxAoGBANgC Bgrr+muB8MtPfR9CL0010NN14N6MK5lDAhQsLBCjYcdAZClhhffHq5rEp/wl9enG s5+FQn08eEObx8qBxhJLd04Zuh0zUT8rkvBIAAvFUqdqN/mJUZHqSVgqk1Tn4tRL iaznZHi8+IH5mB6Ei6XQ4pftx23uFWnYYLVV1+YjAoGBAItOZPIEQeNFruE5WqSd v3ahuw5eOS7ZgwIbUDjnjla9v5OqiAgVZ9ocj7Rq+paX423acIiO8MqEojp9FCbi 5LfTVQYkdq1gOgNWstTFbHlv/inmZGh0J5kEMYUGAlvqgSJOHZZbaGqtpNRtaMmX rO8BPgIQCmI2iuob7XieOUiBAoGALz26DpdvbCW+AOkAh16VM8CqTCUCqglj26AB C2JhvL3Ou6IEhdxTTU545F9QEeBHePpA/IlLclJQRxEBz/Mz23pvvD/6KTq48STZ fP1yLSDZo82iMkvq8AuaQNMG59HTFPT0RkFRAurpOpvYvgvk8r3NYMbbD9q7CiwN cns0vZsCgYEApekMPRZw/l9ZC0CRfswb6EpUFjgM6yflPeFsyCNTEGlpQuIdAWCf I8WVhjQT+yJUAlPJVWmYrXqpFzAD3r20qPg6i2tYsVTYhnr8htEyxibUpoNp2XIl Ez6jWXu/xkywXaxZ5SqHIGPqvhdG4eOercH6iKOEdmyK0+7AxraXGaQ= -----END RSA PRIVATE KEY----- )"; class ClientTestBase::LogCaptureSink : public LogSink { public: explicit LogCaptureSink(const std::set& severities) : severities_to_log_(severities) { LogControl::AddLogSink(this); } ~LogCaptureSink() { StopLogging(); } void StopLogging() { std::unique_lock l(mutex_); LogControl::RemoveLogSink(this); } void Log(LogLevel level, const char* filename, int line, const std::string& message) { std::unique_lock l(mutex_); if (severities_to_log_.count(level)) { messages_.push_back(message); } } bool ContainsMessageWithSuffix(const std::string& suffix) { std::unique_lock l(mutex_); for (const auto& m : messages_) { if (m.size() >= suffix.size() && m.compare(m.size() - suffix.size(), suffix.size(), suffix) == 0) { return true; } } return false; } private: std::mutex mutex_; std::vector messages_; const std::set severities_to_log_; }; void ClientTestBase::BeginLogCapture(const std::set& severities) { log_capture_sink_.reset(new LogCaptureSink(severities)); } void ClientTestBase::EndLogCapture() { GOOGLE_CHECK(log_capture_sink_ != nullptr); log_capture_sink_->StopLogging(); } bool ClientTestBase::CapturedLogContainsSuffix(const std::string& message) { GOOGLE_CHECK(log_capture_sink_ != nullptr); return log_capture_sink_->ContainsMessageWithSuffix(message); } } // namespace grr grr-3.1.0.2/grr/client/minicomm/client_test_base.h000066400000000000000000000032761273104013200220060ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_CLIENT_TEST_BASE_H_ #define GRR_CLIENT_MINICOMM_CLIENT_TEST_BASE_H_ #include #include #include "gtest/gtest.h" #include "grr/client/minicomm/config.h" namespace grr { using google::protobuf::LOGLEVEL_INFO; using google::protobuf::LOGLEVEL_WARNING; using google::protobuf::LOGLEVEL_ERROR; using google::protobuf::LOGLEVEL_FATAL; class ClientTestBase : public ::testing::Test { public: ClientTestBase(); ~ClientTestBase(); // This sets up config_ with a config file usable for most purposes. void SetUpDefaultConfig(); void SetUp() override { SetUpDefaultConfig(); } // Methods to write a config file, providing more control over the resulting // configuration. Be sure to call config_.ReadConfig after using. void WriteValidConfigFile(bool include_private_key, bool use_writeback); void WriteConfigFile(const std::string& data); // Retrieve current writeback file. std::string ReadWritebackFile(); // Resets the log capture buffer and begins copying logged messages to it. void BeginLogCapture(const std::set& levels); // Stops capturing log messages. void EndLogCapture(); // Check if the buffer contains a log line which ends in string. bool CapturedLogContainsSuffix(const std::string& string); const std::string tmp_dir_; const std::string config_filename_; const std::string writeback_filename_; ClientConfig config_; // A valid CA certificate. static const char kCertPEM[]; // A valid RSA private key. static const char kPrivateRSAPEM[]; private: class LogCaptureSink; std::unique_ptr log_capture_sink_; }; } // namespace grr #endif // GRR_CLIENT_MINICOMM_CLIENT_TEST_BASE_H_ grr-3.1.0.2/grr/client/minicomm/comms_utils.cc000066400000000000000000000143531273104013200211710ustar00rootroot00000000000000#include "comms_utils.h" #include #include #include #include "google/protobuf/repeated_field.h" #include "grr/client/minicomm/base.h" #include "grr/client/minicomm/compression.h" namespace grr { // *** MessageBuilder *** void MessageBuilder::InitiateEnrollment(ClientConfig* config, MessageQueue* outbox) { CertificateSR csr; csr.SetSubject(config->ClientId()); RSAKey my_key(config->key()); if (my_key.get() == nullptr) { config->ResetKey(); my_key = config->key(); } csr.SetPublicKey(&my_key); csr.Sign(&my_key); GrrMessage enrollment_message; enrollment_message.set_session_id("aff4:/flows/CA:Enrol"); ::Certificate cert_pb; cert_pb.set_type(::Certificate::CSR); cert_pb.set_pem(csr.ToStringPEM()); enrollment_message.set_args(cert_pb.SerializeAsString()); enrollment_message.set_args_rdf_name("Certificate"); enrollment_message.set_source(config->ClientId()); outbox->AddPriorityMessage(enrollment_message); } // *** SecureSession *** namespace { std::string ComputeHMAC(const std::string& key, const ClientCommunication& input) { Sha1HMAC hmac(key); hmac.Update(input.encrypted()); hmac.Update(input.encrypted_cipher()); hmac.Update(input.encrypted_cipher_metadata()); hmac.Update(input.packet_iv()); // Need the bytes for api_version as a 32 bit little endian value. uint32_t converted_version = htole32(input.api_version()); std::string version_string(reinterpret_cast(&converted_version), 4); hmac.Update(version_string); return hmac.Final(); } } // namespace SecureSession::SecureSession(const std::string& client_id, RSAKey* our_key, std::unique_ptr target_cert) : our_key_(our_key), target_cert_(std::move(target_cert)) { CipherProperties properties; properties.set_name("aes_128_cbc"); properties.set_key(CryptoRand::RandBytes(16)); properties.set_metadata_iv(CryptoRand::RandBytes(16)); properties.set_hmac_key(CryptoRand::RandBytes(16)); properties.set_hmac_type(CipherProperties::FULL_HMAC); std::string serialized_properties = properties.SerializeAsString(); encrypted_cipher_properties_ = target_cert_->Encrypt(serialized_properties); session_key_ = properties.key(); hmac_key_ = properties.hmac_key(); CipherMetadata metadata; metadata.set_signature(our_key_->SignSha256(serialized_properties)); metadata.set_source(client_id); encrypted_cipher_metadata_ = AES128CBCCipher::Encrypt( properties.key(), properties.metadata_iv(), metadata.SerializeAsString()); } ClientCommunication SecureSession::EncodeMessages( const std::vector& messages, int64 nonce) { ClientCommunication result; result.set_encrypted_cipher(encrypted_cipher_properties_); result.set_encrypted_cipher_metadata(encrypted_cipher_metadata_); result.set_packet_iv(CryptoRand::RandBytes(16)); result.set_api_version(3); SignedMessageList signed_list = PackMessages(messages); signed_list.set_timestamp(nonce); result.set_encrypted(AES128CBCCipher::Encrypt( session_key_, result.packet_iv(), signed_list.SerializeAsString())); result.set_full_hmac(ComputeHMAC(hmac_key_, result)); return result; } SignedMessageList SecureSession::PackMessages( const std::vector& messages) { MessageList list; *list.mutable_job() = google::protobuf::RepeatedPtrField( messages.begin(), messages.end()); SignedMessageList result; std::string serialized_result = list.SerializeAsString(); std::string compressed_result = ZLib::Deflate(serialized_result); if (serialized_result.length() <= compressed_result.length()) { result.mutable_message_list()->swap(serialized_result); } else { result.mutable_message_list()->swap(compressed_result); result.set_compression(SignedMessageList::ZCOMPRESSION); } return result; } bool SecureSession::DecodeMessages(const ClientCommunication& input, std::vector* output, int64 nonce) { const std::string serialized_cipher = our_key_->Decrypt(input.encrypted_cipher()); if (serialized_cipher.empty()) { GOOGLE_LOG(ERROR) << "Could not decrypt cipher."; return false; } CipherProperties cipher_props; if (!cipher_props.ParseFromString(serialized_cipher)) { GOOGLE_LOG(ERROR) << "Could not parse cipher."; return false; } const std::string expected_hmac = ComputeHMAC(cipher_props.hmac_key(), input); if (expected_hmac != input.full_hmac()) { GOOGLE_LOG(ERROR) << "HMAC mismatch."; return false; } std::string decrypted_packet = AES128CBCCipher::Decrypt( cipher_props.key(), input.packet_iv(), input.encrypted()); if (decrypted_packet.empty()) { GOOGLE_LOG(ERROR) << "Could not decrypt packet."; return false; } SignedMessageList s_message_list; if (!s_message_list.ParseFromString(decrypted_packet)) { GOOGLE_LOG(ERROR) << "Could not parse packet:" << decrypted_packet; GOOGLE_LOG(ERROR) << "Found:" << s_message_list.DebugString(); return false; } if (s_message_list.timestamp() != nonce) { GOOGLE_LOG(ERROR) << "Nonce mismatch."; return false; } bool parse_result; MessageList message_list; switch (s_message_list.compression()) { case SignedMessageList::UNCOMPRESSED: parse_result = message_list.ParseFromString(s_message_list.message_list()); break; case SignedMessageList::ZCOMPRESSION: parse_result = message_list.ParseFromString( ZLib::Inflate(s_message_list.message_list())); break; default: GOOGLE_LOG(ERROR) << "Unknown compression option:" << s_message_list.compression(); } if (!parse_result) { GOOGLE_LOG(ERROR) << "Could not parse message list."; return false; } for (const auto& message : message_list.job()) { output->emplace_back(message); } return true; } uint64 NonceGenerator::Generate() { const auto now = std::chrono::high_resolution_clock::now(); uint64 now_usec = std::chrono::duration_cast( now.time_since_epoch()) .count(); uint64 result = std::max(last_nonce_ + 1, now_usec); last_nonce_ = result; return result; } } // namespace grr grr-3.1.0.2/grr/client/minicomm/comms_utils.h000066400000000000000000000031311273104013200210230ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_COMMS_UTILS_H_ #define GRR_CLIENT_MINICOMM_COMMS_UTILS_H_ #include #include #include #include "grr/proto/jobs.pb.h" #include "grr/client/minicomm/base.h" #include "grr/client/minicomm/config.h" #include "grr/client/minicomm/crypto.h" #include "grr/client/minicomm/message_queue.h" namespace grr { class MessageBuilder { public: static void InitiateEnrollment(ClientConfig* config, MessageQueue* outbox); }; class NonceGenerator { public: NonceGenerator() : last_nonce_(0) {} uint64 Generate(); private: uint64 last_nonce_; }; class SecureSession { public: SecureSession(const std::string& client_id, RSAKey* our_key, std::unique_ptr target_cert); // Encrypts, signs and packages a set of messages into a ClientCommunitation. ClientCommunication EncodeMessages(const std::vector& messages, int64 nonce); // Attempt to decode and verify a ClientCommunication created for us. // Returns true on success. GrrMessage records are appended to output. bool DecodeMessages(const ClientCommunication& messages, std::vector* output, int64 nonce); private: SignedMessageList PackMessages(const std::vector& messages); std::string encrypted_cipher_properties_; std::string encrypted_cipher_metadata_; std::string session_key_; std::string hmac_key_; // External components. RSAKey* our_key_; std::unique_ptr target_cert_; }; } // namespace grr #endif // GRR_CLIENT_MINICOMM_COMMS_UTILS_H_ grr-3.1.0.2/grr/client/minicomm/comms_utils_test.cc000066400000000000000000000046021273104013200222240ustar00rootroot00000000000000#include "grr/client/minicomm/comms_utils.h" #include #include "grr/client/minicomm/client_test_base.h" #include "gtest/gtest.h" namespace grr { class MessageBuilderTest : public ClientTestBase {}; TEST_F(MessageBuilderTest, InitiateEnrollmentWithoutKey) { MessageQueue output(5, 1024); ASSERT_TRUE(config_.ReadConfig()); ASSERT_TRUE(config_.key().get() == nullptr); MessageBuilder::InitiateEnrollment(&config_, &output); EXPECT_TRUE(config_.key().get() != nullptr); } TEST_F(MessageBuilderTest, InitiateEnrollment) { MessageQueue output(5, 1024); WriteValidConfigFile(true, false); ASSERT_TRUE(config_.ReadConfig()); MessageBuilder::InitiateEnrollment(&config_, &output); EXPECT_EQ(config_.key().ToStringPEM(), kPrivateRSAPEM); EXPECT_EQ(output.current_message_count(), 1); auto m = output.GetMessages(1000, 1024, true); ASSERT_EQ(m.size(), 1); EXPECT_EQ(m[0].session_id(), "aff4:/flows/CA:Enrol"); EXPECT_EQ(m[0].args_rdf_name(), "Certificate"); ::Certificate cert_pb; ASSERT_TRUE(cert_pb.ParseFromString(m[0].args())); EXPECT_EQ(cert_pb.type(), ::Certificate::CSR); EXPECT_FALSE(cert_pb.pem().empty()); } class SecureSessionTest : public ::testing::Test {}; TEST_F(SecureSessionTest, EncodeDecodeMessage) { const std::string client_id = "grr"; RSAKey server_key, client_key; int64 nonce = 4; server_key.Generate(); client_key.Generate(); std::unique_ptr server_cert(new Certificate(server_key)); std::unique_ptr client_cert(new Certificate(client_key)); auto session_server = SecureSession(client_id, &server_key, std::move(client_cert)); auto session_client = SecureSession(client_id, &client_key, std::move(server_cert)); // client -> server std::vector messages_in; auto encoded = session_client.EncodeMessages(messages_in, nonce); std::vector messages_out; EXPECT_TRUE(session_server.DecodeMessages(encoded, &messages_out, nonce)); EXPECT_TRUE(messages_out.empty()); GrrMessage message; std::string plaintext = "Hello encryption!"; message.set_session_id(plaintext); messages_in.push_back(message); encoded = session_client.EncodeMessages(messages_in, nonce); EXPECT_TRUE(session_server.DecodeMessages(encoded, &messages_out, nonce)); ASSERT_EQ(messages_out.size(), 1); EXPECT_EQ(messages_out[0].session_id(), plaintext); } } // namespace grr grr-3.1.0.2/grr/client/minicomm/compression.cc000066400000000000000000000071521273104013200211730ustar00rootroot00000000000000#include "compression.h" #include #include #include #include "grr/client/minicomm/base.h" #include "zlib.h" namespace grr { namespace { z_stream MakeZS(const std::string& input) { z_stream zs; zs.zalloc = Z_NULL; zs.zfree = Z_NULL; zs.opaque = Z_NULL; zs.next_in = const_cast( reinterpret_cast(input.data())); zs.avail_in = input.length(); return zs; } } // namespace std::string ZLib::Inflate(const std::string& input) { const auto block_size = std::max(input.size(), (size_t)1024); std::vector> output_blocks; output_blocks.emplace_back(new unsigned char[block_size]()); z_stream zs = MakeZS(input); inflateInit(&zs); zs.next_out = output_blocks.back().get(); zs.avail_out = block_size; int result; while ((result = inflate(&zs, Z_SYNC_FLUSH)) == Z_OK) { if (zs.avail_out != 0) { GOOGLE_LOG(ERROR) << "ZLIB didn't fill block."; return ""; } output_blocks.emplace_back(new unsigned char[block_size]()); zs.next_out = output_blocks.back().get(); zs.avail_out = block_size; } if (result != Z_STREAM_END) { GOOGLE_LOG(ERROR) << "Unexpected ZLIB result:" << result; return ""; } std::string r; r.reserve(zs.total_out); for (int i = 0; i < output_blocks.size() - 1; i++) { r.append(reinterpret_cast(output_blocks[i].get()), block_size); } r.append(reinterpret_cast(output_blocks.back().get()), block_size - zs.avail_out); inflateEnd(&zs); return r; } std::string ZLib::Deflate(const std::string& input) { z_stream zs = MakeZS(input); deflateInit(&zs, Z_DEFAULT_COMPRESSION); const int max_out = deflateBound(&zs, input.length()); std::unique_ptr output(new unsigned char[max_out]()); zs.next_out = output.get(); zs.avail_out = max_out; deflate(&zs, Z_FINISH); deflateEnd(&zs); return std::string(reinterpret_cast(output.get()), zs.total_out); } ZDeflate::ZDeflate() { zs_.zalloc = Z_NULL; zs_.zfree = Z_NULL; zs_.opaque = Z_NULL; deflateInit(&zs_, Z_DEFAULT_COMPRESSION); zs_.next_out = nullptr; zs_.avail_out = 0; } ZDeflate::~ZDeflate() { deflateEnd(&zs_); } void ZDeflate::UpdateInternal(const char* buffer, size_t limit) { zs_.next_in = const_cast( reinterpret_cast(buffer)); zs_.avail_in = limit; int result; do { if (zs_.avail_out == 0) { output_blocks_.emplace_back(new unsigned char[kBlockSize]()); zs_.next_out = reinterpret_cast(output_blocks_.back().get()); zs_.avail_out = kBlockSize; } } while (zs_.avail_in > 0 && (result = deflate(&zs_, Z_NO_FLUSH)) == Z_OK); if (result != Z_OK) { GOOGLE_LOG(FATAL) << "Unexpected ZLIB result:" << result; } } std::string ZDeflate::Final() { GOOGLE_CHECK(zs_.avail_in == 0); int result; do { if (zs_.avail_out == 0) { output_blocks_.emplace_back(new unsigned char[kBlockSize]()); zs_.next_out = reinterpret_cast(output_blocks_.back().get()); zs_.avail_out = kBlockSize; } } while ((result = deflate(&zs_, Z_FINISH)) == Z_OK); if (result != Z_STREAM_END) { GOOGLE_LOG(FATAL) << "Unexpected ZLIB result:" << result; } std::string r; r.reserve(zs_.total_out); for (int i = 0; i < output_blocks_.size() - 1; i++) { r.append(reinterpret_cast(output_blocks_[i].get()), kBlockSize); } r.append(reinterpret_cast(output_blocks_.back().get()), kBlockSize - zs_.avail_out); output_blocks_.clear(); return r; } } // namespace grr grr-3.1.0.2/grr/client/minicomm/compression.h000066400000000000000000000020131273104013200210240ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_COMPRESSION_H_ #define GRR_CLIENT_MINICOMM_COMPRESSION_H_ #include #include #include #include "zlib.h" namespace grr { class ZLib { public: static std::string Inflate(const std::string& input); static std::string Deflate(const std::string& input); }; // A class to perform an incremental deflate (compression) a stream of input // blocks. class ZDeflate { public: ZDeflate(); ~ZDeflate(); // Add up to limit bytes from buffer to the internal stream. template void Update(const char(&buffer)[size], size_t limit) { UpdateInternal(buffer, std::min(size, limit)); } // Return the internal stream in compressed format. std::string Final(); private: static constexpr size_t kBlockSize = 1024 * 64; void UpdateInternal(const char* buffer, size_t limit); // The blocks of output. std::vector> output_blocks_; z_stream zs_; }; } // namespace grr #endif // GRR_CLIENT_MINICOMM_COMPRESSION_H_ grr-3.1.0.2/grr/client/minicomm/compression_test.cc000066400000000000000000000041101273104013200222210ustar00rootroot00000000000000#include "grr/client/minicomm/compression.h" #include #include "gtest/gtest.h" namespace grr { TEST(CompressionTest, RoundTrip) { static const std::string kSentence = "The quick sly fox jumped over the lazy dogs."; EXPECT_EQ(ZLib::Inflate(ZLib::Deflate(kSentence)), kSentence); static const std::string kZeros(2048, '\0'); EXPECT_EQ(ZLib::Inflate(ZLib::Deflate(kZeros)), kZeros); static const std::string kShort = "A"; EXPECT_EQ(ZLib::Inflate(ZLib::Deflate(kShort)), kShort); } TEST(CompressionTest, ZDeflate) { static const char kSentence[] = "The quick sly fox jumped over the lazy dogs."; { ZDeflate sentence_deflate; // kSentence is an array with 44 printable symbols. sentence_deflate.Update(kSentence, 44); EXPECT_EQ(kSentence, ZLib::Inflate(sentence_deflate.Final())); } { ZDeflate sentence_deflate; // As an array, kSentence has a length of 45, because of the terminator, and // this is a hard limit on how much we read. sentence_deflate.Update(kSentence, 100); EXPECT_EQ(std::string(kSentence, 45), ZLib::Inflate(sentence_deflate.Final())); } { // Multiple input blocks. ZDeflate sentence_deflate; for (int i = 0; i < 10; i++) { sentence_deflate.Update(kSentence, 100); } const std::string sentences = ZLib::Inflate(sentence_deflate.Final()); EXPECT_EQ(450, sentences.size()); } { // Multiple output blocks. Force the output size to be larger than 64k // by compressing random numbers. srand(42); constexpr int kSize = 96 * 1024; char randoms[kSize]; // Trust that sizeof(int) divides kSize. for (int i = 0; i < kSize / sizeof(int); i++) { *(reinterpret_cast(randoms) + i) = rand(); } ZDeflate rand_deflate; rand_deflate.Update(randoms, kSize); const std::string compressed_result = rand_deflate.Final(); EXPECT_GT(compressed_result.size(), 64 * 1024); const std::string result = ZLib::Inflate(compressed_result); EXPECT_EQ(result, std::string(randoms, kSize)); } } } // namespace grr grr-3.1.0.2/grr/client/minicomm/config.cc000066400000000000000000000110021273104013200200640ustar00rootroot00000000000000#include "config.h" #include #include #ifdef _WIN32 #include #else #include #endif #include "grr/client/minicomm/config.pb.h" #include "grr/client/minicomm/util.h" #include "google/protobuf/io/zero_copy_stream_impl.h" #include "google/protobuf/text_format.h" namespace grr { ClientConfig::ClientConfig(const std::string& configuration_file) : configuration_filename_(configuration_file) {} bool ClientConfig::ReadConfig() { ClientConfiguration proto; if (!MergeConfigFile(configuration_filename_, &proto)) { GOOGLE_LOG(ERROR) << "Unable to read config:" << configuration_filename_; return false; } std::unique_lock l(lock_); writeback_filename_ = proto.writeback_filename(); if (!writeback_filename_.empty()) { if (!MergeConfigFile(writeback_filename_, &proto)) { GOOGLE_LOG(ERROR) << "Unable to read writeback:" << writeback_filename_; } } else { GOOGLE_LOG(WARNING) << "No writeback filename. Writeback disabled."; } subprocess_config_ = proto.subprocess_config(); last_server_cert_serial_number_ = proto.last_server_cert_serial_number(); control_urls_ = proto.control_url(); proxy_servers_ = proto.proxy_server(); key_.FromPEM(proto.client_private_key_pem()); ca_cert_.FromPEM(proto.ca_cert_pem()); temporary_directory_ = proto.temporary_directory(); client_id_ = MakeClientId(); if (!control_urls_.size()) { GOOGLE_LOG(ERROR) << "No control URLs."; return false; } if (ca_cert_.get() == NULL) { GOOGLE_LOG(ERROR) << "Missing or bad ca cert."; return false; } return true; } bool ClientConfig::CheckUpdateServerSerial(int new_serial) { std::unique_lock l(lock_); if (new_serial < last_server_cert_serial_number_) { return false; } if (new_serial > last_server_cert_serial_number_) { last_server_cert_serial_number_ = new_serial; return WriteBackConfig(); } return true; } bool ClientConfig::ResetKey() { std::unique_lock l(lock_); if (!key_.Generate()) { return false; } client_id_ = MakeClientId(); return WriteBackConfig(); } std::vector ClientConfig::ControlUrls() const { std::unique_lock l(lock_); return std::vector(control_urls_.begin(), control_urls_.end()); } std::vector ClientConfig::ProxyServers() const { std::unique_lock l(lock_); return std::vector(proxy_servers_.begin(), proxy_servers_.end()); } ClientConfiguration::SubprocessConfig ClientConfig::SubprocessConfig() const { std::unique_lock l(lock_); return subprocess_config_; } bool ClientConfig::WriteBackConfig() { if (writeback_filename_.empty()) { return true; } int fd = open(writeback_filename_.c_str(), O_WRONLY | O_TRUNC | O_CREAT, S_IWUSR | S_IRUSR); if (fd < 0) { GOOGLE_LOG(ERROR) << "Unable to open writeback: " << writeback_filename_; return false; } // Re-read the original configuration file, so we can tell what has changed. ClientConfiguration base_config; if (!MergeConfigFile(configuration_filename_, &base_config)) { GOOGLE_LOG(ERROR) << "Unable to read config: " << configuration_filename_; } // Currently only 2 fields can be changed through the config interface. ClientConfiguration proto; if (base_config.last_server_cert_serial_number() != last_server_cert_serial_number_) { proto.set_last_server_cert_serial_number(last_server_cert_serial_number_); } std::string key_pem = key_.ToStringPEM(); if (base_config.client_private_key_pem() != key_pem) { proto.set_client_private_key_pem(key_pem); } google::protobuf::io::FileOutputStream output(fd); bool result = google::protobuf::TextFormat::Print(proto, &output); output.Close(); return result; } std::string ClientConfig::MakeClientId() { if (!key_.get()) { return ""; } return "C." + BytesToHex(Digest::Hash(Digest::Type::SHA256, key_.PublicKeyN()) .substr(0, 8)); } bool ClientConfig::MergeConfigFile(const std::string& config_file, ClientConfiguration* config) { int fd = open(config_file.c_str(), O_RDONLY); if (fd < 0) { GOOGLE_LOG(ERROR) << "Failed to open:" << config_file; return false; } google::protobuf::io::FileInputStream input(fd); if (!google::protobuf::TextFormat::Merge(&input, config)) { GOOGLE_LOG(ERROR) << "Failed to parse:" << config_file; input.Close(); return false; } input.Close(); return true; } } // namespace grr grr-3.1.0.2/grr/client/minicomm/config.h000066400000000000000000000052241273104013200177370ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_CONFIG_H_ #define GRR_CLIENT_MINICOMM_CONFIG_H_ #include #include #include #include "grr/client/minicomm/config.pb.h" #include "grr/client/minicomm/crypto.h" #include "google/protobuf/repeated_field.h" // Represents the configuration of a client. Thread safe. namespace grr { class ClientConfig { public: // Create a ClientConfig read from the provided filename. explicit ClientConfig(const std::string& filename); // Attempt to initialize/update ClientConfig from the filesystem. Returns true // on success. bool ReadConfig(); // void OverwriteConfig(const ClientConfig& config); // Check if new_serial is an acceptable serial number. If the new number is // acceptable, returns true and updates the last seen serial number. bool CheckUpdateServerSerial(int new_serial); // Regenerate our private key. bool ResetKey(); // A client id based on our rsa key. Returns the empty string if we do not // have a private rsa key. std::string ClientId() const { std::unique_lock l(lock_); return client_id_; } // Our private rsa key, used to identify the client. RSAKey key() const { std::unique_lock l(lock_); return key_; } // The certificate used to authenticate servers - the server must present a // certificate signed with this key. Certificate ca_cert() { std::unique_lock l(lock_); return ca_cert_; } // Directory in which temporary files will be created and deleted. std::string TemporaryDirectory() const { std::unique_lock l(lock_); return temporary_directory_; } std::vector ControlUrls() const; std::vector ProxyServers() const; ClientConfiguration::SubprocessConfig SubprocessConfig() const; private: // Attempt to save the current ClientConfig to the filesystem. bool WriteBackConfig(); std::string MakeClientId(); // Read the file named config_file and merge its content into *config_proto. // return true on success. static bool MergeConfigFile(const std::string& config_file, ClientConfiguration* config_proto); const std::string configuration_filename_; std::string writeback_filename_; std::string client_id_; int last_server_cert_serial_number_; google::protobuf::RepeatedPtrField control_urls_; google::protobuf::RepeatedPtrField proxy_servers_; ClientConfiguration::SubprocessConfig subprocess_config_; std::string temporary_directory_; RSAKey key_; Certificate ca_cert_; mutable std::mutex lock_; }; } // namespace grr #endif // GRR_CLIENT_MINICOMM_CONFIG_H_ grr-3.1.0.2/grr/client/minicomm/config.proto000066400000000000000000000012601273104013200206470ustar00rootroot00000000000000syntax = "proto2"; package grr; message ClientConfiguration { repeated string control_url = 1; repeated string proxy_server = 2; // The ca certificate which is used to validate server certs. optional string ca_cert_pem = 3; // The RSA private key of the client. optional string client_private_key_pem = 4; optional int32 last_server_cert_serial_number = 5; // The file to write configuration updates. optional string writeback_filename = 6; message SubprocessConfig { optional string filename = 1; repeated string argv = 2; repeated string env = 3; } optional SubprocessConfig subprocess_config = 7; optional string temporary_directory = 8; } grr-3.1.0.2/grr/client/minicomm/config_test.cc000066400000000000000000000034401273104013200211320ustar00rootroot00000000000000#include "grr/client/minicomm/config.h" #include #include "grr/client/minicomm/client_test_base.h" #include "google/protobuf/text_format.h" #include "gtest/gtest.h" namespace grr { class ConfigTest : public grr::ClientTestBase {}; TEST_F(ConfigTest, BadConfig) { WriteConfigFile("A bad config file::"); EXPECT_FALSE(config_.ReadConfig()); } TEST_F(ConfigTest, GoodConfig) { WriteValidConfigFile(false, true); EXPECT_TRUE(config_.ReadConfig()); } TEST_F(ConfigTest, NoPrivateKey) { WriteValidConfigFile(false, true); ASSERT_TRUE(config_.ReadConfig()); EXPECT_TRUE(config_.key().get() == nullptr); } TEST_F(ConfigTest, Writeback) { WriteValidConfigFile(false, true); ASSERT_TRUE(config_.ReadConfig()); ClientConfiguration config_proto; config_.ResetKey(); const std::string client_id = config_.ClientId(); EXPECT_FALSE(client_id.empty()); ASSERT_TRUE(google::protobuf::TextFormat::ParseFromString(ReadWritebackFile(), &config_proto)); EXPECT_FALSE(config_proto.client_private_key_pem().empty()); EXPECT_FALSE(config_proto.has_last_server_cert_serial_number()); EXPECT_TRUE(config_.CheckUpdateServerSerial(100)); EXPECT_TRUE(config_.CheckUpdateServerSerial(200)); EXPECT_FALSE(config_.CheckUpdateServerSerial(150)); EXPECT_TRUE(config_.CheckUpdateServerSerial(200)); ASSERT_TRUE(google::protobuf::TextFormat::ParseFromString(ReadWritebackFile(), &config_proto)); EXPECT_EQ(200, config_proto.last_server_cert_serial_number()); // Verify that a new config will have the same client_id. ClientConfig new_config(config_filename_); ASSERT_TRUE(new_config.ReadConfig()); EXPECT_EQ(client_id, new_config.ClientId()); } } // namespace grr grr-3.1.0.2/grr/client/minicomm/crypto.cc000066400000000000000000000267371273104013200201640ustar00rootroot00000000000000#include "grr/client/minicomm/crypto.h" #include #include #include "openssl/bio.h" #include "openssl/evp.h" #include "openssl/pem.h" #include "openssl/rand.h" #include "openssl/sha.h" namespace grr { namespace { inline std::string BIOToString(BIO* bio) { char* data; const long len = BIO_get_mem_data(bio, &data); if (len <= 0 || !data) { return ""; } return std::string(data, len); } inline const unsigned char* StringToBytes(const std::string& input) { return reinterpret_cast(input.data()); } } // namespace // *** Digest *** Digest::Digest(Digest::Type t) { const EVP_MD* type = nullptr; switch (t) { case Type::MD5: type = EVP_md5(); break; case Type::SHA1: type = EVP_sha1(); break; case Type::SHA256: type = EVP_sha256(); break; default: GOOGLE_LOG(FATAL) << "Unknown digest type:" << int(t); } EVP_MD_CTX_init(&ctx_); if (!EVP_DigestInit_ex(&ctx_, type, nullptr)) { GOOGLE_LOG(FATAL) << "Unable to initialize digest context."; } } void Digest::UpdateInternal(const char* buffer, size_t limit) { EVP_DigestUpdate(&ctx_, reinterpret_cast(buffer), limit); } void Digest::Update(const std::string& input) { UpdateInternal(input.data(), input.length()); } std::string Digest::Final() { unsigned int digest_size; std::unique_ptr buf( new unsigned char[EVP_MD_CTX_size(&ctx_)]); EVP_DigestFinal_ex(&ctx_, buf.get(), &digest_size); return std::string(reinterpret_cast(buf.get()), digest_size); } Digest::~Digest() { EVP_MD_CTX_cleanup(&ctx_); } std::string Digest::Hash(Digest::Type t, const std::string& input) { Digest d(t); d.Update(input); return d.Final(); } // *** Sha1HMAC *** Sha1HMAC::Sha1HMAC(const std::string& key) { HMAC_CTX_init(&ctx_); HMAC_Init_ex(&ctx_, StringToBytes(key), key.length(), EVP_sha1(), NULL); } Sha1HMAC::~Sha1HMAC() { HMAC_CTX_cleanup(&ctx_); } void Sha1HMAC::Update(const std::string& input) { HMAC_Update(&ctx_, StringToBytes(input), input.length()); } std::string Sha1HMAC::Final() { unsigned char digest[EVP_MAX_MD_SIZE]; unsigned int length; HMAC_Final(&ctx_, digest, &length); return std::string(reinterpret_cast(digest), length); } // *** RSAKey *** RSAKey::RSAKey(const RSAKey& other) : key_(other.key_.get()) { if (key_.get()) { RSA_up_ref(key_.get()); } } void RSAKey::operator=(const RSAKey& other) { key_.reset(other.key_.get()); if (key_.get()) { RSA_up_ref(key_.get()); } } bool RSAKey::Generate() { key_.reset(RSA_new()); scoped_ptr_openssl_void e(BN_new()); BN_set_word(e.get(), RSA_F4); return RSA_generate_key_ex(key_.get(), 2048, e.get(), NULL); } bool RSAKey::FromPEM(const std::string& pem) { scoped_ptr_openssl_int bio( BIO_new_mem_buf(const_cast(pem.data()), pem.size())); key_.reset(PEM_read_bio_RSAPrivateKey(bio.get(), NULL, NULL, NULL)); return key_.get() != nullptr; } std::string RSAKey::ToStringPEM() const { if (key_.get() == NULL) { return ""; } scoped_ptr_openssl_int bio(BIO_new(BIO_s_mem())); if (!PEM_write_bio_RSAPrivateKey(bio.get(), key_.get(), NULL, NULL, 0, NULL, NULL)) { return ""; } return BIOToString(bio.get()); } std::string RSAKey::PublicKeyN() const { if (key_.get() == NULL || key_.get()->n == NULL) { return ""; } BIGNUM* bn = key_.get()->n; const int len = BN_bn2mpi(bn, nullptr); std::unique_ptr buf(new char[len]); BN_bn2mpi(bn, reinterpret_cast(buf.get())); return std::string(buf.get(), len); } std::string RSAKey::SignSha256(const std::string& input) { if (key_.get() == NULL) { return ""; } SHA256_CTX context; SHA256_Init(&context); SHA256_Update(&context, input.data(), input.length()); unsigned char digest[SHA256_DIGEST_LENGTH]; SHA256_Final(digest, &context); std::unique_ptr output( new unsigned char[RSA_size(key_.get())]); unsigned int output_length; RSA_sign(NID_sha256, digest, SHA256_DIGEST_LENGTH, output.get(), &output_length, key_.get()); return std::string(reinterpret_cast(output.get()), output_length); } std::string RSAKey::Decrypt(const std::string& input) { std::unique_ptr output( new unsigned char[RSA_size(key_.get())]); int output_length = RSA_private_decrypt(input.length(), StringToBytes(input), output.get(), key_.get(), RSA_PKCS1_OAEP_PADDING); if (output_length <= 0) { return ""; } return std::string(reinterpret_cast(output.get()), output_length); } // *** Certificate *** Certificate::Certificate(RSAKey& key) { cert_.reset(X509_new()); scoped_ptr_openssl_void pkey(EVP_PKEY_new()); EVP_PKEY_set1_RSA(pkey.get(), key.get()); X509_set_pubkey(cert_.get(), pkey.get()); } Certificate::Certificate(const Certificate& other) : cert_(X509_dup(other.cert_.get())) {} bool Certificate::FromPEM(const std::string& pem) { scoped_ptr_openssl_int bio( BIO_new_mem_buf(const_cast(pem.data()), pem.size())); cert_.reset(PEM_read_bio_X509(bio.get(), NULL, NULL, NULL)); return cert_.get() != NULL; } std::string Certificate::ToStringPEM() const { if (cert_.get() == NULL) { return ""; } scoped_ptr_openssl_int bio(BIO_new(BIO_s_mem())); if (!PEM_write_bio_X509(bio.get(), cert_.get())) { return ""; } return BIOToString(bio.get()); } bool Certificate::Verify(const Certificate& candidate) { if (cert_.get() == NULL || candidate.cert_.get() == NULL) { return false; } scoped_ptr_openssl_void pkey( X509_get_pubkey(cert_.get())); return X509_verify(candidate.cert_.get(), pkey.get()); } std::string Certificate::Encrypt(const std::string& input) { scoped_ptr_openssl_void pkey( X509_get_pubkey(cert_.get())); if (!pkey.get()) { GOOGLE_LOG(ERROR) << "Unable to make pkey."; return ""; } if (EVP_PKEY_type(pkey->type) != EVP_PKEY_RSA) { GOOGLE_LOG(ERROR) << "pkey not RSA"; return ""; } scoped_ptr_openssl_void key(EVP_PKEY_get1_RSA(pkey.get())); if (!key.get()) { GOOGLE_LOG(ERROR) << "Unable to get RSA out of pkey."; return ""; } const int rsa_size = RSA_size(key.get()); if (input.length() >= rsa_size - 41) { GOOGLE_LOG(ERROR) << "Input too long for RSA key size."; return ""; } std::unique_ptr output(new unsigned char[rsa_size]); RSA_public_encrypt(input.length(), StringToBytes(input), output.get(), key.get(), RSA_PKCS1_OAEP_PADDING); return std::string(reinterpret_cast(output.get()), rsa_size); } int Certificate::GetSerialNumber() { return ASN1_INTEGER_get(X509_get_serialNumber(cert_.get())); } bool Certificate::VerifySha256(const std::string& input) { SHA256_CTX context; SHA256_Init(&context); SHA256_Update(&context, input.data(), input.length()); unsigned char digest[SHA256_DIGEST_LENGTH]; SHA256_Final(digest, &context); scoped_ptr_openssl_void pkey( X509_get_pubkey(cert_.get())); if (!pkey.get()) { return false; } if (EVP_PKEY_type(pkey->type) != EVP_PKEY_RSA) { return false; } scoped_ptr_openssl_void key(EVP_PKEY_get1_RSA(pkey.get())); return RSA_verify(NID_sha256, digest, SHA256_DIGEST_LENGTH, StringToBytes(input), input.length(), key.get()); } // *** CertificateSR *** CertificateSR::CertificateSR() { request_.reset(X509_REQ_new()); } bool CertificateSR::SetPublicKey(RSAKey* key) { scoped_ptr_openssl_void pkey(EVP_PKEY_new()); EVP_PKEY_set1_RSA(pkey.get(), key->get()); return X509_REQ_set_pubkey(request_.get(), pkey.get()); } bool CertificateSR::SetSubject(const std::string& subject) { scoped_ptr_openssl_void name(X509_NAME_new()); X509_NAME_add_entry_by_NID( name.get(), NID_commonName, MBSTRING_ASC, const_cast(StringToBytes(subject.data())), subject.length(), -1, 0); return X509_REQ_set_subject_name(request_.get(), name.get()); } std::string CertificateSR::ToStringPEM() const { if (request_.get() == NULL) { return ""; } scoped_ptr_openssl_int bio(BIO_new(BIO_s_mem())); if (!PEM_write_bio_X509_REQ(bio.get(), request_.get())) { return ""; } return BIOToString(bio.get()); } bool CertificateSR::Sign(RSAKey* key) { scoped_ptr_openssl_void pkey(EVP_PKEY_new()); EVP_PKEY_set1_RSA(pkey.get(), key->get()); return X509_REQ_sign(request_.get(), pkey.get(), EVP_sha1()); } // *** AES128CBCCipher *** std::string AES128CBCCipher::Encrypt(const std::string& key, const std::string& iv, const std::string& input) { const EVP_CIPHER* cipher = EVP_aes_128_cbc(); if (input.empty() || key.size() != EVP_CIPHER_key_length(cipher) || iv.size() != EVP_CIPHER_iv_length(cipher)) { return ""; } EVP_CIPHER_CTX context; EVP_CIPHER_CTX_init(&context); EVP_EncryptInit_ex(&context, EVP_aes_128_cbc(), NULL, StringToBytes(key), StringToBytes(iv)); EVP_CIPHER_CTX_set_padding(&context, 1); const int max_output_size = input.length() + EVP_CIPHER_block_size(cipher); std::unique_ptr output(new unsigned char[max_output_size]); int update_length; EVP_EncryptUpdate(&context, output.get(), &update_length, StringToBytes(input), input.size()); int final_length; EVP_EncryptFinal_ex(&context, output.get() + update_length, &final_length); EVP_CIPHER_CTX_cleanup(&context); return std::string(reinterpret_cast(output.get()), update_length + final_length); } std::string AES128CBCCipher::Decrypt(const std::string& key, const std::string& iv, const std::string& input) { const EVP_CIPHER* cipher = EVP_aes_128_cbc(); if (input.empty() || key.size() != EVP_CIPHER_key_length(cipher) || iv.size() != EVP_CIPHER_iv_length(cipher)) { return ""; } EVP_CIPHER_CTX context; EVP_CIPHER_CTX_init(&context); EVP_DecryptInit_ex(&context, EVP_aes_128_cbc(), NULL, StringToBytes(key), StringToBytes(iv)); EVP_CIPHER_CTX_set_padding(&context, 1); const int max_output_size = input.length() + EVP_CIPHER_block_size(cipher); std::unique_ptr output(new unsigned char[max_output_size]); int update_length; EVP_DecryptUpdate(&context, output.get(), &update_length, StringToBytes(input), input.size()); int final_length; EVP_DecryptFinal_ex(&context, output.get() + update_length, &final_length); EVP_CIPHER_CTX_cleanup(&context); return std::string(reinterpret_cast(output.get()), update_length + final_length); } // *** CryptoRand *** std::string CryptoRand::RandBytes(int num_bytes) { std::unique_ptr output(new unsigned char[num_bytes]); if (!RAND_bytes(output.get(), num_bytes)) { return ""; } return std::string(reinterpret_cast(output.get()), num_bytes); } uint64 CryptoRand::RandInt64() { unsigned char output[8]; if (!RAND_bytes(output, 8)) { return 0UL; } return *(reinterpret_cast(output)); } } // namespace grr grr-3.1.0.2/grr/client/minicomm/crypto.h000066400000000000000000000124651273104013200200170ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_CRYPTO_H_ #define GRR_CLIENT_MINICOMM_CRYPTO_H_ #include #include "openssl/hmac.h" #include "openssl/md5.h" #include "openssl/pem.h" #include "openssl/rsa.h" #include "openssl/x509.h" #include "grr/client/minicomm/base.h" #include "grr/client/minicomm/scoped_ptr_ssl.h" // Thin C++ wrappers around openssl data structures, providing the limited // functionality required by grr in a C++ friendly format. namespace grr { // Incremental digest computation. class Digest { public: // The types of hash that we support. enum class Type { MD5, SHA1, SHA256 }; // Convenience method to compute a hash in a single step. static std::string Hash(Type t, const std::string& input); // Create an incremental digest state of type t. explicit Digest(Type t); ~Digest(); // Stream limit bytes into the hash from buffer. template void Update(const char(&buffer)[size], size_t limit) { UpdateInternal(buffer, std::min(size, limit)); } // Stream input into the hash. void Update(const std::string& input); // Return the hash of everything added by Update(). std::string Final(); private: void UpdateInternal(const char* buffer, size_t limit); EVP_MD_CTX ctx_; }; // Incremental HMAC computation. class Sha1HMAC { public: explicit Sha1HMAC(const std::string& key); ~Sha1HMAC(); void Update(const std::string& input); std::string Final(); private: HMAC_CTX ctx_; }; // Represents a client's RSA key. class RSAKey { public: RSAKey() {} ~RSAKey() {} // Initialize the key with a newly generated RSA keypair. Returns true on // success. bool Generate(); // Initialize the key from a PEM format string. Returns true on success. bool FromPEM(const std::string& pem); // Attempt to produce a PEM string containing the current key. Returns the // empty string on failure. std::string ToStringPEM() const; // Returns the value n of the public key, in the big endian binary format // produced by the openssl bn2mpi function. std::string PublicKeyN() const; // Produce a signature for the sha256 digest of input. std::string SignSha256(const std::string& input); // Decrypt input using our private key. std::string Decrypt(const std::string& input); // For low level access to the underlying openssl struct. Does not pass // ownership. Returns NULL if we do not have a valid key. RSA* get() { return key_.get(); } RSAKey(RSAKey&& other) = default; RSAKey(const RSAKey& other); void operator=(const RSAKey& other); private: scoped_ptr_openssl_void key_; }; // Represents a X509 certificate. class Certificate { public: // Creates an unsigned certificate containing an RSA public key. Meant for // testing. explicit Certificate(RSAKey& key); Certificate() {} ~Certificate() {} // Initialize the cert from a PEM format string. Returns true on success. bool FromPEM(const std::string& pem); // Attempt to produce a PEM string containing the current cert. Returns the // empty string on failure. std::string ToStringPEM() const; // Verify that candidate has been signed by this. Returns true if verification // succedes. bool Verify(const Certificate& candidate); // Encrypt input using the public key embedded in this cert. // This directly uses the RSA math and allows inputs within the group size. std::string Encrypt(const std::string& input); // Return the serial number embedded in this certificate. int GetSerialNumber(); // Verify the signature of a sha256 digest of the input string. bool VerifySha256(const std::string& input); // For low level access to the underlying openssl struct. Does not pass // ownership. X509* get() { return cert_.get(); } Certificate(Certificate&& other) = default; Certificate(const Certificate& other); void operator=(const Certificate& other) = delete; private: scoped_ptr_openssl_void cert_; }; // Represents a X509 certificate signing request. Used by the client to request // that the server sign the client's key. class CertificateSR { public: CertificateSR(); // Set the request's public key from a client key. bool SetPublicKey(RSAKey* key); // Set the subject name associated with the CSR. bool SetSubject(const std::string& subject); // Sign the request with the client key. bool Sign(RSAKey* key); // Attempt to produce a PEM string containing the current cert. Returns the // empty string on failure. std::string ToStringPEM() const; // For low level access to the underlying openssl struct. Does not pass // ownership. X509_REQ* get() { return request_.get(); } CertificateSR(CertificateSR&& other) = default; CertificateSR(const CertificateSR& other) = delete; void operator=(const CertificateSR& other) = delete; private: scoped_ptr_openssl_void request_; }; class AES128CBCCipher { public: static std::string Encrypt(const std::string& key, const std::string& iv, const std::string& input); static std::string Decrypt(const std::string& key, const std::string& iv, const std::string& input); private: AES128CBCCipher(); }; class CryptoRand { public: static std::string RandBytes(int num_bytes); static uint64 RandInt64(); }; } // namespace grr #endif // GRR_CLIENT_MINICOMM_CRYPTO_H_ grr-3.1.0.2/grr/client/minicomm/crypto_test.cc000066400000000000000000000134371273104013200212140ustar00rootroot00000000000000#include "grr/client/minicomm/crypto.h" #include "gtest/gtest.h" namespace grr { TEST(CryptoTest, DigestSha256) { static const std::string plaintext( "Machines take me by surprise with great frequency"); static const std::string hash( "\xd2\x54\x33\xd0\xd9\x80\xeb\x5d\xc4\x7e\xcd\x71\x74\xa0\x1c\xa4\x41\xad" "\xe6\x46\x08\x35\x07\x4a\x46\x7e\x77\xd9\x83\x43\xc9\x0b", 256 / 8); static const std::string empty_hash( "\xe3\xb0\xc4\x42\x98\xfc\x1c\x14\x9a\xfb\xf4\xc8\x99\x6f\xb9\x24\x27\xae" "\x41\xe4\x64\x9b\x93\x4c\xa4\x95\x99\x1b\x78\x52\xb8\x55", 256 / 8); EXPECT_EQ(Digest::Hash(Digest::Type::SHA256, plaintext), hash); EXPECT_EQ(Digest::Hash(Digest::Type::SHA256, ""), empty_hash); } TEST(CryptoText, HMAC) { static const std::string key("secret"); static const std::string hash( "\x69\x4a\xbd\x10\x84\x2d\x16\x1d\xdb\xc5\x4d\xf8\xa0\xd5\x7c\xf6\x4d\x0d" "\xbc\xc9", 160 / 8); Sha1HMAC hmac(key); hmac.Update("a"); hmac.Update("b"); hmac.Update("c"); EXPECT_EQ(hmac.Final(), hash); static const std::string empty_hash( "\x25\xaf\x61\x74\xa0\xfc\xec\xc4\xd3\x46\x68\x0a\x72\xb7\xce\x64\x4b\x9a" "\x88\xe8", 160 / 8); Sha1HMAC empty_hmac(key); EXPECT_EQ(empty_hmac.Final(), empty_hash); } TEST(CryptoTest, RSAKey) { RSAKey key; EXPECT_FALSE(key.FromPEM("")); EXPECT_FALSE(key.FromPEM("garbage in")); EXPECT_EQ(key.ToStringPEM(), ""); key.Generate(); std::string pem = key.ToStringPEM(); GOOGLE_LOG(INFO) << pem; ASSERT_FALSE(pem.empty()); RSAKey another_key; another_key.Generate(); std::string another_pem = another_key.ToStringPEM(); // Generate function must generate new keys every time. EXPECT_NE(pem, another_pem); RSAKey key2; ASSERT_TRUE(key2.FromPEM(pem)); std::string pem2 = key2.ToStringPEM(); EXPECT_EQ(pem2, pem); std::string signature = key.SignSha256("A message worthy of a John Handcock."); EXPECT_FALSE(signature.empty()); RSAKey key3(key); std::string pem3(key3.ToStringPEM()); EXPECT_EQ(pem3, pem); RSAKey key_copy; key_copy = key; } // TODO(user): Test verify // TODO(user): Test RSAKey::Decrypt const char kPEMString[] = R"( -----BEGIN CERTIFICATE----- MIIGSzCCBDOgAwIBAgIJANuxiXoZSEeoMA0GCSqGSIb3DQEBBQUAMFYxCzAJBgNV BAYTAlVTMRQwEgYDVQQDEwtHUlIgVGVzdCBDQTExMC8GCSqGSIb3DQEJARYic2Vj dXJpdHktaW5jaWRlbnRzLXRlYW1AZ29vZ2xlLmNvbTAeFw0xMTAyMTcxMDEyMTNa Fw0yMTAyMTQxMDEyMTNaMFYxCzAJBgNVBAYTAlVTMRQwEgYDVQQDEwtHUlIgVGVz dCBDQTExMC8GCSqGSIb3DQEJARYic2VjdXJpdHktaW5jaWRlbnRzLXRlYW1AZ29v Z2xlLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFhTdYWwBp8 yU/+jn7ea6ZNPAJByiUxufBLKy8uKLB20VjMBdUmOp9Vo0MN4aoZSNvT1w5zNBmd 09OTG5+XX9FcxND18i5ZlT3ZaHqpUk3Yk7M5xPLQqG8ySwv0iq6j0hIqUe8P40u5 Jf7cLPK4x6bkuzAsHa1YHgCX30Vn/gVIqfn7b0JY0mObAe3OYVNlhwepFgD1LawP 3FdgXhSQDpBuXdE/A+pVwMN0BlGQF8aycWrNQzM0xCxQy2LP+gin6yJjNRYyBGNY pNd6942/zaOH04L6M+10E7w/AsAxrT5nr+dIHZnL+I1odN/ZosesGhsqGaqsXVkl pi5JIu+60Zf6aGXJX461rJloDQR1JGwFvVLGJjV4ug/TyQ3h5PIm3Ef4rZLIpu3s 0quwrIpKKxcH9INk2n3YP8GxV0+wyTTiU67mQarU31gKqEfgwCQTFvr8dZZoZbtC AJTZOGvlpju4w5X0mGwlsL44XKfIpDkexSRZsj6dZuGyfxRpbn71+Ti9jC7KlZBM wvX2Os3yVY/PLGz3VBPB45s2IrR3M33sB4DWtPrU/mWwVOpfX68hSae97qxqLPVN UO6jCayTtitRPK5Wx55MM3xgqspVOmqfX7EwGO40QIPLbwk5XGezXcxdfjdsB4iC YUYwy0Q1YmnnxT4LQIpyu8BpzS0WZIf9AgMBAAGjggEaMIIBFjAdBgNVHQ4EFgQU NH/EbH8MewdxaZzmD8+SEDBxAhIwgYYGA1UdIwR/MH2AFDR/xGx/DHsHcWmc5g/P khAwcQISoVqkWDBWMQswCQYDVQQGEwJVUzEUMBIGA1UEAxMLR1JSIFRlc3QgQ0Ex MTAvBgkqhkiG9w0BCQEWInNlY3VyaXR5LWluY2lkZW50cy10ZWFtQGdvb2dsZS5j b22CCQDbsYl6GUhHqDAPBgNVHRMBAf8EBTADAQH/MBEGCWCGSAGG+EIBAQQEAwIB BjAJBgNVHRIEAjAAMC0GA1UdEQQmMCSBInNlY3VyaXR5LWluY2lkZW50cy10ZWFt QGdvb2dsZS5jb20wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4ICAQBv aC5mlaYxaYa0A/mfnWl2jiRw2oOAPmSTiOeaD+ifT130VO4Z41Td/nw3UHaxvvxy g062EkVVpUNnbR3VdZKmeEcrL894vmWjDxSrX6a6ryxj/oio5JXetrGEz/073TOO eNgsbFu14qg4BQ/w2POvtT8trYdLsKVcAXvyIqLkbi9E86TsMFaR1x5QtlTwQu6H lSxVAXp+w9qmKC8mCt/075JB673YxWI0xvsltOmECCk24oWYWtuLNX++ky0MmIJe z/NfrM3ilG8DlI+RlLBm4sQhNV4W7GptYUBq95RSf1WTCPLpIgNLjzGhNWZDhe56 XZqymiwNhJwBmHwZf9B5joigACOKgs3CkWpwu3S57mR9XEfDJynJi8kZEL1QgVU/ 87irCllMm/g0DqygEe+4eGEUH6YRfz34ATL/grT+1iFCg2nVOQ7ougJf8ACB4T2O /bXEzcPGCOTvAO5qM+vNzsvPTqgfpBZ8vYJVN0zfSyj79JlVcnswt4VRUu8m4FHi nuxV6Jjx7uKOUpyyKJQn9qCtFSUGqs1nj8ZmcSHR1epKOqFYdNB2MFEkVnLhi7a5 rGpa2OCau5VObCfY25ldCr0lAa2HiJjbIjA1upxho6/TBtaV6E01ez9c5WI4uo+U ZApQ9jiqXUt8XvHtAM1rWXECV6beFXpZbqKmbQ+yxg== -----END CERTIFICATE-----)"; TEST(CryptoTest, CertificateFromPEM) { Certificate cert; ASSERT_TRUE(cert.FromPEM(kPEMString)); EXPECT_FALSE(cert.Encrypt("A key.").empty()); Certificate cert2(cert); EXPECT_FALSE(cert2.Encrypt("A key.").empty()); } TEST(CryptoTest, CertificateFromRSA) { RSAKey rsa_key; rsa_key.Generate(); Certificate cert(rsa_key); EXPECT_FALSE(cert.ToStringPEM().empty()); static const std::string kSecret = "secret"; // TODO(user): Refactor the code to make it clear from // its types whether an RSAKey contains a private key or not. // Add appropriate testcases making sure we don't expose private // keys in unexpected ways - here we need to make sure the cert // doesn't contain any private key info. EXPECT_EQ(rsa_key.Decrypt(cert.Encrypt(kSecret)), kSecret); } TEST(CryptoTest, AES128CBCCipher) { std::string key("abcdefghijklmnopqrst", 16); std::string iv("tsrqponmlkjihgfedcba", 16); const std::string test_string( "The quick brown fox jumped over the lazy dogs."); const std::string encrypted = AES128CBCCipher::Encrypt(key, iv, test_string); ASSERT_FALSE(encrypted.empty()); const std::string decrypted = AES128CBCCipher::Decrypt(key, iv, encrypted); EXPECT_EQ(test_string, decrypted); } TEST(CryptoTest, CryptoRand) { std::string bytes = CryptoRand::RandBytes(32); EXPECT_EQ(bytes.length(), 32); const uint64 r = CryptoRand::RandInt64(); EXPECT_NE(r, 0UL); } } // namespace grr grr-3.1.0.2/grr/client/minicomm/file_contents.cc000066400000000000000000000013771273104013200214710ustar00rootroot00000000000000#include "grr/client/minicomm/file_contents.h" namespace grr { std::shared_ptr FileContents::GetBlock(int index) { std::shared_ptr r; if (index < 0 || index >= blocks_.size()) { return r; } r = blocks_[index].lock(); if (r != nullptr) { return std::move(r); } r.reset(new Block()); fd_->Seek(static_cast(index) * static_cast(kBlockSize), &error_); size_t bytes_read = 0; fd_->Read(r->data, fd_->size() - index * kBlockSize, &bytes_read, &error_); if (bytes_read < kBlockSize) { memset(&r->data[bytes_read], '\0', kBlockSize - bytes_read); } blocks_[index] = r; recent_blocks_[recent_block_index_++ % kNumRecentBlocks] = r; return std::move(r); } } // namespace grr grr-3.1.0.2/grr/client/minicomm/file_contents.h000066400000000000000000000156051273104013200213320ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_FILE_CONTENTS_H_ #define GRR_CLIENT_MINICOMM_FILE_CONTENTS_H_ #include #include #include "grr/client/minicomm/file_operations.h" namespace grr { class FileContentsIterator; // Provides read only random access to the contends of fd. The observed size // is fixed during the constructor. If the file is truncated after construction, // the missing bytes will be seen as having zero value. class FileContents { public: explicit FileContents(OpenedPath* fd) : error_(""), fd_(fd), blocks_(fd_->size() / kBlockSize + ((fd_->size() % kBlockSize) ? 1 : 0)), recent_block_index_(0) {} // These iterators, and their derivatives are use *this for backing and are // unsafe once *this is deleted. FileContentsIterator begin(); FileContentsIterator end(); private: // Used to read the file: std::string error_; OpenedPath* const fd_; // A power of 2. Expressions like n/kBlockSize and n%kBlockSize will be // optimized into bit shifts and masks. static constexpr size_t kBlockSize = 64 * 1024; struct Block { char data[kBlockSize]; }; // Find or load a block. Will return nullptr if index is >= blocks_.size(). std::shared_ptr GetBlock(int index); // A directory of blocks. Pre-allocated to store a (possibly empty) reference // to every block. std::vector> blocks_; // If we have an iterator to a block, it will stay loaded. In addition we // always keep the last 4 blocks that we've loaded. This is to minimize the // chance of thrashing if an iterator moves back and forth repeatedly across a // block boundary. static constexpr int kNumRecentBlocks = 4; unsigned int recent_block_index_; std::shared_ptr recent_blocks_[kNumRecentBlocks]; friend class FileContentsIterator; }; // Random access iterator over the contents of a file. This is meant an // alternative to a pointer to a memmapped file with the following two // advantages: // 1) Does not crash if the file is truncated after creation. // 2) Can read large files on 32 bit systems. class FileContentsIterator : public std::iterator { private: public: FileContentsIterator(difference_type offset, FileContents* contents) : contents_(contents) { GOOGLE_DCHECK(offset <= contents->fd_->size()); block_offset_ = offset % kBlockSize; block_index_ = offset / kBlockSize; data_ = contents->GetBlock(block_index_); } FileContentsIterator() : contents_(nullptr) {} inline difference_type FileOffset() const { return block_offset_ + block_index_ * FileContents::kBlockSize; } FileContentsIterator(const FileContentsIterator&) = default; FileContentsIterator(FileContentsIterator&&) = default; FileContentsIterator& operator=(const FileContentsIterator&) = default; FileContentsIterator& operator=(FileContentsIterator&&) = default; FileContentsIterator& operator++() { if (block_offset_ < kBlockSize - 1) { block_offset_ += 1; return *this; } block_offset_ = 0; block_index_ += 1; data_ = contents_->GetBlock(block_index_); return *this; } FileContentsIterator operator++(int) { FileContentsIterator r = *this; ++(*this); return r; } FileContentsIterator& operator+=(difference_type n) { if (n == 0) { return *this; } difference_type n_offset = block_offset_ + n; if (IsValidBlockOffset(n_offset)) { block_offset_ = n_offset; return *this; } const difference_type current_offset = FileOffset(); GOOGLE_DCHECK(n > 0 || -n <= current_offset); const difference_type new_offset = current_offset + n; *this = FileContentsIterator(new_offset, contents_); return *this; } FileContentsIterator& operator-=(difference_type n) { return * this += -n; } FileContentsIterator operator+(difference_type n) const { FileContentsIterator r(*this); r += n; return r; } friend FileContentsIterator operator+(difference_type n, const FileContentsIterator& rhs) { return rhs + n; } FileContentsIterator operator-(difference_type n) { FileContentsIterator r(*this); r += -n; return r; } difference_type operator-(const FileContentsIterator& rhs) { return FileOffset() - rhs.FileOffset(); } FileContentsIterator& operator--() { if (block_offset_ > 0) { block_offset_ -= 1; return *this; } GOOGLE_DCHECK(block_index_ > 0); block_offset_ = kBlockSize - 1; block_index_ -= 1; data_ = contents_->GetBlock(block_index_); return *this; } FileContentsIterator operator--(int) { FileContentsIterator r = *this; --(*this); return r; } char operator*() const { GOOGLE_DCHECK(IsValidBlockOffset(block_offset_)); GOOGLE_DCHECK(data_ != nullptr); return data_->data[block_offset_]; } char operator[](difference_type n) const { const difference_type n_offset = block_offset_ + n; if (IsValidBlockOffset(n_offset)) { return data_->data[n_offset]; } return *FileContentsIterator(FileOffset() + n, contents_); } bool operator==(const FileContentsIterator& rhs) const { GOOGLE_DCHECK(contents_ == rhs.contents_); return block_offset_ == rhs.block_offset_ && block_index_ == rhs.block_index_; } bool operator!=(const FileContentsIterator& rhs) const { GOOGLE_DCHECK(contents_ == rhs.contents_); return block_offset_ != rhs.block_offset_ || block_index_ != rhs.block_index_; } bool operator<(const FileContentsIterator& rhs) const { GOOGLE_DCHECK(contents_ == rhs.contents_); return block_index_ < rhs.block_index_ || (block_index_ == rhs.block_index_ && block_offset_ < rhs.block_offset_); } bool operator>(const FileContentsIterator& rhs) const { return rhs < *this; } bool operator<=(const FileContentsIterator& rhs) const { return block_index_ < rhs.block_index_ || (block_index_ == rhs.block_index_ && block_offset_ <= rhs.block_offset_); } bool operator>=(const FileContentsIterator& rhs) const { return rhs <= *this; } const char* operator->() const { GOOGLE_DCHECK(IsValidBlockOffset(block_offset_)); GOOGLE_DCHECK(data_ != nullptr); return &data_->data[block_offset_]; } private: static constexpr size_t kBlockSize = FileContents::kBlockSize; typedef FileContents::Block Block; static inline bool IsValidBlockOffset(difference_type offset) { return offset >= 0 && offset < kBlockSize; } int block_offset_; int block_index_; std::shared_ptr data_; FileContents* contents_; }; inline FileContentsIterator FileContents::begin() { return FileContentsIterator(0, this); } inline FileContentsIterator FileContents::end() { return FileContentsIterator(fd_->size(), this); } } // namespace grr #endif // GRR_CLIENT_MINICOMM_FILE_CONTENTS_H_ grr-3.1.0.2/grr/client/minicomm/file_contents_test.cc000066400000000000000000000103471273104013200225250ustar00rootroot00000000000000#include "grr/client/minicomm/file_contents.h" #include #include "gtest/gtest.h" #include "grr/client/minicomm/test_util.h" #include "boost/regex.hpp" namespace grr { TEST(FileContents, SmallFile) { const std::string temp_dir = testing::MakeTempDir(); const std::string file_name = temp_dir + "/file_name"; std::ofstream file; static const char kSentance[] = "The quick sly fox jumped over the lazy dogs."; file.open(file_name); file << kSentance; file.close(); auto opened_file = OpenedPath::Open(file_name, nullptr); ASSERT_TRUE(opened_file != nullptr); FileContents c = FileContents(opened_file.get()); FileContentsIterator i = c.begin(); const FileContentsIterator end = c.end(); i = c.begin(); EXPECT_EQ('T', i[0]); EXPECT_EQ('e', i[2]); EXPECT_EQ('x', i[16]); EXPECT_EQ('T', *i); EXPECT_EQ('T', *i++); EXPECT_EQ('h', *i); EXPECT_EQ('e', *++i); EXPECT_EQ('e', *i); EXPECT_EQ('e', *i--); EXPECT_EQ('h', *i); EXPECT_EQ('T', *--i); EXPECT_EQ('T', *i); EXPECT_EQ('s', (i+10)[0]); EXPECT_TRUE(i+10 == (i+13)-3); std::string sentance_copy; sentance_copy.reserve(sizeof(kSentance)); while (i != end) { sentance_copy.append(1, *i++); } EXPECT_EQ('.', i[-1]); EXPECT_EQ('s', i[-2]); EXPECT_EQ(kSentance, sentance_copy); EXPECT_EQ(sizeof(kSentance) - 1, c.end() - c.begin()); } TEST(FileContents, LargeFile) { const std::string temp_dir = testing::MakeTempDir(); const std::string file_name = temp_dir + "/haystack"; const std::string kHay("hay"); const int kHalfStack = 128 * 1024 / 3; const std::string kNeedle("needle"); std::ofstream file; file.open(file_name); // This should put needle across the boundary of blocks 2 and 3. for (int i = 0; i < kHalfStack; i++) { file << kHay; } file << kNeedle; for (int i = 0; i < kHalfStack; i++) { file << kHay; } file << kNeedle; file.close(); auto opened_file = OpenedPath::Open(file_name, nullptr); ASSERT_TRUE(opened_file != nullptr); FileContents c = FileContents(opened_file.get()); auto found = std::search(c.begin(), c.end(), kNeedle.begin(), kNeedle.end()); ASSERT_TRUE(found != c.end()); for (int i = 0; i < kNeedle.size(); i++) { EXPECT_EQ(kNeedle[i], *found++); } // Look for a needle surrounded by hay, in a way that is likely to move // iterators forwards and backwards.. boost::regex pattern( "(?<=hay)ne[eE][Dd]le(?=hay)", (boost::regex_constants::ECMAScript | boost::regex_constants::no_except)); ASSERT_FALSE(pattern.status()); typedef boost::regex_iterator regex_iterator; std::vector results; for (auto i = regex_iterator(c.begin(), c.end(), pattern); i != regex_iterator(); ++i) { auto& m = *i; results.emplace_back(std::string(m[0].first, m[0].second)); } ASSERT_EQ(results.size(), 1); EXPECT_EQ(results[0], "needle"); // Count our hay. boost::regex hay_pattern("h.y"); int hay_count = 0; for (auto i = regex_iterator(c.begin(), c.end(), hay_pattern); i != regex_iterator(); ++i) { hay_count += 1; } EXPECT_EQ(hay_count, 2 * kHalfStack); // This overflows, but should fail with a controlled exception, not with a // hard crash. boost::regex big_pattern("(hay)*needle(hay)*"); ASSERT_THROW(regex_match(c.begin(), c.end(), big_pattern), std::runtime_error); } TEST(FileContents, TruncateFile) { const std::string temp_dir = testing::MakeTempDir(); const std::string file_name = temp_dir + "/haystack"; const std::string kHay("hay"); std::ofstream file; file.open(file_name); for (int i = 0; i < 64 * 1024; i++) { file << kHay; } file.close(); auto opened_file = OpenedPath::Open(file_name, nullptr); ASSERT_TRUE(opened_file != nullptr); FileContents c = FileContents(opened_file.get()); // Our view of the file is now locked to 3 blocks of 64k, based on the initial // stat. If the underlying file is now resized, we see zero valued bytes where // the file isn't. ASSERT_EQ(0, truncate(file_name.c_str(), 3)); EXPECT_EQ(c.begin()[0], 'h'); EXPECT_EQ(c.begin()[1], 'a'); EXPECT_EQ(c.begin()[2], 'y'); EXPECT_EQ(c.begin()[3], '\0'); EXPECT_EQ(c.begin()[2 * 64 * 1024], '\0'); EXPECT_EQ(*--c.end(), '\0'); } } // namespace grr grr-3.1.0.2/grr/client/minicomm/file_operations.cc000066400000000000000000000101751273104013200220130ustar00rootroot00000000000000#include "grr/client/minicomm/file_operations.h" #include #include #include #include #include #include #include #include "grr/client/minicomm/util.h" #pragma pop_macro("st_atime") #pragma pop_macro("st_ctime") #pragma pop_macro("st_mtime") #ifdef ANDROID #include std::string to_string(off64_t t) { std::ostringstream os; os << t; return os.str(); } #else using std::to_string; #endif namespace grr { OpenedPath::~OpenedPath() { if (fd_ != -1) { int result = close(fd_); if (result == -1) { GOOGLE_LOG(ERROR) << "Unable to close fd: " + ErrorName(errno); } } } namespace { void SetError(const std::string& prefix, std::string* error) { if (error != nullptr) { *error = prefix + ": " + ErrorName(errno); } } } // namespace std::unique_ptr OpenedPath::Open(const std::string& path, std::string* error) { std::unique_ptr ret; const int fd = open(path.c_str(), O_RDONLY | O_NONBLOCK | O_LARGEFILE | O_CLOEXEC); if (fd == -1) { SetError("Unable to open [" + path + "]", error); return ret; } ret.reset(new OpenedPath(path, fd)); const int stat_res = fstat64(fd, &ret->stat_); if (stat_res == -1) { SetError("Unable to stat [" + path + "]", error); ret.reset(nullptr); return ret; } if (ret->is_regular()) { const int fcntl_res = fcntl(fd, F_SETFD, O_NOATIME); if (fcntl_res == -1) { SetError("Unable to set noatime on regular file [" + path + "]", error); ret.reset(nullptr); return ret; } } return ret; } bool OpenedPath::Seek(uint64 offset, std::string* error) { const off64_t res = lseek64(fd_, offset, SEEK_SET); if (res == (off64_t)-1) { SetError("Unable to seek to [" + path_ + "] to [" + to_string(offset) + "]", error); return false; } return true; } uint64 OpenedPath::size() const { return stat_.st_size; } bool OpenedPath::ReadInternal(char* buffer, size_t buffer_size, size_t* bytes_read, std::string* error) { const ssize_t result = read(fd_, buffer, buffer_size); if (result == -1) { SetError("Unable to read [" + path_ + "]", error); return false; } *bytes_read = result; return true; } StatEntry OpenedPath::Stats() const { StatEntry stat_entry; stat_entry.set_st_mode(stat_.st_mode); stat_entry.set_st_ino(stat_.st_ino); stat_entry.set_st_dev(stat_.st_dev); stat_entry.set_st_nlink(stat_.st_nlink); stat_entry.set_st_uid(stat_.st_uid); stat_entry.set_st_gid(stat_.st_gid); stat_entry.set_st_size(stat_.st_size); stat_entry.set_st_atime(stat_.st_atime); stat_entry.set_st_mtime(stat_.st_mtime); stat_entry.set_st_ctime(stat_.st_ctime); stat_entry.set_st_blocks(stat_.st_blocks); stat_entry.set_st_blksize(stat_.st_blksize); stat_entry.set_st_rdev(stat_.st_rdev); return stat_entry; } bool OpenedPath::ReadDirectory(std::unique_ptr path, OpenedPath::Directory* result, std::string* error) { DIR* dir = fdopendir(path->fd_); if (dir == nullptr) { SetError("Unable to open as directory", error); return false; } errno = 0; while (struct dirent* ent = readdir(dir)) { FileType type; switch (ent->d_type) { case DT_BLK: case DT_REG: type = FileType::NORMAL; break; case DT_CHR: case DT_FIFO: type = FileType::STREAM; break; case DT_DIR: type = FileType::DIRECTORY; break; case DT_LNK: type = FileType::SYM_LINK; break; default: type = FileType::UNKNOWN; } (*result)[ArrayToString(ent->d_name)] = type; } if (errno) { SetError("Failure reading as directory [" + path->path_ + "]", error); closedir(dir); return false; } const int res = closedir(dir); if (res == -1) { SetError("Failure closing directory [" + path->path_ + "]", error); return false; } // closedir closed fd_, so ~OpenedPath doesn't need to. path->fd_ = -1; return true; } } // namespace grr grr-3.1.0.2/grr/client/minicomm/file_operations.h000066400000000000000000000067111273104013200216560ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_FILE_OPERATIONS_H_ #define GRR_CLIENT_MINICOMM_FILE_OPERATIONS_H_ #include // On linux, sys/stat.h defines these as macros, which conflict with the // StatEntry protocol buffer. We stash the definitions, because they are needed // to actually read the fields in question from a struct stat. #pragma push_macro("st_atime") #pragma push_macro("st_ctime") #pragma push_macro("st_mtime") #undef st_atime #undef st_ctime #undef st_mtime #include #include #include "grr/proto/jobs.pb.h" #include "grr/client/minicomm/base.h" namespace grr { // Attempts to determine if path is a symlink. On success, returns true an sets // *result to its target, or the empty string if it is not a symlink. On // failure, returns false and sets *error. static bool ReadLink(const std::string& path, std::string* target, std::string* error); // Represents a file or directory which has been opened. class OpenedPath { public: ~OpenedPath(); // Attempt to open and stat path. Will follow symlinks. On success, it returns // an object representing path. On failure it returns nullptr and sets *error. static std::unique_ptr Open(const std::string& path, std::string* error); // The stats we found during OpenPath. StatEntry Stats() const; // The size of the file contents. uint64 size() const; // The exact path which was opened. const std::string& Path() const { return path_; } bool is_directory() const { return S_ISDIR(stat_.st_mode); } bool is_regular() const { return S_ISREG(stat_.st_mode); } /*** File handling. ***/ // Attempt to seek the underlying file descriptor to offset bytes from the // start of the file. If unsuccessful, returns false and sets *error. bool Seek(uint64 offset, std::string* error); // Attempts to read into buffer. On success returns true and sets bytes_read // to the number of bytes read. If at EOF, returns true with 0 bytes read. In // case of any other failure, returns false and sets *error. template bool Read(char(&buffer)[size], size_t* bytes_read, std::string* error) { return ReadInternal(buffer, size, bytes_read, error); } // Attempts to read up to limit bytes into buffer. On success returns true and // sets bytes_read to the number of bytes read. If at EOF, returns true with 0 // bytes read. In case of any other failure, returns false and sets *error. template bool Read(char(&buffer)[size], size_t limit, size_t* bytes_read, std::string* error) { return ReadInternal(buffer, std::min(size, limit), bytes_read, error); } /*** Directory handling ***/ enum class FileType { NORMAL, STREAM, DIRECTORY, SYM_LINK, UNKNOWN }; // A map from filename to filetype. typedef std::map Directory; // Attempt to read path as a directory. On success, returns true and populates // *dir. On failure, returns false and sets *error. Closes and deletes path. static bool ReadDirectory(std::unique_ptr path, Directory* dir, std::string* error); private: OpenedPath(const std::string& path, int fd) : path_(path), fd_(fd) {} const std::string path_; int fd_; struct stat64 stat_; bool ReadInternal(char* buffer, size_t buffer_size, size_t* bytes_read, std::string* error); }; } // namespace grr #endif // GRR_CLIENT_MINICOMM_FILE_OPERATIONS_H_ grr-3.1.0.2/grr/client/minicomm/file_operations_test.cc000066400000000000000000000100461273104013200230470ustar00rootroot00000000000000#include "grr/client/minicomm/file_operations.h" #include #include #include "gtest/gtest.h" #include "grr/client/minicomm/test_util.h" namespace grr { namespace { void WriteFile(const std::string& filename, const std::string& contents) { std::ofstream file; file.open(filename); file << contents; file.close(); } std::string UpperString(const std::string& s) { std::string r(s); std::transform(r.begin(), r.end(), r.begin(), ::toupper); } } // namespace TEST(FileOperations, ReadDirectory) { const std::string temp_dir = testing::MakeTempDir(); const std::string file1 = temp_dir + "/file1"; WriteFile(file1, "File 1 contents."); const std::string file2 = temp_dir + "/file2"; WriteFile(file2, "File 2 contents."); ASSERT_EQ(mkdir((temp_dir + "/subdir").c_str(), S_IRWXU), 0); std::string error; auto result = OpenedPath::Open(temp_dir, &error); ASSERT_TRUE(result != nullptr) << error; ASSERT_TRUE(result->is_directory()); ASSERT_FALSE(result->is_regular()); OpenedPath::Directory files; EXPECT_TRUE(OpenedPath::ReadDirectory(std::move(result), &files, &error)) << error; typedef OpenedPath::FileType Type; ASSERT_EQ(files.size(), 5); // ".", ".." + 3 EXPECT_EQ(files["."], Type::DIRECTORY); EXPECT_EQ(files["file1"], Type::NORMAL); EXPECT_EQ(files["subdir"], Type::DIRECTORY); } TEST(FileOperations, Open) { const std::string temp_dir = testing::MakeTempDir(); const std::string file = temp_dir + "/file"; const std::string kFileContents("File contents."); WriteFile(file, kFileContents); const std::string subdir = temp_dir + "/subdir"; ASSERT_EQ(mkdir(subdir.c_str(), S_IRWXU), 0); // Opening a nonexistant path should fail. std::string error = ""; EXPECT_EQ(OpenedPath::Open(temp_dir + "/missing_file", &error), nullptr); EXPECT_NE(error, ""); // Open, stat should work. auto res = OpenedPath::Open(file, &error); ASSERT_NE(res, nullptr); EXPECT_TRUE(res->is_regular()); EXPECT_FALSE(res->is_directory()); StatEntry stat_result = res->Stats(); EXPECT_EQ(stat_result.st_size(), kFileContents.size()); } TEST(FileOperations, BadSeek) { const std::string temp_dir = testing::MakeTempDir(); auto res = OpenedPath::Open(temp_dir, nullptr); ASSERT_NE(res, nullptr); std::string error; EXPECT_FALSE(res->Seek(-42, &error)); GOOGLE_LOG(INFO) << error; } TEST(FileOperations, ReadSeek) { const std::string temp_dir = testing::MakeTempDir(); const std::string file = temp_dir + "/file"; const std::string kFileContents = "Start67890" + std::string(1500, 'F') + "Middle7890" + std::string(1500, 'S') + "End4567890"; WriteFile(file, kFileContents); std::string error; auto opened_file = OpenedPath::Open(file, &error); ASSERT_NE(opened_file, nullptr); // Start by reading into a buffer larger than the file. char large_buf[4096]; size_t bytes_read; EXPECT_TRUE(opened_file->Read(large_buf, &bytes_read, &error)); EXPECT_EQ(std::string(large_buf, bytes_read), kFileContents); // Now read it in smaller chunks. EXPECT_TRUE(opened_file->Seek(0, &error)); std::string result; result.reserve(kFileContents.size()); bytes_read = -1; char small_buf[64]; while (bytes_read != 0) { ASSERT_TRUE(opened_file->Read(small_buf, &bytes_read, &error)); result += std::string(small_buf, bytes_read); } EXPECT_EQ(result, kFileContents); // Now read the first part into a larger buffer. EXPECT_TRUE(opened_file->Seek(0, &error)); EXPECT_TRUE(opened_file->Read(large_buf, 500, &bytes_read, &error)); EXPECT_EQ(std::string(large_buf, bytes_read), kFileContents.substr(0, 500)); // Seek to and read a small segment from the middle. EXPECT_TRUE(opened_file->Seek(1510, &error)); EXPECT_TRUE(opened_file->Read(small_buf, 10, &bytes_read, &error)); EXPECT_EQ(std::string(small_buf, bytes_read), "Middle7890"); // Buffer size is a hard limit on bytes read. EXPECT_TRUE(opened_file->Read(small_buf, 128, &bytes_read, &error)); EXPECT_EQ(bytes_read, 64); } } // namespace grr grr-3.1.0.2/grr/client/minicomm/grr_test_main.cc000066400000000000000000000004711273104013200214640ustar00rootroot00000000000000#include "google/protobuf/stubs/common.h" #include "gtest/gtest.h" #include "grr/client/minicomm/logging_control.h" int main(int argc, char **argv) { grr::LogControl::Initialize(); testing::InitGoogleTest(&argc, argv); int r = RUN_ALL_TESTS(); google::protobuf::ShutdownProtobufLibrary(); return r; } grr-3.1.0.2/grr/client/minicomm/http_connection.cc000066400000000000000000000200211273104013200220160ustar00rootroot00000000000000#include "grr/client/minicomm/http_connection.h" #include #include #include #include #include #include #include #include #include #include #include #include "curl/curl.h" #include "grr/client/minicomm/comms_utils.h" #include "grr/client/minicomm/crypto.h" #include "grr/client/minicomm/resource_monitor.h" #include "grr/client/minicomm/util.h" #include "grr/proto/jobs.pb.h" namespace grr { namespace { struct HttpResponse { long http_response_code; std::string headers; std::string body; }; size_t write_ostringstream(char* ptr, size_t size, size_t nmemb, void* userdata) { *reinterpret_cast(userdata) << std::string(ptr, size * nmemb); return size * nmemb; } // Make a request to url. If proxy is non-empty, use it as a proxy server. // If post_data is non-empty, make a post request. HttpResponse RequestURL(const std::string& url, const std::string& proxy, const std::string& post_data) { std::ostringstream headers; std::ostringstream body; struct curl_slist* added_headers = NULL; added_headers = curl_slist_append(added_headers, "Cache-Control: no-cache"); CURL* curl_handle = curl_easy_init(); curl_easy_setopt(curl_handle, CURLOPT_URL, url.c_str()); if (!proxy.empty()) { curl_easy_setopt(curl_handle, CURLOPT_PROXY, proxy.c_str()); } if (!post_data.empty()) { curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDSIZE, post_data.length()); curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, post_data.data()); added_headers = curl_slist_append(added_headers, "Content-Type: binary/octet-stream"); } curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_ostringstream); curl_easy_setopt(curl_handle, CURLOPT_HEADERDATA, &headers); curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, &body); curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L); curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, added_headers); curl_easy_perform(curl_handle); HttpResponse response; curl_easy_getinfo(curl_handle, CURLINFO_RESPONSE_CODE, &response.http_response_code); response.headers = headers.str(); response.body = body.str(); curl_easy_cleanup(curl_handle); curl_slist_free_all(added_headers); return response; } } // namespace void HttpConnectionManager::StaticInit() { curl_global_init(CURL_GLOBAL_DEFAULT); } HttpConnectionManager::HttpConnectionManager(ClientConfig* config, MessageQueue* inbox, MessageQueue* outbox) : last_enrollment_(std::chrono::system_clock::now() - std::chrono::hours()), config_(config), inbox_(inbox), outbox_(outbox) {} HttpConnectionManager::~HttpConnectionManager() {} class HttpConnectionManager::Connection { public: Connection(const std::string& client_id, RSAKey our_key, std::unique_ptr target_cert_, const std::string& url, const std::string& proxy) : our_key_(our_key), secure_session_(client_id, &our_key_, std::move(target_cert_)), url_(url), proxy_(proxy) {} SecureSession& secure_session() { return secure_session_; } const std::string& url() { return url_; } const std::string& proxy() { return proxy_; } private: RSAKey our_key_; SecureSession secure_session_; const std::string url_; const std::string proxy_; }; HttpConnectionManager::Connection* HttpConnectionManager::TryEstablishConnection() { GOOGLE_LOG(INFO) << "Trying to make a connection."; std::vector control_urls(config_->ControlUrls()); std::vector proxy_servers(config_->ProxyServers()); // Also try direct connection. proxy_servers.push_back(""); for (const std::string& url : control_urls) { for (const std::string& proxy : proxy_servers) { const HttpResponse r = RequestURL(UrlDirname(url) + "/server.pem", proxy, ""); if (r.http_response_code != 200L) { return nullptr; } const std::string& server_pem = r.body; if (server_pem.find("BEGIN CERTIFICATE") == std::string::npos) { return nullptr; } std::unique_ptr cert(new Certificate()); if (!cert->FromPEM(server_pem)) { return nullptr; } if (!config_->ca_cert().Verify(*cert.get())) { return nullptr; } RSAKey my_key(config_->key()); GOOGLE_LOG(INFO) << "Connection established to: " << url; return new Connection(config_->ClientId(), config_->key(), std::move(cert), url, proxy); } } return nullptr; } void HttpConnectionManager::Run() { bool failed = false; int no_activity_count = 0; // Messages that we've removed from the queue, but haven't yet managed to send // to the server. std::vector to_send; NonceGenerator nonce_gen; NetworkResourceMonitor network; HardwareResourceMonitor hardware(outbox_); while (true) { // If the last try was a failure, wait 5 seconds before retrying. Otherwise // wait depending on how long it has been since there was some activity. if (failed) { std::this_thread::sleep_for(std::chrono::seconds(5)); } else { const int delay_millis = std::min( 600000, static_cast(1000 * 0.2 * pow(1.05, no_activity_count))); std::this_thread::sleep_for(std::chrono::milliseconds(delay_millis)); } // Loop until we manage to create a connection. while (current_connection_.get() == nullptr) { current_connection_.reset(TryEstablishConnection()); std::this_thread::sleep_for(std::chrono::seconds(1)); } failed = false; // If we already have some messages to send, just send them. if (to_send.empty()) { to_send = outbox_->GetMessages(1000, 1000000, false); } if (network.WaitToSend(to_send) == false) { // In case too much outgoing bandwidth would be used, drop the packet. // TODO(user): Save network packet and send it later. to_send.clear(); continue; } const uint64 nonce = nonce_gen.Generate(); HttpResponse response = RequestURL(current_connection_->url() + "?api=3", current_connection_->proxy(), current_connection_->secure_session() .EncodeMessages(to_send, nonce) .SerializeAsString()); if (response.http_response_code == 406) { if ((std::chrono::system_clock::now() - last_enrollment_) > 10 * std::chrono::minutes()) { GOOGLE_LOG(INFO) << "Initiating enrollment!"; MessageBuilder::InitiateEnrollment(config_, outbox_); last_enrollment_ = std::chrono::system_clock::now(); } failed = true; continue; } if (response.http_response_code != 200) { failed = true; continue; } hardware.ClientEnrolled(); // Notify hardware resource monitor that the // client has successfully enrolled. if (to_send.size()) { // We succeeded in sending to_send. GOOGLE_LOG(INFO) << "Sent " << to_send.size() << " messages."; } to_send.clear(); ClientCommunication result; if (!result.ParseFromString(response.body)) { failed = true; continue; } std::vector messages; if (!current_connection_->secure_session().DecodeMessages(result, &messages, nonce)) { GOOGLE_LOG(ERROR) << "Failed to decode response."; failed = true; continue; } if (messages.size()) { GOOGLE_LOG(INFO) << "Decoded response with " << messages.size() << " messages."; } if (messages.size() == 0 && to_send.size() == 0) { no_activity_count += 1; } else { no_activity_count = 0; } for (const auto& m : messages) { inbox_->AddMessage(m); } } } } // namespace grr grr-3.1.0.2/grr/client/minicomm/http_connection.h000066400000000000000000000024351273104013200216710ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_HTTP_CONNECTION_H_ #define GRR_CLIENT_MINICOMM_HTTP_CONNECTION_H_ #include #include #include "grr/client/minicomm/base.h" #include "grr/client/minicomm/comms_utils.h" #include "grr/client/minicomm/config.h" #include "grr/client/minicomm/message_queue.h" namespace grr { class HttpConnectionManager { public: // Performs necessary static initialization. Must be called before // any threads are spawned. static void StaticInit(); // Creates an http connection manager which uses the information in config to // connect to a server. Received messages are added to inbox. Messages are // removed from outbox and passed to the server. HttpConnectionManager(ClientConfig* config, MessageQueue* inbox, MessageQueue* outbox); ~HttpConnectionManager(); // Enters an event loop to read and write messages to the server. Does not // normally return. void Run(); private: class Connection; friend class Connection; Connection* TryEstablishConnection(); std::chrono::system_clock::time_point last_enrollment_; std::unique_ptr current_connection_; ClientConfig* config_; MessageQueue* inbox_; MessageQueue* outbox_; }; } // namespace grr #endif // GRR_CLIENT_MINICOMM_HTTP_CONNECTION_H_ grr-3.1.0.2/grr/client/minicomm/logging_control.cc000066400000000000000000000053351273104013200220210ustar00rootroot00000000000000#include "grr/client/minicomm/logging_control.h" #include #ifdef ANDROID #include #endif #include #include #include #include using google::protobuf::LogHandler; namespace grr { namespace { using namespace std::chrono; class DefaultLogSink : public LogSink { public: void Log(LogLevel level, const char* filename, int line, const std::string& message) override { const auto current_time = system_clock::now(); const time_t current_time_t = system_clock::to_time_t(current_time); struct tm time; gmtime_r(¤t_time_t, &time); const int usec = duration_cast(current_time.time_since_epoch()).count() % 1000000; static const char level_names[] = {'I', 'W', 'E', 'F'}; #ifdef ANDROID __android_log_print(ANDROID_LOG_DEBUG, "LOG_GRR", "[%c %02d.%02d %02d:%02d:%02d.%06d %s:%d] %s\n", level_names[level], time.tm_mon, time.tm_mday, time.tm_hour, time.tm_min, time.tm_sec, usec, filename, line, message.c_str()); #else fprintf(stderr, "[%c %02d.%02d %02d:%02d:%02d.%06d %s:%d] %s\n", level_names[level], time.tm_mon, time.tm_mday, time.tm_hour, time.tm_min, time.tm_sec, usec, filename, line, message.c_str()); #endif } }; class LogManager { public: static LogManager* Singleton() { static LogManager* const s = new LogManager(); return s; } void Log(LogLevel level, const char* filename, int line, const std::string& message) { std::unique_lock l(mutex_); for (auto sink : sinks_) { sink->Log(level, filename, line, message); } } void AddLogSink(LogSink* sink) { if (sink != nullptr) { std::unique_lock l(mutex_); sinks_.push_back(sink); } } void RemoveLogSink(LogSink* sink) { std::unique_lock l(mutex_); sinks_.erase(std::remove(sinks_.begin(), sinks_.end(), sink), sinks_.end()); } private: static void LogToSingleton(LogLevel level, const char* filename, int line, const std::string& message) { Singleton()->Log(level, filename, line, message); } LogManager() { std::unique_lock l(mutex_); google::protobuf::SetLogHandler(&LogToSingleton); sinks_.push_back(new DefaultLogSink()); } std::mutex mutex_; std::vector sinks_; }; } // namespace void LogControl::Initialize() { LogManager::Singleton(); } void LogControl::AddLogSink(LogSink* sink) { LogManager::Singleton()->AddLogSink(sink); } void LogControl::RemoveLogSink(LogSink* sink) { LogManager::Singleton()->RemoveLogSink(sink); } } // namespace grr grr-3.1.0.2/grr/client/minicomm/logging_control.h000066400000000000000000000015371273104013200216630ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_LOGGING_CONTROL_H_ #define GRR_CLIENT_MINICOMM_LOGGING_CONTROL_H_ #include "grr/client/minicomm/base.h" namespace grr { // A class which can accept log messages and do something with them. class LogSink { public: virtual ~LogSink() {} virtual void Log(LogLevel level, const char* filename, int line, const std::string& message) = 0; }; // Provides static global methods to control logging. class LogControl { public: // Initialize the grr client logging system. Should be called before // any threads are created. static void Initialize(); // Add sink to the system so that it will see all log messages. static void AddLogSink(LogSink* sink); // Remove sink from the system. static void RemoveLogSink(LogSink* sink); }; } // namespace grr #endif // GRR_CLIENT_MINICOMM_LOGGING_CONTROL_H_ grr-3.1.0.2/grr/client/minicomm/message_queue.cc000066400000000000000000000042431273104013200214600ustar00rootroot00000000000000#include "grr/client/minicomm/message_queue.h" #include #include namespace grr { void MessageQueue::AddMessage(const GrrMessage& message) { std::unique_lock l(lock_); const int arg_size = message.args().size(); if (!CanAddMessage(arg_size)) { queue_shrunk_.wait( l, [this, arg_size] { return this->CanAddMessage(arg_size); }); } args_size_ += arg_size; messages_.emplace_back(message); l.unlock(); queue_grew_.notify_all(); } void MessageQueue::AddPriorityMessage(const GrrMessage& message) { std::unique_lock l(lock_); args_size_ += message.args().size(); messages_.emplace_front(message); l.unlock(); queue_grew_.notify_all(); } std::vector MessageQueue::GetMessages(int max_message_count, int max_args_size, bool blocking) { std::unique_lock l(lock_); if (messages_.empty() && blocking) { queue_grew_.wait(l, [this] { return !this->messages_.empty(); }); } int count = 0; int args_size = 0; for (const GrrMessage& m : messages_) { const int new_count = count + 1; const int new_args_size = args_size + m.args().size(); if (count == 0 || (new_count <= max_message_count && new_args_size <= max_args_size)) { // There is room to include this message. count = new_count; args_size = new_args_size; } else { break; } } std::vector result; result.reserve(count); for (int i = 0; i < count; i++) { result.emplace_back(messages_.front()); messages_.pop_front(); } args_size_ -= args_size; l.unlock(); queue_shrunk_.notify_all(); return result; } int MessageQueue::current_message_count() const { std::unique_lock l(lock_); return messages_.size(); } int MessageQueue::current_args_size() const { std::unique_lock l(lock_); return args_size_; } bool MessageQueue::CanAddMessage(int new_args_size) { return messages_.size() == 0 || (messages_.size() < max_message_count_ && args_size_ + new_args_size <= max_args_size_); } } // namespace grr grr-3.1.0.2/grr/client/minicomm/message_queue.h000066400000000000000000000034441273104013200213240ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_MESSAGE_QUEUE_H_ #define GRR_CLIENT_MINICOMM_MESSAGE_QUEUE_H_ #include #include #include #include #include "grr/proto/jobs.pb.h" namespace grr { class MessageQueue { public: // Create a queue which normally limits itself to max_count records with a // total data (args) size of max_args_bytes. MessageQueue(int max_count, int max_args_bytes) : max_message_count_(max_count), max_args_size_(max_args_bytes), args_size_(0) {} // Adds message to the back of the queue. Will block if there isn't space in // the queue, but will add a message to an empty queue, even if args is larger // than max_args_size_. void AddMessage(const GrrMessage& message); // Adds a message to the front of the queue. Will add even if there isn't // space in the queue (queue can become oversized). void AddPriorityMessage(const GrrMessage& message); // Get some messages, up to the listed max count and size, from the front of // the queue. If blocking is true, will block until there is at least one // message. Will return at least one message, even if it is larger than // max_args_size. std::vector GetMessages(int max_message_count, int max_args_bytes, bool blocking); int current_message_count() const; int current_args_size() const; private: bool CanAddMessage(int new_args_size); const int max_message_count_; const int max_args_size_; int args_size_; std::deque messages_; mutable std::mutex lock_; // Condition variables which are notified when the queue changes size. std::condition_variable queue_shrunk_; std::condition_variable queue_grew_; }; } // namespace grr #endif // GRR_CLIENT_MINICOMM_MESSAGE_QUEUE_H_ grr-3.1.0.2/grr/client/minicomm/message_queue_test.cc000066400000000000000000000075451273104013200225270ustar00rootroot00000000000000#include "grr/client/minicomm/message_queue.h" #include #include #include #include #include #include "gtest/gtest.h" namespace grr { TEST(MessageQueueTest, AddMessageNonBlocking) { MessageQueue queue(5, 20000); GrrMessage m0; m0.set_session_id("SESSION 0"); m0.set_args(std::string("123457890", 10)); queue.AddMessage(m0); GrrMessage m1; m1.set_session_id("SESSION 1"); m1.set_args(std::string("0987654321", 10)); queue.AddMessage(m1); GrrMessage m2; m2.set_session_id("SESSION 2"); queue.AddMessage(m2); EXPECT_EQ(3, queue.current_message_count()); EXPECT_EQ(20, queue.current_args_size()); std::vector messages = queue.GetMessages(5, 20000, false); ASSERT_EQ(3, messages.size()); EXPECT_EQ("SESSION 0", messages[0].session_id()); EXPECT_EQ("SESSION 1", messages[1].session_id()); EXPECT_EQ("SESSION 2", messages[2].session_id()); } TEST(MessageQueueTest, AddMessageBlocks) { MessageQueue queue(5, 15); GrrMessage m0; m0.set_session_id("SESSION 0"); m0.set_args(std::string("123457890", 10)); queue.AddMessage(m0); // Will only fit in the queue when the queue is empty. GrrMessage m1; m1.set_session_id("SESSION 1"); m1.set_args(std::string("09876543210987654321", 20)); std::thread blocked_add([&m1, &queue]() { queue.AddMessage(m1); }); // Pause so that blocked_add is likely to run if it can. std::this_thread::sleep_for(std::chrono::milliseconds(100)); // Should only get m1 back, because blocked_add should be blocked. std::vector messages = queue.GetMessages(5, 20000, false); ASSERT_EQ(1, messages.size()); EXPECT_EQ("SESSION 0", messages[0].session_id()); // Now blocked_add should run. blocked_add.join(); messages = queue.GetMessages(5, 20000, false); ASSERT_EQ(1, messages.size()); EXPECT_EQ("SESSION 1", messages[0].session_id()); } TEST(MessageQueueTest, AddPriorityMessage) { MessageQueue queue(5, 15); // Overfill the queue: GrrMessage m0; m0.set_session_id("SESSION 0"); m0.set_args(std::string("1234578901234567890", 20)); queue.AddMessage(m0); // A priority message should still go in, and go to the front of the queue. GrrMessage m1; m1.set_session_id("SESSION 1"); m1.set_args(std::string("0987654321", 10)); queue.AddPriorityMessage(m1); std::vector messages = queue.GetMessages(5, 20000, false); ASSERT_EQ(2, messages.size()); // High priority message should be first. EXPECT_EQ("SESSION 1", messages[0].session_id()); EXPECT_EQ("SESSION 0", messages[1].session_id()); } TEST(MessageQueueTest, GetMessageBlocking) { MessageQueue queue(5, 15); // Non-blocking mode should return immediatly, even when the queue is empty. std::vector messages = queue.GetMessages(5, 20000, false); std::thread blocked_get( [&messages, &queue]() { messages = queue.GetMessages(2, 20000, true); }); std::this_thread::sleep_for(std::chrono::milliseconds(100)); GrrMessage m0; m0.set_session_id("SESSION 0"); m0.set_args(std::string("123457890", 10)); queue.AddMessage(m0); // Now blocked_get should run. blocked_get.join(); ASSERT_EQ(1, messages.size()); EXPECT_EQ("SESSION 0", messages[0].session_id()); } TEST(MessageQueueTest, GetMessageSize) { MessageQueue queue(100, 10000); for (int i = 0; i < 10; i++) { GrrMessage m; m.set_session_id("SESSION " + std::to_string(i)); m.set_args(std::string("123457890", 10)); queue.AddMessage(m); } std::vector messages = queue.GetMessages(5, 20000, false); ASSERT_EQ(5, messages.size()); EXPECT_EQ("SESSION 0", messages[0].session_id()); EXPECT_EQ("SESSION 4", messages[4].session_id()); messages = queue.GetMessages(5, 20000, false); ASSERT_EQ(5, messages.size()); EXPECT_EQ("SESSION 5", messages[0].session_id()); EXPECT_EQ("SESSION 9", messages[4].session_id()); } } // namespace grr grr-3.1.0.2/grr/client/minicomm/mock_delegate.sh000077500000000000000000000011361273104013200214410ustar00rootroot00000000000000#!/bin/bash # Performs scripted actions according to $1. Mostly these actions simulate # various delegate misbehaviors. case "$1" in # Simple error on startup. startup-error) >&2 echo "Subprocess Error" exit 1 ;; # Write garbage to stdout garbage-out) while : do echo "I'm sending garbage, lots and lots of garbage." sleep 1 done ;; # Sleep for a long time (beyond any reasonable unit test timeout). sleepy) for i in `seq 1 10000`; do sleep 1 done ;; loop-back) cat ;; *) echo "Unrecognized command." ;; esac grr-3.1.0.2/grr/client/minicomm/paths.cc000066400000000000000000000110531273104013200177440ustar00rootroot00000000000000#include "grr/client/minicomm/paths.h" #include #include namespace grr { namespace { bool PathExists(const std::string& s) { auto f = OpenedPath::Open(s, nullptr); return f != nullptr; } std::string LowerString(const std::string& s) { std::string r(s); std::transform(r.begin(), r.end(), r.begin(), ::tolower); return r; } void SetError(const std::string& msg, std::string* error) { if (error != nullptr) { *error = msg; } } std::string ExtendPath(const std::string& path, const std::string& component) { return path + (path.back() == '/' ? "" : "/") + component; } std::vector SplitPath(const std::string& path) { std::vector components; std::string comp; std::stringstream stream(path); while (std::getline(stream, comp, '/')) { if (comp != "") { components.push_back(comp); } } return components; } } // namespace std::unique_ptr Paths::NormalizeAndOpen(PathSpec* spec, std::string* error) { std::unique_ptr res = OpenedPath::Open("/", error); res = TryOpenFromRoot(std::move(res), *spec, error); if (res == nullptr) { return res; } spec->set_path(res->Path()); spec->set_path_options(PathSpec::CASE_LITERAL); spec->clear_nested_path(); return res; } // Attempt to open spec, starting with path as a root. std::unique_ptr Paths::TryOpenFromRoot( std::unique_ptr path, const PathSpec& spec, std::string* error) { if (path == nullptr) { return nullptr; } if (spec.pathtype() != PathSpec::OS) { SetError( "Unsupported path type: " + PathSpec::PathType_Name(spec.pathtype()), error); return nullptr; } if (!spec.mount_point().empty()) { SetError("Non-standard mount points not supported.", error); return nullptr; } if (spec.offset()) { SetError("Offset is not supported.", error); return nullptr; } if (!(spec.path_options() == PathSpec::CASE_LITERAL || spec.path_options() == PathSpec::CASE_INSENSITIVE)) { SetError("Unsupported path options: " + PathSpec::Options_Name(spec.path_options()), error); return nullptr; } switch (spec.path_options()) { case PathSpec::CASE_LITERAL: path = TryExtendLiteral(std::move(path), spec.path(), error); break; case PathSpec::CASE_INSENSITIVE: auto comps = SplitPath(spec.path()); for (const auto& c : comps) { path = TryExtendInsensitive(std::move(path), c, error); if (path == nullptr) { return nullptr; } } break; } if (spec.has_nested_path()) { return TryOpenFromRoot(std::move(path), spec.nested_path(), error); } return path; } // Attempt to extend path with component, which is taken to be one or more case // literal path components. If successful, returns the newly opened // path. Otherwise returns nullptr and sets *error. std::unique_ptr Paths::TryExtendLiteral( std::unique_ptr path, const std::string& components, std::string* error) { if (path == nullptr) { return nullptr; } if (!path->is_directory()) { SetError("Path [" + path->Path() + "] is not a directory.", error); return nullptr; } return OpenedPath::Open(ExtendPath(path->Path(), components), error); } // Attempt to extend path with component, which is taken to be a single, // case-insesitive, path component. If successful, returns the newly opened // path. Otherwise returns nullptr and sets *error. std::unique_ptr Paths::TryExtendInsensitive( std::unique_ptr path, const std::string& component, std::string* error) { if (path == nullptr) { return nullptr; } const std::string current_path = path->Path(); if (!path->is_directory()) { SetError("Path [" + path->Path() + "] is not a directory.", error); return nullptr; } OpenedPath::Directory d; if (!OpenedPath::ReadDirectory(std::move(path), &d, error)) { return nullptr; } // Prefer the case exact match, if present. if (d.count(component)) { return OpenedPath::Open(ExtendPath(current_path, component), error); } // Take the first case insenstive match. std::string lowered_component = LowerString(component); for (const auto& p : d) { if (LowerString(p.first) == lowered_component) { return OpenedPath::Open(ExtendPath(current_path, p.first), error); } } SetError("Unable to find [" + component + "] in [" + current_path + "]", error); return nullptr; } } // namespace grr grr-3.1.0.2/grr/client/minicomm/paths.h000066400000000000000000000020101273104013200175770ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_PATHS_H_ #define GRR_CLIENT_MINICOMM_PATHS_H_ #include "grr/proto/jobs.pb.h" #include "grr/client/minicomm/file_operations.h" namespace grr { class Paths { public: // Attempts to normalize spec and open the resulting path. If successful, // adjusts it in place and returns true. Otherwise sets error and returns // nullptr. static std::unique_ptr NormalizeAndOpen(PathSpec* spec, std::string* error); private: static std::unique_ptr TryOpenFromRoot( std::unique_ptr root, const PathSpec& spec, std::string* error); static std::unique_ptr TryExtendLiteral( std::unique_ptr path, const std::string& component, std::string* error); static std::unique_ptr TryExtendInsensitive( std::unique_ptr path, const std::string& component, std::string* error); }; } // namespace grr #endif // GRR_CLIENT_MINICOMM_PATHS_H_ grr-3.1.0.2/grr/client/minicomm/paths_test.cc000066400000000000000000000023771273104013200210140ustar00rootroot00000000000000#include "grr/client/minicomm/paths.h" #include #include "gtest/gtest.h" #include "grr/client/minicomm/test_util.h" namespace grr { namespace { void WriteFile(const std::string& filename, const std::string& contents) { std::ofstream file; file.open(filename); file << contents; file.close(); } } TEST(Paths, NormalizePath) { const std::string temp_dir = testing::MakeTempDir(); const std::string file1 = temp_dir + "/file1"; WriteFile(file1, "File 1 contents."); ASSERT_EQ(mkdir((temp_dir + "/subdir").c_str(), S_IRWXU), 0); const std::string file2 = temp_dir + "/subdir/file2"; WriteFile(file2, "File 2 contents."); PathSpec spec; std::string error = ""; spec.set_path(file1); spec.set_pathtype(PathSpec::OS); auto res = Paths::NormalizeAndOpen(&spec, &error); ASSERT_NE(res, nullptr); EXPECT_EQ(res->Path(), file1); EXPECT_EQ(spec.path(), file1); EXPECT_EQ(spec.path_options(), PathSpec::CASE_LITERAL); spec.set_path_options(PathSpec::CASE_INSENSITIVE); spec.set_path(temp_dir + "/SubDir/File2"); res = Paths::NormalizeAndOpen(&spec, &error); ASSERT_NE(res, nullptr); EXPECT_EQ(res->Path(), file2); EXPECT_EQ(spec.path(), file2); EXPECT_EQ(spec.path_options(), PathSpec::CASE_LITERAL); } } // namespace grr grr-3.1.0.2/grr/client/minicomm/resource_monitor.cc000066400000000000000000000175531273104013200222360ustar00rootroot00000000000000#include "grr/client/minicomm/resource_monitor.h" #include #include "grr/client/minicomm/client_action.h" #include "grr/client/minicomm/util.h" namespace grr { namespace { uint64 GetUsageTime(const timeval& u) { return static_cast(u.tv_sec) * static_cast(1e6) + static_cast(u.tv_usec); } } // namespace const std::string NetworkResourceMonitor::GetInterfaceState( const std::string& interface) const { std::ifstream file("/sys/class/net/" + interface + "/operstate"); if (file.good() == false) return "unavailable"; std::string state; file >> state; return state; } NetworkResourceMonitor::Interface::Types NetworkResourceMonitor::GetInterface() { const auto new_time = std::chrono::high_resolution_clock::now(); if (std::chrono::duration_cast(new_time - previous_accessed_) .count() < 5000) // 5 seconds return previous_response_; previous_accessed_ = new_time; if (GetInterfaceState("en0") == "up" || GetInterfaceState("em1") == "up") { return previous_response_ = Interface::Types::ETHERNET; } if (GetInterfaceState("wlan0") == "up") { return previous_response_ = Interface::Types::WLAN; } return previous_response_ = Interface::Types::MOBILE; } bool NetworkResourceMonitor::WaitToSend(const std::vector& data) { uint64 data_size = 0; for (const auto& message : data) { data_size += message.ByteSize(); } data_size = data_size * 1.20; // http overhead ~ 20% (pessimistic) // Hangs untill some interface becomes available and there is enough bandwith // to be used on that interface. while (1) { const Interface::Types interface = GetInterface(); if (interfaces_[interface].SendData(data_size) == true) { return true; } else { if (interfaces_[interface].Sleep(data_size) == false) { return false; // sleep would be too long } } } } NetworkResourceMonitor::NetworkResourceMonitor() { auto test_time = std::chrono::high_resolution_clock::now(); interfaces_[Interface::Types::ETHERNET] = Interface(0, test_time, 100); // ~200GB per month interfaces_[Interface::Types::WLAN] = Interface(0, test_time, 1); // ~2GB per month interfaces_[Interface::Types::MOBILE] = Interface(0, test_time, 1e-1); // ~200MB per month } NetworkResourceMonitor::~NetworkResourceMonitor() {} NetworkResourceMonitor::Interface::Interface( const uint64 bandwidth, const std::chrono::high_resolution_clock::time_point& updated, const double bandwidth_alloc) : bandwidth_left_(bandwidth), previous_time_(updated), bandwidth_alloc_milli_(bandwidth_alloc) {} void NetworkResourceMonitor::Interface::PassTime( const std::chrono::high_resolution_clock::time_point& new_time) { auto elapsed = std::chrono::duration_cast( new_time - previous_time_) .count(); bandwidth_left_ += elapsed * bandwidth_alloc_milli_; previous_time_ = new_time; } NetworkResourceMonitor::Interface::Interface() {} NetworkResourceMonitor::Interface::~Interface() {} bool NetworkResourceMonitor::Interface::Sleep(const uint64 data_size) { if (data_size <= bandwidth_left_) return true; // How long should the thread sleep to accumulate bandwidth, in // milliseconds. const uint64 diff = 1 + (data_size - bandwidth_left_) / bandwidth_alloc_milli_; GOOGLE_LOG(INFO) << "Size of data waiting to be sent: " << static_cast(data_size / 1024) << "kb"; if (diff > 60 * 1000) { // 1 min return false; // this packet would take up too much bandwidth at once } GOOGLE_LOG(INFO) << "Sleeping for: " << static_cast(diff / 1000.) << "seconds."; std::this_thread::sleep_for(std::chrono::milliseconds(diff)); return true; } bool NetworkResourceMonitor::Interface::SendData(const uint64 data_size) { PassTime(std::chrono::high_resolution_clock::now()); if (bandwidth_left_ >= data_size) { bandwidth_left_ -= data_size; return true; } return false; } void HardwareResourceMonitor::RefreshLoop() { rusage previous_usage; getrusage(RUSAGE_SELF, &previous_usage); auto previous_time = std::chrono::high_resolution_clock::now(); CpuSample previous_cpu_sample; while (stop_thread_ == false) { std::this_thread::sleep_for( std::chrono::milliseconds(1 * 1000)); // sleep for one second rusage current_usage; if (getrusage(RUSAGE_SELF, ¤t_usage) == -1) { // Error occured while getting rusage. continue; } const auto current_time = std::chrono::high_resolution_clock::now(); const uint64 elapsed_time = std::chrono::duration_cast(current_time - previous_time) .count(); const uint64 current_user_usage_time = GetUsageTime(current_usage.ru_utime); const uint64 previous_user_usage_time = GetUsageTime(previous_usage.ru_utime); const uint64 current_system_usage_time = GetUsageTime(current_usage.ru_stime); const uint64 previous_system_usage_time = GetUsageTime(previous_usage.ru_stime); const uint64 user_usage_time = current_user_usage_time - previous_user_usage_time; const uint64 system_usage_time = current_system_usage_time - previous_system_usage_time; previous_time = current_time; previous_usage = current_usage; // Percentage representing amount of time cpu spends in this // agent. This number could be higher than 100 (multiple cores). const double cpu_user_usage = static_cast(user_usage_time) / static_cast(elapsed_time) * 100.0; const double cpu_system_usage = static_cast(system_usage_time) / static_cast(elapsed_time) * 100.0; if (cpu_user_usage + cpu_system_usage < 1e-5) { // It appears that the rusage wasn't updated in this moment so there is // no // difference between two time points. continue; } CpuSample current_cpu_sample; current_cpu_sample.set_user_cpu_time(cpu_user_usage); current_cpu_sample.set_system_cpu_time(cpu_system_usage); current_cpu_sample.set_cpu_percent(cpu_user_usage + cpu_system_usage); current_cpu_sample.set_timestamp( std::chrono::duration_cast( current_time.time_since_epoch()) .count()); // If the difference between two usages is smaller than 5% of usage and // time // between two updates is smaller than 10 seconds than there is no need to // send new cpu_usage. if (current_cpu_sample.timestamp() - previous_cpu_sample.timestamp() < static_cast(1e6) * static_cast(10) && fabs(current_cpu_sample.cpu_percent() - previous_cpu_sample.cpu_percent()) < 5.0) { continue; } ClientStats res; res.add_cpu_samples(); *res.mutable_cpu_samples(0) = current_cpu_sample; GrrMessage stats; res.SerializeToString(stats.mutable_args()); stats.set_name("GetClientStatsAuto"); stats.set_args_rdf_name("ClientStats"); stats.set_session_id("F:Stats"); stats.set_response_id(0); stats.set_request_id(0); stats.set_task_id(0); if (enrolled_) outbox_->AddMessage(stats); previous_cpu_sample = current_cpu_sample; } } void HardwareResourceMonitor::ClientEnrolled() { enrolled_ = true; } HardwareResourceMonitor::HardwareResourceMonitor(MessageQueue* outbox) : outbox_(outbox), stop_thread_(false), enrolled_(false) { ticker_ = std::thread(&HardwareResourceMonitor::RefreshLoop, this); } HardwareResourceMonitor::~HardwareResourceMonitor() { stop_thread_ = true; if (ticker_.joinable()) { ticker_.join(); } } } // namespace grr grr-3.1.0.2/grr/client/minicomm/resource_monitor.h000066400000000000000000000041311273104013200220640ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_RESOURCE_MONITOR_H_ #define GRR_CLIENT_MINICOMM_RESOURCE_MONITOR_H_ #endif // GRR_CLIENT_MINICOMM_RESOURCE_MONITOR_H_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "grr/client/minicomm/message_queue.h" #include "grr/client/minicomm/base.h" #include "grr/proto/jobs.pb.h" namespace grr { class NetworkResourceMonitor { public: NetworkResourceMonitor(); ~NetworkResourceMonitor(); bool WaitToSend(const std::vector&); private: class Interface { public: // Do not move COUNT, used as size counter. enum Types { ETHERNET = 0, WLAN, MOBILE, COUNT }; Interface(); Interface(const uint64, const std::chrono::high_resolution_clock::time_point&, const double); ~Interface(); bool SendData(const uint64); bool Sleep(const uint64); private: void PassTime(const std::chrono::high_resolution_clock::time_point&); uint64 bandwidth_left_; // amount of bandwidth left in bytes double bandwidth_alloc_milli_; // amount of new bytes available to use as // bandwidth in one millisecond std::chrono::high_resolution_clock::time_point previous_time_; }; Interface::Types GetInterface(); const std::string GetInterfaceState(const std::string&) const; std::array interfaces_; std::chrono::high_resolution_clock::time_point previous_accessed_; Interface::Types previous_response_; }; class HardwareResourceMonitor { public: explicit HardwareResourceMonitor(MessageQueue*); ~HardwareResourceMonitor(); void ClientEnrolled(); private: void RefreshLoop(); // Run by ticker_, sends resource usage stats to the // server. std::atomic stop_thread_; std::atomic enrolled_; std::thread ticker_; MessageQueue* const outbox_; }; } // namespace grr grr-3.1.0.2/grr/client/minicomm/scoped_ptr_ssl.h000066400000000000000000000105551273104013200215200ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_SCOPED_PTR_SSL_H_ #define GRR_CLIENT_MINICOMM_SCOPED_PTR_SSL_H_ // This file defines scoped pointer templates that are used to wrap OpenSSL // pointer types that have OpenSSL-specific deallocation functions. The object // are created (or reference obtained if the object is reference counted by // OpenSSL internally) by some OpenSSL function, but must be deallocated using a // type-specific free function. These scoped pointers makes it easier to use // these OpenSSL objects without worrying about leaking memory/references. The // primary user is sign.cc and cert.cc, which insulates the user from having to // deal with the lower-level OpenSSL types. // The OpenSSL types use the naming convention of BIO *, BIO_free; EVP_PKEY *, // EVP_PKEY_free; etc. // Since the return type is not part of the type signature, we have to encode in // the return type of the deallocation function in the templated class name. // Supports move, but not copy, as copies require specific knowledge about the // openssl type. #include "grr/client/minicomm/base.h" // GOOGLE_CHECK template class scoped_ptr_openssl_void { public: scoped_ptr_openssl_void() : ptr_(NULL) {} explicit scoped_ptr_openssl_void(OpenSSLType *p) : ptr_(p) { // we do not do // // GOOGLE_CHECK(NULL != p) << ": scoped_ptr_openssl_int" // << " constructed with NULL pointer"; // // here, since OpenSSL constructor-like allocators/transformers returns a // NULL on various error conditions that should not necessarily trigger an // abort. For example, if we try to load an invalid cert, // PEM_read_bio_X509_AUX which transforms a string representation of an X509 // cert to an X509 object will return a NULL; in such a case a server // application program would want to check this->get() and handle the error // (e.g., by rejecting the client) rather than aborting in a GOOGLE_CHECK. } ~scoped_ptr_openssl_void() { if (NULL != ptr_) { (*deallocator)(ptr_); } } OpenSSLType *operator->() const { return ptr_; } OpenSSLType *get() const { return ptr_; } OpenSSLType *release() { OpenSSLType *ret = ptr_; ptr_ = NULL; return ret; } void reset(OpenSSLType *p) { if (NULL != ptr_) { (*deallocator)(ptr_); } ptr_ = p; } scoped_ptr_openssl_void(scoped_ptr_openssl_void &&other) { ptr_ = other.release(); } scoped_ptr_openssl_void(const scoped_ptr_openssl_void &other) = delete; void operator=(const scoped_ptr_openssl_void &other) = delete; private: OpenSSLType *ptr_; }; template class scoped_ptr_openssl_int { public: explicit scoped_ptr_openssl_int(OpenSSLType *p) : ptr_(p) { ; } ~scoped_ptr_openssl_int() { DeleteInternal(); } OpenSSLType *get() const { return ptr_; } OpenSSLType *release() { OpenSSLType *ret = ptr_; ptr_ = NULL; return ret; } void reset(OpenSSLType *p) { DeleteInternal(); ptr_ = p; } scoped_ptr_openssl_int(scoped_ptr_openssl_int &&other) { ptr_ = other.release(); } scoped_ptr_openssl_int(const scoped_ptr_openssl_int &other) = delete; void operator=(const scoped_ptr_openssl_int &other) = delete; private: void DeleteInternal() { if (NULL != ptr_) { // OpenSSL's deallocator for BIO can simply decrement reference // counts and return, or trigger callbacks which can return // errors. The convention is that a 0 is returned if // NULL==ptr_, 1 is returned if a successful deref/deallocation // occurred, and negative if a callback returned an error. // // DSO_free and ENGINE_free are the other two such, and there a // zero is an error caused by NULL pointers or finish function // failures. int deallocation_status = (*deallocator)(ptr_); // Fail fast on any error. GOOGLE_CHECK(deallocation_status == 1) << ": OpenSSL object deallocator returned " << deallocation_status << ", expected 1."; } } OpenSSLType *ptr_; }; extern "C" { extern void ERR_clear_error(); // to avoid pulling in extra, messy OpenSSL // headers. } class ScopedOpenSSLErrorStackClearer { public: ~ScopedOpenSSLErrorStackClearer() { ERR_clear_error(); } }; #endif // GRR_CLIENT_MINICOMM_SCOPED_PTR_SSL_H_ grr-3.1.0.2/grr/client/minicomm/subprocess_delegator.cc000066400000000000000000000234251273104013200230510ustar00rootroot00000000000000#include "grr/client/minicomm/subprocess_delegator.h" #include #include #include #include #include #include #include #include #include #include "grr/client/minicomm/base.h" #include "grr/client/minicomm/config.pb.h" #include "grr/proto/jobs.pb.h" namespace grr { SubprocessDelegator::SubprocessDelegator(ClientConfig* config, MessageQueue* inbox, MessageQueue* outbox) : config_(config), inbox_(inbox), outbox_(outbox), child_pid_(0), writer_thread_([this]() { this->WriteLoop(); }), reader_thread_([this]() { this->ReadLoop(); }), error_thread_([this]() { this->ErrorLoop(); }) {} SubprocessDelegator::~SubprocessDelegator() { std::unique_lock pid_lock(child_pid_mutex_); while (child_pid_ > 0) { pid_lock.unlock(); KillChildProcess(); pid_lock.lock(); } child_pid_ = -1; pid_lock.unlock(); child_spawned_.notify_all(); // Writer thread might now be waiting to read from the inbox. Add an empty // message to unstick it. inbox_->AddMessage(GrrMessage()); writer_thread_.join(); reader_thread_.join(); error_thread_.join(); } void SubprocessDelegator::StartChildProcess() { const ClientConfiguration::SubprocessConfig config_proto = config_->SubprocessConfig(); if (config_proto.filename().empty()) { GOOGLE_LOG(ERROR) << "Subprocess not configured."; return; } std::unique_lock pid_lock(child_pid_mutex_); // If there is already child, or we are shutting down, we do nothing. if (child_pid_ != 0) { return; } int stdin_fd[2]; int stdout_fd[2]; int stderr_fd[2]; pipe(stdin_fd); pipe(stdout_fd); pipe(stderr_fd); child_pid_ = fork(); if (child_pid_ == 0) { close(stdin_fd[1]); close(stdout_fd[0]); close(stderr_fd[0]); std::vector newargv; newargv.reserve(config_proto.argv_size() + 2); newargv.push_back(config_proto.filename().c_str()); for (const std::string& arg : config_proto.argv()) { newargv.push_back(arg.c_str()); } newargv.push_back(NULL); std::vector newenv; newenv.reserve(config_proto.env_size() + 1); for (const std::string& v : config_proto.env()) { newenv.push_back(v.c_str()); } newenv.push_back(NULL); dup2(stdin_fd[0], STDIN_FILENO); if (stdin_fd[0] != STDIN_FILENO) { close(stdin_fd[0]); } dup2(stdout_fd[1], STDOUT_FILENO); if (stdout_fd[1] != STDOUT_FILENO) { close(stdout_fd[1]); } dup2(stderr_fd[1], STDERR_FILENO); if (stderr_fd[1] != STDERR_FILENO) { close(stderr_fd[1]); } if (execve(config_proto.filename().c_str(), const_cast(&newargv[0]), const_cast(&newenv[0]))) { // Failed to Exec. Report through stderr, then die quickly and without // side effects. static const char kExecveMessage[] = "Child Unable to execve!\n"; write(STDERR_FILENO, kExecveMessage, sizeof(kExecveMessage) - 1); while (1) { _exit(1); } } } close(stdin_fd[0]); close(stdout_fd[1]); close(stderr_fd[1]); { std::unique_lock write_lock(write_mutex_); write_stream_.reset( new google::protobuf::io::FileOutputStream(stdin_fd[1])); } { std::unique_lock read_lock(read_mutex_); read_stream_.reset(new google::protobuf::io::FileInputStream(stdout_fd[0])); } { std::unique_lock error_lock(error_mutex_); error_stream_.reset( new google::protobuf::io::FileInputStream(stderr_fd[0])); } pid_lock.unlock(); child_spawned_.notify_all(); } namespace { bool TryWaitPID(pid_t pid) { const int result = waitpid(pid, nullptr, WNOHANG); if (result == pid) { return true; } if (result == 0) { return false; } GOOGLE_LOG(ERROR) << "Returned [" << result << "] waiting for pid [" << pid << "]"; return false; } } // namespace void SubprocessDelegator::KillChildProcess() { std::unique_lock pid_lock(child_pid_mutex_); undead_children_.erase(std::remove_if(undead_children_.begin(), undead_children_.end(), &TryWaitPID), undead_children_.end()); // If there is no child, or if we are in the process of shutting down, do // nothing. if (child_pid_ <= 0) { return; } kill(child_pid_, SIGTERM); // Give it time to end gracefully, then be more definitive. std::this_thread::sleep_for(std::chrono::seconds(4)); kill(child_pid_, SIGKILL); std::this_thread::sleep_for(std::chrono::seconds(1)); if (!TryWaitPID(child_pid_)) { GOOGLE_LOG(WARNING) << "Unable to fully kill subprocess:" << child_pid_; // Refuse to raise too many zombies. Returning here means we failed and will // start over the next time a problem with the child process is noted. if (undead_children_.size() > 5) { GOOGLE_LOG(ERROR) << "Too many undead children."; return; } undead_children_.push_back(child_pid_); } child_pid_ = 0; // With a dead child, all the threads should get a broken pipe error, and // start waiting to check child_pid_. So we can take their locks and close // everything. { std::unique_lock write_lock(write_mutex_); if (write_stream_ != nullptr) { write_stream_->Close(); write_stream_.reset(nullptr); } } { std::unique_lock read_lock(read_mutex_); if (read_stream_ != nullptr) { read_stream_->Close(); read_stream_.reset(nullptr); } } { std::unique_lock error_lock(error_mutex_); if (error_stream_ != nullptr) { error_stream_->Close(); error_stream_.reset(nullptr); } } } void SubprocessDelegator::WriteLoop() { while (true) { std::vector messages = inbox_->GetMessages(100, 100000, true); GOOGLE_DCHECK_GT(messages.size(), 0); std::unique_lock pid_lock(child_pid_mutex_); // If there isn't a working child process, try to make one, repeatedly if // necessary, but don't spin too hard in case we have a config error or // other persistent failure. while (child_pid_ == 0) { pid_lock.unlock(); StartChildProcess(); pid_lock.lock(); if (child_pid_ == 0) { pid_lock.unlock(); std::this_thread::sleep_for(std::chrono::seconds(30)); pid_lock.lock(); } } if (child_pid_ == -1) { return; } GOOGLE_DCHECK(write_stream_ != nullptr); std::unique_lock write_lock(write_mutex_); pid_lock.unlock(); { google::protobuf::io::CodedOutputStream coded_stream(write_stream_.get()); for (const auto& message : messages) { const int size = message.ByteSize(); coded_stream.WriteLittleEndian32(size); message.SerializeWithCachedSizes(&coded_stream); } } write_stream_->Flush(); } } void SubprocessDelegator::ReadLoop() { bool read_failed = false; while (true) { if (read_failed) { KillChildProcess(); read_failed = false; } std::unique_lock pid_lock(child_pid_mutex_); if (child_pid_ == 0) { child_spawned_.wait(pid_lock, [this] { return this->child_pid_ != 0; }); } if (child_pid_ == -1) { return; } // read_stream should be non-null while pid > 0, and will stay non-null // while we hold read_mutex_. It is important to release the pid lock so // that KillChildProcess can start (and signal) while we are blocked // reading. GOOGLE_DCHECK(read_stream_ != nullptr); std::unique_lock read_lock(read_mutex_); pid_lock.unlock(); google::protobuf::uint32 message_size; google::protobuf::io::CodedInputStream coded_stream(read_stream_.get()); if (!coded_stream.ReadLittleEndian32(&message_size)) { GOOGLE_LOG(ERROR) << "Unable to read size, resetting the subprocess."; read_failed = true; continue; } // Assume messages are less that 2MB. if (message_size > 2 * 1024 * 1024) { GOOGLE_LOG(ERROR) << "Read bad size, resetting the subprocess."; read_failed = true; continue; } if (message_size == 0) { continue; } GrrMessage message; coded_stream.PushLimit(message_size); if (!message.ParseFromCodedStream(&coded_stream)) { GOOGLE_LOG(ERROR) << "Unable to read message, resetting the subprocess."; read_failed = true; continue; } read_lock.unlock(); outbox_->AddMessage(message); } } void SubprocessDelegator::ErrorLoop() { while (true) { std::unique_lock pid_lock(child_pid_mutex_); if (child_pid_ == 0) { child_spawned_.wait(pid_lock, [this] { return this->child_pid_ != 0; }); } if (child_pid_ == -1) { return; } GOOGLE_DCHECK(error_stream_ != nullptr); std::unique_lock error_lock(error_mutex_); pid_lock.unlock(); std::string line; int read_size = 0; const char* buffer = nullptr; while (error_stream_->Next(reinterpret_cast(&buffer), &read_size)) { const char* start_pos = buffer; const char* eol_pos = std::find(start_pos, buffer + read_size, '\n'); while (eol_pos != buffer + read_size) { line += std::string(start_pos, eol_pos - start_pos); if (!line.empty()) { GOOGLE_LOG(ERROR) << "From subprocess: " << line; } line.clear(); start_pos = eol_pos + 1; eol_pos = std::find(start_pos, buffer + read_size, '\n'); } line += std::string(start_pos, eol_pos - start_pos); } if (!line.empty()) { GOOGLE_LOG(ERROR) << "From subprocess: " << line; } } } } // namespace grr grr-3.1.0.2/grr/client/minicomm/subprocess_delegator.h000066400000000000000000000050771273104013200227160ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_SUBPROCESS_DELEGATOR_H_ #define GRR_CLIENT_MINICOMM_SUBPROCESS_DELEGATOR_H_ #include #include #include #include #include #include "grr/client/minicomm/config.h" #include "grr/client/minicomm/message_queue.h" #include "google/protobuf/io/coded_stream.h" #include "google/protobuf/io/zero_copy_stream.h" #include "google/protobuf/io/zero_copy_stream_impl.h" namespace grr { // Creates a subprocess to handle messages. class SubprocessDelegator { public: SubprocessDelegator(ClientConfig* config, MessageQueue* inbox, MessageQueue* outbox); ~SubprocessDelegator(); private: ClientConfig* config_; MessageQueue* inbox_; MessageQueue* outbox_; // PID of the child process. 0 indicates that no child process currently // exists. -1 indicates that the class is being destructed and that internal // threads need to exit. std::mutex child_pid_mutex_; pid_t child_pid_; std::condition_variable child_spawned_; // Vector of child pids which we have killed, but are so far unable // to reap. Also protected by child_pit_mutex_. std::vector undead_children_; // Each of the following blocks contain structures used to manage a // communication channel with the subprocess. The *Loop methods access these // and rely on the following invariants: // // 1) The *stream_ pointers are non-null when child_pid_ > 0. // 2) The *stream_ pointers and pointees are protected by their // respective mutexes. // // The (Start|Kill)Process methods assume that the *Loop methods will release // their corresponding mutexes shortly after a child is killed and then wait // until child_pid_ becomes non-zero. // Components to write commands to the subprocess. std::thread writer_thread_; std::mutex write_mutex_; std::unique_ptr write_stream_; // Components to read data from the subprocess. std::thread reader_thread_; std::mutex read_mutex_; std::unique_ptr read_stream_; // Components to read errors from the subprocess. std::thread error_thread_; std::mutex error_mutex_; std::unique_ptr error_stream_; void StartChildProcess(); void KillChildProcess(); // Loops to write to and read from child process. Executed by *thread_. Will // repeated until child_pid_ becomes -1. void WriteLoop(); void ReadLoop(); void ErrorLoop(); }; } // namespace grr #endif // GRR_CLIENT_MINICOMM_SUBPROCESS_DELEGATOR_H_ grr-3.1.0.2/grr/client/minicomm/subprocess_delegator_test.cc000066400000000000000000000102341273104013200241020ustar00rootroot00000000000000#include "grr/client/minicomm/subprocess_delegator.h" #include #include #include #include #include "google/protobuf/repeated_field.h" #include "gtest/gtest.h" #include "grr/client/minicomm/base.h" #include "grr/client/minicomm/client_test_base.h" #include "grr/client/minicomm/config.h" #include "grr/client/minicomm/config.pb.h" #include "grr/client/minicomm/message_queue.h" namespace grr { class SubprocessDelegatorTest : public ClientTestBase { protected: SubprocessDelegatorTest() : mock_delegate_("mock_delegate.sh"), inbox_(100, 100000), outbox_(100, 100000) {} void SetConfiguration(const std::string& filename, const std::vector& argv, const std::vector& env) { ClientConfiguration config_proto; config_proto.add_control_url("http://localhost:8001/control"); config_proto.set_ca_cert_pem(kCertPEM); ClientConfiguration::SubprocessConfig* subprocess_config = config_proto.mutable_subprocess_config(); subprocess_config->set_filename(filename); *subprocess_config->mutable_argv() = google::protobuf::RepeatedPtrField(argv.begin(), argv.end()); *subprocess_config->mutable_env() = google::protobuf::RepeatedPtrField(env.begin(), env.end()); WriteConfigFile(config_proto.DebugString()); GOOGLE_CHECK(config_.ReadConfig()); } void StartDelegator() { delegator_.reset(new SubprocessDelegator(&config_, &inbox_, &outbox_)); } const std::string mock_delegate_; MessageQueue inbox_; MessageQueue outbox_; std::unique_ptr delegator_; }; TEST_F(SubprocessDelegatorTest, NewDelete) { SetConfiguration("/bad/filename/", std::vector(), std::vector()); StartDelegator(); std::this_thread::sleep_for(std::chrono::seconds(2)); } TEST_F(SubprocessDelegatorTest, BadConfig) { SetConfiguration("/bad/filename/", std::vector(), std::vector()); StartDelegator(); BeginLogCapture({LOGLEVEL_ERROR}); inbox_.AddMessage(GrrMessage()); std::this_thread::sleep_for(std::chrono::seconds(2)); // With a bad filename, execve should fail, and we should be told. EXPECT_TRUE( CapturedLogContainsSuffix("From subprocess: Child Unable to execve!")); } TEST_F(SubprocessDelegatorTest, SubprocessError) { std::vector argv = {"startup-error"}; SetConfiguration(mock_delegate_, argv, std::vector()); StartDelegator(); BeginLogCapture({LOGLEVEL_ERROR}); inbox_.AddMessage(GrrMessage()); std::this_thread::sleep_for(std::chrono::seconds(2)); // We should get a startup error message from the subprocess. EXPECT_TRUE(CapturedLogContainsSuffix("From subprocess: Subprocess Error")); } TEST_F(SubprocessDelegatorTest, SubprocessGarbage) { std::vector argv = {"garbage-out"}; SetConfiguration(mock_delegate_, argv, std::vector()); StartDelegator(); BeginLogCapture({LOGLEVEL_ERROR}); inbox_.AddMessage(GrrMessage()); std::this_thread::sleep_for(std::chrono::seconds(5)); // We should not be able to process the garbage, and so should reset the // subprocess. EXPECT_TRUE( CapturedLogContainsSuffix("Read bad size, resetting the subprocess.")); } TEST_F(SubprocessDelegatorTest, SubprocessSlow) { std::vector argv = {"sleepy"}; SetConfiguration(mock_delegate_, argv, std::vector()); StartDelegator(); std::this_thread::sleep_for(std::chrono::seconds(5)); } TEST_F(SubprocessDelegatorTest, SimpleLoopback) { std::vector argv = {"loop-back"}; SetConfiguration(mock_delegate_, argv, std::vector()); StartDelegator(); GrrMessage message; message.set_session_id("SESSION_ID1"); message.set_args("ASDFASDFASDF"); inbox_.AddMessage(message); const std::vector result = outbox_.GetMessages(5, 100000, true); ASSERT_EQ(1, result.size()); EXPECT_EQ(result[0].session_id(), message.session_id()); EXPECT_EQ(result[0].args(), message.args()); } } // namespace grr grr-3.1.0.2/grr/client/minicomm/tempfiles.cc000066400000000000000000000066361273104013200206300ustar00rootroot00000000000000#include "grr/client/minicomm/tempfiles.h" #include #include #include #include #include "grr/client/minicomm/paths.h" namespace grr { namespace { std::string NormalizePath(const std::string str) { char buffer[PATH_MAX]; if (realpath(str.c_str(), buffer) == buffer) { return std::string(buffer); } else { return std::string(); } } } // namespace std::string TemporaryFiles::CreateGRRTempFile(const std::string& prefix, std::string* const error) { std::string location; location = NormalizePath(config_.TemporaryDirectory()) + "/" + prefix + ".XXXXXX" + '\0'; if (location.size() == 0) { *error += "Unable to expand path while creating a temporary file.\n"; return std::string(); } std::unique_ptr location_mutable(new char[location.size()]); std::copy(location.begin(), location.end(), location_mutable.get()); int fd = mkstemp(location_mutable.get()); if (fd == -1) { *error += "Unable to create temporary file descriptor.\n"; return std::string(); } if (close(fd) == -1) { *error += "Unable to close temporary file descriptor.\n"; return std::string(); } // Terminating character should not be included when returning the location to // the file. return std::string(location_mutable.get(), location.size() - 1); } bool TemporaryFiles::DeleteGRRTempFiles(const std::string& path, std::string* const log, std::string* const error) { auto handle = OpenedPath::Open(path, error); if (handle == nullptr) { *error += "Unable to open path.\n"; return false; } std::vector deleted; std::vector not_deleted; if (handle->is_directory()) { std::string base_path = handle->Path(); OpenedPath::Directory dir; if (!OpenedPath::ReadDirectory(std::move(handle), &dir, error)) { *error += "Unable to open directory.\n"; return false; } for (const auto& d : dir) { if (d.first == "." || d.first == "..") { continue; } auto child_path = OpenedPath::Open(base_path + "/" + d.first, error); if (child_path == nullptr) { continue; } if (DeleteGRRTempFile(child_path->Path())) { deleted.emplace_back(child_path->Path()); } else { not_deleted.emplace_back(child_path->Path()); } } } else { if (DeleteGRRTempFile(handle->Path())) { deleted.emplace_back(handle->Path()); } else { not_deleted.emplace_back(handle->Path()); } } if (deleted.size()) { *log += "Deleted: \n"; for (auto file : deleted) { *log += file + "\n"; } } if (not_deleted.size()) { *log += "Not deleted: \n"; for (auto file : not_deleted) { *log += file + "\n"; } } return true; } bool TemporaryFiles::DeleteGRRTempFile(const std::string& path) { const std::string normalized_path = NormalizePath(path); if (normalized_path.size() > 0) { const std::string temp_path_prefix = NormalizePath(config_.TemporaryDirectory()) + "/"; if (normalized_path.substr(0, temp_path_prefix.size()) != temp_path_prefix) { return false; } if (remove(normalized_path.c_str()) == 0) { return true; } else { return false; } } else { return false; } } } // namespace grr grr-3.1.0.2/grr/client/minicomm/tempfiles.h000066400000000000000000000026361273104013200204660ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_TEMPFILES_H_ #define GRR_CLIENT_MINICOMM_TEMPFILES_H_ #include #include #include #include #include #include "grr/client/minicomm/config.h" namespace grr { class TemporaryFiles { public: explicit TemporaryFiles(const ClientConfig& config) : config_(config) {} // If the path is a directory, and directory is inside the temporary // directory specified by the ClientConfig then everything in the directory is // deleted. In case path is a file, and if that file is inside the temporary // directory specified by the ClientConfig, it gets deleted. // Files which have been deleted and have not been deleted are logged to log. // Returns true on success, and false on failure, in which case error gets // populated with error information. bool DeleteGRRTempFiles(const std::string& path, std::string* const log, std::string* const error); // Create a new temporary file in the temporary directory with filename // prefix. // Returns path to the created file on success, else returns empty string and // error gets populated. std::string CreateGRRTempFile(const std::string& prefix, std::string* const error); private: const ClientConfig& config_; bool DeleteGRRTempFile(const std::string& path); }; } // namespace grr #endif // GRR_CLIENT_MINICOMM_TEMPFILES_H_ grr-3.1.0.2/grr/client/minicomm/tempfiles_test.cc000066400000000000000000000021621273104013200216550ustar00rootroot00000000000000#include "grr/client/minicomm/tempfiles.h" #include #include #include #include "gtest/gtest.h" #include "grr/client/minicomm/client_test_base.h" #include "grr/client/minicomm/file_operations.h" #include "grr/client/minicomm/test_util.h" #include "grr/client/minicomm/util.h" namespace grr { namespace {} class TempFilesTest : public grr::ClientTestBase {}; TEST_F(TempFilesTest, CreateAndDelete) { std::vector files; WriteValidConfigFile(false, true); ASSERT_TRUE(config_.ReadConfig()); TemporaryFiles temp_files(config_); for (int i = 0; i < 50; ++i) { std::string path; std::string error; path = temp_files.CreateGRRTempFile("Testing", &error); ASSERT_GT(path.size(), 0); ASSERT_EQ(access(path.c_str(), R_OK), 0); files.emplace_back(path); } std::string error; std::string log; ASSERT_TRUE(temp_files.DeleteGRRTempFiles(config_.TemporaryDirectory(), &log, &error)); ASSERT_GT(log.size(), 0); for (auto& file : files) { ASSERT_EQ(access(file.c_str(), R_OK), -1); } } } // namespace grr grr-3.1.0.2/grr/client/minicomm/test_util.cc000066400000000000000000000021011273104013200206330ustar00rootroot00000000000000#include "grr/client/minicomm/test_util.h" #include #include "grr/client/minicomm/base.h" namespace grr { namespace testing { namespace { std::string* MakeBaseTempDir() { const char t[] = "/tmp/GrrTest.XXXXXX"; std::unique_ptr writeable(new char[sizeof(t)]); std::copy(t, t + sizeof(t), writeable.get()); const char* result = mkdtemp(writeable.get()); GOOGLE_CHECK(result != nullptr) << "Unable to make temp directory, errno:" << errno; return new std::string(result); } const std::string& BaseTempDir() { static const std::string* temp_dir = MakeBaseTempDir(); return *temp_dir; } } // namespace std::string MakeTempDir() { const ::testing::TestInfo* const test_info = ::testing::UnitTest::GetInstance()->current_test_info(); const std::string r(BaseTempDir() + "/" + test_info->test_case_name() + "." + test_info->name()); GOOGLE_CHECK(mkdir(r.c_str(), S_IRWXU) == 0); GOOGLE_LOG(INFO) << "Made temp directory: " << r; return r; } } // namespace testing } // namespace grr grr-3.1.0.2/grr/client/minicomm/test_util.h000066400000000000000000000004511273104013200205030ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_TEST_UTIL_H_ #define GRR_CLIENT_MINICOMM_TEST_UTIL_H_ #include "gtest/gtest.h" namespace grr { namespace testing { // Make a temporary directory named for the test which is currently running. std::string MakeTempDir(); } } #endif // GRR_CLIENT_MINICOMM_TEST_UTIL_H_ grr-3.1.0.2/grr/client/minicomm/util.cc000066400000000000000000000032151273104013200176030ustar00rootroot00000000000000#include "grr/client/minicomm/util.h" #include #include #include "grr/client/minicomm/base.h" namespace grr { namespace { constexpr std::array hex_digits = {{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}}; } std::string BytesToHex(const std::string& input) { std::string output(2 * input.length(), '\0'); for (int i = 0; i < input.length(); i++) { output[2 * i] = hex_digits[(input[i] >> 4) & 0x0F]; output[2 * i + 1] = hex_digits[input[i] & 0x0F]; } return output; } std::string UrlDirname(const std::string& input) { size_t end_slash = input.rfind('/'); if (end_slash == std::string::npos) { GOOGLE_LOG(ERROR) << "Invalid URL:" << input; return ""; } return input.substr(0, end_slash); } bool IsNumber(const std::string& x) { for (auto& c : x) { if (isdigit(c) == false) return false; } return true; } std::string ErrorName(int errnum) { char buff[1024]; // NOTE: The version of strerror_r that we get when including libstdc++ is GNU // specific and may return buff, or may return pointer to a static string // constant. In the latter case we trust the null termination, in the former // case we hard limit the size of the string with ArrayToString just in case. #ifdef ANDROID int res = strerror_r(errnum, buff, sizeof(buff)); if (res == 0) { return ArrayToString(buff); } return "Error occured."; #else char* res = strerror_r(errnum, buff, sizeof(buff)); if (res == buff) { return ArrayToString(buff); } return res; #endif } } // namespace grr grr-3.1.0.2/grr/client/minicomm/util.h000066400000000000000000000012471273104013200174500ustar00rootroot00000000000000#ifndef GRR_CLIENT_MINICOMM_UTIL_H_ #define GRR_CLIENT_MINICOMM_UTIL_H_ #include #include namespace grr { std::string BytesToHex(const std::string& input); std::string UrlDirname(const std::string& input); bool IsNumber(const std::string& x); // Slightly paranoid conversion of a null terminated character array to a // string: does the right thing if the null was truncated. template std::string ArrayToString(const char(&array)[size]) { return std::string(array, strnlen(array, size)); } // Wrapper to convert C errno into string descriptions. std::string ErrorName(int errnum); } // namespace grr #endif // GRR_CLIENT_MINICOMM_UTIL_H_ grr-3.1.0.2/grr/client/minicomm/util_test.cc000066400000000000000000000024231273104013200206420ustar00rootroot00000000000000#include "grr/client/minicomm/util.h" #include "gtest/gtest.h" namespace grr { TEST(UtilTest, BytesToHex) { EXPECT_EQ("00", BytesToHex(std::string("\0", 1))); EXPECT_EQ("0000", BytesToHex(std::string("\0\0", 2))); EXPECT_EQ("3030", BytesToHex(std::string("00"))); EXPECT_EQ("617364663b", BytesToHex(std::string("asdf;"))); EXPECT_EQ("deadbeef", BytesToHex(std::string("\xDE\xAD\xBE\xEF"))); } TEST(UtilTest, UrlDirname) { EXPECT_EQ("http://localhost:8001", UrlDirname("http://localhost:8001/control")); EXPECT_EQ("", UrlDirname("bad url")); } struct TestArrays { char A[10]; char B[10]; char C[1]; char Z[1]; }; TEST(UtilTest, ArrayToString) { TestArrays test_arrays; // A properly terminated string of As. memset(test_arrays.A, 'A', sizeof(test_arrays.A)); test_arrays.A[5] = '\0'; // A string of Bs with the terminator cut off. memset(test_arrays.B, 'B', sizeof(test_arrays.B)); test_arrays.C[0] = 'C'; // Try to avoid UB if the template doesn't work. test_arrays.Z[0] = '\0'; std::string A = ArrayToString(test_arrays.A); std::string B = ArrayToString(test_arrays.B); EXPECT_EQ("AAAAA", A); EXPECT_EQ("BBBBBBBBBB", B); // Make sure we didn't change anything else. EXPECT_EQ('C', test_arrays.C[0]); } } // namespace grr grr-3.1.0.2/grr/client/nanny/000077500000000000000000000000001273104013200156315ustar00rootroot00000000000000grr-3.1.0.2/grr/client/nanny/GRRNanny.h000066400000000000000000000027051273104013200174440ustar00rootroot00000000000000 // The following are message definitions. // // Values are 32 bit values laid out as follows: // // 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 // 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 // +---+-+-+-----------------------+-------------------------------+ // |Sev|C|R| Facility | Code | // +---+-+-+-----------------------+-------------------------------+ // // where // // Sev - is the severity code // // 00 - Success // 01 - Informational // 10 - Warning // 11 - Error // // C - is the Customer code flag // // R - is a reserved bit // // Facility - is the facility code // // Code - is the facility's status code // // // Define the facility codes // #define FACILITY_SYSTEM 0x0 #define FACILITY_STUBS 0x3 #define FACILITY_RUNTIME 0x2 #define FACILITY_IO_ERROR_CODE 0x4 // // Define the severity codes // #define STATUS_SEVERITY_WARNING 0x2 #define STATUS_SEVERITY_SUCCESS 0x0 #define STATUS_SEVERITY_INFORMATIONAL 0x1 #define STATUS_SEVERITY_ERROR 0x3 // // MessageId: SVC_ERROR // // MessageText: // // An error has occurred (%2). // #define SVC_ERROR ((DWORD)0xC0020001L) // A message file must end with a period on its own line // followed by a blank line. grr-3.1.0.2/grr/client/nanny/GRRNanny.mc000066400000000000000000000012041273104013200176050ustar00rootroot00000000000000MessageIdTypedef=DWORD SeverityNames=(Success=0x0:STATUS_SEVERITY_SUCCESS Informational=0x1:STATUS_SEVERITY_INFORMATIONAL Warning=0x2:STATUS_SEVERITY_WARNING Error=0x3:STATUS_SEVERITY_ERROR ) FacilityNames=(System=0x0:FACILITY_SYSTEM Runtime=0x2:FACILITY_RUNTIME Stubs=0x3:FACILITY_STUBS Io=0x4:FACILITY_IO_ERROR_CODE ) LanguageNames=(English=0x409:MSG00409) ; // The following are message definitions. MessageId=0x1 Severity=Error Facility=Runtime SymbolicName=SVC_ERROR Language=English An error has occurred (%2). . ; // A message file must end with a period on its own line ; // followed by a blank line. grr-3.1.0.2/grr/client/nanny/GRRNanny.rc000066400000000000000000000000471273104013200176160ustar00rootroot00000000000000LANGUAGE 0x9,0x1 1 11 "MSG00409.bin" grr-3.1.0.2/grr/client/nanny/GRRNanny.res000066400000000000000000000002201273104013200177740ustar00rootroot00000000000000 ÿÿÿÿP ÿÿ ÿÿ0 ÀÀ@An error has occurred (%2). grr-3.1.0.2/grr/client/nanny/GRRNanny.sln000066400000000000000000000031431273104013200200060ustar00rootroot00000000000000 Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 VisualStudioVersion = 12.0.31101.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GRRNanny", "GRRNanny.vcxproj", "{DFBFB0B4-546E-49E4-AE2F-7514BF7121B8}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 Win64|Win32 = Win64|Win32 Win64|x64 = Win64|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {DFBFB0B4-546E-49E4-AE2F-7514BF7121B8}.Debug|Win32.ActiveCfg = Debug|Win32 {DFBFB0B4-546E-49E4-AE2F-7514BF7121B8}.Debug|Win32.Build.0 = Debug|Win32 {DFBFB0B4-546E-49E4-AE2F-7514BF7121B8}.Debug|x64.ActiveCfg = Debug|x64 {DFBFB0B4-546E-49E4-AE2F-7514BF7121B8}.Debug|x64.Build.0 = Debug|x64 {DFBFB0B4-546E-49E4-AE2F-7514BF7121B8}.Release|Win32.ActiveCfg = Release|Win32 {DFBFB0B4-546E-49E4-AE2F-7514BF7121B8}.Release|Win32.Build.0 = Release|Win32 {DFBFB0B4-546E-49E4-AE2F-7514BF7121B8}.Release|x64.ActiveCfg = Release|x64 {DFBFB0B4-546E-49E4-AE2F-7514BF7121B8}.Release|x64.Build.0 = Release|x64 {DFBFB0B4-546E-49E4-AE2F-7514BF7121B8}.Win64|Win32.ActiveCfg = Win64|Win32 {DFBFB0B4-546E-49E4-AE2F-7514BF7121B8}.Win64|Win32.Build.0 = Win64|Win32 {DFBFB0B4-546E-49E4-AE2F-7514BF7121B8}.Win64|x64.ActiveCfg = Win64|x64 {DFBFB0B4-546E-49E4-AE2F-7514BF7121B8}.Win64|x64.Build.0 = Win64|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal grr-3.1.0.2/grr/client/nanny/GRRNanny.vcxproj000066400000000000000000000301351273104013200207060ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 Win64 Win32 Win64 x64 {DFBFB0B4-546E-49E4-AE2F-7514BF7121B8} Win32Proj GRRNanny Application true MultiByte v120 Application true MultiByte v120 Application false true MultiByte v120 Application false true MultiByte v120 Application false true Unicode v120 Application false true MultiByte v120 true true false $(SolutionDir)$(Platform)\$(Configuration)\ false false false Level3 Disabled WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) ..\..\..\ MultiThreaded Windows true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;psapi.lib;%(AdditionalDependencies) Level3 Disabled WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) ..\..\..\ MultiThreadedDebug Console true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;psapi.lib;%(AdditionalDependencies) Level3 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) ..\..\..\ MultiThreaded Console true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;psapi.lib;%(AdditionalDependencies) true true Level3 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) ..\..\..\ MultiThreaded Windows true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;psapi.lib;%(AdditionalDependencies) true true Level3 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreaded Console true true true Level3 MaxSpeed true true WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreaded Windows true true true grr-3.1.0.2/grr/client/nanny/README000066400000000000000000000040411273104013200165100ustar00rootroot00000000000000The GRR Nanny ============= The GRR Nanny is a minimalist program which monitors the GRR client program (as a child) for safety. If the child misbehaves (e.g. locks up or crashes), the nanny ensures it is restarted. The Nanny is supposed to run as a service and communicates with the child via a platform specific heartbeat mechanism. The child write the current timestamp into a shared heartbeat resource (e.g. a windows registry key or file), while the nanny checks that this timestamp is constantly incremented. If the child fails to record a heartbeat, the nanny kills the child, and then restarts it. In many use cases (e.g. a service running under windows), there is no command line available for the service, and therefore the nanny behaviour is not configured via command line parameters. The behaviour is built into the client as a static instance of a struct ControllerConfig: struct ControllerConfig { // Number of seconds the child must remain dead after a failure to produce a // heartbeat is detected. int resurrection_period; // The maximum number of seconds since the last child heartbeat. The child // will be killed if this is reached. int unresponsive_kill_period; // Identical messages are suppressed in the event log for this many seconds. int event_log_message_suppression; }; The child controller implements the policy about when the child should be started and killed. Unresponsive children are killed after the unresponsive_kill_period and restarted after the resurrection_period. For example this is an example timeline: |<=Child started |<=Child killed |<=Child started. --------------------------------------------------------------------> |<---------------------->| resurrection_period unresponsive_kill_period |<------------------------>| Children are restarted no more frequently than the resurrection_period, but we do not tolerate a child that does not produce a heart beat more frequently than the unresponsive_kill_period. The child will be killed but not restarted before the resurrection_period. grr-3.1.0.2/grr/client/nanny/child_controller.cc000066400000000000000000000052661273104013200214770ustar00rootroot00000000000000// Copyright 2012 Google Inc // All Rights Reserved. // // #include "grr/client/nanny/child_controller.h" #include namespace grr { // ----------------------------------------------------------------- // ChildProcess // ----------------------------------------------------------------- ChildProcess::ChildProcess() {} ChildProcess::~ChildProcess() {} EventLogger *ChildProcess::GetEventLogger() { return NULL; } // ----------------------------------------------------------------- // ChildController // ----------------------------------------------------------------- ChildController::~ChildController() {} ChildController::ChildController(const struct ControllerConfig config) : config_(config), child_(), last_heartbeat_time_(0) {} ChildController::ChildController(const struct ControllerConfig config, ChildProcess *child) : config_(config), child_(child), last_heartbeat_time_(0) {} void ChildController::KillChild(std::string msg) { child_->KillChild(msg); } // The main controller loop. Will be called periodically by the nanny. time_t ChildController::Run() { time_t now = child_->GetCurrentTime(); // Check the heartbeat from the child. time_t heartbeat = std::max(child_->GetHeartbeat(), last_heartbeat_time_); if (heartbeat == 0) { return 1; } last_heartbeat_time_ = heartbeat; time_t call_delay = 0; if (child_->Started() && child_->IsAlive()) { call_delay = config_.unresponsive_kill_period - (now - heartbeat); if (now - heartbeat > config_.unresponsive_kill_period) { // There is a very unlikely race condition if the machine gets suspended // for longer than unresponsive_kill_period seconds so we give the client // some time to catch up. child_->ChildSleep(2000); heartbeat = std::max(child_->GetHeartbeat(), last_heartbeat_time_); if (now - heartbeat > config_.unresponsive_kill_period) { // We have not received a heartbeat in a while, kill the child. child_->SetNannyMessage("No heartbeat received."); child_->KillChild("No heartbeat received."); call_delay = 1; } } } else { if (heartbeat + config_.unresponsive_kill_period + config_.resurrection_period <= now) { // Make the new child. child_->CreateChildProcess(); // Do not create the child again until it is time to resurrect it. last_heartbeat_time_ = now; call_delay = 1; } else { call_delay = heartbeat + config_.unresponsive_kill_period + config_.resurrection_period - now; } } return call_delay; } // ----------------------------------------------------------------- } // namespace grr grr-3.1.0.2/grr/client/nanny/child_controller.h000066400000000000000000000130121273104013200213250ustar00rootroot00000000000000// Copyright 2012 Google Inc // All Rights Reserved. // The nanny is an external process which controls the execution of a child // process. If the child crashes, or exits unexpectedly, the nanny will restart // the child. If the child becomes unresponsive, the nanny will kill the child. // The ChildController class implements the policy about when the child should // be started and killed. Unresponsive children are killed after the // unresponsive_kill_period and restarted after the resurrection_period. // For example, this is the time line: // | Child started | Child killed | Child started. // ----------------------------------------------------------------> // |<----------------->| unresponsive_kill_period // |<------------------------>| resurrection_period // The ChildProcess class encapsulates operating system specific control of the // child process (i.e. methods for killing and restarting the process). #ifndef GRR_CLIENT_NANNY_CHILD_CONTROLLER_H_ #define GRR_CLIENT_NANNY_CHILD_CONTROLLER_H_ #include #include "grr/client/nanny/event_logger.h" #ifdef WIN32 #define DISALLOW_COPY_AND_ASSIGN(TypeName) \ TypeName(const TypeName&); \ void operator=(const TypeName&) #else #include "base/macros.h" // for DISALLOW_COPY_AND_ASSIGN #endif namespace grr { // A configuration object which carries information used by the child // controller. struct ControllerConfig { // Number of seconds the child must remain dead. int resurrection_period; // The maximum number of seconds since the last child heartbeat. The child // will be killed if this is reached. int unresponsive_kill_period; // The time we give the client on first startup to start heartbeating. int unresponsive_grace_period; // Identical messages are suppressed in the event log for this many seconds. int event_log_message_suppression; // TODO(user): Implement fail over to older child binaries. This is useful // during client upgrade where there is a possibility that the child is faulty // and fails to start. We should maintain several known good versions of the // child binary and revert to a previous one after successive launch failures. // Number of failures until the child is considered broken, and the last known // good version is used. int failure_count_to_revert; // Hard memory limit for clients. unsigned int client_memory_limit; }; // This class represents the child process, and how to manage it. Concrete // implementations are platform specific. class ChildProcess { public: ChildProcess(); virtual ~ChildProcess(); // Kills the child unconditionally. virtual void KillChild(std::string msg) = 0; // Creates the child process. Returns true on success, false on failure // (e.g. the child executable is not found). virtual bool CreateChildProcess() = 0; // Checks the last heart beat from the child. Returns the time of the last // child heartbeat (Seconds since the Epoch). A value of 0 means the child // failed to read its heartbeat. virtual time_t GetHeartbeat() = 0; // Sets the heartbeat to a specific value. virtual void SetHeartbeat(unsigned int value) = 0; // Sets the heartbeat to the current time. virtual void Heartbeat() = 0; // Clears the last heartbeat time. virtual void ClearHeartbeat() = 0; // Gets the current time in seconds since the Epoch. virtual time_t GetCurrentTime() = 0; virtual EventLogger *GetEventLogger(); // Returns if the spawned process is still alive. virtual bool IsAlive() = 0; // Returns if a process has been spawned. virtual bool Started() = 0; // Returns the child's memory usage. virtual size_t GetMemoryUsage() = 0; // Sets the nanny message. virtual void SetNannyMessage(std::string msg) = 0; // Sets a nanny message to be sent with a delay. virtual void SetPendingNannyMessage(std::string msg) = 0; // Sets the nanny status. virtual void SetNannyStatus(std::string msg) = 0; // Just sleeps for the indicated time. virtual void ChildSleep(unsigned int milliseconds) = 0; private: DISALLOW_COPY_AND_ASSIGN(ChildProcess); }; // This base class implements the policies, and derived classes implement the // operating system specific actions. class ChildController { public: // This is the usual way to instantiate the ChildController. A new // ChildProcess is created. explicit ChildController(const struct ControllerConfig config); // This constructor is mainly called from tests, where the ChildProcess is // injected. In this case the controller takes ownership of the child. ChildController(const struct ControllerConfig config, ChildProcess *child); virtual ~ChildController(); // Kills the child unconditionally. virtual void KillChild(std::string msg); // The controller's main loop. This method should be called periodically to // check on the child's heartbeat status. Currently the child controller is // not thread-safe and so this method should always be called in the same // thread. After each invocation of Run(), the next call should follow not // more than the return value in seconds later. virtual time_t Run(); private: struct ControllerConfig config_; // The child process abstraction we manage the child with. ChildProcess *child_; // The last time we know the service ran. This is required if we can not read // the heartbeat from the child for some reason. time_t last_heartbeat_time_; DISALLOW_COPY_AND_ASSIGN(ChildController); }; } // namespace grr #endif // GRR_CLIENT_NANNY_CHILD_CONTROLLER_H_ grr-3.1.0.2/grr/client/nanny/child_controller_test.cc000066400000000000000000000205671273104013200225370ustar00rootroot00000000000000// Copyright 2012 Google Inc // All Rights Reserved. #include "grr/client/nanny/child_controller.h" #include "testing/base/public/gmock.h" #include "testing/base/public/gunit.h" using ::testing::_; using ::testing::Assign; using ::testing::AtLeast; using ::testing::Return; using ::testing::ReturnPointee; using ::testing::Mock; namespace grr { class MockChildProcess : public ChildProcess { public: MOCK_METHOD0(CreateChildProcess, bool()); MOCK_METHOD0(GetHeartbeat, time_t()); MOCK_METHOD0(ClearHeartbeat, void()); MOCK_METHOD1(SetHeartbeat, void(unsigned int)); MOCK_METHOD0(Heartbeat, void()); MOCK_METHOD1(KillChild, void(std::string msg)); MOCK_METHOD0(GetCurrentTime, time_t()); MOCK_METHOD0(IsAlive, bool()); MOCK_METHOD0(Started, bool()); MOCK_METHOD0(GetMemoryUsage, size_t()); MOCK_METHOD1(SetNannyMessage, void(std::string msg)); MOCK_METHOD1(SetNannyStatus, void(std::string msg)); MOCK_METHOD1(SetPendingNannyMessage, void(std::string msg)); MOCK_METHOD1(ChildSleep, void(unsigned int)); }; class ChildTest : public ::testing::Test {}; const struct ControllerConfig kConfig = { 60, // resurrection_period 30, // unresponsive_kill_period 300, // unresponsive_grace_period 60, // event_log_message_suppression }; TEST_F(ChildTest, StartsChildAtStartUp) { // This test verifies that Child process is started upon construction. MockChildProcess child; ChildController child_controller(kConfig, &child); EXPECT_CALL(child, CreateChildProcess()) .Times(1); EXPECT_CALL(child, GetCurrentTime()) .WillOnce(Return(1000)); EXPECT_CALL(child, GetHeartbeat()) .WillOnce(Return(100)); child_controller.Run(); ASSERT_TRUE(Mock::VerifyAndClearExpectations(&child)); } ACTION_P(SetAndReturn, p) { *p = true; return true; }; TEST_F(ChildTest, KillUnresponsiveChild) { // This test verifies that unresponsive children are killed and not restarted // until the resurrection_period. See comments atop child_controller.h. int current_epoch; bool alive = false; MockChildProcess child; ChildController child_controller(kConfig, &child); ON_CALL(child, GetCurrentTime()) .WillByDefault(ReturnPointee(¤t_epoch)); ON_CALL(child, IsAlive()) .WillByDefault(ReturnPointee(&alive)); ON_CALL(child, Started()) .WillByDefault(ReturnPointee(&alive)); ON_CALL(child, CreateChildProcess()) .WillByDefault(SetAndReturn(&alive)); ON_CALL(child, KillChild(_)) .WillByDefault(Assign(&alive, false)); ON_CALL(child, GetHeartbeat()) .WillByDefault(Return(10)); // Run for 20 seconds - child should start and not be killed. EXPECT_CALL(child, CreateChildProcess()) .Times(1); EXPECT_CALL(child, KillChild(_)) .Times(0); // Scan the time line. for (current_epoch = 1000; current_epoch < 1020; ++current_epoch) { child_controller.Run(); } ASSERT_TRUE(Mock::VerifyAndClearExpectations(&child)); // We now expect the child to be killed at least once and not restarted. EXPECT_CALL(child, CreateChildProcess()) .Times(0); EXPECT_CALL(child, KillChild(_)) .Times(AtLeast(1)); // Scan the time line. for (; current_epoch < 1040; ++current_epoch) { child_controller.Run(); } ASSERT_TRUE(Mock::VerifyAndClearExpectations(&child_controller)); // And now we expect the child to be started again. EXPECT_CALL(child, CreateChildProcess()) .Times(1); EXPECT_CALL(child, KillChild(_)) .Times(0); // Scan the time line - After 60 seconds we should start the child. for (current_epoch = 1040; current_epoch < 1100; current_epoch++) { child_controller.Run(); } ASSERT_TRUE(Mock::VerifyAndClearExpectations(&child)); } TEST_F(ChildTest, SteadyState) { // This test verifies that in the steady state we do not kill the children. int current_epoch; MockChildProcess child; ChildController child_controller(kConfig, &child); std::string msg; ON_CALL(child, GetCurrentTime()) .WillByDefault(ReturnPointee(¤t_epoch)); // Run for 20 seconds - child should start and not be killed. EXPECT_CALL(child, CreateChildProcess()) .Times(1); EXPECT_CALL(child, KillChild(msg)) .Times(0); ON_CALL(child, GetHeartbeat()) .WillByDefault(Return(100)); // Scan the time line. for (current_epoch = 1000; current_epoch < 1020; current_epoch++) { child_controller.Run(); } ASSERT_TRUE(Mock::VerifyAndClearExpectations(&child)); // Now the child heartbeats as normal. ON_CALL(child, GetHeartbeat()) .WillByDefault(ReturnPointee(¤t_epoch)); EXPECT_CALL(child, CreateChildProcess()) .Times(0); EXPECT_CALL(child, KillChild(msg)) .Times(0); // Run for 200 more seconds - We should not kill the child. for (; current_epoch < 1220; current_epoch += 10) { child_controller.Run(); } ASSERT_TRUE(Mock::VerifyAndClearExpectations(&child)); } TEST_F(ChildTest, TestSuspending) { // This test verifies that when the machine suspends, the client does not // get killed. int current_epoch, current_hb = 1; time_t sleep_time = 0; bool alive = false; MockChildProcess child; ChildController child_controller(kConfig, &child); std::string msg; ON_CALL(child, GetCurrentTime()) .WillByDefault(ReturnPointee(¤t_epoch)); ON_CALL(child, GetHeartbeat()) .WillByDefault(ReturnPointee(¤t_hb)); ON_CALL(child, IsAlive()) .WillByDefault(ReturnPointee(&alive)); ON_CALL(child, CreateChildProcess()) .WillByDefault(SetAndReturn(&alive)); // Run for 20 seconds - child should start and not be killed. EXPECT_CALL(child, CreateChildProcess()) .Times(1); EXPECT_CALL(child, KillChild(msg)) .Times(0); // Scan the time line. for (current_epoch = 1000; current_epoch < 1020; current_epoch += sleep_time) { sleep_time = child_controller.Run(); } // Scan the time line. for (; current_epoch < 2000; current_epoch += sleep_time) { // The child heartbeats only every 10 seconds. current_hb = (current_epoch / 10) * 10; sleep_time = child_controller.Run(); } // The machine suspends. current_epoch = 100000; // Scan the time line, child should not be killed. for (; current_epoch < 102000; current_epoch += sleep_time) { if ((current_epoch / 10) * 10 >= 100000) { current_hb = (current_epoch / 10) * 10; } sleep_time = child_controller.Run(); } ASSERT_TRUE(Mock::VerifyAndClearExpectations(&child)); } TEST_F(ChildTest, TestSuspendingWhenNannyWakesUpEarlier) { // This test verifies that when the nanny wakes up from a resume before the // client is ready, it waits and doesn't kill it right away. int current_epoch, current_hb = 0; int * p_epoch = ¤t_epoch; time_t sleep_time = 0; bool alive = false; MockChildProcess child; ChildController child_controller(kConfig, &child); std::string msg; bool started = false; ON_CALL(child, GetCurrentTime()) .WillByDefault(ReturnPointee(¤t_epoch)); ON_CALL(child, GetHeartbeat()) .WillByDefault(ReturnPointee(¤t_hb)); ON_CALL(child, IsAlive()) .WillByDefault(ReturnPointee(&alive)); ON_CALL(child, Started()) .WillByDefault(ReturnPointee(&started)); ON_CALL(child, CreateChildProcess()) .WillByDefault(DoAll(Assign(&started, true), SetAndReturn(&alive))); // Child should start and not be killed. EXPECT_CALL(child, CreateChildProcess()) .Times(1); EXPECT_CALL(child, KillChild(msg)) .Times(0); // Scan the time line. for (current_epoch = 1000; current_epoch < 1020; current_epoch += sleep_time) { sleep_time = child_controller.Run(); } for (current_epoch = 1020; current_epoch < 1200; current_epoch += sleep_time) { // The child heartbeats only every 10 seconds. current_hb = (current_epoch / 10) * 10; sleep_time = child_controller.Run(); } // The machine suspends. current_epoch = 100000; // While the nanny sleeps there should be a heartbeat. ON_CALL(child, ChildSleep(2000)) .WillByDefault(Assign(¤t_hb, *p_epoch)); // Scan the time line, child should not be killed. for (; current_epoch < 102000; current_epoch += sleep_time) { // Add a 5 second delay to the heartbeat. if (((current_epoch) / 10) * 10 >= 100000 + 5) { current_hb = (current_epoch / 10) * 10; } sleep_time = child_controller.Run(); } ASSERT_TRUE(Mock::VerifyAndClearExpectations(&child)); } } // namespace grr. grr-3.1.0.2/grr/client/nanny/compat.asm000066400000000000000000000003431273104013200176160ustar00rootroot00000000000000.586 .model flat .data __imp__EncodePointer@4 dd dummy __imp__DecodePointer@4 dd dummy EXTERNDEF __imp__EncodePointer@4 : DWORD EXTERNDEF __imp__DecodePointer@4 : DWORD .code dummy proc mov eax, [esp+4] ret 4 dummy endp end grr-3.1.0.2/grr/client/nanny/event_logger.cc000066400000000000000000000015511273104013200206220ustar00rootroot00000000000000// Copyright 2012 Google Inc // All Rights Reserved. // A throttled windows event logger. #include "grr/client/nanny/event_logger.h" #include // for va_end, va_list, va_start #include // for vsnprintf namespace grr { // --------------------------------------------------------- // Event Logger Class // --------------------------------------------------------- EventLogger::~EventLogger() {} void EventLogger::Log(const char *fmt, ...) { time_t now = GetCurrentTime(); char message[4096]; va_list ap; va_start(ap, fmt); vsnprintf(message, sizeof(message), fmt, ap); va_end(ap); if (message == last_message_ && now - last_message_time_ <= message_suppression_time_) { return; } last_message_ = message; last_message_time_ = now; WriteLog(message); } } // namespace grr grr-3.1.0.2/grr/client/nanny/event_logger.h000066400000000000000000000037231273104013200204670ustar00rootroot00000000000000// Copyright 2012 Google Inc // All Rights Reserved. #ifndef GRR_CLIENT_NANNY_EVENT_LOGGER_H_ #define GRR_CLIENT_NANNY_EVENT_LOGGER_H_ #include // for string #ifdef WIN32 #define DISALLOW_COPY_AND_ASSIGN(TypeName) \ TypeName(const TypeName&); \ void operator=(const TypeName&) #else #include "base/macros.h" // for DISALLOW_COPY_AND_ASSIGN #endif // Windows uses evil macros which interfer with proper C++. #ifdef GetCurrentTime #undef GetCurrentTime #endif namespace grr { // A class which manages logging to a suitable event log. The specific event log // is platform dependent. For example, the windows implementation uses the // windows event log, the Linux one will use syslog. class EventLogger { public: // Default logger suppresses identical messages within a 60 second period. EventLogger() : last_message_(), last_message_time_(0), message_suppression_time_(60) {} virtual ~EventLogger(); // Generate an event log message with the same semantics as printf. virtual void Log(const char *fmt, ...); // Sets the time in seconds for which we will suppress any duplicate messages // that match the most recently printed message. void set_message_suppression_time(int suppression_time) { message_suppression_time_ = suppression_time; } protected: // Write the message to the appropriate platform-specific log. virtual void WriteLog(std::string message) = 0; // Gets the current wall clock time in seconds since the epoch. virtual time_t GetCurrentTime() = 0; private: // The last message we wrote to the log. std::string last_message_; // When the last message was written (seconds since Epoch). time_t last_message_time_; // If an identical message is generated within this many seconds, it is // suppressed. int message_suppression_time_; DISALLOW_COPY_AND_ASSIGN(EventLogger); }; } // namespace grr #endif // GRR_CLIENT_NANNY_EVENT_LOGGER_H_ grr-3.1.0.2/grr/client/nanny/event_logger_test.cc000066400000000000000000000034671273104013200216710ustar00rootroot00000000000000// Copyright 2012 Google Inc // All Rights Reserved. #include "grr/client/nanny/event_logger.h" #include "testing/base/public/gmock.h" #include "testing/base/public/gunit.h" using ::testing::_; using ::testing::Return; namespace grr { class MockLogger : public EventLogger { public: MOCK_METHOD0(GetCurrentTime, time_t()); MOCK_METHOD1(WriteLog, void(std::string)); }; class LoggerTest : public ::testing::Test {}; TEST_F(LoggerTest, WritesMessageToLog) { // This test verifies that Logger writes a message to the Log source. MockLogger logger; EXPECT_CALL(logger, WriteLog(_)) .Times(1); logger.Log("Test"); } TEST_F(LoggerTest, RepeatedMessagesAreNotSuppresed) { // This test verifies that Logger does not suppress repeated messages after // the time period. MockLogger logger; // Set the logger suppression time. logger.set_message_suppression_time(10); EXPECT_CALL(logger, GetCurrentTime()) .Times(3) .WillOnce(Return(10)) .WillOnce(Return(25)) .WillOnce(Return(36)); // We still expect two messages to be written. EXPECT_CALL(logger, WriteLog(_)) .Times(3); // Log 3 times in rapid succession for (int i = 0; i < 3; i++) { logger.Log("Test"); } } TEST_F(LoggerTest, RepeatedMessagesAreSuppressed) { // This test verifies that Logger suppresses repeated messages within the time // period. MockLogger logger; // Set the logger suppression time. logger.set_message_suppression_time(60); EXPECT_CALL(logger, GetCurrentTime()) .WillOnce(Return(1)) .WillOnce(Return(2)) .WillOnce(Return(3)); // We still expect only a single message to be written. EXPECT_CALL(logger, WriteLog(_)) .Times(1); // Log 3 times in rapid succession for (int i = 0; i < 3; i++) { logger.Log("Test"); } } } // namespace grr grr-3.1.0.2/grr/client/nanny/windows_nanny.cc000066400000000000000000000671551273104013200210530ustar00rootroot00000000000000// Copyright 2012 Google Inc // All Rights Reserved. // // // This windows service installation code is inspired from the MSDN article: // http://msdn.microsoft.com/en-us/library/windows/desktop/bb540475(v=vs.85).aspx #include "grr/client/nanny/windows_nanny.h" #include #include #include #include #include /* On Windows 8 or later a separate include is required * earlier versions implicitely include winbase.h from windows.h */ #if WINVER >= 0x602 #include #endif #include #include #include // Windows uses evil macros which interfere with proper C++. #ifdef GetCurrentTime #undef GetCurrentTime #endif #include "grr/client/nanny/child_controller.h" #include "grr/client/nanny/event_logger.h" using ::grr::EventLogger; namespace grr { // Global objects for synchronization. SERVICE_STATUS g_service_status; SERVICE_STATUS_HANDLE g_service_status_handler; HANDLE g_service_stop_event = NULL; // Open initial connection with event log. WindowsEventLogger::WindowsEventLogger(const char *message) : StdOutLogger() { // If this fails, we do not log anything. There is nothing else we could do if // we cannot log to the event log. event_source = RegisterEventSource(NULL, kNannyConfig->service_name); if (message) { Log(message); } } WindowsEventLogger::WindowsEventLogger() { // If this fails, we do not log anything. There is nothing else we could do if // we cannot log to the event log. event_source = RegisterEventSource(NULL, kNannyConfig->service_name); } // Unregister with the event log. WindowsEventLogger::~WindowsEventLogger() { if (event_source) { DeregisterEventSource(event_source); } } // Write the log message to the event log. void WindowsEventLogger::WriteLog(std::string message) { const TCHAR *strings[2]; strings[0] = kNannyConfig->service_name; strings[1] = message.c_str(); // TODO(user): change this into overwriting % with place holder chars // or equiv if (message.find("%") != std::string::npos) { strings[1] = "Invalid event message (Contains %%)"; } if (event_source) { ReportEvent(event_source, // event log handle EVENTLOG_ERROR_TYPE, // event type 0, // event category 1, // event identifier NULL, // no security identifier 2, // size of lpszStrings array 0, // no binary data strings, // array of strings NULL); // no binary data } } // --------------------------------------------------------- // StdOutLogger: A logger to stdout. // --------------------------------------------------------- StdOutLogger::StdOutLogger() {} StdOutLogger::~StdOutLogger() {} StdOutLogger::StdOutLogger(const char *message) { printf("%s\n", message); } // Gets the current epoch time.. time_t StdOutLogger::GetCurrentTime() { return time(NULL); } void StdOutLogger::WriteLog(std::string message) { printf("%s\n", message.c_str()); } // --------------------------------------------------------- // WindowsChildProcess: Implementation of the windows child controller. // --------------------------------------------------------- class WindowsChildProcess : public grr::ChildProcess { public: WindowsChildProcess(); virtual ~WindowsChildProcess(); // The methods below are overridden from Childprocess. See child_controller.h // for more information. virtual void KillChild(std::string msg); virtual bool CreateChildProcess(); virtual time_t GetCurrentTime(); virtual EventLogger *GetEventLogger(); virtual void SetNannyMessage(std::string msg); virtual void SetPendingNannyMessage(std::string msg); virtual void SetNannyStatus(std::string msg); virtual time_t GetHeartbeat(); virtual void ClearHeartbeat(); virtual void SetHeartbeat(unsigned int value); virtual void Heartbeat(); virtual size_t GetMemoryUsage(); virtual bool IsAlive(); virtual bool Started(); virtual void ChildSleep(unsigned int milliseconds); private: PROCESS_INFORMATION child_process; WindowsEventLogger logger_; std::string pendingNannyMsg_; DISALLOW_COPY_AND_ASSIGN(WindowsChildProcess); }; EventLogger *WindowsChildProcess::GetEventLogger() { return &logger_; } // Kills the child. void WindowsChildProcess::KillChild(std::string msg) { if (child_process.hProcess == NULL) return; SetNannyStatus(msg); TerminateProcess(child_process.hProcess, 0); // Wait for the process to exit. if (WaitForSingleObject(child_process.hProcess, 2000) != WAIT_OBJECT_0) { logger_.Log("Unable to kill child within specified time."); } CloseHandle(child_process.hProcess); CloseHandle(child_process.hThread); child_process.hProcess = NULL; return; } // Returns the last time the child produced a heartbeat. time_t WindowsChildProcess::GetHeartbeat() { DWORD last_heartbeat = 0; DWORD data_len = sizeof(last_heartbeat); DWORD type; if (RegQueryValueEx(kNannyConfig->service_key, kGrrServiceHeartbeatTimeKey, 0, &type, reinterpret_cast(&last_heartbeat), &data_len) != ERROR_SUCCESS || type != REG_DWORD || data_len != sizeof(last_heartbeat)) { return 0; } return last_heartbeat; } // Clears the heartbeat. void WindowsChildProcess::ClearHeartbeat() { SetHeartbeat(0); } // Sets the heartbeat to the current time. void WindowsChildProcess::Heartbeat() { SetHeartbeat((unsigned int)GetCurrentTime()); } void WindowsChildProcess::SetHeartbeat(unsigned int value) { DWORD v = value; HRESULT result = 0; result = RegSetValueEx(kNannyConfig->service_key, kGrrServiceHeartbeatTimeKey, 0, REG_DWORD, reinterpret_cast(&v), sizeof(DWORD)); if (result != ERROR_SUCCESS) { TCHAR errormsg[1024]; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, result, 0, errormsg, 1024, NULL); logger_.Log("Unable to set heartbeat value: %s", errormsg); } } // This sends a status message back to the server in case of a child kill. void WindowsChildProcess::SetNannyStatus(std::string msg) { if (RegSetValueExA(kNannyConfig->service_key, kGrrServiceNannyStatusKey, 0, REG_SZ, reinterpret_cast(msg.c_str()), (DWORD)(msg.size() + 1)) != ERROR_SUCCESS) { logger_.Log("Unable to set Nanny status (%s).", msg.c_str()); } } void WindowsChildProcess::SetPendingNannyMessage(std::string msg) { pendingNannyMsg_ = msg; } // This sends a message back to the server. void WindowsChildProcess::SetNannyMessage(std::string msg) { if (RegSetValueExA(kNannyConfig->service_key, kGrrServiceNannyMessageKey, 0, REG_SZ, reinterpret_cast(msg.c_str()), (DWORD)(msg.size() + 1)) != ERROR_SUCCESS) { logger_.Log("Unable to set Nanny message (%s).", msg.c_str()); } } // Launch the child process. bool WindowsChildProcess::CreateChildProcess() { DWORD creation_flags = 0; if (pendingNannyMsg_ != "") { SetNannyMessage(pendingNannyMsg_); pendingNannyMsg_ = ""; } // If the child is already running or we have a handle to it, try to kill it. if (IsAlive()) { KillChild("Child process restart."); } // Just copy our own startup info for the child. STARTUPINFO startup_info; GetStartupInfo(&startup_info); // From: http://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspx // If this parameter is NULL and the environment block of the parent process // contains Unicode characters, you must also ensure that dwCreationFlags // includes CREATE_UNICODE_ENVIRONMENT. #if defined( UNICODE ) creation_flags = CREATE_UNICODE_ENVIRONMENT; #endif // Now try to start it. if (!CreateProcess( kNannyConfig->child_process_name, // Application Name kNannyConfig->child_command_line, // Command line NULL, // Process attributes NULL, // lpThreadAttributes 0, // bInheritHandles creation_flags, // dwCreationFlags NULL, // lpEnvironment NULL, // lpCurrentDirectory &startup_info, // lpStartupInfo &child_process)) { logger_.Log("Unable to launch child process: %s %u.", kNannyConfig->child_process_name, GetLastError()); return false; } return true; } // Return the current date and time in seconds since 1970. time_t WindowsChildProcess::GetCurrentTime() { return time(NULL); } void WindowsChildProcess::ChildSleep(unsigned int milliseconds) { Sleep(milliseconds); } size_t WindowsChildProcess::GetMemoryUsage() { PROCESS_MEMORY_COUNTERS pmc; if (!child_process.hProcess) { return 0; } if (GetProcessMemoryInfo(child_process.hProcess, &pmc, sizeof(pmc))) { return (size_t) pmc.WorkingSetSize; } DWORD res = GetLastError(); TCHAR errormsg[1024]; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, res, 0, errormsg, 1024, NULL); logger_.Log("Could not obtain memory information: %s", errormsg); return 0; } bool WindowsChildProcess::IsAlive() { DWORD exit_code = 0; if (!child_process.hProcess) { return true; } if (!GetExitCodeProcess(child_process.hProcess, &exit_code)) { return false; } return exit_code == STILL_ACTIVE; } bool WindowsChildProcess::Started() { return child_process.hProcess != NULL; } WindowsChildProcess::WindowsChildProcess() : logger_(NULL), pendingNannyMsg_("") { ClearHeartbeat(); } WindowsChildProcess::~WindowsChildProcess() { KillChild("Shutting down."); } // ----------------------------------------------------------- // Implementation of the WindowsControllerConfig configuration // manager. // ----------------------------------------------------------- WindowsControllerConfig::WindowsControllerConfig() : logger_(NULL) { // Child must stay dead for this many seconds. controller_config.resurrection_period = 60; // If we receive no heartbeats from the client in this long, child // is killed. controller_config.unresponsive_kill_period = 180; controller_config.unresponsive_grace_period = 600; controller_config.event_log_message_suppression = 60 * 60 * 24; controller_config.failure_count_to_revert = 0; controller_config.client_memory_limit = 1024 * 1024 * 1024; service_hive = HKEY_LOCAL_MACHINE; service_key = NULL; service_key_name = NULL; service_name[0] = '\0'; service_description[0] = '\0'; action = TEXT(""); } WindowsControllerConfig::~WindowsControllerConfig() { if (service_key) { RegCloseKey(service_key); } } // Read a value from the service key and store in dest. DWORD WindowsControllerConfig::ReadValue(const TCHAR *value_name, TCHAR *dest, DWORD len) { DWORD type; if (RegQueryValueEx(service_key, value_name, 0, &type, reinterpret_cast(dest), &len) != ERROR_SUCCESS || type != REG_SZ || len >= MAX_PATH) { logger_.Log("Unable to open value %s.", value_name); return ERROR_INVALID_DATA; } // Ensure it is null terminated. dest[len] = '\0'; return ERROR_SUCCESS; } // Parses configuration parameters from __argv. DWORD WindowsControllerConfig::ParseConfiguration(void) { int i; for (i = 1; i < __argc; i++) { char * parameter = __argv[i]; if (!strcmp(__argv[i], "--service_key") && i + 1 < __argc) { i++; service_key_name = __argv[i]; continue; } if (!strcmp(__argv[i], "install")) { action = __argv[i]; continue; } logger_.Log("Unable to parse command line parameter %s", __argv[i]); return ERROR_INVALID_DATA; } if (!service_key_name) { logger_.Log("No service key set. Please ensure --service_key is " "specified."); return ERROR_INVALID_DATA; } // Try to open the service key now. HRESULT result = RegOpenKeyEx(service_hive, service_key_name, 0, KEY_READ | KEY_WRITE, &service_key); if (result != ERROR_SUCCESS) { service_key = 0; TCHAR errormsg[1024]; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, result, 0, errormsg, 1024, NULL); logger_.Log("Unable to open service key (%s): %s", service_key_name, errormsg); return result; } // Get the child command line from the service key. The installer // should pre-populate this key for us. We fail if we can not find // it result = ReadValue(kGrrServiceBinaryChildKey, child_process_name, sizeof(child_process_name)); if (result != ERROR_SUCCESS) return result; result = ReadValue(kGrrServiceBinaryCommandLineKey, child_command_line, sizeof(child_command_line)); if (result != ERROR_SUCCESS) return result; result = ReadValue(kGrrServiceNameKey, service_name, sizeof(service_name)); if (result != ERROR_SUCCESS) return result; result = ReadValue(kGrrServiceDescKey, service_description, sizeof(service_description)); if (result != ERROR_SUCCESS) service_description[0] = '\0'; return ERROR_SUCCESS; } // --------------------------------------------------------- // Service Setup and installation. // --------------------------------------------------------- // --------------------------------------------------------- // StopService() // // Waits a predetermined time for the service to stop. // Returns false if we failed to stop the service. // --------------------------------------------------------- bool StopService(SC_HANDLE service_handle, int time_out) { // Send a stop code to the service. SERVICE_STATUS_PROCESS service_status_process; DWORD bytes_needed; time_t start_time = GetTickCount(); int count = 0; WindowsEventLogger logger; printf("Stopping Service\n"); // Make sure the service is not already stopped. if (!QueryServiceStatusEx( service_handle, SC_STATUS_PROCESS_INFO, (LPBYTE)&service_status_process, sizeof(SERVICE_STATUS_PROCESS), &bytes_needed)) { logger.Log("QueryServiceStatusEx failed (%d)\n", GetLastError()); return false; } if (service_status_process.dwCurrentState == SERVICE_STOPPED) { printf("Service is already stopped.\n"); return true; } // If a stop is pending, wait for it. while (service_status_process.dwCurrentState == SERVICE_STOP_PENDING) { printf("%d Service stop pending...\n", count++); Sleep(1000); if (!QueryServiceStatusEx( service_handle, SC_STATUS_PROCESS_INFO, (LPBYTE)&service_status_process, sizeof(SERVICE_STATUS_PROCESS), &bytes_needed)) { logger.Log("QueryServiceStatusEx failed (%d)\n", GetLastError()); return false; } if (service_status_process.dwCurrentState == SERVICE_STOPPED) { printf("Service stopped successfully.\n"); return true; } if ( GetTickCount() - start_time > 60000 ) { logger.Log("Service stop timed out.\n"); return false; } } if (!ControlService(service_handle, SERVICE_CONTROL_STOP, reinterpret_cast( &service_status_process))) { logger.Log("Unable to stop existing service\n"); return false; } // Wait for the service to stop. while (service_status_process.dwCurrentState != SERVICE_STOPPED) { Sleep(service_status_process.dwWaitHint); if (!QueryServiceStatusEx(service_handle, SC_STATUS_PROCESS_INFO, reinterpret_cast(&service_status_process), sizeof(SERVICE_STATUS_PROCESS), &bytes_needed)) { logger.Log("Unable to stop existing service\n"); return false; } if (GetTickCount() - start_time > time_out) { logger.Log("Wait timed out\n"); return false; } } printf("Service stopped successfully\n"); return true; } #if defined(_WIN32) typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, BOOL*); // --------------------------------------------------------- // windows_nanny_IsWow64Process() // // Replace of IsWow64Process function for Windows XP SP1 // and earlier versions. Uses dynamic late binding to call the // IsWow64Process function or returns False otherwise. // Returns True if successful, False otherwise // --------------------------------------------------------- BOOL windows_nanny_IsWow64Process(HANDLE hProcess, BOOL *Wow64Process) { LPFN_ISWOW64PROCESS function = NULL; HMODULE library_handle = NULL; BOOL result = FALSE; if (hProcess == NULL) { return FALSE; } if (Wow64Process == NULL) { return FALSE; } library_handle = LoadLibrary(_T("kernel32.dll")); if (library_handle == NULL) { return FALSE; } function = (LPFN_ISWOW64PROCESS) GetProcAddress( library_handle, (LPCSTR) "IsWow64Process"); if (function != NULL) { result = function(hProcess, Wow64Process); } else { *Wow64Process = FALSE; result = TRUE; } if (FreeLibrary(library_handle) != TRUE) { result = FALSE; } return result; } #endif // --------------------------------------------------------- // InstallService() // // Installs the service. This fuction typically runs in the context of the // command shell hence printf() works. // Returns -1 if service failed to be installed, and 0 on success. // --------------------------------------------------------- bool InstallService() { SC_HANDLE service_control_manager; SC_HANDLE service_handle = NULL; TCHAR module_name[MAX_PATH]; SERVICE_DESCRIPTION service_descriptor; WindowsEventLogger logger(NULL); unsigned int tries = 0; DWORD error_code = 0; #if defined(_WIN32) BOOL f64 = FALSE; BOOL result = FALSE; // Using dynamic late binding here to support WINVER < 0x501 // TODO(user): remove this function make sure to have the installer // detect right platform also see: // http://blogs.msdn.com/b/david.wang/archive/2006/03/26/ // howto-detect-process-bitness.aspx result = windows_nanny_IsWow64Process(GetCurrentProcess(), &f64); if (result && f64) { printf("32 bit installer should not be run on a 64 bit machine!\n"); return false; } #endif if (!GetModuleFileName(NULL, module_name, MAX_PATH)) { logger.Log("Cannot install service.\n"); return false; } service_control_manager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (service_control_manager == NULL) { error_code = GetLastError(); logger.Log("Unable to open Service Control Manager - error code: " "0x%08x.\n", error_code); return false; } // module_name contains the path to the service binary and is used in the // service command line. kNannyConfig->service_name contains the name of the // service. std::string command_line(module_name); command_line += " --service_key \""; command_line += kNannyConfig->service_key_name; command_line += "\""; service_handle = OpenService( service_control_manager, // SCM database kNannyConfig->service_name, // name of service SERVICE_ALL_ACCESS); // need delete access if (service_handle == NULL) { error_code = GetLastError(); if (error_code != ERROR_SERVICE_DOES_NOT_EXIST) { printf("Unable to open service: %s unexpected error - error code: " "0x%08x.\n", kNannyConfig->service_name, error_code); goto on_error; } // If the service does not exists, create it. service_handle = CreateService( service_control_manager, kNannyConfig->service_name, kNannyConfig->service_name, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, // Run in our own process. SERVICE_AUTO_START, // Come up on regular startup. SERVICE_ERROR_NORMAL, // If we fail to start, log it and move on. command_line.c_str(), // Command line for the service. NULL, NULL, NULL, NULL, NULL); // Run as LocalSystem so no username and password. if (service_handle == NULL) { error_code = GetLastError(); printf("Unable to create service: %s - error code: 0x%08x.\n", kNannyConfig->service_name, error_code); goto on_error; } } else { if (!StopService(service_handle, 60000)) { printf("Service could not be stopped. This is ok if the service is not " "already started.\n"); } // Set the path to the service binary. if (ChangeServiceConfig( service_handle, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE, command_line.c_str(), NULL, NULL, NULL, NULL, NULL, NULL) == 0) { error_code = GetLastError(); printf("Unable to change service: %s configuration - error code: " "0x%08x.\n", kNannyConfig->service_name, error_code); } } // Set the service description. service_descriptor.lpDescription = kNannyConfig->service_description; if (!ChangeServiceConfig2(service_handle, SERVICE_CONFIG_DESCRIPTION, &service_descriptor)) { error_code = GetLastError(); logger.Log("Unable to set service: %s description - error code: 0x%08x.\n", kNannyConfig->service_name, error_code); } // Start the service. if (!StartService(service_handle, 0, NULL)) { error_code = GetLastError(); printf("Unable to start service: %s - error code: 0x%08x.\n", kNannyConfig->service_name, error_code); } else { printf("Service: %s started as: %s\n", kNannyConfig->service_name, module_name); } CloseServiceHandle(service_handle); CloseServiceHandle(service_control_manager); return true; on_error: if (service_handle != NULL) { CloseServiceHandle(service_handle); } if (service_control_manager != NULL) { CloseServiceHandle(service_control_manager); } return false; } // Send a status report to the service event manager. void ReportSvcStatus(DWORD current_state, DWORD win32_exit_code, DWORD wait_hint) { static DWORD check_point = 1; // Fill in the SERVICE_STATUS structure. g_service_status.dwCurrentState = current_state; g_service_status.dwWin32ExitCode = win32_exit_code; g_service_status.dwWaitHint = wait_hint; g_service_status.dwControlsAccepted = ( current_state == SERVICE_START_PENDING ? 0 : SERVICE_ACCEPT_STOP); if (current_state == SERVICE_RUNNING || current_state == SERVICE_STOPPED) { g_service_status.dwCheckPoint = 0; } else { g_service_status.dwCheckPoint = check_point++; } // Report the status of the service to the SCM. SetServiceStatus(g_service_status_handler, &g_service_status); } // Handles the requested control code. VOID WINAPI SvcCtrlHandler(DWORD control) { switch (control) { case SERVICE_CONTROL_STOP: ReportSvcStatus(SERVICE_STOP_PENDING, NO_ERROR, 0); // Signal the service to stop. SetEvent(g_service_stop_event); ReportSvcStatus(g_service_status.dwCurrentState, NO_ERROR, 0); return; case SERVICE_CONTROL_INTERROGATE: break; default: break; } } // The main function for the service. VOID WINAPI ServiceMain(int argc, LPTSTR *argv) { WindowsControllerConfig global_config; WindowsEventLogger logger; // Parse the configuration and set the global object. if (global_config.ParseConfiguration() == ERROR_SUCCESS) { kNannyConfig = &global_config; } else { printf("Unable to parse command line."); return; } // Registers the handler function for the service. g_service_status_handler = RegisterServiceCtrlHandler( kNannyConfig->service_name, SvcCtrlHandler); if (!g_service_status_handler) { logger.Log("RegisterServiceCtrlHandler failed."); return; } // These SERVICE_STATUS members remain as set here. g_service_status.dwServiceType = SERVICE_WIN32_OWN_PROCESS; g_service_status.dwServiceSpecificExitCode = 0; // Report initial status to the SCM. ReportSvcStatus(SERVICE_START_PENDING, NO_ERROR, 3000); // Create an event. The control handler function, SvcCtrlHandler, signals this // event when it receives the stop control code. g_service_stop_event = CreateEvent( NULL, // default security attributes TRUE, // manual reset event FALSE, // not signaled NULL); // no name if (!g_service_stop_event) { ReportSvcStatus(SERVICE_STOPPED, NO_ERROR, 0); return; } // Create a new child to control. WindowsChildProcess child; grr::ChildController child_controller(kNannyConfig->controller_config, &child); // Report running status when initialization is complete. ReportSvcStatus(SERVICE_RUNNING, NO_ERROR, 0); child.CreateChildProcess(); // Give the child process some time to start up. During boot it sometimes // takes significantly more time than the unresponsive_kill_period to start // the child so we disable checking for heartbeats for a while. child.Heartbeat(); time_t sleep_time = kNannyConfig->controller_config.unresponsive_grace_period; // Spin in this loop until the service is stopped. while (1) { for (unsigned int i = 0; i < sleep_time; i++) { // Check every second whether to stop the service. if (WaitForSingleObject(g_service_stop_event, 1000) != WAIT_TIMEOUT) { child.KillChild("Service stopped."); ReportSvcStatus(SERVICE_STOPPED, NO_ERROR, 0); return; } if (child.GetMemoryUsage() > kNannyConfig->controller_config.client_memory_limit) { child.KillChild("Child process exceeded memory limit."); break; } if (child.Started() && !child.IsAlive()) { int shutdown_pending = GetSystemMetrics(SM_SHUTTINGDOWN); if (shutdown_pending == 0) { child.SetPendingNannyMessage("Unexpected child process exit!"); child.KillChild("Child process exited."); break; } else { // The machine is shutting down. We just keep going until we get // the service_stop_event. continue; } } } // Run the child a bit more. sleep_time = child_controller.Run(); } } // The main function. int _cdecl real_main(int argc, TCHAR *argv[]) { // If command-line parameter is "install", install the service. // Otherwise, the service is probably being started by the SCM. WindowsControllerConfig global_config; // Parse the configuration and set the global object. if (global_config.ParseConfiguration() == ERROR_SUCCESS) { kNannyConfig = &global_config; } else { printf("Unable to parse command line.\n"); return -1; } if (lstrcmpi(global_config.action, TEXT("install")) == 0) { return InstallService() ? 0 : -1; } // This table contains all the services provided by this binary. SERVICE_TABLE_ENTRY kDispatchTable[] = { { kNannyConfig->service_name, reinterpret_cast(ServiceMain) }, { NULL, NULL } }; // This call returns when the service has stopped. // The process should simply terminate when the call returns. if (!StartServiceCtrlDispatcher(kDispatchTable)) { WindowsEventLogger("StartServiceCtrlDispatcher"); } return 0; } } // namespace grr // Main entry point when built as a windows application. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, char *lpCmdLine, int nCmdShow) { return grr::real_main(__argc, __argv); } // Main entry point when build as a console application. int _tmain(int argc, char *argv[]) { return grr::real_main(argc, argv); } grr-3.1.0.2/grr/client/nanny/windows_nanny.h000066400000000000000000000104171273104013200207020ustar00rootroot00000000000000// Copyright 2012 Google Inc // All Rights Reserved. // #ifndef GRR_CLIENT_NANNY_WINDOWS_NANNY_H_ #define GRR_CLIENT_NANNY_WINDOWS_NANNY_H_ // This is required in order to force the MSVC compiler to use the old API for // backwards compatibility. See // https://msdn.microsoft.com/en-us/library/windows/desktop/ms683219(v=vs.85).aspx #undef PSAPI_VERSION #define PSAPI_VERSION 1 // The nanny is a service which runs another child executable, and makes it // behave. The nanny itself is very simple, hence is it unlikely to leak or // crash itself, but is used to ensure the more complex child behaves. // This file implements a Windows-specific ChildController (see description in // child_controller.h). #include // Windows uses evil macros which interfer with proper C++. #ifdef GetCurrentTime #undef GetCurrentTime #endif #include "grr/client/nanny/child_controller.h" namespace grr { const TCHAR *kGrrServiceNameKey = TEXT("Nanny.service_name"); const TCHAR *kGrrServiceDescKey = TEXT("Nanny.service_description"); // This is the root of the service configuration branch in the // registry. It is normally passed through the --service_key command // line arg. TCHAR* kGrrServiceRegistry = NULL; // A registry value specifying the child that will be run. const TCHAR* kGrrServiceBinaryChildKey = TEXT("Nanny.child_binary"); const TCHAR* kGrrServiceBinaryCommandLineKey = TEXT("Nanny.child_command_line"); // A backup binary location, in case the primary binary failed to start. const TCHAR* kGrrServiceBinaryChildAlternate = TEXT( "Nanny.child_last_known_good"); // The registry value which is updated for each heartbeat. It is a REG_DWORD and // stores a unix epoch time. const TCHAR* kGrrServiceHeartbeatTimeKey = TEXT("Nanny.heartbeat"); // The registry value which is updated for the nanny messages. const TCHAR* kGrrServiceNannyMessageKey = TEXT("Nanny.message"); // The registry value which is updated for the nanny status. const TCHAR* kGrrServiceNannyStatusKey = TEXT("Nanny.status"); // --------------------------------------------------------- // StdOutLogger: A logger to stdout. // --------------------------------------------------------- class StdOutLogger : public grr::EventLogger { public: StdOutLogger(); // An optional message can be passed to the constructor to log a single // message upon construction. This is useful for one-time log messages to be // written to the event log. explicit StdOutLogger(const char *message); virtual ~StdOutLogger(); protected: void WriteLog(std::string message); virtual time_t GetCurrentTime(); private: DISALLOW_COPY_AND_ASSIGN(StdOutLogger); }; // --------------------------------------------------------- // WindowsEventLogger: Implementation of the windows event logger. // --------------------------------------------------------- class WindowsEventLogger : public grr::StdOutLogger { public: WindowsEventLogger(); // An optional message can be passed to the constructor to log a single // message upon construction. This is useful for one-time log messages to be // written to the event log. explicit WindowsEventLogger(const char *message); virtual ~WindowsEventLogger(); protected: virtual void WriteLog(std::string message); private: HANDLE event_source; DISALLOW_COPY_AND_ASSIGN(WindowsEventLogger); }; // We store all configuration specific to the windows nanny in this // global struct. class WindowsControllerConfig { public: WindowsControllerConfig(); virtual ~WindowsControllerConfig(); struct grr::ControllerConfig controller_config; // A registry key that holds GRR service configuration. HKEY service_hive; HKEY service_key; // The main service key name. TCHAR *service_key_name; TCHAR service_name[MAX_PATH]; TCHAR service_description[MAX_PATH]; // The action to perform. Currently "install". TCHAR *action; TCHAR child_process_name[MAX_PATH]; TCHAR child_command_line[MAX_PATH]; DWORD ParseConfiguration(void); private: StdOutLogger logger_; DWORD ReadValue(const TCHAR *value, TCHAR *dest, DWORD len); DISALLOW_COPY_AND_ASSIGN(WindowsControllerConfig); }; // The global configuration object. Will be initialized by the main() // function. WindowsControllerConfig *kNannyConfig = NULL; } // namespace grr #endif // GRR_CLIENT_NANNY_WINDOWS_NANNY_H_ grr-3.1.0.2/grr/client/osx/000077500000000000000000000000001273104013200153175ustar00rootroot00000000000000grr-3.1.0.2/grr/client/osx/__init__.py000066400000000000000000000002641273104013200174320ustar00rootroot00000000000000#!/usr/bin/env python """This module contains os specific client code.""" # These need to register plugins so, pylint: disable=unused-import from grr.client.osx import installers grr-3.1.0.2/grr/client/osx/installers.py000066400000000000000000000042421273104013200200530ustar00rootroot00000000000000#!/usr/bin/env python """These are osx specific installers.""" import os import zipfile import logging from grr.client import installer from grr.lib import config_lib from grr.lib import type_info class OSXInstaller(installer.Installer): """Tries to find an existing certificate and copies it to the config.""" def ExtractConfig(self): """This installer extracts a config file from the .pkg file.""" logging.info("Extracting config file from .pkg.") pkg_path = os.environ.get("PACKAGE_PATH", None) if pkg_path is None: logging.error("Could not locate package, giving up.") return zf = zipfile.ZipFile(pkg_path, mode="r") fd = zf.open("config.yaml") install_dir = os.path.dirname(config_lib.CONFIG.parser.filename) # We write this config to disk so that Intialize can find the build.yaml # referenced inside the config as a relative path. This config isn't used # after install time. installer_config = os.path.join(install_dir, "installer_config.yaml") with open(installer_config, "wb") as f: f.write(fd.read()) packaged_config = config_lib.CONFIG.MakeNewConfig() packaged_config.Initialize(filename=installer_config, parser=config_lib.YamlParser) new_config = config_lib.CONFIG.MakeNewConfig() new_config.SetWriteBack(config_lib.CONFIG["Config.writeback"]) for info in config_lib.CONFIG.type_infos: try: new_value = packaged_config.GetRaw(info.name, None) except type_info.TypeValueError: continue try: old_value = config_lib.CONFIG.GetRaw(info.name, None) if not new_value or new_value == old_value: continue except type_info.TypeValueError: pass new_config.SetRaw(info.name, new_value) new_config.Write() logging.info("Config file extracted successfully.") logging.info("Extracting additional files.") for zinfo in zf.filelist: basename = os.path.basename(zinfo.filename) if basename != "config.yaml": with open(os.path.join(install_dir, basename), "wb") as f: f.write(zf.open(zinfo.filename).read()) def Run(self): self.ExtractConfig() grr-3.1.0.2/grr/client/osx/objc.py000066400000000000000000000352141273104013200166130ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2012 Google Inc. All Rights Reserved. """Interface to Objective C libraries on OS X.""" import ctypes import ctypes.util import subprocess import logging # kCFStringEncodingUTF8 UTF8 = 134217984 # kCFNumberSInt32Type INT32 = 3 # kCFNumberSInt64Type INT64 = 4 # Objective C BOOL is a signed byte BOOL = ctypes.c_byte # kCFAllocatorDefault CF_DEFAULT_ALLOCATOR = None # kCFURLPOSIXPathStyle POSIX_PATH_STYLE = 0 # kOSReturnSuccess OS_SUCCESS = None class Error(Exception): """Base error class.""" class ErrorLibNotFound(Error): """Couldn't find specified library.""" def FilterFnTable(fn_table, symbol): """Remove a specific symbol from a fn_table.""" new_table = list() for entry in fn_table: # symbol[0] is a str with the symbol name if entry[0] != symbol: new_table.append(entry) return new_table def SetCTypesForLibrary(libname, fn_table): """Set function argument types and return types for an ObjC library. Args: libname: Library name string fn_table: List of (function, [arg types], return types) tuples Returns: ctypes.CDLL with types set according to fn_table Raises: ErrorLibNotFound: Can't find specified lib """ libpath = ctypes.util.find_library(libname) if not libpath: raise ErrorLibNotFound('Library %s not found' % libname) lib = ctypes.cdll.LoadLibrary(libpath) # We need to define input / output parameters for all functions we use for (function, args, result) in fn_table: f = getattr(lib, function) f.argtypes = args f.restype = result return lib class Foundation(object): """ObjC Foundation library wrapper.""" dll = None @classmethod def LoadLibrary(cls, libname, cftable): # Cache the library to only load it once. if cls.dll is None: cls.dll = SetCTypesForLibrary(libname, cftable) def __init__(self): self.cftable = [ ('CFArrayGetCount', [ctypes.c_void_p], ctypes.c_int32), ('CFArrayGetValueAtIndex', [ctypes.c_void_p, ctypes.c_int32], ctypes.c_void_p), ('CFDictionaryGetCount', [ctypes.c_void_p], ctypes.c_long), ('CFDictionaryGetCountOfKey', [ctypes.c_void_p, ctypes.c_void_p], ctypes.c_int32), ('CFDictionaryGetValue', [ctypes.c_void_p, ctypes.c_void_p], ctypes.c_void_p), ('CFDictionaryGetKeysAndValues', [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p], None), ('CFNumberCreate', [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p], ctypes.c_void_p), ('CFNumberGetValue', [ctypes.c_void_p, ctypes.c_int, ctypes.c_void_p], ctypes.c_int32), ('CFNumberGetTypeID', [], ctypes.c_ulong), ('CFStringCreateWithCString', [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int32], ctypes.c_void_p), ('CFStringGetCString', [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int32, ctypes.c_int32], ctypes.c_int32), ('CFStringGetLength', [ctypes.c_void_p], ctypes.c_int32), ('CFStringGetTypeID', [], ctypes.c_ulong), ('CFBooleanGetValue', [ctypes.c_void_p], ctypes.c_byte), ('CFBooleanGetTypeID', [], ctypes.c_ulong), ('CFRelease', [ctypes.c_void_p], None), ('CFRetain', [ctypes.c_void_p], ctypes.c_void_p), ('CFGetTypeID', [ctypes.c_void_p], ctypes.c_ulong), ('CFURLCreateWithFileSystemPath', [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_int], ctypes.c_long), ('CFURLCopyFileSystemPath', [ctypes.c_void_p, ctypes.c_void_p], ctypes.c_void_p) ] # pyformat: disable self.LoadLibrary('Foundation', self.cftable) def CFStringToPystring(self, value): length = (self.dll.CFStringGetLength(value) * 4) + 1 buff = ctypes.create_string_buffer(length) self.dll.CFStringGetCString(value, buff, length * 4, UTF8) return unicode(buff.value, 'utf8') def IntToCFNumber(self, num): if not isinstance(num, (int, long)): raise TypeError('CFNumber can only be created from int or long') c_num = ctypes.c_int64(num) cf_number = self.dll.CFNumberCreate(CF_DEFAULT_ALLOCATOR, INT64, ctypes.byref(c_num)) return cf_number def CFNumToInt32(self, num): tmp = ctypes.c_int32(0) result_ptr = ctypes.pointer(tmp) self.dll.CFNumberGetValue(num, INT32, result_ptr) return result_ptr[0] def CFNumToInt64(self, num): tmp = ctypes.c_int64(0) result_ptr = ctypes.pointer(tmp) self.dll.CFNumberGetValue(num, INT64, result_ptr) return result_ptr[0] def CFDictRetrieve(self, dictionary, key): ptr = ctypes.c_void_p.in_dll(self.dll, key) return self.dll.CFDictionaryGetValue(dictionary, ptr) def PyStringToCFString(self, pystring): return self.dll.CFStringCreateWithCString(CF_DEFAULT_ALLOCATOR, pystring.encode('utf8'), UTF8) def WrapCFTypeInPython(self, obj): """Package a CoreFoundation object in a Python wrapper. Args: obj: The CoreFoundation object. Returns: One of CFBoolean, CFNumber, CFString, CFDictionary, CFArray. Raises: TypeError: If the type is not supported. """ obj_type = self.dll.CFGetTypeID(obj) if obj_type == self.dll.CFBooleanGetTypeID(): return CFBoolean(obj) elif obj_type == self.dll.CFNumberGetTypeID(): return CFNumber(obj) elif obj_type == self.dll.CFStringGetTypeID(): return CFString(obj) elif obj_type == self.dll.CFDictionaryGetTypeID(): return CFDictionary(obj) elif obj_type == self.dll.CFArrayGetTypeID(): return CFArray(obj) else: raise TypeError('Unknown type for object: {0}'.format(obj)) class SystemConfiguration(Foundation): """SystemConfiguration Framework wrapper. Apple doco: http://goo.gl/NGRj9 """ def __init__(self): super(SystemConfiguration, self).__init__() self.cftable.append(('SCDynamicStoreCopyProxies', [ctypes.c_void_p], ctypes.c_void_p)) self.dll = SetCTypesForLibrary('SystemConfiguration', self.cftable) class ServiceManagement(Foundation): """ServiceManagement Framework wrapper. Apple doco: http://goo.gl/qVHSd """ def __init__(self): super(ServiceManagement, self).__init__() self.cftable.append( # Only available 10.6 and later ('SMCopyAllJobDictionaries', [ctypes.c_void_p], ctypes.c_void_p),) self.dll = SetCTypesForLibrary('ServiceManagement', self.cftable) def SMGetJobDictionaries(self, domain='kSMDomainSystemLaunchd'): """Copy all Job Dictionaries from the ServiceManagement. Args: domain: The name of a constant in Foundation referencing the domain. Will copy all launchd services by default. Returns: A marshalled python list of dicts containing the job dictionaries. """ cfstring_launchd = ctypes.c_void_p.in_dll(self.dll, domain) return CFArray(self.dll.SMCopyAllJobDictionaries(cfstring_launchd)) class CFType(Foundation): """Wrapper class for Core Foundation Types.""" def __init__(self, ref): super(CFType, self).__init__() self.ref = ref def __del__(self): # Now it can be deleted, as we don't use it any more self.dll.CFRelease(self.ref) def __repr__(self): return '{0}:{1}'.format(self.__class__.__name__, self.ref) @property def _as_parameter_(self): """Ctypes used this value when passed as parameter to a function.""" return self.ref class CFBoolean(CFType): """Readonly Wrapper class for CoreFoundation CFBoolean.""" def __init__(self, obj=0): if isinstance(obj, (ctypes.c_void_p, int)): ptr = obj else: raise TypeError('CFBoolean initializer must be objc Boolean') super(CFBoolean, self).__init__(ptr) @property def value(self): bool_const = self.dll.CFBooleanGetValue(self) if bool_const == 0: return False else: return True def __bool__(self): return self.value def __nonzero__(self): return self.value def __repr__(self): return str(self.value) class CFNumber(CFType): """Wrapper class for CoreFoundation CFNumber to behave like a python int.""" def __init__(self, obj=0): if isinstance(obj, ctypes.c_void_p): super(CFNumber, self).__init__(obj) self.dll.CFRetain(obj) elif isinstance(obj, (int, long)): super(CFNumber, self).__init__(None) self.ref = ctypes.c_void_p(self.IntToCFNumber(obj)) else: raise TypeError( 'CFNumber initializer must be python int or objc CFNumber.') def __int__(self): return self.value @property def value(self): return self.CFNumToInt32(self.ref) def __repr__(self): return str(self.value) class CFString(CFType): """Wrapper class for CFString to behave like a python string.""" def __init__(self, obj=''): """Can initialize CFString with python or objc strings.""" if isinstance(obj, (ctypes.c_void_p, int)): super(CFString, self).__init__(obj) self.dll.CFRetain(obj) elif isinstance(obj, basestring): super(CFString, self).__init__(None) self.ref = self.PyStringToCFString(obj) else: raise TypeError('CFString initializer must be python or objc string.') @property def value(self): return self.CFStringToPystring(self) def __len__(self): return self.dll.CFArrayGetCount(self.ref) def __unicode__(self): return unicode(self.value) def __repr__(self): return self.value class CFArray(CFType): """Wrapper class for CFArray to behave like a python list.""" def __init__(self, ptr): super(CFArray, self).__init__(ptr) self.dll.CFRetain(ptr) def __len__(self): return self.dll.CFArrayGetCount(self.ref) def __getitem__(self, index): if not isinstance(index, int): raise TypeError('index must be an integer') if (index < 0) or (index >= len(self)): raise IndexError('index must be between {0} and {1}'.format(0, len(self) - 1)) obj = self.dll.CFArrayGetValueAtIndex(self.ref, index) return self.WrapCFTypeInPython(obj) def __repr__(self): return str(list(self)) class CFDictionary(CFType): """Wrapper class for CFDictionary to behave like a python dict.""" def __init__(self, ptr): super(CFDictionary, self).__init__(ptr) self.dll.CFRetain(ptr) def __contains__(self, key): value = self.__getitem__(key) return value is not None def __len__(self): return self.dll.CFArrayGetCount(self) def __getitem__(self, key): if isinstance(key, CFType): cftype_key = key if isinstance(key, basestring): cftype_key = CFString(key) elif isinstance(key, (int, long)): cftype_key = CFNumber(key) elif isinstance(key, ctypes.c_void_p): cftype_key = key else: raise TypeError( 'CFDictionary wrapper only supports string, int and objc values') obj = ctypes.c_void_p(self.dll.CFDictionaryGetValue(self, cftype_key)) # Detect null pointers and avoid crashing WrapCFTypeInPython if not obj: obj = None else: try: obj = self.WrapCFTypeInPython(obj) except TypeError: obj = None return obj # pylint: disable=g-bad-name def get(self, key, default='', stringify=True): """Returns dictionary values or default. Args: key: string. Dictionary key to look up. default: string. Return this value if key not found. stringify: bool. Force all return values to string for compatibility reasons. Returns: python-wrapped CF object or default if not found. """ obj = self.__getitem__(key) if obj is None: obj = default elif stringify: obj = str(obj) return obj def iteritems(self): size = len(self) keys = (ctypes.c_void_p * size)() values = (ctypes.c_void_p * size)() self.dll.CFDictionaryGetKeysAndValues(self.ref, keys, values) for index in xrange(size): key = self.WrapCFTypeInPython(keys[index]) value = self.WrapCFTypeInPython(values[index]) yield key, value # pylint: enable=g-bad-name def __repr__(self): representation = '{' for key, value in self.iteritems(): representation += '{0}:{1},'.format(str(key), str(value)) representation += '}' return representation class KextManager(Foundation): """Loads and unloads kernel extensions. Apple documentations: http://goo.gl/HukWV """ def __init__(self): super(KextManager, self).__init__() self.kext_functions = [ # Only available 10.6 and later ('KextManagerLoadKextWithURL', [ctypes.c_void_p, ctypes.c_void_p], ctypes.c_void_p), # Only available 10.7 and later ('KextManagerUnloadKextWithIdentifier', [ctypes.c_void_p], ctypes.c_void_p) ] self.iokit = self.SafeLoadKextManager(self.kext_functions) def SafeLoadKextManager(self, fn_table): """Load the kextmanager, replacing unavailable symbols.""" dll = None try: dll = SetCTypesForLibrary('IOKit', fn_table) except AttributeError as ae: if 'KextManagerUnloadKextWithIdentifier' in str(ae): # Try without this symbol, as it is not available on 10.6 logging.debug('Using legacy kextunload') dll = self.SafeLoadKextManager(FilterFnTable( fn_table, 'KextManagerUnloadKextWithIdentifier')) dll.KextManagerUnloadKextWithIdentifier = self.LegacyKextunload elif 'KextManagerLoadKextWithURL' in str(ae): logging.debug('Using legacy kextload') dll = self.SafeLoadKextManager(FilterFnTable( fn_table, 'KextManagerLoadKextWithURL')) dll.KextManagerLoadKextWithURL = self.LegacyKextload else: raise OSError('Can\'t resolve KextManager symbols:{0}'.format(str(ae))) return dll def LegacyKextload(self, cf_bundle_url, dependency_kext): """Load a kext by forking into kextload.""" _ = dependency_kext error_code = OS_SUCCESS cf_path = self.dll.CFURLCopyFileSystemPath(cf_bundle_url, POSIX_PATH_STYLE) path = self.CFStringToPystring(cf_path) self.dll.CFRelease(cf_path) try: subprocess.check_call(['/sbin/kextload', path]) except subprocess.CalledProcessError as cpe: logging.debug('failed to load {0}:{1}'.format(path, str(cpe))) error_code = -1 return error_code def LegacyKextunload(self, cf_bundle_identifier): """Unload a kext by forking into kextunload.""" error_code = OS_SUCCESS bundle_identifier = self.CFStringToPystring(cf_bundle_identifier) try: subprocess.check_call(['/sbin/kextunload', '-b', bundle_identifier]) except subprocess.CalledProcessError as cpe: logging.debug('failed to unload {0}:{1}'.format(bundle_identifier, str( cpe))) error_code = -1 return error_code grr-3.1.0.2/grr/client/osx/objc_test.py000066400000000000000000000031511273104013200176450ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2012 Google Inc. All Rights Reserved. """Tests for grr.client.lib.osx.objc. These tests don't have OS X dependencies and will run on linux. """ import ctypes import mox from grr.client.osx import objc from grr.lib import flags from grr.lib import test_lib class ObjcTest(test_lib.GRRBaseTest): def setUp(self): super(ObjcTest, self).setUp() self.mox = mox.Mox() self.mox.StubOutWithMock(objc.ctypes.util, 'find_library') self.mox.StubOutWithMock(objc.ctypes.cdll, 'LoadLibrary') self.dll = self.mox.CreateMockAnything() self.function = self.mox.CreateMockAnything() self.dll.CFMockFunc = self.function self.argtypes = [ctypes.c_void_p, ctypes.c_void_p] self.restype = ctypes.c_void_p self.cftable = [('CFMockFunc', self.argtypes, self.restype)] def tearDown(self): self.mox.UnsetStubs() def testSetCTypesForLibraryLibNotFound(self): objc.ctypes.util.find_library('mock').AndReturn(None) self.mox.ReplayAll() self.assertRaises(objc.ErrorLibNotFound, objc.SetCTypesForLibrary, 'mock', self.cftable) self.mox.VerifyAll() def testSetCTypesForLibrary(self): objc.ctypes.util.find_library('mock').AndReturn('/mock/path') objc.ctypes.cdll.LoadLibrary('/mock/path').AndReturn(self.dll) self.mox.ReplayAll() dll = objc.SetCTypesForLibrary('mock', self.cftable) self.assertEqual(dll.CFMockFunc.argtypes, self.argtypes) self.assertEqual(dll.CFMockFunc.restype, self.restype) self.mox.VerifyAll() def main(argv): test_lib.main(argv) if __name__ == '__main__': flags.StartMain(main) grr-3.1.0.2/grr/client/plugins/000077500000000000000000000000001273104013200161675ustar00rootroot00000000000000grr-3.1.0.2/grr/client/plugins/__init__.py000066400000000000000000000000271273104013200202770ustar00rootroot00000000000000#!/usr/bin/env python grr-3.1.0.2/grr/client/plugins/installer_plugin.py000066400000000000000000000026021273104013200221140ustar00rootroot00000000000000#!/usr/bin/env python """Example Installer plugin. This is an example plugin to illustrate how GRR installation can be customized. In this example we want to also uninstall an old service called "old_service" as part of the GRR installation. This could be because we decided to rename the GRR service itself (by default GRR will update its own service name). To include arbitrary plugins into the deployed client, you can repack the client using the client_builder.py tool: python grr/client/client_build.py \ --config /etc/grr/grr-server.yaml --verbose \ --platform windows --arch amd64 deploy \ -p grr/client/plugins/installer_plugin.py """ import pywintypes import win32serviceutil import winerror from grr.client import installer class StopOldService(installer.Installer): def RunOnce(self): """Stop and remove an old unneeded service during installation.""" service_name = "My Old Service Name" try: win32serviceutil.StopService(service_name) except pywintypes.error as e: if e[0] not in [winerror.ERROR_SERVICE_NOT_ACTIVE, winerror.ERROR_SERVICE_DOES_NOT_EXIST]: raise OSError("Could not stop service: {0}".format(e)) try: win32serviceutil.RemoveService(service_name) except pywintypes.error as e: if e[0] != winerror.ERROR_SERVICE_DOES_NOT_EXIST: raise OSError("Could not remove service: {0}".format(e)) grr-3.1.0.2/grr/client/poolclient.py000066400000000000000000000112551273104013200172340ustar00rootroot00000000000000#!/usr/bin/env python """This is the GRR client for thread pools.""" import pickle import threading import time import logging # pylint: disable=unused-import # Make sure we load the client plugins from grr.client import client_plugins # pylint: enable=unused-import from grr.client import comms from grr.client import vfs from grr.lib import config_lib from grr.lib import flags from grr.lib import startup from grr.lib.rdfvalues import crypto as rdf_crypto from grr.lib.rdfvalues import paths as rdf_paths flags.DEFINE_integer("nrclients", 1, "Number of clients to start") flags.DEFINE_string("cert_file", "", "Path to a file that stores all certificates for" "the client pool.") flags.DEFINE_bool("enroll_only", False, "If specified, the script will enroll all clients and exit.") class PoolGRRClient(threading.Thread): """A GRR client for running in pool mode.""" def __init__(self, ca_cert=None, private_key=None): """Constructor.""" super(PoolGRRClient, self).__init__() self.private_key = private_key self.daemon = True self.client = comms.GRRHTTPClient(ca_cert=ca_cert, private_key=private_key) self.stop = False # Is this client already enrolled? self.enrolled = False def Run(self): while not self.stop: status = self.client.RunOnce() if status.code == 200: self.enrolled = True self.client.timer.Wait() def Stop(self): self.stop = True def run(self): self.Run() def CreateClientPool(n): """Create n clients to run in a pool.""" clients = [] # Load previously stored clients. try: fd = open(flags.FLAGS.cert_file, "rb") certificates = pickle.load(fd) fd.close() for certificate in certificates: clients.append(PoolGRRClient(private_key=certificate, ca_cert=config_lib.CONFIG["CA.certificate"])) clients_loaded = True except (IOError, EOFError): clients_loaded = False if clients_loaded and len(clients) < n: raise RuntimeError("Loaded %d clients, but expected %d." % (len(clients), n)) while len(clients) < n: # Generate a new RSA key pair for each client. bits = config_lib.CONFIG["Client.rsa_key_length"] key = rdf_crypto.PEMPrivateKey.GenKey(bits=bits) clients.append(PoolGRRClient(private_key=key, ca_cert=config_lib.CONFIG["CA.certificate"])) # Start all the clients now. for c in clients: c.start() start_time = time.time() try: if flags.FLAGS.enroll_only: while True: time.sleep(1) enrolled = len([x for x in clients if x.enrolled]) if enrolled == n: logging.info("All clients enrolled, exiting.") break else: logging.info("%s: Enrolled %d/%d clients.", int(time.time()), enrolled, n) else: try: while True: time.sleep(100) except KeyboardInterrupt: pass finally: # Stop all pool clients. for cl in clients: cl.Stop() # Note: code below is going to be executed after SIGTERM is sent to this # process. logging.info("Pool done in %s seconds.", time.time() - start_time) # The way benchmarking is supposed to work is that we execute poolclient with # --enroll_only flag, it dumps the certificates to the flags.FLAGS.cert_file. # Then, all further poolclient invocations just read private keys back # from that file. Therefore if private keys were loaded from # flags.FLAGS.cert_file, then there's no need to rewrite it again with the # same data. if not clients_loaded: logging.info("Saving certificates.") with open(flags.FLAGS.cert_file, "wb") as fd: pickle.dump([x.private_key for x in clients], fd) def CheckLocation(): """Checks that the poolclient is not accidentally ran against production.""" for url in (config_lib.CONFIG["Client.server_urls"] + config_lib.CONFIG["Client.control_urls"]): if "staging" in url or "localhost" in url: # This is ok. return logging.error("Poolclient should only be run against test or staging.") exit() def main(unused_argv): config_lib.CONFIG.AddContext("PoolClient Context", "Context applied when we run the pool client.") startup.ClientInit() config_lib.CONFIG.SetWriteBack("/dev/null") CheckLocation() # Let the OS handler also handle sleuthkit requests since sleuthkit is not # thread safe. tsk = rdf_paths.PathSpec.PathType.TSK os = rdf_paths.PathSpec.PathType.OS vfs.VFS_HANDLERS[tsk] = vfs.VFS_HANDLERS[os] CreateClientPool(flags.FLAGS.nrclients) if __name__ == "__main__": flags.StartMain(main) grr-3.1.0.2/grr/client/stdlib.py000066400000000000000000000201351273104013200163420ustar00rootroot00000000000000#!/usr/bin/env python """This file imports the Python std lib so it can be used by components.""" # pylint: disable=g-import-not-at-top, unused-import, using-constant-test if False: import BaseHTTPServer import CGIHTTPServer import ConfigParser import Cookie import DocXMLRPCServer import HTMLParser import MimeWriter import Queue import SimpleHTTPServer import SimpleXMLRPCServer import SocketServer import StringIO import UserDict import UserList import UserString import _LWPCookieJar import _abcoll import _osx_support import _pyio import _strptime import _sysconfigdata import _threading_local import _weakrefset import abc import aifc import anydbm import argparse import ast import asynchat import asyncore import atexit import audiodev import base64 import bdb import binhex import bisect import bsddb.db import bsddb.dbobj import bsddb.dbrecio import bsddb.dbshelve import bsddb.dbtables import bsddb.dbutils import cProfile import calendar import cgi import cgitb import chunk import cmd import code import codecs import codeop import collections import colorsys import commands import compileall import compiler.ast import compiler.consts import compiler.future import compiler.misc import compiler.pyassem import compiler.pycodegen import compiler.symbols import compiler.syntax import compiler.transformer import compiler.visitor import contextlib import cookielib import copy import copy_reg import csv import ctypes._endian import ctypes.util import curses.ascii import curses.has_key import curses.panel import curses.textpad import curses.wrapper import dbhash import decimal import difflib import dircache import dis import distutils.archive_util import distutils.bcppcompiler import distutils.ccompiler import distutils.cmd import distutils.command.bdist import distutils.command.bdist_dumb import distutils.command.bdist_rpm import distutils.command.bdist_wininst import distutils.command.build import distutils.command.build_clib import distutils.command.build_ext import distutils.command.build_py import distutils.command.build_scripts import distutils.command.check import distutils.command.clean import distutils.command.config import distutils.command.install import distutils.command.install_data import distutils.command.install_egg_info import distutils.command.install_headers import distutils.command.install_lib import distutils.command.install_scripts import distutils.command.register import distutils.command.sdist import distutils.command.upload import distutils.config import distutils.core import distutils.cygwinccompiler import distutils.debug import distutils.dep_util import distutils.dir_util import distutils.dist import distutils.emxccompiler import distutils.errors import distutils.extension import distutils.fancy_getopt import distutils.file_util import distutils.filelist import distutils.log import distutils.spawn import distutils.sysconfig import distutils.text_file import distutils.unixccompiler import distutils.util import distutils.version import distutils.versionpredicate import doctest import dumbdbm import dummy_thread import dummy_threading import email._parseaddr import email.base64mime import email.charset import email.encoders import email.errors import email.feedparser import email.generator import email.header import email.iterators import email.message import email.mime.application import email.mime.audio import email.mime.base import email.mime.image import email.mime.message import email.mime.multipart import email.mime.nonmultipart import email.mime.text import email.parser import email.quoprimime import email.utils import filecmp import fileinput import fnmatch import formatter import fpformat import fractions import ftplib import functools import genericpath import getopt import getpass import gettext import glob import gzip import hashlib import heapq import hmac import hotshot.log import hotshot.stats import hotshot.stones import htmlentitydefs import htmllib import httplib import ihooks import imaplib import imghdr import imputil import inspect import io import json.decoder import json.encoder import json.scanner import json.tool import keyword import linecache import locale import logging.config import logging.handlers import macpath import macurl2path import mailbox import mailcap import markupbase import md5 import mhlib import mimetools import mimetypes import mimify import modulefinder import multifile import multiprocessing.connection import multiprocessing.dummy.connection import multiprocessing.forking import multiprocessing.heap import multiprocessing.managers import multiprocessing.pool import multiprocessing.process import multiprocessing.queues import multiprocessing.reduction import multiprocessing.sharedctypes import multiprocessing.synchronize import multiprocessing.util import mutex import netrc import new import nntplib import ntpath import nturl2path import numbers import opcode import optparse import os import os2emxpath import pdb import pickle import pickletools import pipes import pkgutil import platform import plistlib import popen2 import poplib import posixfile import posixpath import pprint import profile import pstats import pty import py_compile import pyclbr import pydoc import pydoc_data.topics import quopri import random import re import rfc822 import rlcompleter import robotparser import runpy import sched import sets import sgmllib import sha import shelve import shlex import shutil import site import smtpd import smtplib import sndhdr import socket import sqlite3.dbapi2 import sqlite3.dump import sre import sre_compile import sre_constants import sre_parse import ssl import stat import statvfs import string import stringold import stringprep import struct import subprocess import sunau import sunaudio import symbol import symtable import sysconfig import tabnanny import tarfile import telnetlib import tempfile import test.pystone import test.regrtest import test.test_support import textwrap import this import threading import timeit import toaiff import token import tokenize import trace import traceback import tty import types import urllib import urllib2 import urlparse import user import uu import uuid import warnings import wave import weakref import whichdb import wsgiref.handlers import wsgiref.headers import wsgiref.simple_server import wsgiref.util import wsgiref.validate import xdrlib import xml.dom.NodeFilter import xml.dom.domreg import xml.dom.expatbuilder import xml.dom.minicompat import xml.dom.minidom import xml.dom.pulldom import xml.dom.xmlbuilder import xml.etree.ElementInclude import xml.etree.ElementPath import xml.etree.ElementTree import xml.etree.cElementTree import xml.parsers.expat import xml.sax._exceptions import xml.sax.expatreader import xml.sax.handler import xml.sax.saxutils import xml.sax.xmlreader import xmllib import xmlrpclib import zipfile # lib-dynload import audioop import _bsddb import bz2 import _codecs_cn import _codecs_hk import _codecs_iso2022 import _codecs_jp import _codecs_kr import _codecs_tw import crypt import _csv import _ctypes_test import _ctypes import _curses_panel import _curses import datetime import dbm import _elementtree import fpectl import future_builtins import gdbm import _hashlib import _hotshot import _json import linuxaudiodev import _lsprof import mmap import _multibytecodec import _multiprocessing import nis import ossaudiodev import parser import pyexpat import readline import resource import _sqlite3 import _ssl import termios import _testcapi import _tkinter grr-3.1.0.2/grr/client/tests.py000066400000000000000000000006271273104013200162270ustar00rootroot00000000000000#!/usr/bin/env python """GRR library tests. This module loads and registers all the GRR library tests. """ # These need to register plugins so, pylint: disable=unused-import from grr.client import client_test from grr.client import client_utils_test from grr.client import client_vfs_test from grr.client import comms_test from grr.client.client_actions import tests from grr.client.osx import objc_test grr-3.1.0.2/grr/client/vfs.py000066400000000000000000000316631273104013200156670ustar00rootroot00000000000000#!/usr/bin/env python """This file implements a VFS abstraction on the client.""" from grr.client import client_utils from grr.lib import config_lib from grr.lib import registry from grr.lib import utils from grr.lib.rdfvalues import paths as rdf_paths # A central Cache for vfs handlers. This can be used to keep objects alive # for a limited time. DEVICE_CACHE = utils.TimeBasedCache() class VFSHandler(object): """Base class for handling objects in the VFS.""" supported_pathtype = -1 # Should this handler be auto-registered? auto_register = False size = 0 offset = 0 # This is the VFS path to this specific handler. path = "/" # This will be set by the VFSOpen factory to the pathspec of the final # destination of this handler. This pathspec will be case corrected and # updated to reflect any potential recursion. pathspec = None base_fd = None __metaclass__ = registry.MetaclassRegistry def __init__(self, base_fd, pathspec=None, progress_callback=None, full_pathspec=None): """Constructor. Args: base_fd: A handler to the predecessor handler. pathspec: The pathspec to open. progress_callback: A callback to indicate that the open call is still working but needs more time. full_pathspec: The full pathspec we are trying to open. Raises: IOError: if this handler can not be instantiated over the requested path. """ _ = pathspec _ = full_pathspec self.base_fd = base_fd self.progress_callback = progress_callback if base_fd is None: self.pathspec = rdf_paths.PathSpec() else: # Make a copy of the base pathspec. self.pathspec = base_fd.pathspec.Copy() self.metadata = {} def __enter__(self): return self def __exit__(self, exc_type, exc_value, traceback): self.Close() return False def Seek(self, offset, whence=0): """Seek to an offset in the file.""" if whence == 0: self.offset = offset elif whence == 1: self.offset += offset elif whence == 2: self.offset = self.size + offset else: raise RuntimeError("Illegal whence value %s" % whence) def Read(self, length): """Reads some data from the file.""" raise NotImplementedError def Stat(self): """Returns a StatEntry about this file.""" raise NotImplementedError def IsDirectory(self): """Returns true if this object can contain other objects.""" raise NotImplementedError def Tell(self): return self.offset def Close(self): """Close internal file descriptors.""" def OpenAsContainer(self): """Guesses a container from the current object.""" if self.IsDirectory(): return self # TODO(user): Add support for more containers here (e.g. registries, zip # files etc). else: # For now just guess TSK. return VFS_HANDLERS[rdf_paths.PathSpec.PathType.TSK]( self, rdf_paths.PathSpec(path="/", pathtype=rdf_paths.PathSpec.PathType.TSK), progress_callback=self.progress_callback) def MatchBestComponentName(self, component): """Returns the name of the component which matches best our base listing. In order to do the best case insensitive matching we list the files in the base handler and return the base match for this component. Args: component: A component name which should be present in this directory. Returns: the best component name. """ fd = self.OpenAsContainer() # Adjust the component casing file_listing = set(fd.ListNames()) # First try an exact match if component not in file_listing: # Now try to match lower case lower_component = component.lower() for x in file_listing: if lower_component == x.lower(): component = x break if fd.supported_pathtype != self.pathspec.pathtype: new_pathspec = rdf_paths.PathSpec(path=component, pathtype=fd.supported_pathtype) else: new_pathspec = self.pathspec.last.Copy() new_pathspec.path = component return new_pathspec def ListFiles(self): """An iterator over all VFS files contained in this directory. Generates a StatEntry for each file or directory. Raises: IOError: if this fails. """ def ListNames(self): """A generator for all names in this directory.""" return [] # These are file object conformant namings for library functions that # grr uses, and that expect to interact with 'real' file objects. read = utils.Proxy("Read") seek = utils.Proxy("Seek") stat = utils.Proxy("Stat") tell = utils.Proxy("Tell") close = utils.Proxy("Close") @classmethod def Open(cls, fd, component, pathspec=None, progress_callback=None, full_pathspec=None): """Try to correct the casing of component. This method is called when we failed to open the component directly. We try to transform the component into something which is likely to work. In this implementation, we correct the case of the component until we can not open the path any more. Args: fd: The base fd we will use. component: The component we should open. pathspec: The rest of the pathspec object. progress_callback: A callback to indicate that the open call is still working but needs more time. full_pathspec: The full pathspec we are trying to open. Returns: A file object. Raises: IOError: If nothing could be opened still. """ # The handler for this component try: handler = VFS_HANDLERS[component.pathtype] except KeyError: raise IOError("VFS handler %d not supported." % component.pathtype) # We will not do any case folding unless requested. if component.path_options == rdf_paths.PathSpec.Options.CASE_LITERAL: return handler(base_fd=fd, pathspec=component) path_components = client_utils.LocalPathToCanonicalPath(component.path) path_components = ["/"] + filter(None, path_components.split("/")) for i, path_component in enumerate(path_components): try: if fd: new_pathspec = fd.MatchBestComponentName(path_component) else: new_pathspec = component new_pathspec.path = path_component # The handler for this component try: handler = VFS_HANDLERS[new_pathspec.pathtype] except KeyError: raise IOError("VFS handler %d not supported." % new_pathspec.pathtype) fd = handler(base_fd=fd, pathspec=new_pathspec, full_pathspec=full_pathspec, progress_callback=progress_callback) except IOError: # Can not open the first component, we must raise here. if i <= 1: raise IOError("File not found") # Insert the remaining path at the front of the pathspec. pathspec.Insert(0, path=utils.JoinPath(*path_components[i:]), pathtype=rdf_paths.PathSpec.PathType.TSK) break return fd def GetMetadata(self): return self.metadata # A registry of all VFSHandler registered VFS_HANDLERS = {} # The paths we should use as virtual root for VFS operations. VFS_VIRTUALROOTS = {} class VFSInit(registry.InitHook): """Register all known vfs handlers to open a pathspec types.""" def Run(self): VFS_HANDLERS.clear() for handler in VFSHandler.classes.values(): if handler.auto_register: VFS_HANDLERS[handler.supported_pathtype] = handler VFS_VIRTUALROOTS.clear() vfs_virtualroots = config_lib.CONFIG["Client.vfs_virtualroots"] for vfs_virtualroot in vfs_virtualroots: try: handler_string, root = vfs_virtualroot.split(":", 1) except ValueError: raise ValueError( "Badly formatted vfs virtual root: %s. Correct format is " "os:/path/to/virtual_root" % vfs_virtualroot) handler_string = handler_string.upper() handler = rdf_paths.PathSpec.PathType.enum_dict.get(handler_string) if handler is None: raise ValueError("Unsupported vfs handler: %s." % handler_string) # We need some translation here, TSK needs an OS virtual root base. For # every other handler we can just keep the type the same. base_types = { rdf_paths.PathSpec.PathType.TSK: rdf_paths.PathSpec.PathType.OS } base_type = base_types.get(handler, handler) VFS_VIRTUALROOTS[handler] = rdf_paths.PathSpec(path=root, pathtype=base_type, is_virtualroot=True) def VFSOpen(pathspec, progress_callback=None): """Expands pathspec to return an expanded Path. A pathspec is a specification of how to access the file by recursively opening each part of the path by different drivers. For example the following pathspec: pathtype: OS path: "/dev/sda1" nested_path { pathtype: TSK path: "/home/image2.img" nested_path { pathtype: TSK path: "/home/a.txt" } } Instructs the system to: 1) open /dev/sda1 using the OS driver. 2) Pass the obtained filelike object to the TSK driver to open "/home/image2.img". 3) The obtained filelike object should be passed to the TSK driver to open "/home/a.txt". The problem remains how to get to this expanded path specification. Since the server is not aware of all the files on the client, the server may request this: pathtype: OS path: "/dev/sda1" nested_path { pathtype: TSK path: "/home/image2.img/home/a.txt" } Or even this: pathtype: OS path: "/dev/sda1/home/image2.img/home/a.txt" This function converts the pathspec requested by the server into an expanded pathspec required to actually open the file. This is done by expanding each component of the pathspec in turn. Expanding the component is done by opening each leading directory in turn and checking if it is a directory of a file. If its a file, we examine the file headers to determine the next appropriate driver to use, and create a nested pathspec. Note that for some clients there might be a virtual root specified. This is a directory that gets prepended to all pathspecs of a given pathtype. For example if there is a virtual root defined as ["os:/virtualroot"], a path specification like pathtype: OS path: "/home/user/*" will get translated into pathtype: OS path: "/virtualroot" is_virtualroot: True nested_path { pathtype: OS path: "/dev/sda1" } Args: pathspec: A Path() protobuf to normalize. progress_callback: A callback to indicate that the open call is still working but needs more time. Returns: The open filelike object. This will contain the expanded Path() protobuf as the member fd.pathspec. Raises: IOError: if one of the path components can not be opened. """ fd = None # Adjust the pathspec in case we are using a vfs_virtualroot. vroot = VFS_VIRTUALROOTS.get(pathspec.pathtype) # If we have a virtual root for this vfs handler, we need to prepend # it to the incoming pathspec except if the pathspec is explicitly # marked as containing a virtual root already or if it isn't marked but # the path already contains the virtual root. if (not vroot or pathspec.is_virtualroot or pathspec.CollapsePath().startswith(vroot.CollapsePath())): # No virtual root but opening changes the pathspec so we always work on a # copy. working_pathspec = pathspec.Copy() else: # We're in a virtual root, put the target pathspec inside the virtual root # as a nested path. working_pathspec = vroot.Copy() working_pathspec.last.nested_path = pathspec.Copy() # For each pathspec step, we get the handler for it and instantiate it with # the old object, and the current step. while working_pathspec: component = working_pathspec.Pop() try: handler = VFS_HANDLERS[component.pathtype] except KeyError: raise IOError("VFS handler %d not supported." % component.pathtype) try: # Open the component. fd = handler.Open(fd, component, pathspec=working_pathspec, full_pathspec=pathspec, progress_callback=progress_callback) except IOError as e: raise IOError("%s: %s" % (e, pathspec)) return fd def ReadVFS(pathspec, offset, length, progress_callback=None): """Read from the VFS and return the contents. Args: pathspec: path to read from offset: number of bytes to skip length: number of bytes to read progress_callback: A callback to indicate that the open call is still working but needs more time. Returns: VFS file contents """ fd = VFSOpen(pathspec, progress_callback=progress_callback) fd.Seek(offset) return fd.Read(length) grr-3.1.0.2/grr/client/vfs_handlers/000077500000000000000000000000001273104013200171645ustar00rootroot00000000000000grr-3.1.0.2/grr/client/vfs_handlers/__init__.py000066400000000000000000000006541273104013200213020ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2010 Google Inc. All Rights Reserved. """A module to load all vfs handler plugins.""" # pylint: disable=unused-import import platform # These import populate the VFSHandler registry from grr.client.vfs_handlers import files from grr.client.vfs_handlers import sleuthkit # pylint: disable=g-import-not-at-top if platform.system() == "Windows": from grr.client.vfs_handlers import registry grr-3.1.0.2/grr/client/vfs_handlers/files.py000066400000000000000000000263441273104013200206510ustar00rootroot00000000000000#!/usr/bin/env python """Implements VFSHandlers for files on the client.""" import logging import os import platform import re import sys import threading from grr.client import client_utils from grr.client import vfs from grr.lib import utils from grr.lib.rdfvalues import client from grr.lib.rdfvalues import paths # File handles are cached here. They expire after a couple minutes so # we don't keep files locked on the client. FILE_HANDLE_CACHE = utils.TimeBasedCache(max_age=300) class LockedFileHandle(object): """An object which encapsulates access to a file.""" def __init__(self, filename, mode="rb"): self.lock = threading.RLock() self.fd = open(filename, mode) self.filename = filename def Seek(self, offset, whence=0): self.fd.seek(offset, whence) def Read(self, length): return self.fd.read(length) def Tell(self): return self.fd.tell() def Close(self): with self.lock: self.fd.close() class FileHandleManager(object): """An exclusive accesssor for a filehandle.""" def __init__(self, filename): self.filename = filename def __enter__(self): try: self.fd = FILE_HANDLE_CACHE.Get(self.filename) except KeyError: self.fd = LockedFileHandle(self.filename, mode="rb") FILE_HANDLE_CACHE.Put(self.filename, self.fd) # Wait for exclusive access to this file handle. self.fd.lock.acquire() return self.fd def __exit__(self, exc_type=None, exc_val=None, exc_tb=None): self.fd.lock.release() def MakeStatResponse(st, pathspec): """Creates a StatEntry.""" response = client.StatEntry(pathspec=pathspec) if st is None: # Special case empty stat if we don't have a real value, e.g. we get Access # denied when stating a file. We still want to give back a value so we let # the defaults from the proto pass through. pass else: # Now fill in the stat value for attr in ["st_mode", "st_ino", "st_dev", "st_nlink", "st_uid", "st_gid", "st_size", "st_atime", "st_mtime", "st_ctime", "st_blocks", "st_blksize", "st_rdev"]: try: value = long(getattr(st, attr)) if value < 0: value &= 0xFFFFFFFF setattr(response, attr, value) except AttributeError: pass return response class File(vfs.VFSHandler): """Read a regular file.""" supported_pathtype = paths.PathSpec.PathType.OS auto_register = True files = None # Directories do not have a size. size = None # On windows reading devices must have an alignment. alignment = 1 file_offset = 0 def __init__(self, base_fd, pathspec=None, progress_callback=None, full_pathspec=None): super(File, self).__init__(base_fd, pathspec=pathspec, full_pathspec=full_pathspec, progress_callback=progress_callback) if base_fd is None: self.pathspec.Append(pathspec) # We can stack on another directory, which means we concatenate their # directory with ours. elif base_fd.IsDirectory(): self.pathspec.last.path = utils.JoinPath(self.pathspec.last.path, pathspec.path) else: raise IOError("File handler can not be stacked on another handler.") self.path = self.pathspec.last.path # We can optionally apply a global offset to the file. if self.pathspec[0].HasField("offset"): self.file_offset = self.pathspec[0].offset self.pathspec.last.path_options = paths.PathSpec.Options.CASE_LITERAL self.FileHacks() self.filename = client_utils.CanonicalPathToLocalPath(self.path) error = None # Pythonic way - duck typing. Is the handle a directory? try: if not self.files: # Note that the encoding of local path is system specific local_path = client_utils.CanonicalPathToLocalPath(self.path + "/") self.files = [utils.SmartUnicode(entry) for entry in os.listdir(local_path)] # Some filesystems do not support unicode properly except UnicodeEncodeError as e: raise IOError(str(e)) except (IOError, OSError) as e: self.files = [] error = e # Ok, it's not. Is it a file then? try: with FileHandleManager(self.filename) as fd: if pathspec.last.HasField("file_size_override"): self.size = pathspec.last.file_size_override - self.file_offset else: # Work out how large the file is. if self.size is None: fd.Seek(0, 2) end = fd.Tell() if end == 0: # This file is not seekable, we just use the default. end = pathspec.last.file_size_override self.size = end - self.file_offset error = None # Some filesystems do not support unicode properly except UnicodeEncodeError as e: raise IOError(str(e)) except IOError as e: if error: error = e if error is not None: raise error # pylint: disable=raising-bad-type def FileHacks(self): """Hacks to make the filesystem look normal.""" if sys.platform == "win32": import win32api # pylint: disable=g-import-not-at-top # Make the filesystem look like the topmost level are the drive letters. if self.path == "/": self.files = win32api.GetLogicalDriveStrings().split("\x00") # Remove empty strings and strip trailing backslashes. self.files = [drive.rstrip("\\") for drive in self.files if drive] # This regex will match the various windows devices. Raw hard disk devices # must be considered files, however in windows, if we try to list them as # directories this also works. Since the code above distinguished between # files and directories using the file listing property, we must force # treating raw devices as files. elif re.match(r"/*\\\\.\\[^\\]+\\?$", self.path) is not None: # Special case windows devices cant seek to the end so just lie about # the size self.size = 0x7fffffffffffffff # Windows raw devices can be opened in two incompatible modes. With a # trailing \ they look like a directory, but without they are the raw # device. In GRR we only support opening devices in raw mode so ensure # that we never append a \ to raw device name. self.path = self.path.rstrip("\\") # In windows raw devices must be accessed using sector alignment. self.alignment = 512 elif sys.platform == "darwin": # On Mac, raw disk devices are also not seekable to the end and have no # size so we use the same approach as on Windows. if re.match("/dev/r?disk.*", self.path): self.size = 0x7fffffffffffffff self.alignment = 512 def _GetDepth(self, path): if path[0] != os.path.sep: raise RuntimeError("Relative paths aren't supported.") return len(re.findall(r"%s+[^%s]+" % (os.path.sep, os.path.sep), path)) def _GetRawStat(self, local_path): try: return os.stat(local_path) except IOError as e: logging.info("Failed to Stat %s. Err: %s", local_path, e) return None def _GetDevice(self, path): try: return self._GetRawStat(path).st_dev except KeyError as e: # Failed to stat logging.info("Failed to get device %s. Err: %s", path, e) return None def RecursiveListNames(self, depth=0, cross_devs=False): path = client_utils.CanonicalPathToLocalPath(self.path) path_depth = self._GetDepth(self.path) if not cross_devs: path_dev = self._GetDevice(path) for root, dirs, files in os.walk(self.path): dirs.sort() files.sort() root_depth = self._GetDepth(root) if not cross_devs and self._GetDevice(root) != path_dev: dirs[:] = [] # We don't need to go deeper (clear the list) elif root_depth - path_depth >= depth: yield (root, dirs[:], files) # Shallow copy dirs[:] = [] else: yield (root, dirs, files) def ListNames(self): return self.files or [] def Read(self, length): """Read from the file.""" if self.progress_callback: self.progress_callback() available_to_read = max(0, (self.size or 0) - self.offset) to_read = min(length, available_to_read) with FileHandleManager(self.filename) as fd: offset = self.file_offset + self.offset pre_padding = offset % self.alignment # Due to alignment we read some more data than we need to. aligned_offset = offset - pre_padding fd.Seek(aligned_offset) data = fd.Read(to_read + pre_padding) self.offset += len(data) - pre_padding return data[pre_padding:] def Stat(self, path=None): """Returns stat information of a specific path. Args: path: a Unicode string containing the path or None. If path is None the value in self.path is used. Returns: a StatResponse proto Raises: IOError when call to os.stat() fails """ # Note that the encoding of local path is system specific local_path = client_utils.CanonicalPathToLocalPath(path or self.path) st = self._GetRawStat(local_path) result = MakeStatResponse(st, self.pathspec) # Is this a symlink? If so we need to note the real location of the file. try: result.symlink = utils.SmartUnicode(os.readlink(local_path)) except (OSError, AttributeError): pass return result def ListFiles(self): """List all files in the dir.""" if not self.IsDirectory(): raise IOError("%s is not a directory." % self.path) else: for path in self.files: try: response = self.Stat(utils.JoinPath(self.path, path)) pathspec = self.pathspec.Copy() pathspec.last.path = utils.JoinPath(pathspec.last.path, path) response.pathspec = pathspec yield response except OSError: pass def IsDirectory(self): return self.size is None def StatFS(self, path=None): """Call os.statvfs for a given list of paths. OS X and Linux only. Note that a statvfs call for a network filesystem (e.g. NFS) that is unavailable, e.g. due to no network, will result in the call blocking. Args: path: a Unicode string containing the path or None. If path is None the value in self.path is used. Returns: posix.statvfs_result object Raises: RuntimeError: if called on windows """ if platform.system() == "Windows": raise RuntimeError("os.statvfs not available on Windows") local_path = client_utils.CanonicalPathToLocalPath(path or self.path) return os.statvfs(local_path) def GetMountPoint(self, path=None): """Walk back from the path to find the mount point. Args: path: a Unicode string containing the path or None. If path is None the value in self.path is used. Returns: path string of the mount point """ path = os.path.abspath(client_utils.CanonicalPathToLocalPath(path or self.path)) while not os.path.ismount(path): path = os.path.dirname(path) return path class TempFile(File): """GRR temporary files on the client.""" supported_pathtype = paths.PathSpec.PathType.TMPFILE grr-3.1.0.2/grr/client/vfs_handlers/registry.py000066400000000000000000000413171273104013200214140ustar00rootroot00000000000000#!/usr/bin/env python """Implement access to the windows registry.""" import ctypes import ctypes.wintypes import exceptions import os import stat import StringIO import _winreg from grr.client import vfs from grr.lib import utils from grr.lib.rdfvalues import client as rdf_client from grr.lib.rdfvalues import paths as rdf_paths from grr.lib.rdfvalues import protodict as rdf_protodict # Difference between 1 Jan 1601 and 1 Jan 1970. WIN_UNIX_DIFF_MSECS = 11644473600 # KEY_READ = STANDARD_RIGHTS_READ | KEY_QUERY_VALUE | # KEY_ENUMERATE_SUB_KEYS | KEY_NOTIFY # Also see: http://msdn.microsoft.com/en-us/library/windows/desktop/ # ms724878(v=vs.85).aspx KEY_READ = 0x20019 def CanonicalPathToLocalPath(path): path = path.replace("/", "\\") return path.strip("\\") # _winreg is broken on Python 2.x and doesn't support unicode registry values. # We provide some replacement functions here. advapi32 = ctypes.windll.advapi32 LPDWORD = ctypes.POINTER(ctypes.wintypes.DWORD) LPBYTE = ctypes.POINTER(ctypes.wintypes.BYTE) ERROR_SUCCESS = 0 ERROR_MORE_DATA = 234 class FileTime(ctypes.Structure): _fields_ = [("dwLowDateTime", ctypes.wintypes.DWORD), ("dwHighDateTime", ctypes.wintypes.DWORD)] RegCloseKey = advapi32.RegCloseKey # pylint: disable=g-bad-name RegCloseKey.restype = ctypes.c_long RegCloseKey.argtypes = [ctypes.c_void_p] RegEnumKeyEx = advapi32.RegEnumKeyExW # pylint: disable=g-bad-name RegEnumKeyEx.restype = ctypes.c_long RegEnumKeyEx.argtypes = [ctypes.c_void_p, ctypes.wintypes.DWORD, ctypes.c_wchar_p, LPDWORD, LPDWORD, ctypes.c_wchar_p, LPDWORD, ctypes.POINTER(FileTime)] RegEnumValue = advapi32.RegEnumValueW # pylint: disable=g-bad-name RegEnumValue.restype = ctypes.c_long RegEnumValue.argtypes = [ctypes.c_void_p, ctypes.wintypes.DWORD, ctypes.c_wchar_p, LPDWORD, LPDWORD, LPDWORD, LPBYTE, LPDWORD] RegOpenKeyEx = advapi32.RegOpenKeyExW # pylint: disable=g-bad-name RegOpenKeyEx.restype = ctypes.c_long RegOpenKeyEx.argtypes = [ctypes.c_void_p, ctypes.c_wchar_p, ctypes.c_ulong, ctypes.c_ulong, ctypes.POINTER(ctypes.c_void_p)] RegQueryInfoKey = advapi32.RegQueryInfoKeyW # pylint: disable=g-bad-name RegQueryInfoKey.restype = ctypes.c_long RegQueryInfoKey.argtypes = [ctypes.c_void_p, ctypes.c_wchar_p, LPDWORD, LPDWORD, LPDWORD, LPDWORD, LPDWORD, LPDWORD, LPDWORD, LPDWORD, LPDWORD, ctypes.POINTER(FileTime)] RegQueryValueEx = advapi32.RegQueryValueExW # pylint: disable=g-bad-name RegQueryValueEx.restype = ctypes.c_long RegQueryValueEx.argtypes = [ctypes.c_void_p, ctypes.c_wchar_p, LPDWORD, LPDWORD, LPBYTE, LPDWORD] class KeyHandle(object): """A wrapper class for a registry key handle.""" def __init__(self, value=0): if value: self.handle = ctypes.c_void_p(value) else: self.handle = ctypes.c_void_p() def __enter__(self): return self def __exit__(self, exc_type=None, exc_val=None, exc_tb=None): self.Close() return False def Close(self): if not self.handle: return if RegCloseKey is None: return # Globals become None during exit. rc = RegCloseKey(self.handle) self.handle = ctypes.c_void_p() if rc != ERROR_SUCCESS: raise ctypes.WinError(2) def __del__(self): self.Close() def OpenKey(key, sub_key): """This calls the Windows OpenKeyEx function in a Unicode safe way.""" new_key = KeyHandle() # Don't use KEY_WOW64_64KEY (0x100) since it breaks on Windows 2000 rc = RegOpenKeyEx(key.handle, sub_key, 0, KEY_READ, ctypes.cast( ctypes.byref(new_key.handle), ctypes.POINTER(ctypes.c_void_p))) if rc != ERROR_SUCCESS: raise ctypes.WinError(2) return new_key def CloseKey(key): rc = RegCloseKey(key) if rc != ERROR_SUCCESS: raise ctypes.WinError(2) def QueryInfoKey(key): """This calls the Windows RegQueryInfoKey function in a Unicode safe way.""" null = LPDWORD() num_sub_keys = ctypes.wintypes.DWORD() num_values = ctypes.wintypes.DWORD() ft = FileTime() rc = RegQueryInfoKey(key.handle, ctypes.c_wchar_p(), null, null, ctypes.byref(num_sub_keys), null, null, ctypes.byref(num_values), null, null, null, ctypes.byref(ft)) if rc != ERROR_SUCCESS: raise ctypes.WinError(2) return (num_sub_keys.value, num_values.value, ft.dwLowDateTime | (ft.dwHighDateTime << 32)) def QueryValueEx(key, value_name): """This calls the Windows QueryValueEx function in a Unicode safe way.""" size = 256 data_type = ctypes.wintypes.DWORD() while True: tmp_size = ctypes.wintypes.DWORD(size) buf = ctypes.create_string_buffer(size) rc = RegQueryValueEx(key.handle, value_name, LPDWORD(), ctypes.byref(data_type), ctypes.cast(buf, LPBYTE), ctypes.byref(tmp_size)) if rc != ERROR_MORE_DATA: break # We limit the size here to ~10 MB so the response doesn't get too big. if size > 10 * 1024 * 1024: raise exceptions.WindowsError("Value too big to be read by GRR.") size *= 2 if rc != ERROR_SUCCESS: raise ctypes.WinError(2) return (Reg2Py(buf, tmp_size.value, data_type.value), data_type.value) def EnumKey(key, index): """This calls the Windows RegEnumKeyEx function in a Unicode safe way.""" buf = ctypes.create_unicode_buffer(257) length = ctypes.wintypes.DWORD(257) rc = RegEnumKeyEx(key.handle, index, ctypes.cast(buf, ctypes.c_wchar_p), ctypes.byref(length), LPDWORD(), ctypes.c_wchar_p(), LPDWORD(), ctypes.POINTER(FileTime)()) if rc != 0: raise ctypes.WinError(2) return ctypes.wstring_at(buf, length.value).rstrip(u"\x00") def EnumValue(key, index): """This calls the Windows RegEnumValue function in a Unicode safe way.""" null = ctypes.POINTER(ctypes.wintypes.DWORD)() value_size = ctypes.wintypes.DWORD() data_size = ctypes.wintypes.DWORD() rc = RegQueryInfoKey(key.handle, ctypes.c_wchar_p(), null, null, null, null, null, null, ctypes.byref(value_size), ctypes.byref(data_size), null, ctypes.POINTER(FileTime)()) if rc != ERROR_SUCCESS: raise ctypes.WinError(2) value_size.value += 1 data_size.value += 1 value = ctypes.create_unicode_buffer(value_size.value) while True: data = ctypes.create_string_buffer(data_size.value) tmp_value_size = ctypes.wintypes.DWORD(value_size.value) tmp_data_size = ctypes.wintypes.DWORD(data_size.value) data_type = ctypes.wintypes.DWORD() rc = RegEnumValue(key.handle, index, ctypes.cast(value, ctypes.c_wchar_p), ctypes.byref(tmp_value_size), null, ctypes.byref(data_type), ctypes.cast(data, LPBYTE), ctypes.byref(tmp_data_size)) if rc != ERROR_MORE_DATA: break data_size.value *= 2 if rc != ERROR_SUCCESS: raise ctypes.WinError(2) return (value.value, Reg2Py(data, tmp_data_size.value, data_type.value), data_type.value) def Reg2Py(data, size, data_type): if data_type == _winreg.REG_DWORD: if size == 0: return 0 return ctypes.cast(data, ctypes.POINTER(ctypes.c_int)).contents.value elif data_type == _winreg.REG_SZ or data_type == _winreg.REG_EXPAND_SZ: return ctypes.wstring_at(data, size // 2).rstrip(u"\x00") elif data_type == _winreg.REG_MULTI_SZ: return ctypes.wstring_at(data, size // 2).rstrip(u"\x00").split(u"\x00") else: if size == 0: return None return ctypes.string_at(data, size) class RegistryFile(vfs.VFSHandler): """Emulate registry access through the VFS.""" supported_pathtype = rdf_paths.PathSpec.PathType.REGISTRY auto_register = True value = None value_type = _winreg.REG_NONE hive = None hive_name = None last_modified = 0 is_directory = True fd = None # Maps the registry types to protobuf enums registry_map = { _winreg.REG_NONE: rdf_client.StatEntry.RegistryType.REG_NONE, _winreg.REG_SZ: rdf_client.StatEntry.RegistryType.REG_SZ, _winreg.REG_EXPAND_SZ: rdf_client.StatEntry.RegistryType.REG_EXPAND_SZ, _winreg.REG_BINARY: rdf_client.StatEntry.RegistryType.REG_BINARY, _winreg.REG_DWORD: rdf_client.StatEntry.RegistryType.REG_DWORD, _winreg.REG_DWORD_LITTLE_ENDIAN: ( rdf_client.StatEntry.RegistryType.REG_DWORD_LITTLE_ENDIAN), _winreg.REG_DWORD_BIG_ENDIAN: ( rdf_client.StatEntry.RegistryType.REG_DWORD_BIG_ENDIAN), _winreg.REG_LINK: rdf_client.StatEntry.RegistryType.REG_LINK, _winreg.REG_MULTI_SZ: rdf_client.StatEntry.RegistryType.REG_MULTI_SZ, } def __init__(self, base_fd, pathspec=None, progress_callback=None, full_pathspec=None): super(RegistryFile, self).__init__(base_fd, pathspec=pathspec, full_pathspec=full_pathspec, progress_callback=progress_callback) if base_fd is None: self.pathspec.Append(pathspec) elif base_fd.IsDirectory(): self.pathspec.last.path = utils.JoinPath(self.pathspec.last.path, pathspec.path) else: raise IOError("Registry handler can not be stacked on another handler.") path_components = filter(None, self.pathspec.last.path.split("/")) try: # The first component MUST be a hive self.hive_name = path_components[0] self.hive = KeyHandle(getattr(_winreg, self.hive_name)) except AttributeError: raise IOError("Unknown hive name %s" % self.hive_name) except IndexError: # A hive is not specified, we just list all the hives. return # Normalize the path casing if needed self.key_name = "/".join(path_components[1:]) self.local_path = CanonicalPathToLocalPath(self.key_name) try: # Maybe its a value key_name, value_name = os.path.split(self.local_path) with OpenKey(self.hive, key_name) as key: self.value, self.value_type = QueryValueEx(key, value_name) # We are a value and therefore not a directory. self.is_directory = False except exceptions.WindowsError: try: # Try to get the default value for this key with OpenKey(self.hive, self.local_path) as key: # Check for default value. try: self.value, self.value_type = QueryValueEx(key, "") except exceptions.WindowsError: # Empty default value self.value = "" self.value_type = _winreg.REG_NONE except exceptions.WindowsError: raise IOError("Unable to open key %s" % self.key_name) def Stat(self): return self._Stat("", self.value, self.value_type) def _Stat(self, name, value, value_type): response = rdf_client.StatEntry() response_pathspec = self.pathspec.Copy() # No matter how we got here, there is no need to do case folding from now on # since this is the exact filename casing. response_pathspec.path_options = rdf_paths.PathSpec.Options.CASE_LITERAL response_pathspec.last.path = utils.JoinPath(response_pathspec.last.path, name) response.pathspec = response_pathspec if self.IsDirectory(): response.st_mode = stat.S_IFDIR else: response.st_mode = stat.S_IFREG response.st_mtime = self.last_modified response.st_size = len(utils.SmartStr(value)) if value_type is not None: response.registry_type = self.registry_map.get(value_type, 0) response.registry_data = rdf_protodict.DataBlob().SetValue(value) return response def _Walk(self, depth=0, hive=None, hive_name=None, top=""): if depth < 0: return if hive is None: hives = sorted([(name, KeyHandle(getattr(_winreg, name))) for name in dir(_winreg) if name.startswith("HKEY_")]) yield "", [name for name, _ in hives], [] for new_hive_name, new_hive in hives: for tup in self._Walk(depth - 1, new_hive, new_hive_name): yield tup else: keys, value_names = [], [] try: with OpenKey(hive, top[1:]) as key: (number_of_keys, number_of_values, unused_last_modified) = QueryInfoKey(key) # First keys for i in xrange(number_of_keys): try: keys.append(EnumKey(key, i)) except exceptions.WindowsError: pass keys.sort() # Now Values for i in xrange(number_of_values): try: name, unused_value, unused_value_type = EnumValue(key, i) value_names.append(name) except exceptions.WindowsError: pass value_names.sort() except exceptions.WindowsError: pass yield "%s%s" % (hive_name, top), keys, value_names for key in keys: for tup in self._Walk(depth - 1, hive, hive_name, r"%s\%s" % (top, key)): yield tup def RecursiveListNames(self, depth=0): if not self.IsDirectory(): return iter(()) if self.hive is None: return self._Walk(depth) return self._Walk(depth, self.hive, self.hive_name, self.local_path) def ListNames(self): """List the names of all keys and values.""" if not self.IsDirectory(): return # Handle the special case where no hive is specified and just list the hives if self.hive is None: for name in dir(_winreg): if name.startswith("HKEY_"): yield name return try: with OpenKey(self.hive, self.local_path) as key: (self.number_of_keys, self.number_of_values, self.last_modified) = QueryInfoKey(key) self.last_modified = self.last_modified / 10000000 - WIN_UNIX_DIFF_MSECS # First keys for i in xrange(self.number_of_keys): try: yield EnumKey(key, i) except exceptions.WindowsError: pass # Now Values for i in xrange(self.number_of_values): try: name, unused_value, unused_value_type = EnumValue(key, i) yield name except exceptions.WindowsError: pass except exceptions.WindowsError as e: raise IOError("Unable to list key %s: %s" % (self.key_name, e)) def ListFiles(self): """A generator of all keys and values.""" if not self.IsDirectory(): return if self.hive is None: for name in dir(_winreg): if name.startswith("HKEY_"): response = rdf_client.StatEntry(st_mode=stat.S_IFDIR) response_pathspec = self.pathspec.Copy() response_pathspec.last.path = utils.JoinPath( response_pathspec.last.path, name) response.pathspec = response_pathspec yield response return try: with OpenKey(self.hive, self.local_path) as key: (self.number_of_keys, self.number_of_values, self.last_modified) = QueryInfoKey(key) self.last_modified = self.last_modified / 10000000 - WIN_UNIX_DIFF_MSECS # First keys - These will look like directories. for i in xrange(self.number_of_keys): try: name = EnumKey(key, i) key_name = utils.JoinPath(self.local_path, name) try: # Store the default value in the stat response for values. with OpenKey(self.hive, key_name) as subkey: value, value_type = QueryValueEx(subkey, "") except exceptions.WindowsError: value, value_type = None, None response = self._Stat(name, value, value_type) # Keys look like Directories in the VFS. response.st_mode = stat.S_IFDIR yield response except exceptions.WindowsError: pass # Now Values - These will look like files. for i in xrange(self.number_of_values): try: name, value, value_type = EnumValue(key, i) response = self._Stat(name, value, value_type) # Values look like files in the VFS. response.st_mode = stat.S_IFREG yield response except exceptions.WindowsError: pass except exceptions.WindowsError as e: raise IOError("Unable to list key %s: %s" % (self.key_name, e)) def IsDirectory(self): return self.is_directory def Read(self, length): if not self.fd: self.fd = StringIO.StringIO(utils.SmartStr(self.value)) return self.fd.read(length) def Seek(self, offset, whence=0): if not self.fd: self.fd = StringIO.StringIO(utils.SmartStr(self.value)) return self.fd.seek(offset, whence) grr-3.1.0.2/grr/client/vfs_handlers/sleuthkit.py000066400000000000000000000346501273104013200215620ustar00rootroot00000000000000#!/usr/bin/env python """Implement low level disk access using the sleuthkit.""" import stat import pytsk3 from grr.client import client_utils from grr.client import vfs from grr.lib import utils from grr.lib.rdfvalues import client as rdf_client from grr.lib.rdfvalues import paths as rdf_paths class CachedFilesystem(object): """A container for the filesystem and image.""" def __init__(self, fs, img): self.fs = fs self.img = img class MyImgInfo(pytsk3.Img_Info): """An Img_Info class using the regular python file handling.""" def __init__(self, fd=None, progress_callback=None): pytsk3.Img_Info.__init__(self) self.progress_callback = progress_callback self.fd = fd def read(self, offset, length): # pylint: disable=g-bad-name # Sleuthkit operations might take a long time so we periodically call the # progress indicator callback as long as there are still data reads. if self.progress_callback: self.progress_callback() self.fd.seek(offset) return self.fd.read(length) def get_size(self): # pylint: disable=g-bad-name # Windows is unable to report the true size of the raw device and allows # arbitrary reading past the end - so we lie here to force tsk to read it # anyway return long(1e12) class TSKFile(vfs.VFSHandler): """Read a regular file.""" supported_pathtype = rdf_paths.PathSpec.PathType.TSK auto_register = True # A mapping to encode TSK types to a stat.st_mode FILE_TYPE_LOOKUP = { pytsk3.TSK_FS_NAME_TYPE_UNDEF: 0, pytsk3.TSK_FS_NAME_TYPE_FIFO: stat.S_IFIFO, pytsk3.TSK_FS_NAME_TYPE_CHR: stat.S_IFCHR, pytsk3.TSK_FS_NAME_TYPE_DIR: stat.S_IFDIR, pytsk3.TSK_FS_NAME_TYPE_BLK: stat.S_IFBLK, pytsk3.TSK_FS_NAME_TYPE_REG: stat.S_IFREG, pytsk3.TSK_FS_NAME_TYPE_LNK: stat.S_IFLNK, pytsk3.TSK_FS_NAME_TYPE_SOCK: stat.S_IFSOCK, } META_TYPE_LOOKUP = { pytsk3.TSK_FS_META_TYPE_BLK: 0, pytsk3.TSK_FS_META_TYPE_CHR: stat.S_IFCHR, pytsk3.TSK_FS_META_TYPE_DIR: stat.S_IFDIR, pytsk3.TSK_FS_META_TYPE_FIFO: stat.S_IFIFO, pytsk3.TSK_FS_META_TYPE_LNK: stat.S_IFLNK, pytsk3.TSK_FS_META_TYPE_REG: stat.S_IFREG, pytsk3.TSK_FS_META_TYPE_SOCK: stat.S_IFSOCK, } # Files we won't return in directories. BLACKLIST_FILES = ["$OrphanFiles" # Special TSK dir that invokes processing. ] # The file like object we read our image from tsk_raw_device = None # NTFS files carry an attribute identified by ntfs_type and ntfs_id. tsk_attribute = None # This is all bits that define the type of the file in the stat mode. Equal to # 0b1111000000000000. stat_type_mask = (stat.S_IFREG | stat.S_IFDIR | stat.S_IFLNK | stat.S_IFBLK | stat.S_IFCHR | stat.S_IFIFO | stat.S_IFSOCK) def __init__(self, base_fd, pathspec=None, progress_callback=None, full_pathspec=None): """Use TSK to read the pathspec. Args: base_fd: The file like object we read this component from. pathspec: An optional pathspec to open directly. progress_callback: A callback to indicate that the open call is still working but needs more time. full_pathspec: The full pathspec we are trying to open. Raises: IOError: If the file can not be opened. """ super(TSKFile, self).__init__(base_fd, pathspec=pathspec, progress_callback=progress_callback, full_pathspec=full_pathspec) if self.base_fd is None: raise IOError("TSK driver must have a file base.") # If our base is another tsk driver - borrow the reference to the raw # device, and replace the last pathspec component with this one after # extending its path. elif isinstance(base_fd, TSKFile) and self.base_fd.IsDirectory(): self.tsk_raw_device = self.base_fd.tsk_raw_device last_path = utils.JoinPath(self.pathspec.last.path, pathspec.path) # Replace the last component with this one. self.pathspec.Pop(-1) self.pathspec.Append(pathspec) self.pathspec.last.path = last_path # Use the base fd as a base to parse the filesystem only if its file like. elif not self.base_fd.IsDirectory(): self.tsk_raw_device = self.base_fd self.pathspec.Append(pathspec) else: # If we get here we have a directory from a non sleuthkit driver - dont # know what to do with it. raise IOError("Unable to parse base using Sleuthkit.") # If we are successful in opening this path below the path casing is # correct. self.pathspec.last.path_options = rdf_paths.PathSpec.Options.CASE_LITERAL fd_hash = self.tsk_raw_device.pathspec.SerializeToString() # Cache the filesystem using the path of the raw device try: self.filesystem = vfs.DEVICE_CACHE.Get(fd_hash) self.fs = self.filesystem.fs except KeyError: self.img = MyImgInfo(fd=self.tsk_raw_device, progress_callback=progress_callback) self.fs = pytsk3.FS_Info(self.img, 0) self.filesystem = CachedFilesystem(self.fs, self.img) vfs.DEVICE_CACHE.Put(fd_hash, self.filesystem) # We prefer to open the file based on the inode because that is more # efficient. if pathspec.HasField("inode"): self.fd = self.fs.open_meta(pathspec.inode) self.tsk_attribute = self.GetAttribute(pathspec.ntfs_type, pathspec.ntfs_id) if self.tsk_attribute: self.size = self.tsk_attribute.info.size else: self.size = self.fd.info.meta.size else: # Does the filename exist in the image? self.fd = self.fs.open(utils.SmartStr(self.pathspec.last.path)) self.size = self.fd.info.meta.size self.pathspec.last.inode = self.fd.info.meta.addr def GetAttribute(self, ntfs_type, ntfs_id): for attribute in self.fd: if attribute.info.type == ntfs_type: # If ntfs_id is specified it has to also match. if ntfs_id != 0 and attribute.info.id != ntfs_id: continue return attribute return None def _Walk(self, depth, top_path, top_tsk_dir): if depth < 0: return dirs, files = [], [] tsk_dir_map = {} for f in top_tsk_dir: name = f.info.name.name if name in [".", ".."] or name in self.BLACKLIST_FILES: continue name = utils.SmartUnicode(name) try: inode = f.info.meta.addr fd = self.fs.open_meta(inode) tsk_dir = fd.as_directory() except (IOError, AttributeError): # Not a directory files.append(name) else: # Is a directory dirs.append(name) tsk_dir_map[name] = tsk_dir dirs.sort() files.sort() yield top_path, dirs, files for d in dirs: path = "%s/%s" % (top_path if top_path != "/" else "", d) tsk_dir = tsk_dir_map[d] for item in self._Walk(depth - 1, path, tsk_dir): yield item def RecursiveListNames(self, depth=0): path = self.pathspec.last.path try: tsk_dir = self.fd.as_directory() except IOError: # Not a directory return return self._Walk(depth, path, tsk_dir) def ListNames(self): directory_handle = self.fd.as_directory() for f in directory_handle: # TSK only deals with utf8 strings, but path components are always unicode # objects - so we convert to unicode as soon as we receive data from # TSK. Prefer to compare unicode objects to guarantee they are normalized. yield utils.SmartUnicode(f.info.name.name) def MakeStatResponse(self, tsk_file, tsk_attribute=None, append_name=False): """Given a TSK info object make a StatEntry. Note that tsk uses two things to uniquely identify a data stream - the inode object given in tsk_file and the attribute object which may correspond to an ADS of this file for filesystems which support ADS. We store both of these in the stat response. Args: tsk_file: A TSK File object for the specified inode. tsk_attribute: A TSK Attribute object for the ADS. If None we use the main stream. append_name: If specified we append this name to the last element of the pathspec. Returns: A StatEntry which can be used to re-open this exact VFS node. """ info = tsk_file.info response = rdf_client.StatEntry() meta = info.meta if meta: response.st_ino = meta.addr for attribute in ["mode", "nlink", "uid", "gid", "size", "atime", "mtime", "ctime", "crtime"]: try: value = int(getattr(meta, attribute)) if value < 0: value &= 0xFFFFFFFF setattr(response, "st_%s" % attribute, value) except AttributeError: pass name = info.name child_pathspec = self.pathspec.Copy() if append_name: # Append the name to the most inner pathspec child_pathspec.last.path = utils.JoinPath(child_pathspec.last.path, utils.SmartUnicode(append_name)) child_pathspec.last.inode = meta.addr if tsk_attribute is not None: child_pathspec.last.ntfs_type = int(tsk_attribute.info.type) child_pathspec.last.ntfs_id = int(tsk_attribute.info.id) child_pathspec.last.stream_name = tsk_attribute.info.name # Update the size with the attribute size. response.st_size = tsk_attribute.info.size default = rdf_paths.PathSpec.tsk_fs_attr_type.TSK_FS_ATTR_TYPE_DEFAULT last = child_pathspec.last if last.ntfs_type != default or last.ntfs_id: # This is an ads and should be treated as a file. # Clear all file type bits. response.st_mode &= ~self.stat_type_mask response.st_mode |= stat.S_IFREG else: child_pathspec.last.ntfs_type = None child_pathspec.last.ntfs_id = None child_pathspec.last.stream_name = None if name: # Encode the type onto the st_mode response response.st_mode |= self.FILE_TYPE_LOOKUP.get(int(name.type), 0) if meta: # What if the types are different? What to do here? response.st_mode |= self.META_TYPE_LOOKUP.get(int(meta.type), 0) # Write the pathspec on the response. response.pathspec = child_pathspec return response def Read(self, length): """Read from the file.""" if not self.IsFile(): raise IOError("%s is not a file." % self.pathspec.last.path) available = min(self.size - self.offset, length) if available > 0: # This raises a RuntimeError in some situations. try: data = self.fd.read_random(self.offset, available, self.pathspec.last.ntfs_type, self.pathspec.last.ntfs_id) except RuntimeError as e: raise IOError(e) self.offset += len(data) return data return "" def Stat(self): """Return a stat of the file.""" return self.MakeStatResponse(self.fd, tsk_attribute=self.tsk_attribute) def ListFiles(self): """List all the files in the directory.""" if self.IsDirectory(): dir_fd = self.fd.as_directory() for f in dir_fd: try: name = f.info.name.name # Drop these useless entries. if name in [".", ".."] or name in self.BLACKLIST_FILES: continue # First we yield a standard response using the default attributes. yield self.MakeStatResponse(f, tsk_attribute=None, append_name=name) # Now send back additional named attributes for the ADS. for attribute in f: if attribute.info.type in [pytsk3.TSK_FS_ATTR_TYPE_NTFS_DATA, pytsk3.TSK_FS_ATTR_TYPE_DEFAULT]: if attribute.info.name: yield self.MakeStatResponse(f, append_name=name, tsk_attribute=attribute) except AttributeError: pass else: raise IOError("%s is not a directory" % self.pathspec.CollapsePath()) def IsDirectory(self): last = self.pathspec.last default = rdf_paths.PathSpec.tsk_fs_attr_type.TSK_FS_ATTR_TYPE_DEFAULT if last.ntfs_type != default or last.ntfs_id: # This is an ads so treat as a file. return False return self.fd.info.meta.type == pytsk3.TSK_FS_META_TYPE_DIR def IsFile(self): last = self.pathspec.last default = rdf_paths.PathSpec.tsk_fs_attr_type.TSK_FS_ATTR_TYPE_DEFAULT if last.ntfs_type != default or last.ntfs_id: # This is an ads so treat as a file. return True return self.fd.info.meta.type == pytsk3.TSK_FS_META_TYPE_REG @classmethod def Open(cls, fd, component, pathspec=None, progress_callback=None, full_pathspec=None): # A Pathspec which starts with TSK means we need to resolve the mount point # at runtime. if fd is None and component.pathtype == rdf_paths.PathSpec.PathType.TSK: # We are the top level handler. This means we need to check the system # mounts to work out the exact mount point and device we need to # open. We then modify the pathspec so we get nested in the raw # pathspec. raw_pathspec, corrected_path = client_utils.GetRawDevice(component.path) # Insert the raw device before the component in the pathspec and correct # the path component.path = corrected_path pathspec.Insert(0, component) pathspec.Insert(0, raw_pathspec) # Allow incoming pathspec to be given in the local system path # conventions. for component in pathspec: if component.path: component.path = client_utils.LocalPathToCanonicalPath(component.path) # We have not actually opened anything in this iteration, but modified the # pathspec. Next time we should be able to open it properly. return fd # If an inode is specified, just use it directly. elif component.HasField("inode"): return TSKFile(fd, component, progress_callback=progress_callback, full_pathspec=full_pathspec) # Otherwise do the usual case folding. else: return vfs.VFSHandler.Open(fd, component, pathspec=pathspec, progress_callback=progress_callback, full_pathspec=full_pathspec) grr-3.1.0.2/grr/client/windows/000077500000000000000000000000001273104013200162005ustar00rootroot00000000000000grr-3.1.0.2/grr/client/windows/__init__.py000066400000000000000000000003501273104013200203070ustar00rootroot00000000000000#!/usr/bin/env python """This module contains windows specific client code.""" # These need to register plugins so, pylint: disable=unused-import from grr.client.windows import installers from grr.client.windows import regconfig grr-3.1.0.2/grr/client/windows/installers.py000066400000000000000000000144651273104013200207440ustar00rootroot00000000000000#!/usr/bin/env python """These are windows specific installers. NOTE: Subprocess module is broken on windows in that pipes are not handled correctly. See for example: http://bugs.python.org/issue3905 This problem seems to go away when we use pipes for all standard handles: https://launchpadlibrarian.net/134750748/pyqtgraph_subprocess.patch We also set shell=True because that seems to avoid having an extra cmd.exe window pop up. """ import os import re import shutil import subprocess import sys import time import _winreg import pywintypes import win32process import win32service import win32serviceutil import logging from grr.client import installer from grr.lib import config_lib from grr.lib import utils class CheckForWow64(installer.Installer): """Check to ensure we are not running on a Wow64 system.""" def RunOnce(self): if win32process.IsWow64Process(): raise RuntimeError("Will not install a 32 bit client on a 64 bit system. " "Please use the correct client.") class CopyToSystemDir(installer.Installer): """Copy the distribution from the temp directory to the target.""" pre = ["CheckForWow64"] def StopPreviousService(self): """Wait until the service can be stopped.""" service = config_lib.CONFIG["Nanny.service_name"] # QueryServiceStatus returns: scvType, svcState, svcControls, err, # svcErr, svcCP, svcWH try: status = win32serviceutil.QueryServiceStatus(service)[1] except pywintypes.error, e: logging.info("Unable to query status of service: %s with error: %s", service, e) return for _ in range(20): if status == win32service.SERVICE_STOPPED: break elif status != win32service.SERVICE_STOP_PENDING: logging.info("Attempting to stop service %s", service) try: win32serviceutil.StopService(service) except pywintypes.error, e: logging.info("Unable to stop service: %s with error: %s", service, e) time.sleep(1) status = win32serviceutil.QueryServiceStatus(service)[1] if status != win32service.SERVICE_STOPPED: service_binary = config_lib.CONFIG["Nanny.service_binary_name"] # Taskkill will fail on systems predating Windows XP, this is a best # effort fallback solution. output = subprocess.check_output( ["taskkill", "/im", "%s*" % service_binary, "/f"], shell=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE) logging.debug("%s", output) # Sleep a bit to ensure that process really quits. time.sleep(2) def RunOnce(self): """Copy the binaries from the temporary unpack location. We need to first stop the running service or we might not be able to write on the binary. We then copy the entire directory where we are running from into the location indicated by "Client.install_path". """ self.StopPreviousService() executable_directory = os.path.dirname(sys.executable) install_path = config_lib.CONFIG["Client.install_path"] logging.info("Installing binaries %s -> %s", executable_directory, config_lib.CONFIG["Client.install_path"]) try: shutil.rmtree(install_path) except OSError: pass # Create the installation directory. try: os.makedirs(install_path) except OSError: pass # Recursively copy the temp directory to the installation directory. for root, dirs, files in os.walk(executable_directory): for name in dirs: src_path = os.path.join(root, name) relative_path = os.path.relpath(src_path, executable_directory) dest_path = os.path.join(install_path, relative_path) try: os.mkdir(dest_path) except OSError: pass for name in files: src_path = os.path.join(root, name) relative_path = os.path.relpath(src_path, executable_directory) dest_path = os.path.join(install_path, relative_path) shutil.copy(src_path, dest_path) class WindowsInstaller(installer.Installer): """Install the windows client binary.""" pre = ["CopyToSystemDir", "UpdateClients"] # These options will be copied to the registry to configure the nanny service. nanny_options = ("Nanny.child_binary", "Nanny.child_command_line", "Nanny.service_name", "Nanny.service_description",) def InstallNanny(self): """Install the nanny program.""" # We need to copy the nanny sections to the registry to ensure the # service is correctly configured. new_config = config_lib.CONFIG.MakeNewConfig() new_config.SetWriteBack(config_lib.CONFIG["Config.writeback"]) for option in self.nanny_options: new_config.Set(option, config_lib.CONFIG.Get(option)) new_config.Write() args = [config_lib.CONFIG["Nanny.binary"], "--service_key", config_lib.CONFIG["Nanny.service_key"], "install"] logging.debug("Calling %s", (args,)) output = subprocess.check_output(args, shell=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE) logging.debug("%s", output) def Run(self): self.InstallNanny() class UpdateClients(installer.Installer): """Copy configuration from old clients.""" def Run(self): try: new_config = config_lib.CONFIG.MakeNewConfig() new_config.SetWriteBack(config_lib.CONFIG["Config.writeback"]) for mapping in config_lib.CONFIG["Installer.old_key_map"]: try: src, parameter_name = mapping.split("->") src_components = re.split(r"[/\\]", src.strip()) parameter_name = parameter_name.strip() key_name = "\\".join(src_components[1:-1]) value_name = src_components[-1] key = _winreg.CreateKeyEx( getattr(_winreg, src_components[0]), key_name, 0, _winreg.KEY_ALL_ACCESS) value, _ = _winreg.QueryValueEx(key, value_name) new_config.SetRaw(parameter_name, utils.SmartStr(value)) _winreg.DeleteValue(key, value_name) logging.info("Migrated old parameter %s", src) except (OSError, AttributeError, IndexError, ValueError) as e: logging.debug("mapping %s ignored: %s", mapping, e) finally: new_config.Write() grr-3.1.0.2/grr/client/windows/regconfig.py000066400000000000000000000042731273104013200205230ustar00rootroot00000000000000#!/usr/bin/env python """A registry based configuration parser.""" # NOTE: Running a 32 bit compiled client and 64 bit compiled client on a 64 bit # system will run both clients on _DIFFERENT_ hives according to the WOW64 # scheme. This means that GRR will appear to have different clients for the same # system. The clients will not share their config keys if the registry keys they # use are hooked by WOW64. import exceptions import urlparse import _winreg import logging from grr.lib import config_lib from grr.lib import utils class RegistryConfigParser(config_lib.GRRConfigParser): """A registry based configuration parser. This config system simply stores all the parameters as values of type REG_SZ in a single key. """ name = "reg" root_key = None def __init__(self, filename=None): """We interpret the name as a key name.""" url = urlparse.urlparse(filename, scheme="file") self.filename = url.path.replace("/", "\\") self.hive = url.netloc self.path = self.filename.lstrip("\\") try: # Don't use _winreg.KEY_WOW64_64KEY since it breaks on Windows 2000 self.root_key = _winreg.CreateKeyEx( getattr(_winreg, self.hive), self.path, 0, _winreg.KEY_ALL_ACCESS) self.parsed = self.path except exceptions.WindowsError as e: logging.debug("Unable to open config registry key: %s", e) return def RawData(self): """Yields the valus in each section.""" result = config_lib.OrderedYamlDict() i = 0 while True: try: name, value, value_type = _winreg.EnumValue(self.root_key, i) # Only support strings here. if value_type == _winreg.REG_SZ: result[name] = utils.SmartStr(value) except (exceptions.WindowsError, TypeError): break i += 1 return result def SaveData(self, raw_data): logging.info("Writing back configuration to key %s", self.filename) # Ensure intermediate directories exist. try: for key, value in raw_data.items(): _winreg.SetValueEx(self.root_key, key, 0, _winreg.REG_SZ, utils.SmartStr(value)) finally: # Make sure changes hit the disk. _winreg.FlushKey(self.root_key) grr-3.1.0.2/grr/config/000077500000000000000000000000001273104013200144755ustar00rootroot00000000000000grr-3.1.0.2/grr/config/__init__.py000066400000000000000000000011751273104013200166120ustar00rootroot00000000000000#!/usr/bin/env python """This module will load all the configuration parameters.""" # pylint: disable=unused-import from grr.config import acls from grr.config import aff4 from grr.config import api from grr.config import artifacts from grr.config import build from grr.config import checks from grr.config import client from grr.config import config from grr.config import contexts from grr.config import data_server from grr.config import data_store from grr.config import gui from grr.config import local from grr.config import logging from grr.config import output_plugins from grr.config import server from grr.config import test grr-3.1.0.2/grr/config/acls.py000066400000000000000000000021401273104013200157660ustar00rootroot00000000000000#!/usr/bin/env python """Settings for ACLs/approvals system.""" from grr.lib import config_lib config_lib.DEFINE_string("ACL.approvers_config_file", "%(Config.directory)/approvers.yaml", "File that defines who can approve access to " "clients with certain labels.") config_lib.DEFINE_integer("ACL.approvers_required", 2, "The number of approvers required for access.") config_lib.DEFINE_integer("ACL.cache_age", 600, "The number of seconds " "approval objects live in the cache.") config_lib.DEFINE_string("ACL.group_access_manager_class", "NoGroupAccess", "This class handles interfacing with corporate group" "directories for granting access. Override with a " "class that understands your LDAP/AD/whatever setup.") config_lib.DEFINE_integer("ACL.token_expiry", 7 * 24 * 60 * 60, "The duration in seconds of a valid approval token. " "Default of one week.") grr-3.1.0.2/grr/config/aff4.py000066400000000000000000000013671273104013200156760ustar00rootroot00000000000000#!/usr/bin/env python """Configuration parameters for the aff4 subsystem.""" from grr.lib import config_lib config_lib.DEFINE_integer( "AFF4.cache_age", 5, "The number of seconds AFF4 objects live in the cache.") config_lib.DEFINE_integer("AFF4.cache_max_size", 10000, "Maximum size of the AFF4 objects cache.") config_lib.DEFINE_integer( "AFF4.intermediate_cache_age", 600, "The number of seconds AFF4 urns live in index cache.") config_lib.DEFINE_integer("AFF4.intermediate_cache_max_size", 2000, "Maximum size of the AFF4 index cache.") config_lib.DEFINE_string( "AFF4.change_email", None, "Email used by AFF4NotificationEmailListener to notify " "about AFF4 changes.") grr-3.1.0.2/grr/config/api.py000066400000000000000000000023721273104013200156240ustar00rootroot00000000000000#!/usr/bin/env python """API config options.""" from grr.lib import config_lib from grr.lib import rdfvalue config_lib.DEFINE_integer("API.DailyFlowRequestLimit", "10", "Number of flows a user can run on a single client " "per day before being blocked by throttling. Set to " "0 to disable checking.") config_lib.DEFINE_semantic(rdfvalue.Duration, "API.FlowDuplicateInterval", default="1200s", description="Amount of time " "that needs to pass before the throttler will allow " "an identical flow to run on the same client. Set " "to 0s to disable checking.") config_lib.DEFINE_string("API.RouterACLConfigFile", "", "The file containing API acls, see " "grr/config/api_acls.yaml for an example.") config_lib.DEFINE_string("API.DefaultRouter", "DisabledApiCallRouter", "The default router used by the API if there are no " "rules defined in API.RouterACLConfigFile or if none " "of these rules matches.") grr-3.1.0.2/grr/config/artifacts.py000066400000000000000000000074151273104013200170360ustar00rootroot00000000000000#!/usr/bin/env python """Configuration parameters for the artifact subsystem.""" from grr.lib import config_lib config_lib.DEFINE_list("Artifacts.artifact_dirs", ["%(grr/artifacts|resource)", "%(grr/artifacts/flow_templates|resource)", "%(grr/artifacts/local|resource)"], "A list directories to load artifacts from.") config_lib.DEFINE_list("Artifacts.knowledge_base", ["AllUsersAppDataEnvironmentVariable", "AllUsersProfileEnvironmentVariable", "CurrentControlSet", "ProgramFiles", "ProgramFilesx86", "SystemDriveEnvironmentVariable", "SystemRoot", "TempEnvironmentVariable", "UserShellFolders", "WinCodePage", "WinDirEnvironmentVariable", "WinDomainName", "WinPathEnvironmentVariable", "WinTimeZone", "WindowsRegistryProfiles", "WMIProfileUsersHomeDir", "WMIAccountUsersDomain", "OSXUsers", "LinuxUserProfiles", "LinuxRelease"], "List of artifacts that are collected regularly by" " interrogate and used for interpolation of client-side" " variables. Includes artifacts for all supported OSes. " "Anything not in this list won't be downloaded by" " interrogate so be sure to include any necessary" " dependencies.") config_lib.DEFINE_list("Artifacts.knowledge_base_additions", [], "Extra artifacts to add to the knowledge_base list. This" " allows per-site tweaks without having to redefine the" " whole list.") config_lib.DEFINE_list("Artifacts.knowledge_base_skip", [], "Artifacts to remove from the knowledge_base list. This" " allows per-site tweaks without having to redefine the" " whole list.") config_lib.DEFINE_list("Artifacts.knowledge_base_heavyweight", ["WMIAccountUsersDomain"], "Artifacts to skip when the 'lightweight' option is" " set on interrogate. These artifacts are too expensive" " or slow to collect regularly from all machines.") config_lib.DEFINE_list("Artifacts.interrogate_store_in_aff4", ["WMILogicalDisks", "RootDiskVolumeUsage", "WMIComputerSystemProduct", "LinuxHardwareInfo", "OSXSPHardwareDataType"], "Artifacts to collect during interrogate that don't" " populate the knowledgebase, but store results " "elsewhere in aff4.") config_lib.DEFINE_list("Artifacts.interrogate_store_in_aff4_additions", [], "Extra artifacts to add to the " "interrogate_store_in_aff4 list. This allows per-site " "tweaks without having to redefine the whole list.") config_lib.DEFINE_list("Artifacts.interrogate_store_in_aff4_skip", [], "Artifacts to remove from the " "interrogate_store_in_aff4 list. This allows per-site " "tweaks without having to redefine the whole list.") config_lib.DEFINE_list("Artifacts.netgroup_filter_regexes", [], help="Only parse groups that match one of these regexes" " from /etc/netgroup files.") config_lib.DEFINE_list("Artifacts.netgroup_user_blacklist", [], help="Exclude these users when parsing /etc/netgroup " "files.") grr-3.1.0.2/grr/config/build.py000066400000000000000000000447601273104013200161610ustar00rootroot00000000000000#!/usr/bin/env python """Configuration parameters for client builder and server packaging.""" import os import time from grr.lib import config_lib from grr.lib import rdfvalue from grr.lib import type_info config_lib.DEFINE_option(type_info.RDFValueType( rdfclass=rdfvalue.RDFURN, name="Config.aff4_root", default="aff4:/config/", description=("The path where the configs are stored in the aff4 " "namespace."))) config_lib.DEFINE_option(type_info.RDFValueType( rdfclass=rdfvalue.RDFURN, name="Config.python_hack_root", default="%(Config.aff4_root)/python_hacks", description=("The path where python hacks are stored in the aff4 " "namespace."))) # Executables must be signed and uploaded to their dedicated AFF4 namespace. config_lib.DEFINE_option(type_info.RDFValueType( rdfclass=rdfvalue.RDFURN, name="Executables.aff4_path", description="The aff4 path to signed executables.", default="%(Config.aff4_root)/executables/%(Client.platform)")) config_lib.DEFINE_string( name="Executables.installer", default=("%(Executables.aff4_path)/installers/" "%(ClientRepacker.output_basename)" "%(ClientBuilder.output_extension)"), help="The location of the generated installer in the config directory.") config_lib.DEFINE_string( name="ClientBuilder.output_extension", default=None, help="The file extension for the client (OS dependent).") config_lib.DEFINE_string(name="ClientBuilder.package_dir", default=None, help="OSX package name.") class PathTypeInfo(type_info.String): """A path to a file or a directory.""" def __init__(self, must_exist=True, **kwargs): self.must_exist = must_exist super(PathTypeInfo, self).__init__(**kwargs) def Validate(self, value): value = super(PathTypeInfo, self).Validate(value) if self.must_exist and not os.access(value, os.R_OK): raise type_info.TypeValueError("Path %s does not exist for %s" % (value, self.name)) return value def FromString(self, string): return os.path.normpath(string) # PyInstaller build configuration. config_lib.DEFINE_option(PathTypeInfo( name="PyInstaller.path", must_exist=False, default="c:/grr_build/pyinstaller/pyinstaller.py", help="Path to the main pyinstaller.py file.")) config_lib.DEFINE_string( name="PyInstaller.spec", help="The spec file contents to use for building the client.", default=r""" import os # By default build in one dir mode. client_path = r"%(%(grr.client.client|module_path)|fixpathsep)" a = Analysis\( [client_path], hiddenimports=[], hookspath=None\) # Remove some optional libraries that would be packed but serve no purpose. for prefix in ["IPython"]: for collection in [a.binaries, a.datas, a.pure]: for item in collection[:]: if item[0].startswith\(prefix\): collection.remove\(item\) pyz = PYZ\( a.pure\) exe = EXE\( pyz, a.scripts, exclude_binaries=1, name=os.path.join\("build", "grr-client"\), debug=False, strip=False, upx=False, console=True, version=os.path.join\(r"%(PyInstaller.build_dir)", "version.txt"\), icon=os.path.join\(r"%(PyInstaller.build_dir)", "grr.ico"\)\) coll = COLLECT\( exe, a.binaries, a.zipfiles, a.datas, strip=False, upx=False, name="grr-client" \) """) config_lib.DEFINE_string( name="PyInstaller.distpath", help=("Passed to PyInstaller as the --distpath flag. This sets the output " "directory for PyInstaller."), default="./dist") config_lib.DEFINE_string( name="PyInstaller.version", help="The version.txt file contents to use for building the client.", default=r""" VSVersionInfo\( ffi=FixedFileInfo\( filevers=\(%(Source.version_major), %(Source.version_minor), %(Source.version_revision), %(Source.version_release)\), prodvers=\(%(Source.version_major), %(Source.version_minor), %(Source.version_revision), %(Source.version_release)\), mask=0x3f, flags=0x0, OS=0x40004, fileType=0x1, subtype=0x0, date=\(0, 0\) \), kids=[ StringFileInfo\( [ StringTable\( '040904B0', [ StringStruct\(u'CompanyName', u"<---------------- Client.company_name ------------------->"\), StringStruct\(u'FileDescription', u"<---------------- Client.description ------------------->"\), StringStruct\(u'FileVersion', u"<---------------- Source.version_string ------------------->"\), StringStruct\(u'ProductName', u"<---------------- Client.name ------------------->"\), StringStruct\(u'OriginalFilename', u"<---------------- ClientBuilder.package_name ------------------->"\), ]\), ]\), VarFileInfo\([VarStruct\('Translation', [1033, 1200]\)]\) ] \) """) config_lib.DEFINE_bytes( "PyInstaller.icon", "%(%(grr/gui/static/images/grr.ico|resource)|file)", "The icon file contents to use for building the client.") config_lib.DEFINE_string( "PyInstaller.build_dir", default="%(ClientBuilder.build_root_dir)/%(ClientBuilder.build_dest)", help="The path to the build directory.") config_lib.DEFINE_string("PyInstaller.dpkg_root", default="%(ClientBuilder.build_root_dir)/dist", help="Pyinstaller dpkg root.") config_lib.DEFINE_string("PyInstaller.workpath_dir", default="%(ClientBuilder.build_root_dir)/workpath", help="Pyinstaller working directory.") config_lib.DEFINE_string( name="Client.prefix", default="", help="A prefix for the client name, usually dbg_ for debug builds.") config_lib.DEFINE_string(name="ClientBuilder.output_basename", default=("%(Client.prefix)%(Client.name)_" "%(Source.version_string)_%(Client.arch)"), help="The base name of the output package.") # Windows client specific options. config_lib.DEFINE_bool( "ClientBuilder.console", default=False, help="Should the application be built as a console program. " "This aids debugging in windows.") config_lib.DEFINE_option(type_info.PathTypeInfo( name="ClientBuilder.nanny_source_dir", must_exist=True, default="%(grr.client|module_path)/nanny/", help="Path to the windows nanny VS solution file.")) config_lib.DEFINE_option(type_info.PathTypeInfo( name="ClientBuilder.nanny_prebuilt_binaries", must_exist=False, default="%(ClientBuilder.executables_dir)/%(Client.platform)/", help="Path to the pre-build GRRNanny executables (This will be used " "if there are no VS compilers available).")) config_lib.DEFINE_choice(name="ClientBuilder.build_type", default="Release", choices=["Release", "Debug"], help="Type of build (Debug, Release)") config_lib.DEFINE_string(name="ClientBuilder.template_extension", default=".zip", help="The extension to appear on templates.") config_lib.DEFINE_string( name="PyInstaller.template_basename", default=("%(Client.name)_%(Source.version_string)_%(Client.arch)"), help="The template name of the output package.") config_lib.DEFINE_string( name="PyInstaller.template_filename", default=( "%(PyInstaller.template_basename)%(ClientBuilder.template_extension)"), help="The template file name of the output package.") config_lib.DEFINE_option(type_info.PathTypeInfo( name="ClientBuilder.template_dir", must_exist=False, default=("%(grr-response-templates@grr-response-templates|resource)/" "templates"), help="The directory holding executable template files.")) config_lib.DEFINE_option(type_info.PathTypeInfo( name="ClientBuilder.template_path", must_exist=False, default=("%(ClientBuilder.template_dir)/%(PyInstaller.template_filename)"), help="The full path to the executable template files for building.")) config_lib.DEFINE_option(type_info.PathTypeInfo( name="ClientBuilder.executables_dir", must_exist=False, default="%(executables|resource)", help="The path to the grr executables directory.")) config_lib.DEFINE_option(type_info.PathTypeInfo( name="ClientBuilder.unzipsfx_stub_dir", must_exist=False, default=("%(ClientBuilder.executables_dir)/%(Client.platform)" "/templates/unzipsfx"), help="The directory that contains the zip self extracting stub.")) config_lib.DEFINE_option(type_info.PathTypeInfo( name="ClientBuilder.unzipsfx_stub", must_exist=False, default=("%(ClientBuilder.unzipsfx_stub_dir)/unzipsfx-%(Client.arch).exe"), help="The full path to the zip self extracting stub.")) config_lib.DEFINE_string( name="ClientBuilder.config_filename", default="%(Client.binary_name).yaml", help=("The name of the configuration file which will be embedded in the " "deployable binary.")) config_lib.DEFINE_string( name="ClientBuilder.autorun_command_line", default=("%(Client.binary_name) --install " "--config %(ClientBuilder.config_filename)"), help=("The command that the installer will execute after " "unpacking the package.")) config_lib.DEFINE_list( name="ClientBuilder.installer_plugins", default=[], help="Plugins that will copied to the client installation file and run " "at install time.") config_lib.DEFINE_list( name="ClientBuilder.plugins", default=[], help="Plugins that will copied to the client installation file and run when" "the client is running.") config_lib.DEFINE_string( name="ClientBuilder.client_logging_filename", default="%(Logging.path)/%(Client.name)_log.txt", help="Filename for logging, to be copied to Client section in the client " "that gets built.") config_lib.DEFINE_string( name="ClientBuilder.client_logging_path", default="/tmp", help="Filename for logging, to be copied to Client section in the client " "that gets built.") config_lib.DEFINE_list( name="ClientBuilder.client_logging_engines", default=["stderr", "file"], help="Enabled logging engines, to be copied to Logging.engines in client " "configuration.") config_lib.DEFINE_string( name="ClientBuilder.client_installer_logfile", default="%(Logging.path)/%(Client.name)_installer.txt", help="Logfile for logging the client installation process, to be copied to" " Installer.logfile in client built.") config_lib.DEFINE_string(name="ClientBuilder.maintainer", default="GRR ", help="The client package's maintainer.") config_lib.DEFINE_string( name="ClientBuilder.debian_build_time", default=time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime()), help="The build time put into the debian package. Needs to be formatted" " like the output of 'date -R'.") config_lib.DEFINE_string( name="ClientBuilder.rpm_build_time", default=time.strftime("%a %b %d %Y", time.gmtime()), help="The build time put into the rpm package. Needs to be formatted" " according to the rpm specs.") config_lib.DEFINE_string(name="ClientBuilder.debian_version", default="%(Template.version_numeric)-1", help="The version of the debian package.") config_lib.DEFINE_string( name="ClientBuilder.debian_package_base", default=("%(ClientBuilder.package_name)_" "%(ClientBuilder.debian_version)_%(Template.arch)"), help="The filename of the debian package without extension.") config_lib.DEFINE_string(name="ClientBuilder.package_name", default="%(Client.name)", help="The debian package name.") config_lib.DEFINE_option(type_info.PathTypeInfo( name="ClientBuilder.components_source_dir", default="%(grr.client.components|module_path)", help="The directory that contains the component source.")) config_lib.DEFINE_option(type_info.PathTypeInfo( name="ClientBuilder.components_dir", must_exist=False, default=("%(grr-response-templates@grr-response-templates|resource)" "/components"), help="The directory that contains the components.")) config_lib.DEFINE_string(name="ClientBuilder.build_time", default=time.ctime(), help="Time of build to embed into binary.") config_lib.DEFINE_string( "ClientBuilder.packagemaker", default=("/Developer/Applications/Utilities/PackageMaker.app/Contents" "/MacOS/PackageMaker"), help="Location of the PackageMaker executable.") config_lib.DEFINE_string("ClientBuilder.vs_arch", default=None, help="Visual studio architecture string.") config_lib.DEFINE_string( "ClientBuilder.vs_env_script", default=None, help="Path to visual studio environment variables bat file.") config_lib.DEFINE_string("ClientBuilder.vs_dir", default=None, help="Path to visual studio installation dir.") config_lib.DEFINE_string("ClientBuilder.build_root_dir", default=None, help="Root directory for client builds.") config_lib.DEFINE_string("ClientBuilder.build_dest", default="%(Client.name)-build", help="Output directory for client building.") config_lib.DEFINE_string( "ClientBuilder.install_dir", default=None, help="Target installation directory for client builds.") config_lib.DEFINE_string("ClientBuilder.mangled_output_basename", default=None, help="OS X package maker mangled name.") config_lib.DEFINE_string("ClientBuilder.package_maker_organization", default=None, help="OS X package maker organization name.") config_lib.DEFINE_string("ClientBuilder.package_maker_path", default=None, help="Path to OS X package maker binary.") config_lib.DEFINE_string("ClientBuilder.target_dir", default=None, help="ClientBuilder target directory.") config_lib.DEFINE_string("ClientBuilder.daemon_link", default=None, help="ClientBuilder daemon link.") # These options will be used by client.client_build when running buildandrepack # and can be used to customize what is built for each client label. config_lib.DEFINE_multichoice( name="ClientBuilder.target_platforms", default=[], choices=["darwin_amd64_dmg", "linux_amd64_deb", "linux_i386_deb", "linux_amd64_rpm", "linux_i386_rpm", "windows_amd64_exe", "windows_i386_exe"], help="Platforms that will be built by client_build buildandrepack") config_lib.DEFINE_list(name="ClientBuilder.BuildTargets", default=[], help="List of context names that should be built by " "buildandrepack") config_lib.DEFINE_string("ClientBuilder.rpm_signing_key_public_keyfile", default="/etc/alternatives/grr_rpm_signing_key", help="Public key file for post-signing verification.") config_lib.DEFINE_string("ClientBuilder.rpm_gpg_name", default="GRR Team", help="The gpg name should match your gpg key name.") config_lib.DEFINE_string("ClientBuilder.windows_signing_key", default="/etc/alternatives/grr_windows_signing_key", help="Path to GRR signing key. Should symlink " "to actual key.") config_lib.DEFINE_string("ClientBuilder.windows_signing_cert", default="/etc/alternatives/grr_windows_signing_cert", help="Path to GRR signing cert. Should symlink " "to actual cert.") config_lib.DEFINE_string("ClientBuilder.windows_signing_application_name", default="GRR", help="Signing cert application name.") config_lib.DEFINE_string(name="ClientRepacker.output_basename", default=( "%(Client.prefix)%(Client.name)_" "%(Template.version_string)_%(Template.arch)"), help="The base name of the output package.") config_lib.DEFINE_option(type_info.PathTypeInfo( name="ClientRepacker.output_filename", must_exist=False, default=( "%(ClientRepacker.output_basename)%(ClientBuilder.output_extension)"), help="The filename of the generated installer file.")) config_lib.DEFINE_option(type_info.PathTypeInfo( name="ClientRepacker.output_path", must_exist=False, default=("%(ClientBuilder.executables_dir)" "/installers/%(ClientRepacker.output_filename)"), help="The full path to the generated installer file.")) # These values are determined from the template at repack time. config_lib.DEFINE_choice(name="Template.build_type", default="Release", choices=["Release", "Debug"], help="Type of build (Debug, Release)") config_lib.DEFINE_list( name="Template.build_context", default=[], help="List of build contexts that should be reapplied at repack.") config_lib.DEFINE_integer("Template.version_major", None, "Major version number of client template.") config_lib.DEFINE_integer("Template.version_minor", None, "Minor version number of client template.") config_lib.DEFINE_integer("Template.version_revision", None, "Revision number of client template.") config_lib.DEFINE_integer("Template.version_release", None, "Release number of client template.") config_lib.DEFINE_string("Template.version_string", "%(version_major).%(version_minor)." "%(version_revision).%(version_release)", "Version string of the client template.") config_lib.DEFINE_integer("Template.version_numeric", "%(version_major)%(version_minor)" "%(version_revision)%(version_release)", "Version string of the template as an integer.") config_lib.DEFINE_string("Template.arch", None, "The architecture of the client template.") grr-3.1.0.2/grr/config/build_contexts.py000066400000000000000000000002621273104013200200750ustar00rootroot00000000000000#!/usr/bin/env python """This file defines configuration contexts for client builds.""" from grr.lib import config_lib config_lib.CONFIG.DEFINE_context("AllPlatforms Context") grr-3.1.0.2/grr/config/checks.py000066400000000000000000000011051273104013200163040ustar00rootroot00000000000000#!/usr/bin/env python """Configuration parameters for the check subsystem.""" from grr.lib import config_lib config_lib.DEFINE_list("Checks.config_dir", ["%(grr/checks|resource)", "%(grr/checks/local|resource)"], "A list of directories to load checks from.") config_lib.DEFINE_list("Checks.config_files", [], "Paths of check configurations to load at start up.") config_lib.DEFINE_integer("Checks.max_results", 50, "Maximum items to include as check results.") grr-3.1.0.2/grr/config/client.py000066400000000000000000000272561273104013200163410ustar00rootroot00000000000000#!/usr/bin/env python """Configuration parameters for the client.""" from grr.lib import config_lib from grr.lib import rdfvalue from grr.lib.rdfvalues import crypto # General Client options. config_lib.DEFINE_string("Client.name", "GRR", "The name of the client. This will be used as a base " "name to generate many other default parameters such " "as binary names and service names. Note that on " "Linux we lowercase the name to confirm with most " "linux naming conventions.") config_lib.DEFINE_string("Client.binary_name", "%(Client.name)", "The name of the client binary.") config_lib.DEFINE_list("Client.labels", [], "Labels for this client.") config_lib.DEFINE_string("Client.company_name", "GRR Project", "The name of the company which made the client.") config_lib.DEFINE_string("Client.description", "%(name) %(platform) %(arch)", "A description of this specific client build.") config_lib.DEFINE_string("Client.platform", "windows", "The platform we are running on.") config_lib.DEFINE_string("Client.arch", "amd64", "The architecture we are running on.") config_lib.DEFINE_string("Client.build_time", "Unknown", "The time the client was built.") config_lib.DEFINE_string("Client.deploy_time", "Unknown", "The time the client was deployed.") config_lib.DEFINE_string("Client.build_environment", None, "The output of Uname.FromCurrentSystem.signature() " "on the system the client was built on.") config_lib.DEFINE_integer("Client.rsa_key_length", 2048, "The key length of the client keys in bits.") config_lib.DEFINE_string( name="Client.install_path", default=r"%(SystemRoot|env)\\System32\\%(name)\\%(Source.version_string)", help="Where the client binaries are installed.") config_lib.DEFINE_string( name="Client.component_path", default=r"%(Client.install_path)/components", help="Where the client components are installed on the client.") config_lib.DEFINE_string( name="Client.component_url_stem", default="%(Frontend.static_url_path_prefix)components/", help="A URL path where components will be served from.") config_lib.DEFINE_semantic( rdfvalue.RDFURN, "Client.component_aff4_stem", default="%(Frontend.static_aff4_prefix)/components/", description="A common AFF4 stem where components will be served from.") config_lib.DEFINE_string( name="Client.rekall_profile_cache_path", default=r"%(Client.install_path)\\rekall_profiles", help="Where GRR stores cached Rekall profiles needed for memory analysis") config_lib.DEFINE_list(name="Client.server_urls", default=[], help="Base URL for client control.") # Deprecated. Remove when all installations switch to Client.server_urls. config_lib.DEFINE_list("Client.control_urls", ["http://localhost:8080/control"], "List of URLs of the controlling server.") config_lib.DEFINE_integer("Client.http_timeout", 100, "Timeout for HTTP requests.") config_lib.DEFINE_string("Client.plist_path", "/Library/LaunchDaemons/com.google.code.grrd.plist", "Location of our launchctl plist.") config_lib.DEFINE_string("Client.plist_filename", None, "Filename of launchctl plist.") config_lib.DEFINE_string("Client.plist_label", None, "Identifier label for launchd") config_lib.DEFINE_string("Client.plist_label_prefix", None, "Domain for launchd label.") config_lib.DEFINE_float("Client.poll_min", 0.2, "Minimum time between polls in seconds.") config_lib.DEFINE_float("Client.poll_max", 5, "Maximum time between polls in seconds.") config_lib.DEFINE_float("Client.error_poll_min", 15, "Minimum time between polls in seconds if the server " "reported an error.") config_lib.DEFINE_float("Client.poll_slew", 1.15, "Slew of poll time.") config_lib.DEFINE_integer("Client.connection_error_limit", 60 * 24, "If the client encounters this many connection " "errors, it exits and restarts. Retries are one " "minute apart.") config_lib.DEFINE_integer("Client.retry_error_limit", 10, "If the client encounters this many connection " "errors, it searches for a new proxy/server url " "combination.") config_lib.DEFINE_list( name="Client.proxy_servers", help="List of valid proxy servers the client should try.", default=[]) config_lib.DEFINE_integer("Client.max_post_size", 40000000, "Maximum size of the post.") config_lib.DEFINE_integer("Client.max_out_queue", 51200000, "Maximum size of the output queue.") config_lib.DEFINE_integer("Client.foreman_check_frequency", 1800, "The minimum number of seconds before checking with " "the foreman for new work.") config_lib.DEFINE_float("Client.rss_max", 1000, "Maximum memory footprint in MB (soft limit). " "Exceeding this will result in an orderly shutdown.") config_lib.DEFINE_float("Client.rss_max_hard", 2000, "Maximum memory footprint in MB (hard limit). " "Exceeding this will result in aborting the current " "client action and restarting.") config_lib.DEFINE_string( name="Client.tempfile_prefix", help="Prefix to use for temp files created by the GRR client.", default="tmp%(Client.name)") config_lib.DEFINE_list( name="Client.tempdir_roots", help="List of temporary directories to use on the client.", default=["/var/tmp/"]) config_lib.DEFINE_string( name="Client.grr_tempdir", help="Default subdirectory in the temp directory to use for GRR.", default="%(Client.name)") config_lib.DEFINE_list( name="Client.vfs_virtualroots", help=("If this is set for a VFS type, client VFS operations will always be" " relative to the given root. Format is os:/mount/disk."), default=[]) # Windows client specific options. config_lib.DEFINE_string("Client.config_hive", r"HKEY_LOCAL_MACHINE", help="The registry hive where the client " "configuration will be stored.") config_lib.DEFINE_string("Client.config_key", r"Software\\GRR", help="The registry key where client configuration " "will be stored.") # Client Cryptographic options. config_lib.DEFINE_semantic( crypto.PEMPrivateKey, "Client.private_key", description="Client private key in pem format. If not provided this " "will be generated by the enrollment process.",) config_lib.DEFINE_semantic( crypto.RDFX509Cert, "CA.certificate", description="Trusted CA certificate in X509 pem format",) config_lib.DEFINE_semantic( crypto.PEMPublicKey, "Client.executable_signing_public_key", description="public key for verifying executable signing.") config_lib.DEFINE_semantic( crypto.PEMPrivateKey, "PrivateKeys.executable_signing_private_key", description="Private keys for signing executables. NOTE: This " "key is usually kept offline and is thus not present in the " "configuration file.") config_lib.DEFINE_semantic( crypto.PEMPublicKey, "Client.driver_signing_public_key", description="public key for verifying driver signing.") config_lib.DEFINE_semantic( crypto.PEMPrivateKey, "PrivateKeys.driver_signing_private_key", description="Private keys for signing drivers. NOTE: This " "key is usually kept offline and is thus not present in the " "configuration file.") config_lib.DEFINE_integer("Client.server_serial_number", 0, "Minimal serial number we accept for server cert.") config_lib.DEFINE_integer( "Client.gc_frequency", 10, "Defines how often the client calls garbage collection (seconds).") # The following configuration options are defined here but are used in # the windows nanny code (grr/client/nanny/windows_nanny.h). config_lib.DEFINE_string("Nanny.child_binary", "GRR.exe", help="The location to the client binary.") config_lib.DEFINE_string("Nanny.child_command_line", "%(Nanny.child_binary)", help="The command line to launch the client binary.") config_lib.DEFINE_string("Nanny.logfile", "%(Logging.path)/nanny.log", "The file where we write the nanny transaction log.") config_lib.DEFINE_string("Nanny.service_name", "GRR Service", help="The name of the nanny.") config_lib.DEFINE_string("Nanny.service_description", "GRR Service", help="The description of the nanny service.") config_lib.DEFINE_string("Nanny.service_key", r"%(Client.config_key)", help="The registry key of the nanny service.") config_lib.DEFINE_string("Nanny.service_key_hive", r"%(Client.config_hive)", help="The registry key of the nanny service.") config_lib.DEFINE_string("Nanny.statusfile", "%(Logging.path)/nanny.status", "The file where we write the nanny status.") config_lib.DEFINE_string("Nanny.status", "", "The regkey where we write the nanny status.") config_lib.DEFINE_string("Nanny.binary", r"%(Client.install_path)\\%(service_binary_name)", help="The full location to the nanny binary.") config_lib.DEFINE_string("Nanny.service_binary_name", "%(Client.name)service.exe", help="The executable name of the nanny binary.") config_lib.DEFINE_integer("Nanny.unresponsive_kill_period", 60, "The time in seconds after which the nanny kills us.") config_lib.DEFINE_integer("Network.api", 3, "The version of the network protocol the client " "uses.") config_lib.DEFINE_string("Network.compression", default="ZCOMPRESS", help="Type of compression (ZCOMPRESS, UNCOMPRESSED)") # Installer options. config_lib.DEFINE_string( name="Installer.logfile", default="%(Logging.path)/%(Client.name)_installer.txt", help=("A specific log file which is used for logging the " "installation process.")) config_lib.DEFINE_list("Installer.old_key_map", [ "HKEY_LOCAL_MACHINE\\Software\\GRR\\certificate->Client.private_key", "HKEY_LOCAL_MACHINE\\Software\\GRR\\server_serial_number" "->Client.server_serial_number", ], """ A mapping of old registry values which will be copied to new values. The old value location must start with a valid hive name, followed by a key name, and end with the value name. The source location must be separated from the new parameter name by a -> symbol. This setting allows to carry over settings from obsolete client installations to newer versions of the client which may store the same information in other locations. For example: HKEY_LOCAL_MACHINE\\Software\\GRR\\certificate -> Client.private_key """) grr-3.1.0.2/grr/config/config.py000066400000000000000000000014041273104013200163130ustar00rootroot00000000000000#!/usr/bin/env python """Configuration parameters for the configuration subsystem.""" from grr.lib import config_lib config_lib.DEFINE_string("Config.prefix", "%(grr|resource)", "Prefix directory for general file storage.") config_lib.DEFINE_string("Config.directory", "%(install_data/etc|resource)", "Directory for grr server config files.") config_lib.DEFINE_string("Config.writeback", "%(Config.directory)/server.local.yaml", "Location for writing back the configuration.") config_lib.DEFINE_string("ConfigUpdater.old_config", None, "Path to a previous config file, imported during" " config_updater.Initialize.") grr-3.1.0.2/grr/config/contexts.py000066400000000000000000000040461273104013200167220ustar00rootroot00000000000000#!/usr/bin/env python """This file defines valid configuration contexts.""" # Also import the contexts needed for client building. # pylint: disable=unused-import from grr.config import build_contexts # pylint: enable=unused-import from grr.lib import config_lib # Different client platforms. config_lib.CONFIG.DEFINE_context("Platform:Darwin") config_lib.CONFIG.DEFINE_context("Platform:Linux") config_lib.CONFIG.DEFINE_context("Platform:Windows") # Client architectures. config_lib.CONFIG.DEFINE_context("Arch:amd64") config_lib.CONFIG.DEFINE_context("Arch:i386") # Global system install context - set when GRR is installed globally on the # system. config_lib.CONFIG.DEFINE_context("Global Install Context") # Different components. config_lib.CONFIG.DEFINE_context("AdminUI Context") config_lib.CONFIG.DEFINE_context("Client Context") config_lib.CONFIG.DEFINE_context("ConfigUpdater Context") config_lib.CONFIG.DEFINE_context("Console Context") config_lib.CONFIG.DEFINE_context("DataServer Context") config_lib.CONFIG.DEFINE_context("Demo Context") config_lib.CONFIG.DEFINE_context("EntryPoint Context") config_lib.CONFIG.DEFINE_context("ExportTool Context") config_lib.CONFIG.DEFINE_context("HTTPServer Context") config_lib.CONFIG.DEFINE_context("PoolClient Context") config_lib.CONFIG.DEFINE_context("Worker Context") # Client building contexts. config_lib.CONFIG.DEFINE_context("ClientBuilder Context") config_lib.CONFIG.DEFINE_context("DebugClientBuild Context") config_lib.CONFIG.DEFINE_context("Target:Darwin") config_lib.CONFIG.DEFINE_context("Target:Linux") config_lib.CONFIG.DEFINE_context("Target:LinuxDeb") config_lib.CONFIG.DEFINE_context("Target:LinuxRpm") config_lib.CONFIG.DEFINE_context("Target:Windows") # Running from the command line. config_lib.CONFIG.DEFINE_context("Commandline Context") # For debugging. config_lib.CONFIG.DEFINE_context("Debug Context") config_lib.CONFIG.DEFINE_context("Test Context") # Datastores. config_lib.CONFIG.DEFINE_context("MySQLDataStore") # Client installer context. config_lib.CONFIG.DEFINE_context("Installer Context") grr-3.1.0.2/grr/config/data_server.py000066400000000000000000000025721273104013200173540ustar00rootroot00000000000000#!/usr/bin/env python """Configuration parameters for the data servers.""" from grr.lib import config_lib # The Data Store server. config_lib.DEFINE_integer("Dataserver.stats_frequency", 60, ("Time interval in seconds for data server " "statistics updates")) config_lib.DEFINE_list("Dataserver.server_list", ["http://127.0.0.1:7000", "http://127.0.0.1:7001"], "List of allowed data servers (first is the master).") config_lib.DEFINE_integer("Dataserver.max_connections", 5, ("Maximum number of connections to the data server " "per process.")) config_lib.DEFINE_integer("Dataserver.port", 7000, "Port for a specific data server.") # Login information for clients of the data servers. config_lib.DEFINE_list("Dataserver.client_credentials", ["user:pass:rw"], "List of data server client credentials, given as " ":: where mode is r or rw.") # Login information used by data servers when registering with the master. config_lib.DEFINE_string("Dataserver.server_username", "server", "Username for servers.") config_lib.DEFINE_string("Dataserver.server_password", "server", "Password for servers.") grr-3.1.0.2/grr/config/data_store.py000066400000000000000000000145211273104013200171770ustar00rootroot00000000000000#!/usr/bin/env python """Configuration parameters for the data stores.""" from grr.lib import config_lib config_lib.DEFINE_integer("Datastore.maximum_blob_size", 15 * 1024 * 1024, "Maximum blob size we may store in the datastore.") config_lib.DEFINE_string("Datastore.security_manager", "NullAccessControlManager", "The ACL manager for controlling access to data.") config_lib.DEFINE_string("Datastore.implementation", "FakeDataStore", "Storage subsystem to use.") config_lib.DEFINE_string("Blobstore.implementation", "MemoryStreamBlobstore", "Blob storage subsystem to use.") config_lib.DEFINE_integer("Datastore.transaction_timeout", default=600, help="How long do we wait for a transaction lock.") DATASTORE_PATHING = [r"%{(?Pfiles/hash/generic/sha256/...).*}", r"%{(?Pfiles/hash/generic/sha1/...).*}", r"%{(?Pfiles/hash/generic/md5/...).*}", r"%{(?Pfiles/hash/pecoff/md5/...).*}", r"%{(?Pfiles/hash/pecoff/sha1/...).*}", r"%{(?Pfiles/nsrl/...).*}", r"%{(?PW/[^/]+).*}", r"%{(?PCA/[^/]+).*}", r"%{(?PC\..\{1,16\}?)($|/.*)}", r"%{(?Phunts/[^/]+).*}", r"%{(?Pblobs/[^/]+).*}", r"%{(?P[^/]+).*}"] config_lib.DEFINE_list("Datastore.pathing", DATASTORE_PATHING, ("Path selection for subjects in the file-based data " "stores (by priority).")) config_lib.DEFINE_string("Datastore.location", default="%(Config.prefix)/var/grr-datastore", help=("Location of the data store (usually a " "filesystem directory)")) # SQLite data store. config_lib.DEFINE_integer("SqliteDatastore.vacuum_check", default=10, help=("Number of rows that need to be deleted before " "checking if the sqlite file may need to be " "vacuumed.")) config_lib.DEFINE_integer("SqliteDatastore.vacuum_frequency", default=60, help=("Minimum interval (in seconds) between vacuum" "operations on the same sqlite file.")) config_lib.DEFINE_integer("SqliteDatastore.vacuum_minsize", default=10 * 1024, help=("Minimum size of sqlite file in bytes required" " for vacuuming")) config_lib.DEFINE_integer("SqliteDatastore.vacuum_ratio", default=50, help=("Percentage of pages that are free before " "vacuuming a sqlite file.")) config_lib.DEFINE_integer("SqliteDatastore.connection_cache_size", default=1000, help=("Number of file handles kept in the SQLite " "data_store cache.")) # MySQLAdvanced data store. config_lib.DEFINE_string("Mysql.host", "localhost", "The MySQL server hostname.") config_lib.DEFINE_integer("Mysql.port", 0, "The MySQL server port.") config_lib.DEFINE_string("Mysql.database_name", default="grr", help="Name of the database to use.") config_lib.DEFINE_string("Mysql.table_name", default="aff4", help="Name of the table to use.") config_lib.DEFINE_string("Mysql.database_username", default="root", help="The user to connect to the database.") config_lib.DEFINE_string("Mysql.database_password", default="", help="The password to connect to the database.") config_lib.DEFINE_integer("Mysql.conn_pool_max", 10, help=("The maximum number of open connections to keep" " available in the pool.")) config_lib.DEFINE_integer("Mysql.conn_pool_min", 5, help=("The minimum number of open connections to keep" " available in the pool.")) config_lib.DEFINE_integer("Mysql.max_connect_wait", 0, help=("Total number of seconds we wait for a " "connection before failing (0 means we wait " "forever).")) # HTTP data store. config_lib.DEFINE_string("HTTPDataStore.username", default="httpuser", help="The username to connect to the http data store.") config_lib.DEFINE_string("HTTPDataStore.password", default="httppass", help="The password to connect to the http data store.") config_lib.DEFINE_integer("HTTPDataStore.read_timeout", 5, help="HTTP socket read timeout in seconds.") config_lib.DEFINE_integer("HTTPDataStore.replay_timeout", 5, help=("HTTP socket read timeout when replaying " "requests, in seconds.")) config_lib.DEFINE_integer("HTTPDataStore.send_timeout", 5, help="HTTP socket send timeout in seconds.") config_lib.DEFINE_integer("HTTPDataStore.login_timeout", 5, help=("HTTP socket timeout when remote servers are " "logging in.")) config_lib.DEFINE_integer("HTTPDataStore.reconnect_timeout", 10 * 60, help=("Number of seconds to spend attempting to " "reconnect to the database. Attempt every " "retry_timeout seconds.")) config_lib.DEFINE_integer("HTTPDataStore.retry_time", 5, help=("Number of seconds to wait in-between attempts" "to reconnect to the database.")) grr-3.1.0.2/grr/config/grr-response-client/000077500000000000000000000000001273104013200203775ustar00rootroot00000000000000grr-3.1.0.2/grr/config/grr-response-client/MANIFEST.in000066400000000000000000000000241273104013200221310ustar00rootroot00000000000000include version.ini grr-3.1.0.2/grr/config/grr-response-client/setup.py000066400000000000000000000051611273104013200221140ustar00rootroot00000000000000#!/usr/bin/env python """This is the setup.py file for the GRR client. This is just a meta-package which pulls in the minimal requirements to create a client. This package needs to stay simple so that it can be installed on windows and ancient versions of linux to build clients. """ import ConfigParser import os import platform import shutil from setuptools import setup from setuptools.command.sdist import sdist THIS_DIRECTORY = os.path.dirname(os.path.realpath(__file__)) # If you run setup.py from the root GRR dir you get very different results since # setuptools uses the MANIFEST.in from the root dir. Make sure we are in the # package dir. os.chdir(THIS_DIRECTORY) def get_config(): """Get INI parser with version.ini data.""" ini_path = os.path.join(THIS_DIRECTORY, "version.ini") if not os.path.exists(ini_path): ini_path = os.path.join(THIS_DIRECTORY, "../../../version.ini") if not os.path.exists(ini_path): raise RuntimeError("Couldn't find version.ini") config = ConfigParser.SafeConfigParser() config.read(ini_path) return config VERSION = get_config() class Sdist(sdist): """Build sdist.""" def make_release_tree(self, base_dir, files): sdist.make_release_tree(self, base_dir, files) sdist_version_ini = os.path.join(base_dir, "version.ini") if os.path.exists(sdist_version_ini): os.unlink(sdist_version_ini) shutil.copy( os.path.join(THIS_DIRECTORY, "../../../version.ini"), sdist_version_ini) if "VIRTUAL_ENV" not in os.environ: print "*****************************************************" print " WARNING: You are not installing in a virtual" print " environment. This configuration is not supported!!!" print " Expect breakage." print "*****************************************************" setup_args = dict( name="grr-response-client", version=VERSION.get("Version", "packageversion"), description="The GRR Rapid Response client.", license="Apache License, Version 2.0", url="https://github.com/google/grr", entry_points={ "console_scripts": [ "grr_client = grr.lib.distro_entry:Client", "grr_client_build = grr.lib.distro_entry:ClientBuild", ] }, cmdclass={"sdist": Sdist}, data_files=["version.ini"], # We need pyinstaller 3.2 for centos but it's broken on windows. # https://github.com/google/grr/issues/367 install_requires=[ "grr-response-core==%s" % VERSION.get("Version", "packagedepends"), ] + (["pyinstaller==3.2"] if (platform.linux_distribution()[0] == "CentOS") else [ "pyinstaller==3.1.1" ]),) setup(**setup_args) grr-3.1.0.2/grr/config/grr-response-server/000077500000000000000000000000001273104013200204275ustar00rootroot00000000000000grr-3.1.0.2/grr/config/grr-response-server/MANIFEST.in000066400000000000000000000000241273104013200221610ustar00rootroot00000000000000include version.ini grr-3.1.0.2/grr/config/grr-response-server/setup.py000066400000000000000000000064601273104013200221470ustar00rootroot00000000000000#!/usr/bin/env python """This is the setup.py file for the GRR client. This is just a meta-package which pulls in the minimal requirements to create a full grr server. """ import ConfigParser import os import shutil from setuptools import setup from setuptools.command.sdist import sdist THIS_DIRECTORY = os.path.dirname(os.path.realpath(__file__)) # If you run setup.py from the root GRR dir you get very different results since # setuptools uses the MANIFEST.in from the root dir. Make sure we are in the # package dir. os.chdir(THIS_DIRECTORY) def get_config(): """Get INI parser with version.ini data.""" ini_path = os.path.join(THIS_DIRECTORY, "version.ini") if not os.path.exists(ini_path): ini_path = os.path.join(THIS_DIRECTORY, "../../../version.ini") if not os.path.exists(ini_path): raise RuntimeError("Couldn't find version.ini") config = ConfigParser.SafeConfigParser() config.read(ini_path) return config VERSION = get_config() class Sdist(sdist): """Build sdist.""" def make_release_tree(self, base_dir, files): sdist.make_release_tree(self, base_dir, files) sdist_version_ini = os.path.join(base_dir, "version.ini") if os.path.exists(sdist_version_ini): os.unlink(sdist_version_ini) shutil.copy( os.path.join(THIS_DIRECTORY, "../../../version.ini"), sdist_version_ini) if "VIRTUAL_ENV" not in os.environ: print "*****************************************************" print " WARNING: You are not installing in a virtual" print " environment. This configuration is not supported!!!" print " Expect breakage." print "*****************************************************" setup_args = dict( name="grr-response-server", version=VERSION.get("Version", "packageversion"), description="The GRR Rapid Response Server.", license="Apache License, Version 2.0", url="https://github.com/google/grr", cmdclass={"sdist": Sdist}, entry_points={ "console_scripts": [ "grr_console = grr.lib.distro_entry:Console", "grr_config_updater = grr.lib.distro_entry:ConfigUpdater", "grr_front_end = grr.lib.distro_entry:GrrFrontEnd", "grr_server = grr.lib.distro_entry:GrrServer", "grr_end_to_end_tests = grr.lib.distro_entry:EndToEndTests", "grr_export = grr.lib.distro_entry:Export", "grr_worker = grr.lib.distro_entry:Worker", "grr_admin_ui = grr.lib.distro_entry:AdminUI", "grr_fuse = grr.lib.distro_entry:GRRFuse", "grr_dataserver = grr.lib.distro_entry:DataServer", ] }, install_requires=[ "Django==1.8.3", "google-api-python-client==1.4.2", "grr-response-core==%s" % VERSION.get("Version", "packagedepends"), "grr-response-client==%s" % VERSION.get("Version", "packagedepends"), "oauth2client==1.5.2", "pexpect==4.0.1", "portpicker==1.1.1", "python-crontab==2.0.1", "rekall-core~=1.5.1", "Werkzeug==0.11.3", "wsgiref==0.1.2", ], extras_require={ # This is an optional component. Install to get MySQL data # store support: # pip install grr-response[mysqldatastore] "mysqldatastore": [ "MySQL-python==1.2.5" ], }, data_files=["version.ini"]) setup(**setup_args) grr-3.1.0.2/grr/config/grr-response-templates/000077500000000000000000000000001273104013200211175ustar00rootroot00000000000000grr-3.1.0.2/grr/config/grr-response-templates/.gitignore000066400000000000000000000000271273104013200231060ustar00rootroot00000000000000components/ templates/ grr-3.1.0.2/grr/config/grr-response-templates/MANIFEST.in000066400000000000000000000001311273104013200226500ustar00rootroot00000000000000include version.ini recursive-include components *.bin recursive-include templates *.zip grr-3.1.0.2/grr/config/grr-response-templates/components/000077500000000000000000000000001273104013200233045ustar00rootroot00000000000000grr-3.1.0.2/grr/config/grr-response-templates/components/.gitignore000066400000000000000000000000051273104013200252670ustar00rootroot00000000000000*bin grr-3.1.0.2/grr/config/grr-response-templates/index.html000066400000000000000000000005451273104013200231200ustar00rootroot00000000000000Simple Index grr-response-templates-3.1.0
grr-response-templates-3.1.0post1
grr-3.1.0.2/grr/config/grr-response-templates/setup.py000066400000000000000000000117541273104013200226410ustar00rootroot00000000000000#!/usr/bin/env python """This package contains GRR client templates and components.""" import ConfigParser import glob import os import re import shutil from setuptools import setup from setuptools.command.sdist import sdist THIS_DIRECTORY = os.path.dirname(os.path.realpath(__file__)) # If you run setup.py from the root GRR dir you get very different results since # setuptools uses the MANIFEST.in from the root dir. Make sure we are in the # package dir. os.chdir(THIS_DIRECTORY) def get_config(): """Get INI parser with version.ini data.""" ini_path = os.path.join(THIS_DIRECTORY, "version.ini") if not os.path.exists(ini_path): ini_path = os.path.join(THIS_DIRECTORY, "../../../version.ini") if not os.path.exists(ini_path): raise RuntimeError("Couldn't find version.ini") config = ConfigParser.SafeConfigParser() config.read(ini_path) return config VERSION = get_config() class Sdist(sdist): """Make a sdist release.""" REQUIRED_COMPONENTS = [ r"grr-chipsec-component_.+linux_i686.bin", r"grr-chipsec-component_.+linux_x86_64.bin", r"grr-chipsec-component_.+macosx_.+_x86_64.bin", r"grr-chipsec-component_.+win32.bin", r"grr-chipsec-component_.+win_amd64.bin", r"grr-rekall_.+linux_i686.bin", r"grr-rekall_.+linux_x86_64.bin", r"grr-rekall_.+macosx_.+_x86_64.bin", r"grr-rekall_.+win32.bin", r"grr-rekall_.+win_amd64.bin", ] REQUIRED_TEMPLATES = [ "GRR_maj.minor_amd64.exe.zip", "GRR_maj.minor_i386.exe.zip", "grr_maj.minor_amd64.deb.zip", "grr_maj.minor_amd64.xar.zip", "grr_maj.minor_amd64.rpm.zip", "grr_maj.minor_i386.deb.zip", "grr_maj.minor_i386.rpm.zip", ] def CheckTemplates(self, base_dir, version): """Verify we have at least one template that matches maj.minor version.""" major_minor = ".".join(version.split(".")[0:2]) templates = glob.glob(os.path.join(base_dir, "templates/*%s*.zip" % major_minor)) required_templates = set([x.replace("maj.minor", major_minor) for x in self.REQUIRED_TEMPLATES]) # Client templates have an extra version digit, e.g. 3.1.0.0 templates_present = set([ re.sub(r"_%s[^_]+_" % major_minor, "_%s_" % major_minor, os.path.basename(x)) for x in templates ]) difference = required_templates - templates_present if difference: raise RuntimeError("Missing templates %s" % difference) def CheckComponents(self, base_dir): """Verify we have components for each supported system.""" components = [os.path.basename(x) for x in glob.glob(os.path.join(base_dir, "components/*.bin")) ] missing = set() for requirement in self.REQUIRED_COMPONENTS: for component in components: if re.match(requirement, component): break else: missing.add(requirement) if missing: raise RuntimeError("Missing components: %s" % missing) def run(self): base_dir = os.getcwd() self.CheckTemplates(base_dir, setup_args["version"]) self.CheckComponents(base_dir) sdist.run(self) print "To upload a release, run upload.sh [version]" def make_release_tree(self, base_dir, files): sdist.make_release_tree(self, base_dir, files) sdist_version_ini = os.path.join(base_dir, "version.ini") if os.path.exists(sdist_version_ini): os.unlink(sdist_version_ini) shutil.copy( os.path.join(THIS_DIRECTORY, "../../../version.ini"), sdist_version_ini) def find_data_files(source, prefix=None): result = [] for directory, _, files in os.walk(source): files = [os.path.join(directory, x) for x in files] if prefix: result.append((os.path.join(prefix, directory), files)) else: result.append((directory, files)) return result if "VIRTUAL_ENV" not in os.environ: print "*****************************************************" print " WARNING: You are not installing in a virtual" print " environment. This configuration is not supported!!!" print " Expect breakage." print "*****************************************************" setup_args = dict( name="grr-response-templates", version=VERSION.get("Version", "packageversion"), description="GRR Rapid Response client templates and components.", long_description=("This PyPi package is just a placeholder. The package" " itself is too large to distribute on PyPi so it is " "available from google cloud storage. See" " https://github.com/google/grr-doc/blob/master/" "installfrompip.adoc for installation instructions."), license="Apache License, Version 2.0", url="https://github.com/google/grr", data_files=(find_data_files( "components", prefix="grr-response-templates") + find_data_files( "templates", prefix="grr-response-templates") + ["version.ini"]), cmdclass={ "sdist": Sdist, }) setup(**setup_args) grr-3.1.0.2/grr/config/grr-response-templates/upload.sh000077500000000000000000000017101273104013200227410ustar00rootroot00000000000000#!/bin/bash # Helper script to release client templates. # Upload to the test bucket: # ./upload.sh 3.1.0 grr-releases-testing # Upload a release: # ./upload.sh 3.1.0 set -e VERSION=$1 RELEASE_NAME="grr-response-templates-${VERSION}" RELEASE_TAR="${RELEASE_NAME}.tar.gz" RELEASE_FILE="dist/${RELEASE_TAR}" if [[ $# -eq 1 ]] ; then BUCKET="releases.grr-response.com" else BUCKET=$2 fi md5fingerprint=$(md5sum "${RELEASE_FILE}" | cut -d" " -f1) # Upload tarball, make public gsutil cp "${RELEASE_FILE}" "gs://${BUCKET}/" gsutil acl ch -u AllUsers:R "gs://${BUCKET}/${RELEASE_TAR}" sed -i -e "s!!${RELEASE_NAME}
\n!" index.html gsutil cp index.html "gs://${BUCKET}/" gsutil acl ch -u AllUsers:R "gs://${BUCKET}/index.html" echo "Test install with:" echo "pip install --no-cache-dir -f https://storage.googleapis.com/${BUCKET}/index.html grr-response-templates==${VERSION}" grr-3.1.0.2/grr/config/grr-response-test/000077500000000000000000000000001273104013200201005ustar00rootroot00000000000000grr-3.1.0.2/grr/config/grr-response-test/MANIFEST.in000066400000000000000000000001361273104013200216360ustar00rootroot00000000000000include version.ini recursive-include * * recursive-exclude build * recursive-exclude dist * grr-3.1.0.2/grr/config/grr-response-test/setup.py000066400000000000000000000056041273104013200216170ustar00rootroot00000000000000#!/usr/bin/env python """This is the setup.py file for the GRR response test code. This package contains all the test data and test runners required to be able to run GRR tests. If you want to do any development, you probably want this. """ import ConfigParser import os import shutil from setuptools import setup from setuptools.command.sdist import sdist THIS_DIRECTORY = os.path.dirname(os.path.realpath(__file__)) # If you run setup.py from the root GRR dir you get very different results since # setuptools uses the MANIFEST.in from the root dir. Make sure we are in the # package dir. os.chdir(THIS_DIRECTORY) def get_config(): """Get INI parser with version.ini data.""" ini_path = os.path.join(THIS_DIRECTORY, "version.ini") if not os.path.exists(ini_path): ini_path = os.path.join(THIS_DIRECTORY, "../../../version.ini") if not os.path.exists(ini_path): raise RuntimeError("Couldn't find version.ini") config = ConfigParser.SafeConfigParser() config.read(ini_path) return config VERSION = get_config() class Sdist(sdist): """Build sdist.""" def make_release_tree(self, base_dir, files): sdist.make_release_tree(self, base_dir, files) sdist_version_ini = os.path.join(base_dir, "version.ini") if os.path.exists(sdist_version_ini): os.unlink(sdist_version_ini) shutil.copy( os.path.join(THIS_DIRECTORY, "../../../version.ini"), sdist_version_ini) def find_data_files(source): result = [] for directory, _, files in os.walk(source): files = [os.path.join(directory, x) for x in files] result.append((directory, files)) return result if "VIRTUAL_ENV" not in os.environ: print "*****************************************************" print " WARNING: You are not installing in a virtual" print " environment. This configuration is not supported!!!" print " Expect breakage." print "*****************************************************" setup_args = dict(name="grr-response-test", version=VERSION.get("Version", "packageversion"), description="The GRR Rapid Response test suite.", license="Apache License, Version 2.0", url="https://github.com/google/grr", install_requires=[ "mock==1.3.0", "mox==0.5.3", "selenium==2.50.1", "grr-response-server==%s" % VERSION.get("Version", "packagedepends"), ], cmdclass={"sdist": Sdist}, data_files=(find_data_files("test_data") + ["version.ini"]), entry_points={ "console_scripts": [ "grr_run_tests = grr.tools.run_tests:DistEntry", "grr_run_tests_gui = grr.gui.runtests_test:DistEntry", ] }) setup(**setup_args) grr-3.1.0.2/grr/config/grr-response-test/test_data/000077500000000000000000000000001273104013200220505ustar00rootroot00000000000000grr-3.1.0.2/grr/config/grr-response-test/test_data/History.plist000066400000000000000000000003521273104013200245660ustar00rootroot00000000000000bplist00Ò_WebHistoryDates_WebHistoryFileVersion¢ Ô P[lastVisitedUtitleZvisitCount_http://www.google.com[374606652.9VGoogleÔ _http://www.apple.comUAppleQ1 7:CDPVay…ŒŽ—®´¶¸grr-3.1.0.2/grr/config/grr-response-test/test_data/History.xml.plist000066400000000000000000000013531273104013200253670ustar00rootroot00000000000000 WebHistoryDates http://www.google.com lastVisited 374606652.9 title Google visitCount 2 http://www.apple.com lastVisited 374606652.9 title Apple visitCount 1 WebHistoryFileVersion 1 grr-3.1.0.2/grr/config/grr-response-test/test_data/VFSFixture/000077500000000000000000000000001273104013200240555ustar00rootroot00000000000000grr-3.1.0.2/grr/config/grr-response-test/test_data/VFSFixture/etc/000077500000000000000000000000001273104013200246305ustar00rootroot00000000000000grr-3.1.0.2/grr/config/grr-response-test/test_data/VFSFixture/etc/lsb-release000066400000000000000000000002131273104013200267450ustar00rootroot00000000000000DISTRIB_CODENAME=trusty DISTRIB_DESCRIPTION="Ubuntu 14.04 LTS (upgraded from: Ubuntu 12.04.4 LTS)" DISTRIB_ID=Ubuntu DISTRIB_RELEASE=14.04 grr-3.1.0.2/grr/config/grr-response-test/test_data/VFSFixture/etc/netgroup000066400000000000000000000002221273104013200264120ustar00rootroot00000000000000grrm (-,tyrion,) (-,daenerys,) (-,baelish,) (-,stannis,) simmons (-,shrike,) (-,lhoyt,) (-,martinsilenus,) login (-,yagharek,) (-,isaac,) simmons grr-3.1.0.2/grr/config/grr-response-test/test_data/VFSFixture/etc/passwd000066400000000000000000000005311273104013200260530ustar00rootroot00000000000000gevulot:x:111:122:Gevulot,,,:/home/gevulot:/bin/bash gogol:x:905:65534::/usr/local/home/gogol:/bin/sh user1:x:888:48:User 1:/home/user1:/bin/sh user2:x:889:48:User 2:/home/user2:/bin/sh quiet:x:41:48::/home/quiet:/bin/false exomemory:x:46:47:Never Forget (admin):/var/lib/exomemory:/bin/sh buguser3:x:890:48:Don't find me:/home/buguser3:/bin/sh grr-3.1.0.2/grr/config/grr-response-test/test_data/VFSFixture/etc/ssh/000077500000000000000000000000001273104013200254255ustar00rootroot00000000000000grr-3.1.0.2/grr/config/grr-response-test/test_data/VFSFixture/etc/ssh/sshd_config000066400000000000000000000064301273104013200276410ustar00rootroot00000000000000# $OpenBSD: sshd_config,v 1.73 2005/12/06 22:38:28 reyk Exp $ # This is the sshd server system-wide configuration file. See # sshd_config(5) for more information. # This sshd was compiled with PATH=/usr/local/bin:/bin:/usr/bin # The strategy used for options in the default sshd_config shipped with # OpenSSH is to specify options with their default value where # possible, but leave them commented. Uncommented options change a # default value. #Port 22 Protocol 2,1 #AddressFamily any #ListenAddress 0.0.0.0 #ListenAddress :: # HostKey for protocol version 1 #HostKey /etc/ssh/ssh_host_key # HostKeys for protocol version 2 #HostKey /etc/ssh/ssh_host_rsa_key #HostKey /etc/ssh/ssh_host_dsa_key # Lifetime and size of ephemeral version 1 server key #KeyRegenerationInterval 1h ServerKeyBits 768 # Logging # obsoletes QuietMode and FascistLogging #SyslogFacility AUTH SyslogFacility AUTHPRIV #LogLevel INFO # Authentication: #LoginGraceTime 2m PermitRootLogin yes #StrictModes yes MaxAuthTries 8 RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys # For this to work you will also need host keys in /etc/ssh/ssh_known_hosts #RhostsRSAAuthentication no RhostsRSAAuthentication yes # similar for protocol version 2 #HostbasedAuthentication no # Change to yes if you don't trust ~/.ssh/known_hosts for # RhostsRSAAuthentication and HostbasedAuthentication #IgnoreUserKnownHosts no # Don't read the user's ~/.rhosts and ~/.shosts files #IgnoreRhosts yes # To disable tunneled clear text passwords, change to no here! PasswordAuthentication yes #PermitEmptyPasswords no PasswordAuthentication yes # Change to no to disable s/key passwords #ChallengeResponseAuthentication yes ChallengeResponseAuthentication no # Kerberos options #KerberosAuthentication no #KerberosOrLocalPasswd yes #KerberosTicketCleanup yes #KerberosGetAFSToken no # GSSAPI options #GSSAPIAuthentication no GSSAPIAuthentication yes #GSSAPICleanupCredentials yes GSSAPICleanupCredentials no # Set this to 'yes' to enable PAM authentication, account processing, # and session processing. If this is enabled, PAM authentication will # be allowed through the ChallengeResponseAuthentication mechanism. # Depending on your PAM configuration, this may bypass the setting of # PasswordAuthentication, PermitEmptyPasswords, and # "PermitRootLogin without-password". If you just want the PAM account and # session checks to run without PAM authentication, then enable this but set # ChallengeResponseAuthentication=no #UsePAM no UsePAM yes PermitRootLogin yes # Accept locale-related environment variables AcceptEnv LANG LANGUAGE LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL AllowTcpForwarding yes #GatewayPorts no #X11Forwarding no X11Forwarding yes #X11DisplayOffset 10 #X11UseLocalhost yes #PrintMotd yes #PrintLastLog yes #TCPKeepAlive yes #UseLogin no UsePrivilegeSeparation yes PermitUserEnvironment yes #Compression delayed #ClientAliveInterval 0 #ClientAliveCountMax 3 #ShowPatchLevel no #UseDNS yes #PidFile /var/run/sshd.pid #MaxStartups 10 #PermitTunnel no #ChrootDirectory none # no default banner path #Banner /some/path # override default of no subsystems Subsystem sftp /usr/libexec/openssh/sftp-server grr-3.1.0.2/grr/config/grr-response-test/test_data/VFSFixture/var/000077500000000000000000000000001273104013200246455ustar00rootroot00000000000000grr-3.1.0.2/grr/config/grr-response-test/test_data/VFSFixture/var/log/000077500000000000000000000000001273104013200254265ustar00rootroot00000000000000grr-3.1.0.2/grr/config/grr-response-test/test_data/VFSFixture/var/log/auth.log000066400000000000000000000014021273104013200270670ustar00rootroot00000000000000Jan 26 19:35:30 myhost.log.mydomain.com sshd[1059]: Postponed keyboard-interactive/pam for dearjohn from 10.10.122.1 port 49567 ssh2 [preauth] Jan 26 19:35:30 myhost.log.mydomain.com sshd[1059]: Accepted keyboard-interactive/pam for dearjohn from 10.10.122.1 port 49567 ssh2 Jan 26 19:35:30 myhost.log.mydomain.com sshd[1059]: pam_unix(ssh:session): session opened for user dearjohn by (uid=0) AWS 26 20:01:38 myhost.log.mydomain.com sshd[1059]: pam_unix(ssh:session): session closed for user dearjohn Wrong line format.... should not be here. Dec 24 20:35:30 myhost.log.mydomain.com pam_unix is increasing it's presence in the near future Jan 03 08:35:14 myhost.log.mydomain.com sshd[1059]: pam_unix(ssh:session): session opened for another grateful user in the future grr-3.1.0.2/grr/config/grr-response-test/test_data/VFSFixture/var/log/wtmp000066400000000000000000000030011273104013200263320ustar00rootroot00000000000000q_pts/1ts/1user1123.12.123.123£ÐGMdm¬Ò·s_pts/4ts/4user2123.12.123.123¦ÐGMOô¬Ò·lpts/4ts/4user3123.12.123.123HM(v¬Ò·62~~~runlevel3.2.5-gg1236!¤zR«a grr-3.1.0.2/grr/config/grr-response-test/test_data/a/000077500000000000000000000000001273104013200222705ustar00rootroot00000000000000grr-3.1.0.2/grr/config/grr-response-test/test_data/a/b/000077500000000000000000000000001273104013200225115ustar00rootroot00000000000000grr-3.1.0.2/grr/config/grr-response-test/test_data/a/b/c/000077500000000000000000000000001273104013200227335ustar00rootroot00000000000000grr-3.1.0.2/grr/config/grr-response-test/test_data/a/b/c/helloc.txt000066400000000000000000000000021273104013200247320ustar00rootroot00000000000000a grr-3.1.0.2/grr/config/grr-response-test/test_data/a/b/d/000077500000000000000000000000001273104013200227345ustar00rootroot00000000000000grr-3.1.0.2/grr/config/grr-response-test/test_data/a/b/d/hellod.txt000066400000000000000000000000001273104013200247320ustar00rootroot00000000000000grr-3.1.0.2/grr/config/grr-response-test/test_data/apache_false_log000066400000000000000000000002041273104013200252230ustar00rootroot00000000000000149.2.34.5 - - [08/MMM/2012:06:35:26 +0000] "GET /pub/dists/karmic/InRelease HTTP/1.0" 404 290 "-" "Debian APT-HTTP/1.3 (0.8.15.9)" grr-3.1.0.2/grr/config/grr-response-test/test_data/apache_log000066400000000000000000000026051273104013200240600ustar00rootroot00000000000000149.2.34.5 - - [08/Jan/2012:06:35:26 +0000] "GET /pub/dists/karmic/InRelease HTTP/1.0" 404 290 "-" "Debian APT-HTTP/1.3 (0.8.15.9)" 149.2.34.5 - - [08/Jan/2012:06:35:27 +0000] "GET /pub/dists/karmic/Release HTTP/1.0" 304 - "-" "Debian APT-HTTP/1.3 (0.7.25.3)" 149.2.34.5 - - [08/NoM/2012:06:35:28 +0000] "GET /pub/dists/karmic/Release HTTP/1.0" 304 - "My Referer" "Debian APT-HTTP/1.3 (0.7.25.3)" 149.2.34.5 - - [08/Jan/2012:06:35:28 +0000] "GET /pub/dists/karmic/Release HTTP/1.0" 304 - "-" "Debian APT-HTTP/1.3 (0.7.20.2)" 149.2.34.5 - - [08/Jan/2012:06:35:29 +0000] "GET /pub/dists/karmic/main/binary-i386/Packages.diff/Index HTTP/1.0" 404 317 "-" "Debian APT-HTTP/1.3 (0.7.25.3)" 149.2.34.5 - - [08/Jan/2012:06:35:29 +0000] "GET /pub/dists/karmic/Release.gpg HTTP/1.0" 304 - "-" "Debian APT-HTTP/1.3 (0.8.15.9)" 149.2.34.5 - - [08/Jan/2012:06:35:29 +0000] "GET /pub/dists/karmic/main/binary-i386/Packages.bz2 HTTP/1.0" 404 310 "-" "Debian APT-HTTP/1.3 (0.7.25.3)" 149.2.34.5 - - [08/Jan/2012:06:35:29 +0000] "GET /pub/dists/karmic/main/binary-i386/Packages.lzma HTTP/1.0" 404 311 "-" "Debian APT-HTTP/1.3 (0.7.25.3)" 149.2.34.5 AS - [08/Jan/2012:06:35:29 +0000] "GET /pub/dists/karmic/main/binary-i386/Packages.gz HTTP/ WRONG FILE 304 - FAULTY BAD LOG LINE... 149.2.34.5 - - [08/Jan/2012:06:35:30 +0000] "GET /pub/dists/karmic/main/binary-i386/Packages.gz HTTP/1.0" 304 - "-" "Debian APT-HTTP/1.3 (0.7.20.2)" grr-3.1.0.2/grr/config/grr-response-test/test_data/approvers.yaml000066400000000000000000000003021273104013200247500ustar00rootroot00000000000000label: "legal_approval" users: - "legal1" - "legal2" --- label: "prod_admin_approval" requester_must_be_authorized: True num_approvers_required: 2 users: - "prod1" - "prod2" - "prod3" grr-3.1.0.2/grr/config/grr-response-test/test_data/artifacts/000077500000000000000000000000001273104013200240305ustar00rootroot00000000000000grr-3.1.0.2/grr/config/grr-response-test/test_data/artifacts/test_artifact.json000066400000000000000000000006251273104013200275620ustar00rootroot00000000000000{ "name": "TestDrivers", "sources": [ { "type": "WMI", "attributes": { "query": "SELECT * from Win32_SystemDriver" }, "conditions": [], "returned_types": [] } ], "doc": "Extract the installed drivers on Windows via WMI.", "labels": [ "Software" ], "supported_os": [ "Windows" ], "urls": ["http://www.example.com"], "conditions": [ "os_major_version >= 6" ] } grr-3.1.0.2/grr/config/grr-response-test/test_data/artifacts/test_artifacts.json000066400000000000000000000125161273104013200277470ustar00rootroot00000000000000[ { "name": "TestAggregationArtifact", "sources": [ { "type": "ARTIFACT_GROUP", "attributes": { "names": ["TestOSAgnostic"] }, "returned_types": ["Process"] }, { "type": "ARTIFACT_GROUP", "attributes": { "names": [ "TestCmdArtifact" ] }, "returned_types": [ "SoftwarePackage" ] } ], "doc": "Test artifact aggregation.", "labels": [ "Software" ], "supported_os": [ "Windows" ] }, { "name": "TestAggregationArtifactDeps", "sources": [ { "type": "ARTIFACT_GROUP", "attributes": { "names": [ "TestAggregationArtifact" ] }, "returned_types": [ "Process" ] } ], "doc": "Test artifact aggregation dependencies.", "labels": [ "Software" ], "supported_os": [ "Windows" ] }, { "name": "TestCmdArtifact", "sources": [ { "type": "COMMAND", "attributes": { "cmd": "/usr/bin/dpkg", "args": ["--list"] }, "returned_types": [ "SoftwarePackage" ] } ], "doc": "Test command artifact for dpkg.", "labels": [ "Software" ], "supported_os": [ "Linux" ] }, { "name": "TestOSAgnostic", "sources": [ { "type": "GRR_CLIENT_ACTION", "attributes": { "client_action": {"GetHostname"}} } ], "doc": "Test no OS means all OSes.", "labels": [ "Software" ], "supported_os": [] }, { "name": "TestFilesArtifact", "sources": [ { "type": "FILE", "attributes": { "paths": ["/var/log/auth.log"] } } ], "doc": "Test files artifact.", "labels": ["Logs", "Authentication"], "supported_os": [ "Linux" ] }, { "name": "NullArtifact", "doc": "Null" }, { "name": "FakeArtifact", "doc": "My first artifact.", "labels": [ "Logs", "Authentication" ], "supported_os": [ "Linux" ] }, { "name": "FakeArtifact2", "doc": "My second artifact.", "labels": [ "System"], "supported_os": [ "Linux" ] }, { "name": "BadPathspecArtifact", "sources": [ { "type": "ARTIFACT_FILES", "attributes": { "artifact_list": [ "WindowsPersistenceMechanisms" ], "pathspec_attribute": "broken" }, "returned_types": ["StatEntry"] } ], "doc": "Broken pathspec_attribute.", "labels": [ "Software" ], "supported_os": [ "Windows" ] }, { "name": "DepsParent", "sources": [ { "type": "FILE", "attributes": { "paths": ["/test/%%users.desktop%%"] } } ], "doc": "Test files artifact.", "labels": ["Logs", "Authentication"], "supported_os": [ "Windows" ] }, { "name": "DepsDesktop", "sources": [ { "type": "FILE", "attributes": { "paths": ["/test/%%users.homedir%%"] } } ], "provides": ["users.desktop"], "doc": "Test files artifact.", "labels": ["Logs", "Authentication"], "supported_os": [ "Windows" ] }, { "name": "DepsHomedir", "sources": [ { "type": "FILE", "attributes": { "paths": ["/test/%%environ_windir%%/%%current_control_set%%"] } } ], "provides": ["users.homedir"], "doc": "Test files artifact.", "labels": ["Logs", "Authentication"], "supported_os": [ "Windows" ] }, { "name": "DepsHomedir2", "sources": [ { "type": "FILE", "attributes": { "paths": ["/test/blah"] } } ], "provides": ["users.homedir"], "doc": "Test files artifact.", "labels": ["Logs", "Authentication"], "supported_os": [ "Windows" ] }, { "name": "DepsWindir", "sources": [ { "type": "FILE", "attributes": { "paths": ["/test/%%current_control_set%%"] } } ], "provides": ["environ_windir"], "doc": "Test files artifact.", "labels": ["Logs", "Authentication"], "supported_os": [ "Windows" ] }, { "name": "DepsWindirRegex", "sources": [ { "type": "GREP", "attributes": { "paths": ["/test/%%current_control_set%%"], "content_regex_list": ["%%users.username%%"]} } ], "provides": ["environ_windir"], "doc": "Test content_regex_list interpolation", "labels": ["Logs", "Authentication"], "supported_os": [ "Windows" ] }, { "name": "DepsControlSet", "sources": [ { "type": "FILE", "attributes": { "paths": ["/test/controlset"] } } ], "provides": ["current_control_set"], "doc": "Test files artifact.", "labels": ["Logs", "Authentication"], "supported_os": [ "Windows" ] }, { "name": "DepsProvidesMultiple", "sources": [ { "type": "REGISTRY_VALUE", "attributes": { "key_value_pairs": [{"key": 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion', "value": 'SystemRoot'}]} } ], "provides": ["environ_path", "environ_temp"], "doc": "Test multiple provide values.", "labels": ["Logs", "Authentication"], "supported_os": [ "Windows" ] }, { "name": "WMIActiveScriptEventConsumer", "doc": "List all ActiveScript Event Consumers.", "sources": [ { "type": "WMI", "attributes": { "base_object": "winmgmts:\\root\\subscription", "query": "SELECT * FROM ActiveScriptEventConsumer" } } ], "labels": [ "Software" ], "supported_os": [ "Windows" ], "urls": [ "https://msdn.microsoft.com/en-us/library/aa384749%28v=vs.85%29.aspx" ], } ] grr-3.1.0.2/grr/config/grr-response-test/test_data/bigquery/000077500000000000000000000000001273104013200236775ustar00rootroot00000000000000grr-3.1.0.2/grr/config/grr-response-test/test_data/bigquery/ExportedFile.json000066400000000000000000000262611273104013200271730ustar00rootroot00000000000000{"st_ctime": "2012-05-04 11:11:32", "basename": "", "st_ino": "1063090", "hash_sha1": "", "hash_md5": "", "st_mtime": "2012-05-04 11:11:32", "content": "", "cert_program_name": "", "st_size": "0", "cert_program_url": "", "st_atime": "2012-05-08 09:26:17", "metadata": {"usernames": "", "client_urn": "aff4:/C.1000000000000000", "os_version": "", "timestamp": "2015-10-28 01:31:13", "hostname": "Host-0", "deprecated_session_id": "None", "source_urn": "aff4:/C.1000000000000000/Results", "labels": "", "uname": "", "original_timestamp": "1970-01-01 00:00:00", "client_age": "1970-01-01 00:00:00", "os_release": "", "mac_address": "aabbccddee00\nbbccddeeff00", "os": "", "annotations": ""}, "st_rdev": "0", "st_blocks": "0", "st_nlink": "1", "st_gid": "5000", "st_dev": "64512", "cert_certificates": "", "symlink": "", "pecoff_hash_md5": "", "st_mode": "-rw-r-----", "pecoff_hash_sha1": "", "cert_chain_head_issuer": "", "urn": "aff4:/C.1000000000000000/fs/os/foo/bar/0", "cert_countersignature_chain_head_issuer": "", "content_sha256": "", "st_blksize": "0", "cert_hasher_name": "", "st_uid": "139592", "hash_sha256": "", "cert_signing_id": ""} {"st_ctime": "2012-05-04 11:11:32", "basename": "", "st_ino": "1063090", "hash_sha1": "", "hash_md5": "", "st_mtime": "2012-05-04 11:11:32", "content": "", "cert_program_name": "", "st_size": "0", "cert_program_url": "", "st_atime": "2012-05-08 09:26:17", "metadata": {"usernames": "", "client_urn": "aff4:/C.1000000000000000", "os_version": "", "timestamp": "2015-10-28 01:31:13", "hostname": "Host-0", "deprecated_session_id": "None", "source_urn": "aff4:/C.1000000000000000/Results", "labels": "", "uname": "", "original_timestamp": "1970-01-01 00:00:00", "client_age": "1970-01-01 00:00:00", "os_release": "", "mac_address": "aabbccddee00\nbbccddeeff00", "os": "", "annotations": ""}, "st_rdev": "0", "st_blocks": "0", "st_nlink": "2", "st_gid": "5000", "st_dev": "64512", "cert_certificates": "", "symlink": "", "pecoff_hash_md5": "", "st_mode": "-rw-r-----", "pecoff_hash_sha1": "", "cert_chain_head_issuer": "", "urn": "aff4:/C.1000000000000000/fs/os/foo/bar/1", "cert_countersignature_chain_head_issuer": "", "content_sha256": "", "st_blksize": "0", "cert_hasher_name": "", "st_uid": "139592", "hash_sha256": "", "cert_signing_id": ""} {"st_ctime": "2012-05-04 11:11:32", "basename": "", "st_ino": "1063090", "hash_sha1": "", "hash_md5": "", "st_mtime": "2012-05-04 11:11:32", "content": "", "cert_program_name": "", "st_size": "0", "cert_program_url": "", "st_atime": "2012-05-08 09:26:17", "metadata": {"usernames": "", "client_urn": "aff4:/C.1000000000000000", "os_version": "", "timestamp": "2015-10-28 01:31:13", "hostname": "Host-0", "deprecated_session_id": "None", "source_urn": "aff4:/C.1000000000000000/Results", "labels": "", "uname": "", "original_timestamp": "1970-01-01 00:00:00", "client_age": "1970-01-01 00:00:00", "os_release": "", "mac_address": "aabbccddee00\nbbccddeeff00", "os": "", "annotations": ""}, "st_rdev": "0", "st_blocks": "0", "st_nlink": "3", "st_gid": "5000", "st_dev": "64512", "cert_certificates": "", "symlink": "", "pecoff_hash_md5": "", "st_mode": "-rw-r-----", "pecoff_hash_sha1": "", "cert_chain_head_issuer": "", "urn": "aff4:/C.1000000000000000/fs/os/foo/bar/2", "cert_countersignature_chain_head_issuer": "", "content_sha256": "", "st_blksize": "0", "cert_hasher_name": "", "st_uid": "139592", "hash_sha256": "", "cert_signing_id": ""} {"st_ctime": "2012-05-04 11:11:32", "basename": "", "st_ino": "1063090", "hash_sha1": "", "hash_md5": "", "st_mtime": "2012-05-04 11:11:32", "content": "", "cert_program_name": "", "st_size": "0", "cert_program_url": "", "st_atime": "2012-05-08 09:26:17", "metadata": {"usernames": "", "client_urn": "aff4:/C.1000000000000000", "os_version": "", "timestamp": "2015-10-28 01:31:13", "hostname": "Host-0", "deprecated_session_id": "None", "source_urn": "aff4:/C.1000000000000000/Results", "labels": "", "uname": "", "original_timestamp": "1970-01-01 00:00:00", "client_age": "1970-01-01 00:00:00", "os_release": "", "mac_address": "aabbccddee00\nbbccddeeff00", "os": "", "annotations": ""}, "st_rdev": "0", "st_blocks": "0", "st_nlink": "4", "st_gid": "5000", "st_dev": "64512", "cert_certificates": "", "symlink": "", "pecoff_hash_md5": "", "st_mode": "-rw-r-----", "pecoff_hash_sha1": "", "cert_chain_head_issuer": "", "urn": "aff4:/C.1000000000000000/fs/os/foo/bar/3", "cert_countersignature_chain_head_issuer": "", "content_sha256": "", "st_blksize": "0", "cert_hasher_name": "", "st_uid": "139592", "hash_sha256": "", "cert_signing_id": ""} {"st_ctime": "2012-05-04 11:11:32", "basename": "", "st_ino": "1063090", "hash_sha1": "", "hash_md5": "", "st_mtime": "2012-05-04 11:11:32", "content": "", "cert_program_name": "", "st_size": "0", "cert_program_url": "", "st_atime": "2012-05-08 09:26:17", "metadata": {"usernames": "", "client_urn": "aff4:/C.1000000000000000", "os_version": "", "timestamp": "2015-10-28 01:31:13", "hostname": "Host-0", "deprecated_session_id": "None", "source_urn": "aff4:/C.1000000000000000/Results", "labels": "", "uname": "", "original_timestamp": "1970-01-01 00:00:00", "client_age": "1970-01-01 00:00:00", "os_release": "", "mac_address": "aabbccddee00\nbbccddeeff00", "os": "", "annotations": ""}, "st_rdev": "0", "st_blocks": "0", "st_nlink": "5", "st_gid": "5000", "st_dev": "64512", "cert_certificates": "", "symlink": "", "pecoff_hash_md5": "", "st_mode": "-rw-r-----", "pecoff_hash_sha1": "", "cert_chain_head_issuer": "", "urn": "aff4:/C.1000000000000000/fs/os/foo/bar/4", "cert_countersignature_chain_head_issuer": "", "content_sha256": "", "st_blksize": "0", "cert_hasher_name": "", "st_uid": "139592", "hash_sha256": "", "cert_signing_id": ""} {"st_ctime": "2012-05-04 11:11:32", "basename": "", "st_ino": "1063090", "hash_sha1": "", "hash_md5": "", "st_mtime": "2012-05-04 11:11:32", "content": "", "cert_program_name": "", "st_size": "0", "cert_program_url": "", "st_atime": "2012-05-08 09:26:17", "metadata": {"usernames": "", "client_urn": "aff4:/C.1000000000000000", "os_version": "", "timestamp": "2015-10-28 01:31:13", "hostname": "Host-0", "deprecated_session_id": "None", "source_urn": "aff4:/C.1000000000000000/Results", "labels": "", "uname": "", "original_timestamp": "1970-01-01 00:00:00", "client_age": "1970-01-01 00:00:00", "os_release": "", "mac_address": "aabbccddee00\nbbccddeeff00", "os": "", "annotations": ""}, "st_rdev": "0", "st_blocks": "0", "st_nlink": "6", "st_gid": "5000", "st_dev": "64512", "cert_certificates": "", "symlink": "", "pecoff_hash_md5": "", "st_mode": "-rw-r-----", "pecoff_hash_sha1": "", "cert_chain_head_issuer": "", "urn": "aff4:/C.1000000000000000/fs/os/foo/bar/5", "cert_countersignature_chain_head_issuer": "", "content_sha256": "", "st_blksize": "0", "cert_hasher_name": "", "st_uid": "139592", "hash_sha256": "", "cert_signing_id": ""} {"st_ctime": "2012-05-04 11:11:32", "basename": "", "st_ino": "1063090", "hash_sha1": "", "hash_md5": "", "st_mtime": "2012-05-04 11:11:32", "content": "", "cert_program_name": "", "st_size": "0", "cert_program_url": "", "st_atime": "2012-05-08 09:26:17", "metadata": {"usernames": "", "client_urn": "aff4:/C.1000000000000000", "os_version": "", "timestamp": "2015-10-28 01:31:13", "hostname": "Host-0", "deprecated_session_id": "None", "source_urn": "aff4:/C.1000000000000000/Results", "labels": "", "uname": "", "original_timestamp": "1970-01-01 00:00:00", "client_age": "1970-01-01 00:00:00", "os_release": "", "mac_address": "aabbccddee00\nbbccddeeff00", "os": "", "annotations": ""}, "st_rdev": "0", "st_blocks": "0", "st_nlink": "7", "st_gid": "5000", "st_dev": "64512", "cert_certificates": "", "symlink": "", "pecoff_hash_md5": "", "st_mode": "-rw-r-----", "pecoff_hash_sha1": "", "cert_chain_head_issuer": "", "urn": "aff4:/C.1000000000000000/fs/os/foo/bar/6", "cert_countersignature_chain_head_issuer": "", "content_sha256": "", "st_blksize": "0", "cert_hasher_name": "", "st_uid": "139592", "hash_sha256": "", "cert_signing_id": ""} {"st_ctime": "2012-05-04 11:11:32", "basename": "", "st_ino": "1063090", "hash_sha1": "", "hash_md5": "", "st_mtime": "2012-05-04 11:11:32", "content": "", "cert_program_name": "", "st_size": "0", "cert_program_url": "", "st_atime": "2012-05-08 09:26:17", "metadata": {"usernames": "", "client_urn": "aff4:/C.1000000000000000", "os_version": "", "timestamp": "2015-10-28 01:31:13", "hostname": "Host-0", "deprecated_session_id": "None", "source_urn": "aff4:/C.1000000000000000/Results", "labels": "", "uname": "", "original_timestamp": "1970-01-01 00:00:00", "client_age": "1970-01-01 00:00:00", "os_release": "", "mac_address": "aabbccddee00\nbbccddeeff00", "os": "", "annotations": ""}, "st_rdev": "0", "st_blocks": "0", "st_nlink": "8", "st_gid": "5000", "st_dev": "64512", "cert_certificates": "", "symlink": "", "pecoff_hash_md5": "", "st_mode": "-rw-r-----", "pecoff_hash_sha1": "", "cert_chain_head_issuer": "", "urn": "aff4:/C.1000000000000000/fs/os/foo/bar/7", "cert_countersignature_chain_head_issuer": "", "content_sha256": "", "st_blksize": "0", "cert_hasher_name": "", "st_uid": "139592", "hash_sha256": "", "cert_signing_id": ""} {"st_ctime": "2012-05-04 11:11:32", "basename": "", "st_ino": "1063090", "hash_sha1": "", "hash_md5": "", "st_mtime": "2012-05-04 11:11:32", "content": "", "cert_program_name": "", "st_size": "0", "cert_program_url": "", "st_atime": "2012-05-08 09:26:17", "metadata": {"usernames": "", "client_urn": "aff4:/C.1000000000000000", "os_version": "", "timestamp": "2015-10-28 01:31:13", "hostname": "Host-0", "deprecated_session_id": "None", "source_urn": "aff4:/C.1000000000000000/Results", "labels": "", "uname": "", "original_timestamp": "1970-01-01 00:00:00", "client_age": "1970-01-01 00:00:00", "os_release": "", "mac_address": "aabbccddee00\nbbccddeeff00", "os": "", "annotations": ""}, "st_rdev": "0", "st_blocks": "0", "st_nlink": "9", "st_gid": "5000", "st_dev": "64512", "cert_certificates": "", "symlink": "", "pecoff_hash_md5": "", "st_mode": "-rw-r-----", "pecoff_hash_sha1": "", "cert_chain_head_issuer": "", "urn": "aff4:/C.1000000000000000/fs/os/foo/bar/8", "cert_countersignature_chain_head_issuer": "", "content_sha256": "", "st_blksize": "0", "cert_hasher_name": "", "st_uid": "139592", "hash_sha256": "", "cert_signing_id": ""} {"st_ctime": "2012-05-04 11:11:32", "basename": "", "st_ino": "1063090", "hash_sha1": "", "hash_md5": "", "st_mtime": "2012-05-04 11:11:32", "content": "", "cert_program_name": "", "st_size": "0", "cert_program_url": "", "st_atime": "2012-05-08 09:26:17", "metadata": {"usernames": "", "client_urn": "aff4:/C.1000000000000000", "os_version": "", "timestamp": "2015-10-28 01:31:13", "hostname": "Host-0", "deprecated_session_id": "None", "source_urn": "aff4:/C.1000000000000000/Results", "labels": "", "uname": "", "original_timestamp": "1970-01-01 00:00:00", "client_age": "1970-01-01 00:00:00", "os_release": "", "mac_address": "aabbccddee00\nbbccddeeff00", "os": "", "annotations": ""}, "st_rdev": "0", "st_blocks": "0", "st_nlink": "10", "st_gid": "5000", "st_dev": "64512", "cert_certificates": "", "symlink": "", "pecoff_hash_md5": "", "st_mode": "-rw-r-----", "pecoff_hash_sha1": "", "cert_chain_head_issuer": "", "urn": "aff4:/C.1000000000000000/fs/os/foo/bar/9", "cert_countersignature_chain_head_issuer": "", "content_sha256": "", "st_blksize": "0", "cert_hasher_name": "", "st_uid": "139592", "hash_sha256": "", "cert_signing_id": ""} grr-3.1.0.2/grr/config/grr-response-test/test_data/bigquery/ExportedFile.json.gz000066400000000000000000000012121273104013200275770ustar00rootroot00000000000000‹^g1VExportedFile.jsoní”K›0€ïýçRl$pí¥§z®„ ‰°#ÛlÕFûßkó*›m›cé2!<š÷x¾›§M^Þ‚—í¼ÐÐ'±Oö;J3ûF¡÷~çLƒ`ƒŠ;[.¤;Q’D$%Nxfúœë3£“V/h«xaÕ>TJa@˜É¢eò«’'ÅÚü.ÍôGòJ±SÍB½ yÜ‘4 “ŒœJ †UÌ0«ró: ÊÅÑs ·ùX—ÂIX]ï³àãJ^>NSêü ”æRL¶.°6¬½ŽÑcŸ?´Ñmµ¶æ¨ï‘Ôf*ì“ý÷{_\”Ì@•kÐÎgÎ+§òY èë’*áQZÁÐ]c´³hXÍ\V·l¦TüÄkò Óô@|Bí»#$ëßECØ þ¢d{¡ {k¦-+sVUÊVÓgÌŠ¢,« €¯bú¯ëÉ|2cBHc'(Å zfª*xšgoÏE#Ë‹^JDÃÅ¥Ïpœ†Æã´¬dô‘ìcÎwÈ}xÍ]ïç$ô÷vòæŽW(e]翻ݲê öÕ7_ùî¹×_®Çï̸ÈÏÀªœkÝš'ô`´µ¤j)ƒ‚©à×”²³+dïáI0Ó)øs„q×\Naœ,Ê(šËëår郺_Ânè*Ò8 —XxìÍ]>\œÆkì=¿»!w;o˜;á&¸C‘;ÈäΊ¸m‚;‹;ÈäÎ?çÎ~܉;ÈäΊ¸o‚;{är¹³"î$›àNŒÜAî wVÄÃ&¸“ w;Èqç¸ î;ÈäΊ¸“n‚;Gär¹³"îÐIò¶Á“þwàù Ló#±,grr-3.1.0.2/grr/config/grr-response-test/test_data/bigquery/ExportedFile.schema000066400000000000000000000072061273104013200274600ustar00rootroot00000000000000[{"fields": [{"type": "STRING", "name": "client_urn", "description": "Client ID of a client that contains this entry."}, {"type": "STRING", "name": "hostname", "description": "Client hostname."}, {"type": "STRING", "name": "os", "description": "Client Operating System class (Windows|Darwin|Linux)."}, {"type": "TIMESTAMP", "name": "client_age", "description": "Age of the client."}, {"type": "STRING", "name": "uname", "description": "Uname string."}, {"type": "STRING", "name": "os_release", "description": "The OS release identifier e.g. 7, OSX, debian."}, {"type": "STRING", "name": "os_version", "description": "The OS version ID e.g. 6.1.7601SP1, 10.9.2, 14.04."}, {"type": "STRING", "name": "usernames", "description": "Username."}, {"type": "STRING", "name": "mac_address", "description": "MAC address."}, {"type": "TIMESTAMP", "name": "timestamp", "description": "When data was exported."}, {"type": "TIMESTAMP", "name": "original_timestamp", "description": "When original data was generated."}, {"type": "STRING", "name": "deprecated_session_id", "description": "Deprecated session id of a hunt that collected the data."}, {"type": "STRING", "name": "labels", "description": "CSV list of client labels."}, {"type": "STRING", "name": "source_urn", "description": "URN of a source of exported data."}, {"type": "STRING", "name": "annotations", "description": "CSV list of annotations for this data. This field can be used to differentiate sets of exported data inside a particular exported type. e.g. data collected by users vs. data collected by cronjob."}], "type": "RECORD", "name": "metadata", "description": ""}, {"type": "STRING", "name": "urn", "description": "The location of this file in the AFF4 space."}, {"type": "STRING", "name": "basename", "description": "Basename of the file."}, {"type": "STRING", "name": "st_mode", "description": "A unix file permission mode."}, {"type": "INTEGER", "name": "st_ino", "description": ""}, {"type": "INTEGER", "name": "st_dev", "description": ""}, {"type": "INTEGER", "name": "st_nlink", "description": ""}, {"type": "INTEGER", "name": "st_uid", "description": ""}, {"type": "INTEGER", "name": "st_gid", "description": ""}, {"type": "INTEGER", "name": "st_size", "description": ""}, {"type": "TIMESTAMP", "name": "st_atime", "description": "Last access time."}, {"type": "TIMESTAMP", "name": "st_mtime", "description": "Last modified time."}, {"type": "TIMESTAMP", "name": "st_ctime", "description": "Last inode change time."}, {"type": "INTEGER", "name": "st_blocks", "description": ""}, {"type": "INTEGER", "name": "st_blksize", "description": ""}, {"type": "INTEGER", "name": "st_rdev", "description": ""}, {"type": "STRING", "name": "symlink", "description": ""}, {"type": "STRING", "name": "content", "description": "Actual content of the file if available."}, {"type": "STRING", "name": "content_sha256", "description": "SHA256 of content"}, {"type": "STRING", "name": "hash_md5", "description": ""}, {"type": "STRING", "name": "hash_sha1", "description": ""}, {"type": "STRING", "name": "hash_sha256", "description": ""}, {"type": "STRING", "name": "pecoff_hash_md5", "description": ""}, {"type": "STRING", "name": "pecoff_hash_sha1", "description": ""}, {"type": "STRING", "name": "cert_hasher_name", "description": ""}, {"type": "STRING", "name": "cert_program_name", "description": ""}, {"type": "STRING", "name": "cert_program_url", "description": ""}, {"type": "STRING", "name": "cert_signing_id", "description": ""}, {"type": "STRING", "name": "cert_chain_head_issuer", "description": ""}, {"type": "STRING", "name": "cert_countersignature_chain_head_issuer", "description": ""}, {"type": "STRING", "name": "cert_certificates", "description": ""}]grr-3.1.0.2/grr/config/grr-response-test/test_data/blank.yaml000066400000000000000000000000001273104013200240110ustar00rootroot00000000000000grr-3.1.0.2/grr/config/grr-response-test/test_data/checks/000077500000000000000000000000001273104013200233105ustar00rootroot00000000000000grr-3.1.0.2/grr/config/grr-response-test/test_data/checks/data/000077500000000000000000000000001273104013200242215ustar00rootroot00000000000000grr-3.1.0.2/grr/config/grr-response-test/test_data/checks/data/dpkg.out000066400000000000000000000520671273104013200257110ustar00rootroot00000000000000Desired=Unknown/Install/Remove/Purge/Hold | Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend |/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad) ||/ Name Version Architecture Description +++-===============================-=========================-============-======================================================================== ii acpi-support-base 0.140-5 all scripts for handling base ACPI events such as the power button ii acpid 1:2.0.16-1+deb7u1 amd64 Advanced Configuration and Power Interface event daemon ii adduser 3.113+nmu3 all add and remove users and groups ii apt 0.9.7.9 amd64 commandline package manager ii apt-utils 0.9.7.9 amd64 package managment related utility programs ii aptitude 0.6.8.2-1 amd64 terminal-based package manager ii aptitude-common 0.6.8.2-1 all architecture indepedent files for the aptitude package manager ii base-files 7.1wheezy1 amd64 Debian base system miscellaneous files ii base-passwd 3.5.26 amd64 Debian base system master password and group files ii bash 4.2+dfsg-0.1 amd64 GNU Bourne Again SHell ii bsdmainutils 9.0.3 amd64 collection of more utilities from FreeBSD ii bsdutils 1:2.20.1-5.3 amd64 Basic utilities from 4.4BSD-Lite ii ca-certificates 20130119 all Common CA certificates ii coreutils 8.13-3.5 amd64 GNU core utilities ii cpio 2.11+dfsg-0.1 amd64 GNU cpio -- a program to manage archives of files ii cron 3.0pl1-124 amd64 process scheduling daemon ii curl 7.26.0-1+wheezy2 amd64 command line tool for transferring data with URL syntax ii dash 0.5.7-3 amd64 POSIX-compliant shell ii debconf 1.5.49 all Debian configuration management system ii debconf-i18n 1.5.49 all full internationalization support for debconf ii debian-archive-keyring 2012.4 all GnuPG archive keys of the Debian archive ii debianutils 4.3.2 amd64 Miscellaneous utilities specific to Debian ii diffutils 1:3.2-6 amd64 File comparison utilities ii dmidecode 2.11-9 amd64 SMBIOS/DMI table decoder ii dmsetup 2:1.02.74-7 amd64 Linux Kernel Device Mapper userspace library ii dpkg 1.16.10 amd64 Debian package management system ii e2fslibs:amd64 1.42.5-1.1 amd64 ext2/ext3/ext4 file system libraries ii e2fsprogs 1.42.5-1.1 amd64 ext2/ext3/ext4 file system utilities ii file 5.11-2 amd64 Determines file type using "magic" numbers ii findutils 4.4.2-4 amd64 utilities for finding files--find, xargs ii gcc-4.7-base:amd64 4.7.2-5 amd64 GCC, the GNU Compiler Collection (base package) ii gnupg 1.4.12-7 amd64 GNU privacy guard - a free PGP replacement ii google-compute-daemon 1.0.3-1 all Google Compute Engine Management Daemon ii google-startup-scripts 1.0-1 all Google Compute Engine Startup Scripts ii gpgv 1.4.12-7 amd64 GNU privacy guard - signature verification tool ii grep 2.12-2 amd64 GNU grep, egrep and fgrep ii groff-base 1.21-9 amd64 GNU troff text-formatting system (base system components) ii gzip 1.5-1.1 amd64 GNU compression utilities ii hostname 3.11 amd64 utility to set/show the host name or domain name ii ifupdown 0.7.8 amd64 high level tools to configure network interfaces ii image-bundle 1.0.3-1 all Google Compute Engine Image Bundler ii info 4.13a.dfsg.1-10 amd64 Standalone GNU Info documentation browser ii initscripts 2.88dsf-41 amd64 scripts for initializing and shutting down the system ii insserv 1.14.0-5 amd64 boot sequence organizer using LSB init.d script dependency information ii install-info 4.13a.dfsg.1-10 amd64 Manage installed documentation in info format ii iproute 20120521-3+b3 amd64 networking and traffic control tools ii iptables 1.4.14-3.1 amd64 administration tools for packet filtering and NAT ii iputils-ping 3:20101006-1+b1 amd64 Tools to test the reachability of network hosts ii isc-dhcp-client 4.2.2.dfsg.1-5+deb70u6 amd64 ISC DHCP client ii isc-dhcp-common 4.2.2.dfsg.1-5+deb70u6 amd64 common files used by all the isc-dhcp* packages ii kmod 9-3 amd64 tools for managing Linux kernel modules ii kpartx 0.4.9+git0.4dfdaf2b-6 amd64 create device mappings for partitions ii libacl1:amd64 2.2.51-8 amd64 Access control list shared library ii libapt-inst1.5:amd64 0.9.7.9 amd64 deb package format runtime library ii libapt-pkg4.12:amd64 0.9.7.9 amd64 package managment runtime library ii libattr1:amd64 1:2.4.46-8 amd64 Extended attribute shared library ii libblkid1:amd64 2.20.1-5.3 amd64 block device id library ii libboost-iostreams1.49.0 1.49.0-3.2 amd64 Boost.Iostreams Library ii libbsd0:amd64 0.4.2-1 amd64 utility functions from BSD systems - shared library ii libbz2-1.0:amd64 1.0.6-4 amd64 high-quality block-sorting file compressor library - runtime ii libc-bin 2.13-38 amd64 Embedded GNU C Library: Binaries ii libc6:amd64 2.13-38 amd64 Embedded GNU C Library: Shared libraries ii libcap2:amd64 1:2.22-1.2 amd64 support for getting/setting POSIX.1e capabilities ii libcomerr2:amd64 1.42.5-1.1 amd64 common error description library ii libcurl3:amd64 7.26.0-1+wheezy2 amd64 easy-to-use client-side URL transfer library (OpenSSL flavour) ii libcwidget3 0.5.16-3.4 amd64 high-level terminal interface library for C++ (runtime files) ii libdb5.1:amd64 5.1.29-5 amd64 Berkeley v5.1 Database Libraries [runtime] ii libdevmapper1.02.1:amd64 2:1.02.74-7 amd64 Linux Kernel Device Mapper userspace library ii libedit2:amd64 2.11-20080614-5 amd64 BSD editline and history libraries ii libept1.4.12 1.0.9 amd64 High-level library for managing Debian package information ii libexpat1:amd64 2.1.0-1 amd64 XML parsing C library - runtime library ii libgcc1:amd64 1:4.7.2-5 amd64 GCC support library ii libgcrypt11:amd64 1.5.0-5 amd64 LGPL Crypto library - runtime library ii libgdbm3:amd64 1.8.3-11 amd64 GNU dbm database routines (runtime version) ii libgnutls26:amd64 2.12.20-7 amd64 GNU TLS library - runtime library ii libgpg-error0:amd64 1.10-3.1 amd64 library for common error values and messages in GnuPG components ii libgssapi-krb5-2:amd64 1.10.1+dfsg-5+deb7u1 amd64 MIT Kerberos runtime libraries - krb5 GSS-API Mechanism ii libidn11:amd64 1.25-2 amd64 GNU Libidn library, implementation of IETF IDN specifications ii libk5crypto3:amd64 1.10.1+dfsg-5+deb7u1 amd64 MIT Kerberos runtime libraries - Crypto Library ii libkeyutils1:amd64 1.5.5-3 amd64 Linux Key Management Utilities (library) ii libkmod2:amd64 9-3 amd64 libkmod shared library ii libkrb5-3:amd64 1.10.1+dfsg-5+deb7u1 amd64 MIT Kerberos runtime libraries ii libkrb5support0:amd64 1.10.1+dfsg-5+deb7u1 amd64 MIT Kerberos runtime libraries - Support library ii libldap-2.4-2:amd64 2.4.31-1+nmu2 amd64 OpenLDAP libraries ii liblocale-gettext-perl 1.05-7+b1 amd64 module using libc functions for internationalization in Perl ii liblzma5:amd64 5.1.1alpha+20120614-2 amd64 XZ-format compression library ii libmagic1:amd64 5.11-2 amd64 File type determination library using "magic" numbers ii libmount1 2.20.1-5.3 amd64 block device id library ii libncurses5:amd64 5.9-10 amd64 shared libraries for terminal handling ii libncursesw5:amd64 5.9-10 amd64 shared libraries for terminal handling (wide character support) ii libnewt0.52 0.52.14-11.1 amd64 Not Erik's Windowing Toolkit - text mode windowing with slang ii libnfnetlink0 1.0.0-1.1 amd64 Netfilter netlink library ii libopts25 1:5.12-0.1 amd64 automated option processing library based on autogen ii libp11-kit0:amd64 0.12-3 amd64 Library for loading and coordinating access to PKCS#11 modules - runtime ii libpam-modules:amd64 1.1.3-7.1 amd64 Pluggable Authentication Modules for PAM ii libpam-modules-bin 1.1.3-7.1 amd64 Pluggable Authentication Modules for PAM - helper binaries ii libpam-runtime 1.1.3-7.1 all Runtime support for the PAM library ii libpam0g:amd64 1.1.3-7.1 amd64 Pluggable Authentication Modules library ii libparted0debian1:amd64 2.3-12 amd64 disk partition manipulator - shared library ii libpipeline1:amd64 1.2.1-1 amd64 pipeline manipulation library ii libpopt0:amd64 1.16-7 amd64 lib for parsing cmdline parameters ii libprocps0:amd64 1:3.3.3-3 amd64 library for accessing process information from /proc ii libreadline6:amd64 6.2+dfsg-0.1 amd64 GNU readline and history libraries, run-time libraries ii librtmp0:amd64 2.4+20111222.git4e06e21-1 amd64 toolkit for RTMP streams (shared library) ii libsasl2-2:amd64 2.1.25.dfsg1-6+deb7u1 amd64 Cyrus SASL - authentication abstraction library ii libsasl2-modules:amd64 2.1.25.dfsg1-6+deb7u1 amd64 Cyrus SASL - pluggable authentication modules ii libselinux1:amd64 2.1.9-5 amd64 SELinux runtime shared libraries ii libsemanage-common 2.1.6-6 all Common files for SELinux policy management libraries ii libsemanage1:amd64 2.1.6-6 amd64 SELinux policy management library ii libsepol1:amd64 2.1.4-3 amd64 SELinux library for manipulating binary security policies ii libsigc++-2.0-0c2a:amd64 2.2.10-0.2 amd64 type-safe Signal Framework for C++ - runtime ii libslang2:amd64 2.2.4-15 amd64 S-Lang programming library - runtime version ii libsqlite3-0:amd64 3.7.13-1+deb7u1 amd64 SQLite 3 shared library ii libss2:amd64 1.42.5-1.1 amd64 command-line interface parsing library ii libssh2-1:amd64 1.4.2-1.1 amd64 SSH2 client-side library ii libssl1.0.0:amd64 1.0.1e-2 amd64 SSL shared libraries ii libstdc++6:amd64 4.7.2-5 amd64 GNU Standard C++ Library v3 ii libtasn1-3:amd64 2.13-2 amd64 Manage ASN.1 structures (runtime) ii libtext-charwidth-perl 0.04-7+b1 amd64 get display widths of characters on the terminal ii libtext-iconv-perl 1.7-5 amd64 converts between character sets in Perl ii libtext-wrapi18n-perl 0.06-7 all internationalized substitute of Text::Wrap ii libtinfo5:amd64 5.9-10 amd64 shared low-level terminfo library for terminal handling ii libudev0:amd64 175-7.2 amd64 libudev shared library ii libusb-0.1-4:amd64 2:0.1.12-20+nmu1 amd64 userspace USB programming library ii libustr-1.0-1:amd64 1.0.4-3 amd64 Micro string library: shared library ii libuuid1:amd64 2.20.1-5.3 amd64 Universally Unique ID library ii libwrap0:amd64 7.6.q-24 amd64 Wietse Venema's TCP wrappers library ii libxapian22 1.2.12-2 amd64 Search engine library ii locales 2.13-38 all Embedded GNU C Library: National Language (locale) data [support] ii login 1:4.1.5.1-1 amd64 system login tools ii logrotate 3.8.1-4 amd64 Log rotation utility ii lsb-base 4.1+Debian8+deb7u1 all Linux Standard Base 4.1 init script functionality ii lsb-release 4.1+Debian8+deb7u1 all Linux Standard Base version reporting utility ii man-db 2.6.2-1 amd64 on-line manual pager ii manpages 3.44-1 all Manual pages about using a GNU/Linux system ii mawk 1.3.3-17 amd64 a pattern scanning and text processing language ii mime-support 3.52-1 all MIME files 'mime.types' & 'mailcap', and support programs ii module-init-tools 9-3 all transitional dummy package (module-init-tools to kmod) ii mount 2.20.1-5.3 amd64 Tools for mounting and manipulating filesystems ii multiarch-support 2.13-38 amd64 Transitional package to ensure multiarch compatibility ii nano 2.2.6-1+b1 amd64 small, friendly text editor inspired by Pico ii ncurses-base 5.9-10 all basic terminal type definitions ii ncurses-bin 5.9-10 amd64 terminal-related programs and man pages ii net-tools 1.60-24.2 amd64 The NET-3 networking toolkit ii netbase 5.0 all Basic TCP/IP networking system ii netcat-traditional 1.10-40 amd64 TCP/IP swiss army knife ii ntp 1:4.2.6.p5+dfsg-2 amd64 Network Time Protocol daemon and utility programs ii openssh-client 1:6.0p1-4 amd64 secure shell (SSH) client, for secure access to remote machines ii openssh-server 1:6.0p1-4 amd64 secure shell (SSH) server, for secure access from remote machines ii openssl 1.0.1e-2 amd64 Secure Socket Layer (SSL) binary and related cryptographic tools ii parted 2.3-12 amd64 disk partition manipulator ii passwd 1:4.1.5.1-1 amd64 change and administer password and group data ii perl-base 5.14.2-21 amd64 minimal Perl system ii procps 1:3.3.3-3 amd64 /proc file system utilities ii python 2.7.3-4 all interactive high-level object-oriented language (default version) ii python-minimal 2.7.3-4 all minimal subset of the Python language (default version) ii python2.7 2.7.3-6 amd64 Interactive high-level object-oriented language (version 2.7) ii python2.7-minimal 2.7.3-6 amd64 Minimal subset of the Python language (version 2.7) ii readline-common 6.2+dfsg-0.1 all GNU readline and history libraries, common files ii rsync 3.0.9-4 amd64 fast, versatile, remote (and local) file-copying tool ii rsyslog 5.8.11-3 amd64 reliable system and kernel logging daemon ii sed 4.2.1-10 amd64 The GNU sed stream editor ii sensible-utils 0.0.7 all Utilities for sensible alternative selection ii sudo 1.8.5p2-1+nmu1 amd64 Provide limited super user privileges to specific users ii sysv-rc 2.88dsf-41 all System-V-like runlevel change mechanism ii sysvinit 2.88dsf-41 amd64 System-V-like init utilities ii sysvinit-utils 2.88dsf-41 amd64 System-V-like utilities ii tar 1.26+dfsg-0.1 amd64 GNU version of the tar archiving utility ii tasksel 3.14.1 all Tool for selecting tasks for installation on Debian systems ii tasksel-data 3.14.1 all Official tasks used for installation of Debian systems ii traceroute 1:2.0.18-3 amd64 Traces the route taken by packets over an IPv4/IPv6 network ii tzdata 2013c-0wheezy1 all time zone and daylight-saving time data ii udev 175-7.2 amd64 /dev/ and hotplug management daemon ii util-linux 2.20.1-5.3 amd64 Miscellaneous system utilities ii uuid-runtime 2.20.1-5.3 amd64 runtime components for the Universally Unique ID library ii vim-common 2:7.3.547-7 amd64 Vi IMproved - Common files ii vim-tiny 2:7.3.547-7 amd64 Vi IMproved - enhanced vi editor - compact version ii wget 1.13.4-3 amd64 retrieves files from the web ii whiptail 0.52.14-11.1 amd64 Displays user-friendly dialog boxes from shell scripts ii xz-utils 5.1.1alpha+20120614-2 amd64 XZ-format compression utilities ii zlib1g:amd64 1:1.2.7.dfsg-13 amd64 compression library - runtime grr-3.1.0.2/grr/config/grr-response-test/test_data/checks/data/dpkg.precise.out000066400000000000000000000064501273104013200273350ustar00rootroot00000000000000Desired=Unknown/Install/Remove/Purge/Hold | Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend |/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad) ||/ Name Version Description +++-===========================-============================-====================================================================== ii adduser 3.113ubuntu2 add and remove users and groups ii apt 0.8.16~exp12ubuntu10.26 commandline package manager ii base-files 6.5ubuntu6.8 Debian base system miscellaneous files ii base-passwd 3.5.24 Debian base system master password and group files ii bash 4.2-2ubuntu2.6 GNU Bourne Again SHell ii bsdutils 1:2.20.1-1ubuntu3.1 Basic utilities from 4.4BSD-Lite ii busybox-initramfs 1:1.18.5-1ubuntu4.1 Standalone shell setup for initramfs ii coreutils 8.13-3ubuntu3.3 GNU core utilities ii cpio 2.11-7ubuntu3.2 GNU cpio -- a program to manage archives of files ii dash 0.5.7-2ubuntu2 POSIX-compliant shell ii debconf 1.5.42ubuntu1 Debian configuration management system ii debianutils 4.2.1ubuntu2 Miscellaneous utilities specific to Debian ii diffutils 1:3.2-1ubuntu1 File comparison utilities ii dpkg 1.16.1.2ubuntu7.7 Debian package management system ii e2fslibs 1.42-1ubuntu2.3 ext2/ext3/ext4 file system libraries ii e2fsprogs 1.42-1ubuntu2.3 ext2/ext3/ext4 file system utilities ii findutils 4.4.2-4ubuntu1 utilities for finding files--find, xargs ii gcc-4.6-base 4.6.3-1ubuntu5 GCC, the GNU Compiler Collection (base package) ii gnupg 1.4.11-3ubuntu2.9 GNU privacy guard - a free PGP replacement ii gpgv 1.4.11-3ubuntu2.9 GNU privacy guard - signature verification tool ii grep 2.10-1 GNU grep, egrep and fgrep ii gzip 1.4-1ubuntu2 GNU compression utilities ii hostname 3.06ubuntu1 utility to set/show the host name or domain name ii ifupdown 0.7~beta2ubuntu11.1 high level tools to configure network interfaces ii initramfs-tools 0.99ubuntu13.5 tools for generating an initramfs ii initramfs-tools-bin 0.99ubuntu13.5 binaries used by initramfs-tools ii initscripts 2.88dsf-13.10ubuntu11.1 scripts for initializing and shutting down the system ii insserv 1.14.0-2.1ubuntu2 Tool to organize boot sequence using LSB init.d script dependencies ii iproute 20111117-1ubuntu2.3 networking and traffic control tools ii klibc-utils 1.5.25-1ubuntu2 small utilities built with klibc for early boot grr-3.1.0.2/grr/config/grr-response-test/test_data/checks/data/wmi_sw.yaml000066400000000000000000000003221273104013200264070ustar00rootroot00000000000000- Description: Google Chrome status: 0 Name: Google Chrome Version: 1.1.1 - Description: Adware status: 0 Name: Adware Version: 2.1.1 - Description: Java status: 0 Name: Java Version: 6.0.240 grr-3.1.0.2/grr/config/grr-response-test/test_data/checks/nfs.yaml000066400000000000000000000010611273104013200247600ustar00rootroot00000000000000check_id: 'NFS-EXPORTS-RW-OPEN' method: - match: 'ANY' target: os: ['Linux'] hint: problem: 'NFS read/write exports are too permissive.' summary: 'nfs export config' format: '{share}: defaults:{defaults} hosts:{clients.host} options:{clients.options}' probe: - artifact: 'NfsExportsFile' filters: - type: 'ObjectFilter' expression: 'clients.host contains "*.example.org"' - type: 'ObjectFilter' expression: 'clients.options contains "rw" or defaults contains "rw"' grr-3.1.0.2/grr/config/grr-response-test/test_data/checks/probes.yaml000066400000000000000000000016141273104013200254700ustar00rootroot00000000000000name: 'NO-FILTER' probe: - artifact: 'DpkgDb' --- name: 'ANOM-CONTEXT' probe: - artifact: 'DpkgDb' result_context: 'ANOMALY' --- name: 'SERIAL' probe: - artifact: 'DpkgDb' filters: - type: 'ObjectFilter' expression: 'filter is 1' - type: 'ObjectFilter' expression: 'filter is 2' --- name: 'PARALLEL' probe: - artifact: 'DpkgDb' mode: 'PARALLEL' filters: - type: 'ObjectFilter' expression: 'filter is 1' - type: 'ObjectFilter' expression: 'filter is 2' --- name: 'BASELINE' probe: - artifact: 'DpkgDb' baseline: - type: 'ObjectFilter' expression: 'baseline is 1' filters: - type: 'ObjectFilter' expression: 'filter is 1' --- name: 'NO-ARTIFACT' probe: - filters: - type: 'ObjectFilter' expression: 'filter is 1' - type: 'ObjectFilter' expression: 'filter is 2' grr-3.1.0.2/grr/config/grr-response-test/test_data/checks/sshd.yaml000066400000000000000000000013171273104013200251370ustar00rootroot00000000000000check_id: 'SSHD-CHECK' match: 'NONE' method: - match: ['ANY'] target: os: ['Linux', 'Darwin'] hint: problem: 'Sshd allows protocol 1.' format: 'Configured protocols: {config.protocol}' probe: - artifact: 'SshdConfigFile' match: ['ANY'] filters: - type: 'ObjectFilter' expression: 'config.protocol contains 1' --- check_id: 'SSHD-PERMS' method: - match: ['ANY'] target: os: ['Linux'] hint: problem: 'The filesystem supports stat.' format: '{pathspec.path}' probe: - artifact: 'SshdConfigFile' result_context: 'RAW' filters: - type: 'RDFFilter' expression: 'StatEntry' grr-3.1.0.2/grr/config/grr-response-test/test_data/checks/sw.yaml000066400000000000000000000022621273104013200246270ustar00rootroot00000000000000check_id: 'SW-CHECK' match: 'ANY' method: - match: 'ANY' target: os: ['Linux'] hint: problem: 'l337 software installed' format: '{name} {version} is installed' probe: - artifact: 'DebianPackagesStatus' mode: 'PARALLEL' filters: - type: 'ObjectFilter' expression: 'name contains "netcat"' - type: 'ObjectFilter' expression: 'name contains "ncat"' - match: 'ANY' target: os: ['Windows'] hint: problem: 'Malicious software.' format: '{name} {version} is installed' probe: - artifact: 'WMIInstalledSoftware' filters: - type: 'ObjectFilter' expression: 'name contains "Java"' hint: problem: 'Old Java installation.' - artifact: 'WMIInstalledSoftware' filters: - type: 'ObjectFilter' expression: 'name contains "Adware"' - match: 'ANY' target: label: ['foo'] hint: problem: 'Sudo not installed' probe: - artifact: 'DebianPackagesStatus' match: 'NONE' filters: - type: 'ObjectFilter' expression: 'name contains "sudo"' grr-3.1.0.2/grr/config/grr-response-test/test_data/checks/unix_login.yaml000066400000000000000000000015121273104013200263460ustar00rootroot00000000000000check_id: 'SHADOW-HASH' method: - target: {os: ['Linux']} hint: format: 'password for {username} uses {pw_entry.hash_type}' fix: Use a secure hash method for passwords (SHA512 or SHA256). problem: Insecure password hash method. probe: - artifact: 'LoginPolicyConfiguration' baseline: - type: 'RDFFilter' expression: User filters: - type: 'ObjectFilter' expression: "pw_entry.store != 'UNKNOWN'" - type: 'ObjectFilter' expression: "pw_entry.hash_type inset ['DES','MD5','NTHASH','UNUSED']" --- check_id: 'ODD-PASSWD' method: - target: {os: ['Linux']} hint: problem: 'Unix system account anomalies.' format: '{symptom}' probe: - artifact: 'LoginPolicyConfiguration' result_context: 'ANOMALY' grr-3.1.0.2/grr/config/grr-response-test/test_data/client_certs000066400000000000000000000531771273104013200244660ustar00rootroot00000000000000(lp0 S'-----BEGIN PRIVATE KEY-----\nMIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMM1Qxhlr+4M19GP\nsSW3xbWVSmK9ybGZqZGwcSdO4zD6lcJnl7fWN762CXBCyjpCpT4tcNjGz4I8XP76\n+BoUhfPCzKPBLdFq9pVWsNBK9yRqSk6ITAQ+TBZoHftnTO3uPk9WeTbG9lXkH9ml\nlIu0RksTVqgpptgCKQTsFa9qcgOzAgMBAAECgYBeAeNq92WPJX41vJZaDLNY7Clj\nffSI4/BmaetEO9hrePHwKkVFUhOMc0v+VRvgjMHZPLbwnmXGWV2Lqb8biDCtR3iA\nDCq8UmpJ7Y6jrP/mO1scV36XmrVpBOEIPgGMhgV29s3fKv8+jcQFmXWh8WndQh5c\nLAjWivD7UyrGgSnuoQJBAPzwFnoiKtrL9AWXMsGOrG4gx/hkFoVqzW/+H4ogPxBd\n3j5gJJh86jI9a60uR3p+WdBCqhxXXD0yZTcA/DUKr0MCQQDFkkGopndznjR2943i\nicm2UC+526fK3NN3iTUF1ouNvtpkfcO/Ho2+9IfuO/JbtDXZ4tPcruyXRsLYHNab\nUXrRAkEA4UrgWmzwiu47LnecR/dS8szUERTlUnTtA6HwadGLGoLhn+F29zPcTl+S\n9zBPjnXYfb3DU3cku4WVzcZc3snjjQJAb0empchFRaDZKhzbFLrJG1/k0clPo+pn\nTU/Bxq0F42uY9LsFcvNRoTl4Co5HPrGtFzE0ZXs9FSOtAS6VDdyB0QJAb8CgA0Wh\nEkKLwSwSMKxVkQcffw+LtOtuIAZ69yzMbln7+RIZnev9IW3IG/+6wB5pv1M3o8/r\nSswM5YvYd2zVSQ==\n-----END PRIVATE KEY-----\n-----BEGIN CERTIFICATE-----\nMIIDbzCCAVegAwIBAgIICjk23+US4+wwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UE\nBhMCVVMxFDASBgNVBAMTC0dSUiBUZXN0IENBMTEwLwYJKoZIhvcNAQkBFiJzZWN1\ncml0eS1pbmNpZGVudHMtdGVhbUBnb29nbGUuY29tMB4XDTExMTEwNDExNTkxOVoX\nDTEyMTEwMzExNTkxOVowHTEbMBkGA1UEAxMSQy4wYTM5MzZkZmU1MTJlM2VjMIGf\nMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDNUMYZa/uDNfRj7Elt8W1lUpivcmx\nmamRsHEnTuMw+pXCZ5e31je+tglwQso6QqU+LXDYxs+CPFz++vgaFIXzwsyjwS3R\navaVVrDQSvckakpOiEwEPkwWaB37Z0zt7j5PVnk2xvZV5B/ZpZSLtEZLE1aoKabY\nAikE7BWvanIDswIDAQABMA0GCSqGSIb3DQEBCwUAA4ICAQDe/hBVdDj/dfcfwCPy\nKUig78PS0F6X2L3gXWJKb5FrA2tilE2uB6IhpfM9L3AF0nl2kN2gsyjcLta4rM4P\nW7bf8pcQkZUcvz4roq5NyBFkkUeIeqlyUDBd2jK44pkw1YpYqJns59jge2yT87rG\nIQfNxUSagBUfpf6IC7i9qfFg8StFj6TFmQrnnQO/hEiZvBYJFqzFADAXK5uqaFyD\nniSjbiJBWwEm+ENg+RZgD36G0wc2PmjBmz62E/zo8LwODTbGX/7zyoQGFCltvgAZ\nqi78NMhUAiJ4RLPPHPPnnJgol31YMtoFINGIIVl72aFyRlYe0l/MwHd+CRP4jWJj\nq5YSCE0NMGTSw3qwbUI5tj8uurrufiXYQ1kkiGXrIZ97H5K8PGkdr97DZfvm1+/4\nKgf9opUAsk1W9qgvhqo1xw6z0f/J3VVkVt3bb3cXk98vGBlffpjWLKGefh2Wti/K\ntBYtN/f+/3VnjX4QZJgSDDeCOUbCNIV2xhWSjIy62x41mKFOqVvhqx73z5BUX1Vc\nkIOf37J1Bp/uaNwIlw/XqQMiOX1qmQ+uBbFbKfMWixe0E07+HnlH15UY3Qb4I4oI\npXoRM0L9NNTMCXvtfvzFoaaBEXC4g4Xaa8BDHYsBoQyh11pRXyQwnUBpUZ6S0vyG\njXVLiMP5FWFRpzhUimVrzMEluw==\n-----END CERTIFICATE-----\n' p1 aS'-----BEGIN PRIVATE KEY-----\nMIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALE0eVFBFIAmh3tY\n1SuOPCffswMeMH6niD7TUNhio+r+wwTdPJYIGBFk2vdHbMtrQaZmBDSsA16p8jfw\n+6K9skXeEivSdTMAhIstQQlIUFjPels5BW1Xq6zy2+Onm+x+6LV4PwbQBLK53VPs\nJH8YCZbYPG1hub0UlNTb17wLdSE7AgMBAAECgYEAoJ6KlE7kESBbTz9+wSMEfbPz\nI5FarYKXKTMLJYeLQna3OBJ8VxVxE1sSam7wOxW2BOiVSVTdHRH3viMNQz6kddOr\nUB/bU7jz4uHQvJd2O53kE10CAljXUzx1JXrkjgS8/gc2fc31EFNj3z40nsOSwphw\nGteTfgKDqAsR/MpCucECQQDWgie69HCXLorrrq9UhVyTlUBaUiU+0pakGZzovVj3\nGDy38BfG0kjKbbFHzVq5OY3/TYP+PV6hMo90ZvI2N1LbAkEA03sonmlQIBnns53q\nnCnRB7ziA4LHzFZ0sSTp3JwGO26QaOQpC3f3+vV9zbm+oBzpbhD/vULHJ8qjJpuN\neglJIQJASDlWizoWVrDTEXuliP3GJ+LO4hpadAaPtfzxueNW+wtsFjp+pvDSlWXN\nlPFtpIPebaF52bZsEDZn2rd2wg5qlQJAIvaioYYBxDzkLLL3/beAIopcx33QsHy+\nsCbNLzbwZNUDtQO7sXS1H92EXgXOeUQuZ48R6OVobbC3xoNDIaD1YQJAfdxaMQkI\nmHbTOA4vVvME9yYnyi+njC9NbWIBRu3jVh4eE9/Hy1lmEy4W3HcDTBjxGsj/lmNQ\nyFTvDg2BeFyibQ==\n-----END PRIVATE KEY-----\n-----BEGIN CERTIFICATE-----\nMIIDbzCCAVegAwIBAgIIKnZt7Mkk9r8wDQYJKoZIhvcNAQELBQAwVjELMAkGA1UE\nBhMCVVMxFDASBgNVBAMTC0dSUiBUZXN0IENBMTEwLwYJKoZIhvcNAQkBFiJzZWN1\ncml0eS1pbmNpZGVudHMtdGVhbUBnb29nbGUuY29tMB4XDTExMTEwNDEyMDMxMloX\nDTEyMTEwMzEyMDMxMlowHTEbMBkGA1UEAxMSQy4yYTc2NmRlY2M5MjRmNmJmMIGf\nMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCxNHlRQRSAJod7WNUrjjwn37MDHjB+\np4g+01DYYqPq/sME3TyWCBgRZNr3R2zLa0GmZgQ0rANeqfI38PuivbJF3hIr0nUz\nAISLLUEJSFBYz3pbOQVtV6us8tvjp5vsfui1eD8G0ASyud1T7CR/GAmW2DxtYbm9\nFJTU29e8C3UhOwIDAQABMA0GCSqGSIb3DQEBCwUAA4ICAQAzUbt0QIxWSEJC0+m5\n/IiMVi9abOa6CsmugoqVj0PZf0u7h2vE3LGXl0PtodqimqLytFKPunexHaekU2P5\nFeF3sDMHQ/WOJoQ2lS7DAEh73/GmTSiCKhOjnItAnwckInLW52/X73OjGHbtxvvt\nUB55ksxVJf4XA5jhn3Lfv0xG11OifP3jtcb1M9tnHUmPUpR0dnnap/K1kQ4aTQ49\n96hscYCfGgS90UpGF/Kj0s8FicCqXug2dLVXD2ghVkaTOMuWFZF+993fGpGsGgV7\nbXVKUyoWfsnN8Armq4F4GhXNy1pH0ZCcOTTaPuEt08ZXKQEIQ8bFkkFDcT/5vfyC\nsVoXyhj7/1bfhbRFfDbLoY5sDGoOtGar+VrXhU8lrzKly3ISW9eSvbSeEoM7JTjx\np50lnnApbDt0yGxmpiCoBU+6PyYlUyeFVPqqj22Q7tpzSTdqfDoYKd3hr8tlSNUD\nJWcKdOuDzJrmvTVE7tMi9klZNd/qHK9bur7c6Lhtu4mn+5LH/lhQuoUtxrf1cVAv\nQOx0LqQhg4DRNiDkSL4TFUUIeUpD/tCTFATW3z8iRSfYMtG0Ncpcm1cfGCoHmWuC\n1izCj4a8dFGsnDKSjkl958yseZO2UZiGKjt50jEzbja7Israuv2OP20Gha9eCQtn\nJa/9Nodd8Jj2rQqkwL4/E8aeGw==\n-----END CERTIFICATE-----\n' p2 aS'-----BEGIN PRIVATE KEY-----\nMIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKqOnmR1TqCIppR1\nofpPg4bV7A8Tqjscqp6iO31sgJXWzkKG+st14qPewPDI2IOyCsn4PUmGqtzbEsPR\nVyTkIrI/N0ilmFC/eE5IfuGQed4J0BgC+tKWAGUxVyEReZ4XKr7yRJ0gHXhn0v8y\ngNmBA8kqMLrbR4/VFTqNkLCi4IVvAgMBAAECgYBEzxUH4mu+SGMsMekPW1Ts6RE7\nY+uhvYb4SOtHRqb5zJeaL2qu+vhctFmSyvTO7N19bjELoND+GUQQzDwkHgYAytvq\nFWKR2bsFjm5F/0nv6NGxd+UOJ9VrjW11xiMju5O7iKqXOTv9rAdUwk+fbSm/EQYM\nUcpns3GhueuEGQsNAQJBANhP8QZSBiXLqM3C53lsBKHBiLoh+INwC6SlP37AfgqI\nA/XL0DQnmn44skNGcTDOC0XHcymKjkgX3IWFTPedYrECQQDJ2ZWTiIaWwuJFLGdU\neq+hNKWnl85AYnYufuHs9A2MmiQh0zILnBpoRrcdMi4YgYhXdwQTHajht19QVwIG\n+zIfAkEAmsx6u/8vDxUz9Cwq4qX+mpOZeTqeUdF5Q5ZOXjL7ACZeTyRQF0LQOMvy\nJlre3gJV5tXZAD17nPQWiCbg8cLbwQJAdt7HgpndQP3GCRysQYj600HQ6JCy6yHR\nHXKllEjpjcrcynq4tzOYLZ6viecaVF48L94sLSHDaiH2ZLbIv9nA2wJAAUhBrWgp\nlHMVPwwIfqZ3zpOgv+57F6+KZfmoXMUgAxF1VWiIUmicvD3Ch6t9Zmuim16gs9cW\nF0FIi1HTpazl+g==\n-----END PRIVATE KEY-----\n-----BEGIN CERTIFICATE-----\nMIIDbzCCAVegAwIBAgIIFFXgGgZkuOwwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UE\nBhMCVVMxFDASBgNVBAMTC0dSUiBUZXN0IENBMTEwLwYJKoZIhvcNAQkBFiJzZWN1\ncml0eS1pbmNpZGVudHMtdGVhbUBnb29nbGUuY29tMB4XDTExMTEwNDExNTkxOVoX\nDTEyMTEwMzExNTkxOVowHTEbMBkGA1UEAxMSQy4xNDU1ZTAxYTA2NjRiOGVjMIGf\nMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqjp5kdU6giKaUdaH6T4OG1ewPE6o7\nHKqeojt9bICV1s5ChvrLdeKj3sDwyNiDsgrJ+D1Jhqrc2xLD0Vck5CKyPzdIpZhQ\nv3hOSH7hkHneCdAYAvrSlgBlMVchEXmeFyq+8kSdIB14Z9L/MoDZgQPJKjC620eP\n1RU6jZCwouCFbwIDAQABMA0GCSqGSIb3DQEBCwUAA4ICAQDSeUlf6FMya6bDyYGY\neigiOImy0q2k2Y7A72HQrJc3n8w+wRAi0sPG02UmODTmFX2wyFpqsdQi0lLnRAAN\nhqGjvQB1Iwh4+uAbW5DXA/yrPcqnFcA3Tw1iQez7KKmKU0mffmfT0f6QSlr7E5wE\nPT7khlBBFisXOnbc3cWx3PFfOOCfH3cGhoIYjw5j6sNPB8HYuJCOe8P9e0D4r/0W\nLIN8p/cPlOhX9tUtGx5FWwxjw/zns8ZjVYtGhr9JKn+qJa0zCRjX7xde4kH0Xy++\nBgilGh8wGy5wPtT9Ac8LEDSS+FBeVGL5bZMFINDdqMcmYUWn3N7Va3k56YtiqGmi\nkgLlCfJiCfRjBEBEcnMn7TUC35f1e9ePI9pRQCH25bjNAr1q0LXHgVfqwHo6ayFv\nVxuD4GwnttEOepkHZHjc7RyyLLkaWuaH7XFEVyZI7bC0fIuBkAgRhwYSPRwTQc8l\nU2QsNRbc/x8cZLjCMarA9tvSby753g1vAy3LpeVx6UAjXb3oG00/uoOoi8d4Jd4T\nbB0GNkZD0t9U3wENTCurtFNZO6exFe4IyFs0Lzst6bIafMl35hPp8G/+ZumyVvDF\n6wT7/k0kzuDJIfP4b9KGWSbLsTD9l2F+5pEhrb7vOAb9G2MU/HXV82igZtHAf6Kf\nXZLOaHOp/yDWAEifz4UpXOInMA==\n-----END CERTIFICATE-----\n' p3 aS'-----BEGIN PRIVATE KEY-----\nMIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANGmymALChd+IPaF\nJIjjFab2ugK8cVKfkojcB3wbQtRlW/xdgqwbpZiTeWWiTFJvOpIZaIHa6GhSx675\ntZzanf18ayjtV7QApQ+9Cs8KKngBHjJi4XnAmG2EXEM8zum6yaDCNqztH+NtWPGZ\nMPpKl8QSUeqTmrJNpWyEcvuqwlGRAgMBAAECgYA4X1bPWGiQRJPsdYSLYjQyPulp\nTu5RvyKRtkg08MeZgN+pDiPSz2RJkG32DBvllo7zNe3J7OjNFGUpAW/6Czars6+0\n623VvtRT40WHqiFf3Ganq7YEItgnrmKB/lxufGItIrCXU27fNhkUVbziCyt3Z/xE\nL2KmDDcLsfk2fI8GeQJBAOkvQFswNjQ+rQUm4ANrzDIPuoquWRgnEz/hB2EDY9sx\n4vzQTzP79D6gFuulu7ksAKEgGSfppr0qxftumgw8QSMCQQDmKhbWn/4m52gZZ/G0\nTUVsd3/buEl3mQiWU06sXyqDkTYD9Vfw5KxQVYKhcIRxjiBswQaRCy5FpcxDKBye\nLp+7AkEApmKz7h1BoBfUx2dM0sQZaOM2PPxY0FYZcywzYrLTjrVS/Qf6a+JtDj6W\n/EA+6csPC+lmacdb1YDu0hDCVNattwJAcFO6MaSDdJkaxMtluoi7iOQJEkIuGKAn\nALZHfvgy12LW6bei4322Wr5gskknWgPy7yCFA+RhALyZo2zACrLWYQJBAIkwqaMo\nAOJ1lGhPazhZvZhpqZs0w3dcMRrZjkcBy1jPumQ6kDgxMHbxbkt9pVU3k2ysIoyO\nU/n+n+EoY8rQUXU=\n-----END PRIVATE KEY-----\n-----BEGIN CERTIFICATE-----\nMIIDbzCCAVegAwIBAgIIcPco2WyZFC8wDQYJKoZIhvcNAQELBQAwVjELMAkGA1UE\nBhMCVVMxFDASBgNVBAMTC0dSUiBUZXN0IENBMTEwLwYJKoZIhvcNAQkBFiJzZWN1\ncml0eS1pbmNpZGVudHMtdGVhbUBnb29nbGUuY29tMB4XDTExMTEwNDExNTkxOVoX\nDTEyMTEwMzExNTkxOVowHTEbMBkGA1UEAxMSQy43MGY3MjhkOTZjOTkxNDJmMIGf\nMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRpspgCwoXfiD2hSSI4xWm9roCvHFS\nn5KI3Ad8G0LUZVv8XYKsG6WYk3llokxSbzqSGWiB2uhoUseu+bWc2p39fGso7Ve0\nAKUPvQrPCip4AR4yYuF5wJhthFxDPM7pusmgwjas7R/jbVjxmTD6SpfEElHqk5qy\nTaVshHL7qsJRkQIDAQABMA0GCSqGSIb3DQEBCwUAA4ICAQC8S7QSSJMMU7MIPnB7\nWXgE9ySLN2IN25C1+C9irxPDx/temnQnQOMzRquHmyIQZdtl2hI6un6OpviYN6nQ\n7RivGeeVRfnxedJO+rgcfAbJadDsVLE+o55cSXwstCvyApLbb9YQ7cXCSIRS9vpT\nxwkGQBEo9CFggC5gBTMI16ptx0vazz/XtlvQ7Hm+NKVISyEUHBRiF+u90LM6vLWD\nuwDMZ0uzW8h7a6m8liFfcZPB00bk4LE9/D+s53CGSDRBUp1euf0z7TzOG2QHp7/L\nO1tOThkLSVWvCtKs/6qkRlUV5qk+o+P642SCyiuK/0K2BbxGRQfAmUUgIDzpbqLJ\n5v6T1EZwbZDi7XIX4UlA2xIfwSTf2hZbzP6ZZbmPkcwPsEiKt0Ma6vBgwqDBGoCk\nlFXIUPqgjYwx0naoEArnWas2PRzzfKHZg7DvljFBEZ4c5al6utxvOMJj/ZKgBjmy\nw3gtrnBXlQ0JFc2lbo6ng9OCaTEajUeAewCRQjMBxo9MzSZnyBQ6vvZYAwHfdey4\nRypPjQgEDkI0ktuhXHvfkmyUNrvuDGJCw9z8m784we8Z85aB2muib1XUdzV5MAXq\nDJWsp7DBhGRHGbLgtulmulm/OW+uhrg+Ksyqv8W7OJnn3Y/o3THSfWM2Ovp8zunO\nUSWiUYbHGwMUaGg+txpX96BRKg==\n-----END CERTIFICATE-----\n' p4 aS'-----BEGIN PRIVATE KEY-----\nMIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBALEGziZkWoR+x8Qf\nBtrotHFrvhUwuDdBn51Ov0ka9ZnJ6bLxc6dT2VYC4VFbXOrhVOS7c/862U62+3hF\nsAYFEiggRGF75SI7hMhp1D2Pj8NntHtNsOXl2mLmPlB/xDEfWJzhGKQr6hPy2IUz\nchpoCxeMHcd7FaJAx4LDwfyVQ0/BAgMBAAECgYEAjyzu3JQ7tX+IeDGT7Mda8YTv\nptnRlDdKLgN7qFfanfh1QBoSrRme5PbNX2yiWQHIFHsb1Si2ivhpqJvMQwIk7OAf\nkA73Vhbv6hrYMchVn/dmPtk/ljEQ2s6EAnK8eeHNSGzIfIXap1wz/O6pRPOvYThx\nmwlBQhB0R2O+utaV7PUCQQDjJ30e7RNP0YNx3YjwGv4+scooRzQgeR4ukZ4450l8\nCZGRzQ8MNXjslAmpqdzp5UUxOVqWvRbO81LAvaShvAdHAkEAx4G58OlVCFmoiONX\nEr6mLWZUAxOBdfvW/mqlJ9jDRMkHFB3wp8Iah7ZbfCbWVHN4QxZeCBRkC4nM/hNY\nwtsEtwJBAJmPSHZvrm53JHUFXl1y4g1gA1nXSNXrCwxQRLYTJQpFLbNy/Ik0XNsR\n+LZJrp4v7+am7yaYDaM5uuexTGpJwmECQQCkngoLGryrEy/ZI5zpPp5nv5N6plGg\nRJj1fJGh+13EGAvbMYktIyA48uMx4enf7RdCY+ZazFhwnNekndoTjhypAkBD39v7\nK5xuupwsCPUgoGQfks3MPDnTp6tAnCHN3ANaKHB3Dq0bTlssh7TlJxvHdqR3jirN\nnnHL+V3Q7Du34u4U\n-----END PRIVATE KEY-----\n-----BEGIN CERTIFICATE-----\nMIIDcDCCAVigAwIBAgIJANCHE14gg3AFMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNV\nBAYTAlVTMRQwEgYDVQQDEwtHUlIgVGVzdCBDQTExMC8GCSqGSIb3DQEJARYic2Vj\ndXJpdHktaW5jaWRlbnRzLXRlYW1AZ29vZ2xlLmNvbTAeFw0xMTExMDQxMTU5MjJa\nFw0xMjExMDMxMTU5MjJaMB0xGzAZBgNVBAMTEkMuZDA4NzEzNWUyMDgzNzAwNTCB\nnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAsQbOJmRahH7HxB8G2ui0cWu+FTC4\nN0GfnU6/SRr1mcnpsvFzp1PZVgLhUVtc6uFU5Ltz/zrZTrb7eEWwBgUSKCBEYXvl\nIjuEyGnUPY+Pw2e0e02w5eXaYuY+UH/EMR9YnOEYpCvqE/LYhTNyGmgLF4wdx3sV\nokDHgsPB/JVDT8ECAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAWDr9AMAlUJhex/qD\noLWw/hEK0NLAWp2wmgE5EG6cmvWGl2UtOyR4LVAjWeRLyVTosiMUTTtSrAQnZXnz\nRbfrx2u66q7MzvPfncwfOJxyIaKNY8RL24+mSqfS+5CHYCOS30BdD0TxI0OSkysY\nvXgAB+sJatSIeeq+BxQ9mW3kcwjIg1sfYiEKJfun3QAjtg7m6keWldZEfE9F4WJ+\nNeTHW+OVEkwLm2FgriudRbLW+3ltibb92je4YCoxCpOvOEbh0ZUmTK4pnjvx1AeZ\nhaEbZN7pCY3vlKqcm6FAo6dGhEP2hnnB/8hCfhsUXYc6L7hPx2z1oh8DdZbp8IG3\n9akxQ1c72u1yRRCPTnpFHZFmTEvx6JY0dymTiuRTzTkGUbaBsnMak0yUZVz4W4FM\nQlb6Hrp8VoZMQht7etso2ld2DiZgbpPMS4BRFAIvlwyk9Agjd10HM29qMDjeM/ra\nSDgdg2biPFuS439xMcpc5xVSm6IX9p2IdfXTt54wrhNKugYBhgaQEmiWJJo2uZ1D\npuSv1S0JSBPqXw9s/leA8gq8mJ+VP5rhuFXI/oMVnV8556z0tgxmFXq6ierb9tBl\nbJTzb//Pd9+G+f5ykPbkyNYpBSiR3FHvKNNRBtVqhjDUrmAUXbPqcFsRxKQQSePl\nCQFSp7YzHIhANjWvEANZFcl3aDc=\n-----END CERTIFICATE-----\n' p5 aS'-----BEGIN PRIVATE KEY-----\nMIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAM6qmOim7yMeK+Hf\nb+Di0juPArMmvcAIYRHKGJCX2rAtxw+w0z27YFbdPTcqQdm5aPYfVprSQxd56p6y\ncibQk+gDB9K11fsFUrCBVEl6GhRMfT0WBBndts7MEJ+i4KmkwQHLCgEhwVIzZ5+A\ncFpC1+qvGriA600UMj33IpTD457zAgMBAAECgYB2pDsp/IN2PqDkh3fbu3sDVAMx\nw8DU2DqZktJtV6/kyjLn0BRE8SfKVjIJVEn/atBV0wHN2X1IoeXN+xVLMRxm4VyJ\nuVztIHdiKXvo1yqkKCKWejvcQHg67WBuXdwo2BY/hTmjVOFwJwEWRoeC0rUSHDlO\nzZaZmlDEZ8vllUBf6QJBAPe3jcymJM4ZzKOAWc+mKOMalxtdUVL0YI1hHsSEMKob\nNrIMX0Z4YWVJT6u4D3UIWQT6Zjf/fBLEp6BRUsFV34UCQQDVk6btnm5rZP3abNrb\njLndKb8Ir8MFfjidnE9g62LltcQNSUP+blLRm38QAfQkbJElOklg8BFeVQaEwiET\nb4IXAkBG74Ikm2MovcyS+Xs+cjd9KS0iQeu61I4djjUwUyZYX+ievdo+pNRHG+I7\nqz6J5fUP7uB8oqWV/kh+KSuIf529AkEAiNIOHitgkWwhM8yIaB2+8+/KccYnKV2y\n50U7lNs2f/HxppFI/bWvWJhEzfxyauMiGLc+StuARO4zPtkeV1UYAQJBAILXXrGw\nSfpZxkuueFYRQVGb+1IZOCy7ZdYJG1RVbvHr1QFaCLZ6sT7AlUT/eaYok0TicBxf\nWi3vXUFNRh/oWtI=\n-----END PRIVATE KEY-----\n-----BEGIN CERTIFICATE-----\nMIIDcDCCAVigAwIBAgIJAK2uVKKpkFkiMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNV\nBAYTAlVTMRQwEgYDVQQDEwtHUlIgVGVzdCBDQTExMC8GCSqGSIb3DQEJARYic2Vj\ndXJpdHktaW5jaWRlbnRzLXRlYW1AZ29vZ2xlLmNvbTAeFw0xMTExMDQxMjAwMjFa\nFw0xMjExMDMxMjAwMjFaMB0xGzAZBgNVBAMTEkMuYWRhZTU0YTJhOTkwNTkyMjCB\nnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAzqqY6KbvIx4r4d9v4OLSO48Csya9\nwAhhEcoYkJfasC3HD7DTPbtgVt09NypB2blo9h9WmtJDF3nqnrJyJtCT6AMH0rXV\n+wVSsIFUSXoaFEx9PRYEGd22zswQn6LgqaTBAcsKASHBUjNnn4BwWkLX6q8auIDr\nTRQyPfcilMPjnvMCAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAfRpOlVA+xGIvsqrd\nUvNSXKBUQ+OqeBcLRqEbe8YYLDiJhMh2FK4MPKB7tplpdrhFIQ77/MLNot3hd2d4\nxqBc78Q6kvJ3LBPXv7MXYpHUdFQh3IvrfD60VTpEqE+HS2UEfpNkFH5bZ0Ajwc5Q\nDqfIRyjugaInNliWz7Mpee8jHqbnpQKPVolPxUfnmgnzSR8zvIWgLPhyyMwXay4D\ncN5SpdgO25QNvfkVNwjoQgMfVxywbfIqlxryWr1YjqSDotq5UI5Lc0X3H97wnFBW\njaoSVbAxJOGG9uxFzXAgpj2p5eQwy7oNhWJ9omsEhMpKLKktuzjCOZwQ3l3aoYXD\nEUOsvHdNTsQDHv1ZL+49fWyvNsoRyNskt4Df9TbIAKXzg1IvzXzb9agkcukwMAm/\nuRTyzO6a/8HmQN6Ob0d+SMMSiWKSIo/8YdQtmC9ICPrCrTcnJA0HlBQe2GtJvsw+\nqjW3Y7KNS1LLPI/DqOF4cijlJT60wbbRIpoL3wcS3nBI3VFwK8Pm3k8QDYGZkHCL\n6frYUaArhYjOgzx0BL45lf5R65GfWc+yRhwy3gtSQNBwr+H0bSvMwS9wH8TsdsdE\ndbJN35PIKzG67L5N8ttGNy8eKuXTcqi8Sdl82WIfmX31R92c2V6oYX0jNr/XM/mD\nKKmvlJ7MfIpyWTy0gRtujvWnAys=\n-----END CERTIFICATE-----\n' p6 aS'-----BEGIN PRIVATE KEY-----\nMIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAKwKTqYfdJoSM/E+\nrtFrnEPu9yIXz9KmBMHHVsAR9SZCbIdoBxmMF0iIAgmhhnyOQCpTBjZFn4RxSDqY\nCHdL5JQYVTyXfAxKRMr/mPKHhVcdYBa7coI0a+e1CuuFl7vo420mKvVj6o9SY33A\nl8fB+CYSjFTw1/9EsT39fQESXgw5AgMBAAECgYEAlkEyS5hxaBa50tsiJ7lKc3KD\n2Pze/2UMBooo0/tbFp0w2FocyU03EJvo26x9Hs/GbrCwXjoUhcHCiZo62qYn7Vk8\nDKoYJriUgxV4RAA9UCvdlCMAXHRO/+VhbhUMmaQEU04YgDnA1O+gYmGkrE8HFXUK\nPYj8q+j0d+r4Rb/jnmECQQDZZux39mhWFzKTzVuPc0hohhNtGmRgXq1TiVtCjDBb\n4HMlQeyllRf2/BEoltkEY2bN1z5Xr6R9knPqKBAHIB01AkEAypWoklsMlNqBfGQv\nyPNmljvPS+1CveWna4cTfAW6S5HC6u7bIZoXCwRyUYnPkXUiCim62g2vawdZahbs\nBBtHdQJAVRIWZFbyuwV20Clis76LzgLxJRdXwfIqZu7v3BmZbspkpGaooJ638vju\nCfEFWNdAyjl49r0PY+fkHfOxWehyJQJBAMG452A9LQTTBmu7Km7RQtJ7EzoaAm6x\nQ63xl1JL79//3RLnoii5vztL3z3VuOXxysFJMmL+HzcL6hcnID61D1kCQQC4BvvY\ny9jHdmnNfzAFQtqpol+qdzcOiomT6LkFkBB3dnHKAwJzeHWmIvmI8PgENlOT4zrn\nHiodPZ3yYhZcRLlf\n-----END PRIVATE KEY-----\n-----BEGIN CERTIFICATE-----\nMIIDbzCCAVegAwIBAgIIB8yDojik5I8wDQYJKoZIhvcNAQELBQAwVjELMAkGA1UE\nBhMCVVMxFDASBgNVBAMTC0dSUiBUZXN0IENBMTEwLwYJKoZIhvcNAQkBFiJzZWN1\ncml0eS1pbmNpZGVudHMtdGVhbUBnb29nbGUuY29tMB4XDTExMTEwNDEyMDAyMVoX\nDTEyMTEwMzEyMDAyMVowHTEbMBkGA1UEAxMSQy4wN2NjODNhMjM4YTRlNDhmMIGf\nMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCsCk6mH3SaEjPxPq7Ra5xD7vciF8/S\npgTBx1bAEfUmQmyHaAcZjBdIiAIJoYZ8jkAqUwY2RZ+EcUg6mAh3S+SUGFU8l3wM\nSkTK/5jyh4VXHWAWu3KCNGvntQrrhZe76ONtJir1Y+qPUmN9wJfHwfgmEoxU8Nf/\nRLE9/X0BEl4MOQIDAQABMA0GCSqGSIb3DQEBCwUAA4ICAQDJmC0c/RTBJPsukbHK\nLcaQc17SOzq85U6Ve9QftynHYnXpKXYOnBXsBH9JuJEepWaW0fYrwo1oFl1n/jLR\nMzjLMKyJF3NH4M75hcWLPyzvNJBC/NuzbTNxJvqhiW9Po7lJQ6nidD/F2lsgzcZS\nIR7hlzC6/4hB/Qs67+GfqfjETiqQXyqyHumhftaYh2Vg40ERFCzjANCYK7odzkEo\n0Z/fI7rWutvngYc47rrKS8hp5dFVr/DYrTb/yQjBdyKziiicYsRE3ucOdYulmdRd\nSSbXh3InGTFgMVlX6JK/4k3b6qroUQnC22zuIsowMFhdWq7tO54tiloKYfkGY53D\nXu8c7FourPmfU77r2RUztqZmkMVad0XXZoMBNuQuWO3T6w91/kauCS572YuX9B1Z\n0jU3TauKmhyBpQaKs78KiTHQBlLe7fjl5UMc27bhoBSa4/XMzJPigMk+TmB2znR2\nDPGgWCYthEFOXPDuoLQcIh6/5bxyJjtzy2PamnKbZoVqmlX5+6BdGJte2Hu+KWKa\nOgMMYKKpqg/CigdIjgp7XnAsPNUz3TDx9KaYEPZSZFk5w6en368q7IG/yETqvu8h\nFlI0o/CK0c/7FpyvyRvxtbtmLxHfz0imR3J/Q5woxU7g14oFk1sW8lUSAeK5M7KE\nE7+R1E/3yMdFVeoNAsMOEI6jDA==\n-----END CERTIFICATE-----\n' p7 aS'-----BEGIN PRIVATE KEY-----\nMIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAMWCOx29d8rPThaQ\nZ6ipssv9Qa96qjixopOnd0vyVe/IsNy+PxViv70VGibkA1RxHAKitZGSODqcY8iF\nHyvhhqXQJckDgprVIPXVqNlkzvp5OpwAn1G13HpQdxc5qqHPAhZsDJOuZkNQiUcw\nPX2melrXYNdQMBsp71irBGxJ7TVrAgMBAAECgYAXO4tyox/dNmdsFg5rc5K5lg/M\n8XPmeVazYaaRw27CZuwO+z32aQg+2KWb34RYwXlXAgazmeyNUGoYYzhYdA3fbEGQ\nPFdT1sSkjHj1yd7QaJy/GLpsnY8Hvaaduai6/2Oy67RtfkWIEC3aJPelxoZ4DdNV\nNE6EpYpCTlukWGY7+QJBAPI3RFenvq9CgXppfISMrgy2ZLGXOT08Du3lZMH8+QLJ\nNAuXs6nY52DBzu3RtK5usYL5jmzpWyJwvUaes+6ImlUCQQDQv6VAYBWPr8lubL/X\nX1ihWFun2HbIRWL196INutq0jhXm7+dmYcd5OspJ/9WmDAprgNqVPzalZsTQsK4p\nKdC/AkBNntxt4rm+3Gc13Vwj9hlIxaKbLsUPFJIMNrkFWZZLCEN/e4v94B616SXx\nHIT0aVDFkkfMKzQjY1GksfMje+9JAkBgXKd/ERvC6YXVyLPCSwxR5sTgtWcXyhgF\nrVuMdP4yrQhlQ8eRFoALcV0iTcwlS5efyqqcjMLAFbGzGGw9KkVnAkAYPO2yfFIB\nqL2IkGPYWzx4s3GcdQUu8A8xv/rHs2OQHvK7SHSs0Ht6YHQQ6v5aroQuLI4EKe1+\n7onBAcVe00M9\n-----END PRIVATE KEY-----\n-----BEGIN CERTIFICATE-----\nMIIDbzCCAVegAwIBAgIIVf9Ct1Ys2aEwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UE\nBhMCVVMxFDASBgNVBAMTC0dSUiBUZXN0IENBMTEwLwYJKoZIhvcNAQkBFiJzZWN1\ncml0eS1pbmNpZGVudHMtdGVhbUBnb29nbGUuY29tMB4XDTExMTEwNDEyMDAyMVoX\nDTEyMTEwMzEyMDAyMVowHTEbMBkGA1UEAxMSQy41NWZmNDJiNzU2MmNkOWExMIGf\nMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDFgjsdvXfKz04WkGeoqbLL/UGveqo4\nsaKTp3dL8lXvyLDcvj8VYr+9FRom5ANUcRwCorWRkjg6nGPIhR8r4Yal0CXJA4Ka\n1SD11ajZZM76eTqcAJ9Rtdx6UHcXOaqhzwIWbAyTrmZDUIlHMD19pnpa12DXUDAb\nKe9YqwRsSe01awIDAQABMA0GCSqGSIb3DQEBCwUAA4ICAQBxVKfRtJHOAKn7OOKG\nh+tIGFljan7N3z05IjS4GEhBNv5gixrO6mdCTqtrdOzYE3HwWJ0Zhoz1m1JGkdu2\n5i88G5TES+G2xFyI9vprSI05nlToazEYqEi0aznB/BVxqEhHR9xXQ/aCFolk/IXG\nuCultIy7bcg2mw4kWETRxyI60I6tn+TdeqkLwCMAxWww5KtJcHg+GT/titE34d3E\n+W7f6gCnHdeajNJEfULtViea6Glkzeqkpm1F/oeqkASKIDi4AoaipuCkOgyuJaXP\nX2VoR32GABkmd0CdveB9KNJBgwPJM3/BugKHNfeblC4FNF+7w9PiJJjzCyIyr30v\nKanOp5tNCJIqxgxEIhZLBS2eJzjBUN78pZX6EaXiSGxW6FRVc4b/lAHYgbMyV+oJ\n5I9cZybulCq3adZWCJnhcNJiUvgHmfcGUF1kJoZaImNRQu52q1QmN5dF074wNj9D\nP1IrsypgbAzaDMnNDQhFTwmh3rYcM6KyvK19jC/DbqIuQDICwcMub9vd2Cggr6g8\n+A3tZP6ivGZs9YyYvWZ/q1AQcgTbgjAUdVc3VKEqlTuwR5P9xhKr1t7OYqV1IMJC\nDUOtqdAufSTTfsa1pQlBPCPXFwB9kJ5Y/de77Sg/ICfkUtKpdnMw2AYcoAOfVdo1\nOhpDj5Kg9dVQhAs3uai3YiAL/w==\n-----END CERTIFICATE-----\n' p8 aS'-----BEGIN PRIVATE KEY-----\nMIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAOM4bxUnt49X82C6\nsbiz9fJCsHvjFRwZlqyF1R/KCRZEskFN/SGihQITOrLGY4mk1SfbkULldyy9imLx\nwa/FNraiRx3cep+smXT7BQfinjZ1trZ2qBVcXXbKBIbduZjS/D57A734XWTUFYbc\nXETRMUVo98B2mUdc4sGQnklbpF7PAgMBAAECgYBqtYQlkUN5hDp+QO9Z6Nombf9o\nDxtI2ROT7j5K8Z0W4ig81x18AFEqylEUyGrSp6CbWVh87Drtvg4RravimmG4vS64\nT4m5b/2Ipi5aTpypAu31zR2OE+OeVfAK4ulWny9daHMFnAAqVHWf668zJWgX7S4R\nmHA8jKBSsZTfv5M+cQJBAPMcBmDquQdWyiFDKaN0/dO0N/E2+/4jmSkvIYt3AzpP\neUvF3cYNdrzI06A+DQQHODP4G+MS91l6NyiEnYGF7D0CQQDvRLsa3G6CEZrMykPQ\nR2rXat/YX7jSV7liO2E0WRiC8whb+GgMVfdEuxrtm1/v8DMf9H2lQl2uKXtnBcf2\nPav7AkEAvxdWRDP8QLKNq1uZjSxWoGPWXTp1FSxyJZcwbOmdleYGV/MuAZFvtbC9\n+AUOQg5StTbe5LxxxNl2Jdkn3TmhmQJADMVUX0iotVSPOKMLH5DQSRMxQ3FIgiGg\niXe15n9i6YpjRdVqaE4mVorOEySZ6Eqfz/LSygFS0rrwFT2fwKrmBQJBAONi0zFL\nHjOOaOGB3yjmRpBiXoWVeFPYFP3MQD/6vdgacYhyRnUfC4LeQykjdhk2Z4AjwMTY\nMvOdpQ9WjuQ7AII=\n-----END PRIVATE KEY-----\n-----BEGIN CERTIFICATE-----\nMIIDcDCCAVigAwIBAgIJANGv+1RUKgIxMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNV\nBAYTAlVTMRQwEgYDVQQDEwtHUlIgVGVzdCBDQTExMC8GCSqGSIb3DQEJARYic2Vj\ndXJpdHktaW5jaWRlbnRzLXRlYW1AZ29vZ2xlLmNvbTAeFw0xMTExMDQxMjAwMjFa\nFw0xMjExMDMxMjAwMjFaMB0xGzAZBgNVBAMTEkMuZDFhZmZiNTQ1NDJhMDIzMTCB\nnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA4zhvFSe3j1fzYLqxuLP18kKwe+MV\nHBmWrIXVH8oJFkSyQU39IaKFAhM6ssZjiaTVJ9uRQuV3LL2KYvHBr8U2tqJHHdx6\nn6yZdPsFB+KeNnW2tnaoFVxddsoEht25mNL8PnsDvfhdZNQVhtxcRNExRWj3wHaZ\nR1ziwZCeSVukXs8CAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAcEH6WTa/Dkm1K23Q\nRXH1RRcwAWblXJzPFnvbS2qMmiXm2z/TkqcSAX+jmcA/ZlX4F3eVjMVabpJZAU5P\nHtsOzcXUDT0aWvzOCSwh4PsYv8wsf17qD0egr+1ptOT+zwlECb5eG5IsOAkPVZZ3\nIGq///bMffsidxsKLhnfSFtY+iN3ftN6NCk7uRpA4PebAa12AuKtN55OhzKh/mPB\nY/+BrLpFrRW72NelrxzE0vDSSz2CuSWTEw6Tctul9YsPoSlOXbTXjgLpD63p9Vxi\nhDnxl82WFTNRdBr+bxc+N+Wn3XS9F6JUOecCginC3NZV/os3b91eXo0uUArbQObJ\n6Nc9c1SA73ZN7c1U4Itw/C05yHxgIvhJMlWOm8xOvPg52YmP3bEdxKs3J0F/w7KE\n4Tz9ESU3w26VhsmTxWO+OtqLgnAhjvFoNy0vL7nXTk1dDXpUw/nPy/MsD+qsBvT4\nxVhK9RuYEZo4J30zTFBBLTJkf0aBi921EGoPz7SmPWfHMUjYEBcAH32qSWgfopdd\n3S2q2n8TR9x8KXdMM6mCcbGj4oDYwa6n6uiT+6Fsh92yaRS5scItlvRL209psrDY\nKc2Xjiej0+tag89T1bRlphZrSELk6x9yaIs+WHBMuuXz/dheB5A3x2rZLpmdfrLD\nTsFeTagYGGTOT9rdXb2tGKpzbHo=\n-----END CERTIFICATE-----\n' p9 aS'-----BEGIN PRIVATE KEY-----\nMIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAMKAWIzIF2waoOET\nZrgMN1b/c8vdcZsXjqGzaMAiqL7GNIoydy7N4cNaRxq5bMbGne12uX+ei2L4pQeX\n8PNeAr6tzbGWBEFqJiVh2IJg/lX8Ehs9ZawPlTn5NHQT9phggkEPnwDlzp2xPo3a\n2mgP1JkvNw4qExozIGNzizj6waFVAgMBAAECgYEAlnuYhyuUO5aKnDlXgtQoyM2R\nuMwWxmi+eMsHI4htSFSvd7C911+A6ZTiaIHH8C7hJ0VxFZUDwMohXLOov5Ifyi/a\nhFgWt/8LNuUbgXEjoAlEOXbc1NlKNGdIewzxmflkfhMx9R1DQIaOVSYc5rY/gfNV\n7EM1VMj5gPpy6X2z3u0CQQDl9mLL2vUS6RUhm98PUr3lrZb4X9SWLfsqclqOy0Rn\neCgqwzVpuoIQwES5DJ91wB+V09TfAsChX8WkyiayyatLAkEA2IYYvTX3Gla06pJY\nBI3tJ8tprqCYIuL30FgX2M34ifK1cvjsyRiocHMULD1OxKuvl4pVfDDb9VqZsrlG\nvsph3wJBAI0m/h+JB7MS1MCrb3B1ZlBri+Zq1A9Wq/uy83kAtb0ZGPaemdOLArkL\ne2Nmpx5czkZmHxzAEMM9CREMcFJ/zR8CQQCWh5OHZ48k9obMVXVvpSPs+JO+XdOm\n3Vgftj7N8VQKw3u2NKyZmdTwaHDr2Kt8O0fV+Mw5jNY+mwAjqn8ugRDNAkA7+rYD\nqLbm3dxes158HksnIg0HsUofJA4jPYV67CBGXABdZWPcysUkaOYFhjeTH+fepKRa\nuz7oOVXkUe8pTSYM\n-----END PRIVATE KEY-----\n-----BEGIN CERTIFICATE-----\nMIIDbzCCAVegAwIBAgIIG1NL55TQwNAwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UE\nBhMCVVMxFDASBgNVBAMTC0dSUiBUZXN0IENBMTEwLwYJKoZIhvcNAQkBFiJzZWN1\ncml0eS1pbmNpZGVudHMtdGVhbUBnb29nbGUuY29tMB4XDTExMTEwNDEyMDAyMVoX\nDTEyMTEwMzEyMDAyMVowHTEbMBkGA1UEAxMSQy4xYjUzNGJlNzk0ZDBjMGQwMIGf\nMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDCgFiMyBdsGqDhE2a4DDdW/3PL3XGb\nF46hs2jAIqi+xjSKMncuzeHDWkcauWzGxp3tdrl/noti+KUHl/DzXgK+rc2xlgRB\naiYlYdiCYP5V/BIbPWWsD5U5+TR0E/aYYIJBD58A5c6dsT6N2tpoD9SZLzcOKhMa\nMyBjc4s4+sGhVQIDAQABMA0GCSqGSIb3DQEBCwUAA4ICAQBLM11yv6QuHzd2Xk5n\njefCYLwHE/Iw9wu8r3re0Uhs3wqtYpuXk7eEXL5eagwKjOCMtsA+iTUNSsE3gzyx\n9wyVPudbEQ6r/V23fZWyoon2eI+qqkiWyv26dxBvDLQFBjtMTgzmRjbrOE/woAza\n1od8z6IzMI2l8sVthtpyptyibSZIWHfqvaJlkPn2yFe5+TLZ7IkyfPxtU0ODhVaU\nZeg0p6rS84IWmiAXfNV4If+pG1IEUBjmppAJSA7S5R7L52b+L/Y+ZyyB7AzqLEWj\nezZn9Hwd3fW+wwMUjLMnFd57t1uMehLjn3FYOAMTndP5guEN0X593uOpGrRz68RC\n3jfxG0hMX8rDP1aUe+8sy2bglpG2biX4ecarVxvv+6QIjQQk9x3qsqmsS/ckasI8\n7vuRJJubeUWHnkf8T5thQuXk3z+2Lkl4YgjnmUmC4IHBB12Eyh63hDLWVwA0of5O\noRUifFPDTNEUj0VqJ4JfFSh6pBoy8uG+lUefkk1AKDaoE0fkl0GSEpJAtOmeGHkW\nG28BD1WI28Wq5CF6lfIqH6j8yLOYElNqXsKrgviQXx339D6kjB1+z+eyI1qXsAhY\nVfV5+HeJzVOgVcOWjxs5HoR/bMdNaHg4RkehIeCyzXZc0CeSUjMj2rLnDjsh0GX+\nFD62+QBadZzKXr2sNK9oSydX2g==\n-----END CERTIFICATE-----\n' p10 a.grr-3.1.0.2/grr/config/grr-response-test/test_data/dmesg000066400000000000000000000014061273104013200230730ustar00rootroot00000000000000[ 0.000000] Initializing cgroup subsys cpuset [ 0.000000] Initializing cgroup subsys cpu [ 0.000000] Linux version 4.5.2-as941 (root@myrootserver.com) (gcc version 1.0.0 (Ubuntu) ) #2 SMP Wed Dec 7 03:29:41 UTC 2025 [ 0.000000] Command line: BOOT_IMAGE=/vmlinuz-4.5.2 root=/dev/mapper/myhostname-root ro quiet splash [ 0.000000] BIOS-provided physical RAM map: [ 0.000000] BIOS-e820: 0000000000000000 - 0000000000096000 (usable) [ 0.000000] BIOS-e820: 00000000000f0000 - 0000000000100000 (reserved) NOT CORRECTLY FORMED LINE - SHOULD CAUSE ERROR BIOS-e820: 0000000000100000 - 00000000bfdf9c00 (usable) [ 0.000000] BIOS-e820: 00000000bfdf9c00 - 00000000bfe4bc00 (ACPI NVS) [ 0.000000] BIOS-e820: 00000000bfe4bc00 - 00000000bfe4dc00 (ACPI data) grr-3.1.0.2/grr/config/grr-response-test/test_data/dmidecode.out000066400000000000000000000675771273104013200245440ustar00rootroot00000000000000BIOS Information Vendor: Hewlett-Packard Version: J61 v02.08 Release Date: 10/17/2012 Address: 0xF0000 Runtime Size: 64 kB ROM Size: 16384 kB Characteristics: PCI is supported PNP is supported BIOS is upgradeable BIOS shadowing is allowed Boot from CD is supported Selectable boot is supported EDD is supported Print screen service is supported (int 5h) 8042 keyboard services are supported (int 9h) Serial services are supported (int 14h) Printer services are supported (int 17h) ACPI is supported USB legacy is supported BIOS boot specification is supported Function key-initiated network boot is supported Targeted content distribution is supported UEFI is supported BIOS Revision: 2.8 System Information Manufacturer: Hewlett-Packard Product Name: HP Z420 Workstation Version: Not Specified Serial Number: 2UA25107BB UUID: 4596BF80-41F0-11E2-A3B4-10604B5C7F38 Wake-up Type: Power Switch SKU Number: C2R51UC#ABA Family: 103C_53335X G=D Base Board Information Manufacturer: Hewlett-Packard Product Name: 1589 Version: 0.00 Serial Number: 2UA25107BB Asset Tag: 2UA25107BB Features: Board is a hosting board Board is removable Board is replaceable Location In Chassis: Not Specified Type: Motherboard Chassis Information Manufacturer: Hewlett-Packard Type: Mini Tower Lock: Not Present Version: Not Specified Serial Number: 2UA25107BB Asset Tag: 2UA25107BB Boot-up State: Safe Power Supply State: Safe Thermal State: Safe Security Status: Unknown OEM Information: 0x00000000 Height: Unspecified Number Of Power Cords: 1 Contained Elements: 0 SKU Number: Not Specified Processor Information Socket Designation: CPU0 Type: Central Processor Family: Xeon Manufacturer: Intel ID: D7 06 02 00 FF FB EB BF Signature: Type 0, Family 6, Model 45, Stepping 7 Flags: FPU (Floating-point unit on-chip) VME (Virtual mode extension) DE (Debugging extension) PSE (Page size extension) TSC (Time stamp counter) MSR (Model specific registers) PAE (Physical address extension) MCE (Machine check exception) CX8 (CMPXCHG8 instruction supported) APIC (On-chip APIC hardware supported) SEP (Fast system call) MTRR (Memory type range registers) PGE (Page global enable) MCA (Machine check architecture) CMOV (Conditional move instruction supported) PAT (Page attribute table) PSE-36 (36-bit page size extension) CLFSH (CLFLUSH instruction supported) DS (Debug store) ACPI (ACPI supported) MMX (MMX technology supported) FXSR (FXSAVE and FXSTOR instructions supported) SSE (Streaming SIMD extensions) SSE2 (Streaming SIMD extensions 2) SS (Self-snoop) HTT (Multi-threading) TM (Thermal monitor supported) PBE (Pending break enabled) Version: Intel(R) Xeon(R) CPU E5-1650 @ 3.20GHz Voltage: 1.2 V External Clock: 100 MHz Max Speed: 3800 MHz Current Speed: 3200 MHz Status: Populated, Enabled Upgrade: Socket LGA2011 Serial Number: Not Specified Asset Tag: Not Specified Part Number: Not Specified Core Count: 6 Core Enabled: 6 Thread Count: 12 Characteristics: 64-bit capable Multi-Core Hardware Thread Execute Protection Enhanced Virtualization Power/Performance Control Cache Information Socket Designation: L1-Cache Configuration: Enabled, Not Socketed, Level 1 Operational Mode: Write Back Location: Internal Installed Size: 384 kB Maximum Size: 384 kB Supported SRAM Types: Unknown Installed SRAM Type: Unknown Speed: Unknown Error Correction Type: Parity System Type: Unified Associativity: 8-way Set-associative Cache Information Socket Designation: L2-Cache Configuration: Enabled, Not Socketed, Level 2 Operational Mode: Write Back Location: Internal Installed Size: 1536 kB Maximum Size: 1536 kB Supported SRAM Types: Unknown Installed SRAM Type: Unknown Speed: Unknown Error Correction Type: Single-bit ECC System Type: Unified Associativity: 8-way Set-associative Cache Information Socket Designation: L3-Cache Configuration: Enabled, Not Socketed, Level 3 Operational Mode: Write Back Location: Internal Installed Size: 12288 kB Maximum Size: 12288 kB Supported SRAM Types: Unknown Installed SRAM Type: Unknown Speed: Unknown Error Correction Type: Single-bit ECC System Type: Unified Associativity: 16-way Set-associative Port Connector Information Internal Reference Designator: J68 PS2 Internal Connector Type: None External Reference Designator: PS2Mouse External Connector Type: PS/2 Port Type: Mouse Port Port Connector Information Internal Reference Designator: J68 PS2 Internal Connector Type: None External Reference Designator: Keyboard External Connector Type: PS/2 Port Type: Keyboard Port Port Connector Information Internal Reference Designator: J7 RJ45 Internal Connector Type: None External Reference Designator: LAN1 External Connector Type: RJ-45 Port Type: Network Port Port Connector Information Internal Reference Designator: J8 RJ45 Internal Connector Type: None External Reference Designator: LAN2 External Connector Type: RJ-45 Port Type: Network Port Port Connector Information Internal Reference Designator: P52 COM Internal Connector Type: None External Reference Designator: |0|0| External Connector Type: DB-9 male Port Type: Serial Port 16550A Compatible Port Connector Information Internal Reference Designator: J13 1394 Internal Connector Type: None External Reference Designator: Rear 1394 External Connector Type: IEEE 1394 Port Type: Firewire (IEEE P1394) Port Connector Information Internal Reference Designator: J12 1394 Internal Connector Type: Proprietary External Reference Designator: Front 1394 External Connector Type: IEEE 1394 Port Type: Firewire (IEEE P1394) Port Connector Information Internal Reference Designator: J83 AUDIO Internal Connector Type: None External Reference Designator: Rear mic in External Connector Type: Mini DIN Port Type: Audio Port Port Connector Information Internal Reference Designator: J83 AUDIO Internal Connector Type: None External Reference Designator: Rear headphone/line out External Connector Type: Mini DIN Port Type: Audio Port Port Connector Information Internal Reference Designator: J83 AUDIO Internal Connector Type: None External Reference Designator: Rear line in External Connector Type: Mini DIN Port Type: Audio Port Port Connector Information Internal Reference Designator: P28 FRONT AUD Internal Connector Type: Proprietary External Reference Designator: Front mic in External Connector Type: Mini DIN Port Type: Audio Port Port Connector Information Internal Reference Designator: P28 FRONT AUD Internal Connector Type: Proprietary External Reference Designator: Front headphone/line out External Connector Type: Mini DIN Port Type: Audio Port Port Connector Information Internal Reference Designator: J81 USB Internal Connector Type: None External Reference Designator: Rear USB 3.0(1) External Connector Type: Access Bus (USB) Port Type: USB Port Connector Information Internal Reference Designator: J81 USB Internal Connector Type: None External Reference Designator: Rear USB 3.0(2) External Connector Type: Access Bus (USB) Port Type: USB Port Connector Information Internal Reference Designator: P29 1394 Internal Connector Type: None External Reference Designator: Front USB 3.0(3) External Connector Type: Access Bus (USB) Port Type: USB Port Connector Information Internal Reference Designator: P29 1394 Internal Connector Type: None External Reference Designator: Front USB 3.0(4) External Connector Type: Access Bus (USB) Port Type: USB Port Connector Information Internal Reference Designator: J10 QUADUSB Internal Connector Type: None External Reference Designator: Rear USB(0) External Connector Type: Access Bus (USB) Port Type: USB Port Connector Information Internal Reference Designator: J10 QUADUSB Internal Connector Type: None External Reference Designator: Rear USB(1) External Connector Type: Access Bus (USB) Port Type: USB Port Connector Information Internal Reference Designator: J11 QUADUSB Internal Connector Type: None External Reference Designator: Rear USB(2) External Connector Type: Access Bus (USB) Port Type: USB Port Connector Information Internal Reference Designator: J11 QUADUSB Internal Connector Type: None External Reference Designator: Rear USB(3) External Connector Type: Access Bus (USB) Port Type: USB Port Connector Information Internal Reference Designator: P24 FRONT USB Internal Connector Type: Proprietary External Reference Designator: Front USB(8) External Connector Type: Access Bus (USB) Port Type: USB Port Connector Information Internal Reference Designator: P24 FRONT USB Internal Connector Type: Proprietary External Reference Designator: Front USB(9) External Connector Type: Access Bus (USB) Port Type: USB Port Connector Information Internal Reference Designator: P27 FRONT USB Internal Connector Type: Proprietary External Reference Designator: Front USB(10) External Connector Type: Access Bus (USB) Port Type: USB Port Connector Information Internal Reference Designator: P24 FRONT USB Internal Connector Type: Proprietary External Reference Designator: Front USB(13) External Connector Type: Access Bus (USB) Port Type: USB Port Connector Information Internal Reference Designator: P26 I-USB1 (4) Internal Connector Type: Proprietary External Reference Designator: Not Specified External Connector Type: None Port Type: USB Port Connector Information Internal Reference Designator: P26 I-USB1 (5) Internal Connector Type: Proprietary External Reference Designator: Not Specified External Connector Type: None Port Type: USB Port Connector Information Internal Reference Designator: P25 I-USB2 (11) Internal Connector Type: Proprietary External Reference Designator: Not Specified External Connector Type: None Port Type: USB Port Connector Information Internal Reference Designator: P25 I-USB2 (12) Internal Connector Type: Proprietary External Reference Designator: Not Specified External Connector Type: None Port Type: USB Port Connector Information Internal Reference Designator: P60 SATA0 Internal Connector Type: SAS/SATA Plug Receptacle External Reference Designator: Not Specified External Connector Type: None Port Type: SATA Port Connector Information Internal Reference Designator: P61 SATA1 Internal Connector Type: SAS/SATA Plug Receptacle External Reference Designator: Not Specified External Connector Type: None Port Type: SATA Port Connector Information Internal Reference Designator: P62 SATA2 Internal Connector Type: SAS/SATA Plug Receptacle External Reference Designator: Not Specified External Connector Type: None Port Type: SATA Port Connector Information Internal Reference Designator: P63 SATA3 Internal Connector Type: SAS/SATA Plug Receptacle External Reference Designator: Not Specified External Connector Type: None Port Type: SATA Port Connector Information Internal Reference Designator: P64 SATA4 Internal Connector Type: SAS/SATA Plug Receptacle External Reference Designator: Not Specified External Connector Type: None Port Type: SATA Port Connector Information Internal Reference Designator: P65 SATA5 Internal Connector Type: SAS/SATA Plug Receptacle External Reference Designator: Not Specified External Connector Type: None Port Type: SATA Port Connector Information Internal Reference Designator: P80 SCU0 Internal Connector Type: SAS/SATA Plug Receptacle External Reference Designator: Not Specified External Connector Type: None Port Type: SAS Port Connector Information Internal Reference Designator: P81 SCU1 Internal Connector Type: SAS/SATA Plug Receptacle External Reference Designator: Not Specified External Connector Type: None Port Type: SAS Port Connector Information Internal Reference Designator: P82 SCU2 Internal Connector Type: SAS/SATA Plug Receptacle External Reference Designator: Not Specified External Connector Type: None Port Type: SAS Port Connector Information Internal Reference Designator: P83 SCU3 Internal Connector Type: SAS/SATA Plug Receptacle External Reference Designator: Not Specified External Connector Type: None Port Type: SAS Port Connector Information Internal Reference Designator: J50-J53 (riser) Internal Connector Type: Other External Reference Designator: Not Specified External Connector Type: None Port Type: Other Port Connector Information Internal Reference Designator: P1 PWR MAIN Internal Connector Type: Other External Reference Designator: Not Specified External Connector Type: None Port Type: Other Port Connector Information Internal Reference Designator: P2 PWR MEM Internal Connector Type: Other External Reference Designator: Not Specified External Connector Type: None Port Type: Other Port Connector Information Internal Reference Designator: P5 PB/LED (Front panel) Internal Connector Type: Proprietary External Reference Designator: Not Specified External Connector Type: None Port Type: Other Port Connector Information Internal Reference Designator: P8 CPU0 FAN Internal Connector Type: Other External Reference Designator: Not Specified External Connector Type: None Port Type: Other Port Connector Information Internal Reference Designator: P9 FRNTFAN Internal Connector Type: Other External Reference Designator: Not Specified External Connector Type: None Port Type: Other Port Connector Information Internal Reference Designator: P11 REAR FANS Internal Connector Type: Other External Reference Designator: Not Specified External Connector Type: None Port Type: Other Port Connector Information Internal Reference Designator: P91 MEMFAN Internal Connector Type: Other External Reference Designator: Not Specified External Connector Type: None Port Type: Other Port Connector Information Internal Reference Designator: P8 CPU1 FAN Internal Connector Type: Other External Reference Designator: Not Specified External Connector Type: None Port Type: Other Port Connector Information Internal Reference Designator: P9 MEM FAN Internal Connector Type: Other External Reference Designator: Not Specified External Connector Type: None Port Type: Other Port Connector Information Internal Reference Designator: E49 (Password enable) Internal Connector Type: Other External Reference Designator: Not Specified External Connector Type: None Port Type: Other System Slot Information Designation: SLOT 1 Type: x1 PCI Express 2 x4 Current Usage: Available Length: Long ID: 0 Characteristics: 3.3 V is provided PME signal is supported SMBus signal is supported Bus Address: 0000:07:00.0 System Slot Information Designation: SLOT 2 Type: x16 PCI Express 3 Current Usage: In Use Length: Long Characteristics: 3.3 V is provided PME signal is supported SMBus signal is supported Bus Address: 0000:05:00.0 System Slot Information Designation: SLOT 3 Type: x4 PCI Express 2 x8 Current Usage: Available Length: Long ID: 2 Characteristics: 3.3 V is provided PME signal is supported SMBus signal is supported Bus Address: 0000:06:00.0 System Slot Information Designation: SLOT 4 Type: x8 PCI Express 3 Current Usage: Available Length: Long Characteristics: 3.3 V is provided PME signal is supported SMBus signal is supported Bus Address: 0000:03:00.0 System Slot Information Designation: SLOT 5 Type: x16 PCI Express 3 Current Usage: Available Length: Long Characteristics: 3.3 V is provided PME signal is supported SMBus signal is supported Bus Address: 0000:04:00.0 System Slot Information Designation: SLOT 6 Type: 32-bit PCI Current Usage: Available Length: Long ID: 5 Characteristics: 5.0 V is provided 3.3 V is provided PME signal is supported SMBus signal is supported Bus Address: 0000:09:00.0 OEM Strings String 1: ABS 70/71 60 61 62 63; String 2: FBYTE#3X47676J6S6b7N7Q7T7U7W7a8H8h9Y.2d; String 3: BUILDID#11WWVAEW601#SABA#DABA; Physical Memory Array Location: System Board Or Motherboard Use: System Memory Error Correction Type: Multi-bit ECC Maximum Capacity: 256 GB Number Of Devices: 8 32-bit Memory Error Information Type: OK Granularity: Unknown Operation: Unknown Vendor Syndrome: Unknown Memory Array Address: Unknown Device Address: Unknown Resolution: Unknown Memory Array Mapped Address Starting Address: 0x00000000000 Ending Address: 0x000DFFFFFFF Range Size: 3584 MB Partition Width: 1 Memory Array Mapped Address Starting Address: 0x00100000000 Ending Address: 0x0081FFFFFFF Range Size: 29184 MB Partition Width: 1 Memory Device Total Width: 72 bits Data Width: 64 bits Size: 8192 MB Form Factor: DIMM Set: None Locator: CPU0-DIMM1 Bank Locator: CPU0 Type: DDR3 Type Detail: Synchronous Unbuffered (Unregistered) Speed: 1600 MHz Manufacturer: Kingston Serial Number: 2D3888C9 Asset Tag: Not Specified Part Number: 9965525-024.A00LF Rank: 2 Configured Clock Speed: 1600 MHz 32-bit Memory Error Information Type: OK Granularity: Unknown Operation: Unknown Vendor Syndrome: Unknown Memory Array Address: Unknown Device Address: Unknown Resolution: Unknown Memory Device Total Width: 72 bits Data Width: 64 bits Size: No Module Installed Form Factor: DIMM Set: None Locator: CPU0-DIMM2 Bank Locator: CPU0 Type: Unknown Type Detail: Synchronous Speed: Unknown Manufacturer: Serial Number: Asset Tag: Not Specified Part Number: Rank: Unknown Configured Clock Speed: Unknown 32-bit Memory Error Information Type: OK Granularity: Unknown Operation: Unknown Vendor Syndrome: Unknown Memory Array Address: Unknown Device Address: Unknown Resolution: Unknown Memory Device Total Width: 72 bits Data Width: 64 bits Size: 8192 MB Form Factor: DIMM Set: None Locator: CPU0-DIMM3 Bank Locator: CPU0 Type: DDR3 Type Detail: Synchronous Unbuffered (Unregistered) Speed: 1600 MHz Manufacturer: Kingston Serial Number: 2D381FF1 Asset Tag: Not Specified Part Number: 9965525-024.A00LF Rank: 2 Configured Clock Speed: 1600 MHz 32-bit Memory Error Information Type: OK Granularity: Unknown Operation: Unknown Vendor Syndrome: Unknown Memory Array Address: Unknown Device Address: Unknown Resolution: Unknown Memory Device Total Width: 72 bits Data Width: 64 bits Size: No Module Installed Form Factor: DIMM Set: None Locator: CPU0-DIMM4 Bank Locator: CPU0 Type: Unknown Type Detail: Synchronous Speed: Unknown Manufacturer: Serial Number: Asset Tag: Not Specified Part Number: Rank: Unknown Configured Clock Speed: Unknown 32-bit Memory Error Information Type: OK Granularity: Unknown Operation: Unknown Vendor Syndrome: Unknown Memory Array Address: Unknown Device Address: Unknown Resolution: Unknown Memory Device Total Width: 72 bits Data Width: 64 bits Size: No Module Installed Form Factor: DIMM Set: None Locator: CPU0-DIMM5 Bank Locator: CPU0 Type: Unknown Type Detail: Synchronous Speed: Unknown Manufacturer: Serial Number: Asset Tag: Not Specified Part Number: Rank: Unknown Configured Clock Speed: Unknown 32-bit Memory Error Information Type: OK Granularity: Unknown Operation: Unknown Vendor Syndrome: Unknown Memory Array Address: Unknown Device Address: Unknown Resolution: Unknown Memory Device Total Width: 72 bits Data Width: 64 bits Size: 8192 MB Form Factor: DIMM Set: None Locator: CPU0-DIMM6 Bank Locator: CPU0 Type: DDR3 Type Detail: Synchronous Unbuffered (Unregistered) Speed: 1600 MHz Manufacturer: Kingston Serial Number: 2D38ABD6 Asset Tag: Not Specified Part Number: 9965525-024.A00LF Rank: 2 Configured Clock Speed: 1600 MHz 32-bit Memory Error Information Type: OK Granularity: Unknown Operation: Unknown Vendor Syndrome: Unknown Memory Array Address: Unknown Device Address: Unknown Resolution: Unknown Memory Device Total Width: 72 bits Data Width: 64 bits Size: No Module Installed Form Factor: DIMM Set: None Locator: CPU0-DIMM7 Bank Locator: CPU0 Type: Unknown Type Detail: Synchronous Speed: Unknown Manufacturer: Serial Number: Asset Tag: Not Specified Part Number: Rank: Unknown Configured Clock Speed: Unknown 32-bit Memory Error Information Type: OK Granularity: Unknown Operation: Unknown Vendor Syndrome: Unknown Memory Array Address: Unknown Device Address: Unknown Resolution: Unknown Memory Device Total Width: 72 bits Data Width: 64 bits Size: 8192 MB Form Factor: DIMM Set: None Locator: CPU0-DIMM8 Bank Locator: CPU0 Type: DDR3 Type Detail: Synchronous Unbuffered (Unregistered) Speed: 1600 MHz Manufacturer: Kingston Serial Number: 2E3874F1 Asset Tag: Not Specified Part Number: 9965525-024.A00LF Rank: 2 Configured Clock Speed: 1600 MHz 32-bit Memory Error Information Type: OK Granularity: Unknown Operation: Unknown Vendor Syndrome: Unknown Memory Array Address: Unknown Device Address: Unknown Resolution: Unknown System Boot Information Status: No errors detected Management Device Description: LM78-1 Type: LM78 Address: 0x00000000 Address Type: I/O Port Voltage Probe Description: LM78A Location: Status: Maximum Value: Unknown Minimum Value: Unknown Resolution: Unknown Tolerance: Unknown Accuracy: Unknown OEM-specific Information: 0x00000000 Nominal Value: Unknown Management Device Threshold Data Lower Non-critical Threshold: 1 Upper Non-critical Threshold: 2 Lower Critical Threshold: 3 Upper Critical Threshold: 4 Lower Non-recoverable Threshold: 5 Upper Non-recoverable Threshold: 6 Management Device Component Description: To Be Filled By O.E.M. Temperature Probe Description: LM78A Location: Status: Maximum Value: Unknown Minimum Value: Unknown Resolution: Unknown Tolerance: Unknown Accuracy: Unknown OEM-specific Information: 0x00000000 Nominal Value: Unknown Management Device Threshold Data Lower Non-critical Threshold: 1 Upper Non-critical Threshold: 2 Lower Critical Threshold: 3 Upper Critical Threshold: 4 Lower Non-recoverable Threshold: 5 Upper Non-recoverable Threshold: 6 Management Device Component Description: To Be Filled By O.E.M. Cooling Device Type: Status: Cooling Unit Group: 1 OEM-specific Information: 0x00000000 Nominal Speed: Unknown Or Non-rotating Description: Cooling Dev 1 Management Device Threshold Data Lower Non-critical Threshold: 1 Upper Non-critical Threshold: 2 Lower Critical Threshold: 3 Upper Critical Threshold: 4 Lower Non-recoverable Threshold: 5 Upper Non-recoverable Threshold: 6 Management Device Component Description: To Be Filled By O.E.M. Cooling Device Type: Status: Cooling Unit Group: 1 OEM-specific Information: 0x00000000 Nominal Speed: Unknown Or Non-rotating Description: Not Specified Management Device Threshold Data Lower Non-critical Threshold: 1 Upper Non-critical Threshold: 2 Lower Critical Threshold: 3 Upper Critical Threshold: 4 Lower Non-recoverable Threshold: 5 Upper Non-recoverable Threshold: 6 Management Device Component Description: To Be Filled By O.E.M. Electrical Current Probe Description: ABC Location: Status: Maximum Value: Unknown Minimum Value: Unknown Resolution: Unknown Tolerance: Unknown Accuracy: Unknown OEM-specific Information: 0x00000000 Nominal Value: Unknown Management Device Threshold Data Management Device Component Description: To Be Filled By O.E.M. Voltage Probe Description: LM78A Location: Power Unit Status: OK Maximum Value: Unknown Minimum Value: Unknown Resolution: Unknown Tolerance: Unknown Accuracy: Unknown OEM-specific Information: 0x00000000 Nominal Value: Unknown Temperature Probe Description: LM78A Location: Power Unit Status: OK Maximum Value: Unknown Minimum Value: Unknown Resolution: Unknown Tolerance: Unknown Accuracy: Unknown OEM-specific Information: 0x00000000 Nominal Value: Unknown Cooling Device Type: Power Supply Fan Status: OK Cooling Unit Group: 1 OEM-specific Information: 0x00000000 Nominal Speed: Unknown Or Non-rotating Description: Cooling Dev 1 Electrical Current Probe Description: ABC Location: Power Unit Status: OK Maximum Value: Unknown Minimum Value: Unknown Resolution: Unknown Tolerance: Unknown Accuracy: Unknown OEM-specific Information: 0x00000000 Nominal Value: Unknown System Power Supply Power Unit Group: 1 Location: Name: Manufacturer: Serial Number: Asset Tag: Model Part Number: Standard Efficiency Revision: Max Power Capacity: Unknown Status: Present, OK Type: Switching Input Voltage Range Switching: Auto-switch Plugged: Yes Hot Replaceable: No IPMI Device Information Interface Type: KCS (Keyboard Control Style) Specification Version: 2.0 I2C Slave Address: 0x10 NV Storage Device: Not Present Base Address: 0x0000000000000000 (Memory-mapped) Register Spacing: Successive Byte Boundaries BIOS Language Information Language Description Format: Long Installable Languages: 12 en|US|iso8859-1 fr|FR|iso8859-1 es|ES|iso8859-1 de|DE|iso8859-1 it|IT|iso8859-1 da|DK|iso8859-1 fi|FI|iso8859-1 nl|NL|iso8859-1 nb|NO|iso8859-1 pt|BR|iso8859-1 sv|FI|iso8859-1 ja|JP|unicode Currently Installed Language: en|US|iso8859-1 Port Connector Information Internal Reference Designator: HLCK Internal Connector Type: Other External Reference Designator: Not Specified External Connector Type: Other Port Type: Other Port Connector Information Internal Reference Designator: HSNR Internal Connector Type: Other External Reference Designator: Not Specified External Connector Type: Other Port Type: Other grr-3.1.0.2/grr/config/grr-response-test/test_data/dpkg_status000066400000000000000000000011211273104013200243160ustar00rootroot00000000000000Package: t1 Status: install ok installed Priority: optional Section: web Installed-Size: 10 Maintainer: package-builder Architecture: amd64 Version: v1 Provides: t1 Depends: t2 Size: 10 Description: Test package entry Package: t2 Status: install ok installed Priority: optional Section: web Installed-Size: 20 Maintainer: package-builder Architecture: amd64 Version: v2 Provides: t2 Filename: pool/main/t/test/t2_v2_amd64.deb Size: 20 Description: Test package entry Package: ohiambroken Status: install ok not-installed grr-3.1.0.2/grr/config/grr-response-test/test_data/empty_file000066400000000000000000000000001273104013200241160ustar00rootroot00000000000000grr-3.1.0.2/grr/config/grr-response-test/test_data/exports000066400000000000000000000003531273104013200235000ustar00rootroot00000000000000/path/to/foo -rw,sync,no_root_squash host1(ro,sec=sys) host2 /path/to/bar *.example.org(all_squash,ro) \ 192.168.1.0/24 (rw) # Mistake here - space makes this default. /path/to/good ro host3 /path/to/bad (sec=none) *.example.org(rw) grr-3.1.0.2/grr/config/grr-response-test/test_data/grr_test.yaml000066400000000000000000000353631273104013200245770ustar00rootroot00000000000000# This file is used for running the GRR unit tests. It is appended to the server # configuration file (which normally has no keys) to create a test working # configuration. Client.private_key: | -----BEGIN PRIVATE KEY----- MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMdgLNxyvDnQsuqp sgoxcDksO0SkTbw4N07tU9LqASsXV3JzUsAg3jwUxuHlJ1aEIgdm+ATSc+Mi9yYu dYZonACGAwx4fO9b2X36gFEOLmw8zZFjJRVqbT6ZxohUFmaReeLgVx56U24CiDqb +hBjSItDX1oGQg8lCHrZOBQ1PFLrAgMBAAECgYBuur1vmdFsErqrlZ+qBZccSbKJ Bu+db2NYVHrPkuMfOZF5oQ7+YcLLf4aNgyV76Vq03b01gGSYa5zz+a2P/p1UuRIC DskgLApXXmP+WemAgAV22QyRQQYSUvSr5JIR46GW9JWBgs98f/6IUNUUne6and9M k5GlHlX5z7TRZCw6IQJBAPfe5qWdUl1xB9QuHOcAnkYYaybFUIzWYSk0IJ3NiNmQ MrpljWdNx0/dC2bSFjhTCNkf4sc8aSfZToi5Y7ze4bkCQQDN6h1ZmJkIZ+crqCj/ sdiH+Ykba3+eOTo+oMoV+w9VcxZpdefV5S0NfXrAFUzt329WVH4MYV9fz/Rb+6Lc VvvDAkEAj7+GNW+6T5R4fNXNTy5tm6sXoSF3KGY/bLzdWYbUIZBdyvmP+uQBfdBs h1G5LysAi6LRSsg/F6wPvnz9WZBMiQJAdCIP/5Ii7Sy8olCrHtrNBpNkEoTkavZX tS62CwOXuFe6UixfXrFsYWldq6vXwWj8wDHTDWR1h/IfHSmkxqSARQJBANEyt/lQ Decnn0QintT3zNAV26lnf8vABdrnp/IaqgFhfjW8NlBEHLpcKY0Cow+qNiCh7pxj jzITFeE6mjs3k1I= -----END PRIVATE KEY----- Client.driver_signing_public_key: | -----BEGIN PUBLIC KEY----- MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALnfFW1FffeKPs5PLUhFOSkNrr9TDCOD QAI3WluLh0sW7/ro93eoIZ0FbipnTpzGkPpriONbSOXmxWNTo0b9ma8CAwEAAQ== -----END PUBLIC KEY----- Client.executable_signing_public_key: | -----BEGIN PUBLIC KEY----- MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMQpeVjrxmf6nPmsjHjULWhLmquSgTDK GpJgTFkTIAgX0Ih5lxoFB5TUjUfJFbBkSmKQPRA/IyuLBtCLQgwkTNkCAwEAAQ== -----END PUBLIC KEY----- CA.certificate: | -----BEGIN CERTIFICATE----- MIIGCzCCA/OgAwIBAgIJAIayxnA7Bp+3MA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNV BAYTAlVTMQwwCgYDVQQIEwNDQUwxCzAJBgNVBAcTAlNGMRQwEgYDVQQDEwtHUlIg VGVzdCBDQTAeFw0xMTA1MjcxMjE0MDlaFw0yMTA1MjQxMjE0MDlaMD4xCzAJBgNV BAYTAlVTMQwwCgYDVQQIEwNDQUwxCzAJBgNVBAcTAlNGMRQwEgYDVQQDEwtHUlIg VGVzdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANI1Xr3HZdkM g8Eqa4BgnrlZbh01kLHkq+kUGlcoyuNns9BqWS2drd8ITU1Tk788Gu7uQPVMZV2t nQlol/0IWpq5hdMBFOb6AnMs0L02nLKEOsdXXwm5E1MFePl67SPdB3lUgDUwEemp P5nPYe2yFoWQQQdFWJ75Ky+NSmE6yy+bsqUFP2cAkpgvRTe1aXwVLFQdjXNgm02z uG1TGoKc3dnlwe+fAOtuA8eD7dPARflCCh8yBNiIddTpV+oxsZ2wwn+QjvRgj+ZM 8zxjZPALEPdFHGo3LFHO3IBA9/RF69BwlogCG0b1L9VUPlTThYWia9VN5u07NoyN 9MGOR32CpIRG+DB4bpU3kGDZnl+RFxBMVgcMtr7/7cNvsQ0oSJ8nNyuc9muceylq 8h1h2cXQwBpsqxAxuwuu55tR+oJtWhCfhB116ipsI2CglBhzENfX1PUv/argtlx8 0Ct5Pb/3DbtHIdolxNTAp6FfhvkDWLIHXGuZJosRcOQjnjYAEo8C5vs9f4fgvKJ0 Ffh8aOMIiKwyi6VXdz5GJtGPZl5mUKT3XpFmk+BCHxty4hJORB8zusc0Yz31T2cQ xwTdFUwbVW/sdkTtBG5KzcJ7aGcVqrjaFTkQ/e2xU4HP6hhE2u8lJhAkUzpKVxdf 4VqPzV2koi7D5xpojoyL+5oYXh7rxGM1AgMBAAGjggEKMIIBBjAdBgNVHQ4EFgQU O4+Xefeqvq3W6/eaPxaNv8IHpcswbgYDVR0jBGcwZYAUO4+Xefeqvq3W6/eaPxaN v8IHpcuhQqRAMD4xCzAJBgNVBAYTAlVTMQwwCgYDVQQIEwNDQUwxCzAJBgNVBAcT AlNGMRQwEgYDVQQDEwtHUlIgVGVzdCBDQYIJAIayxnA7Bp+3MA8GA1UdEwEB/wQF MAMBAf8wEQYJYIZIAYb4QgEBBAQDAgEGMAkGA1UdEgQCMAAwKwYJYIZIAYb4QgEN BB4WHFRpbnlDQSBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwCQYDVR0RBAIwADAOBgNV HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggIBAACRLafixRV4JcwND0eOqZ+r J8ma3LAa8apbWNLgAa9xJUTKEqofxCF9FmegYCWSTRUv43W7lDCIByuKl5Uwtyzh DzOB2Z3+q1KWPGn7ao+wHfoS3b4uXOaGFHxpR2YSyLLhAFOS/HV4dM2hdHisaz9Z Fz2aQRTq70iHlbUAoVY4Gw8zfN+JCLp93fz30dtRats5e9OPtf3WTcERHpzBI7qD XjSexd/XxlZYFPVyN5dUTYCC8mAdsawrEv5U70fVcNfILCUY2wI+1XSARPSC94H7 +WqZg6pVdyu12wkSexlwneSBa2nQKFLhAZOzXpi2Af2tUI31332knSP8ZUNuQ3un 3qi9qXtcQVXjWkVYvkjfkZiymaGS6bRml5AC2G2vhaDi4PWml79gCHQcN0Lm9Epb ObHvoRNuPU9YkbrVBwNzGHUfEdSN433OVLNp+9CAFcfYaJyMJiV4YAiutITQQkBM 3zT4U/FDjnojGp6nZQl9pxpK6iq2l1cpo0ZcfQJ870CLnBjWMkvEa6Mp+7rMZUEB yKIpQoCislf1ODyl0s037u2kip7iby5CyWDe2EUhcZxByE10s2pnBPsKsT0TdZbm Cq6toF4BeLtlB2flxNLgGa63yuWRWqb6Cq7RbDlPlRXpaXAUnigQGYvmFl4M03i5 ImKbVCFIXYW/vECT2R/v -----END CERTIFICATE----- Frontend.certificate: | -----BEGIN CERTIFICATE----- MIIF7zCCA9egAwIBAgIBATANBgkqhkiG9w0BAQUFADA+MQswCQYDVQQGEwJVUzEM MAoGA1UECBMDQ0FMMQswCQYDVQQHEwJTRjEUMBIGA1UEAxMLR1JSIFRlc3QgQ0Ew HhcNMTEwNTI3MTIxNTExWhcNMTIwNTI2MTIxNTExWjBCMQswCQYDVQQGEwJVUzEM MAoGA1UECBMDQ0FMMQswCQYDVQQHEwJTRjEYMBYGA1UEAxMPR1JSIFRlc3QgU2Vy dmVyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwUXBNzWSoEr88dGQ qZWSwgJ+n/A/QQyNn/ZM57XsqI6IMO6plFmA+DZv2FkTTdniNPmhuL9mjWYA5yg4 KYMbz5igOiBoF9RBeIm2/v2Sg65VFoyCgJNgl3V34mpoDCHBYTi2A/OfoKeSQISb UfMHsYhPHdGfhjk8dEuMo7MxjrtfAO3Y4QtjTiE07eNdoRQkFtzF0m9oSaytJ95c BAe1eQ/2zcvxPvnF5yavR4fwKQtk8o1hc21XVG0JvqJ7da79C27cQQP3E/6EYzpN pkh9n4berPBHV/oxlB2np4zKgXCQ4zDdiw1uEUY9+iFmVEuvzO2e5NJcfnu74sGb oX+2a2/ph65sMZ2/NF8lRgetvIrtYUl15yypXmH3VobBYvpfGpab1rLt0J1HoVUh V5Nsrdav0n8EQ+hln/sHz+G5rNe4ZSJbZ8w8b1TOwTENdzOYKAQH/NN9IrsbXNgE 8RHSHfPwibWnhfKS/fy7GO8qah/u2HPQ5S33gao409zbwS6c4sn0nAQhr5H6pHVD iMLcBPFQ+w6zIk28hOv3GMa5XQtm8ONb/QhOLTbtB+ZCHKCw3bXASVDt7EwvnM/b cSYS58wKmUQhH3unizXyihLhxC8ck/KMTkGnuGBC0Pz2d6YgcdL4BxAK6udSjSQQ DB8sWYKJJrmlCnaN2E1eBbPV5PMCAwEAAaOB8zCB8DAJBgNVHRMEAjAAMBEGCWCG SAGG+EIBAQQEAwIGQDArBglghkgBhvhCAQ0EHhYcVGlueUNBIEdlbmVyYXRlZCBD ZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUywgOS64OISRSFNqpMpF83qXKDPIwbgYDVR0j BGcwZYAUO4+Xefeqvq3W6/eaPxaNv8IHpcuhQqRAMD4xCzAJBgNVBAYTAlVTMQww CgYDVQQIEwNDQUwxCzAJBgNVBAcTAlNGMRQwEgYDVQQDEwtHUlIgVGVzdCBDQYIJ AIayxnA7Bp+3MAkGA1UdEgQCMAAwCQYDVR0RBAIwADANBgkqhkiG9w0BAQUFAAOC AgEAY6z2VZdS83i6N88hVk3Y8qt0xNhP10+tfgsI7auPq2n3PsDNOLPvp2OcUcLI csMQ/3GTI84uRm0GFnLMAc+A8BQZ14+3kPRju5jWe3KMfP1Ohz5Hm36Uf47tFhgV VYnyIPwwCE1QPOgbnFt5jR+d3pjhx9TvjfeFKmavxMpxnDD2KWgGZfuE1UqC0DXm rkimG2Q+dHUFBOMBUKzaklZsr7v4hlc+7XY1n5vRhiuczS9m5mVB05Cg4mrJFcVs AUsxSuwgMhJqxuNaFw8qMmdkX7ujo5HAtwJqIi91Sdj8xNRqDysd1OagqL3Mx172 wTJu7ZIAURpw52AXxn3PpK5NS3NSvL/PE6SnpHCtfkxaHl/80W2oq7MjSaHbQt2g 8vYuwLEKYVhgEBzEK0p5AqDyabAn49bw9hfT10NElJ/tYEPCKZZwrARBHnpCxLeC jJVIIMzPOczWnTDw92ls3l6+l075MOzXGo94GNlxt0/HLCQktl9cuF1APmRkiGUe EaQA1dggxMyZGyZpYmEbrWCiEjKqfIXXnpyw5pxL5Rvoe4kYrQBvbJ1aaWJ87Pcz gXJvjIkzp4x/MMAgdBOqJm5tJ4nhCHTbXWuIbYymPLn7hqXhyrDZwqnH7kQKPF2/ z5KjO8gWio6YOhsDwrketcBcIANMDYws2+TzrLs9ttuHNS0= -----END CERTIFICATE----- Frontend.bind_address: 127.0.0.1 Frontend.bind_port: 8080 HTTPServer Context: Logging.filename: "%(Logging.path)/grr-http-server.log" PrivateKeys.ca_key: | -----BEGIN RSA PRIVATE KEY----- MIIJJwIBAAKCAgEA0jVevcdl2QyDwSprgGCeuVluHTWQseSr6RQaVyjK42ez0GpZ LZ2t3whNTVOTvzwa7u5A9UxlXa2dCWiX/QhamrmF0wEU5voCcyzQvTacsoQ6x1df CbkTUwV4+XrtI90HeVSANTAR6ak/mc9h7bIWhZBBB0VYnvkrL41KYTrLL5uypQU/ ZwCSmC9FN7VpfBUsVB2Nc2CbTbO4bVMagpzd2eXB758A624Dx4Pt08BF+UIKHzIE 2Ih11OlX6jGxnbDCf5CO9GCP5kzzPGNk8AsQ90UcajcsUc7cgED39EXr0HCWiAIb RvUv1VQ+VNOFhaJr1U3m7Ts2jI30wY5HfYKkhEb4MHhulTeQYNmeX5EXEExWBwy2 vv/tw2+xDShInyc3K5z2a5x7KWryHWHZxdDAGmyrEDG7C67nm1H6gm1aEJ+EHXXq KmwjYKCUGHMQ19fU9S/9quC2XHzQK3k9v/cNu0ch2iXE1MCnoV+G+QNYsgdca5km ixFw5COeNgASjwLm+z1/h+C8onQV+Hxo4wiIrDKLpVd3PkYm0Y9mXmZQpPdekWaT 4EIfG3LiEk5EHzO6xzRjPfVPZxDHBN0VTBtVb+x2RO0EbkrNwntoZxWquNoVORD9 7bFTgc/qGETa7yUmECRTOkpXF1/hWo/NXaSiLsPnGmiOjIv7mhheHuvEYzUCAwEA AQKCAgBwUcgfy42mHkPAUTRD0ly9WQW3YcnA5BjfX7h7Xfaa7+xqroicESa4h60W ZlQJ2MnjZTccWwfGuF+yiUq9D1uqVPsmtes/R9NLS2T11VqBIJpvrUXA4j1rHP94 /q/7e7zknbwrr1XC7oZnXyJKaeAS2fOFOQ6TUzw6Glrl/Q5Yj+8ysc0g8nNiEdAA ZlTI0l9vSqMsRTB2olMnR0JhDASWy2eG7AUHxy8JynqnrJM3DoxuAsIIGVIsw8oP /yGSysICe3GHLpl1SySk3c8vXBpipXD7aCOsSsYTWaOjyECqjZ5Bai69CYHXkT4F AUjVEOZhgVCk7gDFtYxUZ/vXGplghMpkb5de9uTGptraMmypEjUon4bOlpd62CDI wHva4bry6H+O4kp8pVHOV0XO7N1964rA2+N2/wT9AIAFIq5th2OAO9xZbX1sQTeL 6a6CsNrWnd2KkpwOs+RQqSd/iOpb/BSbxMS7nsFBP7N4mW+MLAbUCYvdIT4ixuVp GZvn8SvYtNcr4H0DgEXcg3JkDAgWOIfd664zfGy8hxUg8Ob0huKK0IgVRryptpjJ fiEWcXQ6RAaaww9di2Iimu7dfh7u2llUyYNy9Gw6dGtHfCWOe1COkMG8QdkwIxyJ RFH7eq33bioFC+F2ZPl0fD0R+LILKK/sCjvL37SEJP8AAMR4+QKCAQEA6VXgu0qM mjAfQ7jPoky3vTb1Jj7CmhzU7gk/Uczlw5lDsCKf+qyryFYJJlq0/U4JHZ1qehOF cG0JPh31gg5IbFYdTvFDnDHxwmDVyzty9bjffXdb1BpB045S81x79kxOQHKUO0bY 4m9Pw9+QieziRokjhWlBEWYsmvQEIG44UqHSRMY/j1HRA2a2dlrU7FlfZW0FKblH gA4dFac70SNTq8TeaFeSFt8eBZowKjRBX7x/6HKDKCVX5EaHDIN74EYw2XHB+DPd 8YS8CCogDboIinBsQYscmufz5E3gNPwmZAvkon8YM34EnEaLAB7NZJYCh0ynMSpo AosywHiH7xweZwKCAQEA5qBqmQr0WRj7XQKE03jWVm8R+6TmpV+UKnVPphzHmpQe q50wuR3+QgyIMt5sO1q2SQKIS47/mGI9tAcV9QWv6mr1YZV0VKM2WllaxXekI3gg zeElbAlqiU2CZOxFLynfQdZMPKEoxeYXB3Me+3WvAVN6fN2RQU0NcInpXD/0Kf3x GXnOqKPTYBgogBcYOYr43zSKEzB3rtytuNMIv0HVxyA3DqYAmSgngv1JPehir4YB /bJdekqOtTJMVEtlMohJdeJCv8SOemwq9Ean8Yw5DjE8cnTXdyR3iIh2k0otYtvl 6PR3UOtGRVajA13tRWJV8fvz2euErIbZHQJuCPq4AwKCAQBErexZ9FVyRNvO+STU ZrRmUzjRKwPojLf34GzszNyMOB5+R5LDG/PsIbbLvUMsk72HJABlMj3Cm7VuvS64 OzACA07ZH5aA8Qpx5kLHcRYjUWkm6uzyf1AEzw2HaB9snYUi3xbWY8IO1CisRK+s iTcI//Ceoh5u2p4iddSJHygg2lSjvZ6TtsdIswDd0Vp+vsefePleEJUFEiJpbzHi Gv3TvzyfhbcQWFfj2kB3C656WWdkqeAE/wjhvgieHE1n9AEI37zyK4IWRrV5ybxp jepZpUGYATRIPCHDf1CRB+7c38tKMRKUhXEh9nmPbYGTK7xOyrcjd5HpvcMQd+m6 7ZHdAoIBAEpJZczCQI7qgx0kkJBlnfTddhduuHSQYvOCMhO5tXnPOEnjKiyWwq2X x89K4eYEhC7kR+6+swnsqx9wINx55n5F0aCLOZuBryJPIfP1Y8OhEEAAw8MXDWAI vXWwvWBBxo44bvoglzeXs9dMd7Bb6fEtaIkL/ZvhK/ESGz8Bwq48BAtGtxCPJKkR XwpTZhQy9ZNAIzGnLQYAQ10DbQ/eLvQjJljrk8nBq2iAGbV9Qzxyl/WWHJIlre4j s357gq9SQwdbyFBpCdPZP8TLdZFSr5YoueXMSRMxhedOvZMYE6KCXn45MK25+zqe e4e8G49761803wlU2bmQ/iJgA/2UdO0CggEAVK2NSNYQKm7sZ113LYA3YvBF46wU kW/il7acKjE7Eo0EMLQ3YUYT1iuUI8LeupM0c1htjVdaC5QXeVLDZYNvlOjiaLo/ R3ZyMxDzkHOnBGIy9e9xXtW3tpQSlOy8rpb3az2XrjwUMEv77PO5pG+rHZYLJGeI 1iZnvNz85PRoA284B4Cxs8oin+mip4TKdp/2noF+vrWAG3HTOVxAqk3GCKUipXwI 2lKE9xGFDbjr99noxkJKRDdVd8UTZg8ZPnr7VtDEutDIzDi7ikkBFYurGjTvSpF+ rWUPICL/s+ez5PMfHkmkd+/uf3lym0BW/erSWrqzJvlA2MMlEpHx43kUVw== -----END RSA PRIVATE KEY----- PrivateKeys.server_key: | -----BEGIN RSA PRIVATE KEY----- MIIJKAIBAAKCAgEAwUXBNzWSoEr88dGQqZWSwgJ+n/A/QQyNn/ZM57XsqI6IMO6p lFmA+DZv2FkTTdniNPmhuL9mjWYA5yg4KYMbz5igOiBoF9RBeIm2/v2Sg65VFoyC gJNgl3V34mpoDCHBYTi2A/OfoKeSQISbUfMHsYhPHdGfhjk8dEuMo7MxjrtfAO3Y 4QtjTiE07eNdoRQkFtzF0m9oSaytJ95cBAe1eQ/2zcvxPvnF5yavR4fwKQtk8o1h c21XVG0JvqJ7da79C27cQQP3E/6EYzpNpkh9n4berPBHV/oxlB2np4zKgXCQ4zDd iw1uEUY9+iFmVEuvzO2e5NJcfnu74sGboX+2a2/ph65sMZ2/NF8lRgetvIrtYUl1 5yypXmH3VobBYvpfGpab1rLt0J1HoVUhV5Nsrdav0n8EQ+hln/sHz+G5rNe4ZSJb Z8w8b1TOwTENdzOYKAQH/NN9IrsbXNgE8RHSHfPwibWnhfKS/fy7GO8qah/u2HPQ 5S33gao409zbwS6c4sn0nAQhr5H6pHVDiMLcBPFQ+w6zIk28hOv3GMa5XQtm8ONb /QhOLTbtB+ZCHKCw3bXASVDt7EwvnM/bcSYS58wKmUQhH3unizXyihLhxC8ck/KM TkGnuGBC0Pz2d6YgcdL4BxAK6udSjSQQDB8sWYKJJrmlCnaN2E1eBbPV5PMCAwEA AQKCAgAeAna929Ooj/w2kBOmQVNITJrcurEXqJtU+yl10QmuInODJYuvPTaJU+qJ 7UrSC8LT9u7lgNKroesB+Xy+9VycH1bBr8Z57Ls9vCRt83GMgMU1exvIWxnkapjy zxLYz2T3c5bPhkSC7YIIAo8bamEHb+LY/nOGo9x/MjvkLy7CutVFj6jdSKdiukU9 qtAe8sGnyx/sTOAkkGtShXREK+5Bnfj0e3Y6EQ5pldghgzoHJX3HK6y1/4RP155r u07wNvuTiuMoNTVoJVzpC2SDLT5URtzMfYKWZoLMPM6LdZD8CD53CF9d9/ffNsjo zcbVz+q8JylE3mT+PrgtvWIs8WehgXv8Xvtvo9oDApBJ/0Zsm5Vo+mGrPSTn57M6 7z4gKBBVHvEzyExpZsu/H78ZUegI/Ma5JPKcBK0a+VHA5+FLiRCj/H7+wPyX2x2Y fr2LB1OTFpGnqCsN/cdVPuctdmnAbuCuduGdpEY8/5UcmjltwdzwaVw2Djn4pKTi 8HepsL5TZ0r6sAeW+uRtGicMDdGbBIRER+lQm/FQnNHDM7j02ERXYRC/6HnKEvDH foL+Ja2Q4Yn3ys9+Su0JxG3j3wFFT7WAOL+SBarLJ+uFXJANI3vZHz47vRinfLlU z+wp9X06xzhS8bg2XD77TbjNgRvxEinlezwDWHL3hxg2fExOAQKCAQEA+NbU+8bw ID0udVfCFGCNFtwkfvLZ9Zw/3pzLyw96UzEIuSUMK9Lx5bjzSCNTNp0rQeYrY2ke LvtJrAHLiUPx8xRGUUoJZlpFs1so0CYBwDDMxbkWaNvgYAmToBfBnJIRyi2VfQKD CGT8GRSpQpko6yftqFYy2/4WvPDJlaR5MVb5kY5a2u3PlLQaZ/5Oy1hfRcrWE9xm peswTqX82OVycbkO/qxTVx/5gC20/DEPLTin+2g4sdNqwH8pPJfmig0LnsIaJKt2 SGQiUmL02MBGwV90qYtSjioP3d0VQctaLvspIU8ACuMk6BTXNDmt8S6km0mPB97F 4hXfOHHCUGQwPQKCAQEAxtWR0XFdry1SejkS2rzJKfQkPispa8b0VZbaXnxjqspR FAwOUFuh20BxYl7LlSDyXApPENhOMfDJRDznhkqTL5rvy1uNFxt/+kU3D9i483Ba LuSuOD9K/SY8/HG0WUuMWTr4dWwkk/GZFrdwF+MqyKI7I7cWr8KAspOFt0BIlTjt Gqdpib/GKnkOHN04owt5pEv1+01CxMAb6CAAa4JkiCPUEl5Uh3o2nR2nDtWQc/rc y2EWif1Lv7szidA2j9Fsp8dKb/fOGZUZhmlpjVC+JQ9SICoqgq0KL3Vkjg/l4GyF w7IHko9rUZ9VA3UURRls5pHqe8y+bhIjF78+CtIM7wKCAQBsAtxaGWUbqVLkLl6Y 97vmQ1I4JHPFb7gticPP9Xz0ZWFS9CjPUPYc7+Xx1xuEpj4jkaQdt4AZhovY9MKD Z5G7IH7RRCDGY8LDcntJtmWmJciMvqViiKZhKWcB463vp1u/dX/gzllQKH1g6Z36 wX6IbEF1g0z6PtVh1+a4ZLcSWp1jt/Xp97XV50NbBoDvNQHNypiX8GBB/s9uJBCX mSjPAjPnCaf3NnLXV3+qxCTBTUllED0juxAoVEny+kBghf8YP0qXxjFGhOh8+GUt PHC5+RQrj8Ua3lkaxZ83euw/XlfhFGiBUU0wy/MJwUumV8etfAVwthsQ4suMtZxR xttFAoIBABTrPUcqxS979jRzsr8eo49tZy6/PcFgEi67C0hrj9TVKkiQqCTeLx4x Hny5+nM7HyR91SmxiDCK47HxMm6Xg/q7M0VS4Xov43wCMjPRmkvKY0KRvp6eUhZm In5wvAe1AhQVNzSrZwHFplSUgg+RT9wB7XTpe1KMhRvEl4nbEofYkGGAgYMDkSbA y7JPt/i3aVnWwA9rZn3qtETssP6enlMQaexwzjXersZC62ONJoB9QSOImGV2J7UJ TffO1x60atkQB43WJXHdlOzmRDug5hBiF0LZDNXovKyXjjfABnBhGoWnQlKyEhlp SPlvJO3MKf/sFB5oQRS1hcmmzjE3PjMCggEBALmcsjPJx4CCJVrwdg/1C/rm9tgS 7GwAdyDvRRwoAiay9rdsi7z8HPu7FOqBEakCTSGcm1sxnYstvBJnxzXHbVfNKSg1 bWfZ3v/TQT1DqWhchvh3F969kVXvtsvu9MzZfiG6dYdIE+9Xah93itbjYIJGqk6O g8a1Sjjbw2I4rG6Fd/LkOVM52yblU9XIK2kNNHyR+gtf8XEouSODHMRQghSZThJV BCsoAki3kAdM9LkAJWvymS8gobZri5nW8rMQioCVnIB3XXQziw3uT1a1MtqjMSdd wkPliOT+lNsuHlTcnoW5O9P56XCNH68JXWYpVFTkeMKppNCNkyBqN5hbshE= -----END RSA PRIVATE KEY----- PrivateKeys.driver_signing_private_key: | -----BEGIN RSA PRIVATE KEY----- MIIBOgIBAAJBALnfFW1FffeKPs5PLUhFOSkNrr9TDCODQAI3WluLh0sW7/ro93eo IZ0FbipnTpzGkPpriONbSOXmxWNTo0b9ma8CAwEAAQJAfg37HBZK7bxGB+jOjvrT XzI2Vu7dhqAWouojT357DMKjGvkO+w7r6BmToZkgHRL4Nvh1KJ/APYdWWR+jTwJ3 4QIhAOhY/Gx8xs1ngrQLfSK9AWzPeegZK0I9W1UQuLWt7MjHAiEAzMrr2huBFrM0 NgTOlWdrKnI/DPDpR3jGfSoUTsAeT9kCIQCzgxzzjKvkQtb+1+mEj1ashNgA9IEx mkoYPOUYqRnKPQIgUV+8UcEmDRgOAfzs/U7HtWkKBqFfgGfMLwXeZeBO6xkCIHGq wDcAa2GW9htKHmv9/Rzg05iAD+FYTsp8Gi2r4icV -----END RSA PRIVATE KEY----- PrivateKeys.executable_signing_private_key: | -----BEGIN RSA PRIVATE KEY----- MIIBOwIBAAJBAMQpeVjrxmf6nPmsjHjULWhLmquSgTDKGpJgTFkTIAgX0Ih5lxoF B5TUjUfJFbBkSmKQPRA/IyuLBtCLQgwkTNkCAwEAAQJBAJ/nKwsIT1jNWw7P0EZi t40QLEn2CCfsZ9KweywVQgQ1b7z41glfhuKFn9+j+O1wZaElqcAFrU9H8qaQNMPH 6I0CIQDrFDlvcNvjXlxFV8oZYf2oCkXduamU/+170IoU/MRgdwIhANWem891kp7X 2bkpBpP9C+mqYnsuUMF+BqjMdVYAouEvAiA8zmZs5Qx7q5TCewrTtf0e0klwKO4s lGaheDe/ZgKF0QIhALgPFYlHcLHUohBcPQK+AcmvuXMRkRtnDy3aHS+hFLaZAiAp p9t+NDqxYEMnQ1UVt47cF9jyAWcKnnyyAH1ClPowxA== -----END RSA PRIVATE KEY----- Client.server_urls: ["http://localhost:8080/"] Test Context: AdminUI.webauth_manager: NullWebAuthManager Client.poll_max: 5 Logging.path: /tmp/grr_logs/ # When debugging it helps to be able to see all output on the console. ClientBuilder.console: True # Increase the client memory limit to 4GB. Client.rss_max: 4000 Client.foreman_check_frequency: 5 Client.poll_max: 5 Frontend.bind_address: 127.0.0.1 Frontend.bind_port: 8080 AdminUI.bind: 127.0.0.1 AdminUI.port: 8000 Nanny.unresponsive_kill_period: 3600 Datastore.implementation: FakeDataStore Logging.verbose: false Client.tempdir_roots: ["/tmp/"] Rekall.profile_server: TestRekallRepositoryProfileServer Client.rekall_profile_cache_path: /tmp/rekall_profiles # Disable write back Config.writeback: "" HTTPDataStore.reconnect_timeout: 30 Platform:Linux: Logging.engines: stderr Platform:Windows: Client.tempdir_roots: ["%(TEMP|env)"] # When debugging it helps to be able to see all output on the console. ClientBuilder.console: True grr-3.1.0.2/grr/config/grr-response-test/test_data/hello.exe000066400000000000000000000504121273104013200236600ustar00rootroot00000000000000MZÿÿ¸@€º´ Í!¸LÍ!This program cannot be run in DOS mode. $PELy´ÈQ0là 80 @ð*@ P.text¨ P`.data  @0À.rdata40 @0@.bss4@€0À.idataP@0À/4 `B/19fpB/35¶ € B/47, B/61ê $B/73ܰ&0B/86À(B/97$Ð*B/108à.BU‹ ÄP@‰å]ÿát&U‹ ¼P@‰å]ÿát&U‰åSƒì hP@èGƒÄ è§èƒì EôÇEôPEø‹ @SPh@@h@@èÚ¡@@ƒÄ …ÀuDèÙ‹ @‰èŒƒäðè”èÏS‹Q‹@@R¡@@Pèù‰Ã躉$èÊ‹¸P@£ @QQP‹SRè{ƒÄƒûàtPP¡@@P‹C0PèbƒÄƒûÀt„PP¡@@P‹CPPèIƒÄékÿÿÿ‰ö¼'U‰åƒìjÿ°P@èýþÿÿ¶¼'U‰åƒìjÿ°P@èÝþÿÿ¶¼'U‰åSƒì‹E‹‹=‘Àw;=ÀrK»PPjjè܃ăø„Ö…À…1À‹]üÉ´&=”ÀtI=–Àt=“ÀuÛëµ=Àt9=ÀuËPPjj舃ăøtZ…Àt´ƒì jÿЃÈÿƒÄë§t&1ÛézÿÿÿPPjj èVƒÄƒøt>…Àt‚ƒì j ÿЃÈÿƒÄérÿÿÿƒì jÿЃÈÿƒÄé`ÿÿÿPPjjèƒÈÿƒÄéJÿÿÿPPjj èƒÈÿƒÄé4ÿÿÿPPjjèïƒÄƒÈÿ…Û„ÿÿÿ脃ÈÿéÿÿÿU‰åƒì¡ @…Àt;ƒì h0@èÜ‰ÂƒÄ ¸…ÒtPPh 0@RèÉZY…Àt ƒì h @ÿЃÄÉÃt&U‰å]Ãt&¼'U‰åƒì¡ @‹…ÀtÿС @ƒÀ£ @‹…ÀuëÉô&U‰åVS‹ @…Éteø[^]˘@Ç @èEÿÿÿƒûÿt/…Ût4˜@t&ÿƒîKuøƒì hð@è‹üÿÿƒÄeø[^]Ã1Ûë‰ÃC‹…˜@…Òuðë»L$ƒäðÿqüU‰åQƒìèjÿÿÿƒì h$0@譃ĸ‹MüÉaüÃU‰åSœœZ‰Ðò RœZ1Щ „á1À¢…À„Õ¸¢öÆt‹ @@ƒË‰ @@f…Òy ¡ @@ƒÈ£ @@÷€t ¡ @@ƒÈ£ @@÷Ât ¡ @@ƒÈ£ @@÷Ât ¡ @@ƒÈ£ @@ât ¡ @@ƒÈ £ @@öÁt ¡ @@ƒÈ@£ @@€å t‹ @@€Ë€‰ @@¸€¢=€v ¸€¢…Òxâ@t ¡ @@€Ì£ @@[]Ë @@€Í‰ @@ë×U‰åÛã]ÃU¹40@‰åù40@s‹Q‹Â@ƒÁù40@rè]Ãÿ%¤P@ÿ%ÀP@ÿ%¬P@ÿ%ÌP@ÿ%¨P@ÿ%´P@ÿ%ÈP@ÿ%˜P@ÿ%ŒP@ÿ%P@ÿ%”P@ÿÿÿÿÿÿÿÿ¤@ÿÿÿÿ@libgcj_s.dll_Jv_RegisterClassesHello world!!!@P¼QŒPXPøQ¤PÔPâPöPQ&Q6QFQTQfQpQxQ‚QŽQ˜Q QÔPâPöPQ&Q6QFQTQfQpQxQ‚QŽQ˜Q QœExitProcessQGetModuleHandleAlGetProcAddressãSetUnhandledExceptionFilter7__getmainargsM__p__environO__p__fmodec__set_app_type“_cexit _iob_onexitª_setmodeNatexit´putsÂsignalPPPPKERNEL32.dllPPPPPPPPPPPmsvcrt.dll@„b¶ Îatexit_onexitWinMainCRTStartup4mainCRTStartupâ_argcö_argv² GNU C 4.2.1-sjlj (mingw32-2)/build/buildd/mingw32-runtime-3.15.2/build_dir/src/mingwrt-3.15.2-mingw32/crt1.c@„@unsigned intshort unsigned intintlong int_onexit_tÒØ­long long intchar_iobuf ‚Ž_ptrƒŽ#_cnt„­#_base…Ž#_flag†­# _file‡­#_charbufˆ­#_bufsiz‰­#_tmpfnameŠŽ#ïFILE‹÷short intlong unsigned int signed charunsigned charlong long unsigned intDWORDå­BYTEîÔfloatPVOIDV.  _FLOATING_SAVE_AREApD ControlWordEÿ# StatusWordFÿ# TagWordGÿ# ErrorOffsetHÿ# ErrorSelectorIÿ# DataOffsetJÿ# DataSelectorKÿ# RegisterAreaL# Cr0NpxStateMÿ#l +ÂOFLOATING_SAVE_AREAN0_CONTEXTÌO ContextFlagsPÿ# Dr0Qÿ# Dr1Rÿ# Dr2Sÿ# Dr3Tÿ# Dr6Uÿ# Dr7Vÿ# FloatSaveW+# SegGsXÿ#Œ SegFsYÿ# SegEsZÿ#” SegDs[ÿ#˜ Edi\ÿ#œ Esi]ÿ#  Ebx^ÿ#¤ Edx_ÿ#¨ Ecx`ÿ#¬ Eaxaÿ#° Ebpbÿ#´ Eipcÿ#¸ SegCsdÿ#¼ EFlagseÿ#À Espfÿ#Ä SegSsgÿ#È ExtendedRegistersh#Ì ÂÿCONTEXTiFPCONTEXTK @ _EXCEPTION_RECORDPL ü ExceptionCodeM ÿ# ExceptionFlagsN ÿ#O ü# ExceptionAddressP !# NumberParametersQ ÿ# ExceptionInformationR #F ÿÂPEXCEPTION_RECORDS ü _EXCEPTION_POINTERST rU # ContextRecordV /#EXCEPTION_POINTERSW ,“Ÿ­"ºnewmode#­#_startupinfo$Ÿatexit­@ @ÿpfn‘ÿ_onexit À@@,9pfnÀ‘_mingw32_init_mainargs/€dummy_environ2€start_info4ºŽ_mingw32_init_fmodeA__mingw_CRTStartupº @@XnRet»­„9>@f@Î>@f@X‘pm‘l †Ö!WinMainCRTStartup @#@—"mainCRTStartupý0@C@Ã#_gnu_exception_handlerh´P@„@ïÜ$exception_datagÜold_handleri;actionj´reset_fpuk­ðr%_argc­@@%_argv€@@ ” &'_iobš '_CRT_glob­'_fmode4­'_CRT_fmode=­(­j )_imp__atexit Z (À— À)_imp___onexit¯ ‡ % $ > : ;I I' I : ;  : ; I8 : ; I $ >   : ; : ;I8 I!I/  : ;!I/ : ;I8 ' I : ; .? : ;' I@: ;I ' .: ; 4: ; I.: ; ' .: ; ' @4: ; I1X Y  41 1UX Y !.? : ;' @".? : ; ' @#.: ; ' I@$: ; I%4: ; I?  &!'4: ; I? < (' I)4: ;I? < æMû /build/buildd/mingw32-runtime-3.15.2/build_dir/src/mingwrt-3.15.2-mingw32/build/buildd/mingw32-runtime-3.15.2/build_dir/src/mingwrt-3.15.2-mingw32/include/build/buildd/mingw32-runtime-3.15.2/build_dir/src/mingwrt-3.15.2-mingw32/../w32api/includecrt1.cinit.cstdio.hstdlib.hwindef.hwinnt.h@—!e0m!e0™f t£ƒó~Xyf{¥ºûÈ\D`ÀZÛ~‚uf X¼„„³"h„n h„ç~ y"JX­Á… .ºÖ%­‰M^H–`hþ ´D×>-— ï¾­ÞVisited: testing@mshelp://windows/?id=d063548a-3fc9-4723-99f3-b12a0c4354a8Þ0What is safe mode?ï¾­Þï¾­ÞURL `Û4Ï1Ì`Û4Ï1ÌÝ>ÒŽ`hþ ¸×>7ï¾­ÞVisited: testing@http://www.trafficfusionx.com/download/tfscrn2/funnycats.exe­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­ÞURL ž•vÏ1Ìž•vÏ1ÌÝ>°Ž`hþ ,L×>ï¾­ÞVisited: testing@http://www.google.com/url?sa=t&source=web&cd=5&ved=0CC4QFjAE&url=http%3A%2F%2Fwww.softsia.com%2Fdownload-hxks.htm&ei=N38DTrfOKNGy0AGe8LH7DQ&usg=AFQjCNHjr58nVd6Y9jQ8dHZWPOOLjxhJSQ ,http://www.google.com/favicon.icoï¾­Þï¾­ÞURL  O¬Ï1Ì O¬Ï1ÌÝ>áŽ`hþ ¸×>Fï¾­ÞVisited: testing@http://www.trafficfusionx.com/download/tfscrn2/funnycats.exe­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þo@Download funnycats.exe Freeï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­ÞURL ÀM…“Ï1ÌÀM…“Ï1ÌÝ>ÊŽ`hþ d×>/ï¾­ÞVisited: testing@http://www.google.comÞ ,http://www.google.com/favicon.icoGoogleï¾­Þï¾­Þï¾­ÞURL pø~ŠÏ1Ìpø~ŠÏ1ÌÝ>ÃŽ`hþ ¸×>'ï¾­ÞVisited: testing@http://www.trafficfusionx.com/download/tfscrn2/funnycats.exe­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­ÞURL ÀM…“Ï1ÌÀM…“Ï1ÌÝ>ÊŽ`hþ œp×>/ï¾­ÞVisited: testing@http://facemoods.com/tv1b-g1/gppcÞ ,http://facemoods.com/favicon.ico$Facemoods TVï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þwww.bing.com/search?q=google+chrome&FORM=IE8SRC&format=rssÞRSSï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­ÞURL €ñ¾*‹zÊ€ñ¾*‹zÊ&<øŽ`hþ ¨‹;øŽï¾­ÞVisited: testing@http://www.google.com/chrome/chrome/eula.htmlÞï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þ- Download a new browserï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­ÞURL @yA)‹zÊ@yA)‹zÊ&<÷Ž`hþ ˜¤‹;÷Žï¾­ÞVisited: testing@http://www.google.com/chrome­Þ ,http://www.google.com/favicon.icoXGoogle Chrome - Download a new browserï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­ÞURL À>O’Ï1ÌÀ>O’Ï1ÌÝ>ÉŽ`hþ ×>.ï¾­ÞVisited: testing@http://googleads.g.doubleclick.net/aclk?sa=l&ai=BHBxCS38DTuynBsWaqwGenMSNB8q9yqMCop_biifAjbcBkLAKEAEYASCz9_cBOABQ_vTbuf______AWDJBogBAaAB9pP22gOyAQ93d3cuc29mdHNpYS5jb226AQk3Mjh4OTBfYXPIAQLaAShodHRwOi8vd3d3LnNvZnRzaWEuY29tL2Rvd25sb2FkLWh4a3MuaHRtgAIBqAMByAMV6APCBOgD9QboA7YB9QMAAADE&num=1&sig=AGiWqtw3HwGhCNCKXEcyb2V7VSUkbqgasw&client=ca-pub-9802682967243697&adurl=http://facemoods.com/tv1b-g1/gppc&nm=3&clkt=156&jca=1326­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­ÞURL °—‡“Ï1̰—‡“Ï1ÌÝ>ÊŽ`hþ ¼×>/ ï¾­ÞVisited: testing@http://www.download3k.com/Install-TF-Funny-Cats-Screensaver.html­Þ 0http://www.download3k.com/favicon.ico@Download funnycats.exe Freeï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­ÞURL °—‡“Ï1̰—‡“Ï1ÌÝ>ÊŽ`hþ œp×>/ï¾­ÞVisited: testing@http://facemoods.com/tv1b-g1/gppcÞ ,http://facemoods.com/favicon.ico$Facemoods TVï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­ÞURL ࣬¯Ï1Ì࣬¯Ï1ÌÝ>äŽ`hþ ¼×>I ï¾­ÞVisited: testing@http://www.download3k.com/Install-TF-Funny-Cats-Screensaver.html­Þ 0http://www.download3k.com/favicon.ico@Download funnycats.exe Freeï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þ//windows/?id=d063548a-3fc9-4723-99f3-b12a0c4354a8Þ0What is safe mode?ï¾­Þï¾­ÞURL @]I4âÊ@]I4âÊœ<~`hþ ¬–<û~ï¾­ÞVisited: testing@res://C:\Windows\system32\mmcndmgr.dll/views.htm­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­ÞURL  ’4âÊ ’4âÊœn¬mMl¦lYK#%%[tablesqlite_stat1sqlite_stat1$CREATE TABLE sqlite_stat1(tbl,idx,stat)$"Q+Yindexmoz_items_annos_itemattributeindexmoz_items_annos#CREATE UNIQUE INDEX moz_items_annos_itemattributeindex ON moz_items_annos (item_id, anno_attribute_id)‚\!++„otablemoz_items_annosmoz_items_annos"CREATE TABLE moz_items_annos ( id INTEGER PRIMARY KEY, item_id INTEGER NOT NULL, anno_attribute_id INTEGER, mime_type VARCHAR(32) DEFAULT NULL, content LONGVARCHAR, flags INTEGER DEFAULT 0, expiration INTEGER DEFAULT 0, type INTEGER DEFAULT 0, dateAdded INTEGER DEFAULT 0, lastModified INTEGER DEFAULT 0) GEindexmoz_annos_placeattributeindexmoz_annos!CREATE UNIQUE INDEX moz_annos_placeattributeindex ON moz_annos (place_id, anno_attribute_id)‚K„etablemoz_annosmoz_annos CREATE TABLE moz_annos ( id INTEGER PRIMARY KEY, place_id INTEGER NOT NULL, anno_attribute_id INTEGER, mime_type VARCHAR(32) DEFAULT NULL, content LONGVARCHAR, flags INTEGER DEFAULT 0, expiration INTEGER DEFAULT 0, type INTEGER DEFAULT 0, dateAdded INTEGER DEFAULT 0, lastModified INTEGER DEFAULT 0)33Gtablemoz_anno_attributesmoz_anno_attributesCREATE TABLE moz_anno_attributes ( id INTEGER PRIMARY KEY, name VARCHAR(32) UNIQUE NOT NULL)EY3indexsqlite_autoindex_moz_anno_attributes_1moz_anno_attributes/%%‚!tablemoz_faviconsmoz_faviconsCREATE TABLE moz_favicons ( id INTEGER PRIMARY KEY, url LONGVARCHAR UNIQUE, data BLOB, mime_type VARCHAR(32), expiration LONG, guid TEXT)7K%indexsqlite_autoindex_moz_favicons_1moz_faviconsP++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq)|%%;tablemoz_keywordsmoz_keywordsCREATE TABLE moz_keywords ( id INTEGER PRIMARY KEY AUTOINCREMENT, keyword TEXT UNIQUE)7K%indexsqlite_autoindex_moz_keywords_1moz_keywords335tablemoz_bookmarks_rootsmoz_bookmarks_rootsCREATE TABLE moz_bookmarks_roots ( root_name VARCHAR(16) UNIQUE, folder_id INTEGER)EY3indexsqlite_autoindex_moz_bookmarks_roots_1moz_bookmarks_rootsI'!indexmoz_bookmarks_guid_uniqueindexmoz_bookmarksCREATE UNIQUE INDEX moz_bookmarks_guid_uniqueindex ON moz_bookmarks (guid)S'5indexmoz_bookmarks_itemlastmodifiedindexmoz_bookmarksCREATE INDEX moz_bookmarks_itemlastmodifiedindex ON moz_bookmarks (fk, lastModified)}?'!indexmoz_bookmarks_parentindexmoz_bookmarksCREATE INDEX moz_bookmarks_parentindex ON moz_bookmarks (parent, position)q;' indexmoz_bookmarks_itemindexmoz_bookmarksCREATE INDEX moz_bookmarks_itemindex ON moz_bookmarks (fk, type)‚''ƒctablemoz_bookmarksmoz_bookmarksCREATE TABLE moz_bookmarks ( id INTEGER PRIMARY KEY, type INTEGER, fk INTEGER DEFAULT NULL, parent INTEGER, position INTEGER, title LONGVARCHAR, keyword_id INTEGER, folder_type TEXT, dateAdded INTEGER, lastModified INTEGER, guid TEXT)‚ tablemoz_hostsmoz_hostsCREATE TABLE moz_hosts ( id INTEGER PRIMARY KEY, host TEXT NOT NULL UNIQUE, frecency INTEGER, typed INTEGER NOT NULL DEFAULT 0)1Eindexsqlite_autoindex_moz_hosts_1moz_hosts6 --‚tablemoz_inputhistorymoz_inputhistoryCREATE TABLE moz_inputhistory ( place_id INTEGER NOT NULL, input LONGVARCHAR NOT NULL, use_count INTEGER, PRIMARY KEY (place_id, input))?S-indexsqlite_autoindex_moz_inputhistory_1moz_inputhistory C/!indexmoz_historyvisits_dateindexmoz_historyvisits CREATE INDEX moz_historyvisits_dateindex ON moz_historyvisits (visit_date) C/!indexmoz_historyvisits_fromindexmoz_historyvisits CREATE INDEX moz_historyvisits_fromindex ON moz_historyvisits (from_visit) M/?indexmoz_historyvisits_placedateindexmoz_historyvisits CREATE INDEX moz_historyvisits_placedateindex ON moz_historyvisits (place_id, visit_date)G //‚=tablemoz_historyvisitsmoz_historyvisits CREATE TABLE moz_historyvisits ( id INTEGER PRIMARY KEY, from_visit INTEGER, place_id INTEGER, visit_date INTEGER, visit_type INTEGER, session INTEGER)vC!indexmoz_places_guid_uniqueindexmoz_places CREATE UNIQUE INDEX moz_places_guid_uniqueindex ON moz_places (guid)~G!!indexmoz_places_lastvisitdateindexmoz_placesCREATE INDEX moz_places_lastvisitdateindex ON moz_places (last_visit_date)m=! indexmoz_places_frecencyindexmoz_placesCREATE INDEX moz_places_frecencyindex ON moz_places (frecency)j7! indexmoz_places_visitcountmoz_placesCREATE INDEX moz_places_visitcount ON moz_places (visit_count)e5!indexmoz_places_hostindexmoz_placesCREATE INDEX moz_places_hostindex ON moz_places (rev_host)m;! indexmoz_places_faviconindexmoz_placesCREATE INDEX moz_places_faviconindex ON moz_places (favicon_id)sA!indexmoz_places_url_uniqueindexmoz_placesCREATE UNIQUE INDEX moz_places_url_uniqueindex ON moz_places (url)‚Q!!„mtablemoz_placesmoz_placesCREATE TABLE moz_places ( id INTEGER PRIMARY KEY, url LONGVARCHAR, title LONGVARCHAR, rev_host LONGVARCHAR, visit_count INTEGER DEFAULT 0, hidden INTEGER DEFAULT 0 NOT NULL, typed INTEGER DEFAULT 0 NOT NULL, favicon_id INTEGER, frecency INTEGER DEFAULT -1 NOT NULL, last_visit_date INTEGER , guid TEXT) ›y\z¡ ~Á~_~}»}X}|Á|f| {´{p{z/y\P37 %https://blog.duosecurity.com/2012/07/exploit-mitigations-in-android-jelly-bean-4-1/Exploit Mitigations in Android Jelly Bean 4.1 - Blog · Duo Securitymoc.ytirucesoud.golb.dÅDžË@BXOVUur-LXC-p 5e'  %http://slashdot.org/Slashdot: News for nerds, stuff that mattersgro.todhsals.ÐÅC’ŸðGQKDeq7tZFBat o//  %http://start.ubuntu.com/10.04/Google/?sourceid=hpUbuntu Start Pagemoc.utnubu.trats.dÅC!{Lj1kRROVw8GO-W g-%http://www.mozilla.com/en-US/firefox/central/moc.allizom.www.ŒVLoPpunzbzP6B a %place:sort=8&redirectsMode=2&maxResults=10GD25W7HWWIw_U c-%http://www.mozilla.com/en-US/firefox/about/moc.allizom.www.ŒCGiDtWKUXq6RY k-%http://www.mozilla.com/en-US/firefox/community/moc.allizom.www.Œl1epzWdWVe52Y k-%http://www.mozilla.com/en-US/firefox/customize/moc.allizom.www.ŒkH7V6e7nVxQ1T a-%http://www.mozilla.com/en-US/firefox/help/moc.allizom.www.ŒjjcsImCxouJD? 9+%http://www.debian.org/gro.naibed.www.ŒGIKVqBN9ngfra o9%https://answers.launchpad.net/ubuntu/+addquestionten.daphcnual.srewsna.ŒQxu9VPNhMoaSW _5%http://www.ubuntulinux.org/wiki/FrontPagegro.xunilutnubu.www.ŒZ-cInEn2SoCvI C5%http://www.ubuntulinux.org/gro.xunilutnubu.www.Œ5gW7VzKCTbGO` s3%https://addons.mozilla.org/en-US/firefox/bookmarks/gro.allizom.snodda.Œ7OBuV_78iHSqF i %place:sort=14&type=6&maxResults=10&queryType=1vK0PCdOO27aM y %place:folder=BOOKMARKS_MENU&folder=UNFILED_BOOKMARKS&folder=TOOLBAR&sort=12&excludeQueries=1&maxResults=10&queryType=18ebA-L43DYuIeE |«}Ë~E}~}}®}â~~Ä~–~ä~`|«O}OX3https://blog.duosecurity.com/2012/07/exploit-mitigations-in-android-jelly-bean-4-1/5http://slashdot.org/1ghttp://www.mozilla.com/en-US/firefox/central/.aplace:sort=8&redirectsMode=2&maxResults=10 /chttp://www.mozilla.com/en-US/firefox/about/ 3khttp://www.mozilla.com/en-US/firefox/community/ 3khttp://www.mozilla.com/en-US/firefox/customize/ .ahttp://www.mozilla.com/en-US/firefox/help/ 9http://www.debian.org/5ohttps://answers.launchpad.net/ubuntu/+addquestion-_http://www.ubuntulinux.org/wiki/FrontPageChttp://www.ubuntulinux.org/7shttps://addons.mozilla.org/en-US/firefox/bookmarks/2iplace:sort=14&type=6&maxResults=10&queryType=1{yplace:folder=BOOKMARKS_MENU&folder=UNFILED_BOOKMARKS&folder=TOOLBAR&sort=12&excludeQueries=1&maxResults=10&queryType=14o http://start.ubuntu.com/10.04/Google/?sourceid=hp ¯÷òíèãÞÙÔÏÊÅÀ»üµ¯      ~ÎæáÉh~è°—S>)~úë~Î|7moc.ytirucesoud.golb.'gro.todhsals.-moc.allizom.www. -moc.allizom.www. -moc.allizom.www. -moc.allizom.www. -moc.allizom.www. +gro.naibed.www.9ten.daphcnual.srewsna.5gro.xunilutnubu.www.5gro.xunilutnubu.www.3gro.allizom.snodda./ moc.utnubu.trats. ±÷òíèãÞÙÔÏÊÅÀ»ü¶±        ™öñ­û™êãÜÕÎÇÀ¹²¦ŸdÐŒ Œ Œ Œ Œ ŒŒŒŒŒ d ™ïêåàÛÖÑÌǽ¸³ô¦™ ÅDžË@ ÅC’Ÿð       ÅC!{L ~ñ¬½ß~ñ5$yŠ›ðhWFÎ%BXOVUur-LXC-%GQKDeq7tZFBa%VLoPpunzbzP6%GD25W7HWWIw_ %CGiDtWKUXq6R %l1epzWdWVe52 %kH7V6e7nVxQ1 %jjcsImCxouJD %GIKVqBN9ngfr%Qxu9VPNhMoaS%Z-cInEn2SoCv%5gW7VzKCTbGO%7OBuV_78iHSq%vK0PCdOO27aM%8ebA-L43DYuI% j1kRROVw8GO- ÆîÚÆ ÅDžË@ÅC’Ÿð  ÅC!{L ÕóäÕÅDžË@ÅC’Ÿð   ÅC!{L ñü÷ñ ÚôçÚ ÅDžË@ ÅC’Ÿð  ÅC!{L € € ?è͵—„p[?5blog.duosecurity.comd% slashdot.orgÐ#mozilla.comŒ!debian.orgŒ7answers.launchpad.netŒ+ubuntulinux.orgŒ1addons.mozilla.orgŒ-start.ubuntu.comd ^Õ§^˜ˆwìÁ5blog.duosecurity.com%slashdot.org#mozilla.com!debian.org7answers.launchpad.net+ubuntulinux.org1addons.mozilla.org- start.ubuntu.com z“Õœ`0~ò~³~|~O~}á}–}d}|·|h|,{î{±{x{C{ zÐz“; -%Latest Headlines¦^ ©ŒÅC%'zgEsdDS3nBczQ9  +%Getting Started¦^ ©Ý¦^ ©î9C_jJqP7UuUw6 %% Most VisitedÅC"ù!ÅC"û2_0WplYeYm9AT3 % About Us¦^ ¬¦^ ¬skMy-MiD6uunq7 %% Get Involved¦^ ¬{è¦^ ¬~SP0f7IwaVi5rA;  /% Customize Firefox¦^ ¬x¥¦^ ¬{29Umu0paaNAa1< 1% Help and Tutorials¦^ ¬uƒ¦^ ¬wó4X9GzRfI3g52: +%Mozilla Firefox¦^ ¬t˜1Ô;bÈ€XOeAr1Wi_Lu5M Q% Debian (Ubuntu is based on Debian)2;<ŠRÀ2;<ŠRÀk_EPJ4AG0btaY i% Make a Support Request to the Ubuntu Community2;<ŠRÀ2;<ŠRÀlLXd8-5GethhP  Y% Ubuntu Wiki (community-edited website)2;<ŠRÀ2;<ŠRÀ0ZjV9v6Pbo3-0 % Ubuntu2;<ŠRÀ2;<ŠRÀYp-xuSmdkBfGI I%Ubuntu and Free Software links2;<ŠRÀÅC"ß3geGniavMj1Sj+ %¦^ ©þ¦^ ©þxvRib0FOoQkC? 5%Get Bookmark Add-ons¦^ ¨¾Û¦^ ©òt3-ipdA3Ge7_+ %¦^ ¨þ¦^ ¨þS3O2WlfG4zxu5  #%Recent TagsÅC"ÃùÅC"ÅžIaida7WrW6sr= 3%Recently BookmarkedÅC"¿vÅC"Â8orBynYrpG453<  1%Unsorted BookmarksÅC¡ãÅC"¶Qa43j5YQARLw4.  %TagsÅC¡ãÅC¡ã-Us4NVy4VCPQ:  /%Bookmarks ToolbarÅC¡ãÅC#ÜqY3Pkr52LA4s7  )%Bookmarks MenuÅC¡ãÅC"ß«UeIQhmDj2kDh)  %ÅC¡ãÅC¡ãCm5dTH3T685Z `úóìåÞ´‘`É»×Э¦Ÿ˜Šƒ|ung                         YûõïèáÚÓËû³haY¬¥•†wo                ~²róÉ»då×~²¬€UF7( ~ü~í~Þ~Ï~À ÅC%'z¦^ ©î ÅC"û2 ¦^ ¬s ¦^ ¬~S ¦^ ¬{2 ¦^ ¬wó 1Ô;bÈ€2;<ŠRÀ2;<ŠRÀ2;<ŠRÀ 2;<ŠRÀ ÅC"ß3 ¦^ ©þ ¦^ ©ò ¦^ ¨þÅC"ÅžÅC"Â8 ÅC"¶Q ÅC¡ã ÅC#Ü ÅC"ß«  ÅC¡ã ~z½$~à~‹~ÏðŠ~¾yß~ñ5~œ¬~zF~­›ÎhW%gEsdDS3nBczQ%9C_jJqP7UuUw%_0WplYeYm9AT%kMy-MiD6uunq%P0f7IwaVi5rA%9Umu0paaNAa1%4X9GzRfI3g52%XOeAr1Wi_Lu5%k_EPJ4AG0bta%lLXd8-5Gethh%0ZjV9v6Pbo3- %Yp-xuSmdkBfG %geGniavMj1Sj %xvRib0FOoQkC %t3-ipdA3Ge7_ %S3O2WlfG4zxu%Iaida7WrW6sr%orBynYrpG453%a43j5YQARLw4%-Us4NVy4VCPQ%qY3Pkr52LA4s%UeIQhmDj2kDh% Cm5dTH3T685Z ÇõëÞÔÇ unfiledtags toolbarmenu  places ÌíöØáÌ unfiledtags toolbarmenu  places € € € yž}2{ªyž„ [‡%https://www.duosecurity.com/favicon.ico‰PNG  IHDRóÿa„IDAT8Å“MK†÷ܵ.ýλ²ZY`„¦­Ù^ ¢ÑAÜ…®¥à!Ä@‰%ƒ¬5ñЬ.A‘–ŒE°OD샖½¨Ñ?x;D åÔ¡žÃ0Ìà ÌÄ¿‡,ß ‹çÌo(—«£D*µ·nã?b}}ñøî*Ñh(}IŽçƒCC,(Êþ-~Õê­AX­^´Z/(•. I267S„¤F"‘†(f±³“…Ë5Û)œD½þ€çg++kp8¦aµz5œÎ 'Å,úû':eÇÀ€ 6ÛHrLwlgn÷‚þ e‡Ï·ŒLæ@W`6³ÈçLæ@ÓL§`dÄËË;4›mŸ"Þ×ÈåQ©\A’dÔj ÌÏ/éO@ÓŒ†ÁàøËÎáþþ ××5X,îÏž‚¦Ç;øhþÈM&'ŒF4=ž¾ TUíŠDâ§±Xâæ+¡P¬ E_õjáðÆ™¢(Ýßž¹ªª=ÍÞ?úª_Æ.e£t ÈKDIEND®B`‚image/pngÅ’{ÇsEXUXhJ6sJi9ƒK…%%http://slashdot.org/favicon.ico(( €xxM__ÿÿÿ^^+aaÓÓÄ««‡HIJJ&‘w½½¦bb0TT44 BBYîîîîîîîîîîîéîîîîîîîîïöU¯ÿ«Ïþïú")ð"_þÿÿR&ð"_ÿÿÿ"?¦Ïÿøˆ…"¸ˆˆøˆŒ" ˆˆÝݲ%ÝÝØÝÝB"­ÝØÝÝÖ"-ÝØÑflÔD7wwwwwws\DDDDDDÅimage/x-iconÅ’!G7tIVWjk0Vf5s…KSŠ%http://start.ubuntu.com/favicon.ico‰PNG  IHDRóÿaJIDAT8}S]hRaþdÌQ7»éfì"F°QÈ`Å.‚AtçÔE Éh…t„D+ºÈƒ‚”$ƒ¡4$¢ºÊ‹ndŒ.ºÙhÓ±sŽz4wŽ:cê1Öáé&ÿŽ®¾›—÷yÞŸçùQD‰‹gý7o›ÜfgU2;«’yÛävÖïp—¸Ø¸²¾+ A—1 ÖX-A¿Çk… ËÞ¤iZýóÑ¥£€¬– ÎÇÐH3 V§’3ÎËë4M«[¢çÖ«.€N…œÇŠÒÆ[”?½‡°4‡:·ƒF†«SÕdý7!„iwKÃêTrœ²NC\1¡²¹ŽfÔù„¥9$ožêl"—™¯gˆè¥|ÍdüÚ T¿o¢ž 7Ž y{‰ë£Èy¬¥"þäÁß9×"É>!Ió×L^/ò«znuQ)ü±•KZ&b„Õüz÷òo {N=ê| ñùáîÊqC_¶UÑ4£hÖ!KE¤í38̦ÀÔ}•HÛ.‚·h:HUH|a4ÝZam°çÔ÷‚í3€b(н‚øÌô¦uÄùaÔ~|A5AÜ8‚Ä“à jËF42÷3]J^Ë*©DÃSIJ. åÏÚ2r;_EÒ|Z!ã·³„B„ç åÈù6CC¤îžG5A5i7òR¾–†Jß»ùŸ•ÿ­&³Z‚ôýép—•›$ý&Q>ÑKù†:òGV¢á)ÑKù: –4q¢—òI»[eý_Y-:<Ú7ëIEND®B`‚image/pngÅ’ À44jHLllHEilu ‰µÙ‰+[https://www.duosecurity.com/favicon.ico#Khttp://slashdot.org/favicon.ico&S http://start.ubuntu.com/favicon.ico }çħ’}-livemark/siteURI-livemark/feedURI=placesInternal/READ_ONLY!IbookmarkProperties/description5Places/SmartBookmark ~èÅ“~¨-livemark/siteURI-livemark/feedURI=placesInternal/READ_ONLY"IbookmarkProperties/description5 Places/SmartBookmark € € ~,Τ7 ~ë~”~,f http://www.bbc.co.uk/news/#sa-ns_mchannel=rss&ns_source=PublicRSS20-saÅC#ùÅC#ýU yhttp://fxfeeds.mozilla.com/en-US/firefox/headlines.xmlÅC#DÅC#I  1ÅC#’ÅC%"Ø)  #MostVisitedÅC"ú±ÅC"ú¶k # Information and resources about Ubuntu, Debian and Free Software in generalÅC"ÞíÅC"Þñ(  !RecentTagsÅC"ÅXÅC"Å\0  1RecentlyBookmarkedÅC"ÁëÅC"Áï ÌúóëäÜÔÌ     1Ì‘`1-';moz_bookmarksmoz_bookmarks_itemindex5 5 5/'?moz_bookmarksmoz_bookmarks_parentindex5 3 19'Smoz_bookmarksmoz_bookmarks_itemlastmodifiedindex5 5 52'Imoz_bookmarksmoz_bookmarks_guid_uniqueindex5 1grr-3.1.0.2/grr/config/grr-response-test/test_data/ntfs_img.dd000066400000000000000000100770001273104013200241740ustar00rootroot00000000000000”#€þ? ?KsUªëRNTFS ø€€ÿÿö$U*¿kú3ÀŽÐ¼|ûhÀhfˈf>NTFSu´A»ªUÍr ûUªu÷ÁuéÒƒìh´HŠ‹ôÍŸƒÄžXrá; uÛ£Á.Z3Û¹ +ÈfÿŽÂÿè@+Èw︻Íf#Àu-fûTCPAu$ùrh»hph fSfSfUh¸faÍéjf`f¡ffhfPShh´BŠ‹ôÍfY[ZfYfY‚fÿŽÂÿu¼faàøè ûèëþ´‹ð¬<t ´»Íëòà A disk read error occurred BOOTMGR is missing BOOTMGR is compressed Press Ctrl+Alt+Del to restart €²ÊUªBOOTMGR$I30à0ë"NTLDRf· f¶ f÷ãf£Rf‹@€ùöÙf¸fÓàëf¡Rf÷áf£ff· f3Òf÷óf£Vè•f‹Nf‰&fff‰*fff‰.fff‰>fff‰Ff¸f‹&èƒ f À„Sþf£2f¸ f‹*èj f£6f¸°f‹.èX f£:f¡2f À„ þg€x…þgfPgBgf¶H f‰rgf‹Hf‰nf¡nf· f3Òf÷ñf£vf¡Ffnf£Jfƒ>6„fƒ>:„Äýf‹:f‹>Jf¡.èàf·f¸è"f À…f·Zf¸\è f À„B gf‹f‹>>è?f¡>f» f¹fºèäf…À…#f¡>f»€f¹fºèÄf À…Déñ f3Òf¹€f¡>èÊf À„Ú f‹>>èÛf¡>f»€f¹fºè€f À„° gf·X fãÿ…¥ f‹Øh f+ÿf¡>èh f+ÿf¡>è¬ Š¸èŽÀ6 +Àh PËf`f‹Úf¶ f÷áf£f‹Ãf÷ᣋ߃ãŒÀfÁïÇPè3üfaÃg@gfƒ8ÿ„Lgf9…3f É… g€x …#Ãg:H …f‹ðgp è—fQf‹úó§fY…Ãgfƒx„gf@ë«f+ÀÃf‹óèlgfg÷@ …4gfPg:J@…gfrBèIfQf‹ûó§fY…Ãgƒx„g@ëÂf3ÀÃg€{…f`gfSgf‹ f‹ógró¤faÃfPgfSf…À… gf‹JfAëgf‹Bf3Òf÷6Rf‹Èf+Àf^èÃf`g€{„ékûfƒù…faÃfSfPfQfVfWè‘f‹Ñf_f^fYf…À„4f;Êf‹Ñè‚þf+Êf‹Úf‹Âf¶ f÷âf· f÷âføfXfÃf[ëŸf…ö„ûfQfWgf¶C f…À„ fÑàf+àf‹üfTfVgf·s fóf‹Èó¤f^ëfPfPgf‹fPgf‹CfPgf‹V f…Ò„ f‹þf‹Âèqf‹ÆfZfYfBfQfVè?f…À„’úf^fYf‹þèNf‹Æf‹ÙfYfZfQfVfÑéèøýf…À„kúf^fYfáf_fYf‹ÐfXf[f‹Úéõþf`&gf·_&gf·Of É„9úfßfƒÃfÇþfIf É„&g‹&g‰fƒÃfÇfIëâfaÃf`f¸f£"f¡fff£jfff£Nf¡0f¶ f÷ãf‹Nf‰f£ƒÃf¡Vf‰£ƒÃf‰Nf‹è\ùf‹ûèQÿf¡f» f¹fºèýf À„f‹Øf‹>f3Àè¢ýf‹f?€„ë_ëðfSf‹Gf÷&VfPf3Òf¶ f÷ófRèÜf À„9ùf‹Vf¶ f÷ãfZfÂf‹Nf‰ƒÃf¶ f+Âf;Á†f‹Áf‰f+ÈfZ„ufÂfPf3Òf¶ f÷ófQè‚fYf À„Ýøf¶ f÷ãf‹Nf‹ƒÃff;Ð…f¶ f;Á†f‹Áf륃Ãf‰Nf‰ƒÃf¶ f;Á†f‹Áf‰낃Ãfÿ"f‰Nf[_f?€„ ÿfaÃf‹Ðf‹"f‹6jf6ffRfQfRf‹jf‹>Vf‹f£ƒÆf‹£ƒÆèÝ÷f+ø„÷& ØëÙf‹>jè¿ýf¡jf»€f¹f‹Ñèûf À„ô÷f‹ØfXfVè,f^f À„f[f[ÃfYfZâ„f3ÀÃf`fPfQf3Òf¶ f÷ófRfWèSÿf_f À„®÷f¶ f÷ãfZfÂf£fYf¶ f;ËŽ‰f+ËfXfÃfPfQëfXfÁfP‰f¹fQfW‹ßƒãŒÀfÁïÇPè÷f_f>RfYfXfƒùpÿfaÃf`f÷&Vf‹VèUÿèÒüfaÃf`f÷&rf‹6f‹rf‹6*f‹>Fèûè§üfaÃfPfSfQf‹Jf‹ÈfÁèfƒáfØf¸fÓàg„„øëùfYf[fXÃg€{„f+ÀÃgfsgf‹Vf;‡ gf‹f;ƒf+ÀÃg^f+ög€;„>èfñè9fÊf;ÁŒ!f‹ÑfPgf¶ f‹ÁfƒàfÁéfÙfØfCfXëÄf+Èf+ÂfÆÃf+ÀÃf+ÉgŠ €áfƒù…f+ÉÃfSfRfÙgf¾fIfKfƒù„ fÁâgŠfKfIëëf‹ÊfZf[ÃfSfRf+ÒgŠfƒâf+ÉgŠ Àéfƒù…f+ÉfZf[ÃfÚfÙgf¾fIfKfƒù„ fÁâgŠfKfIëëf‹ÊfZf[Ãf É…ÃfQfVgƒ>aŒ gƒ>zgƒ. fƒÆâæf^fYÃfPfQf‹Ðf¡2gfXgCgf@f‹ÚèDùf À„fYfYÃf¡6f À…fYfYf3ÀÃf‹6gfRgf‹Bf3Òf÷6nf3öfPfVfXf^f;Æ„:fVf@fPfHèþrèèëýfZf^fYf[fSfQfVfRf¡Fgf@èÐøf ÀtÄfYfYfYfYÃfYfYf3ÀÃfQfPf¸f‹ùèýf‹Áf» f¹fºè3øf[fYf…À…f‹Áf·fºèøë3f3Òf‹Áf‹ËfPfSè#f[f_f À„è5ýf‹Çf·fºèá÷ÃfRfQf» f¹fºèÇ÷f À„cf‹Øf‹>f3ÀèYøf‹fYfZ&f9… &f9W„1ë&fƒ?ÿ„/&ƒ„&&f·GØ‹Ã%€tËŒÀŽÀãÿë¾&f‹GÃfYfZf3ÀÃfPfQf‹ÇfÁèYÈQfƒçfYfXÃ`¾½ ¿ ¹ ó¥aÃ#Eg‰«Íïþܺ˜vT2ðáÒà `‹6 &ŠˆGFfÿ þ` uè[¾ âæ‰6 aÃf`‹6 °€ˆF2Àþ` uè:¾ þX uéf3Àf£X f¡ fÁàfÈf£\ è» f‹fÈf‰ƒÃû4 uîfaÃf`» f‹fÈf‰ƒÃû` uî» f‹f‹Wf‹wf‹ f‹o» Ç 0Æ S‹ ÿfG[fèf/f‹ÁfÁÀfÅf‹ïf‹þf‹òfÁÆf‹Ñf‹Èf‹f3Gf3G f3G4fÑÀf‰G@ƒÃþ u²ƒ > HuŸ» ffWfwf fofaÃf‹Æf3Çf#Âf3ÇÃf‹Âf3Æf3ÇÃfSf‹Âf#Æf‹Úf#ßf Ãf‹Þf#ßf Ãf[Ãü™y‚Z ¡ëÙnܼ ÖÁbÊf`f3Û¸»Íf#À…»fûTCPA…°ù‚¨faf`g€{… gfSgf‹ ë%gfSgf‹J(fùƒ gf‹B,f#À„f3Éèõýf#É„2fº€f;ʆf+ÊfQfWfRf‹Êè·ýèûýfZf_fYfúëÚè¥ýèéýè þf»TCPAf¿ f¹f¸»fº f3öÍfaàùé@ñ úé:ñÿÿÿFILE08˜`H0hJuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ìll$MFT€H@@0°H@@ÿÿÿÿFILE08X`HuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì0pRuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì$MFTMirr€H@@!ÿÿÿÿÿFILE08X`HuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì0pRuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì$LogFile€H@?@!@ÿÿÿÿFILE08ðH0uÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì0hPuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì$Volume@(Ö¾ù(KŽð ñHAP€d€HT4ŸŸ  `p( €ÿÿÿÿFILE08ÀH0uÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì0pRuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì $AttrDefP€d€HT4‰‰  €H@@ FÿÿÿÿFILE0ä8H0uÖ3P¼Ì8ÂÖ>ÄäÐ8ÂÖ>ÄäÐ8ÂÖ>ÄäÐ&0`DuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì.PH@@ ,,CX8 $I300(( P@H$I30E°( $I30ÿÿÿÿFILE08P`HuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì0hPuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì@$Bitmap€H@@@@GÿÿÿÿFILE08¸H0uÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì0hLuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì $BootP€d€HT4‰‰  €H@@ ÿÿÿÿFILE08x`HuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì0pRuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì$BadClusÿÿ€€P@þHðð$BadÿÿÿÿÿFILE0ì 8 ° `HuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì 0hPuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì $Secure€P@@HDD$SDSAH@  $SDH0Q$³Q$³€|II0ÕOc ÕOc ´II0"v "v xII0£áh£áh€ II0ðøðø|IIø $SIIèè(ðø|(Q$³€|("v x(£áh€ (ÕOc ´ÿÿÿÿFILE0 8P `HuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì0hPuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì$UpCase€H@@! ‰ÿÿÿÿFILE0} 8è `HuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì0hPuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì$ExtendàÀ $I300°°`N uÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì& $ObjId`N uÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì& $QuotahR uÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì& $ReparsehX 0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ $RmMetadataÿÿÿÿFILE0 8  H0uÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌP€d€HT4ŸŸ  €ÿÿÿÿFILE0 8  H0uÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌP€d€HT4ŸŸ  €ÿÿÿÿFILE08 H0uÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌP€d€HT4ŸŸ  €ÿÿÿÿFILE08 H0uÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌP€d€HT4ŸŸ  €ÿÿÿÿFILE08ˆH0uÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌÿÿÿÿFILE08ˆH0uÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌÿÿÿÿFILE08ˆH0uÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌÿÿÿÿFILE08ˆH0uÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌÿÿÿÿFILE08ˆH0uÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌÿÿÿÿFILE08ˆH0uÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌÿÿÿÿFILE08ˆH0uÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌÿÿÿÿFILE08ˆH0uÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌÿÿÿÿFILE08 p`HuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì& 0hN uÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì& $QuotaxX $OHH (  ðÐ $QÀÀ0HuÖ3P¼Ìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@XuÖ3P¼Ìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿFILE08 °`HuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì& 0hN uÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì& $ObjId¨ˆ $Oxx 8XÖ¾ù(KŽð ñHAÿÿÿÿFILE08 ``HuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì& 0pR uÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì& $ReparseP0 $R ÿÿÿÿFILE0 8 x`H0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ0pX 0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ $RmMetadatað $I300àà`P0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ&$Repair`PAð‹ÔÃäÐAð‹ÔÃäÐAð‹ÔÃäÐAð‹ÔÃäÐ$TfLogÿÿÿÿ‚yGFILE0Ì 8€`H0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ&0hP0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ&$Repair€Hÿÿÿÿÿÿÿÿ@€ùÿÿ€0($Configÿÿÿÿ‚yGFILE0Î 8X`HAð‹ÔÃäÐAð‹ÔÃäÐAð‹ÔÃäÐAð‹ÔÃäÐ0hPAð‹ÔÃäÐAð‹ÔÃäÐAð‹ÔÃäÐAð‹ÔÃäÐ$TxfLogP0 $I300 ÿÿÿÿ‚yGFILE0`8`H8ÂÖ>ÄäÐ{ŽLSÄäÐ{ŽLSÄäÐ{ŽLSÄäÐ0hP8ÂÖ>ÄäÐ8ÂÖ>ÄäÐ8ÂÖ>ÄäÐ8ÂÖ>ÄäÐadstestè $I300ØØ`LÜFDÄäÐmŠûPÄäÐmŠûPÄäÐÜFDÄäÐ a.txt XH{ŽLSÄäÐ! "ýÐäÐ! "ýÐäÐ! "ýÐäÐ dirÿÿÿÿ‚yGFILE0A8x`HÜFDÄäÐmŠûPÄäÐmŠûPÄäÐÜFDÄäÐ 0hLÜFDÄäÐÜFDÄäÐÜFDÄäÐÜFDÄäÐ a.txt€( This is a.txt€H(ads.txtThis is the ads for a.txtÿÿÿÿ‚yGFILE0í 8X Ð`H{ŽLSÄäÐ! "ýÐäÐ! "ýÐäÐ! "ýÐäÐ 0`H{ŽLSÄäÐ{ŽLSÄäÐ{ŽLSÄäÐ{ŽLSÄäÐdir€@(ads.txtThis is the dir ads ø $I300èè!`L ç”­`ÄäжElÄäжElÄäÐç”­`ÄäÐ b.txt"hV ! "ýÐäÐAi5ÑäAi5ÑäÐ! "ýÐäÐ no_ads.txtÿÿÿÿ‚yGFILE0ç8x!`Hç”­`ÄäжElÄäжElÄäÐç”­`ÄäÐ 0hL ç”­`ÄäÐç”­`ÄäÐç”­`ÄäÐç”­`ÄäÐ b.txt€( This is b.txt€H(ads.txtThis is the ads for b.txtÿÿÿÿ‚yGFILE0"8@"`H! "ýÐäÐAi5ÑäÐAi5ÑäÐ! "ýÐäÐ 0pV ! "ýÐäÐ! "ýÐäÐ! "ýÐäÐ! "ýÐäÐ no_ads.txt€0This file has no adsÿÿÿÿ‚yGFILE08@#ÿÿÿÿFILE08@$ÿÿÿÿFILE08@%ÿÿÿÿFILE08@&ÿÿÿÿFILE08@'ÿÿÿÿFILE08@(ÿÿÿÿFILE08@)ÿÿÿÿFILE08@*ÿÿÿÿFILE08@+ÿÿÿÿFILE08@,ÿÿÿÿFILE08@-ÿÿÿÿFILE08@.ÿÿÿÿFILE08@/ÿÿÿÿFILE08@0ÿÿÿÿFILE08@1ÿÿÿÿFILE08@2ÿÿÿÿFILE08@3ÿÿÿÿFILE08@4ÿÿÿÿFILE08@5ÿÿÿÿFILE08@6ÿÿÿÿFILE08@7ÿÿÿÿFILE08@8ÿÿÿÿFILE08@9ÿÿÿÿFILE08@:ÿÿÿÿFILE08@;ÿÿÿÿFILE08@<ÿÿÿÿFILE08@=ÿÿÿÿFILE08@>ÿÿÿÿFILE08@?ÿÿÿÿFILE08@ tH02ØïÏP¼Ì¶î© Q¼Ì¶î© Q¼Ì´nûHT¼Ì 0x^2ØïÏP¼Ì2ØïÏP¼Ì2ØïÏP¼Ì2ØïÏP¼Ì Test DirectoryPhP€$4  ÿ € $I300ppAhT@Z’ûÜP¼Ì:_f{T¼Ì:_f{T¼ÌZ’ûÜP¼Ì notes. xtBp\@€}ÑëP¼Ìb‚ÑëP¼Ìb‚ÑëP¼Ì€}ÑëP¼Ì notes.txt:adsCxd@øí© Q¼ÌÐò© Q¼ÌÐò© Q¼Ìøí© Q¼Ì eQaN–×O wmY%f‚‚+R7hÇÕl.txtÿÿÿÿ FILE08¸AH0Z’ûÜP¼Ì:_f{T¼Ì:_f{T¼ÌZ’ûÜP¼Ì 0pT@Z’ûÜP¼ÌZ’ûÜP¼ÌZ’ûÜP¼ÌZ’ûÜP¼Ì notes.txtPhP€$4  ÿ€( Hello world €0 adsI am a real ADS ÿÿÿÿFILE08BH0€}ÑëP¼Ìb‚ÑëP¼Ìb‚ÑëP¼Ì€}ÑëP¼Ì 0x\@€}ÑëP¼Ì€}ÑëP¼Ì€}ÑëP¼Ì€}ÑëP¼Ì notes.txt:adsPhP€$4  ÿ€( I am an ADS ÿÿÿÿFILE08˜CH0øí© Q¼ÌÐò© Q¼ÌÐò© Q¼Ìøí© Q¼Ì 0€d@øí© Q¼Ìøí© Q¼Ìøí© Q¼Ìøí© Q¼Ì eQaN–×O wmY%f‚‚+R7hÇÕl.txtPhP€$4  ÿ€( Chinese news ÿÿÿÿ€ ÿ   ÿ ¿ à © !   !INDX( } ( èÌhRuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì $AttrDefhRuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì$BadClus`PuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì@$Bitmap`LuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì $Bootil `PuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼uÖ3P¼Ì$ExtendhRuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì$LogFile`JuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ìll$MFThRuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì$MFTMirr `PuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì $Secure `PuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì$UpCase`PuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì$VolumeXDuÖ3P¼Ì8ÂÖ>ÄäÐ8ÂÖ>ÄäÐ8ÂÖ>ÄäÐ&.`P8ÂÖ>ÄäÐ{ŽLSÄäÐ{ŽLSÄäÐ{ŽLSÄäÐadstest@p^2ØïÏP¼Ì¶î© Q¼Ì¶î© Q¼Ì´nûHT¼Ì Test Directory$STANDARD_INFORMATION@0H$ATTRIBUTE_LIST €ÿÿÿÿÿÿÿÿ$FILE_NAME0BDB$OBJECT_ID@@$SECURITY_DESCRIPTORP€ÿÿÿÿÿÿÿÿ$VOLUME_NAME`@$VOLUME_INFORMATIONp@ $DATA€ÿÿÿÿÿÿÿÿ$INDEX_ROOT@ÿÿÿÿÿÿÿÿ$INDEX_ALLOCATION €ÿÿÿÿÿÿÿÿ$BITMAP°€ÿÿÿÿÿÿÿÿ$REPARSE_POINTÀ€@$EA_INFORMATIONÐ@$EAà$LOGGED_UTILITY_STREAM€÷ÿøÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿ€ðø|€HX4‰‰   Q$³€|€HX4ŸŸ   "v x€HX4ÿ‰  £áh€ €Ìܸÿ   ÿ ¿ à © !   ! ˜Wâ1P,ª&zÕOc ´€t„`ÿ ÿ¿ © ! ˜Wâ1P,ª&zðø|€HX4‰‰   Q$³€|€HX4ŸŸ   "v x€HX4ÿ‰  £áh€ €Ìܸÿ   ÿ ¿ à © !   ! ˜Wâ1P,ª&zÕOc ´€t„`ÿ ÿ¿ © ! ˜Wâ1P,ª&z  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ÷ØÙÚÛÜÝÞx      ""$$&&((**,,..01224466899;;==??AACCEEGGIJJLLNNPPRRTTVVXXZZ\\^^``bbddffhhjjllnnpprrttvvxyy{{}}C‚‚„„†‡‡‰Š‹‹Ž‘‘“”ö–—˜˜=›œ Ÿ  ¢¢¤¤¦§§©ª«¬¬®¯¯±²³³µµ·¸¸º»¼¼¾÷ÀÁÂÃÄÅÄÇÈÇÊËÊÍÍÏÏÑÑÓÓÕÕ××ÙÙÛÛŽÞÞààââääææèèêêììîîðñòñôôö÷øøúúüüþþ     !""$$&&((**,,..0022456789e,;;=f,?@AACDEFFHHJJLLNNPQR†U‰ŠXZ\]^_“ab”defg—–jb,lmnœpqstŸvwxyz{|d,~¦‚©„…†‡®D±²EŽ‘·“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyzýþÿ~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«†ˆ‰Š°‘’“”•–—˜™š›œžŸ ¡££¤¥¦§¨©ª«ŒŽÏÐÑÒÓÔÕÖרØÚÚÜÜÞÞààââääææèèêêììîîðñùóôõö÷÷ùúúüýþÿ      !"#$%&'()*+,-./ !"#$%&'()*+,-./     ``bbddffhhjjllnnpprrttvvxxzz||~~€€‚ƒ„…†‡ˆ‰ŠŠŒŒŽŽ’’””––˜˜ššœœžž  ¢¢¤¤¦¦¨¨ªª¬¬®®°°²²´´¶¶¸¸ºº¼¼¾¾ÀÁÁÃÃÅÅÇÇÉÉËËÍÍÀÐÐÒÒÔÔÖÖØØÚÚÜÜÞÞààââääææèèêêììîîððòòôôööøøúúüüþþ     !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUV‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ \ ] ^ _ ` 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 { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ \ ] ^ _ ` 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 { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ \ ] ^ _ ` 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 { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ \ ] ^ _ ` 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 { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ \ ] ^ _ ` 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 { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ       !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|c,~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      ""$$&&((**,,..0022446688::<<>>@@BBDDFFHHJJLLNNPPRRTTVVXXZZ\\^^``bbddffhhjjllnnpprrttvvxxzz||~~€€‚‚„„††ˆˆŠŠŒŒŽŽ’’””–—˜™š›œžŸ  ¢¢¤¤¦¦¨¨ªª¬¬®®°°²²´´¶¶¸¸ºº¼¼¾¾ÀÀÂÂÄÄÆÆÈÈÊÊÌÌÎÎÐÐÒÒÔÔÖÖØØÚÚÜÜÞÞààââääææèèêêììîîððòòôôööøøúûüýþÿ          ()*+,-./()*+,-./89:;<=>?89:;<=>?HIJKLMFGHIJKLMNOPYR[T]V_XYZ[\]^_hijklmnohijklmnoº»ÈÉÊËÚÛøùêëúû~ˆ‰Š‹ŒŽˆ‰Š‹ŒŽ˜™š›œžŸ˜™š›œžŸ¨©ª«¬­®¯¨©ª«¬­®¯¸¹²¼´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÃÍÎÏØÙÒÓÔÕÖרÙÚÛÜÝÞßèéâãäìæçèéêëìíîïðñòóôõö÷øùúûóýþÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ \ ] ^ _ ` 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 { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ !!!!!!!!! ! ! ! ! !!!!!!!!!!!!!!!!!!! !!!"!#!$!%!&!'!(!)!*!+!,!-!.!/!0!1!2!3!4!5!6!7!8!9!:!;!!?!@!A!B!C!D!E!F!G!H!I!J!K!L!M!2!O!P!Q!R!S!T!U!V!W!X!Y!Z![!\!]!^!_!`!a!b!c!d!e!f!g!h!i!j!k!l!m!n!o!`!a!b!c!d!e!f!g!h!i!j!k!l!m!n!o!€!!‚!ƒ!ƒ!…!†!‡!ˆ!‰!Š!‹!Œ!!Ž!!!‘!’!“!”!•!–!—!˜!™!š!›!œ!!ž!Ÿ! !¡!¢!£!¤!¥!¦!§!¨!©!ª!«!¬!­!®!¯!°!±!²!³!´!µ!¶!·!¸!¹!º!»!¼!½!¾!¿!À!Á!Â!Ã!Ä!Å!Æ!Ç!È!É!Ê!Ë!Ì!Í!Î!Ï!Ð!Ñ!Ò!Ó!Ô!Õ!Ö!×!Ø!Ù!Ú!Û!Ü!Ý!Þ!ß!à!á!â!ã!ä!å!æ!ç!è!é!ê!ë!ì!í!î!ï!ð!ñ!ò!ó!ô!õ!ö!÷!ø!ù!ú!û!ü!ý!þ!ÿ!""""""""" " " " " """"""""""""""""""" "!"""#"$"%"&"'"(")"*"+","-"."/"0"1"2"3"4"5"6"7"8"9":";"<"=">"?"@"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"["\"]"^"_"`"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"{"|"}"~""€""‚"ƒ"„"…"†"‡"ˆ"‰"Š"‹"Œ""Ž"""‘"’"“"”"•"–"—"˜"™"š"›"œ""ž"Ÿ" "¡"¢"£"¤"¥"¦"§"¨"©"ª"«"¬"­"®"¯"°"±"²"³"´"µ"¶"·"¸"¹"º"»"¼"½"¾"¿"À"Á"Â"Ã"Ä"Å"Æ"Ç"È"É"Ê"Ë"Ì"Í"Î"Ï"Ð"Ñ"Ò"Ó"Ô"Õ"Ö"×"Ø"Ù"Ú"Û"Ü"Ý"Þ"ß"à"á"â"ã"ä"å"æ"ç"è"é"ê"ë"ì"í"î"ï"ð"ñ"ò"ó"ô"õ"ö"÷"ø"ù"ú"û"ü"ý"þ"ÿ"######### # # # # ################### #!#"###$#%#&#'#(#)#*#+#,#-#.#/#0#1#2#3#4#5#6#7#8#9#:#;#<#=#>#?#@#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#[#\#]#^#_#`#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#{#|#}#~##€##‚#ƒ#„#…#†#‡#ˆ#‰#Š#‹#Œ##Ž###‘#’#“#”#•#–#—#˜#™#š#›#œ##ž#Ÿ# #¡#¢#£#¤#¥#¦#§#¨#©#ª#«#¬#­#®#¯#°#±#²#³#´#µ#¶#·#¸#¹#º#»#¼#½#¾#¿#À#Á#Â#Ã#Ä#Å#Æ#Ç#È#É#Ê#Ë#Ì#Í#Î#Ï#Ð#Ñ#Ò#Ó#Ô#Õ#Ö#×#Ø#Ù#Ú#Û#Ü#Ý#Þ#ß#à#á#â#ã#ä#å#æ#ç#è#é#ê#ë#ì#í#î#ï#ð#ñ#ò#ó#ô#õ#ö#÷#ø#ù#ú#û#ü#ý#þ#ÿ#$$$$$$$$$ $ $ $ $ $$$$$$$$$$$$$$$$$$$ $!$"$#$$$%$&$'$($)$*$+$,$-$.$/$0$1$2$3$4$5$6$7$8$9$:$;$<$=$>$?$@$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$[$\$]$^$_$`$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${$|$}$~$$€$$‚$ƒ$„$…$†$‡$ˆ$‰$Š$‹$Œ$$Ž$$$‘$’$“$”$•$–$—$˜$™$š$›$œ$$ž$Ÿ$ $¡$¢$£$¤$¥$¦$§$¨$©$ª$«$¬$­$®$¯$°$±$²$³$´$µ$¶$·$¸$¹$º$»$¼$½$¾$¿$À$Á$Â$Ã$Ä$Å$Æ$Ç$È$É$Ê$Ë$Ì$Í$Î$Ï$¶$·$¸$¹$º$»$¼$½$¾$¿$À$Á$Â$Ã$Ä$Å$Æ$Ç$È$É$Ê$Ë$Ì$Í$Î$Ï$ê$ë$ì$í$î$ï$ð$ñ$ò$ó$ô$õ$ö$÷$ø$ù$ú$û$ü$ý$þ$ÿ$%%%%%%%%% % % % % %%%%%%%%%%%%%%%%%%% %!%"%#%$%%%&%'%(%)%*%+%,%-%.%/%0%1%2%3%4%5%6%7%8%9%:%;%<%=%>%?%@%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%[%\%]%^%_%`%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%{%|%}%~%%€%%‚%ƒ%„%…%†%‡%ˆ%‰%Š%‹%Œ%%Ž%%%‘%’%“%”%•%–%—%˜%™%š%›%œ%%ž%Ÿ% %¡%¢%£%¤%¥%¦%§%¨%©%ª%«%¬%­%®%¯%°%±%²%³%´%µ%¶%·%¸%¹%º%»%¼%½%¾%¿%À%Á%Â%Ã%Ä%Å%Æ%Ç%È%É%Ê%Ë%Ì%Í%Î%Ï%Ð%Ñ%Ò%Ó%Ô%Õ%Ö%×%Ø%Ù%Ú%Û%Ü%Ý%Þ%ß%à%á%â%ã%ä%å%æ%ç%è%é%ê%ë%ì%í%î%ï%ð%ñ%ò%ó%ô%õ%ö%÷%ø%ù%ú%û%ü%ý%þ%ÿ%&&&&&&&&& & & & & &&&&&&&&&&&&&&&&&&& &!&"&#&$&%&&&'&(&)&*&+&,&-&.&/&0&1&2&3&4&5&6&7&8&9&:&;&<&=&>&?&@&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&[&\&]&^&_&`&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&{&|&}&~&&€&&‚&ƒ&„&…&†&‡&ˆ&‰&Š&‹&Œ&&Ž&&&‘&’&“&”&•&–&—&˜&™&š&›&œ&&ž&Ÿ& &¡&¢&£&¤&¥&¦&§&¨&©&ª&«&¬&­&®&¯&°&±&²&³&´&µ&¶&·&¸&¹&º&»&¼&½&¾&¿&À&Á&Â&Ã&Ä&Å&Æ&Ç&È&É&Ê&Ë&Ì&Í&Î&Ï&Ð&Ñ&Ò&Ó&Ô&Õ&Ö&×&Ø&Ù&Ú&Û&Ü&Ý&Þ&ß&à&á&â&ã&ä&å&æ&ç&è&é&ê&ë&ì&í&î&ï&ð&ñ&ò&ó&ô&õ&ö&÷&ø&ù&ú&û&ü&ý&þ&ÿ&''''''''' ' ' ' ' ''''''''''''''''''' '!'"'#'$'%'&'''(')'*'+','-'.'/'0'1'2'3'4'5'6'7'8'9':';'<'='>'?'@'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'['\']'^'_'`'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'{'|'}'~''€''‚'ƒ'„'…'†'‡'ˆ'‰'Š'‹'Œ''Ž'''‘'’'“'”'•'–'—'˜'™'š'›'œ''ž'Ÿ' '¡'¢'£'¤'¥'¦'§'¨'©'ª'«'¬'­'®'¯'°'±'²'³'´'µ'¶'·'¸'¹'º'»'¼'½'¾'¿'À'Á'Â'Ã'Ä'Å'Æ'Ç'È'É'Ê'Ë'Ì'Í'Î'Ï'Ð'Ñ'Ò'Ó'Ô'Õ'Ö'×'Ø'Ù'Ú'Û'Ü'Ý'Þ'ß'à'á'â'ã'ä'å'æ'ç'è'é'ê'ë'ì'í'î'ï'ð'ñ'ò'ó'ô'õ'ö'÷'ø'ù'ú'û'ü'ý'þ'ÿ'((((((((( ( ( ( ( ((((((((((((((((((( (!("(#($(%(&('((()(*(+(,(-(.(/(0(1(2(3(4(5(6(7(8(9(:(;(<(=(>(?(@(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([(\(](^(_(`(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({(|(}(~((€((‚(ƒ(„(…(†(‡(ˆ(‰(Š(‹(Œ((Ž(((‘(’(“(”(•(–(—(˜(™(š(›(œ((ž(Ÿ( (¡(¢(£(¤(¥(¦(§(¨(©(ª(«(¬(­(®(¯(°(±(²(³(´(µ(¶(·(¸(¹(º(»(¼(½(¾(¿(À(Á(Â(Ã(Ä(Å(Æ(Ç(È(É(Ê(Ë(Ì(Í(Î(Ï(Ð(Ñ(Ò(Ó(Ô(Õ(Ö(×(Ø(Ù(Ú(Û(Ü(Ý(Þ(ß(à(á(â(ã(ä(å(æ(ç(è(é(ê(ë(ì(í(î(ï(ð(ñ(ò(ó(ô(õ(ö(÷(ø(ù(ú(û(ü(ý(þ(ÿ())))))))) ) ) ) ) ))))))))))))))))))) )!)")#)$)%)&)')()))*)+),)-).)/)0)1)2)3)4)5)6)7)8)9):);)<)=)>)?)@)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)[)\)])^)_)`)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){)|)})~))€))‚)ƒ)„)…)†)‡)ˆ)‰)Š)‹)Œ))Ž)))‘)’)“)”)•)–)—)˜)™)š)›)œ))ž)Ÿ) )¡)¢)£)¤)¥)¦)§)¨)©)ª)«)¬)­)®)¯)°)±)²)³)´)µ)¶)·)¸)¹)º)»)¼)½)¾)¿)À)Á)Â)Ã)Ä)Å)Æ)Ç)È)É)Ê)Ë)Ì)Í)Î)Ï)Ð)Ñ)Ò)Ó)Ô)Õ)Ö)×)Ø)Ù)Ú)Û)Ü)Ý)Þ)ß)à)á)â)ã)ä)å)æ)ç)è)é)ê)ë)ì)í)î)ï)ð)ñ)ò)ó)ô)õ)ö)÷)ø)ù)ú)û)ü)ý)þ)ÿ)********* * * * * ******************* *!*"*#*$*%*&*'*(*)***+*,*-*.*/*0*1*2*3*4*5*6*7*8*9*:*;*<*=*>*?*@*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*[*\*]*^*_*`*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*{*|*}*~**€**‚*ƒ*„*…*†*‡*ˆ*‰*Š*‹*Œ**Ž***‘*’*“*”*•*–*—*˜*™*š*›*œ**ž*Ÿ* *¡*¢*£*¤*¥*¦*§*¨*©*ª*«*¬*­*®*¯*°*±*²*³*´*µ*¶*·*¸*¹*º*»*¼*½*¾*¿*À*Á*Â*Ã*Ä*Å*Æ*Ç*È*É*Ê*Ë*Ì*Í*Î*Ï*Ð*Ñ*Ò*Ó*Ô*Õ*Ö*×*Ø*Ù*Ú*Û*Ü*Ý*Þ*ß*à*á*â*ã*ä*å*æ*ç*è*é*ê*ë*ì*í*î*ï*ð*ñ*ò*ó*ô*õ*ö*÷*ø*ù*ú*û*ü*ý*þ*ÿ*+++++++++ + + + + +++++++++++++++++++ +!+"+#+$+%+&+'+(+)+*+++,+-+.+/+0+1+2+3+4+5+6+7+8+9+:+;+<+=+>+?+@+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+[+\+]+^+_+`+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+{+|+}+~++€++‚+ƒ+„+…+†+‡+ˆ+‰+Š+‹+Œ++Ž+++‘+’+“+”+•+–+—+˜+™+š+›+œ++ž+Ÿ+ +¡+¢+£+¤+¥+¦+§+¨+©+ª+«+¬+­+®+¯+°+±+²+³+´+µ+¶+·+¸+¹+º+»+¼+½+¾+¿+À+Á+Â+Ã+Ä+Å+Æ+Ç+È+É+Ê+Ë+Ì+Í+Î+Ï+Ð+Ñ+Ò+Ó+Ô+Õ+Ö+×+Ø+Ù+Ú+Û+Ü+Ý+Þ+ß+à+á+â+ã+ä+å+æ+ç+è+é+ê+ë+ì+í+î+ï+ð+ñ+ò+ó+ô+õ+ö+÷+ø+ù+ú+û+ü+ý+þ+ÿ+,,,,,,,,, , , , , ,,,,,,,,,,,,,,,,,,, ,!,",#,$,%,&,',(,),*,+,,,-,.,/,,,,,,,,,, , , , , ,,,,,,,,,,,,,,,,,,, ,!,",#,$,%,&,',(,),*,+,,,-,.,_,`,`,b,c,d,e,f,g,g,i,i,k,k,m,n,o,p,q,r,s,t,u,u,w,x,y,z,{,|,},~,,€,€,‚,‚,„,„,†,†,ˆ,ˆ,Š,Š,Œ,Œ,Ž,Ž,,,’,’,”,”,–,–,˜,˜,š,š,œ,œ,ž,ž, , ,¢,¢,¤,¤,¦,¦,¨,¨,ª,ª,¬,¬,®,®,°,°,²,²,´,´,¶,¶,¸,¸,º,º,¼,¼,¾,¾,À,À,Â,Â,Ä,Ä,Æ,Æ,È,È,Ê,Ê,Ì,Ì,Î,Î,Ð,Ð,Ò,Ò,Ô,Ô,Ö,Ö,Ø,Ø,Ú,Ú,Ü,Ü,Þ,Þ,à,à,â,â,ä,å,æ,ç,è,é,ê,ë,ì,í,î,ï,ð,ñ,ò,ó,ô,õ,ö,÷,ø,ù,ú,û,ü,ý,þ,ÿ, ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅ&-'-(-)-*-+-,---.-/-0-1-2-3-4-5-6-7-8-9-:-;-<-=->-?-@-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-[-\-]-^-_-`-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-{-|-}-~--€--‚-ƒ-„-…-†-‡-ˆ-‰-Š-‹-Œ--Ž---‘-’-“-”-•-–-—-˜-™-š-›-œ--ž-Ÿ- -¡-¢-£-¤-¥-¦-§-¨-©-ª-«-¬-­-®-¯-°-±-²-³-´-µ-¶-·-¸-¹-º-»-¼-½-¾-¿-À-Á-Â-Ã-Ä-Å-Æ-Ç-È-É-Ê-Ë-Ì-Í-Î-Ï-Ð-Ñ-Ò-Ó-Ô-Õ-Ö-×-Ø-Ù-Ú-Û-Ü-Ý-Þ-ß-à-á-â-ã-ä-å-æ-ç-è-é-ê-ë-ì-í-î-ï-ð-ñ-ò-ó-ô-õ-ö-÷-ø-ù-ú-û-ü-ý-þ-ÿ-......... . . . . ................... .!.".#.$.%.&.'.(.).*.+.,.-.../.0.1.2.3.4.5.6.7.8.9.:.;.<.=.>.?.@.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.[.\.].^._.`.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.{.|.}.~..€..‚.ƒ.„.….†.‡.ˆ.‰.Š.‹.Œ..Ž...‘.’.“.”.•.–.—.˜.™.š.›.œ..ž.Ÿ. .¡.¢.£.¤.¥.¦.§.¨.©.ª.«.¬.­.®.¯.°.±.².³.´.µ.¶.·.¸.¹.º.».¼.½.¾.¿.À.Á.Â.Ã.Ä.Å.Æ.Ç.È.É.Ê.Ë.Ì.Í.Î.Ï.Ð.Ñ.Ò.Ó.Ô.Õ.Ö.×.Ø.Ù.Ú.Û.Ü.Ý.Þ.ß.à.á.â.ã.ä.å.æ.ç.è.é.ê.ë.ì.í.î.ï.ð.ñ.ò.ó.ô.õ.ö.÷.ø.ù.ú.û.ü.ý.þ.ÿ.///////// / / / / /////////////////// /!/"/#/$/%/&/'/(/)/*/+/,/-/.///0/1/2/3/4/5/6/7/8/9/:/;//?/@/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/[/\/]/^/_/`/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/{/|/}/~//€//‚/ƒ/„/…/†/‡/ˆ/‰/Š/‹/Œ//Ž///‘/’/“/”/•/–/—/˜/™/š/›/œ//ž/Ÿ/ /¡/¢/£/¤/¥/¦/§/¨/©/ª/«/¬/­/®/¯/°/±/²/³/´/µ/¶/·/¸/¹/º/»/¼/½/¾/¿/À/Á/Â/Ã/Ä/Å/Æ/Ç/È/É/Ê/Ë/Ì/Í/Î/Ï/Ð/Ñ/Ò/Ó/Ô/Õ/Ö/×/Ø/Ù/Ú/Û/Ü/Ý/Þ/ß/à/á/â/ã/ä/å/æ/ç/è/é/ê/ë/ì/í/î/ï/ð/ñ/ò/ó/ô/õ/ö/÷/ø/ù/ú/û/ü/ý/þ/ÿ/000000000 0 0 0 0 0000000000000000000 0!0"0#0$0%0&0'0(0)0*0+0,0-0.0/000102030405060708090:0;0<0=0>0?0@0A0B0C0D0E0F0G0H0I0J0K0L0M0N0O0P0Q0R0S0T0U0V0W0X0Y0Z0[0\0]0^0_0`0a0b0c0d0e0f0g0h0i0j0k0l0m0n0o0p0q0r0s0t0u0v0w0x0y0z0{0|0}0~00€00‚0ƒ0„0…0†0‡0ˆ0‰0Š0‹0Œ00Ž000‘0’0“0”0•0–0—0˜0™0š0›0œ00ž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½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Ü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û0ü0ý0þ0ÿ0111111111 1 1 1 1 1111111111111111111 1!1"1#1$1%1&1'1(1)1*1+1,1-1.1/101112131415161718191:1;1<1=1>1?1@1A1B1C1D1E1F1G1H1I1J1K1L1M1N1O1P1Q1R1S1T1U1V1W1X1Y1Z1[1\1]1^1_1`1a1b1c1d1e1f1g1h1i1j1k1l1m1n1o1p1q1r1s1t1u1v1w1x1y1z1{1|1}1~11€11‚1ƒ1„1…1†1‡1ˆ1‰1Š1‹1Œ11Ž111‘1’1“1”1•1–1—1˜1™1š1›1œ11ž1Ÿ1 1¡1¢1£1¤1¥1¦1§1¨1©1ª1«1¬1­1®1¯1°1±1²1³1´1µ1¶1·1¸1¹1º1»1¼1½1¾1¿1À1Á1Â1Ã1Ä1Å1Æ1Ç1È1É1Ê1Ë1Ì1Í1Î1Ï1Ð1Ñ1Ò1Ó1Ô1Õ1Ö1×1Ø1Ù1Ú1Û1Ü1Ý1Þ1ß1à1á1â1ã1ä1å1æ1ç1è1é1ê1ë1ì1í1î1ï1ð1ñ1ò1ó1ô1õ1ö1÷1ø1ù1ú1û1ü1ý1þ1ÿ1222222222 2 2 2 2 2222222222222222222 2!2"2#2$2%2&2'2(2)2*2+2,2-2.2/202122232425262728292:2;2<2=2>2?2@2A2B2C2D2E2F2G2H2I2J2K2L2M2N2O2P2Q2R2S2T2U2V2W2X2Y2Z2[2\2]2^2_2`2a2b2c2d2e2f2g2h2i2j2k2l2m2n2o2p2q2r2s2t2u2v2w2x2y2z2{2|2}2~22€22‚2ƒ2„2…2†2‡2ˆ2‰2Š2‹2Œ22Ž222‘2’2“2”2•2–2—2˜2™2š2›2œ22ž2Ÿ2 2¡2¢2£2¤2¥2¦2§2¨2©2ª2«2¬2­2®2¯2°2±2²2³2´2µ2¶2·2¸2¹2º2»2¼2½2¾2¿2À2Á2Â2Ã2Ä2Å2Æ2Ç2È2É2Ê2Ë2Ì2Í2Î2Ï2Ð2Ñ2Ò2Ó2Ô2Õ2Ö2×2Ø2Ù2Ú2Û2Ü2Ý2Þ2ß2à2á2â2ã2ä2å2æ2ç2è2é2ê2ë2ì2í2î2ï2ð2ñ2ò2ó2ô2õ2ö2÷2ø2ù2ú2û2ü2ý2þ2ÿ2333333333 3 3 3 3 3333333333333333333 3!3"3#3$3%3&3'3(3)3*3+3,3-3.3/303132333435363738393:3;3<3=3>3?3@3A3B3C3D3E3F3G3H3I3J3K3L3M3N3O3P3Q3R3S3T3U3V3W3X3Y3Z3[3\3]3^3_3`3a3b3c3d3e3f3g3h3i3j3k3l3m3n3o3p3q3r3s3t3u3v3w3x3y3z3{3|3}3~33€33‚3ƒ3„3…3†3‡3ˆ3‰3Š3‹3Œ33Ž333‘3’3“3”3•3–3—3˜3™3š3›3œ33ž3Ÿ3 3¡3¢3£3¤3¥3¦3§3¨3©3ª3«3¬3­3®3¯3°3±3²3³3´3µ3¶3·3¸3¹3º3»3¼3½3¾3¿3À3Á3Â3Ã3Ä3Å3Æ3Ç3È3É3Ê3Ë3Ì3Í3Î3Ï3Ð3Ñ3Ò3Ó3Ô3Õ3Ö3×3Ø3Ù3Ú3Û3Ü3Ý3Þ3ß3à3á3â3ã3ä3å3æ3ç3è3é3ê3ë3ì3í3î3ï3ð3ñ3ò3ó3ô3õ3ö3÷3ø3ù3ú3û3ü3ý3þ3ÿ3444444444 4 4 4 4 4444444444444444444 4!4"4#4$4%4&4'4(4)4*4+4,4-4.4/404142434445464748494:4;4<4=4>4?4@4A4B4C4D4E4F4G4H4I4J4K4L4M4N4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4\4]4^4_4`4a4b4c4d4e4f4g4h4i4j4k4l4m4n4o4p4q4r4s4t4u4v4w4x4y4z4{4|4}4~44€44‚4ƒ4„4…4†4‡4ˆ4‰4Š4‹4Œ44Ž444‘4’4“4”4•4–4—4˜4™4š4›4œ44ž4Ÿ4 4¡4¢4£4¤4¥4¦4§4¨4©4ª4«4¬4­4®4¯4°4±4²4³4´4µ4¶4·4¸4¹4º4»4¼4½4¾4¿4À4Á4Â4Ã4Ä4Å4Æ4Ç4È4É4Ê4Ë4Ì4Í4Î4Ï4Ð4Ñ4Ò4Ó4Ô4Õ4Ö4×4Ø4Ù4Ú4Û4Ü4Ý4Þ4ß4à4á4â4ã4ä4å4æ4ç4è4é4ê4ë4ì4í4î4ï4ð4ñ4ò4ó4ô4õ4ö4÷4ø4ù4ú4û4ü4ý4þ4ÿ4555555555 5 5 5 5 5555555555555555555 5!5"5#5$5%5&5'5(5)5*5+5,5-5.5/505152535455565758595:5;5<5=5>5?5@5A5B5C5D5E5F5G5H5I5J5K5L5M5N5O5P5Q5R5S5T5U5V5W5X5Y5Z5[5\5]5^5_5`5a5b5c5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5s5t5u5v5w5x5y5z5{5|5}5~55€55‚5ƒ5„5…5†5‡5ˆ5‰5Š5‹5Œ55Ž555‘5’5“5”5•5–5—5˜5™5š5›5œ55ž5Ÿ5 5¡5¢5£5¤5¥5¦5§5¨5©5ª5«5¬5­5®5¯5°5±5²5³5´5µ5¶5·5¸5¹5º5»5¼5½5¾5¿5À5Á5Â5Ã5Ä5Å5Æ5Ç5È5É5Ê5Ë5Ì5Í5Î5Ï5Ð5Ñ5Ò5Ó5Ô5Õ5Ö5×5Ø5Ù5Ú5Û5Ü5Ý5Þ5ß5à5á5â5ã5ä5å5æ5ç5è5é5ê5ë5ì5í5î5ï5ð5ñ5ò5ó5ô5õ5ö5÷5ø5ù5ú5û5ü5ý5þ5ÿ5666666666 6 6 6 6 6666666666666666666 6!6"6#6$6%6&6'6(6)6*6+6,6-6.6/606162636465666768696:6;6<6=6>6?6@6A6B6C6D6E6F6G6H6I6J6K6L6M6N6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6\6]6^6_6`6a6b6c6d6e6f6g6h6i6j6k6l6m6n6o6p6q6r6s6t6u6v6w6x6y6z6{6|6}6~66€66‚6ƒ6„6…6†6‡6ˆ6‰6Š6‹6Œ66Ž666‘6’6“6”6•6–6—6˜6™6š6›6œ66ž6Ÿ6 6¡6¢6£6¤6¥6¦6§6¨6©6ª6«6¬6­6®6¯6°6±6²6³6´6µ6¶6·6¸6¹6º6»6¼6½6¾6¿6À6Á6Â6Ã6Ä6Å6Æ6Ç6È6É6Ê6Ë6Ì6Í6Î6Ï6Ð6Ñ6Ò6Ó6Ô6Õ6Ö6×6Ø6Ù6Ú6Û6Ü6Ý6Þ6ß6à6á6â6ã6ä6å6æ6ç6è6é6ê6ë6ì6í6î6ï6ð6ñ6ò6ó6ô6õ6ö6÷6ø6ù6ú6û6ü6ý6þ6ÿ6777777777 7 7 7 7 7777777777777777777 7!7"7#7$7%7&7'7(7)7*7+7,7-7.7/707172737475767778797:7;7<7=7>7?7@7A7B7C7D7E7F7G7H7I7J7K7L7M7N7O7P7Q7R7S7T7U7V7W7X7Y7Z7[7\7]7^7_7`7a7b7c7d7e7f7g7h7i7j7k7l7m7n7o7p7q7r7s7t7u7v7w7x7y7z7{7|7}7~77€77‚7ƒ7„7…7†7‡7ˆ7‰7Š7‹7Œ77Ž777‘7’7“7”7•7–7—7˜7™7š7›7œ77ž7Ÿ7 7¡7¢7£7¤7¥7¦7§7¨7©7ª7«7¬7­7®7¯7°7±7²7³7´7µ7¶7·7¸7¹7º7»7¼7½7¾7¿7À7Á7Â7Ã7Ä7Å7Æ7Ç7È7É7Ê7Ë7Ì7Í7Î7Ï7Ð7Ñ7Ò7Ó7Ô7Õ7Ö7×7Ø7Ù7Ú7Û7Ü7Ý7Þ7ß7à7á7â7ã7ä7å7æ7ç7è7é7ê7ë7ì7í7î7ï7ð7ñ7ò7ó7ô7õ7ö7÷7ø7ù7ú7û7ü7ý7þ7ÿ7888888888 8 8 8 8 8888888888888888888 8!8"8#8$8%8&8'8(8)8*8+8,8-8.8/808182838485868788898:8;8<8=8>8?8@8A8B8C8D8E8F8G8H8I8J8K8L8M8N8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8\8]8^8_8`8a8b8c8d8e8f8g8h8i8j8k8l8m8n8o8p8q8r8s8t8u8v8w8x8y8z8{8|8}8~88€88‚8ƒ8„8…8†8‡8ˆ8‰8Š8‹8Œ88Ž888‘8’8“8”8•8–8—8˜8™8š8›8œ88ž8Ÿ8 8¡8¢8£8¤8¥8¦8§8¨8©8ª8«8¬8­8®8¯8°8±8²8³8´8µ8¶8·8¸8¹8º8»8¼8½8¾8¿8À8Á8Â8Ã8Ä8Å8Æ8Ç8È8É8Ê8Ë8Ì8Í8Î8Ï8Ð8Ñ8Ò8Ó8Ô8Õ8Ö8×8Ø8Ù8Ú8Û8Ü8Ý8Þ8ß8à8á8â8ã8ä8å8æ8ç8è8é8ê8ë8ì8í8î8ï8ð8ñ8ò8ó8ô8õ8ö8÷8ø8ù8ú8û8ü8ý8þ8ÿ8999999999 9 9 9 9 9999999999999999999 9!9"9#9$9%9&9'9(9)9*9+9,9-9.9/909192939495969798999:9;9<9=9>9?9@9A9B9C9D9E9F9G9H9I9J9K9L9M9N9O9P9Q9R9S9T9U9V9W9X9Y9Z9[9\9]9^9_9`9a9b9c9d9e9f9g9h9i9j9k9l9m9n9o9p9q9r9s9t9u9v9w9x9y9z9{9|9}9~99€99‚9ƒ9„9…9†9‡9ˆ9‰9Š9‹9Œ99Ž999‘9’9“9”9•9–9—9˜9™9š9›9œ99ž9Ÿ9 9¡9¢9£9¤9¥9¦9§9¨9©9ª9«9¬9­9®9¯9°9±9²9³9´9µ9¶9·9¸9¹9º9»9¼9½9¾9¿9À9Á9Â9Ã9Ä9Å9Æ9Ç9È9É9Ê9Ë9Ì9Í9Î9Ï9Ð9Ñ9Ò9Ó9Ô9Õ9Ö9×9Ø9Ù9Ú9Û9Ü9Ý9Þ9ß9à9á9â9ã9ä9å9æ9ç9è9é9ê9ë9ì9í9î9ï9ð9ñ9ò9ó9ô9õ9ö9÷9ø9ù9ú9û9ü9ý9þ9ÿ9::::::::: : : : : ::::::::::::::::::: :!:":#:$:%:&:':(:):*:+:,:-:.:/:0:1:2:3:4:5:6:7:8:9:::;:<:=:>:?:@: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:[:\:]:^:_:`: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:{:|:}:~::€::‚:ƒ:„:…:†:‡:ˆ:‰:Š:‹:Œ::Ž:::‘:’:“:”:•:–:—:˜:™:š:›:œ::ž:Ÿ: :¡:¢:£:¤:¥:¦:§:¨:©:ª:«:¬:­:®:¯:°:±:²:³:´:µ:¶:·:¸:¹:º:»:¼:½:¾:¿:À:Á:Â:Ã:Ä:Å:Æ:Ç:È:É:Ê:Ë:Ì:Í:Î:Ï:Ð:Ñ:Ò:Ó:Ô:Õ:Ö:×:Ø:Ù:Ú:Û:Ü:Ý:Þ:ß:à:á:â:ã:ä:å:æ:ç:è:é:ê:ë:ì:í:î:ï:ð:ñ:ò:ó:ô:õ:ö:÷:ø:ù:ú:û:ü:ý:þ:ÿ:;;;;;;;;; ; ; ; ; ;;;;;;;;;;;;;;;;;;; ;!;";#;$;%;&;';(;);*;+;,;-;.;/;0;1;2;3;4;5;6;7;8;9;:;;;<;=;>;?;@;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;[;\;];^;_;`;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;{;|;};~;;€;;‚;ƒ;„;…;†;‡;ˆ;‰;Š;‹;Œ;;Ž;;;‘;’;“;”;•;–;—;˜;™;š;›;œ;;ž;Ÿ; ;¡;¢;£;¤;¥;¦;§;¨;©;ª;«;¬;­;®;¯;°;±;²;³;´;µ;¶;·;¸;¹;º;»;¼;½;¾;¿;À;Á;Â;Ã;Ä;Å;Æ;Ç;È;É;Ê;Ë;Ì;Í;Î;Ï;Ð;Ñ;Ò;Ó;Ô;Õ;Ö;×;Ø;Ù;Ú;Û;Ü;Ý;Þ;ß;à;á;â;ã;ä;å;æ;ç;è;é;ê;ë;ì;í;î;ï;ð;ñ;ò;ó;ô;õ;ö;÷;ø;ù;ú;û;ü;ý;þ;ÿ;<<<<<<<<< < < < < <<<<<<<<<<<<<<<<<<< =?=@=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=[=\=]=^=_=`=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={=|=}=~==€==‚=ƒ=„=…=†=‡=ˆ=‰=Š=‹=Œ==Ž===‘=’=“=”=•=–=—=˜=™=š=›=œ==ž=Ÿ= =¡=¢=£=¤=¥=¦=§=¨=©=ª=«=¬=­=®=¯=°=±=²=³=´=µ=¶=·=¸=¹=º=»=¼=½=¾=¿=À=Á=Â=Ã=Ä=Å=Æ=Ç=È=É=Ê=Ë=Ì=Í=Î=Ï=Ð=Ñ=Ò=Ó=Ô=Õ=Ö=×=Ø=Ù=Ú=Û=Ü=Ý=Þ=ß=à=á=â=ã=ä=å=æ=ç=è=é=ê=ë=ì=í=î=ï=ð=ñ=ò=ó=ô=õ=ö=÷=ø=ù=ú=û=ü=ý=þ=ÿ=>>>>>>>>> > > > > >>>>>>>>>>>>>>>>>>> >!>">#>$>%>&>'>(>)>*>+>,>->.>/>0>1>2>3>4>5>6>7>8>9>:>;><>=>>>?>@>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>[>\>]>^>_>`>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>{>|>}>~>>€>>‚>ƒ>„>…>†>‡>ˆ>‰>Š>‹>Œ>>Ž>>>‘>’>“>”>•>–>—>˜>™>š>›>œ>>ž>Ÿ> >¡>¢>£>¤>¥>¦>§>¨>©>ª>«>¬>­>®>¯>°>±>²>³>´>µ>¶>·>¸>¹>º>»>¼>½>¾>¿>À>Á>Â>Ã>Ä>Å>Æ>Ç>È>É>Ê>Ë>Ì>Í>Î>Ï>Ð>Ñ>Ò>Ó>Ô>Õ>Ö>×>Ø>Ù>Ú>Û>Ü>Ý>Þ>ß>à>á>â>ã>ä>å>æ>ç>è>é>ê>ë>ì>í>î>ï>ð>ñ>ò>ó>ô>õ>ö>÷>ø>ù>ú>û>ü>ý>þ>ÿ>????????? ? ? ? ? ??????????????????? ?!?"?#?$?%?&?'?(?)?*?+?,?-?.?/?0?1?2?3?4?5?6?7?8?9?:?;????@?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?[?\?]?^?_?`?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?{?|?}?~??€??‚?ƒ?„?…?†?‡?ˆ?‰?Š?‹?Œ??Ž???‘?’?“?”?•?–?—?˜?™?š?›?œ??ž?Ÿ? ?¡?¢?£?¤?¥?¦?§?¨?©?ª?«?¬?­?®?¯?°?±?²?³?´?µ?¶?·?¸?¹?º?»?¼?½?¾?¿?À?Á?Â?Ã?Ä?Å?Æ?Ç?È?É?Ê?Ë?Ì?Í?Î?Ï?Ð?Ñ?Ò?Ó?Ô?Õ?Ö?×?Ø?Ù?Ú?Û?Ü?Ý?Þ?ß?à?á?â?ã?ä?å?æ?ç?è?é?ê?ë?ì?í?î?ï?ð?ñ?ò?ó?ô?õ?ö?÷?ø?ù?ú?û?ü?ý?þ?ÿ?@@@@@@@@@ @ @ @ @ @@@@@@@@@@@@@@@@@@@ @!@"@#@$@%@&@'@(@)@*@+@,@-@.@/@0@1@2@3@4@5@6@7@8@9@:@;@<@=@>@?@@@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@[@\@]@^@_@`@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@{@|@}@~@@€@@‚@ƒ@„@…@†@‡@ˆ@‰@Š@‹@Œ@@Ž@@@‘@’@“@”@•@–@—@˜@™@š@›@œ@@ž@Ÿ@ @¡@¢@£@¤@¥@¦@§@¨@©@ª@«@¬@­@®@¯@°@±@²@³@´@µ@¶@·@¸@¹@º@»@¼@½@¾@¿@À@Á@Â@Ã@Ä@Å@Æ@Ç@È@É@Ê@Ë@Ì@Í@Î@Ï@Ð@Ñ@Ò@Ó@Ô@Õ@Ö@×@Ø@Ù@Ú@Û@Ü@Ý@Þ@ß@à@á@â@ã@ä@å@æ@ç@è@é@ê@ë@ì@í@î@ï@ð@ñ@ò@ó@ô@õ@ö@÷@ø@ù@ú@û@ü@ý@þ@ÿ@AAAAAAAAA A A A A AAAAAAAAAAAAAAAAAAA A!A"A#A$A%A&A'A(A)A*A+A,A-A.A/A0A1A2A3A4A5A6A7A8A9A:A;AA?A@AAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZA[A\A]A^A_A`AaAbAcAdAeAfAgAhAiAjAkAlAmAnAoApAqArAsAtAuAvAwAxAyAzA{A|A}A~AA€AA‚AƒA„A…A†A‡AˆA‰AŠA‹AŒAAŽAAA‘A’A“A”A•A–A—A˜A™AšA›AœAAžAŸA A¡A¢A£A¤A¥A¦A§A¨A©AªA«A¬A­A®A¯A°A±A²A³A´AµA¶A·A¸A¹AºA»A¼A½A¾A¿AÀAÁAÂAÃAÄAÅAÆAÇAÈAÉAÊAËAÌAÍAÎAÏAÐAÑAÒAÓAÔAÕAÖA×AØAÙAÚAÛAÜAÝAÞAßAàAáAâAãAäAåAæAçAèAéAêAëAìAíAîAïAðAñAòAóAôAõAöA÷AøAùAúAûAüAýAþAÿABBBBBBBBB B B B B BBBBBBBBBBBBBBBBBBB B!B"B#B$B%B&B'B(B)B*B+B,B-B.B/B0B1B2B3B4B5B6B7B8B9B:B;BB?B@BABBBCBDBEBFBGBHBIBJBKBLBMBNBOBPBQBRBSBTBUBVBWBXBYBZB[B\B]B^B_B`BaBbBcBdBeBfBgBhBiBjBkBlBmBnBoBpBqBrBsBtBuBvBwBxByBzB{B|B}B~BB€BB‚BƒB„B…B†B‡BˆB‰BŠB‹BŒBBŽBBB‘B’B“B”B•B–B—B˜B™BšB›BœBBžBŸB B¡B¢B£B¤B¥B¦B§B¨B©BªB«B¬B­B®B¯B°B±B²B³B´BµB¶B·B¸B¹BºB»B¼B½B¾B¿BÀBÁBÂBÃBÄBÅBÆBÇBÈBÉBÊBËBÌBÍBÎBÏBÐBÑBÒBÓBÔBÕBÖB×BØBÙBÚBÛBÜBÝBÞBßBàBáBâBãBäBåBæBçBèBéBêBëBìBíBîBïBðBñBòBóBôBõBöB÷BøBùBúBûBüBýBþBÿBCCCCCCCCC C C C C CCCCCCCCCCCCCCCCCCC C!C"C#C$C%C&C'C(C)C*C+C,C-C.C/C0C1C2C3C4C5C6C7C8C9C:C;CC?C@CACBCCCDCECFCGCHCICJCKCLCMCNCOCPCQCRCSCTCUCVCWCXCYCZC[C\C]C^C_C`CaCbCcCdCeCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCyCzC{C|C}C~CC€CC‚CƒC„C…C†C‡CˆC‰CŠC‹CŒCCŽCCC‘C’C“C”C•C–C—C˜C™CšC›CœCCžCŸC C¡C¢C£C¤C¥C¦C§C¨C©CªC«C¬C­C®C¯C°C±C²C³C´CµC¶C·C¸C¹CºC»C¼C½C¾C¿CÀCÁCÂCÃCÄCÅCÆCÇCÈCÉCÊCËCÌCÍCÎCÏCÐCÑCÒCÓCÔCÕCÖC×CØCÙCÚCÛCÜCÝCÞCßCàCáCâCãCäCåCæCçCèCéCêCëCìCíCîCïCðCñCòCóCôCõCöC÷CøCùCúCûCüCýCþCÿCDDDDDDDDD D D D D DDDDDDDDDDDDDDDDDDD D!D"D#D$D%D&D'D(D)D*D+D,D-D.D/D0D1D2D3D4D5D6D7D8D9D:D;DD?D@DADBDCDDDEDFDGDHDIDJDKDLDMDNDODPDQDRDSDTDUDVDWDXDYDZD[D\D]D^D_D`DaDbDcDdDeDfDgDhDiDjDkDlDmDnDoDpDqDrDsDtDuDvDwDxDyDzD{D|D}D~DD€DD‚DƒD„D…D†D‡DˆD‰DŠD‹DŒDDŽDDD‘D’D“D”D•D–D—D˜D™DšD›DœDDžDŸD D¡D¢D£D¤D¥D¦D§D¨D©DªD«D¬D­D®D¯D°D±D²D³D´DµD¶D·D¸D¹DºD»D¼D½D¾D¿DÀDÁDÂDÃDÄDÅDÆDÇDÈDÉDÊDËDÌDÍDÎDÏDÐDÑDÒDÓDÔDÕDÖD×DØDÙDÚDÛDÜDÝDÞDßDàDáDâDãDäDåDæDçDèDéDêDëDìDíDîDïDðDñDòDóDôDõDöD÷DøDùDúDûDüDýDþDÿDEEEEEEEEE E E E E EEEEEEEEEEEEEEEEEEE E!E"E#E$E%E&E'E(E)E*E+E,E-E.E/E0E1E2E3E4E5E6E7E8E9E:E;EE?E@EAEBECEDEEEFEGEHEIEJEKELEMENEOEPEQERESETEUEVEWEXEYEZE[E\E]E^E_E`EaEbEcEdEeEfEgEhEiEjEkElEmEnEoEpEqErEsEtEuEvEwExEyEzE{E|E}E~EE€EE‚EƒE„E…E†E‡EˆE‰EŠE‹EŒEEŽEEE‘E’E“E”E•E–E—E˜E™EšE›EœEEžEŸE E¡E¢E£E¤E¥E¦E§E¨E©EªE«E¬E­E®E¯E°E±E²E³E´EµE¶E·E¸E¹EºE»E¼E½E¾E¿EÀEÁEÂEÃEÄEÅEÆEÇEÈEÉEÊEËEÌEÍEÎEÏEÐEÑEÒEÓEÔEÕEÖE×EØEÙEÚEÛEÜEÝEÞEßEàEáEâEãEäEåEæEçEèEéEêEëEìEíEîEïEðEñEòEóEôEõEöE÷EøEùEúEûEüEýEþEÿEFFFFFFFFF F F F F FFFFFFFFFFFFFFFFFFF F!F"F#F$F%F&F'F(F)F*F+F,F-F.F/F0F1F2F3F4F5F6F7F8F9F:F;FF?F@FAFBFCFDFEFFFGFHFIFJFKFLFMFNFOFPFQFRFSFTFUFVFWFXFYFZF[F\F]F^F_F`FaFbFcFdFeFfFgFhFiFjFkFlFmFnFoFpFqFrFsFtFuFvFwFxFyFzF{F|F}F~FF€FF‚FƒF„F…F†F‡FˆF‰FŠF‹FŒFFŽFFF‘F’F“F”F•F–F—F˜F™FšF›FœFFžFŸF F¡F¢F£F¤F¥F¦F§F¨F©FªF«F¬F­F®F¯F°F±F²F³F´FµF¶F·F¸F¹FºF»F¼F½F¾F¿FÀFÁFÂFÃFÄFÅFÆFÇFÈFÉFÊFËFÌFÍFÎFÏFÐFÑFÒFÓFÔFÕFÖF×FØFÙFÚFÛFÜFÝFÞFßFàFáFâFãFäFåFæFçFèFéFêFëFìFíFîFïFðFñFòFóFôFõFöF÷FøFùFúFûFüFýFþFÿFGGGGGGGGG G G G G GGGGGGGGGGGGGGGGGGG G!G"G#G$G%G&G'G(G)G*G+G,G-G.G/G0G1G2G3G4G5G6G7G8G9G:G;GG?G@GAGBGCGDGEGFGGGHGIGJGKGLGMGNGOGPGQGRGSGTGUGVGWGXGYGZG[G\G]G^G_G`GaGbGcGdGeGfGgGhGiGjGkGlGmGnGoGpGqGrGsGtGuGvGwGxGyGzG{G|G}G~GG€GG‚GƒG„G…G†G‡GˆG‰GŠG‹GŒGGŽGGG‘G’G“G”G•G–G—G˜G™GšG›GœGGžGŸG G¡G¢G£G¤G¥G¦G§G¨G©GªG«G¬G­G®G¯G°G±G²G³G´GµG¶G·G¸G¹GºG»G¼G½G¾G¿GÀGÁGÂGÃGÄGÅGÆGÇGÈGÉGÊGËGÌGÍGÎGÏGÐGÑGÒGÓGÔGÕGÖG×GØGÙGÚGÛGÜGÝGÞGßGàGáGâGãGäGåGæGçGèGéGêGëGìGíGîGïGðGñGòGóGôGõGöG÷GøGùGúGûGüGýGþGÿGHHHHHHHHH H H H H HHHHHHHHHHHHHHHHHHH H!H"H#H$H%H&H'H(H)H*H+H,H-H.H/H0H1H2H3H4H5H6H7H8H9H:H;HH?H@HAHBHCHDHEHFHGHHHIHJHKHLHMHNHOHPHQHRHSHTHUHVHWHXHYHZH[H\H]H^H_H`HaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHqHrHsHtHuHvHwHxHyHzH{H|H}H~HH€HH‚HƒH„H…H†H‡HˆH‰HŠH‹HŒHHŽHHH‘H’H“H”H•H–H—H˜H™HšH›HœHHžHŸH H¡H¢H£H¤H¥H¦H§H¨H©HªH«H¬H­H®H¯H°H±H²H³H´HµH¶H·H¸H¹HºH»H¼H½H¾H¿HÀHÁHÂHÃHÄHÅHÆHÇHÈHÉHÊHËHÌHÍHÎHÏHÐHÑHÒHÓHÔHÕHÖH×HØHÙHÚHÛHÜHÝHÞHßHàHáHâHãHäHåHæHçHèHéHêHëHìHíHîHïHðHñHòHóHôHõHöH÷HøHùHúHûHüHýHþHÿHIIIIIIIII I I I I IIIIIIIIIIIIIIIIIII I!I"I#I$I%I&I'I(I)I*I+I,I-I.I/I0I1I2I3I4I5I6I7I8I9I:I;II?I@IAIBICIDIEIFIGIHIIIJIKILIMINIOIPIQIRISITIUIVIWIXIYIZI[I\I]I^I_I`IaIbIcIdIeIfIgIhIiIjIkIlImInIoIpIqIrIsItIuIvIwIxIyIzI{I|I}I~II€II‚IƒI„I…I†I‡IˆI‰IŠI‹IŒIIŽIII‘I’I“I”I•I–I—I˜I™IšI›IœIIžIŸI I¡I¢I£I¤I¥I¦I§I¨I©IªI«I¬I­I®I¯I°I±I²I³I´IµI¶I·I¸I¹IºI»I¼I½I¾I¿IÀIÁIÂIÃIÄIÅIÆIÇIÈIÉIÊIËIÌIÍIÎIÏIÐIÑIÒIÓIÔIÕIÖI×IØIÙIÚIÛIÜIÝIÞIßIàIáIâIãIäIåIæIçIèIéIêIëIìIíIîIïIðIñIòIóIôIõIöI÷IøIùIúIûIüIýIþIÿIJJJJJJJJJ J J J J JJJJJJJJJJJJJJJJJJJ J!J"J#J$J%J&J'J(J)J*J+J,J-J.J/J0J1J2J3J4J5J6J7J8J9J:J;JJ?J@JAJBJCJDJEJFJGJHJIJJJKJLJMJNJOJPJQJRJSJTJUJVJWJXJYJZJ[J\J]J^J_J`JaJbJcJdJeJfJgJhJiJjJkJlJmJnJoJpJqJrJsJtJuJvJwJxJyJzJ{J|J}J~JJ€JJ‚JƒJ„J…J†J‡JˆJ‰JŠJ‹JŒJJŽJJJ‘J’J“J”J•J–J—J˜J™JšJ›JœJJžJŸJ J¡J¢J£J¤J¥J¦J§J¨J©JªJ«J¬J­J®J¯J°J±J²J³J´JµJ¶J·J¸J¹JºJ»J¼J½J¾J¿JÀJÁJÂJÃJÄJÅJÆJÇJÈJÉJÊJËJÌJÍJÎJÏJÐJÑJÒJÓJÔJÕJÖJ×JØJÙJÚJÛJÜJÝJÞJßJàJáJâJãJäJåJæJçJèJéJêJëJìJíJîJïJðJñJòJóJôJõJöJ÷JøJùJúJûJüJýJþJÿJKKKKKKKKK K K K K KKKKKKKKKKKKKKKKKKK K!K"K#K$K%K&K'K(K)K*K+K,K-K.K/K0K1K2K3K4K5K6K7K8K9K:K;KK?K@KAKBKCKDKEKFKGKHKIKJKKKLKMKNKOKPKQKRKSKTKUKVKWKXKYKZK[K\K]K^K_K`KaKbKcKdKeKfKgKhKiKjKkKlKmKnKoKpKqKrKsKtKuKvKwKxKyKzK{K|K}K~KK€KK‚KƒK„K…K†K‡KˆK‰KŠK‹KŒKKŽKKK‘K’K“K”K•K–K—K˜K™KšK›KœKKžKŸK K¡K¢K£K¤K¥K¦K§K¨K©KªK«K¬K­K®K¯K°K±K²K³K´KµK¶K·K¸K¹KºK»K¼K½K¾K¿KÀKÁKÂKÃKÄKÅKÆKÇKÈKÉKÊKËKÌKÍKÎKÏKÐKÑKÒKÓKÔKÕKÖK×KØKÙKÚKÛKÜKÝKÞKßKàKáKâKãKäKåKæKçKèKéKêKëKìKíKîKïKðKñKòKóKôKõKöK÷KøKùKúKûKüKýKþKÿKLLLLLLLLL L L L L LLLLLLLLLLLLLLLLLLL L!L"L#L$L%L&L'L(L)L*L+L,L-L.L/L0L1L2L3L4L5L6L7L8L9L:L;LL?L@LALBLCLDLELFLGLHLILJLKLLLMLNLOLPLQLRLSLTLULVLWLXLYLZL[L\L]L^L_L`LaLbLcLdLeLfLgLhLiLjLkLlLmLnLoLpLqLrLsLtLuLvLwLxLyLzL{L|L}L~LL€LL‚LƒL„L…L†L‡LˆL‰LŠL‹LŒLLŽLLL‘L’L“L”L•L–L—L˜L™LšL›LœLLžLŸL L¡L¢L£L¤L¥L¦L§L¨L©LªL«L¬L­L®L¯L°L±L²L³L´LµL¶L·L¸L¹LºL»L¼L½L¾L¿LÀLÁLÂLÃLÄLÅLÆLÇLÈLÉLÊLËLÌLÍLÎLÏLÐLÑLÒLÓLÔLÕLÖL×LØLÙLÚLÛLÜLÝLÞLßLàLáLâLãLäLåLæLçLèLéLêLëLìLíLîLïLðLñLòLóLôLõLöL÷LøLùLúLûLüLýLþLÿLMMMMMMMMM M M M M MMMMMMMMMMMMMMMMMMM M!M"M#M$M%M&M'M(M)M*M+M,M-M.M/M0M1M2M3M4M5M6M7M8M9M:M;MM?M@MAMBMCMDMEMFMGMHMIMJMKMLMMMNMOMPMQMRMSMTMUMVMWMXMYMZM[M\M]M^M_M`MaMbMcMdMeMfMgMhMiMjMkMlMmMnMoMpMqMrMsMtMuMvMwMxMyMzM{M|M}M~MM€MM‚MƒM„M…M†M‡MˆM‰MŠM‹MŒMMŽMMM‘M’M“M”M•M–M—M˜M™MšM›MœMMžMŸM M¡M¢M£M¤M¥M¦M§M¨M©MªM«M¬M­M®M¯M°M±M²M³M´MµM¶M·M¸M¹MºM»M¼M½M¾M¿MÀMÁMÂMÃMÄMÅMÆMÇMÈMÉMÊMËMÌMÍMÎMÏMÐMÑMÒMÓMÔMÕMÖM×MØMÙMÚMÛMÜMÝMÞMßMàMáMâMãMäMåMæMçMèMéMêMëMìMíMîMïMðMñMòMóMôMõMöM÷MøMùMúMûMüMýMþMÿMNNNNNNNNN N N N N NNNNNNNNNNNNNNNNNNN N!N"N#N$N%N&N'N(N)N*N+N,N-N.N/N0N1N2N3N4N5N6N7N8N9N:N;NN?N@NANBNCNDNENFNGNHNINJNKNLNMNNNONPNQNRNSNTNUNVNWNXNYNZN[N\N]N^N_N`NaNbNcNdNeNfNgNhNiNjNkNlNmNnNoNpNqNrNsNtNuNvNwNxNyNzN{N|N}N~NN€NN‚NƒN„N…N†N‡NˆN‰NŠN‹NŒNNŽNNN‘N’N“N”N•N–N—N˜N™NšN›NœNNžNŸN N¡N¢N£N¤N¥N¦N§N¨N©NªN«N¬N­N®N¯N°N±N²N³N´NµN¶N·N¸N¹NºN»N¼N½N¾N¿NÀNÁNÂNÃNÄNÅNÆNÇNÈNÉNÊNËNÌNÍNÎNÏNÐNÑNÒNÓNÔNÕNÖN×NØNÙNÚNÛNÜNÝNÞNßNàNáNâNãNäNåNæNçNèNéNêNëNìNíNîNïNðNñNòNóNôNõNöN÷NøNùNúNûNüNýNþNÿNOOOOOOOOO O O O O OOOOOOOOOOOOOOOOOOO O!O"O#O$O%O&O'O(O)O*O+O,O-O.O/O0O1O2O3O4O5O6O7O8O9O:O;OO?O@OAOBOCODOEOFOGOHOIOJOKOLOMONOOOPOQOROSOTOUOVOWOXOYOZO[O\O]O^O_O`OaObOcOdOeOfOgOhOiOjOkOlOmOnOoOpOqOrOsOtOuOvOwOxOyOzO{O|O}O~OO€OO‚OƒO„O…O†O‡OˆO‰OŠO‹OŒOOŽOOO‘O’O“O”O•O–O—O˜O™OšO›OœOOžOŸO O¡O¢O£O¤O¥O¦O§O¨O©OªO«O¬O­O®O¯O°O±O²O³O´OµO¶O·O¸O¹OºO»O¼O½O¾O¿OÀOÁOÂOÃOÄOÅOÆOÇOÈOÉOÊOËOÌOÍOÎOÏOÐOÑOÒOÓOÔOÕOÖO×OØOÙOÚOÛOÜOÝOÞOßOàOáOâOãOäOåOæOçOèOéOêOëOìOíOîOïOðOñOòOóOôOõOöO÷OøOùOúOûOüOýOþOÿOPPPPPPPPP P P P P PPPPPPPPPPPPPPPPPPP P!P"P#P$P%P&P'P(P)P*P+P,P-P.P/P0P1P2P3P4P5P6P7P8P9P:P;PP?P@PAPBPCPDPEPFPGPHPIPJPKPLPMPNPOPPPQPRPSPTPUPVPWPXPYPZP[P\P]P^P_P`PaPbPcPdPePfPgPhPiPjPkPlPmPnPoPpPqPrPsPtPuPvPwPxPyPzP{P|P}P~PP€PP‚PƒP„P…P†P‡PˆP‰PŠP‹PŒPPŽPPP‘P’P“P”P•P–P—P˜P™PšP›PœPPžPŸP P¡P¢P£P¤P¥P¦P§P¨P©PªP«P¬P­P®P¯P°P±P²P³P´PµP¶P·P¸P¹PºP»P¼P½P¾P¿PÀPÁPÂPÃPÄPÅPÆPÇPÈPÉPÊPËPÌPÍPÎPÏPÐPÑPÒPÓPÔPÕPÖP×PØPÙPÚPÛPÜPÝPÞPßPàPáPâPãPäPåPæPçPèPéPêPëPìPíPîPïPðPñPòPóPôPõPöP÷PøPùPúPûPüPýPþPÿPQQQQQQQQQ Q Q Q Q QQQQQQQQQQQQQQQQQQQ Q!Q"Q#Q$Q%Q&Q'Q(Q)Q*Q+Q,Q-Q.Q/Q0Q1Q2Q3Q4Q5Q6Q7Q8Q9Q:Q;QQ?Q@QAQBQCQDQEQFQGQHQIQJQKQLQMQNQOQPQQQRQSQTQUQVQWQXQYQZQ[Q\Q]Q^Q_Q`QaQbQcQdQeQfQgQhQiQjQkQlQmQnQoQpQqQrQsQtQuQvQwQxQyQzQ{Q|Q}Q~QQ€QQ‚QƒQ„Q…Q†Q‡QˆQ‰QŠQ‹QŒQQŽQQQ‘Q’Q“Q”Q•Q–Q—Q˜Q™QšQ›QœQQžQŸQ Q¡Q¢Q£Q¤Q¥Q¦Q§Q¨Q©QªQ«Q¬Q­Q®Q¯Q°Q±Q²Q³Q´QµQ¶Q·Q¸Q¹QºQ»Q¼Q½Q¾Q¿QÀQÁQÂQÃQÄQÅQÆQÇQÈQÉQÊQËQÌQÍQÎQÏQÐQÑQÒQÓQÔQÕQÖQ×QØQÙQÚQÛQÜQÝQÞQßQàQáQâQãQäQåQæQçQèQéQêQëQìQíQîQïQðQñQòQóQôQõQöQ÷QøQùQúQûQüQýQþQÿQRRRRRRRRR R R R R RRRRRRRRRRRRRRRRRRR R!R"R#R$R%R&R'R(R)R*R+R,R-R.R/R0R1R2R3R4R5R6R7R8R9R:R;RR?R@RARBRCRDRERFRGRHRIRJRKRLRMRNRORPRQRRRSRTRURVRWRXRYRZR[R\R]R^R_R`RaRbRcRdReRfRgRhRiRjRkRlRmRnRoRpRqRrRsRtRuRvRwRxRyRzR{R|R}R~RR€RR‚RƒR„R…R†R‡RˆR‰RŠR‹RŒRRŽRRR‘R’R“R”R•R–R—R˜R™RšR›RœRRžRŸR R¡R¢R£R¤R¥R¦R§R¨R©RªR«R¬R­R®R¯R°R±R²R³R´RµR¶R·R¸R¹RºR»R¼R½R¾R¿RÀRÁRÂRÃRÄRÅRÆRÇRÈRÉRÊRËRÌRÍRÎRÏRÐRÑRÒRÓRÔRÕRÖR×RØRÙRÚRÛRÜRÝRÞRßRàRáRâRãRäRåRæRçRèRéRêRëRìRíRîRïRðRñRòRóRôRõRöR÷RøRùRúRûRüRýRþRÿRSSSSSSSSS S S S S SSSSSSSSSSSSSSSSSSS S!S"S#S$S%S&S'S(S)S*S+S,S-S.S/S0S1S2S3S4S5S6S7S8S9S:S;SS?S@SASBSCSDSESFSGSHSISJSKSLSMSNSOSPSQSRSSSTSUSVSWSXSYSZS[S\S]S^S_S`SaSbScSdSeSfSgShSiSjSkSlSmSnSoSpSqSrSsStSuSvSwSxSySzS{S|S}S~SS€SS‚SƒS„S…S†S‡SˆS‰SŠS‹SŒSSŽSSS‘S’S“S”S•S–S—S˜S™SšS›SœSSžSŸS S¡S¢S£S¤S¥S¦S§S¨S©SªS«S¬S­S®S¯S°S±S²S³S´SµS¶S·S¸S¹SºS»S¼S½S¾S¿SÀSÁSÂSÃSÄSÅSÆSÇSÈSÉSÊSËSÌSÍSÎSÏSÐSÑSÒSÓSÔSÕSÖS×SØSÙSÚSÛSÜSÝSÞSßSàSáSâSãSäSåSæSçSèSéSêSëSìSíSîSïSðSñSòSóSôSõSöS÷SøSùSúSûSüSýSþSÿSTTTTTTTTT T T T T TTTTTTTTTTTTTTTTTTT T!T"T#T$T%T&T'T(T)T*T+T,T-T.T/T0T1T2T3T4T5T6T7T8T9T:T;TT?T@TATBTCTDTETFTGTHTITJTKTLTMTNTOTPTQTRTSTTTUTVTWTXTYTZT[T\T]T^T_T`TaTbTcTdTeTfTgThTiTjTkTlTmTnToTpTqTrTsTtTuTvTwTxTyTzT{T|T}T~TT€TT‚TƒT„T…T†T‡TˆT‰TŠT‹TŒTTŽTTT‘T’T“T”T•T–T—T˜T™TšT›TœTTžTŸT T¡T¢T£T¤T¥T¦T§T¨T©TªT«T¬T­T®T¯T°T±T²T³T´TµT¶T·T¸T¹TºT»T¼T½T¾T¿TÀTÁTÂTÃTÄTÅTÆTÇTÈTÉTÊTËTÌTÍTÎTÏTÐTÑTÒTÓTÔTÕTÖT×TØTÙTÚTÛTÜTÝTÞTßTàTáTâTãTäTåTæTçTèTéTêTëTìTíTîTïTðTñTòTóTôTõTöT÷TøTùTúTûTüTýTþTÿTUUUUUUUUU U U U U UUUUUUUUUUUUUUUUUUU U!U"U#U$U%U&U'U(U)U*U+U,U-U.U/U0U1U2U3U4U5U6U7U8U9U:U;UU?U@UAUBUCUDUEUFUGUHUIUJUKULUMUNUOUPUQURUSUTUUUVUWUXUYUZU[U\U]U^U_U`UaUbUcUdUeUfUgUhUiUjUkUlUmUnUoUpUqUrUsUtUuUvUwUxUyUzU{U|U}U~UU€UU‚UƒU„U…U†U‡UˆU‰UŠU‹UŒUUŽUUU‘U’U“U”U•U–U—U˜U™UšU›UœUUžUŸU U¡U¢U£U¤U¥U¦U§U¨U©UªU«U¬U­U®U¯U°U±U²U³U´UµU¶U·U¸U¹UºU»U¼U½U¾U¿UÀUÁUÂUÃUÄUÅUÆUÇUÈUÉUÊUËUÌUÍUÎUÏUÐUÑUÒUÓUÔUÕUÖU×UØUÙUÚUÛUÜUÝUÞUßUàUáUâUãUäUåUæUçUèUéUêUëUìUíUîUïUðUñUòUóUôUõUöU÷UøUùUúUûUüUýUþUÿUVVVVVVVVV V V V V VVVVVVVVVVVVVVVVVVV V!V"V#V$V%V&V'V(V)V*V+V,V-V.V/V0V1V2V3V4V5V6V7V8V9V:V;VV?V@VAVBVCVDVEVFVGVHVIVJVKVLVMVNVOVPVQVRVSVTVUVVVWVXVYVZV[V\V]V^V_V`VaVbVcVdVeVfVgVhViVjVkVlVmVnVoVpVqVrVsVtVuVvVwVxVyVzV{V|V}V~VV€VV‚VƒV„V…V†V‡VˆV‰VŠV‹VŒVVŽVVV‘V’V“V”V•V–V—V˜V™VšV›VœVVžVŸV V¡V¢V£V¤V¥V¦V§V¨V©VªV«V¬V­V®V¯V°V±V²V³V´VµV¶V·V¸V¹VºV»V¼V½V¾V¿VÀVÁVÂVÃVÄVÅVÆVÇVÈVÉVÊVËVÌVÍVÎVÏVÐVÑVÒVÓVÔVÕVÖV×VØVÙVÚVÛVÜVÝVÞVßVàVáVâVãVäVåVæVçVèVéVêVëVìVíVîVïVðVñVòVóVôVõVöV÷VøVùVúVûVüVýVþVÿVWWWWWWWWW W W W W WWWWWWWWWWWWWWWWWWW W!W"W#W$W%W&W'W(W)W*W+W,W-W.W/W0W1W2W3W4W5W6W7W8W9W:W;WW?W@WAWBWCWDWEWFWGWHWIWJWKWLWMWNWOWPWQWRWSWTWUWVWWWXWYWZW[W\W]W^W_W`WaWbWcWdWeWfWgWhWiWjWkWlWmWnWoWpWqWrWsWtWuWvWwWxWyWzW{W|W}W~WW€WW‚WƒW„W…W†W‡WˆW‰WŠW‹WŒWWŽWWW‘W’W“W”W•W–W—W˜W™WšW›WœWWžWŸW W¡W¢W£W¤W¥W¦W§W¨W©WªW«W¬W­W®W¯W°W±W²W³W´WµW¶W·W¸W¹WºW»W¼W½W¾W¿WÀWÁWÂWÃWÄWÅWÆWÇWÈWÉWÊWËWÌWÍWÎWÏWÐWÑWÒWÓWÔWÕWÖW×WØWÙWÚWÛWÜWÝWÞWßWàWáWâWãWäWåWæWçWèWéWêWëWìWíWîWïWðWñWòWóWôWõWöW÷WøWùWúWûWüWýWþWÿWXXXXXXXXX X X X X XXXXXXXXXXXXXXXXXXX X!X"X#X$X%X&X'X(X)X*X+X,X-X.X/X0X1X2X3X4X5X6X7X8X9X:X;XX?X@XAXBXCXDXEXFXGXHXIXJXKXLXMXNXOXPXQXRXSXTXUXVXWXXXYXZX[X\X]X^X_X`XaXbXcXdXeXfXgXhXiXjXkXlXmXnXoXpXqXrXsXtXuXvXwXxXyXzX{X|X}X~XX€XX‚XƒX„X…X†X‡XˆX‰XŠX‹XŒXXŽXXX‘X’X“X”X•X–X—X˜X™XšX›XœXXžXŸX X¡X¢X£X¤X¥X¦X§X¨X©XªX«X¬X­X®X¯X°X±X²X³X´XµX¶X·X¸X¹XºX»X¼X½X¾X¿XÀXÁXÂXÃXÄXÅXÆXÇXÈXÉXÊXËXÌXÍXÎXÏXÐXÑXÒXÓXÔXÕXÖX×XØXÙXÚXÛXÜXÝXÞXßXàXáXâXãXäXåXæXçXèXéXêXëXìXíXîXïXðXñXòXóXôXõXöX÷XøXùXúXûXüXýXþXÿXYYYYYYYYY Y Y Y Y YYYYYYYYYYYYYYYYYYY Y!Y"Y#Y$Y%Y&Y'Y(Y)Y*Y+Y,Y-Y.Y/Y0Y1Y2Y3Y4Y5Y6Y7Y8Y9Y:Y;YY?Y@YAYBYCYDYEYFYGYHYIYJYKYLYMYNYOYPYQYRYSYTYUYVYWYXYYYZY[Y\Y]Y^Y_Y`YaYbYcYdYeYfYgYhYiYjYkYlYmYnYoYpYqYrYsYtYuYvYwYxYyYzY{Y|Y}Y~YY€YY‚YƒY„Y…Y†Y‡YˆY‰YŠY‹YŒYYŽYYY‘Y’Y“Y”Y•Y–Y—Y˜Y™YšY›YœYYžYŸY Y¡Y¢Y£Y¤Y¥Y¦Y§Y¨Y©YªY«Y¬Y­Y®Y¯Y°Y±Y²Y³Y´YµY¶Y·Y¸Y¹YºY»Y¼Y½Y¾Y¿YÀYÁYÂYÃYÄYÅYÆYÇYÈYÉYÊYËYÌYÍYÎYÏYÐYÑYÒYÓYÔYÕYÖY×YØYÙYÚYÛYÜYÝYÞYßYàYáYâYãYäYåYæYçYèYéYêYëYìYíYîYïYðYñYòYóYôYõYöY÷YøYùYúYûYüYýYþYÿYZZZZZZZZZ Z Z Z Z ZZZZZZZZZZZZZZZZZZZ Z!Z"Z#Z$Z%Z&Z'Z(Z)Z*Z+Z,Z-Z.Z/Z0Z1Z2Z3Z4Z5Z6Z7Z8Z9Z:Z;ZZ?Z@ZAZBZCZDZEZFZGZHZIZJZKZLZMZNZOZPZQZRZSZTZUZVZWZXZYZZZ[Z\Z]Z^Z_Z`ZaZbZcZdZeZfZgZhZiZjZkZlZmZnZoZpZqZrZsZtZuZvZwZxZyZzZ{Z|Z}Z~ZZ€ZZ‚ZƒZ„Z…Z†Z‡ZˆZ‰ZŠZ‹ZŒZZŽZZZ‘Z’Z“Z”Z•Z–Z—Z˜Z™ZšZ›ZœZZžZŸZ Z¡Z¢Z£Z¤Z¥Z¦Z§Z¨Z©ZªZ«Z¬Z­Z®Z¯Z°Z±Z²Z³Z´ZµZ¶Z·Z¸Z¹ZºZ»Z¼Z½Z¾Z¿ZÀZÁZÂZÃZÄZÅZÆZÇZÈZÉZÊZËZÌZÍZÎZÏZÐZÑZÒZÓZÔZÕZÖZ×ZØZÙZÚZÛZÜZÝZÞZßZàZáZâZãZäZåZæZçZèZéZêZëZìZíZîZïZðZñZòZóZôZõZöZ÷ZøZùZúZûZüZýZþZÿZ[[[[[[[[[ [ [ [ [ [[[[[[[[[[[[[[[[[[[ [!["[#[$[%[&['[([)[*[+[,[-[.[/[0[1[2[3[4[5[6[7[8[9[:[;[<[=[>[?[@[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[[[\[][^[_[`[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[{[|[}[~[[€[[‚[ƒ[„[…[†[‡[ˆ[‰[Š[‹[Œ[[Ž[[[‘[’[“[”[•[–[—[˜[™[š[›[œ[[ž[Ÿ[ [¡[¢[£[¤[¥[¦[§[¨[©[ª[«[¬[­[®[¯[°[±[²[³[´[µ[¶[·[¸[¹[º[»[¼[½[¾[¿[À[Á[Â[Ã[Ä[Å[Æ[Ç[È[É[Ê[Ë[Ì[Í[Î[Ï[Ð[Ñ[Ò[Ó[Ô[Õ[Ö[×[Ø[Ù[Ú[Û[Ü[Ý[Þ[ß[à[á[â[ã[ä[å[æ[ç[è[é[ê[ë[ì[í[î[ï[ð[ñ[ò[ó[ô[õ[ö[÷[ø[ù[ú[û[ü[ý[þ[ÿ[\\\\\\\\\ \ \ \ \ \\\\\\\\\\\\\\\\\\\ \!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\0\1\2\3\4\5\6\7\8\9\:\;\<\=\>\?\@\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\[\\\]\^\_\`\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\{\|\}\~\\€\\‚\ƒ\„\…\†\‡\ˆ\‰\Š\‹\Œ\\Ž\\\‘\’\“\”\•\–\—\˜\™\š\›\œ\\ž\Ÿ\ \¡\¢\£\¤\¥\¦\§\¨\©\ª\«\¬\­\®\¯\°\±\²\³\´\µ\¶\·\¸\¹\º\»\¼\½\¾\¿\À\Á\Â\Ã\Ä\Å\Æ\Ç\È\É\Ê\Ë\Ì\Í\Î\Ï\Ð\Ñ\Ò\Ó\Ô\Õ\Ö\×\Ø\Ù\Ú\Û\Ü\Ý\Þ\ß\à\á\â\ã\ä\å\æ\ç\è\é\ê\ë\ì\í\î\ï\ð\ñ\ò\ó\ô\õ\ö\÷\ø\ù\ú\û\ü\ý\þ\ÿ\]]]]]]]]] ] ] ] ] ]]]]]]]]]]]]]]]]]]] ]!]"]#]$]%]&]'](])]*]+],]-].]/]0]1]2]3]4]5]6]7]8]9]:];]<]=]>]?]@]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][]\]]]^]_]`]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]{]|]}]~]]€]]‚]ƒ]„]…]†]‡]ˆ]‰]Š]‹]Œ]]Ž]]]‘]’]“]”]•]–]—]˜]™]š]›]œ]]ž]Ÿ] ]¡]¢]£]¤]¥]¦]§]¨]©]ª]«]¬]­]®]¯]°]±]²]³]´]µ]¶]·]¸]¹]º]»]¼]½]¾]¿]À]Á]Â]Ã]Ä]Å]Æ]Ç]È]É]Ê]Ë]Ì]Í]Î]Ï]Ð]Ñ]Ò]Ó]Ô]Õ]Ö]×]Ø]Ù]Ú]Û]Ü]Ý]Þ]ß]à]á]â]ã]ä]å]æ]ç]è]é]ê]ë]ì]í]î]ï]ð]ñ]ò]ó]ô]õ]ö]÷]ø]ù]ú]û]ü]ý]þ]ÿ]^^^^^^^^^ ^ ^ ^ ^ ^^^^^^^^^^^^^^^^^^^ ^!^"^#^$^%^&^'^(^)^*^+^,^-^.^/^0^1^2^3^4^5^6^7^8^9^:^;^<^=^>^?^@^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^[^\^]^^^_^`^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^{^|^}^~^^€^^‚^ƒ^„^…^†^‡^ˆ^‰^Š^‹^Œ^^Ž^^^‘^’^“^”^•^–^—^˜^™^š^›^œ^^ž^Ÿ^ ^¡^¢^£^¤^¥^¦^§^¨^©^ª^«^¬^­^®^¯^°^±^²^³^´^µ^¶^·^¸^¹^º^»^¼^½^¾^¿^À^Á^Â^Ã^Ä^Å^Æ^Ç^È^É^Ê^Ë^Ì^Í^Î^Ï^Ð^Ñ^Ò^Ó^Ô^Õ^Ö^×^Ø^Ù^Ú^Û^Ü^Ý^Þ^ß^à^á^â^ã^ä^å^æ^ç^è^é^ê^ë^ì^í^î^ï^ð^ñ^ò^ó^ô^õ^ö^÷^ø^ù^ú^û^ü^ý^þ^ÿ^_________ _ _ _ _ ___________________ _!_"_#_$_%_&_'_(_)_*_+_,_-_._/_0_1_2_3_4_5_6_7_8_9_:_;_<_=_>_?_@_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_[_\_]_^___`_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_{_|_}_~__€__‚_ƒ_„_…_†_‡_ˆ_‰_Š_‹_Œ__Ž___‘_’_“_”_•_–_—_˜_™_š_›_œ__ž_Ÿ_ _¡_¢_£_¤_¥_¦_§_¨_©_ª_«_¬_­_®_¯_°_±_²_³_´_µ_¶_·_¸_¹_º_»_¼_½_¾_¿_À_Á_Â_Ã_Ä_Å_Æ_Ç_È_É_Ê_Ë_Ì_Í_Î_Ï_Ð_Ñ_Ò_Ó_Ô_Õ_Ö_×_Ø_Ù_Ú_Û_Ü_Ý_Þ_ß_à_á_â_ã_ä_å_æ_ç_è_é_ê_ë_ì_í_î_ï_ð_ñ_ò_ó_ô_õ_ö_÷_ø_ù_ú_û_ü_ý_þ_ÿ_````````` ` ` ` ` ``````````````````` `!`"`#`$`%`&`'`(`)`*`+`,`-`.`/`0`1`2`3`4`5`6`7`8`9`:`;`<`=`>`?`@`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`[`\`]`^`_```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`{`|`}`~``€``‚`ƒ`„`…`†`‡`ˆ`‰`Š`‹`Œ``Ž```‘`’`“`”`•`–`—`˜`™`š`›`œ``ž`Ÿ` `¡`¢`£`¤`¥`¦`§`¨`©`ª`«`¬`­`®`¯`°`±`²`³`´`µ`¶`·`¸`¹`º`»`¼`½`¾`¿`À`Á`Â`Ã`Ä`Å`Æ`Ç`È`É`Ê`Ë`Ì`Í`Î`Ï`Ð`Ñ`Ò`Ó`Ô`Õ`Ö`×`Ø`Ù`Ú`Û`Ü`Ý`Þ`ß`à`á`â`ã`ä`å`æ`ç`è`é`ê`ë`ì`í`î`ï`ð`ñ`ò`ó`ô`õ`ö`÷`ø`ù`ú`û`ü`ý`þ`ÿ`aaaaaaaaa a a a a aaaaaaaaaaaaaaaaaaa a!a"a#a$a%a&a'a(a)a*a+a,a-a.a/a0a1a2a3a4a5a6a7a8a9a:a;aa?a@aAaBaCaDaEaFaGaHaIaJaKaLaMaNaOaPaQaRaSaTaUaVaWaXaYaZa[a\a]a^a_a`aaabacadaeafagahaiajakalamanaoapaqarasatauavawaxayaza{a|a}a~aa€aa‚aƒa„a…a†a‡aˆa‰aŠa‹aŒaaŽaaa‘a’a“a”a•a–a—a˜a™aša›aœaažaŸa a¡a¢a£a¤a¥a¦a§a¨a©aªa«a¬a­a®a¯a°a±a²a³a´aµa¶a·a¸a¹aºa»a¼a½a¾a¿aÀaÁaÂaÃaÄaÅaÆaÇaÈaÉaÊaËaÌaÍaÎaÏaÐaÑaÒaÓaÔaÕaÖa×aØaÙaÚaÛaÜaÝaÞaßaàaáaâaãaäaåaæaçaèaéaêaëaìaíaîaïaðañaòaóaôaõaöa÷aøaùaúaûaüaýaþaÿabbbbbbbbb b b b b bbbbbbbbbbbbbbbbbbb b!b"b#b$b%b&b'b(b)b*b+b,b-b.b/b0b1b2b3b4b5b6b7b8b9b:b;bb?b@bAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb[b\b]b^b_b`babbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzb{b|b}b~bb€bb‚bƒb„b…b†b‡bˆb‰bŠb‹bŒbbŽbbb‘b’b“b”b•b–b—b˜b™bšb›bœbbžbŸb b¡b¢b£b¤b¥b¦b§b¨b©bªb«b¬b­b®b¯b°b±b²b³b´bµb¶b·b¸b¹bºb»b¼b½b¾b¿bÀbÁbÂbÃbÄbÅbÆbÇbÈbÉbÊbËbÌbÍbÎbÏbÐbÑbÒbÓbÔbÕbÖb×bØbÙbÚbÛbÜbÝbÞbßbàbábâbãbäbåbæbçbèbébêbëbìbíbîbïbðbñbòbóbôbõböb÷bøbùbúbûbübýbþbÿbccccccccc c c c c ccccccccccccccccccc c!c"c#c$c%c&c'c(c)c*c+c,c-c.c/c0c1c2c3c4c5c6c7c8c9c:c;cc?c@cAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc[c\c]c^c_c`cacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczc{c|c}c~cc€cc‚cƒc„c…c†c‡cˆc‰cŠc‹cŒccŽccc‘c’c“c”c•c–c—c˜c™cšc›cœccžcŸc c¡c¢c£c¤c¥c¦c§c¨c©cªc«c¬c­c®c¯c°c±c²c³c´cµc¶c·c¸c¹cºc»c¼c½c¾c¿cÀcÁcÂcÃcÄcÅcÆcÇcÈcÉcÊcËcÌcÍcÎcÏcÐcÑcÒcÓcÔcÕcÖc×cØcÙcÚcÛcÜcÝcÞcßcàcácâcãcäcåcæcçcècécêcëcìcícîcïcðcñcòcócôcõcöc÷cøcùcúcûcücýcþcÿcddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;dd?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd€dd‚dƒd„d…d†d‡dˆd‰dŠd‹dŒddŽddd‘d’d“d”d•d–d—d˜d™dšd›dœddždŸd d¡d¢d£d¤d¥d¦d§d¨d©dªd«d¬d­d®d¯d°d±d²d³d´dµd¶d·d¸d¹dºd»d¼d½d¾d¿dÀdÁdÂdÃdÄdÅdÆdÇdÈdÉdÊdËdÌdÍdÎdÏdÐdÑdÒdÓdÔdÕdÖd×dØdÙdÚdÛdÜdÝdÞdßdàdádâdãdädådædçdèdédêdëdìdídîdïdðdñdòdódôdõdöd÷dødùdúdûdüdýdþdÿdeeeeeeeee e e e e eeeeeeeeeeeeeeeeeee e!e"e#e$e%e&e'e(e)e*e+e,e-e.e/e0e1e2e3e4e5e6e7e8e9e:e;ee?e@eAeBeCeDeEeFeGeHeIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe[e\e]e^e_e`eaebecedeeefegeheiejekelemeneoepeqereseteuevewexeyeze{e|e}e~ee€ee‚eƒe„e…e†e‡eˆe‰eŠe‹eŒeeŽeee‘e’e“e”e•e–e—e˜e™eše›eœeežeŸe e¡e¢e£e¤e¥e¦e§e¨e©eªe«e¬e­e®e¯e°e±e²e³e´eµe¶e·e¸e¹eºe»e¼e½e¾e¿eÀeÁeÂeÃeÄeÅeÆeÇeÈeÉeÊeËeÌeÍeÎeÏeÐeÑeÒeÓeÔeÕeÖe×eØeÙeÚeÛeÜeÝeÞeßeàeáeâeãeäeåeæeçeèeéeêeëeìeíeîeïeðeñeòeóeôeõeöe÷eøeùeúeûeüeýeþeÿefffffffff f f f f fffffffffffffffffff f!f"f#f$f%f&f'f(f)f*f+f,f-f.f/f0f1f2f3f4f5f6f7f8f9f:f;ff?f@fAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf[f\f]f^f_f`fafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzf{f|f}f~ff€ff‚fƒf„f…f†f‡fˆf‰fŠf‹fŒffŽfff‘f’f“f”f•f–f—f˜f™fšf›fœffžfŸf f¡f¢f£f¤f¥f¦f§f¨f©fªf«f¬f­f®f¯f°f±f²f³f´fµf¶f·f¸f¹fºf»f¼f½f¾f¿fÀfÁfÂfÃfÄfÅfÆfÇfÈfÉfÊfËfÌfÍfÎfÏfÐfÑfÒfÓfÔfÕfÖf×fØfÙfÚfÛfÜfÝfÞfßfàfáfâfãfäfåfæfçfèféfêfëfìfífîfïfðfñfòfófôfõföf÷føfùfúfûfüfýfþfÿfggggggggg g g g g ggggggggggggggggggg g!g"g#g$g%g&g'g(g)g*g+g,g-g.g/g0g1g2g3g4g5g6g7g8g9g:g;gg?g@gAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg[g\g]g^g_g`gagbgcgdgegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzg{g|g}g~gg€gg‚gƒg„g…g†g‡gˆg‰gŠg‹gŒggŽggg‘g’g“g”g•g–g—g˜g™gšg›gœggžgŸg g¡g¢g£g¤g¥g¦g§g¨g©gªg«g¬g­g®g¯g°g±g²g³g´gµg¶g·g¸g¹gºg»g¼g½g¾g¿gÀgÁgÂgÃgÄgÅgÆgÇgÈgÉgÊgËgÌgÍgÎgÏgÐgÑgÒgÓgÔgÕgÖg×gØgÙgÚgÛgÜgÝgÞgßgàgágâgãgägågægçgègégêgëgìgígîgïgðgñgògógôgõgög÷gøgùgúgûgügýgþgÿghhhhhhhhh h h h h hhhhhhhhhhhhhhhhhhh h!h"h#h$h%h&h'h(h)h*h+h,h-h.h/h0h1h2h3h4h5h6h7h8h9h:h;hh?h@hAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh[h\h]h^h_h`hahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzh{h|h}h~hh€hh‚hƒh„h…h†h‡hˆh‰hŠh‹hŒhhŽhhh‘h’h“h”h•h–h—h˜h™hšh›hœhhžhŸh h¡h¢h£h¤h¥h¦h§h¨h©hªh«h¬h­h®h¯h°h±h²h³h´hµh¶h·h¸h¹hºh»h¼h½h¾h¿hÀhÁhÂhÃhÄhÅhÆhÇhÈhÉhÊhËhÌhÍhÎhÏhÐhÑhÒhÓhÔhÕhÖh×hØhÙhÚhÛhÜhÝhÞhßhàháhâhãhähåhæhçhèhéhêhëhìhíhîhïhðhñhòhóhôhõhöh÷høhùhúhûhühýhþhÿhiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;ii?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii€ii‚iƒi„i…i†i‡iˆi‰iŠi‹iŒiiŽiii‘i’i“i”i•i–i—i˜i™iši›iœiižiŸi i¡i¢i£i¤i¥i¦i§i¨i©iªi«i¬i­i®i¯i°i±i²i³i´iµi¶i·i¸i¹iºi»i¼i½i¾i¿iÀiÁiÂiÃiÄiÅiÆiÇiÈiÉiÊiËiÌiÍiÎiÏiÐiÑiÒiÓiÔiÕiÖi×iØiÙiÚiÛiÜiÝiÞißiàiáiâiãiäiåiæiçièiéiêiëiìiíiîiïiðiñiòióiôiõiöi÷iøiùiúiûiüiýiþiÿijjjjjjjjj j j j j jjjjjjjjjjjjjjjjjjj j!j"j#j$j%j&j'j(j)j*j+j,j-j.j/j0j1j2j3j4j5j6j7j8j9j:j;jj?j@jAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj[j\j]j^j_j`jajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzj{j|j}j~jj€jj‚jƒj„j…j†j‡jˆj‰jŠj‹jŒjjŽjjj‘j’j“j”j•j–j—j˜j™jšj›jœjjžjŸj j¡j¢j£j¤j¥j¦j§j¨j©jªj«j¬j­j®j¯j°j±j²j³j´jµj¶j·j¸j¹jºj»j¼j½j¾j¿jÀjÁjÂjÃjÄjÅjÆjÇjÈjÉjÊjËjÌjÍjÎjÏjÐjÑjÒjÓjÔjÕjÖj×jØjÙjÚjÛjÜjÝjÞjßjàjájâjãjäjåjæjçjèjéjêjëjìjíjîjïjðjñjòjójôjõjöj÷jøjùjújûjüjýjþjÿjkkkkkkkkk k k k k kkkkkkkkkkkkkkkkkkk k!k"k#k$k%k&k'k(k)k*k+k,k-k.k/k0k1k2k3k4k5k6k7k8k9k:k;kk?k@kAkBkCkDkEkFkGkHkIkJkKkLkMkNkOkPkQkRkSkTkUkVkWkXkYkZk[k\k]k^k_k`kakbkckdkekfkgkhkikjkkklkmknkokpkqkrksktkukvkwkxkykzk{k|k}k~kk€kk‚kƒk„k…k†k‡kˆk‰kŠk‹kŒkkŽkkk‘k’k“k”k•k–k—k˜k™kšk›kœkkžkŸk k¡k¢k£k¤k¥k¦k§k¨k©kªk«k¬k­k®k¯k°k±k²k³k´kµk¶k·k¸k¹kºk»k¼k½k¾k¿kÀkÁkÂkÃkÄkÅkÆkÇkÈkÉkÊkËkÌkÍkÎkÏkÐkÑkÒkÓkÔkÕkÖk×kØkÙkÚkÛkÜkÝkÞkßkàkákâkãkäkåkækçkèkékêkëkìkíkîkïkðkñkòkókôkõkök÷køkùkúkûkükýkþkÿklllllllll l l l l lllllllllllllllllll l!l"l#l$l%l&l'l(l)l*l+l,l-l.l/l0l1l2l3l4l5l6l7l8l9l:l;ll?l@lAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUlVlWlXlYlZl[l\l]l^l_l`lalblcldlelflglhliljlklllmlnlolplqlrlsltlulvlwlxlylzl{l|l}l~ll€ll‚lƒl„l…l†l‡lˆl‰lŠl‹lŒllŽlll‘l’l“l”l•l–l—l˜l™lšl›lœllžlŸl l¡l¢l£l¤l¥l¦l§l¨l©lªl«l¬l­l®l¯l°l±l²l³l´lµl¶l·l¸l¹lºl»l¼l½l¾l¿lÀlÁlÂlÃlÄlÅlÆlÇlÈlÉlÊlËlÌlÍlÎlÏlÐlÑlÒlÓlÔlÕlÖl×lØlÙlÚlÛlÜlÝlÞlßlàlálâlãlälålælçlèlélêlëlìlílîlïlðlñlòlólôlõlöl÷lølùlúlûlülýlþlÿlmmmmmmmmm m m m m mmmmmmmmmmmmmmmmmmm m!m"m#m$m%m&m'm(m)m*m+m,m-m.m/m0m1m2m3m4m5m6m7m8m9m:m;mm?m@mAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm[m\m]m^m_m`mambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzm{m|m}m~mm€mm‚mƒm„m…m†m‡mˆm‰mŠm‹mŒmmŽmmm‘m’m“m”m•m–m—m˜m™mšm›mœmmžmŸm m¡m¢m£m¤m¥m¦m§m¨m©mªm«m¬m­m®m¯m°m±m²m³m´mµm¶m·m¸m¹mºm»m¼m½m¾m¿mÀmÁmÂmÃmÄmÅmÆmÇmÈmÉmÊmËmÌmÍmÎmÏmÐmÑmÒmÓmÔmÕmÖm×mØmÙmÚmÛmÜmÝmÞmßmàmámâmãmämåmæmçmèmémêmëmìmímîmïmðmñmòmómômõmöm÷mømùmúmûmümýmþmÿmnnnnnnnnn n n n n nnnnnnnnnnnnnnnnnnn n!n"n#n$n%n&n'n(n)n*n+n,n-n.n/n0n1n2n3n4n5n6n7n8n9n:n;nn?n@nAnBnCnDnEnFnGnHnInJnKnLnMnNnOnPnQnRnSnTnUnVnWnXnYnZn[n\n]n^n_n`nanbncndnenfngnhninjnknlnmnnnonpnqnrnsntnunvnwnxnynzn{n|n}n~nn€nn‚nƒn„n…n†n‡nˆn‰nŠn‹nŒnnŽnnn‘n’n“n”n•n–n—n˜n™nšn›nœnnžnŸn n¡n¢n£n¤n¥n¦n§n¨n©nªn«n¬n­n®n¯n°n±n²n³n´nµn¶n·n¸n¹nºn»n¼n½n¾n¿nÀnÁnÂnÃnÄnÅnÆnÇnÈnÉnÊnËnÌnÍnÎnÏnÐnÑnÒnÓnÔnÕnÖn×nØnÙnÚnÛnÜnÝnÞnßnànánânãnänånænçnènénênënìnínînïnðnñnònónônõnön÷nønùnúnûnünýnþnÿnooooooooo o o o o ooooooooooooooooooo o!o"o#o$o%o&o'o(o)o*o+o,o-o.o/o0o1o2o3o4o5o6o7o8o9o:o;oo?o@oAoBoCoDoEoFoGoHoIoJoKoLoMoNoOoPoQoRoSoToUoVoWoXoYoZo[o\o]o^o_o`oaobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozo{o|o}o~oo€oo‚oƒo„o…o†o‡oˆo‰oŠo‹oŒooŽooo‘o’o“o”o•o–o—o˜o™ošo›oœoožoŸo o¡o¢o£o¤o¥o¦o§o¨o©oªo«o¬o­o®o¯o°o±o²o³o´oµo¶o·o¸o¹oºo»o¼o½o¾o¿oÀoÁoÂoÃoÄoÅoÆoÇoÈoÉoÊoËoÌoÍoÎoÏoÐoÑoÒoÓoÔoÕoÖo×oØoÙoÚoÛoÜoÝoÞoßoàoáoâoãoäoåoæoçoèoéoêoëoìoíoîoïoðoñoòoóoôoõoöo÷oøoùoúoûoüoýoþoÿoppppppppp p p p p ppppppppppppppppppp p!p"p#p$p%p&p'p(p)p*p+p,p-p.p/p0p1p2p3p4p5p6p7p8p9p:p;pp?p@pApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpSpTpUpVpWpXpYpZp[p\p]p^p_p`papbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzp{p|p}p~pp€pp‚pƒp„p…p†p‡pˆp‰pŠp‹pŒppŽppp‘p’p“p”p•p–p—p˜p™pšp›pœppžpŸp p¡p¢p£p¤p¥p¦p§p¨p©pªp«p¬p­p®p¯p°p±p²p³p´pµp¶p·p¸p¹pºp»p¼p½p¾p¿pÀpÁpÂpÃpÄpÅpÆpÇpÈpÉpÊpËpÌpÍpÎpÏpÐpÑpÒpÓpÔpÕpÖp×pØpÙpÚpÛpÜpÝpÞpßpàpápâpãpäpåpæpçpèpépêpëpìpípîpïpðpñpòpópôpõpöp÷pøpùpúpûpüpýpþpÿpqqqqqqqqq q q q q qqqqqqqqqqqqqqqqqqq q!q"q#q$q%q&q'q(q)q*q+q,q-q.q/q0q1q2q3q4q5q6q7q8q9q:q;qq?q@qAqBqCqDqEqFqGqHqIqJqKqLqMqNqOqPqQqRqSqTqUqVqWqXqYqZq[q\q]q^q_q`qaqbqcqdqeqfqgqhqiqjqkqlqmqnqoqpqqqrqsqtquqvqwqxqyqzq{q|q}q~qq€qq‚qƒq„q…q†q‡qˆq‰qŠq‹qŒqqŽqqq‘q’q“q”q•q–q—q˜q™qšq›qœqqžqŸq q¡q¢q£q¤q¥q¦q§q¨q©qªq«q¬q­q®q¯q°q±q²q³q´qµq¶q·q¸q¹qºq»q¼q½q¾q¿qÀqÁqÂqÃqÄqÅqÆqÇqÈqÉqÊqËqÌqÍqÎqÏqÐqÑqÒqÓqÔqÕqÖq×qØqÙqÚqÛqÜqÝqÞqßqàqáqâqãqäqåqæqçqèqéqêqëqìqíqîqïqðqñqòqóqôqõqöq÷qøqùqúqûqüqýqþqÿqrrrrrrrrr r r r r rrrrrrrrrrrrrrrrrrr r!r"r#r$r%r&r'r(r)r*r+r,r-r.r/r0r1r2r3r4r5r6r7r8r9r:r;rr?r@rArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrQrRrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzr{r|r}r~rr€rr‚rƒr„r…r†r‡rˆr‰rŠr‹rŒrrŽrrr‘r’r“r”r•r–r—r˜r™ršr›rœrržrŸr r¡r¢r£r¤r¥r¦r§r¨r©rªr«r¬r­r®r¯r°r±r²r³r´rµr¶r·r¸r¹rºr»r¼r½r¾r¿rÀrÁrÂrÃrÄrÅrÆrÇrÈrÉrÊrËrÌrÍrÎrÏrÐrÑrÒrÓrÔrÕrÖr×rØrÙrÚrÛrÜrÝrÞrßràrárârãrärårærçrèrérêrërìrírîrïrðrñròrórôrõrör÷rørùrúrûrürýrþrÿrsssssssss s s s s sssssssssssssssssss s!s"s#s$s%s&s's(s)s*s+s,s-s.s/s0s1s2s3s4s5s6s7s8s9s:s;ss?s@sAsBsCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsUsVsWsXsYsZs[s\s]s^s_s`sasbscsdsesfsgshsisjskslsmsnsospsqsrssstsusvswsxsyszs{s|s}s~ss€ss‚sƒs„s…s†s‡sˆs‰sŠs‹sŒssŽsss‘s’s“s”s•s–s—s˜s™sšs›sœssžsŸs s¡s¢s£s¤s¥s¦s§s¨s©sªs«s¬s­s®s¯s°s±s²s³s´sµs¶s·s¸s¹sºs»s¼s½s¾s¿sÀsÁsÂsÃsÄsÅsÆsÇsÈsÉsÊsËsÌsÍsÎsÏsÐsÑsÒsÓsÔsÕsÖs×sØsÙsÚsÛsÜsÝsÞsßsàsásâsãsäsåsæsçsèsésêsësìsísîsïsðsñsòsósôsõsös÷søsùsúsûsüsýsþsÿsttttttttt t t t t ttttttttttttttttttt t!t"t#t$t%t&t't(t)t*t+t,t-t.t/t0t1t2t3t4t5t6t7t8t9t:t;tt?t@tAtBtCtDtEtFtGtHtItJtKtLtMtNtOtPtQtRtStTtUtVtWtXtYtZt[t\t]t^t_t`tatbtctdtetftgthtitjtktltmtntotptqtrtstttutvtwtxtytzt{t|t}t~tt€tt‚tƒt„t…t†t‡tˆt‰tŠt‹tŒttŽttt‘t’t“t”t•t–t—t˜t™tšt›tœttžtŸt t¡t¢t£t¤t¥t¦t§t¨t©tªt«t¬t­t®t¯t°t±t²t³t´tµt¶t·t¸t¹tºt»t¼t½t¾t¿tÀtÁtÂtÃtÄtÅtÆtÇtÈtÉtÊtËtÌtÍtÎtÏtÐtÑtÒtÓtÔtÕtÖt×tØtÙtÚtÛtÜtÝtÞtßtàtátâtãtätåtætçtètétêtëtìtítîtïtðtñtòtótôtõtöt÷tøtùtútûtütýtþtÿtuuuuuuuuu u u u u uuuuuuuuuuuuuuuuuuu u!u"u#u$u%u&u'u(u)u*u+u,u-u.u/u0u1u2u3u4u5u6u7u8u9u:u;uu?u@uAuBuCuDuEuFuGuHuIuJuKuLuMuNuOuPuQuRuSuTuUuVuWuXuYuZu[u\u]u^u_u`uaubucudueufuguhuiujukulumunuoupuqurusutuuuvuwuxuyuzu{u|u}u~uu€uu‚uƒu„u…u†u‡uˆu‰uŠu‹uŒuuŽuuu‘u’u“u”u•u–u—u˜u™ušu›uœuužuŸu u¡u¢u£u¤u¥u¦u§u¨u©uªu«u¬u­u®u¯u°u±u²u³u´uµu¶u·u¸u¹uºu»u¼u½u¾u¿uÀuÁuÂuÃuÄuÅuÆuÇuÈuÉuÊuËuÌuÍuÎuÏuÐuÑuÒuÓuÔuÕuÖu×uØuÙuÚuÛuÜuÝuÞußuàuáuâuãuäuåuæuçuèuéuêuëuìuíuîuïuðuñuòuóuôuõuöu÷uøuùuúuûuüuýuþuÿuvvvvvvvvv v v v v vvvvvvvvvvvvvvvvvvv v!v"v#v$v%v&v'v(v)v*v+v,v-v.v/v0v1v2v3v4v5v6v7v8v9v:v;vv?v@vAvBvCvDvEvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvWvXvYvZv[v\v]v^v_v`vavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvzv{v|v}v~vv€vv‚vƒv„v…v†v‡vˆv‰vŠv‹vŒvvŽvvv‘v’v“v”v•v–v—v˜v™všv›vœvvžvŸv v¡v¢v£v¤v¥v¦v§v¨v©vªv«v¬v­v®v¯v°v±v²v³v´vµv¶v·v¸v¹vºv»v¼v½v¾v¿vÀvÁvÂvÃvÄvÅvÆvÇvÈvÉvÊvËvÌvÍvÎvÏvÐvÑvÒvÓvÔvÕvÖv×vØvÙvÚvÛvÜvÝvÞvßvàvávâvãvävåvævçvèvévêvëvìvívîvïvðvñvòvóvôvõvöv÷vøvùvúvûvüvývþvÿvwwwwwwwww w w w w wwwwwwwwwwwwwwwwwww w!w"w#w$w%w&w'w(w)w*w+w,w-w.w/w0w1w2w3w4w5w6w7w8w9w:w;ww?w@wAwBwCwDwEwFwGwHwIwJwKwLwMwNwOwPwQwRwSwTwUwVwWwXwYwZw[w\w]w^w_w`wawbwcwdwewfwgwhwiwjwkwlwmwnwowpwqwrwswtwuwvwwwxwywzw{w|w}w~ww€ww‚wƒw„w…w†w‡wˆw‰wŠw‹wŒwwŽwww‘w’w“w”w•w–w—w˜w™wšw›wœwwžwŸw w¡w¢w£w¤w¥w¦w§w¨w©wªw«w¬w­w®w¯w°w±w²w³w´wµw¶w·w¸w¹wºw»w¼w½w¾w¿wÀwÁwÂwÃwÄwÅwÆwÇwÈwÉwÊwËwÌwÍwÎwÏwÐwÑwÒwÓwÔwÕwÖw×wØwÙwÚwÛwÜwÝwÞwßwàwáwâwãwäwåwæwçwèwéwêwëwìwíwîwïwðwñwòwówôwõwöw÷wøwùwúwûwüwýwþwÿwxxxxxxxxx x x x x xxxxxxxxxxxxxxxxxxx x!x"x#x$x%x&x'x(x)x*x+x,x-x.x/x0x1x2x3x4x5x6x7x8x9x:x;xx?x@xAxBxCxDxExFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx[x\x]x^x_x`xaxbxcxdxexfxgxhxixjxkxlxmxnxoxpxqxrxsxtxuxvxwxxxyxzx{x|x}x~xx€xx‚xƒx„x…x†x‡xˆx‰xŠx‹xŒxxŽxxx‘x’x“x”x•x–x—x˜x™xšx›xœxxžxŸx x¡x¢x£x¤x¥x¦x§x¨x©xªx«x¬x­x®x¯x°x±x²x³x´xµx¶x·x¸x¹xºx»x¼x½x¾x¿xÀxÁxÂxÃxÄxÅxÆxÇxÈxÉxÊxËxÌxÍxÎxÏxÐxÑxÒxÓxÔxÕxÖx×xØxÙxÚxÛxÜxÝxÞxßxàxáxâxãxäxåxæxçxèxéxêxëxìxíxîxïxðxñxòxóxôxõxöx÷xøxùxúxûxüxýxþxÿxyyyyyyyyy y y y y yyyyyyyyyyyyyyyyyyy y!y"y#y$y%y&y'y(y)y*y+y,y-y.y/y0y1y2y3y4y5y6y7y8y9y:y;yy?y@yAyByCyDyEyFyGyHyIyJyKyLyMyNyOyPyQyRySyTyUyVyWyXyYyZy[y\y]y^y_y`yaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzy{y|y}y~yy€yy‚yƒy„y…y†y‡yˆy‰yŠy‹yŒyyŽyyy‘y’y“y”y•y–y—y˜y™yšy›yœyyžyŸy y¡y¢y£y¤y¥y¦y§y¨y©yªy«y¬y­y®y¯y°y±y²y³y´yµy¶y·y¸y¹yºy»y¼y½y¾y¿yÀyÁyÂyÃyÄyÅyÆyÇyÈyÉyÊyËyÌyÍyÎyÏyÐyÑyÒyÓyÔyÕyÖy×yØyÙyÚyÛyÜyÝyÞyßyàyáyâyãyäyåyæyçyèyéyêyëyìyíyîyïyðyñyòyóyôyõyöy÷yøyùyúyûyüyýyþyÿyzzzzzzzzz z z z z zzzzzzzzzzzzzzzzzzz z!z"z#z$z%z&z'z(z)z*z+z,z-z.z/z0z1z2z3z4z5z6z7z8z9z:z;zz?z@zAzBzCzDzEzFzGzHzIzJzKzLzMzNzOzPzQzRzSzTzUzVzWzXzYzZz[z\z]z^z_z`zazbzczdzezfzgzhzizjzkzlzmznzozpzqzrzsztzuzvzwzxzyzzz{z|z}z~zz€zz‚zƒz„z…z†z‡zˆz‰zŠz‹zŒzzŽzzz‘z’z“z”z•z–z—z˜z™zšz›zœzzžzŸz z¡z¢z£z¤z¥z¦z§z¨z©zªz«z¬z­z®z¯z°z±z²z³z´zµz¶z·z¸z¹zºz»z¼z½z¾z¿zÀzÁzÂzÃzÄzÅzÆzÇzÈzÉzÊzËzÌzÍzÎzÏzÐzÑzÒzÓzÔzÕzÖz×zØzÙzÚzÛzÜzÝzÞzßzàzázâzãzäzåzæzçzèzézêzëzìzízîzïzðzñzòzózôzõzöz÷zøzùzúzûzüzýzþzÿz{{{{{{{{{ { { { { {{{{{{{{{{{{{{{{{{{ {!{"{#{${%{&{'{({){*{+{,{-{.{/{0{1{2{3{4{5{6{7{8{9{:{;{<{={>{?{@{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{[{\{]{^{_{`{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{{{|{}{~{{€{{‚{ƒ{„{…{†{‡{ˆ{‰{Š{‹{Œ{{Ž{{{‘{’{“{”{•{–{—{˜{™{š{›{œ{{ž{Ÿ{ {¡{¢{£{¤{¥{¦{§{¨{©{ª{«{¬{­{®{¯{°{±{²{³{´{µ{¶{·{¸{¹{º{»{¼{½{¾{¿{À{Á{Â{Ã{Ä{Å{Æ{Ç{È{É{Ê{Ë{Ì{Í{Î{Ï{Ð{Ñ{Ò{Ó{Ô{Õ{Ö{×{Ø{Ù{Ú{Û{Ü{Ý{Þ{ß{à{á{â{ã{ä{å{æ{ç{è{é{ê{ë{ì{í{î{ï{ð{ñ{ò{ó{ô{õ{ö{÷{ø{ù{ú{û{ü{ý{þ{ÿ{||||||||| | | | | ||||||||||||||||||| |!|"|#|$|%|&|'|(|)|*|+|,|-|.|/|0|1|2|3|4|5|6|7|8|9|:|;|<|=|>|?|@|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|[|\|]|^|_|`|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|{|||}|~||€||‚|ƒ|„|…|†|‡|ˆ|‰|Š|‹|Œ||Ž|||‘|’|“|”|•|–|—|˜|™|š|›|œ||ž|Ÿ| |¡|¢|£|¤|¥|¦|§|¨|©|ª|«|¬|­|®|¯|°|±|²|³|´|µ|¶|·|¸|¹|º|»|¼|½|¾|¿|À|Á|Â|Ã|Ä|Å|Æ|Ç|È|É|Ê|Ë|Ì|Í|Î|Ï|Ð|Ñ|Ò|Ó|Ô|Õ|Ö|×|Ø|Ù|Ú|Û|Ü|Ý|Þ|ß|à|á|â|ã|ä|å|æ|ç|è|é|ê|ë|ì|í|î|ï|ð|ñ|ò|ó|ô|õ|ö|÷|ø|ù|ú|û|ü|ý|þ|ÿ|}}}}}}}}} } } } } }}}}}}}}}}}}}}}}}}} }!}"}#}$}%}&}'}(})}*}+},}-}.}/}0}1}2}3}4}5}6}7}8}9}:};}<}=}>}?}@}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}[}\}]}^}_}`}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}{}|}}}~}}€}}‚}ƒ}„}…}†}‡}ˆ}‰}Š}‹}Œ}}Ž}}}‘}’}“}”}•}–}—}˜}™}š}›}œ}}ž}Ÿ} }¡}¢}£}¤}¥}¦}§}¨}©}ª}«}¬}­}®}¯}°}±}²}³}´}µ}¶}·}¸}¹}º}»}¼}½}¾}¿}À}Á}Â}Ã}Ä}Å}Æ}Ç}È}É}Ê}Ë}Ì}Í}Î}Ï}Ð}Ñ}Ò}Ó}Ô}Õ}Ö}×}Ø}Ù}Ú}Û}Ü}Ý}Þ}ß}à}á}â}ã}ä}å}æ}ç}è}é}ê}ë}ì}í}î}ï}ð}ñ}ò}ó}ô}õ}ö}÷}ø}ù}ú}û}ü}ý}þ}ÿ}~~~~~~~~~ ~ ~ ~ ~ ~~~~~~~~~~~~~~~~~~~ ~!~"~#~$~%~&~'~(~)~*~+~,~-~.~/~0~1~2~3~4~5~6~7~8~9~:~;~<~=~>~?~@~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~[~\~]~^~_~`~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~{~|~}~~~~€~~‚~ƒ~„~…~†~‡~ˆ~‰~Š~‹~Œ~~Ž~~~‘~’~“~”~•~–~—~˜~™~š~›~œ~~ž~Ÿ~ ~¡~¢~£~¤~¥~¦~§~¨~©~ª~«~¬~­~®~¯~°~±~²~³~´~µ~¶~·~¸~¹~º~»~¼~½~¾~¿~À~Á~Â~Ã~Ä~Å~Æ~Ç~È~É~Ê~Ë~Ì~Í~Î~Ï~Ð~Ñ~Ò~Ó~Ô~Õ~Ö~×~Ø~Ù~Ú~Û~Ü~Ý~Þ~ß~à~á~â~ã~ä~å~æ~ç~è~é~ê~ë~ì~í~î~ï~ð~ñ~ò~ó~ô~õ~ö~÷~ø~ù~ú~û~ü~ý~þ~ÿ~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ€€€€€€€€€ € € € € €€€€€€€€€€€€€€€€€€€ €!€"€#€$€%€&€'€(€)€*€+€,€-€.€/€0€1€2€3€4€5€6€7€8€9€:€;€<€=€>€?€@€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€[€\€]€^€_€`€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€{€|€}€~€€€€€‚€ƒ€„€…€†€‡€ˆ€‰€Š€‹€Œ€€Ž€€€‘€’€“€”€•€–€—€˜€™€š€›€œ€€ž€Ÿ€ €¡€¢€£€¤€¥€¦€§€¨€©€ª€«€¬€­€®€¯€°€±€²€³€´€µ€¶€·€¸€¹€º€»€¼€½€¾€¿€À€Á€Â€Ã€Ä€Å€Æ€Ç€È€É€Ê€Ë€Ì€Í€Î€Ï€Ð€Ñ€Ò€Ó€Ô€Õ€Ö€×€Ø€Ù€Ú€Û€Ü€Ý€Þ€ß€à€á€â€ã€ä€å€æ€ç€è€é€ê€ë€ì€í€î€ï€ð€ñ€ò€ó€ô€õ€ö€÷€ø€ù€ú€û€ü€ý€þ€ÿ€  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ‚‚‚‚‚‚‚‚‚ ‚ ‚ ‚ ‚ ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ ‚!‚"‚#‚$‚%‚&‚'‚(‚)‚*‚+‚,‚-‚.‚/‚0‚1‚2‚3‚4‚5‚6‚7‚8‚9‚:‚;‚<‚=‚>‚?‚@‚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‚[‚\‚]‚^‚_‚`‚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‚{‚|‚}‚~‚‚€‚‚‚‚ƒ‚„‚…‚†‚‡‚ˆ‚‰‚Š‚‹‚Œ‚‚Ž‚‚‚‘‚’‚“‚”‚•‚–‚—‚˜‚™‚š‚›‚œ‚‚ž‚Ÿ‚ ‚¡‚¢‚£‚¤‚¥‚¦‚§‚¨‚©‚ª‚«‚¬‚­‚®‚¯‚°‚±‚²‚³‚´‚µ‚¶‚·‚¸‚¹‚º‚»‚¼‚½‚¾‚¿‚À‚Á‚‚ÂĂłƂǂȂɂʂ˂̂͂΂ςЂт҂ӂԂՂւׂ؂قڂۂ܂݂ނ߂à‚á‚â‚ã‚ä‚傿‚ç‚è‚é‚ê‚ë‚ì‚í‚î‚ï‚ð‚ñ‚ò‚ó‚ô‚õ‚ö‚÷‚ø‚ù‚ú‚û‚ü‚ý‚þ‚ÿ‚ƒƒƒƒƒƒƒƒƒ ƒ ƒ ƒ ƒ ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ ƒ!ƒ"ƒ#ƒ$ƒ%ƒ&ƒ'ƒ(ƒ)ƒ*ƒ+ƒ,ƒ-ƒ.ƒ/ƒ0ƒ1ƒ2ƒ3ƒ4ƒ5ƒ6ƒ7ƒ8ƒ9ƒ:ƒ;ƒ<ƒ=ƒ>ƒ?ƒ@ƒ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ƒ[ƒ\ƒ]ƒ^ƒ_ƒ`ƒ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ƒ{ƒ|ƒ}ƒ~ƒƒ€ƒƒ‚ƒƒƒ„ƒ…ƒ†ƒ‡ƒˆƒ‰ƒŠƒ‹ƒŒƒƒŽƒƒƒ‘ƒ’ƒ“ƒ”ƒ•ƒ–ƒ—ƒ˜ƒ™ƒšƒ›ƒœƒƒžƒŸƒ ƒ¡ƒ¢ƒ£ƒ¤ƒ¥ƒ¦ƒ§ƒ¨ƒ©ƒªƒ«ƒ¬ƒ­ƒ®ƒ¯ƒ°ƒ±ƒ²ƒ³ƒ´ƒµƒ¶ƒ·ƒ¸ƒ¹ƒºƒ»ƒ¼ƒ½ƒ¾ƒ¿ƒÀƒÁƒÂƒÃƒÄƒÅƒÆƒÇƒÈƒÉƒÊƒËƒÌƒÍƒÎƒÏƒÐƒÑƒÒƒÓƒÔƒÕƒÖƒ×ƒØƒÙƒÚƒÛƒÜƒÝƒÞƒßƒàƒáƒâƒãƒäƒåƒæƒçƒèƒéƒêƒëƒìƒíƒîƒïƒðƒñƒòƒóƒôƒõƒöƒ÷ƒøƒùƒúƒûƒüƒýƒþƒÿƒ„„„„„„„„„ „ „ „ „ „„„„„„„„„„„„„„„„„„„ „!„"„#„$„%„&„'„(„)„*„+„,„-„.„/„0„1„2„3„4„5„6„7„8„9„:„;„<„=„>„?„@„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„[„\„]„^„_„`„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„{„|„}„~„„€„„‚„ƒ„„„…„†„‡„ˆ„‰„Š„‹„Œ„„Ž„„„‘„’„“„”„•„–„—„˜„™„š„›„œ„„ž„Ÿ„ „¡„¢„£„¤„¥„¦„§„¨„©„ª„«„¬„­„®„¯„°„±„²„³„´„µ„¶„·„¸„¹„º„»„¼„½„¾„¿„À„Á„„ÄĄńƄDŽȄɄʄ˄̄̈́΄τЄф҄ӄԄՄքׄ؄لڄۄ܄݄ބ߄à„á„â„ã„ä„儿„ç„è„é„ê„ë„ì„í„î„ï„ð„ñ„ò„ó„ô„õ„ö„÷„ø„ù„ú„û„ü„ý„þ„ÿ„……………………… … … … … ………………………………………………… …!…"…#…$…%…&…'…(…)…*…+…,…-….…/…0…1…2…3…4…5…6…7…8…9…:…;…<…=…>…?…@…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…[…\…]…^…_…`…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…{…|…}…~……€……‚…ƒ…„………†…‡…ˆ…‰…Š…‹…Œ……Ž………‘…’…“…”…•…–…—…˜…™…š…›…œ……ž…Ÿ… …¡…¢…£…¤…¥…¦…§…¨…©…ª…«…¬…­…®…¯…°…±…²…³…´…µ…¶…·…¸…¹…º…»…¼…½…¾…¿…À…Á……ÅąŅƅDžȅɅʅ˅̅ͅ΅υЅх҅ӅԅՅօׅ؅مڅۅ܅݅ޅ߅à…á…â…ã…ä…å…æ…ç…è…é…ê…ë…ì…í…î…ï…ð…ñ…ò…ó…ô…õ…ö…÷…ø…ù…ú…û…ü…ý…þ…ÿ…††††††††† † † † † ††††††††††††††††††† †!†"†#†$†%†&†'†(†)†*†+†,†-†.†/†0†1†2†3†4†5†6†7†8†9†:†;†<†=†>†?†@†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†[†\†]†^†_†`†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†{†|†}†~††€††‚†ƒ†„†…†††‡†ˆ†‰†Š†‹†Œ††Ž†††‘†’†“†”†•†–†—†˜†™†š†›†œ††ž†Ÿ† †¡†¢†£†¤†¥†¦†§†¨†©†ª†«†¬†­†®†¯†°†±†²†³†´†µ†¶†·†¸†¹†º†»†¼†½†¾†¿†À†Á†Â†Ã†Ä†Å†Æ†Ç†È†É†Ê†Ë†Ì†Í†Î†Ï†Ð†Ñ†Ò†Ó†Ô†Õ†Ö†×†Ø†Ù†Ú†Û†Ü†Ý†Þ†ß†à†á†â†ã†ä†å†æ†ç†è†é†ê†ë†ì†í†î†ï†ð†ñ†ò†ó†ô†õ†ö†÷†ø†ù†ú†û†ü†ý†þ†ÿ†‡‡‡‡‡‡‡‡‡ ‡ ‡ ‡ ‡ ‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡ ‡!‡"‡#‡$‡%‡&‡'‡(‡)‡*‡+‡,‡-‡.‡/‡0‡1‡2‡3‡4‡5‡6‡7‡8‡9‡:‡;‡<‡=‡>‡?‡@‡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‡[‡\‡]‡^‡_‡`‡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‡{‡|‡}‡~‡‡€‡‡‚‡ƒ‡„‡…‡†‡‡‡ˆ‡‰‡Š‡‹‡Œ‡‡Ž‡‡‡‘‡’‡“‡”‡•‡–‡—‡˜‡™‡š‡›‡œ‡‡ž‡Ÿ‡ ‡¡‡¢‡£‡¤‡¥‡¦‡§‡¨‡©‡ª‡«‡¬‡­‡®‡¯‡°‡±‡²‡³‡´‡µ‡¶‡·‡¸‡¹‡º‡»‡¼‡½‡¾‡¿‡À‡Á‡Â‡Ã‡Ä‡Å‡Æ‡Ç‡È‡É‡Ê‡Ë‡Ì‡Í‡Î‡Ï‡Ð‡Ñ‡Ò‡Ó‡Ô‡Õ‡Ö‡×‡Ø‡Ù‡Ú‡Û‡Ü‡Ý‡Þ‡ß‡à‡á‡â‡ã‡ä‡å‡æ‡ç‡è‡é‡ê‡ë‡ì‡í‡î‡ï‡ð‡ñ‡ò‡ó‡ô‡õ‡ö‡÷‡ø‡ù‡ú‡û‡ü‡ý‡þ‡ÿ‡ˆˆˆˆˆˆˆˆˆ ˆ ˆ ˆ ˆ ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ ˆ!ˆ"ˆ#ˆ$ˆ%ˆ&ˆ'ˆ(ˆ)ˆ*ˆ+ˆ,ˆ-ˆ.ˆ/ˆ0ˆ1ˆ2ˆ3ˆ4ˆ5ˆ6ˆ7ˆ8ˆ9ˆ:ˆ;ˆ<ˆ=ˆ>ˆ?ˆ@ˆ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ˆ[ˆ\ˆ]ˆ^ˆ_ˆ`ˆ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ˆ{ˆ|ˆ}ˆ~ˆˆ€ˆˆ‚ˆƒˆ„ˆ…ˆ†ˆ‡ˆˆˆ‰ˆŠˆ‹ˆŒˆˆŽˆˆˆ‘ˆ’ˆ“ˆ”ˆ•ˆ–ˆ—ˆ˜ˆ™ˆšˆ›ˆœˆˆžˆŸˆ ˆ¡ˆ¢ˆ£ˆ¤ˆ¥ˆ¦ˆ§ˆ¨ˆ©ˆªˆ«ˆ¬ˆ­ˆ®ˆ¯ˆ°ˆ±ˆ²ˆ³ˆ´ˆµˆ¶ˆ·ˆ¸ˆ¹ˆºˆ»ˆ¼ˆ½ˆ¾ˆ¿ˆÀˆÁˆÂˆÃˆÄˆÅˆÆˆÇˆÈˆÉˆÊˆËˆÌˆÍˆÎˆÏˆÐˆÑˆÒˆÓˆÔˆÕˆÖˆ×ˆØˆÙˆÚˆÛˆÜˆÝˆÞˆßˆàˆáˆâˆãˆäˆåˆæˆçˆèˆéˆêˆëˆìˆíˆîˆïˆðˆñˆòˆóˆôˆõˆöˆ÷ˆøˆùˆúˆûˆüˆýˆþˆÿˆ‰‰‰‰‰‰‰‰‰ ‰ ‰ ‰ ‰ ‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰ ‰!‰"‰#‰$‰%‰&‰'‰(‰)‰*‰+‰,‰-‰.‰/‰0‰1‰2‰3‰4‰5‰6‰7‰8‰9‰:‰;‰<‰=‰>‰?‰@‰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‰[‰\‰]‰^‰_‰`‰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‰{‰|‰}‰~‰‰€‰‰‚‰ƒ‰„‰…‰†‰‡‰ˆ‰‰‰Š‰‹‰Œ‰‰Ž‰‰‰‘‰’‰“‰”‰•‰–‰—‰˜‰™‰š‰›‰œ‰‰ž‰Ÿ‰ ‰¡‰¢‰£‰¤‰¥‰¦‰§‰¨‰©‰ª‰«‰¬‰­‰®‰¯‰°‰±‰²‰³‰´‰µ‰¶‰·‰¸‰¹‰º‰»‰¼‰½‰¾‰¿‰À‰Á‰Â‰Ã‰Ä‰Å‰Æ‰Ç‰È‰É‰Ê‰Ë‰Ì‰Í‰Î‰Ï‰Ð‰Ñ‰Ò‰Ó‰Ô‰Õ‰Ö‰×‰Ø‰Ù‰Ú‰Û‰Ü‰Ý‰Þ‰ß‰à‰á‰â‰ã‰ä‰å‰æ‰ç‰è‰é‰ê‰ë‰ì‰í‰î‰ï‰ð‰ñ‰ò‰ó‰ô‰õ‰ö‰÷‰ø‰ù‰ú‰û‰ü‰ý‰þ‰ÿ‰ŠŠŠŠŠŠŠŠŠ Š Š Š Š ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ Š!Š"Š#Š$Š%Š&Š'Š(Š)Š*Š+Š,Š-Š.Š/Š0Š1Š2Š3Š4Š5Š6Š7Š8Š9Š:Š;Š<Š=Š>Š?Š@Š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Š[Š\Š]Š^Š_Š`Š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Š{Š|Š}Š~ŠŠ€ŠŠ‚ŠƒŠ„Š…Š†Š‡ŠˆŠ‰ŠŠŠ‹ŠŒŠŠŽŠŠŠ‘Š’Š“Š”Š•Š–Š—Š˜Š™ŠšŠ›ŠœŠŠžŠŸŠ Š¡Š¢Š£Š¤Š¥Š¦Š§Š¨Š©ŠªŠ«Š¬Š­Š®Š¯Š°Š±Š²Š³Š´ŠµŠ¶Š·Š¸Š¹ŠºŠ»Š¼Š½Š¾Š¿ŠÀŠÁŠÂŠÃŠÄŠÅŠÆŠÇŠÈŠÉŠÊŠËŠÌŠÍŠÎŠÏŠÐŠÑŠÒŠÓŠÔŠÕŠÖŠ×ŠØŠÙŠÚŠÛŠÜŠÝŠÞŠßŠàŠáŠâŠãŠäŠåŠæŠçŠèŠéŠêŠëŠìŠíŠîŠïŠðŠñŠòŠóŠôŠõŠöŠ÷ŠøŠùŠúŠûŠüŠýŠþŠÿŠ‹‹‹‹‹‹‹‹‹ ‹ ‹ ‹ ‹ ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ ‹!‹"‹#‹$‹%‹&‹'‹(‹)‹*‹+‹,‹-‹.‹/‹0‹1‹2‹3‹4‹5‹6‹7‹8‹9‹:‹;‹<‹=‹>‹?‹@‹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‹[‹\‹]‹^‹_‹`‹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‹{‹|‹}‹~‹‹€‹‹‚‹ƒ‹„‹…‹†‹‡‹ˆ‹‰‹Š‹‹‹Œ‹‹Ž‹‹‹‘‹’‹“‹”‹•‹–‹—‹˜‹™‹š‹›‹œ‹‹ž‹Ÿ‹ ‹¡‹¢‹£‹¤‹¥‹¦‹§‹¨‹©‹ª‹«‹¬‹­‹®‹¯‹°‹±‹²‹³‹´‹µ‹¶‹·‹¸‹¹‹º‹»‹¼‹½‹¾‹¿‹À‹Á‹Â‹Ã‹Ä‹Å‹Æ‹Ç‹È‹É‹Ê‹Ë‹Ì‹Í‹Î‹Ï‹Ð‹Ñ‹Ò‹Ó‹Ô‹Õ‹Ö‹×‹Ø‹Ù‹Ú‹Û‹Ü‹Ý‹Þ‹ß‹à‹á‹â‹ã‹ä‹å‹æ‹ç‹è‹é‹ê‹ë‹ì‹í‹î‹ï‹ð‹ñ‹ò‹ó‹ô‹õ‹ö‹÷‹ø‹ù‹ú‹û‹ü‹ý‹þ‹ÿ‹ŒŒŒŒŒŒŒŒŒ Œ Œ Œ Œ ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ Œ!Œ"Œ#Œ$Œ%Œ&Œ'Œ(Œ)Œ*Œ+Œ,Œ-Œ.Œ/Œ0Œ1Œ2Œ3Œ4Œ5Œ6Œ7Œ8Œ9Œ:Œ;Œ<Œ=Œ>Œ?Œ@Œ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Œ[Œ\Œ]Œ^Œ_Œ`Œ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Œ{Œ|Œ}Œ~ŒŒ€ŒŒ‚ŒƒŒ„Œ…Œ†Œ‡ŒˆŒ‰ŒŠŒ‹ŒŒŒŒŽŒŒŒ‘Œ’Œ“Œ”Œ•Œ–Œ—Œ˜Œ™ŒšŒ›ŒœŒŒžŒŸŒ Œ¡Œ¢Œ£Œ¤Œ¥Œ¦Œ§Œ¨Œ©ŒªŒ«Œ¬Œ­Œ®Œ¯Œ°Œ±Œ²Œ³Œ´ŒµŒ¶Œ·Œ¸Œ¹ŒºŒ»Œ¼Œ½Œ¾Œ¿ŒÀŒÁŒÂŒÃŒÄŒÅŒÆŒÇŒÈŒÉŒÊŒËŒÌŒÍŒÎŒÏŒÐŒÑŒÒŒÓŒÔŒÕŒÖŒ×ŒØŒÙŒÚŒÛŒÜŒÝŒÞŒßŒàŒáŒâŒãŒäŒåŒæŒçŒèŒéŒêŒëŒìŒíŒîŒïŒðŒñŒòŒóŒôŒõŒöŒ÷ŒøŒùŒúŒûŒüŒýŒþŒÿŒ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿŽŽŽŽŽŽŽŽŽ Ž Ž Ž Ž ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ Ž!Ž"Ž#Ž$Ž%Ž&Ž'Ž(Ž)Ž*Ž+Ž,Ž-Ž.Ž/Ž0Ž1Ž2Ž3Ž4Ž5Ž6Ž7Ž8Ž9Ž:Ž;Ž<Ž=Ž>Ž?Ž@Ž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Ž[Ž\Ž]Ž^Ž_Ž`Ž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Ž{Ž|Ž}Ž~ŽŽ€ŽŽ‚ŽƒŽ„Ž…Ž†Ž‡ŽˆŽ‰ŽŠŽ‹ŽŒŽŽŽŽŽŽ‘Ž’Ž“Ž”Ž•Ž–Ž—Ž˜Ž™ŽšŽ›ŽœŽŽžŽŸŽ Ž¡Ž¢Ž£Ž¤Ž¥Ž¦Ž§Ž¨Ž©ŽªŽ«Ž¬Ž­Ž®Ž¯Ž°Ž±Ž²Ž³Ž´ŽµŽ¶Ž·Ž¸Ž¹ŽºŽ»Ž¼Ž½Ž¾Ž¿ŽÀŽÁŽÂŽÃŽÄŽÅŽÆŽÇŽÈŽÉŽÊŽËŽÌŽÍŽÎŽÏŽÐŽÑŽÒŽÓŽÔŽÕŽÖŽ×ŽØŽÙŽÚŽÛŽÜŽÝŽÞŽßŽàŽáŽâŽãŽäŽåŽæŽçŽèŽéŽêŽëŽìŽíŽîŽïŽðŽñŽòŽóŽôŽõŽöŽ÷ŽøŽùŽúŽûŽüŽýŽþŽÿŽ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ‘‘‘‘‘‘‘‘‘ ‘ ‘ ‘ ‘ ‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘ ‘!‘"‘#‘$‘%‘&‘'‘(‘)‘*‘+‘,‘-‘.‘/‘0‘1‘2‘3‘4‘5‘6‘7‘8‘9‘:‘;‘<‘=‘>‘?‘@‘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‘[‘\‘]‘^‘_‘`‘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‘{‘|‘}‘~‘‘€‘‘‚‘ƒ‘„‘…‘†‘‡‘ˆ‘‰‘Š‘‹‘Œ‘‘Ž‘‘‘‘‘’‘“‘”‘•‘–‘—‘˜‘™‘š‘›‘œ‘‘ž‘Ÿ‘ ‘¡‘¢‘£‘¤‘¥‘¦‘§‘¨‘©‘ª‘«‘¬‘­‘®‘¯‘°‘±‘²‘³‘´‘µ‘¶‘·‘¸‘¹‘º‘»‘¼‘½‘¾‘¿‘À‘Á‘‘ÑđőƑǑȑɑʑˑ̑͑ΑϑБёґӑԑՑ֑בّؑڑۑܑݑޑߑà‘á‘â‘ã‘ä‘呿‘ç‘è‘é‘ê‘ë‘ì‘í‘î‘ï‘ð‘ñ‘ò‘ó‘ô‘õ‘ö‘÷‘ø‘ù‘ú‘û‘ü‘ý‘þ‘ÿ‘’’’’’’’’’ ’ ’ ’ ’ ’’’’’’’’’’’’’’’’’’’ ’!’"’#’$’%’&’'’(’)’*’+’,’-’.’/’0’1’2’3’4’5’6’7’8’9’:’;’<’=’>’?’@’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’[’\’]’^’_’`’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’{’|’}’~’’€’’‚’ƒ’„’…’†’‡’ˆ’‰’Š’‹’Œ’’Ž’’’‘’’’“’”’•’–’—’˜’™’š’›’œ’’ž’Ÿ’ ’¡’¢’£’¤’¥’¦’§’¨’©’ª’«’¬’­’®’¯’°’±’²’³’´’µ’¶’·’¸’¹’º’»’¼’½’¾’¿’À’Á’’ÒĒŒƒǒȒɒʒ˒̒͒ΒϒВђҒӒԒՒ֒גْؒڒےܒݒޒߒà’á’â’ã’ä’å’æ’ç’è’é’ê’ë’ì’í’î’ï’ð’ñ’ò’ó’ô’õ’ö’÷’ø’ù’ú’û’ü’ý’þ’ÿ’“““““““““ “ “ “ “ “““““““““““““““““““ “!“"“#“$“%“&“'“(“)“*“+“,“-“.“/“0“1“2“3“4“5“6“7“8“9“:“;“<“=“>“?“@“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“[“\“]“^“_“`“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“{“|“}“~““€““‚“ƒ“„“…“†“‡“ˆ“‰“Š“‹“Œ““Ž“““‘“’“““”“•“–“—“˜“™“š“›“œ““ž“Ÿ“ “¡“¢“£“¤“¥“¦“§“¨“©“ª“«“¬“­“®“¯“°“±“²“³“´“µ“¶“·“¸“¹“º“»“¼“½“¾“¿“À“Á““ÓēœƓǓȓɓʓ˓͓̓ΓϓГѓғӓԓՓ֓דؓٓړۓܓݓޓߓà“á“â“ã“ä“哿“ç“è“é“ê“ë“ì“í“î“ï“ð“ñ“ò“ó“ô“õ“ö“÷“ø“ù“ú“û“ü“ý“þ“ÿ“””””””””” ” ” ” ” ””””””””””””””””””” ”!”"”#”$”%”&”'”(”)”*”+”,”-”.”/”0”1”2”3”4”5”6”7”8”9”:”;”<”=”>”?”@”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”[”\”]”^”_”`”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”{”|”}”~””€””‚”ƒ”„”…”†”‡”ˆ”‰”Š”‹”Œ””Ž”””‘”’”“”””•”–”—”˜”™”š”›”œ””ž”Ÿ” ”¡”¢”£”¤”¥”¦”§”¨”©”ª”«”¬”­”®”¯”°”±”²”³”´”µ”¶”·”¸”¹”º”»”¼”½”¾”¿”À”Á””ÔĔŔƔǔȔɔʔ˔͔̔ΔϔДєҔӔԔՔ֔הؔٔڔ۔ܔݔޔߔà”á”â”ã”ä”唿”ç”è”é”ê”ë”ì”í”î”ï”ð”ñ”ò”ó”ô”õ”ö”÷”ø”ù”ú”û”ü”ý”þ”ÿ”••••••••• • • • • ••••••••••••••••••• •!•"•#•$•%•&•'•(•)•*•+•,•-•.•/•0•1•2•3•4•5•6•7•8•9•:•;•<•=•>•?•@•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•[•\•]•^•_•`•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•{•|•}•~••€••‚•ƒ•„•…•†•‡•ˆ•‰•Š•‹•Œ••Ž•••‘•’•“•”•••–•—•˜•™•š•›•œ••ž•Ÿ• •¡•¢•£•¤•¥•¦•§•¨•©•ª•«•¬•­•®•¯•°•±•²•³•´•µ•¶•·•¸•¹•º•»•¼•½•¾•¿•À•Á••ÕĕŕƕǕȕɕʕ˕͕̕ΕϕЕѕҕӕԕՕ֕וٕؕڕەܕݕޕߕà•á•â•ã•ä•啿•ç•è•é•ê•ë•ì•í•î•ï•ð•ñ•ò•ó•ô•õ•ö•÷•ø•ù•ú•û•ü•ý•þ•ÿ•––––––––– – – – – ––––––––––––––––––– –!–"–#–$–%–&–'–(–)–*–+–,–-–.–/–0–1–2–3–4–5–6–7–8–9–:–;–<–=–>–?–@–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–[–\–]–^–_–`–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–{–|–}–~––€––‚–ƒ–„–…–†–‡–ˆ–‰–Š–‹–Œ––Ž–––‘–’–“–”–•–––—–˜–™–š–›–œ––ž–Ÿ– –¡–¢–£–¤–¥–¦–§–¨–©–ª–«–¬–­–®–¯–°–±–²–³–´–µ–¶–·–¸–¹–º–»–¼–½–¾–¿–À–Á––ÖĖŖƖǖȖɖʖ˖̖͖ΖϖЖіҖӖԖՖ֖זٖؖږۖܖݖޖߖà–á–â–ã–ä–å–æ–ç–è–é–ê–ë–ì–í–î–ï–ð–ñ–ò–ó–ô–õ–ö–÷–ø–ù–ú–û–ü–ý–þ–ÿ–————————— — — — — ——————————————————— —!—"—#—$—%—&—'—(—)—*—+—,—-—.—/—0—1—2—3—4—5—6—7—8—9—:—;—<—=—>—?—@—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—[—\—]—^—_—`—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—{—|—}—~——€——‚—ƒ—„—…—†—‡—ˆ—‰—Š—‹—Œ——Ž———‘—’—“—”—•—–———˜—™—š—›—œ——ž—Ÿ— —¡—¢—£—¤—¥—¦—§—¨—©—ª—«—¬—­—®—¯—°—±—²—³—´—µ—¶—·—¸—¹—º—»—¼—½—¾—¿—À—Á——×ėŗƗǗȗɗʗ˗̗͗ΗϗЗїҗӗԗ՗֗חؗٗڗۗܗݗޗߗà—á—â—ã—ä—å—æ—ç—è—é—ê—ë—ì—í—î—ï—ð—ñ—ò—ó—ô—õ—ö—÷—ø—ù—ú—û—ü—ý—þ—ÿ—˜˜˜˜˜˜˜˜˜ ˜ ˜ ˜ ˜ ˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜ ˜!˜"˜#˜$˜%˜&˜'˜(˜)˜*˜+˜,˜-˜.˜/˜0˜1˜2˜3˜4˜5˜6˜7˜8˜9˜:˜;˜<˜=˜>˜?˜@˜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˜[˜\˜]˜^˜_˜`˜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˜{˜|˜}˜~˜˜€˜˜‚˜ƒ˜„˜…˜†˜‡˜ˆ˜‰˜Š˜‹˜Œ˜˜Ž˜˜˜‘˜’˜“˜”˜•˜–˜—˜˜˜™˜š˜›˜œ˜˜ž˜Ÿ˜ ˜¡˜¢˜£˜¤˜¥˜¦˜§˜¨˜©˜ª˜«˜¬˜­˜®˜¯˜°˜±˜²˜³˜´˜µ˜¶˜·˜¸˜¹˜º˜»˜¼˜½˜¾˜¿˜À˜Á˜Â˜Ã˜Ä˜Å˜Æ˜Ç˜È˜É˜Ê˜Ë˜Ì˜Í˜Î˜Ï˜Ð˜Ñ˜Ò˜Ó˜Ô˜Õ˜Ö˜×˜Ø˜Ù˜Ú˜Û˜Ü˜Ý˜Þ˜ß˜à˜á˜â˜ã˜ä˜å˜æ˜ç˜è˜é˜ê˜ë˜ì˜í˜î˜ï˜ð˜ñ˜ò˜ó˜ô˜õ˜ö˜÷˜ø˜ù˜ú˜û˜ü˜ý˜þ˜ÿ˜™™™™™™™™™ ™ ™ ™ ™ ™™™™™™™™™™™™™™™™™™™ ™!™"™#™$™%™&™'™(™)™*™+™,™-™.™/™0™1™2™3™4™5™6™7™8™9™:™;™<™=™>™?™@™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™[™\™]™^™_™`™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™{™|™}™~™™€™™‚™ƒ™„™…™†™‡™ˆ™‰™Š™‹™Œ™™Ž™™™‘™’™“™”™•™–™—™˜™™™š™›™œ™™ž™Ÿ™ ™¡™¢™£™¤™¥™¦™§™¨™©™ª™«™¬™­™®™¯™°™±™²™³™´™µ™¶™·™¸™¹™º™»™¼™½™¾™¿™À™Á™Â™Ã™Ä™Å™Æ™Ç™È™É™Ê™Ë™Ì™Í™Î™Ï™Ð™Ñ™Ò™Ó™Ô™Õ™Ö™×™Ø™Ù™Ú™Û™Ü™Ý™Þ™ß™à™á™â™ã™ä™å™æ™ç™è™é™ê™ë™ì™í™î™ï™ð™ñ™ò™ó™ô™õ™ö™÷™ø™ù™ú™û™ü™ý™þ™ÿ™ššššššššš š š š š ššššššššššššššššššš š!š"š#š$š%š&š'š(š)š*š+š,š-š.š/š0š1š2š3š4š5š6š7š8š9š:š;š<š=š>š?š@š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š[š\š]š^š_š`š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š{š|š}š~šš€šš‚šƒš„š…š†š‡šˆš‰šŠš‹šŒššŽššš‘š’š“š”š•š–š—š˜š™ššš›šœššžšŸš š¡š¢š£š¤š¥š¦š§š¨š©šªš«š¬š­š®š¯š°š±š²š³š´šµš¶š·š¸š¹šºš»š¼š½š¾š¿šÀšÁšÂšÃšÄšÅšÆšÇšÈšÉšÊšËšÌšÍšÎšÏšÐšÑšÒšÓšÔšÕšÖš×šØšÙšÚšÛšÜšÝšÞšßšàšášâšãšäšåšæšçšèšéšêšëšìšíšîšïšðšñšòšóšôšõšöš÷šøšùšúšûšüšýšþšÿš››››››››› › › › › ››››››››››››››››››› ›!›"›#›$›%›&›'›(›)›*›+›,›-›.›/›0›1›2›3›4›5›6›7›8›9›:›;›<›=›>›?›@›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›[›\›]›^›_›`›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›{›|›}›~››€››‚›ƒ›„›…›†›‡›ˆ›‰›Š›‹›Œ››Ž›››‘›’›“›”›•›–›—›˜›™›š›››œ››ž›Ÿ› ›¡›¢›£›¤›¥›¦›§›¨›©›ª›«›¬›­›®›¯›°›±›²›³›´›µ›¶›·›¸›¹›º›»›¼›½›¾›¿›À›Á›Â›Ã›Ä›Å›Æ›Ç›È›É›Ê›Ë›Ì›Í›Î›Ï›Ð›Ñ›Ò›Ó›Ô›Õ›Ö›×›Ø›Ù›Ú›Û›Ü›Ý›Þ›ß›à›á›â›ã›ä›å›æ›ç›è›é›ê›ë›ì›í›î›ï›ð›ñ›ò›ó›ô›õ›ö›÷›ø›ù›ú›û›ü›ý›þ›ÿ›œœœœœœœœœ œ œ œ œ œœœœœœœœœœœœœœœœœœœ œ!œ"œ#œ$œ%œ&œ'œ(œ)œ*œ+œ,œ-œ.œ/œ0œ1œ2œ3œ4œ5œ6œ7œ8œ9œ:œ;œ<œ=œ>œ?œ@œ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œ[œ\œ]œ^œ_œ`œ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œ{œ|œ}œ~œœ€œœ‚œƒœ„œ…œ†œ‡œˆœ‰œŠœ‹œŒœœŽœœœ‘œ’œ“œ”œ•œ–œ—œ˜œ™œšœ›œœœœžœŸœ œ¡œ¢œ£œ¤œ¥œ¦œ§œ¨œ©œªœ«œ¬œ­œ®œ¯œ°œ±œ²œ³œ´œµœ¶œ·œ¸œ¹œºœ»œ¼œ½œ¾œ¿œÀœÁœÂœÃœÄœÅœÆœÇœÈœÉœÊœËœÌœÍœÎœÏœÐœÑœÒœÓœÔœÕœÖœ×œØœÙœÚœÛœÜœÝœÞœßœàœáœâœãœäœåœæœçœèœéœêœëœìœíœîœïœðœñœòœóœôœõœöœ÷œøœùœúœûœüœýœþœÿœ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿžžžžžžžžž ž ž ž ž žžžžžžžžžžžžžžžžžžž ž!ž"ž#ž$ž%ž&ž'ž(ž)ž*ž+ž,ž-ž.ž/ž0ž1ž2ž3ž4ž5ž6ž7ž8ž9ž:ž;ž<ž=ž>ž?ž@ž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ž[ž\ž]ž^ž_ž`ž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ž{ž|ž}ž~žž€žž‚žƒž„ž…ž†ž‡žˆž‰žŠž‹žŒžžŽžžž‘ž’ž“ž”ž•ž–ž—ž˜ž™žšž›žœžžžžŸž ž¡ž¢ž£ž¤ž¥ž¦ž§ž¨ž©žªž«ž¬ž­ž®ž¯ž°ž±ž²ž³ž´žµž¶ž·ž¸ž¹žºž»ž¼ž½ž¾ž¿žÀžÁžÂžÃžÄžÅžÆžÇžÈžÉžÊžËžÌžÍžÎžÏžÐžÑžÒžÓžÔžÕžÖž×žØžÙžÚžÛžÜžÝžÞžßžàžážâžãžäžåžæžçžèžéžêžëžìžížîžïžðžñžòžóžôžõžöž÷žøžùžúžûžüžýžþžÿžŸŸŸŸŸŸŸŸŸ Ÿ Ÿ Ÿ Ÿ ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ Ÿ!Ÿ"Ÿ#Ÿ$Ÿ%Ÿ&Ÿ'Ÿ(Ÿ)Ÿ*Ÿ+Ÿ,Ÿ-Ÿ.Ÿ/Ÿ0Ÿ1Ÿ2Ÿ3Ÿ4Ÿ5Ÿ6Ÿ7Ÿ8Ÿ9Ÿ:Ÿ;Ÿ<Ÿ=Ÿ>Ÿ?Ÿ@Ÿ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Ÿ[Ÿ\Ÿ]Ÿ^Ÿ_Ÿ`Ÿ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Ÿ{Ÿ|Ÿ}Ÿ~ŸŸ€ŸŸ‚ŸƒŸ„Ÿ…Ÿ†Ÿ‡ŸˆŸ‰ŸŠŸ‹ŸŒŸŸŽŸŸŸ‘Ÿ’Ÿ“Ÿ”Ÿ•Ÿ–Ÿ—Ÿ˜Ÿ™ŸšŸ›ŸœŸŸžŸŸŸ Ÿ¡Ÿ¢Ÿ£Ÿ¤Ÿ¥Ÿ¦Ÿ§Ÿ¨Ÿ©ŸªŸ«Ÿ¬Ÿ­Ÿ®Ÿ¯Ÿ°Ÿ±Ÿ²Ÿ³Ÿ´ŸµŸ¶Ÿ·Ÿ¸Ÿ¹ŸºŸ»Ÿ¼Ÿ½Ÿ¾Ÿ¿ŸÀŸÁŸÂŸÃŸÄŸÅŸÆŸÇŸÈŸÉŸÊŸËŸÌŸÍŸÎŸÏŸÐŸÑŸÒŸÓŸÔŸÕŸÖŸ×ŸØŸÙŸÚŸÛŸÜŸÝŸÞŸßŸàŸáŸâŸãŸäŸåŸæŸçŸèŸéŸêŸëŸìŸíŸîŸïŸðŸñŸòŸóŸôŸõŸöŸ÷ŸøŸùŸúŸûŸüŸýŸþŸÿŸ                                       ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ \ ] ^ _ ` 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 { | } ~  €  ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ  Ž   ‘ ’ “ ” • – — ˜ ™ š › œ  ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ ¡¡¡¡¡¡¡¡¡ ¡ ¡ ¡ ¡ ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ¡!¡"¡#¡$¡%¡&¡'¡(¡)¡*¡+¡,¡-¡.¡/¡0¡1¡2¡3¡4¡5¡6¡7¡8¡9¡:¡;¡<¡=¡>¡?¡@¡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¡[¡\¡]¡^¡_¡`¡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¡{¡|¡}¡~¡¡€¡¡‚¡ƒ¡„¡…¡†¡‡¡ˆ¡‰¡Š¡‹¡Œ¡¡Ž¡¡¡‘¡’¡“¡”¡•¡–¡—¡˜¡™¡š¡›¡œ¡¡ž¡Ÿ¡ ¡¡¡¢¡£¡¤¡¥¡¦¡§¡¨¡©¡ª¡«¡¬¡­¡®¡¯¡°¡±¡²¡³¡´¡µ¡¶¡·¡¸¡¹¡º¡»¡¼¡½¡¾¡¿¡À¡Á¡Â¡Ã¡Ä¡Å¡Æ¡Ç¡È¡É¡Ê¡Ë¡Ì¡Í¡Î¡Ï¡Ð¡Ñ¡Ò¡Ó¡Ô¡Õ¡Ö¡×¡Ø¡Ù¡Ú¡Û¡Ü¡Ý¡Þ¡ß¡à¡á¡â¡ã¡ä¡å¡æ¡ç¡è¡é¡ê¡ë¡ì¡í¡î¡ï¡ð¡ñ¡ò¡ó¡ô¡õ¡ö¡÷¡ø¡ù¡ú¡û¡ü¡ý¡þ¡ÿ¡¢¢¢¢¢¢¢¢¢ ¢ ¢ ¢ ¢ ¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢ ¢!¢"¢#¢$¢%¢&¢'¢(¢)¢*¢+¢,¢-¢.¢/¢0¢1¢2¢3¢4¢5¢6¢7¢8¢9¢:¢;¢<¢=¢>¢?¢@¢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¢[¢\¢]¢^¢_¢`¢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¢{¢|¢}¢~¢¢€¢¢‚¢ƒ¢„¢…¢†¢‡¢ˆ¢‰¢Š¢‹¢Œ¢¢Ž¢¢¢‘¢’¢“¢”¢•¢–¢—¢˜¢™¢š¢›¢œ¢¢ž¢Ÿ¢ ¢¡¢¢¢£¢¤¢¥¢¦¢§¢¨¢©¢ª¢«¢¬¢­¢®¢¯¢°¢±¢²¢³¢´¢µ¢¶¢·¢¸¢¹¢º¢»¢¼¢½¢¾¢¿¢À¢Á¢Â¢Ã¢Ä¢Å¢Æ¢Ç¢È¢É¢Ê¢Ë¢Ì¢Í¢Î¢Ï¢Ð¢Ñ¢Ò¢Ó¢Ô¢Õ¢Ö¢×¢Ø¢Ù¢Ú¢Û¢Ü¢Ý¢Þ¢ß¢à¢á¢â¢ã¢ä¢å¢æ¢ç¢è¢é¢ê¢ë¢ì¢í¢î¢ï¢ð¢ñ¢ò¢ó¢ô¢õ¢ö¢÷¢ø¢ù¢ú¢û¢ü¢ý¢þ¢ÿ¢£££££££££ £ £ £ £ £££££££££££££££££££ £!£"£#£$£%£&£'£(£)£*£+£,£-£.£/£0£1£2£3£4£5£6£7£8£9£:£;£<£=£>£?£@£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£[£\£]£^£_£`£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£{£|£}£~££€££‚£ƒ£„£…£†£‡£ˆ£‰£Š£‹£Œ££Ž£££‘£’£“£”£•£–£—£˜£™£š£›£œ££ž£Ÿ£ £¡£¢£££¤£¥£¦£§£¨£©£ª£«£¬£­£®£¯£°£±£²£³£´£µ£¶£·£¸£¹£º£»£¼£½£¾£¿£À£Á£Â£Ã£Ä£Å£Æ£Ç£È£É£Ê£Ë£Ì£Í£Î£Ï£Ð£Ñ£Ò£Ó£Ô£Õ£Ö£×£Ø£Ù£Ú£Û£Ü£Ý£Þ£ß£à£á£â£ã£ä£å£æ£ç£è£é£ê£ë£ì£í£î£ï£ð£ñ£ò£ó£ô£õ£ö£÷£ø£ù£ú£û£ü£ý£þ£ÿ£¤¤¤¤¤¤¤¤¤ ¤ ¤ ¤ ¤ ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ¤!¤"¤#¤$¤%¤&¤'¤(¤)¤*¤+¤,¤-¤.¤/¤0¤1¤2¤3¤4¤5¤6¤7¤8¤9¤:¤;¤<¤=¤>¤?¤@¤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¤[¤\¤]¤^¤_¤`¤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¤{¤|¤}¤~¤¤€¤¤‚¤ƒ¤„¤…¤†¤‡¤ˆ¤‰¤Š¤‹¤Œ¤¤Ž¤¤¤‘¤’¤“¤”¤•¤–¤—¤˜¤™¤š¤›¤œ¤¤ž¤Ÿ¤ ¤¡¤¢¤£¤¤¤¥¤¦¤§¤¨¤©¤ª¤«¤¬¤­¤®¤¯¤°¤±¤²¤³¤´¤µ¤¶¤·¤¸¤¹¤º¤»¤¼¤½¤¾¤¿¤À¤Á¤Â¤Ã¤Ä¤Å¤Æ¤Ç¤È¤É¤Ê¤Ë¤Ì¤Í¤Î¤Ï¤Ð¤Ñ¤Ò¤Ó¤Ô¤Õ¤Ö¤×¤Ø¤Ù¤Ú¤Û¤Ü¤Ý¤Þ¤ß¤à¤á¤â¤ã¤ä¤å¤æ¤ç¤è¤é¤ê¤ë¤ì¤í¤î¤ï¤ð¤ñ¤ò¤ó¤ô¤õ¤ö¤÷¤ø¤ù¤ú¤û¤ü¤ý¤þ¤ÿ¤¥¥¥¥¥¥¥¥¥ ¥ ¥ ¥ ¥ ¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥ ¥!¥"¥#¥$¥%¥&¥'¥(¥)¥*¥+¥,¥-¥.¥/¥0¥1¥2¥3¥4¥5¥6¥7¥8¥9¥:¥;¥<¥=¥>¥?¥@¥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¥[¥\¥]¥^¥_¥`¥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¥{¥|¥}¥~¥¥€¥¥‚¥ƒ¥„¥…¥†¥‡¥ˆ¥‰¥Š¥‹¥Œ¥¥Ž¥¥¥‘¥’¥“¥”¥•¥–¥—¥˜¥™¥š¥›¥œ¥¥ž¥Ÿ¥ ¥¡¥¢¥£¥¤¥¥¥¦¥§¥¨¥©¥ª¥«¥¬¥­¥®¥¯¥°¥±¥²¥³¥´¥µ¥¶¥·¥¸¥¹¥º¥»¥¼¥½¥¾¥¿¥À¥Á¥Â¥Ã¥Ä¥Å¥Æ¥Ç¥È¥É¥Ê¥Ë¥Ì¥Í¥Î¥Ï¥Ð¥Ñ¥Ò¥Ó¥Ô¥Õ¥Ö¥×¥Ø¥Ù¥Ú¥Û¥Ü¥Ý¥Þ¥ß¥à¥á¥â¥ã¥ä¥å¥æ¥ç¥è¥é¥ê¥ë¥ì¥í¥î¥ï¥ð¥ñ¥ò¥ó¥ô¥õ¥ö¥÷¥ø¥ù¥ú¥û¥ü¥ý¥þ¥ÿ¥¦¦¦¦¦¦¦¦¦ ¦ ¦ ¦ ¦ ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ ¦!¦"¦#¦$¦%¦&¦'¦(¦)¦*¦+¦,¦-¦.¦/¦0¦1¦2¦3¦4¦5¦6¦7¦8¦9¦:¦;¦<¦=¦>¦?¦@¦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¦[¦\¦]¦^¦_¦`¦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¦{¦|¦}¦~¦¦€¦¦‚¦ƒ¦„¦…¦†¦‡¦ˆ¦‰¦Š¦‹¦Œ¦¦Ž¦¦¦‘¦’¦“¦”¦•¦–¦—¦˜¦™¦š¦›¦œ¦¦ž¦Ÿ¦ ¦¡¦¢¦£¦¤¦¥¦¦¦§¦¨¦©¦ª¦«¦¬¦­¦®¦¯¦°¦±¦²¦³¦´¦µ¦¶¦·¦¸¦¹¦º¦»¦¼¦½¦¾¦¿¦À¦Á¦Â¦Ã¦Ä¦Å¦Æ¦Ç¦È¦É¦Ê¦Ë¦Ì¦Í¦Î¦Ï¦Ð¦Ñ¦Ò¦Ó¦Ô¦Õ¦Ö¦×¦Ø¦Ù¦Ú¦Û¦Ü¦Ý¦Þ¦ß¦à¦á¦â¦ã¦ä¦å¦æ¦ç¦è¦é¦ê¦ë¦ì¦í¦î¦ï¦ð¦ñ¦ò¦ó¦ô¦õ¦ö¦÷¦ø¦ù¦ú¦û¦ü¦ý¦þ¦ÿ¦§§§§§§§§§ § § § § §§§§§§§§§§§§§§§§§§§ §!§"§#§$§%§&§'§(§)§*§+§,§-§.§/§0§1§2§3§4§5§6§7§8§9§:§;§<§=§>§?§@§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§[§\§]§^§_§`§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§{§|§}§~§§€§§‚§ƒ§„§…§†§‡§ˆ§‰§Š§‹§Œ§§Ž§§§‘§’§“§”§•§–§—§˜§™§š§›§œ§§ž§Ÿ§ §¡§¢§£§¤§¥§¦§§§¨§©§ª§«§¬§­§®§¯§°§±§²§³§´§µ§¶§·§¸§¹§º§»§¼§½§¾§¿§À§Á§Â§Ã§Ä§Å§Æ§Ç§È§É§Ê§Ë§Ì§Í§Î§Ï§Ð§Ñ§Ò§Ó§Ô§Õ§Ö§×§Ø§Ù§Ú§Û§Ü§Ý§Þ§ß§à§á§â§ã§ä§å§æ§ç§è§é§ê§ë§ì§í§î§ï§ð§ñ§ò§ó§ô§õ§ö§÷§ø§ù§ú§û§ü§ý§þ§ÿ§¨¨¨¨¨¨¨¨¨ ¨ ¨ ¨ ¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨!¨"¨#¨$¨%¨&¨'¨(¨)¨*¨+¨,¨-¨.¨/¨0¨1¨2¨3¨4¨5¨6¨7¨8¨9¨:¨;¨<¨=¨>¨?¨@¨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¨[¨\¨]¨^¨_¨`¨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¨{¨|¨}¨~¨¨€¨¨‚¨ƒ¨„¨…¨†¨‡¨ˆ¨‰¨Š¨‹¨Œ¨¨Ž¨¨¨‘¨’¨“¨”¨•¨–¨—¨˜¨™¨š¨›¨œ¨¨ž¨Ÿ¨ ¨¡¨¢¨£¨¤¨¥¨¦¨§¨¨¨©¨ª¨«¨¬¨­¨®¨¯¨°¨±¨²¨³¨´¨µ¨¶¨·¨¸¨¹¨º¨»¨¼¨½¨¾¨¿¨À¨Á¨Â¨Ã¨Ä¨Å¨Æ¨Ç¨È¨É¨Ê¨Ë¨Ì¨Í¨Î¨Ï¨Ð¨Ñ¨Ò¨Ó¨Ô¨Õ¨Ö¨×¨Ø¨Ù¨Ú¨Û¨Ü¨Ý¨Þ¨ß¨à¨á¨â¨ã¨ä¨å¨æ¨ç¨è¨é¨ê¨ë¨ì¨í¨î¨ï¨ð¨ñ¨ò¨ó¨ô¨õ¨ö¨÷¨ø¨ù¨ú¨û¨ü¨ý¨þ¨ÿ¨©©©©©©©©© © © © © ©©©©©©©©©©©©©©©©©©© ©!©"©#©$©%©&©'©(©)©*©+©,©-©.©/©0©1©2©3©4©5©6©7©8©9©:©;©<©=©>©?©@©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©[©\©]©^©_©`©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©{©|©}©~©©€©©‚©ƒ©„©…©†©‡©ˆ©‰©Š©‹©Œ©©Ž©©©‘©’©“©”©•©–©—©˜©™©š©›©œ©©ž©Ÿ© ©¡©¢©£©¤©¥©¦©§©¨©©©ª©«©¬©­©®©¯©°©±©²©³©´©µ©¶©·©¸©¹©º©»©¼©½©¾©¿©À©Á©Â©Ã©Ä©Å©Æ©Ç©È©É©Ê©Ë©Ì©Í©Î©Ï©Ð©Ñ©Ò©Ó©Ô©Õ©Ö©×©Ø©Ù©Ú©Û©Ü©Ý©Þ©ß©à©á©â©ã©ä©å©æ©ç©è©é©ê©ë©ì©í©î©ï©ð©ñ©ò©ó©ô©õ©ö©÷©ø©ù©ú©û©ü©ý©þ©ÿ©ªªªªªªªªª ª ª ª ª ªªªªªªªªªªªªªªªªªªª ª!ª"ª#ª$ª%ª&ª'ª(ª)ª*ª+ª,ª-ª.ª/ª0ª1ª2ª3ª4ª5ª6ª7ª8ª9ª:ª;ª<ª=ª>ª?ª@ª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ª[ª\ª]ª^ª_ª`ª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ª{ª|ª}ª~ªª€ªª‚ªƒª„ª…ª†ª‡ªˆª‰ªŠª‹ªŒªªŽªªª‘ª’ª“ª”ª•ª–ª—ª˜ª™ªšª›ªœªªžªŸª ª¡ª¢ª£ª¤ª¥ª¦ª§ª¨ª©ªªª«ª¬ª­ª®ª¯ª°ª±ª²ª³ª´ªµª¶ª·ª¸ª¹ªºª»ª¼ª½ª¾ª¿ªÀªÁªÂªÃªÄªÅªÆªÇªÈªÉªÊªËªÌªÍªÎªÏªÐªÑªÒªÓªÔªÕªÖª×ªØªÙªÚªÛªÜªÝªÞªßªàªáªâªãªäªåªæªçªèªéªêªëªìªíªîªïªðªñªòªóªôªõªöª÷ªøªùªúªûªüªýªþªÿª««««««««« « « « « ««««««««««««««««««« «!«"«#«$«%«&«'«(«)«*«+«,«-«.«/«0«1«2«3«4«5«6«7«8«9«:«;«<«=«>«?«@«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«[«\«]«^«_«`«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«{«|«}«~««€««‚«ƒ«„«…«†«‡«ˆ«‰«Š«‹«Œ««Ž«««‘«’«“«”«•«–«—«˜«™«š«›«œ««ž«Ÿ« «¡«¢«£«¤«¥«¦«§«¨«©«ª«««¬«­«®«¯«°«±«²«³«´«µ«¶«·«¸«¹«º«»«¼«½«¾«¿«À«Á«Â«Ã«Ä«Å«Æ«Ç«È«É«Ê«Ë«Ì«Í«Î«Ï«Ð«Ñ«Ò«Ó«Ô«Õ«Ö«×«Ø«Ù«Ú«Û«Ü«Ý«Þ«ß«à«á«â«ã«ä«å«æ«ç«è«é«ê«ë«ì«í«î«ï«ð«ñ«ò«ó«ô«õ«ö«÷«ø«ù«ú«û«ü«ý«þ«ÿ«¬¬¬¬¬¬¬¬¬ ¬ ¬ ¬ ¬ ¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬ ¬!¬"¬#¬$¬%¬&¬'¬(¬)¬*¬+¬,¬-¬.¬/¬0¬1¬2¬3¬4¬5¬6¬7¬8¬9¬:¬;¬<¬=¬>¬?¬@¬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¬[¬\¬]¬^¬_¬`¬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¬{¬|¬}¬~¬¬€¬¬‚¬ƒ¬„¬…¬†¬‡¬ˆ¬‰¬Š¬‹¬Œ¬¬Ž¬¬¬‘¬’¬“¬”¬•¬–¬—¬˜¬™¬š¬›¬œ¬¬ž¬Ÿ¬ ¬¡¬¢¬£¬¤¬¥¬¦¬§¬¨¬©¬ª¬«¬¬¬­¬®¬¯¬°¬±¬²¬³¬´¬µ¬¶¬·¬¸¬¹¬º¬»¬¼¬½¬¾¬¿¬À¬Á¬Â¬Ã¬Ä¬Å¬Æ¬Ç¬È¬É¬Ê¬Ë¬Ì¬Í¬Î¬Ï¬Ð¬Ñ¬Ò¬Ó¬Ô¬Õ¬Ö¬×¬Ø¬Ù¬Ú¬Û¬Ü¬Ý¬Þ¬ß¬à¬á¬â¬ã¬ä¬å¬æ¬ç¬è¬é¬ê¬ë¬ì¬í¬î¬ï¬ð¬ñ¬ò¬ó¬ô¬õ¬ö¬÷¬ø¬ù¬ú¬û¬ü¬ý¬þ¬ÿ¬­­­­­­­­­ ­ ­ ­ ­ ­­­­­­­­­­­­­­­­­­­ ­!­"­#­$­%­&­'­(­)­*­+­,­-­.­/­0­1­2­3­4­5­6­7­8­9­:­;­<­=­>­?­@­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­[­\­]­^­_­`­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­{­|­}­~­­€­­‚­ƒ­„­…­†­‡­ˆ­‰­Š­‹­Œ­­Ž­­­‘­’­“­”­•­–­—­˜­™­š­›­œ­­ž­Ÿ­ ­¡­¢­£­¤­¥­¦­§­¨­©­ª­«­¬­­­®­¯­°­±­²­³­´­µ­¶­·­¸­¹­º­»­¼­½­¾­¿­À­Á­Â­Ã­Ä­Å­Æ­Ç­È­É­Ê­Ë­Ì­Í­Î­Ï­Ð­Ñ­Ò­Ó­Ô­Õ­Ö­×­Ø­Ù­Ú­Û­Ü­Ý­Þ­ß­à­á­â­ã­ä­å­æ­ç­è­é­ê­ë­ì­í­î­ï­ð­ñ­ò­ó­ô­õ­ö­÷­ø­ù­ú­û­ü­ý­þ­ÿ­®®®®®®®®® ® ® ® ® ®®®®®®®®®®®®®®®®®®® ®!®"®#®$®%®&®'®(®)®*®+®,®-®.®/®0®1®2®3®4®5®6®7®8®9®:®;®<®=®>®?®@®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®[®\®]®^®_®`®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®{®|®}®~®®€®®‚®ƒ®„®…®†®‡®ˆ®‰®Š®‹®Œ®®Ž®®®‘®’®“®”®•®–®—®˜®™®š®›®œ®®ž®Ÿ® ®¡®¢®£®¤®¥®¦®§®¨®©®ª®«®¬®­®®®¯®°®±®²®³®´®µ®¶®·®¸®¹®º®»®¼®½®¾®¿®À®Á®Â®Ã®Ä®Å®Æ®Ç®È®É®Ê®Ë®Ì®Í®Î®Ï®Ð®Ñ®Ò®Ó®Ô®Õ®Ö®×®Ø®Ù®Ú®Û®Ü®Ý®Þ®ß®à®á®â®ã®ä®å®æ®ç®è®é®ê®ë®ì®í®î®ï®ð®ñ®ò®ó®ô®õ®ö®÷®ø®ù®ú®û®ü®ý®þ®ÿ®¯¯¯¯¯¯¯¯¯ ¯ ¯ ¯ ¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¯!¯"¯#¯$¯%¯&¯'¯(¯)¯*¯+¯,¯-¯.¯/¯0¯1¯2¯3¯4¯5¯6¯7¯8¯9¯:¯;¯<¯=¯>¯?¯@¯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¯[¯\¯]¯^¯_¯`¯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¯{¯|¯}¯~¯¯€¯¯‚¯ƒ¯„¯…¯†¯‡¯ˆ¯‰¯Š¯‹¯Œ¯¯Ž¯¯¯‘¯’¯“¯”¯•¯–¯—¯˜¯™¯š¯›¯œ¯¯ž¯Ÿ¯ ¯¡¯¢¯£¯¤¯¥¯¦¯§¯¨¯©¯ª¯«¯¬¯­¯®¯¯¯°¯±¯²¯³¯´¯µ¯¶¯·¯¸¯¹¯º¯»¯¼¯½¯¾¯¿¯À¯Á¯Â¯Ã¯Ä¯Å¯Æ¯Ç¯È¯É¯Ê¯Ë¯Ì¯Í¯Î¯Ï¯Ð¯Ñ¯Ò¯Ó¯Ô¯Õ¯Ö¯×¯Ø¯Ù¯Ú¯Û¯Ü¯Ý¯Þ¯ß¯à¯á¯â¯ã¯ä¯å¯æ¯ç¯è¯é¯ê¯ë¯ì¯í¯î¯ï¯ð¯ñ¯ò¯ó¯ô¯õ¯ö¯÷¯ø¯ù¯ú¯û¯ü¯ý¯þ¯ÿ¯°°°°°°°°° ° ° ° ° °°°°°°°°°°°°°°°°°°° °!°"°#°$°%°&°'°(°)°*°+°,°-°.°/°0°1°2°3°4°5°6°7°8°9°:°;°<°=°>°?°@°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°[°\°]°^°_°`°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°{°|°}°~°°€°°‚°ƒ°„°…°†°‡°ˆ°‰°Š°‹°Œ°°Ž°°°‘°’°“°”°•°–°—°˜°™°š°›°œ°°ž°Ÿ° °¡°¢°£°¤°¥°¦°§°¨°©°ª°«°¬°­°®°¯°°°±°²°³°´°µ°¶°·°¸°¹°º°»°¼°½°¾°¿°À°Á°Â°Ã°Ä°Å°Æ°Ç°È°É°Ê°Ë°Ì°Í°Î°Ï°Ð°Ñ°Ò°Ó°Ô°Õ°Ö°×°Ø°Ù°Ú°Û°Ü°Ý°Þ°ß°à°á°â°ã°ä°å°æ°ç°è°é°ê°ë°ì°í°î°ï°ð°ñ°ò°ó°ô°õ°ö°÷°ø°ù°ú°û°ü°ý°þ°ÿ°±±±±±±±±± ± ± ± ± ±±±±±±±±±±±±±±±±±±± ±!±"±#±$±%±&±'±(±)±*±+±,±-±.±/±0±1±2±3±4±5±6±7±8±9±:±;±<±=±>±?±@±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±[±\±]±^±_±`±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±{±|±}±~±±€±±‚±ƒ±„±…±†±‡±ˆ±‰±Š±‹±Œ±±Ž±±±‘±’±“±”±•±–±—±˜±™±š±›±œ±±ž±Ÿ± ±¡±¢±£±¤±¥±¦±§±¨±©±ª±«±¬±­±®±¯±°±±±²±³±´±µ±¶±·±¸±¹±º±»±¼±½±¾±¿±À±Á±Â±Ã±Ä±Å±Æ±Ç±È±É±Ê±Ë±Ì±Í±Î±Ï±Ð±Ñ±Ò±Ó±Ô±Õ±Ö±×±Ø±Ù±Ú±Û±Ü±Ý±Þ±ß±à±á±â±ã±ä±å±æ±ç±è±é±ê±ë±ì±í±î±ï±ð±ñ±ò±ó±ô±õ±ö±÷±ø±ù±ú±û±ü±ý±þ±ÿ±²²²²²²²²² ² ² ² ² ²²²²²²²²²²²²²²²²²²² ²!²"²#²$²%²&²'²(²)²*²+²,²-².²/²0²1²2²3²4²5²6²7²8²9²:²;²<²=²>²?²@²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²[²\²]²^²_²`²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²{²|²}²~²²€²²‚²ƒ²„²…²†²‡²ˆ²‰²Š²‹²Œ²²Ž²²²‘²’²“²”²•²–²—²˜²™²š²›²œ²²ž²Ÿ² ²¡²¢²£²¤²¥²¦²§²¨²©²ª²«²¬²­²®²¯²°²±²²²³²´²µ²¶²·²¸²¹²º²»²¼²½²¾²¿²À²Á²Â²Ã²Ä²Å²Æ²Ç²È²É²Ê²Ë²Ì²Í²Î²Ï²Ð²Ñ²Ò²Ó²Ô²Õ²Ö²×²Ø²Ù²Ú²Û²Ü²Ý²Þ²ß²à²á²â²ã²ä²å²æ²ç²è²é²ê²ë²ì²í²î²ï²ð²ñ²ò²ó²ô²õ²ö²÷²ø²ù²ú²û²ü²ý²þ²ÿ²³³³³³³³³³ ³ ³ ³ ³ ³³³³³³³³³³³³³³³³³³³ ³!³"³#³$³%³&³'³(³)³*³+³,³-³.³/³0³1³2³3³4³5³6³7³8³9³:³;³<³=³>³?³@³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³[³\³]³^³_³`³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³{³|³}³~³³€³³‚³ƒ³„³…³†³‡³ˆ³‰³Š³‹³Œ³³Ž³³³‘³’³“³”³•³–³—³˜³™³š³›³œ³³ž³Ÿ³ ³¡³¢³£³¤³¥³¦³§³¨³©³ª³«³¬³­³®³¯³°³±³²³³³´³µ³¶³·³¸³¹³º³»³¼³½³¾³¿³À³Á³Â³Ã³Ä³Å³Æ³Ç³È³É³Ê³Ë³Ì³Í³Î³Ï³Ð³Ñ³Ò³Ó³Ô³Õ³Ö³×³Ø³Ù³Ú³Û³Ü³Ý³Þ³ß³à³á³â³ã³ä³å³æ³ç³è³é³ê³ë³ì³í³î³ï³ð³ñ³ò³ó³ô³õ³ö³÷³ø³ù³ú³û³ü³ý³þ³ÿ³´´´´´´´´´ ´ ´ ´ ´ ´´´´´´´´´´´´´´´´´´´ ´!´"´#´$´%´&´'´(´)´*´+´,´-´.´/´0´1´2´3´4´5´6´7´8´9´:´;´<´=´>´?´@´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´[´\´]´^´_´`´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´{´|´}´~´´€´´‚´ƒ´„´…´†´‡´ˆ´‰´Š´‹´Œ´´Ž´´´‘´’´“´”´•´–´—´˜´™´š´›´œ´´ž´Ÿ´ ´¡´¢´£´¤´¥´¦´§´¨´©´ª´«´¬´­´®´¯´°´±´²´³´´´µ´¶´·´¸´¹´º´»´¼´½´¾´¿´À´Á´Â´Ã´Ä´Å´Æ´Ç´È´É´Ê´Ë´Ì´Í´Î´Ï´Ð´Ñ´Ò´Ó´Ô´Õ´Ö´×´Ø´Ù´Ú´Û´Ü´Ý´Þ´ß´à´á´â´ã´ä´å´æ´ç´è´é´ê´ë´ì´í´î´ï´ð´ñ´ò´ó´ô´õ´ö´÷´ø´ù´ú´û´ü´ý´þ´ÿ´µµµµµµµµµ µ µ µ µ µµµµµµµµµµµµµµµµµµµ µ!µ"µ#µ$µ%µ&µ'µ(µ)µ*µ+µ,µ-µ.µ/µ0µ1µ2µ3µ4µ5µ6µ7µ8µ9µ:µ;µ<µ=µ>µ?µ@µ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µ[µ\µ]µ^µ_µ`µ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µ{µ|µ}µ~µµ€µµ‚µƒµ„µ…µ†µ‡µˆµ‰µŠµ‹µŒµµŽµµµ‘µ’µ“µ”µ•µ–µ—µ˜µ™µšµ›µœµµžµŸµ µ¡µ¢µ£µ¤µ¥µ¦µ§µ¨µ©µªµ«µ¬µ­µ®µ¯µ°µ±µ²µ³µ´µµµ¶µ·µ¸µ¹µºµ»µ¼µ½µ¾µ¿µÀµÁµÂµÃµÄµÅµÆµÇµÈµÉµÊµËµÌµÍµÎµÏµÐµÑµÒµÓµÔµÕµÖµ×µØµÙµÚµÛµÜµÝµÞµßµàµáµâµãµäµåµæµçµèµéµêµëµìµíµîµïµðµñµòµóµôµõµöµ÷µøµùµúµûµüµýµþµÿµ¶¶¶¶¶¶¶¶¶ ¶ ¶ ¶ ¶ ¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶ ¶!¶"¶#¶$¶%¶&¶'¶(¶)¶*¶+¶,¶-¶.¶/¶0¶1¶2¶3¶4¶5¶6¶7¶8¶9¶:¶;¶<¶=¶>¶?¶@¶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¶[¶\¶]¶^¶_¶`¶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¶{¶|¶}¶~¶¶€¶¶‚¶ƒ¶„¶…¶†¶‡¶ˆ¶‰¶Š¶‹¶Œ¶¶Ž¶¶¶‘¶’¶“¶”¶•¶–¶—¶˜¶™¶š¶›¶œ¶¶ž¶Ÿ¶ ¶¡¶¢¶£¶¤¶¥¶¦¶§¶¨¶©¶ª¶«¶¬¶­¶®¶¯¶°¶±¶²¶³¶´¶µ¶¶¶·¶¸¶¹¶º¶»¶¼¶½¶¾¶¿¶À¶Á¶Â¶Ã¶Ä¶Å¶Æ¶Ç¶È¶É¶Ê¶Ë¶Ì¶Í¶Î¶Ï¶Ð¶Ñ¶Ò¶Ó¶Ô¶Õ¶Ö¶×¶Ø¶Ù¶Ú¶Û¶Ü¶Ý¶Þ¶ß¶à¶á¶â¶ã¶ä¶å¶æ¶ç¶è¶é¶ê¶ë¶ì¶í¶î¶ï¶ð¶ñ¶ò¶ó¶ô¶õ¶ö¶÷¶ø¶ù¶ú¶û¶ü¶ý¶þ¶ÿ¶········· · · · · ··················· ·!·"·#·$·%·&·'·(·)·*·+·,·-·.·/·0·1·2·3·4·5·6·7·8·9·:·;·<·=·>·?·@·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·[·\·]·^·_·`·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·{·|·}·~··€··‚·ƒ·„·…·†·‡·ˆ·‰·Š·‹·Œ··Ž···‘·’·“·”·•·–·—·˜·™·š·›·œ··ž·Ÿ· ·¡·¢·£·¤·¥·¦·§·¨·©·ª·«·¬·­·®·¯·°·±·²·³·´·µ·¶···¸·¹·º·»·¼·½·¾·¿·À·Á·Â·Ã·Ä·Å·Æ·Ç·È·É·Ê·Ë·Ì·Í·Î·Ï·Ð·Ñ·Ò·Ó·Ô·Õ·Ö·×·Ø·Ù·Ú·Û·Ü·Ý·Þ·ß·à·á·â·ã·ä·å·æ·ç·è·é·ê·ë·ì·í·î·ï·ð·ñ·ò·ó·ô·õ·ö·÷·ø·ù·ú·û·ü·ý·þ·ÿ·¸¸¸¸¸¸¸¸¸ ¸ ¸ ¸ ¸ ¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸ ¸!¸"¸#¸$¸%¸&¸'¸(¸)¸*¸+¸,¸-¸.¸/¸0¸1¸2¸3¸4¸5¸6¸7¸8¸9¸:¸;¸<¸=¸>¸?¸@¸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¸[¸\¸]¸^¸_¸`¸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¸{¸|¸}¸~¸¸€¸¸‚¸ƒ¸„¸…¸†¸‡¸ˆ¸‰¸Š¸‹¸Œ¸¸Ž¸¸¸‘¸’¸“¸”¸•¸–¸—¸˜¸™¸š¸›¸œ¸¸ž¸Ÿ¸ ¸¡¸¢¸£¸¤¸¥¸¦¸§¸¨¸©¸ª¸«¸¬¸­¸®¸¯¸°¸±¸²¸³¸´¸µ¸¶¸·¸¸¸¹¸º¸»¸¼¸½¸¾¸¿¸À¸Á¸Â¸Ã¸Ä¸Å¸Æ¸Ç¸È¸É¸Ê¸Ë¸Ì¸Í¸Î¸Ï¸Ð¸Ñ¸Ò¸Ó¸Ô¸Õ¸Ö¸×¸Ø¸Ù¸Ú¸Û¸Ü¸Ý¸Þ¸ß¸à¸á¸â¸ã¸ä¸å¸æ¸ç¸è¸é¸ê¸ë¸ì¸í¸î¸ï¸ð¸ñ¸ò¸ó¸ô¸õ¸ö¸÷¸ø¸ù¸ú¸û¸ü¸ý¸þ¸ÿ¸¹¹¹¹¹¹¹¹¹ ¹ ¹ ¹ ¹ ¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹ ¹!¹"¹#¹$¹%¹&¹'¹(¹)¹*¹+¹,¹-¹.¹/¹0¹1¹2¹3¹4¹5¹6¹7¹8¹9¹:¹;¹<¹=¹>¹?¹@¹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¹[¹\¹]¹^¹_¹`¹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¹{¹|¹}¹~¹¹€¹¹‚¹ƒ¹„¹…¹†¹‡¹ˆ¹‰¹Š¹‹¹Œ¹¹Ž¹¹¹‘¹’¹“¹”¹•¹–¹—¹˜¹™¹š¹›¹œ¹¹ž¹Ÿ¹ ¹¡¹¢¹£¹¤¹¥¹¦¹§¹¨¹©¹ª¹«¹¬¹­¹®¹¯¹°¹±¹²¹³¹´¹µ¹¶¹·¹¸¹¹¹º¹»¹¼¹½¹¾¹¿¹À¹Á¹Â¹Ã¹Ä¹Å¹Æ¹Ç¹È¹É¹Ê¹Ë¹Ì¹Í¹Î¹Ï¹Ð¹Ñ¹Ò¹Ó¹Ô¹Õ¹Ö¹×¹Ø¹Ù¹Ú¹Û¹Ü¹Ý¹Þ¹ß¹à¹á¹â¹ã¹ä¹å¹æ¹ç¹è¹é¹ê¹ë¹ì¹í¹î¹ï¹ð¹ñ¹ò¹ó¹ô¹õ¹ö¹÷¹ø¹ù¹ú¹û¹ü¹ý¹þ¹ÿ¹ººººººººº º º º º ººººººººººººººººººº º!º"º#º$º%º&º'º(º)º*º+º,º-º.º/º0º1º2º3º4º5º6º7º8º9º:º;º<º=º>º?º@º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º[º\º]º^º_º`º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º{º|º}º~ºº€ºº‚ºƒº„º…º†º‡ºˆº‰ºŠº‹ºŒººŽººº‘º’º“º”º•º–º—º˜º™ºšº›ºœººžºŸº º¡º¢º£º¤º¥º¦º§º¨º©ºªº«º¬º­º®º¯º°º±º²º³º´ºµº¶º·º¸º¹ººº»º¼º½º¾º¿ºÀºÁºÂºÃºÄºÅºÆºÇºÈºÉºÊºËºÌºÍºÎºÏºÐºÑºÒºÓºÔºÕºÖº×ºØºÙºÚºÛºÜºÝºÞºßºàºáºâºãºäºåºæºçºèºéºêºëºìºíºîºïºðºñºòºóºôºõºöº÷ºøºùºúºûºüºýºþºÿº»»»»»»»»» » » » » »»»»»»»»»»»»»»»»»»» »!»"»#»$»%»&»'»(»)»*»+»,»-».»/»0»1»2»3»4»5»6»7»8»9»:»;»<»=»>»?»@»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»[»\»]»^»_»`»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»{»|»}»~»»€»»‚»ƒ»„»…»†»‡»ˆ»‰»Š»‹»Œ»»Ž»»»‘»’»“»”»•»–»—»˜»™»š»›»œ»»ž»Ÿ» »¡»¢»£»¤»¥»¦»§»¨»©»ª»«»¬»­»®»¯»°»±»²»³»´»µ»¶»·»¸»¹»º»»»¼»½»¾»¿»À»Á»Â»Ã»Ä»Å»Æ»Ç»È»É»Ê»Ë»Ì»Í»Î»Ï»Ð»Ñ»Ò»Ó»Ô»Õ»Ö»×»Ø»Ù»Ú»Û»Ü»Ý»Þ»ß»à»á»â»ã»ä»å»æ»ç»è»é»ê»ë»ì»í»î»ï»ð»ñ»ò»ó»ô»õ»ö»÷»ø»ù»ú»û»ü»ý»þ»ÿ»¼¼¼¼¼¼¼¼¼ ¼ ¼ ¼ ¼ ¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼ ¼!¼"¼#¼$¼%¼&¼'¼(¼)¼*¼+¼,¼-¼.¼/¼0¼1¼2¼3¼4¼5¼6¼7¼8¼9¼:¼;¼<¼=¼>¼?¼@¼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¼[¼\¼]¼^¼_¼`¼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¼{¼|¼}¼~¼¼€¼¼‚¼ƒ¼„¼…¼†¼‡¼ˆ¼‰¼Š¼‹¼Œ¼¼Ž¼¼¼‘¼’¼“¼”¼•¼–¼—¼˜¼™¼š¼›¼œ¼¼ž¼Ÿ¼ ¼¡¼¢¼£¼¤¼¥¼¦¼§¼¨¼©¼ª¼«¼¬¼­¼®¼¯¼°¼±¼²¼³¼´¼µ¼¶¼·¼¸¼¹¼º¼»¼¼¼½¼¾¼¿¼À¼Á¼Â¼Ã¼Ä¼Å¼Æ¼Ç¼È¼É¼Ê¼Ë¼Ì¼Í¼Î¼Ï¼Ð¼Ñ¼Ò¼Ó¼Ô¼Õ¼Ö¼×¼Ø¼Ù¼Ú¼Û¼Ü¼Ý¼Þ¼ß¼à¼á¼â¼ã¼ä¼å¼æ¼ç¼è¼é¼ê¼ë¼ì¼í¼î¼ï¼ð¼ñ¼ò¼ó¼ô¼õ¼ö¼÷¼ø¼ù¼ú¼û¼ü¼ý¼þ¼ÿ¼½½½½½½½½½ ½ ½ ½ ½ ½½½½½½½½½½½½½½½½½½½ ½!½"½#½$½%½&½'½(½)½*½+½,½-½.½/½0½1½2½3½4½5½6½7½8½9½:½;½<½=½>½?½@½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½[½\½]½^½_½`½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½{½|½}½~½½€½½‚½ƒ½„½…½†½‡½ˆ½‰½Š½‹½Œ½½Ž½½½‘½’½“½”½•½–½—½˜½™½š½›½œ½½ž½Ÿ½ ½¡½¢½£½¤½¥½¦½§½¨½©½ª½«½¬½­½®½¯½°½±½²½³½´½µ½¶½·½¸½¹½º½»½¼½½½¾½¿½À½Á½Â½Ã½Ä½Å½Æ½Ç½È½É½Ê½Ë½Ì½Í½Î½Ï½Ð½Ñ½Ò½Ó½Ô½Õ½Ö½×½Ø½Ù½Ú½Û½Ü½Ý½Þ½ß½à½á½â½ã½ä½å½æ½ç½è½é½ê½ë½ì½í½î½ï½ð½ñ½ò½ó½ô½õ½ö½÷½ø½ù½ú½û½ü½ý½þ½ÿ½¾¾¾¾¾¾¾¾¾ ¾ ¾ ¾ ¾ ¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾ ¾!¾"¾#¾$¾%¾&¾'¾(¾)¾*¾+¾,¾-¾.¾/¾0¾1¾2¾3¾4¾5¾6¾7¾8¾9¾:¾;¾<¾=¾>¾?¾@¾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¾[¾\¾]¾^¾_¾`¾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¾{¾|¾}¾~¾¾€¾¾‚¾ƒ¾„¾…¾†¾‡¾ˆ¾‰¾Š¾‹¾Œ¾¾Ž¾¾¾‘¾’¾“¾”¾•¾–¾—¾˜¾™¾š¾›¾œ¾¾ž¾Ÿ¾ ¾¡¾¢¾£¾¤¾¥¾¦¾§¾¨¾©¾ª¾«¾¬¾­¾®¾¯¾°¾±¾²¾³¾´¾µ¾¶¾·¾¸¾¹¾º¾»¾¼¾½¾¾¾¿¾À¾Á¾Â¾Ã¾Ä¾Å¾Æ¾Ç¾È¾É¾Ê¾Ë¾Ì¾Í¾Î¾Ï¾Ð¾Ñ¾Ò¾Ó¾Ô¾Õ¾Ö¾×¾Ø¾Ù¾Ú¾Û¾Ü¾Ý¾Þ¾ß¾à¾á¾â¾ã¾ä¾å¾æ¾ç¾è¾é¾ê¾ë¾ì¾í¾î¾ï¾ð¾ñ¾ò¾ó¾ô¾õ¾ö¾÷¾ø¾ù¾ú¾û¾ü¾ý¾þ¾ÿ¾¿¿¿¿¿¿¿¿¿ ¿ ¿ ¿ ¿ ¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ ¿!¿"¿#¿$¿%¿&¿'¿(¿)¿*¿+¿,¿-¿.¿/¿0¿1¿2¿3¿4¿5¿6¿7¿8¿9¿:¿;¿<¿=¿>¿?¿@¿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¿[¿\¿]¿^¿_¿`¿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¿{¿|¿}¿~¿¿€¿¿‚¿ƒ¿„¿…¿†¿‡¿ˆ¿‰¿Š¿‹¿Œ¿¿Ž¿¿¿‘¿’¿“¿”¿•¿–¿—¿˜¿™¿š¿›¿œ¿¿ž¿Ÿ¿ ¿¡¿¢¿£¿¤¿¥¿¦¿§¿¨¿©¿ª¿«¿¬¿­¿®¿¯¿°¿±¿²¿³¿´¿µ¿¶¿·¿¸¿¹¿º¿»¿¼¿½¿¾¿¿¿À¿Á¿Â¿Ã¿Ä¿Å¿Æ¿Ç¿È¿É¿Ê¿Ë¿Ì¿Í¿Î¿Ï¿Ð¿Ñ¿Ò¿Ó¿Ô¿Õ¿Ö¿×¿Ø¿Ù¿Ú¿Û¿Ü¿Ý¿Þ¿ß¿à¿á¿â¿ã¿ä¿å¿æ¿ç¿è¿é¿ê¿ë¿ì¿í¿î¿ï¿ð¿ñ¿ò¿ó¿ô¿õ¿ö¿÷¿ø¿ù¿ú¿û¿ü¿ý¿þ¿ÿ¿ÀÀÀÀÀÀÀÀÀ À À À À ÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ À!À"À#À$À%À&À'À(À)À*À+À,À-À.À/À0À1À2À3À4À5À6À7À8À9À:À;À<À=À>À?À@À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À[À\À]À^À_À`À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À{À|À}À~ÀÀ€ÀÀ‚ÀƒÀ„À…À†À‡ÀˆÀ‰ÀŠÀ‹ÀŒÀÀŽÀÀÀ‘À’À“À”À•À–À—À˜À™ÀšÀ›ÀœÀÀžÀŸÀ À¡À¢À£À¤À¥À¦À§À¨À©ÀªÀ«À¬À­À®À¯À°À±À²À³À´ÀµÀ¶À·À¸À¹ÀºÀ»À¼À½À¾À¿ÀÀÀÁÀÂÀÃÀÄÀÅÀÆÀÇÀÈÀÉÀÊÀËÀÌÀÍÀÎÀÏÀÐÀÑÀÒÀÓÀÔÀÕÀÖÀ×ÀØÀÙÀÚÀÛÀÜÀÝÀÞÀßÀàÀáÀâÀãÀäÀåÀæÀçÀèÀéÀêÀëÀìÀíÀîÀïÀðÀñÀòÀóÀôÀõÀöÀ÷ÀøÀùÀúÀûÀüÀýÀþÀÿÀÁÁÁÁÁÁÁÁÁ Á Á Á Á ÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁ Á!Á"Á#Á$Á%Á&Á'Á(Á)Á*Á+Á,Á-Á.Á/Á0Á1Á2Á3Á4Á5Á6Á7Á8Á9Á:Á;Á<Á=Á>Á?Á@Á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Á[Á\Á]Á^Á_Á`Á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Á{Á|Á}Á~ÁÁ€ÁÁ‚ÁƒÁ„Á…Á†Á‡ÁˆÁ‰ÁŠÁ‹ÁŒÁÁŽÁÁÁ‘Á’Á“Á”Á•Á–Á—Á˜Á™ÁšÁ›ÁœÁÁžÁŸÁ Á¡Á¢Á£Á¤Á¥Á¦Á§Á¨Á©ÁªÁ«Á¬Á­Á®Á¯Á°Á±Á²Á³Á´ÁµÁ¶Á·Á¸Á¹ÁºÁ»Á¼Á½Á¾Á¿ÁÀÁÁÁÂÁÃÁÄÁÅÁÆÁÇÁÈÁÉÁÊÁËÁÌÁÍÁÎÁÏÁÐÁÑÁÒÁÓÁÔÁÕÁÖÁ×ÁØÁÙÁÚÁÛÁÜÁÝÁÞÁßÁàÁáÁâÁãÁäÁåÁæÁçÁèÁéÁêÁëÁìÁíÁîÁïÁðÁñÁòÁóÁôÁõÁöÁ÷ÁøÁùÁúÁûÁüÁýÁþÁÿÁ     Â Â!Â"Â#Â$Â%Â&Â'Â(Â)Â*Â+Â,Â-Â.Â/Â0Â1Â2Â3Â4Â5Â6Â7Â8Â9Â:Â;Â<Â=Â>Â?Â@Â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Â[Â\Â]Â^Â_Â`Â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Â{Â|Â}Â~€‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÂÀÂÁÂÂÂÃÂÄÂÅÂÆÂÇÂÈÂÉÂÊÂËÂÌÂÍÂÎÂÏÂÐÂÑÂÒÂÓÂÔÂÕÂÖÂ×ÂØÂÙÂÚÂÛÂÜÂÝÂÞÂßÂàÂáÂâÂãÂäÂåÂæÂçÂèÂéÂêÂëÂìÂíÂîÂïÂðÂñÂòÂóÂôÂõÂöÂ÷ÂøÂùÂúÂûÂüÂýÂþÂÿÂÃÃÃÃÃÃÃÃà à à à à ÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃà Ã!Ã"Ã#Ã$Ã%Ã&Ã'Ã(Ã)Ã*Ã+Ã,Ã-Ã.Ã/Ã0Ã1Ã2Ã3Ã4Ã5Ã6Ã7Ã8Ã9Ã:Ã;Ã<Ã=Ã>Ã?Ã@Ã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Ã[Ã\Ã]Ã^Ã_Ã`Ã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Ã{Ã|Ã}Ã~ÃÀÃÂÃÄÅÆÇÈÉÊËÌÃÃŽÃÃÑÒÓÔÕÖרÙÚÛÜÃÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿÃÀÃÁÃÂÃÃÃÄÃÅÃÆÃÇÃÈÃÉÃÊÃËÃÌÃÍÃÎÃÏÃÐÃÑÃÒÃÓÃÔÃÕÃÖÃ×ÃØÃÙÃÚÃÛÃÜÃÝÃÞÃßÃàÃáÃâÃãÃäÃåÃæÃçÃèÃéÃêÃëÃìÃíÃîÃïÃðÃñÃòÃóÃôÃõÃöÃ÷ÃøÃùÃúÃûÃüÃýÃþÃÿÃÄÄÄÄÄÄÄÄÄ Ä Ä Ä Ä ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Ä!Ä"Ä#Ä$Ä%Ä&Ä'Ä(Ä)Ä*Ä+Ä,Ä-Ä.Ä/Ä0Ä1Ä2Ä3Ä4Ä5Ä6Ä7Ä8Ä9Ä:Ä;Ä<Ä=Ä>Ä?Ä@Ä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Ä[Ä\Ä]Ä^Ä_Ä`Ä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Ä{Ä|Ä}Ä~ÄÄ€ÄĂ㥹ĆćĈĉĊċČÄÄŽÄÄđĒēĔĕĖėĘęĚěĜÄĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸĹĺĻļĽľĿÄÀÄÁÄÂÄÃÄÄÄÅÄÆÄÇÄÈÄÉÄÊÄËÄÌÄÍÄÎÄÏÄÐÄÑÄÒÄÓÄÔÄÕÄÖÄ×ÄØÄÙÄÚÄÛÄÜÄÝÄÞÄßÄàÄáÄâÄãÄäÄåÄæÄçÄèÄéÄêÄëÄìÄíÄîÄïÄðÄñÄòÄóÄôÄõÄöÄ÷ÄøÄùÄúÄûÄüÄýÄþÄÿÄÅÅÅÅÅÅÅÅÅ Å Å Å Å ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ Å!Å"Å#Å$Å%Å&Å'Å(Å)Å*Å+Å,Å-Å.Å/Å0Å1Å2Å3Å4Å5Å6Å7Å8Å9Å:Å;Å<Å=Å>Å?Å@Å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Å[Å\Å]Å^Å_Å`Å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Å{Å|Å}Å~ÅÅ€ÅłŃńŅņŇňʼnŊŋŌÅÅŽÅÅőŒœŔŕŖŗŘřŚśŜÅŞşŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżŽžſÅÀÅÁÅÂÅÃÅÄÅÅÅÆÅÇÅÈÅÉÅÊÅËÅÌÅÍÅÎÅÏÅÐÅÑÅÒÅÓÅÔÅÕÅÖÅ×ÅØÅÙÅÚÅÛÅÜÅÝÅÞÅßÅàÅáÅâÅãÅäÅåÅæÅçÅèÅéÅêÅëÅìÅíÅîÅïÅðÅñÅòÅóÅôÅõÅöÅ÷ÅøÅùÅúÅûÅüÅýÅþÅÿÅÆÆÆÆÆÆÆÆÆ Æ Æ Æ Æ ÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆ Æ!Æ"Æ#Æ$Æ%Æ&Æ'Æ(Æ)Æ*Æ+Æ,Æ-Æ.Æ/Æ0Æ1Æ2Æ3Æ4Æ5Æ6Æ7Æ8Æ9Æ:Æ;Æ<Æ=Æ>Æ?Æ@Æ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Æ[Æ\Æ]Æ^Æ_Æ`Æ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Æ{Æ|Æ}Æ~ÆÆ€ÆÆ‚ÆƒÆ„Æ…Æ†Æ‡ÆˆÆ‰ÆŠÆ‹ÆŒÆÆŽÆÆÆ‘Æ’Æ“Æ”Æ•Æ–Æ—Æ˜Æ™ÆšÆ›ÆœÆÆžÆŸÆ Æ¡Æ¢Æ£Æ¤Æ¥Æ¦Æ§Æ¨Æ©ÆªÆ«Æ¬Æ­Æ®Æ¯Æ°Æ±Æ²Æ³Æ´ÆµÆ¶Æ·Æ¸Æ¹ÆºÆ»Æ¼Æ½Æ¾Æ¿ÆÀÆÁÆÂÆÃÆÄÆÅÆÆÆÇÆÈÆÉÆÊÆËÆÌÆÍÆÎÆÏÆÐÆÑÆÒÆÓÆÔÆÕÆÖÆ×ÆØÆÙÆÚÆÛÆÜÆÝÆÞÆßÆàÆáÆâÆãÆäÆåÆæÆçÆèÆéÆêÆëÆìÆíÆîÆïÆðÆñÆòÆóÆôÆõÆöÆ÷ÆøÆùÆúÆûÆüÆýÆþÆÿÆÇÇÇÇÇÇÇÇÇ Ç Ç Ç Ç ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ Ç!Ç"Ç#Ç$Ç%Ç&Ç'Ç(Ç)Ç*Ç+Ç,Ç-Ç.Ç/Ç0Ç1Ç2Ç3Ç4Ç5Ç6Ç7Ç8Ç9Ç:Ç;Ç<Ç=Ç>Ç?Ç@Ç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Ç[Ç\Ç]Ç^Ç_Ç`Ç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Ç{Ç|Ç}Ç~ÇÇ€ÇǂǃDŽDždžLJLjljNJNjnjÇÇŽÇÇǑǒǓǔǕǖǗǘǙǚǛǜÇǞǟǠǡǢǣǤǥǦǧǨǩǪǫǬǭǮǯǰDZDzdzǴǵǶǷǸǹǺǻǼǽǾǿÇÀÇÁÇÂÇÃÇÄÇÅÇÆÇÇÇÈÇÉÇÊÇËÇÌÇÍÇÎÇÏÇÐÇÑÇÒÇÓÇÔÇÕÇÖÇ×ÇØÇÙÇÚÇÛÇÜÇÝÇÞÇßÇàÇáÇâÇãÇäÇåÇæÇçÇèÇéÇêÇëÇìÇíÇîÇïÇðÇñÇòÇóÇôÇõÇöÇ÷ÇøÇùÇúÇûÇüÇýÇþÇÿÇÈÈÈÈÈÈÈÈÈ È È È È ÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈ È!È"È#È$È%È&È'È(È)È*È+È,È-È.È/È0È1È2È3È4È5È6È7È8È9È:È;È<È=È>È?È@È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È[È\È]È^È_È`È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È{È|È}È~ÈÈ€ÈȂȃȄȅȆȇȈȉȊȋȌÈÈŽÈÈȑȒȓȔȕȖȗȘșȚțȜÈȞȟȠȡȢȣȤȥȦȧȨȩȪȫȬȭȮȯȰȱȲȳȴȵȶȷȸȹȺȻȼȽȾȿÈÀÈÁÈÂÈÃÈÄÈÅÈÆÈÇÈÈÈÉÈÊÈËÈÌÈÍÈÎÈÏÈÐÈÑÈÒÈÓÈÔÈÕÈÖÈ×ÈØÈÙÈÚÈÛÈÜÈÝÈÞÈßÈàÈáÈâÈãÈäÈåÈæÈçÈèÈéÈêÈëÈìÈíÈîÈïÈðÈñÈòÈóÈôÈõÈöÈ÷ÈøÈùÈúÈûÈüÈýÈþÈÿÈÉÉÉÉÉÉÉÉÉ É É É É ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ É!É"É#É$É%É&É'É(É)É*É+É,É-É.É/É0É1É2É3É4É5É6É7É8É9É:É;É<É=É>É?É@É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É[É\É]É^É_É`É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É{É|É}É~ÉÉ€ÉɂɃɄɅɆɇɈɉɊɋɌÉÉŽÉÉɑɒɓɔɕɖɗɘəɚɛɜÉɞɟɠɡɢɣɤɥɦɧɨɩɪɫɬɭɮɯɰɱɲɳɴɵɶɷɸɹɺɻɼɽɾɿÉÀÉÁÉÂÉÃÉÄÉÅÉÆÉÇÉÈÉÉÉÊÉËÉÌÉÍÉÎÉÏÉÐÉÑÉÒÉÓÉÔÉÕÉÖÉ×ÉØÉÙÉÚÉÛÉÜÉÝÉÞÉßÉàÉáÉâÉãÉäÉåÉæÉçÉèÉéÉêÉëÉìÉíÉîÉïÉðÉñÉòÉóÉôÉõÉöÉ÷ÉøÉùÉúÉûÉüÉýÉþÉÿÉÊÊÊÊÊÊÊÊÊ Ê Ê Ê Ê ÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊ Ê!Ê"Ê#Ê$Ê%Ê&Ê'Ê(Ê)Ê*Ê+Ê,Ê-Ê.Ê/Ê0Ê1Ê2Ê3Ê4Ê5Ê6Ê7Ê8Ê9Ê:Ê;Ê<Ê=Ê>Ê?Ê@Ê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Ê[Ê\Ê]Ê^Ê_Ê`Ê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Ê{Ê|Ê}Ê~ÊÊ€ÊʂʃʄʅʆʇʈʉʊʋʌÊÊŽÊÊʑʒʓʔʕʖʗʘʙʚʛʜÊʞʟʠʡʢʣʤʥʦʧʨʩʪʫʬʭʮʯʰʱʲʳʴʵʶʷʸʹʺʻʼʽʾʿÊÀÊÁÊÂÊÃÊÄÊÅÊÆÊÇÊÈÊÉÊÊÊËÊÌÊÍÊÎÊÏÊÐÊÑÊÒÊÓÊÔÊÕÊÖÊ×ÊØÊÙÊÚÊÛÊÜÊÝÊÞÊßÊàÊáÊâÊãÊäÊåÊæÊçÊèÊéÊêÊëÊìÊíÊîÊïÊðÊñÊòÊóÊôÊõÊöÊ÷ÊøÊùÊúÊûÊüÊýÊþÊÿÊËËËËËËËËË Ë Ë Ë Ë ËËËËËËËËËËËËËËËËËËË Ë!Ë"Ë#Ë$Ë%Ë&Ë'Ë(Ë)Ë*Ë+Ë,Ë-Ë.Ë/Ë0Ë1Ë2Ë3Ë4Ë5Ë6Ë7Ë8Ë9Ë:Ë;Ë<Ë=Ë>Ë?Ë@Ë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Ë[Ë\Ë]Ë^Ë_Ë`Ë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Ë{Ë|Ë}Ë~ËË€Ë˂˃˄˅ˆˇˈˉˊˋˌËËŽËËˑ˒˓˔˕˖˗˘˙˚˛˜Ë˞˟ˠˡˢˣˤ˥˦˧˨˩˪˫ˬ˭ˮ˯˰˱˲˳˴˵˶˷˸˹˺˻˼˽˾˿ËÀËÁËÂËÃËÄËÅËÆËÇËÈËÉËÊËËËÌËÍËÎËÏËÐËÑËÒËÓËÔËÕËÖË×ËØËÙËÚËÛËÜËÝËÞËßËàËáËâËãËäËåËæËçËèËéËêËëËìËíËîËïËðËñËòËóËôËõËöË÷ËøËùËúËûËüËýËþËÿËÌÌÌÌÌÌÌÌÌ Ì Ì Ì Ì ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ Ì!Ì"Ì#Ì$Ì%Ì&Ì'Ì(Ì)Ì*Ì+Ì,Ì-Ì.Ì/Ì0Ì1Ì2Ì3Ì4Ì5Ì6Ì7Ì8Ì9Ì:Ì;Ì<Ì=Ì>Ì?Ì@Ì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Ì[Ì\Ì]Ì^Ì_Ì`Ì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Ì{Ì|Ì}Ì~ÌÌ€Ì̂̃̄̅̆̇̈̉̊̋̌ÌÌŽÌÌ̛̖̗̘̙̜̑̒̓̔̕̚Ì̴̵̶̷̸̡̢̧̨̞̟̠̣̤̥̦̩̪̫̬̭̮̯̰̱̲̳̹̺̻̼̽̾̿ÌÀÌÁÌÂÌÃÌÄÌÅÌÆÌÇÌÈÌÉÌÊÌËÌÌÌÍÌÎÌÏÌÐÌÑÌÒÌÓÌÔÌÕÌÖÌ×ÌØÌÙÌÚÌÛÌÜÌÝÌÞÌßÌàÌáÌâÌãÌäÌåÌæÌçÌèÌéÌêÌëÌìÌíÌîÌïÌðÌñÌòÌóÌôÌõÌöÌ÷ÌøÌùÌúÌûÌüÌýÌþÌÿÌÍÍÍÍÍÍÍÍÍ Í Í Í Í ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ Í!Í"Í#Í$Í%Í&Í'Í(Í)Í*Í+Í,Í-Í.Í/Í0Í1Í2Í3Í4Í5Í6Í7Í8Í9Í:Í;Í<Í=Í>Í?Í@Í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Í[Í\Í]Í^Í_Í`Í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Í{Í|Í}Í~ÍÍ€Í͇͈͉͂̓̈́͆͊͋͌ͅÍÍŽÍÍ͓͔͕͖͙͚͑͒͗͛͘͜Íͣͤͥͦͧͨͩͪͫͬͭͮͯ͟͢͞͠͡ͰͱͲͳʹ͵Ͷͷ͸͹ͺͻͼͽ;ͿÍÀÍÁÍÂÍÃÍÄÍÅÍÆÍÇÍÈÍÉÍÊÍËÍÌÍÍÍÎÍÏÍÐÍÑÍÒÍÓÍÔÍÕÍÖÍ×ÍØÍÙÍÚÍÛÍÜÍÝÍÞÍßÍàÍáÍâÍãÍäÍåÍæÍçÍèÍéÍêÍëÍìÍíÍîÍïÍðÍñÍòÍóÍôÍõÍöÍ÷ÍøÍùÍúÍûÍüÍýÍþÍÿÍÎÎÎÎÎÎÎÎÎ Î Î Î Î ÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎ Î!Î"Î#Î$Î%Î&Î'Î(Î)Î*Î+Î,Î-Î.Î/Î0Î1Î2Î3Î4Î5Î6Î7Î8Î9Î:Î;Î<Î=Î>Î?Î@Î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Î[Î\Î]Î^Î_Î`Î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Î{Î|Î}Î~Î΀Î΂΃΄΅Ά·ΈΉΊ΋ΌÎÎŽÎÎΑΒΓΔΕΖΗΘΙΚΛΜÎΞΟΠΡ΢ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοÎÀÎÁÎÂÎÃÎÄÎÅÎÆÎÇÎÈÎÉÎÊÎËÎÌÎÍÎÎÎÏÎÐÎÑÎÒÎÓÎÔÎÕÎÖÎ×ÎØÎÙÎÚÎÛÎÜÎÝÎÞÎßÎàÎáÎâÎãÎäÎåÎæÎçÎèÎéÎêÎëÎìÎíÎîÎïÎðÎñÎòÎóÎôÎõÎöÎ÷ÎøÎùÎúÎûÎüÎýÎþÎÿÎÏÏÏÏÏÏÏÏÏ Ï Ï Ï Ï ÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏ Ï!Ï"Ï#Ï$Ï%Ï&Ï'Ï(Ï)Ï*Ï+Ï,Ï-Ï.Ï/Ï0Ï1Ï2Ï3Ï4Ï5Ï6Ï7Ï8Ï9Ï:Ï;Ï<Ï=Ï>Ï?Ï@Ï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Ï[Ï\Ï]Ï^Ï_Ï`Ï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Ï{Ï|Ï}Ï~ÏÏ€ÏςστυφχψωϊϋόÏÏŽÏÏϑϒϓϔϕϖϗϘϙϚϛϜÏϞϟϠϡϢϣϤϥϦϧϨϩϪϫϬϭϮϯϰϱϲϳϴϵ϶ϷϸϹϺϻϼϽϾϿÏÀÏÁÏÂÏÃÏÄÏÅÏÆÏÇÏÈÏÉÏÊÏËÏÌÏÍÏÎÏÏÏÐÏÑÏÒÏÓÏÔÏÕÏÖÏ×ÏØÏÙÏÚÏÛÏÜÏÝÏÞÏßÏàÏáÏâÏãÏäÏåÏæÏçÏèÏéÏêÏëÏìÏíÏîÏïÏðÏñÏòÏóÏôÏõÏöÏ÷ÏøÏùÏúÏûÏüÏýÏþÏÿÏÐÐÐÐÐÐÐÐÐ Ð Ð Ð Ð ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ Ð!Ð"Ð#Ð$Ð%Ð&Ð'Ð(Ð)Ð*Ð+Ð,Ð-Ð.Ð/Ð0Ð1Ð2Ð3Ð4Ð5Ð6Ð7Ð8Ð9Ð:Ð;Ð<Ð=Ð>Ð?Ð@Ð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Ð[Ð\Ð]Ð^Ð_Ð`Ð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Ð{Ð|Ð}Ð~ÐЀÐЂЃЄЅІЇЈЉЊЋЌÐÐŽÐÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопÐÀÐÁÐÂÐÃÐÄÐÅÐÆÐÇÐÈÐÉÐÊÐËÐÌÐÍÐÎÐÏÐÐÐÑÐÒÐÓÐÔÐÕÐÖÐ×ÐØÐÙÐÚÐÛÐÜÐÝÐÞÐßÐàÐáÐâÐãÐäÐåÐæÐçÐèÐéÐêÐëÐìÐíÐîÐïÐðÐñÐòÐóÐôÐõÐöÐ÷ÐøÐùÐúÐûÐüÐýÐþÐÿÐÑÑÑÑÑÑÑÑÑ Ñ Ñ Ñ Ñ ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ Ñ!Ñ"Ñ#Ñ$Ñ%Ñ&Ñ'Ñ(Ñ)Ñ*Ñ+Ñ,Ñ-Ñ.Ñ/Ñ0Ñ1Ñ2Ñ3Ñ4Ñ5Ñ6Ñ7Ñ8Ñ9Ñ:Ñ;Ñ<Ñ=Ñ>Ñ?Ñ@Ñ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Ñ[Ñ\Ñ]Ñ^Ñ_Ñ`Ñ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Ñ{Ñ|Ñ}Ñ~ÑÑ€ÑтуфхцчшщъыьÑÑŽÑÑёђѓєѕіїјљњћќÑўџѠѡѢѣѤѥѦѧѨѩѪѫѬѭѮѯѰѱѲѳѴѵѶѷѸѹѺѻѼѽѾѿÑÀÑÁÑÂÑÃÑÄÑÅÑÆÑÇÑÈÑÉÑÊÑËÑÌÑÍÑÎÑÏÑÐÑÑÑÒÑÓÑÔÑÕÑÖÑ×ÑØÑÙÑÚÑÛÑÜÑÝÑÞÑßÑàÑáÑâÑãÑäÑåÑæÑçÑèÑéÑêÑëÑìÑíÑîÑïÑðÑñÑòÑóÑôÑõÑöÑ÷ÑøÑùÑúÑûÑüÑýÑþÑÿÑÒÒÒÒÒÒÒÒÒ Ò Ò Ò Ò ÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒ Ò!Ò"Ò#Ò$Ò%Ò&Ò'Ò(Ò)Ò*Ò+Ò,Ò-Ò.Ò/Ò0Ò1Ò2Ò3Ò4Ò5Ò6Ò7Ò8Ò9Ò:Ò;Ò<Ò=Ò>Ò?Ò@Ò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Ò[Ò\Ò]Ò^Ò_Ò`Ò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Ò{Ò|Ò}Ò~ÒÒ€ÒÒ‚ÒƒÒ„Ò…Ò†Ò‡ÒˆÒ‰ÒŠÒ‹ÒŒÒÒŽÒÒÒ‘Ò’Ò“Ò”Ò•Ò–Ò—Ò˜Ò™ÒšÒ›ÒœÒÒžÒŸÒ Ò¡Ò¢Ò£Ò¤Ò¥Ò¦Ò§Ò¨Ò©ÒªÒ«Ò¬Ò­Ò®Ò¯Ò°Ò±Ò²Ò³Ò´ÒµÒ¶Ò·Ò¸Ò¹ÒºÒ»Ò¼Ò½Ò¾Ò¿ÒÀÒÁÒÂÒÃÒÄÒÅÒÆÒÇÒÈÒÉÒÊÒËÒÌÒÍÒÎÒÏÒÐÒÑÒÒÒÓÒÔÒÕÒÖÒ×ÒØÒÙÒÚÒÛÒÜÒÝÒÞÒßÒàÒáÒâÒãÒäÒåÒæÒçÒèÒéÒêÒëÒìÒíÒîÒïÒðÒñÒòÒóÒôÒõÒöÒ÷ÒøÒùÒúÒûÒüÒýÒþÒÿÒÓÓÓÓÓÓÓÓÓ Ó Ó Ó Ó ÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓ Ó!Ó"Ó#Ó$Ó%Ó&Ó'Ó(Ó)Ó*Ó+Ó,Ó-Ó.Ó/Ó0Ó1Ó2Ó3Ó4Ó5Ó6Ó7Ó8Ó9Ó:Ó;Ó<Ó=Ó>Ó?Ó@Ó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Ó[Ó\Ó]Ó^Ó_Ó`Ó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Ó{Ó|Ó}Ó~ÓÓ€ÓÓ‚ÓƒÓ„Ó…Ó†Ó‡ÓˆÓ‰ÓŠÓ‹ÓŒÓÓŽÓÓÓ‘Ó’Ó“Ó”Ó•Ó–Ó—Ó˜Ó™ÓšÓ›ÓœÓÓžÓŸÓ Ó¡Ó¢Ó£Ó¤Ó¥Ó¦Ó§Ó¨Ó©ÓªÓ«Ó¬Ó­Ó®Ó¯Ó°Ó±Ó²Ó³Ó´ÓµÓ¶Ó·Ó¸Ó¹ÓºÓ»Ó¼Ó½Ó¾Ó¿ÓÀÓÁÓÂÓÃÓÄÓÅÓÆÓÇÓÈÓÉÓÊÓËÓÌÓÍÓÎÓÏÓÐÓÑÓÒÓÓÓÔÓÕÓÖÓ×ÓØÓÙÓÚÓÛÓÜÓÝÓÞÓßÓàÓáÓâÓãÓäÓåÓæÓçÓèÓéÓêÓëÓìÓíÓîÓïÓðÓñÓòÓóÓôÓõÓöÓ÷ÓøÓùÓúÓûÓüÓýÓþÓÿÓÔÔÔÔÔÔÔÔÔ Ô Ô Ô Ô ÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔ Ô!Ô"Ô#Ô$Ô%Ô&Ô'Ô(Ô)Ô*Ô+Ô,Ô-Ô.Ô/Ô0Ô1Ô2Ô3Ô4Ô5Ô6Ô7Ô8Ô9Ô:Ô;Ô<Ô=Ô>Ô?Ô@Ô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Ô[Ô\Ô]Ô^Ô_Ô`Ô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Ô{Ô|Ô}Ô~ÔÔ€ÔÔ‚ÔƒÔ„Ô…Ô†Ô‡ÔˆÔ‰ÔŠÔ‹ÔŒÔÔŽÔÔÔ‘Ô’Ô“Ô”Ô•Ô–Ô—Ô˜Ô™ÔšÔ›ÔœÔÔžÔŸÔ Ô¡Ô¢Ô£Ô¤Ô¥Ô¦Ô§Ô¨Ô©ÔªÔ«Ô¬Ô­Ô®Ô¯Ô°Ô±Ô²Ô³Ô´ÔµÔ¶Ô·Ô¸Ô¹ÔºÔ»Ô¼Ô½Ô¾Ô¿ÔÀÔÁÔÂÔÃÔÄÔÅÔÆÔÇÔÈÔÉÔÊÔËÔÌÔÍÔÎÔÏÔÐÔÑÔÒÔÓÔÔÔÕÔÖÔ×ÔØÔÙÔÚÔÛÔÜÔÝÔÞÔßÔàÔáÔâÔãÔäÔåÔæÔçÔèÔéÔêÔëÔìÔíÔîÔïÔðÔñÔòÔóÔôÔõÔöÔ÷ÔøÔùÔúÔûÔüÔýÔþÔÿÔÕÕÕÕÕÕÕÕÕ Õ Õ Õ Õ ÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕ Õ!Õ"Õ#Õ$Õ%Õ&Õ'Õ(Õ)Õ*Õ+Õ,Õ-Õ.Õ/Õ0Õ1Õ2Õ3Õ4Õ5Õ6Õ7Õ8Õ9Õ:Õ;Õ<Õ=Õ>Õ?Õ@Õ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Õ[Õ\Õ]Õ^Õ_Õ`Õ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Õ{Õ|Õ}Õ~ÕÕ€ÕÕ‚ÕƒÕ„Õ…Õ†Õ‡ÕˆÕ‰ÕŠÕ‹ÕŒÕÕŽÕÕÕ‘Õ’Õ“Õ”Õ•Õ–Õ—Õ˜Õ™ÕšÕ›ÕœÕÕžÕŸÕ Õ¡Õ¢Õ£Õ¤Õ¥Õ¦Õ§Õ¨Õ©ÕªÕ«Õ¬Õ­Õ®Õ¯Õ°Õ±Õ²Õ³Õ´ÕµÕ¶Õ·Õ¸Õ¹ÕºÕ»Õ¼Õ½Õ¾Õ¿ÕÀÕÁÕÂÕÃÕÄÕÅÕÆÕÇÕÈÕÉÕÊÕËÕÌÕÍÕÎÕÏÕÐÕÑÕÒÕÓÕÔÕÕÕÖÕ×ÕØÕÙÕÚÕÛÕÜÕÝÕÞÕßÕàÕáÕâÕãÕäÕåÕæÕçÕèÕéÕêÕëÕìÕíÕîÕïÕðÕñÕòÕóÕôÕõÕöÕ÷ÕøÕùÕúÕûÕüÕýÕþÕÿÕÖÖÖÖÖÖÖÖÖ Ö Ö Ö Ö ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ Ö!Ö"Ö#Ö$Ö%Ö&Ö'Ö(Ö)Ö*Ö+Ö,Ö-Ö.Ö/Ö0Ö1Ö2Ö3Ö4Ö5Ö6Ö7Ö8Ö9Ö:Ö;Ö<Ö=Ö>Ö?Ö@Ö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Ö[Ö\Ö]Ö^Ö_Ö`Ö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Ö{Ö|Ö}Ö~ÖÖ€ÖÖ‚ÖƒÖ„Ö…Ö†Ö‡ÖˆÖ‰ÖŠÖ‹ÖŒÖÖŽÖÖÖ‘Ö’Ö“Ö”Ö•Ö–Ö—Ö˜Ö™ÖšÖ›ÖœÖÖžÖŸÖ Ö¡Ö¢Ö£Ö¤Ö¥Ö¦Ö§Ö¨Ö©ÖªÖ«Ö¬Ö­Ö®Ö¯Ö°Ö±Ö²Ö³Ö´ÖµÖ¶Ö·Ö¸Ö¹ÖºÖ»Ö¼Ö½Ö¾Ö¿ÖÀÖÁÖÂÖÃÖÄÖÅÖÆÖÇÖÈÖÉÖÊÖËÖÌÖÍÖÎÖÏÖÐÖÑÖÒÖÓÖÔÖÕÖÖÖ×ÖØÖÙÖÚÖÛÖÜÖÝÖÞÖßÖàÖáÖâÖãÖäÖåÖæÖçÖèÖéÖêÖëÖìÖíÖîÖïÖðÖñÖòÖóÖôÖõÖöÖ÷ÖøÖùÖúÖûÖüÖýÖþÖÿÖ××××××××× × × × × ××××××××××××××××××× ×!×"×#×$×%×&×'×(×)×*×+×,×-×.×/×0×1×2×3×4×5×6×7×8×9×:×;×<×=×>×?×@×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×[×\×]×^×_×`×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×{×|×}×~××€×ׂ׃ׅׄ׆ׇ׈׉׊׋׌×׎××בגדהוזחטיךכל×מןנסעףפץצקרשת׫׬׭׮ׯװױײ׳״׵׶׷׸׹׺׻׼׽׾׿×À×Á×Â×Ã×Ä×Åׯ×Ç×È×É×Ê×Ë×Ì×Í×Î×Ï×Ð×Ñ×Ò×Ó×Ô×Õ×Ö××ר×Ù×Ú×Û×Ü×Ý×Þ×ß×à×á×â×ã×ä×å׿×ç×è×é×ê×ë×ì×í×î×ï×ð×ñ×ò×ó×ô×õ×ö×÷×ø×ù×ú×û×ü×ý×þ×ÿרØØØØØØØØ Ø Ø Ø Ø ØØØØØØØØØØØØØØØØØØØ Ø!Ø"Ø#Ø$Ø%Ø&Ø'Ø(Ø)Ø*Ø+Ø,Ø-Ø.Ø/Ø0Ø1Ø2Ø3Ø4Ø5Ø6Ø7Ø8Ø9Ø:Ø;Ø<Ø=Ø>Ø?Ø@Ø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Ø[Ø\Ø]Ø^Ø_Ø`Ø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Ø{Ø|Ø}Ø~ØØ€ØØ‚ØƒØ„Ø…Ø†Ø‡ØˆØ‰ØŠØ‹ØŒØØŽØØØ‘Ø’Ø“Ø”Ø•Ø–Ø—Ø˜Ø™ØšØ›ØœØØžØŸØ Ø¡Ø¢Ø£Ø¤Ø¥Ø¦Ø§Ø¨Ø©ØªØ«Ø¬Ø­Ø®Ø¯Ø°Ø±Ø²Ø³Ø´ØµØ¶Ø·Ø¸Ø¹ØºØ»Ø¼Ø½Ø¾Ø¿ØÀØÁØÂØÃØÄØÅØÆØÇØÈØÉØÊØËØÌØÍØÎØÏØÐØÑØÒØÓØÔØÕØÖØ×ØØØÙØÚØÛØÜØÝØÞØßØàØáØâØãØäØåØæØçØèØéØêØëØìØíØîØïØðØñØòØóØôØõØöØ÷ØøØùØúØûØüØýØþØÿØÙÙÙÙÙÙÙÙÙ Ù Ù Ù Ù ÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙ Ù!Ù"Ù#Ù$Ù%Ù&Ù'Ù(Ù)Ù*Ù+Ù,Ù-Ù.Ù/Ù0Ù1Ù2Ù3Ù4Ù5Ù6Ù7Ù8Ù9Ù:Ù;Ù<Ù=Ù>Ù?Ù@Ù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Ù[Ù\Ù]Ù^Ù_Ù`Ù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Ù{Ù|Ù}Ù~ÙÙ€ÙقكلمنهوىيًٌÙÙŽÙÙّْٕٖٜٓٔٗ٘ٙٚٛÙٟٞ٠١٢٣٤٥٦٧٨٩٪٫٬٭ٮٯٰٱٲٳٴٵٶٷٸٹٺٻټٽپٿÙÀÙÁÙÂÙÃÙÄÙÅÙÆÙÇÙÈÙÉÙÊÙËÙÌÙÍÙÎÙÏÙÐÙÑÙÒÙÓÙÔÙÕÙÖÙ×ÙØÙÙÙÚÙÛÙÜÙÝÙÞÙßÙàÙáÙâÙãÙäÙåÙæÙçÙèÙéÙêÙëÙìÙíÙîÙïÙðÙñÙòÙóÙôÙõÙöÙ÷ÙøÙùÙúÙûÙüÙýÙþÙÿÙÚÚÚÚÚÚÚÚÚ Ú Ú Ú Ú ÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚ Ú!Ú"Ú#Ú$Ú%Ú&Ú'Ú(Ú)Ú*Ú+Ú,Ú-Ú.Ú/Ú0Ú1Ú2Ú3Ú4Ú5Ú6Ú7Ú8Ú9Ú:Ú;Ú<Ú=Ú>Ú?Ú@Ú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Ú[Ú\Ú]Ú^Ú_Ú`Ú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Ú{Ú|Ú}Ú~ÚÚ€ÚÚ‚ÚƒÚ„Ú…Ú†Ú‡ÚˆÚ‰ÚŠÚ‹ÚŒÚÚŽÚÚÚ‘Ú’Ú“Ú”Ú•Ú–Ú—Ú˜Ú™ÚšÚ›ÚœÚÚžÚŸÚ Ú¡Ú¢Ú£Ú¤Ú¥Ú¦Ú§Ú¨Ú©ÚªÚ«Ú¬Ú­Ú®Ú¯Ú°Ú±Ú²Ú³Ú´ÚµÚ¶Ú·Ú¸Ú¹ÚºÚ»Ú¼Ú½Ú¾Ú¿ÚÀÚÁÚÂÚÃÚÄÚÅÚÆÚÇÚÈÚÉÚÊÚËÚÌÚÍÚÎÚÏÚÐÚÑÚÒÚÓÚÔÚÕÚÖÚ×ÚØÚÙÚÚÚÛÚÜÚÝÚÞÚßÚàÚáÚâÚãÚäÚåÚæÚçÚèÚéÚêÚëÚìÚíÚîÚïÚðÚñÚòÚóÚôÚõÚöÚ÷ÚøÚùÚúÚûÚüÚýÚþÚÿÚÛÛÛÛÛÛÛÛÛ Û Û Û Û ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ Û!Û"Û#Û$Û%Û&Û'Û(Û)Û*Û+Û,Û-Û.Û/Û0Û1Û2Û3Û4Û5Û6Û7Û8Û9Û:Û;Û<Û=Û>Û?Û@Û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Û[Û\Û]Û^Û_Û`Û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Û{Û|Û}Û~ÛÛ€ÛÛ‚ÛƒÛ„Û…Û†Û‡ÛˆÛ‰ÛŠÛ‹ÛŒÛÛŽÛÛÛ‘Û’Û“Û”Û•Û–Û—Û˜Û™ÛšÛ›ÛœÛÛžÛŸÛ Û¡Û¢Û£Û¤Û¥Û¦Û§Û¨Û©ÛªÛ«Û¬Û­Û®Û¯Û°Û±Û²Û³Û´ÛµÛ¶Û·Û¸Û¹ÛºÛ»Û¼Û½Û¾Û¿ÛÀÛÁÛÂÛÃÛÄÛÅÛÆÛÇÛÈÛÉÛÊÛËÛÌÛÍÛÎÛÏÛÐÛÑÛÒÛÓÛÔÛÕÛÖÛ×ÛØÛÙÛÚÛÛÛÜÛÝÛÞÛßÛàÛáÛâÛãÛäÛåÛæÛçÛèÛéÛêÛëÛìÛíÛîÛïÛðÛñÛòÛóÛôÛõÛöÛ÷ÛøÛùÛúÛûÛüÛýÛþÛÿÛÜÜÜÜÜÜÜÜÜ Ü Ü Ü Ü ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ Ü!Ü"Ü#Ü$Ü%Ü&Ü'Ü(Ü)Ü*Ü+Ü,Ü-Ü.Ü/Ü0Ü1Ü2Ü3Ü4Ü5Ü6Ü7Ü8Ü9Ü:Ü;Ü<Ü=Ü>Ü?Ü@Ü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Ü[Ü\Ü]Ü^Ü_Ü`Ü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Ü{Ü|Ü}Ü~ÜÜ€Ü܂܃܄܅܆܇܈܉܊܋܌ÜÜŽÜÜܑܒܓܔܕܖܗܘܙܚܛܜÜܞܟܠܡܢܣܤܥܦܧܨܩܪܫܬܭܮܯܱܴܷܸܹܻܼܾܰܲܳܵܶܺܽܿÜÀÜÁÜÂÜÃÜÄÜÅÜÆÜÇÜÈÜÉÜÊÜËÜÌÜÍÜÎÜÏÜÐÜÑÜÒÜÓÜÔÜÕÜÖÜ×ÜØÜÙÜÚÜÛÜÜÜÝÜÞÜßÜàÜáÜâÜãÜäÜåÜæÜçÜèÜéÜêÜëÜìÜíÜîÜïÜðÜñÜòÜóÜôÜõÜöÜ÷ÜøÜùÜúÜûÜüÜýÜþÜÿÜÝÝÝÝÝÝÝÝÝ Ý Ý Ý Ý ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ Ý!Ý"Ý#Ý$Ý%Ý&Ý'Ý(Ý)Ý*Ý+Ý,Ý-Ý.Ý/Ý0Ý1Ý2Ý3Ý4Ý5Ý6Ý7Ý8Ý9Ý:Ý;Ý<Ý=Ý>Ý?Ý@Ý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Ý[Ý\Ý]Ý^Ý_Ý`Ý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Ý{Ý|Ý}Ý~ÝÝ€Ý݂݄݆݈݃݅݇݉݊݋݌ÝÝŽÝÝݑݒݓݔݕݖݗݘݙݚݛݜÝݞݟݠݡݢݣݤݥݦݧݨݩݪݫݬݭݮݯݰݱݲݳݴݵݶݷݸݹݺݻݼݽݾݿÝÀÝÁÝÂÝÃÝÄÝÅÝÆÝÇÝÈÝÉÝÊÝËÝÌÝÍÝÎÝÏÝÐÝÑÝÒÝÓÝÔÝÕÝÖÝ×ÝØÝÙÝÚÝÛÝÜÝÝÝÞÝßÝàÝáÝâÝãÝäÝåÝæÝçÝèÝéÝêÝëÝìÝíÝîÝïÝðÝñÝòÝóÝôÝõÝöÝ÷ÝøÝùÝúÝûÝüÝýÝþÝÿÝÞÞÞÞÞÞÞÞÞ Þ Þ Þ Þ ÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞ Þ!Þ"Þ#Þ$Þ%Þ&Þ'Þ(Þ)Þ*Þ+Þ,Þ-Þ.Þ/Þ0Þ1Þ2Þ3Þ4Þ5Þ6Þ7Þ8Þ9Þ:Þ;Þ<Þ=Þ>Þ?Þ@Þ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Þ[Þ\Þ]Þ^Þ_Þ`Þ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Þ{Þ|Þ}Þ~ÞÞ€ÞÞ‚ÞƒÞ„Þ…Þ†Þ‡ÞˆÞ‰ÞŠÞ‹ÞŒÞÞŽÞÞÞ‘Þ’Þ“Þ”Þ•Þ–Þ—Þ˜Þ™ÞšÞ›ÞœÞÞžÞŸÞ Þ¡Þ¢Þ£Þ¤Þ¥Þ¦Þ§Þ¨Þ©ÞªÞ«Þ¬Þ­Þ®Þ¯Þ°Þ±Þ²Þ³Þ´ÞµÞ¶Þ·Þ¸Þ¹ÞºÞ»Þ¼Þ½Þ¾Þ¿ÞÀÞÁÞÂÞÃÞÄÞÅÞÆÞÇÞÈÞÉÞÊÞËÞÌÞÍÞÎÞÏÞÐÞÑÞÒÞÓÞÔÞÕÞÖÞ×ÞØÞÙÞÚÞÛÞÜÞÝÞÞÞßÞàÞáÞâÞãÞäÞåÞæÞçÞèÞéÞêÞëÞìÞíÞîÞïÞðÞñÞòÞóÞôÞõÞöÞ÷ÞøÞùÞúÞûÞüÞýÞþÞÿÞßßßßßßßßß ß ß ß ß ßßßßßßßßßßßßßßßßßßß ß!ß"ß#ß$ß%ß&ß'ß(ß)ß*ß+ß,ß-ß.ß/ß0ß1ß2ß3ß4ß5ß6ß7ß8ß9ß:ß;ß<ß=ß>ß?ß@ß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ß[ß\ß]ß^ß_ß`ß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ß{ß|ß}ß~ß߀ß߂߃߄߅߆߇߈߉ߊߋߌßߎßßߑߒߓߔߕߖߗߘߙߚߛߜßߞߟߠߡߢߣߤߥߦߧߨߩߪ߲߫߬߭߮߯߰߱߳ߴߵ߶߷߸߹ߺ߻߼߽߾߿ßÀßÁßÂßÃßÄßÅ߯ßÇßÈßÉßÊßËßÌßÍßÎßÏßÐßÑßÒßÓßÔßÕßÖß×ߨßÙßÚßÛßÜßÝßÞßßßàßáßâßãßäßåßæßçßèßéßêßëßìßíßîßïßðßñßòßóßôßõßöß÷ßøßùßúßûßüßýßþßÿßààààààààà à à à à ààààààààààààààààààà à!à"à#à$à%à&à'à(à)à*à+à,à-à.à/à0à1à2à3à4à5à6à7à8à9à:à;à<à=à>à?à@à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à[à\à]à^à_à`à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à{à|à}à~àà€àà‚àƒà„à…à†à‡àˆà‰àŠà‹àŒààŽààà‘à’à“à”à•à–à—à˜à™àšà›àœààžàŸà à¡à¢à£à¤à¥à¦à§à¨à©àªà«à¬à­à®à¯à°à±à²à³à´àµà¶à·à¸à¹àºà»à¼à½à¾à¿àÀàÁàÂàÃàÄàÅàÆàÇàÈàÉàÊàËàÌàÍàÎàÏàÐàÑàÒàÓàÔàÕàÖà×àØàÙàÚàÛàÜàÝàÞàßàààáàâàãàäàåàæàçàèàéàêàëàìàíàîàïàðàñàòàóàôàõàöà÷àøàùàúàûàüàýàþàÿàááááááááá á á á á ááááááááááááááááááá á!á"á#á$á%á&á'á(á)á*á+á,á-á.á/á0á1á2á3á4á5á6á7á8á9á:á;á<á=á>á?á@á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á[á\á]á^á_á`á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á{á|á}á~áá€áá‚áƒá„á…á†á‡áˆá‰áŠá‹áŒááŽááá‘á’á“á”á•á–á—á˜á™ášá›áœáážáŸá á¡á¢á£á¤á¥á¦á§á¨á©áªá«á¬á­á®á¯á°á±á²á³á´áµá¶á·á¸á¹áºá»á¼á½á¾á¿áÀáÁáÂáÃáÄáÅáÆáÇáÈáÉáÊáËáÌáÍáÎáÏáÐáÑáÒáÓáÔáÕáÖá×áØáÙáÚáÛáÜáÝáÞáßáàáááâáãáäáåáæáçáèáéáêáëáìáíáîáïáðáñáòáóáôáõáöá÷áøáùáúáûáüáýáþáÿáâââââââââ â â â â âââââââââââââââââââ â!â"â#â$â%â&â'â(â)â*â+â,â-â.â/â0â1â2â3â4â5â6â7â8â9â:â;â<â=â>â?â@â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â[â\â]â^â_â`â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â{â|â}â~ââ€ââ‚âƒâ„â…â†â‡âˆâ‰âŠâ‹âŒââŽâââ‘â’â“â”â•â–â—â˜â™âšâ›âœââžâŸâ â¡â¢â£â¤â¥â¦â§â¨â©âªâ«â¬â­â®â¯â°â±â²â³â´âµâ¶â·â¸â¹âºâ»â¼â½â¾â¿âÀâÁâÂâÃâÄâÅâÆâÇâÈâÉâÊâËâÌâÍâÎâÏâÐâÑâÒâÓâÔâÕâÖâ×âØâÙâÚâÛâÜâÝâÞâßâàâáâââãâäâåâæâçâèâéâêâëâìâíâîâïâðâñâòâóâôâõâöâ÷âøâùâúâûâüâýâþâÿâããããããããã ã ã ã ã ããããããããããããããããããã ã!ã"ã#ã$ã%ã&ã'ã(ã)ã*ã+ã,ã-ã.ã/ã0ã1ã2ã3ã4ã5ã6ã7ã8ã9ã:ã;ã<ã=ã>ã?ã@ã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ã[ã\ã]ã^ã_ã`ã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ã{ã|ã}ã~ãã€ãã‚ãƒã„ã…ã†ã‡ãˆã‰ãŠã‹ãŒããŽããã‘ã’ã“ã”ã•ã–ã—ã˜ã™ãšã›ãœããžãŸã ã¡ã¢ã£ã¤ã¥ã¦ã§ã¨ã©ãªã«ã¬ã­ã®ã¯ã°ã±ã²ã³ã´ãµã¶ã·ã¸ã¹ãºã»ã¼ã½ã¾ã¿ãÀãÁãÂãÃãÄãÅãÆãÇãÈãÉãÊãËãÌãÍãÎãÏãÐãÑãÒãÓãÔãÕãÖã×ãØãÙãÚãÛãÜãÝãÞãßãàãáãâãããäãåãæãçãèãéãêãëãìãíãîãïãðãñãòãóãôãõãöã÷ãøãùãúãûãüãýãþãÿãäääääääää ä ä ä ä äääääääääääääääääää ä!ä"ä#ä$ä%ä&ä'ä(ä)ä*ä+ä,ä-ä.ä/ä0ä1ä2ä3ä4ä5ä6ä7ä8ä9ä:ä;ä<ä=ä>ä?ä@ä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ä[ä\ä]ä^ä_ä`ä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ä{ä|ä}ä~ää€ää‚äƒä„ä…ä†ä‡äˆä‰äŠä‹äŒääŽäää‘ä’ä“ä”ä•ä–ä—ä˜ä™äšä›äœääžäŸä ä¡ä¢ä£ä¤ä¥ä¦ä§ä¨ä©äªä«ä¬ä­ä®ä¯ä°ä±ä²ä³ä´äµä¶ä·ä¸ä¹äºä»ä¼ä½ä¾ä¿äÀäÁäÂäÃäÄäÅäÆäÇäÈäÉäÊäËäÌäÍäÎäÏäÐäÑäÒäÓäÔäÕäÖä×äØäÙäÚäÛäÜäÝäÞäßäàäáäâäãäääåäæäçäèäéäêäëäìäíäîäïäðäñäòäóäôäõäöä÷äøäùäúäûäüäýäþäÿäååååååååå å å å å ååååååååååååååååååå å!å"å#å$å%å&å'å(å)å*å+å,å-å.å/å0å1å2å3å4å5å6å7å8å9å:å;å<å=å>å?å@å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å[å\å]å^å_å`å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å{å|å}å~åå€åå‚åƒå„å…å†å‡åˆå‰åŠå‹åŒååŽååå‘å’å“å”å•å–å—å˜å™åšå›åœååžåŸå å¡å¢å£å¤å¥å¦å§å¨å©åªå«å¬å­å®å¯å°å±å²å³å´åµå¶å·å¸å¹åºå»å¼å½å¾å¿åÀåÁåÂåÃåÄåÅåÆåÇåÈåÉåÊåËåÌåÍåÎåÏåÐåÑåÒåÓåÔåÕåÖå×åØåÙåÚåÛåÜåÝåÞåßåàåáåâåãåäåååæåçåèåéåêåëåìåíåîåïåðåñåòåóåôåõåöå÷åøåùåúåûåüåýåþåÿåæææææææææ æ æ æ æ æææææææææææææææææææ æ!æ"æ#æ$æ%æ&æ'æ(æ)æ*æ+æ,æ-æ.æ/æ0æ1æ2æ3æ4æ5æ6æ7æ8æ9æ:æ;æ<æ=æ>æ?æ@æ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æ[æ\æ]æ^æ_æ`æ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æ{æ|æ}æ~ææ€ææ‚æƒæ„æ…æ†æ‡æˆæ‰æŠæ‹æŒææŽæææ‘æ’æ“æ”æ•æ–æ—æ˜æ™æšæ›æœææžæŸæ æ¡æ¢æ£æ¤æ¥æ¦æ§æ¨æ©æªæ«æ¬æ­æ®æ¯æ°æ±æ²æ³æ´æµæ¶æ·æ¸æ¹æºæ»æ¼æ½æ¾æ¿æÀæÁæÂæÃæÄæÅæÆæÇæÈæÉæÊæËæÌæÍæÎæÏæÐæÑæÒæÓæÔæÕæÖæ×æØæÙæÚæÛæÜæÝæÞæßæàæáæâæãæäæåæææçæèæéæêæëæìæíæîæïæðæñæòæóæôæõæöæ÷æøæùæúæûæüæýæþæÿæççççççççç ç ç ç ç ççççççççççççççççççç ç!ç"ç#ç$ç%ç&ç'ç(ç)ç*ç+ç,ç-ç.ç/ç0ç1ç2ç3ç4ç5ç6ç7ç8ç9ç:ç;ç<ç=ç>ç?ç@ç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ç[ç\ç]ç^ç_ç`ç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ç{ç|ç}ç~çç€çç‚çƒç„ç…ç†ç‡çˆç‰çŠç‹çŒççŽççç‘ç’ç“ç”ç•ç–ç—ç˜ç™çšç›çœççžçŸç ç¡ç¢ç£ç¤ç¥ç¦ç§ç¨ç©çªç«ç¬ç­ç®ç¯ç°ç±ç²ç³ç´çµç¶ç·ç¸ç¹çºç»ç¼ç½ç¾ç¿çÀçÁçÂçÃçÄçÅçÆçÇçÈçÉçÊçËçÌçÍçÎçÏçÐçÑçÒçÓçÔçÕçÖç×çØçÙçÚçÛçÜçÝçÞçßçàçáçâçãçäçåçæçççèçéçêçëçìçíçîçïçðçñçòçóçôçõçöç÷çøçùçúçûçüçýçþçÿçèèèèèèèèè è è è è èèèèèèèèèèèèèèèèèèè è!è"è#è$è%è&è'è(è)è*è+è,è-è.è/è0è1è2è3è4è5è6è7è8è9è:è;è<è=è>è?è@è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è[è\è]è^è_è`è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è{è|è}è~èè€èè‚èƒè„è…è†è‡èˆè‰èŠè‹èŒèèŽèèè‘è’è“è”è•è–è—è˜è™èšè›èœèèžèŸè è¡è¢è£è¤è¥è¦è§è¨è©èªè«è¬è­è®è¯è°è±è²è³è´èµè¶è·è¸è¹èºè»è¼è½è¾è¿èÀèÁèÂèÃèÄèÅèÆèÇèÈèÉèÊèËèÌèÍèÎèÏèÐèÑèÒèÓèÔèÕèÖè×èØèÙèÚèÛèÜèÝèÞèßèàèáèâèãèäèåèæèçèèèéèêèëèìèíèîèïèðèñèòèóèôèõèöè÷èøèùèúèûèüèýèþèÿèééééééééé é é é é ééééééééééééééééééé é!é"é#é$é%é&é'é(é)é*é+é,é-é.é/é0é1é2é3é4é5é6é7é8é9é:é;é<é=é>é?é@é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é[é\é]é^é_é`é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é{é|é}é~éé€éé‚éƒé„é…é†é‡éˆé‰éŠé‹éŒééŽééé‘é’é“é”é•é–é—é˜é™éšé›éœééžéŸé é¡é¢é£é¤é¥é¦é§é¨é©éªé«é¬é­é®é¯é°é±é²é³é´éµé¶é·é¸é¹éºé»é¼é½é¾é¿éÀéÁéÂéÃéÄéÅéÆéÇéÈéÉéÊéËéÌéÍéÎéÏéÐéÑéÒéÓéÔéÕéÖé×éØéÙéÚéÛéÜéÝéÞéßéàéáéâéãéäéåéæéçéèéééêéëéìéíéîéïéðéñéòéóéôéõéöé÷éøéùéúéûéüéýéþéÿéêêêêêêêêê ê ê ê ê êêêêêêêêêêêêêêêêêêê ê!ê"ê#ê$ê%ê&ê'ê(ê)ê*ê+ê,ê-ê.ê/ê0ê1ê2ê3ê4ê5ê6ê7ê8ê9ê:ê;ê<ê=ê>ê?ê@ê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ê[ê\ê]ê^ê_ê`ê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ê{ê|ê}ê~êê€êê‚êƒê„ê…ê†ê‡êˆê‰êŠê‹êŒêêŽêêê‘ê’ê“ê”ê•ê–ê—ê˜ê™êšê›êœêêžêŸê ê¡ê¢ê£ê¤ê¥ê¦ê§ê¨ê©êªê«ê¬ê­ê®ê¯ê°ê±ê²ê³ê´êµê¶ê·ê¸ê¹êºê»ê¼ê½ê¾ê¿êÀêÁêÂêÃêÄêÅêÆêÇêÈêÉêÊêËêÌêÍêÎêÏêÐêÑêÒêÓêÔêÕêÖê×êØêÙêÚêÛêÜêÝêÞêßêàêáêâêãêäêåêæêçêèêéêêêëêìêíêîêïêðêñêòêóêôêõêöê÷êøêùêúêûêüêýêþêÿêëëëëëëëëë ë ë ë ë ëëëëëëëëëëëëëëëëëëë ë!ë"ë#ë$ë%ë&ë'ë(ë)ë*ë+ë,ë-ë.ë/ë0ë1ë2ë3ë4ë5ë6ë7ë8ë9ë:ë;ë<ë=ë>ë?ë@ë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ë[ë\ë]ë^ë_ë`ë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ë{ë|ë}ë~ëë€ëë‚ëƒë„ë…ë†ë‡ëˆë‰ëŠë‹ëŒëëŽëëë‘ë’ë“ë”ë•ë–ë—ë˜ë™ëšë›ëœëëžëŸë ë¡ë¢ë£ë¤ë¥ë¦ë§ë¨ë©ëªë«ë¬ë­ë®ë¯ë°ë±ë²ë³ë´ëµë¶ë·ë¸ë¹ëºë»ë¼ë½ë¾ë¿ëÀëÁëÂëÃëÄëÅëÆëÇëÈëÉëÊëËëÌëÍëÎëÏëÐëÑëÒëÓëÔëÕëÖë×ëØëÙëÚëÛëÜëÝëÞëßëàëáëâëãëäëåëæëçëèëéëêëëëìëíëîëïëðëñëòëóëôëõëöë÷ëøëùëúëûëüëýëþëÿëììììììììì ì ì ì ì ììììììììììììììììììì ì!ì"ì#ì$ì%ì&ì'ì(ì)ì*ì+ì,ì-ì.ì/ì0ì1ì2ì3ì4ì5ì6ì7ì8ì9ì:ì;ì<ì=ì>ì?ì@ì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ì[ì\ì]ì^ì_ì`ì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ì{ì|ì}ì~ìì€ìì‚ìƒì„ì…ì†ì‡ìˆì‰ìŠì‹ìŒììŽììì‘ì’ì“ì”ì•ì–ì—ì˜ì™ìšì›ìœììžìŸì ì¡ì¢ì£ì¤ì¥ì¦ì§ì¨ì©ìªì«ì¬ì­ì®ì¯ì°ì±ì²ì³ì´ìµì¶ì·ì¸ì¹ìºì»ì¼ì½ì¾ì¿ìÀìÁìÂìÃìÄìÅìÆìÇìÈìÉìÊìËìÌìÍìÎìÏìÐìÑìÒìÓìÔìÕìÖì×ìØìÙìÚìÛìÜìÝìÞìßìàìáìâìãìäìåìæìçìèìéìêìëìììíìîìïìðìñìòìóìôìõìöì÷ìøìùìúìûìüìýìþìÿìííííííííí í í í í ííííííííííííííííííí í!í"í#í$í%í&í'í(í)í*í+í,í-í.í/í0í1í2í3í4í5í6í7í8í9í:í;í<í=í>í?í@í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í[í\í]í^í_í`í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í{í|í}í~íí€íí‚íƒí„í…í†í‡íˆí‰íŠí‹íŒííŽííí‘í’í“í”í•í–í—í˜í™íší›íœíížíŸí í¡í¢í£í¤í¥í¦í§í¨í©íªí«í¬í­í®í¯í°í±í²í³í´íµí¶í·í¸í¹íºí»í¼í½í¾í¿íÀíÁíÂíÃíÄíÅíÆíÇíÈíÉíÊíËíÌíÍíÎíÏíÐíÑíÒíÓíÔíÕíÖí×íØíÙíÚíÛíÜíÝíÞíßíàíáíâíãíäíåíæíçíèíéíêíëíìíííîíïíðíñíòíóíôíõíöí÷íøíùíúíûíüíýíþíÿíîîîîîîîîî î î î î îîîîîîîîîîîîîîîîîîî î!î"î#î$î%î&î'î(î)î*î+î,î-î.î/î0î1î2î3î4î5î6î7î8î9î:î;î<î=î>î?î@î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î[î\î]î^î_î`î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î{î|î}î~îî€îî‚îƒî„î…î†î‡îˆî‰îŠî‹îŒîîŽîîî‘î’î“î”î•î–î—î˜î™îšî›îœîîžîŸî î¡î¢î£î¤î¥î¦î§î¨î©îªî«î¬î­î®î¯î°î±î²î³î´îµî¶î·î¸î¹îºî»î¼î½î¾î¿îÀîÁîÂîÃîÄîÅîÆîÇîÈîÉîÊîËîÌîÍîÎîÏîÐîÑîÒîÓîÔîÕîÖî×îØîÙîÚîÛîÜîÝîÞîßîàîáîâîãîäîåîæîçîèîéîêîëîìîíîîîïîðîñîòîóîôîõîöî÷îøîùîúîûîüîýîþîÿîïïïïïïïïï ï ï ï ï ïïïïïïïïïïïïïïïïïïï ï!ï"ï#ï$ï%ï&ï'ï(ï)ï*ï+ï,ï-ï.ï/ï0ï1ï2ï3ï4ï5ï6ï7ï8ï9ï:ï;ï<ï=ï>ï?ï@ï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ï[ï\ï]ï^ï_ï`ï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ï{ï|ï}ï~ïï€ïï‚ïƒï„ï…ï†ï‡ïˆï‰ïŠï‹ïŒïïŽïïï‘ï’ï“ï”ï•ï–ï—ï˜ï™ïšï›ïœïïžïŸï ï¡ï¢ï£ï¤ï¥ï¦ï§ï¨ï©ïªï«ï¬ï­ï®ï¯ï°ï±ï²ï³ï´ïµï¶ï·ï¸ï¹ïºï»ï¼ï½ï¾ï¿ïÀïÁïÂïÃïÄïÅïÆïÇïÈïÉïÊïËïÌïÍïÎïÏïÐïÑïÒïÓïÔïÕïÖï×ïØïÙïÚïÛïÜïÝïÞïßïàïáïâïãïäïåïæïçïèïéïêïëïìïíïîïïïðïñïòïóïôïõïöï÷ïøïùïúïûïüïýïþïÿïððððððððð ð ð ð ð ððððððððððððððððððð ð!ð"ð#ð$ð%ð&ð'ð(ð)ð*ð+ð,ð-ð.ð/ð0ð1ð2ð3ð4ð5ð6ð7ð8ð9ð:ð;ð<ð=ð>ð?ð@ð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ð[ð\ð]ð^ð_ð`ð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ð{ð|ð}ð~ðð€ðð‚ðƒð„ð…ð†ð‡ðˆð‰ðŠð‹ðŒððŽððð‘ð’ð“ð”ð•ð–ð—ð˜ð™ðšð›ðœððžðŸð ð¡ð¢ð£ð¤ð¥ð¦ð§ð¨ð©ðªð«ð¬ð­ð®ð¯ð°ð±ð²ð³ð´ðµð¶ð·ð¸ð¹ðºð»ð¼ð½ð¾ð¿ðÀðÁðÂðÃðÄðÅðÆðÇðÈðÉðÊðËðÌðÍðÎðÏðÐðÑðÒðÓðÔðÕðÖð×ðØðÙðÚðÛðÜðÝðÞðßðàðáðâðãðäðåðæðçðèðéðêðëðìðíðîðïðððñðòðóðôðõðöð÷ðøðùðúðûðüðýðþðÿðñññññññññ ñ ñ ñ ñ ñññññññññññññññññññ ñ!ñ"ñ#ñ$ñ%ñ&ñ'ñ(ñ)ñ*ñ+ñ,ñ-ñ.ñ/ñ0ñ1ñ2ñ3ñ4ñ5ñ6ñ7ñ8ñ9ñ:ñ;ñ<ñ=ñ>ñ?ñ@ñ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ñ[ñ\ñ]ñ^ñ_ñ`ñ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ñ{ñ|ñ}ñ~ññ€ññ‚ñƒñ„ñ…ñ†ñ‡ñˆñ‰ñŠñ‹ñŒññŽñññ‘ñ’ñ“ñ”ñ•ñ–ñ—ñ˜ñ™ñšñ›ñœññžñŸñ ñ¡ñ¢ñ£ñ¤ñ¥ñ¦ñ§ñ¨ñ©ñªñ«ñ¬ñ­ñ®ñ¯ñ°ñ±ñ²ñ³ñ´ñµñ¶ñ·ñ¸ñ¹ñºñ»ñ¼ñ½ñ¾ñ¿ñÀñÁñÂñÃñÄñÅñÆñÇñÈñÉñÊñËñÌñÍñÎñÏñÐñÑñÒñÓñÔñÕñÖñ×ñØñÙñÚñÛñÜñÝñÞñßñàñáñâñãñäñåñæñçñèñéñêñëñìñíñîñïñðñññòñóñôñõñöñ÷ñøñùñúñûñüñýñþñÿñòòòòòòòòò ò ò ò ò òòòòòòòòòòòòòòòòòòò ò!ò"ò#ò$ò%ò&ò'ò(ò)ò*ò+ò,ò-ò.ò/ò0ò1ò2ò3ò4ò5ò6ò7ò8ò9ò:ò;ò<ò=ò>ò?ò@ò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ò[ò\ò]ò^ò_ò`ò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ò{ò|ò}ò~òò€òò‚òƒò„ò…ò†ò‡òˆò‰òŠò‹òŒòòŽòòò‘ò’ò“ò”ò•ò–ò—ò˜ò™òšò›òœòòžòŸò ò¡ò¢ò£ò¤ò¥ò¦ò§ò¨ò©òªò«ò¬ò­ò®ò¯ò°ò±ò²ò³ò´òµò¶ò·ò¸ò¹òºò»ò¼ò½ò¾ò¿òÀòÁòÂòÃòÄòÅòÆòÇòÈòÉòÊòËòÌòÍòÎòÏòÐòÑòÒòÓòÔòÕòÖò×òØòÙòÚòÛòÜòÝòÞòßòàòáòâòãòäòåòæòçòèòéòêòëòìòíòîòïòðòñòòòóòôòõòöò÷òøòùòúòûòüòýòþòÿòóóóóóóóóó ó ó ó ó óóóóóóóóóóóóóóóóóóó ó!ó"ó#ó$ó%ó&ó'ó(ó)ó*ó+ó,ó-ó.ó/ó0ó1ó2ó3ó4ó5ó6ó7ó8ó9ó:ó;ó<ó=ó>ó?ó@ó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ó[ó\ó]ó^ó_ó`ó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ó{ó|ó}ó~óó€óó‚óƒó„ó…ó†ó‡óˆó‰óŠó‹óŒóóŽóóó‘ó’ó“ó”ó•ó–ó—ó˜ó™óšó›óœóóžóŸó ó¡ó¢ó£ó¤ó¥ó¦ó§ó¨ó©óªó«ó¬ó­ó®ó¯ó°ó±ó²ó³ó´óµó¶ó·ó¸ó¹óºó»ó¼ó½ó¾ó¿óÀóÁóÂóÃóÄóÅóÆóÇóÈóÉóÊóËóÌóÍóÎóÏóÐóÑóÒóÓóÔóÕóÖó×óØóÙóÚóÛóÜóÝóÞóßóàóáóâóãóäóåóæóçóèóéóêóëóìóíóîóïóðóñóòóóóôóõóöó÷óøóùóúóûóüóýóþóÿóôôôôôôôôô ô ô ô ô ôôôôôôôôôôôôôôôôôôô ô!ô"ô#ô$ô%ô&ô'ô(ô)ô*ô+ô,ô-ô.ô/ô0ô1ô2ô3ô4ô5ô6ô7ô8ô9ô:ô;ô<ô=ô>ô?ô@ô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ô[ô\ô]ô^ô_ô`ô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ô{ô|ô}ô~ôô€ôô‚ôƒô„ô…ô†ô‡ôˆô‰ôŠô‹ôŒôôŽôôô‘ô’ô“ô”ô•ô–ô—ô˜ô™ôšô›ôœôôžôŸô ô¡ô¢ô£ô¤ô¥ô¦ô§ô¨ô©ôªô«ô¬ô­ô®ô¯ô°ô±ô²ô³ô´ôµô¶ô·ô¸ô¹ôºô»ô¼ô½ô¾ô¿ôÀôÁôÂôÃôÄôÅôÆôÇôÈôÉôÊôËôÌôÍôÎôÏôÐôÑôÒôÓôÔôÕôÖô×ôØôÙôÚôÛôÜôÝôÞôßôàôáôâôãôäôåôæôçôèôéôêôëôìôíôîôïôðôñôòôóôôôõôöô÷ôøôùôúôûôüôýôþôÿôõõõõõõõõõ õ õ õ õ õõõõõõõõõõõõõõõõõõõ õ!õ"õ#õ$õ%õ&õ'õ(õ)õ*õ+õ,õ-õ.õ/õ0õ1õ2õ3õ4õ5õ6õ7õ8õ9õ:õ;õ<õ=õ>õ?õ@õ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õ[õ\õ]õ^õ_õ`õ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õ{õ|õ}õ~õõ€õõ‚õƒõ„õ…õ†õ‡õˆõ‰õŠõ‹õŒõõŽõõõ‘õ’õ“õ”õ•õ–õ—õ˜õ™õšõ›õœõõžõŸõ õ¡õ¢õ£õ¤õ¥õ¦õ§õ¨õ©õªõ«õ¬õ­õ®õ¯õ°õ±õ²õ³õ´õµõ¶õ·õ¸õ¹õºõ»õ¼õ½õ¾õ¿õÀõÁõÂõÃõÄõÅõÆõÇõÈõÉõÊõËõÌõÍõÎõÏõÐõÑõÒõÓõÔõÕõÖõ×õØõÙõÚõÛõÜõÝõÞõßõàõáõâõãõäõåõæõçõèõéõêõëõìõíõîõïõðõñõòõóõôõõõöõ÷õøõùõúõûõüõýõþõÿõööööööööö ö ö ö ö ööööööööööööööööööö ö!ö"ö#ö$ö%ö&ö'ö(ö)ö*ö+ö,ö-ö.ö/ö0ö1ö2ö3ö4ö5ö6ö7ö8ö9ö:ö;ö<ö=ö>ö?ö@ö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ö[ö\ö]ö^ö_ö`ö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ö{ö|ö}ö~öö€öö‚öƒö„ö…ö†ö‡öˆö‰öŠö‹öŒööŽööö‘ö’ö“ö”ö•ö–ö—ö˜ö™öšö›öœööžöŸö ö¡ö¢ö£ö¤ö¥ö¦ö§ö¨ö©öªö«ö¬ö­ö®ö¯ö°ö±ö²ö³ö´öµö¶ö·ö¸ö¹öºö»ö¼ö½ö¾ö¿öÀöÁöÂöÃöÄöÅöÆöÇöÈöÉöÊöËöÌöÍöÎöÏöÐöÑöÒöÓöÔöÕöÖö×öØöÙöÚöÛöÜöÝöÞößöàöáöâöãöäöåöæöçöèöéöêöëöìöíöîöïöðöñöòöóöôöõööö÷öøöùöúöûöüöýöþöÿö÷÷÷÷÷÷÷÷÷ ÷ ÷ ÷ ÷ ÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷ ÷!÷"÷#÷$÷%÷&÷'÷(÷)÷*÷+÷,÷-÷.÷/÷0÷1÷2÷3÷4÷5÷6÷7÷8÷9÷:÷;÷<÷=÷>÷?÷@÷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÷[÷\÷]÷^÷_÷`÷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÷{÷|÷}÷~÷÷€÷÷‚÷ƒ÷„÷…÷†÷‡÷ˆ÷‰÷Š÷‹÷Œ÷÷Ž÷÷÷‘÷’÷“÷”÷•÷–÷—÷˜÷™÷š÷›÷œ÷÷ž÷Ÿ÷ ÷¡÷¢÷£÷¤÷¥÷¦÷§÷¨÷©÷ª÷«÷¬÷­÷®÷¯÷°÷±÷²÷³÷´÷µ÷¶÷·÷¸÷¹÷º÷»÷¼÷½÷¾÷¿÷À÷Á÷Â÷Ã÷Ä÷Å÷Æ÷Ç÷È÷É÷Ê÷Ë÷Ì÷Í÷Î÷Ï÷Ð÷Ñ÷Ò÷Ó÷Ô÷Õ÷Ö÷×÷Ø÷Ù÷Ú÷Û÷Ü÷Ý÷Þ÷ß÷à÷á÷â÷ã÷ä÷å÷æ÷ç÷è÷é÷ê÷ë÷ì÷í÷î÷ï÷ð÷ñ÷ò÷ó÷ô÷õ÷ö÷÷÷ø÷ù÷ú÷û÷ü÷ý÷þ÷ÿ÷øøøøøøøøø ø ø ø ø øøøøøøøøøøøøøøøøøøø ø!ø"ø#ø$ø%ø&ø'ø(ø)ø*ø+ø,ø-ø.ø/ø0ø1ø2ø3ø4ø5ø6ø7ø8ø9ø:ø;ø<ø=ø>ø?ø@ø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ø[ø\ø]ø^ø_ø`ø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ø{ø|ø}ø~øø€øø‚øƒø„ø…ø†ø‡øˆø‰øŠø‹øŒøøŽøøø‘ø’ø“ø”ø•ø–ø—ø˜ø™øšø›øœøøžøŸø ø¡ø¢ø£ø¤ø¥ø¦ø§ø¨ø©øªø«ø¬ø­ø®ø¯ø°ø±ø²ø³ø´øµø¶ø·ø¸ø¹øºø»ø¼ø½ø¾ø¿øÀøÁøÂøÃøÄøÅøÆøÇøÈøÉøÊøËøÌøÍøÎøÏøÐøÑøÒøÓøÔøÕøÖø×øØøÙøÚøÛøÜøÝøÞøßøàøáøâøãøäøåøæøçøèøéøêøëøìøíøîøïøðøñøòøóøôøõøöø÷øøøùøúøûøüøýøþøÿøùùùùùùùùù ù ù ù ù ùùùùùùùùùùùùùùùùùùù ù!ù"ù#ù$ù%ù&ù'ù(ù)ù*ù+ù,ù-ù.ù/ù0ù1ù2ù3ù4ù5ù6ù7ù8ù9ù:ù;ù<ù=ù>ù?ù@ù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ù[ù\ù]ù^ù_ù`ù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ù{ù|ù}ù~ùù€ùù‚ùƒù„ù…ù†ù‡ùˆù‰ùŠù‹ùŒùùŽùùù‘ù’ù“ù”ù•ù–ù—ù˜ù™ùšù›ùœùùžùŸù ù¡ù¢ù£ù¤ù¥ù¦ù§ù¨ù©ùªù«ù¬ù­ù®ù¯ù°ù±ù²ù³ù´ùµù¶ù·ù¸ù¹ùºù»ù¼ù½ù¾ù¿ùÀùÁùÂùÃùÄùÅùÆùÇùÈùÉùÊùËùÌùÍùÎùÏùÐùÑùÒùÓùÔùÕùÖù×ùØùÙùÚùÛùÜùÝùÞùßùàùáùâùãùäùåùæùçùèùéùêùëùìùíùîùïùðùñùòùóùôùõùöù÷ùøùùùúùûùüùýùþùÿùúúúúúúúúú ú ú ú ú úúúúúúúúúúúúúúúúúúú ú!ú"ú#ú$ú%ú&ú'ú(ú)ú*ú+ú,ú-ú.ú/ú0ú1ú2ú3ú4ú5ú6ú7ú8ú9ú:ú;ú<ú=ú>ú?ú@ú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ú[ú\ú]ú^ú_ú`ú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ú{ú|ú}ú~úú€úú‚úƒú„ú…ú†ú‡úˆú‰úŠú‹úŒúúŽúúú‘ú’ú“ú”ú•ú–ú—ú˜ú™úšú›úœúúžúŸú ú¡ú¢ú£ú¤ú¥ú¦ú§ú¨ú©úªú«ú¬ú­ú®ú¯ú°ú±ú²ú³ú´úµú¶ú·ú¸ú¹úºú»ú¼ú½ú¾ú¿úÀúÁúÂúÃúÄúÅúÆúÇúÈúÉúÊúËúÌúÍúÎúÏúÐúÑúÒúÓúÔúÕúÖú×úØúÙúÚúÛúÜúÝúÞúßúàúáúâúãúäúåúæúçúèúéúêúëúìúíúîúïúðúñúòúóúôúõúöú÷úøúùúúúûúüúýúþúÿúûûûûûûûûû û û û û ûûûûûûûûûûûûûûûûûûû û!û"û#û$û%û&û'û(û)û*û+û,û-û.û/û0û1û2û3û4û5û6û7û8û9û:û;û<û=û>û?û@û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û[û\û]û^û_û`û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û{û|û}û~ûû€ûû‚ûƒû„û…û†û‡ûˆû‰ûŠû‹ûŒûûŽûûû‘û’û“û”û•û–û—û˜û™ûšû›ûœûûžûŸû û¡û¢û£û¤û¥û¦û§û¨û©ûªû«û¬û­û®û¯û°û±û²û³û´ûµû¶û·û¸û¹ûºû»û¼û½û¾û¿ûÀûÁûÂûÃûÄûÅûÆûÇûÈûÉûÊûËûÌûÍûÎûÏûÐûÑûÒûÓûÔûÕûÖû×ûØûÙûÚûÛûÜûÝûÞûßûàûáûâûãûäûåûæûçûèûéûêûëûìûíûîûïûðûñûòûóûôûõûöû÷ûøûùûúûûûüûýûþûÿûüüüüüüüüü ü ü ü ü üüüüüüüüüüüüüüüüüüü ü!ü"ü#ü$ü%ü&ü'ü(ü)ü*ü+ü,ü-ü.ü/ü0ü1ü2ü3ü4ü5ü6ü7ü8ü9ü:ü;ü<ü=ü>ü?ü@ü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ü[ü\ü]ü^ü_ü`ü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ü{ü|ü}ü~üü€üü‚üƒü„ü…ü†ü‡üˆü‰üŠü‹üŒüüŽüüü‘ü’ü“ü”ü•ü–ü—ü˜ü™üšü›üœüüžüŸü ü¡ü¢ü£ü¤ü¥ü¦ü§ü¨ü©üªü«ü¬ü­ü®ü¯ü°ü±ü²ü³ü´üµü¶ü·ü¸ü¹üºü»ü¼ü½ü¾ü¿üÀüÁüÂüÃüÄüÅüÆüÇüÈüÉüÊüËüÌüÍüÎüÏüÐüÑüÒüÓüÔüÕüÖü×üØüÙüÚüÛüÜüÝüÞüßüàüáüâüãüäüåüæüçüèüéüêüëüìüíüîüïüðüñüòüóüôüõüöü÷üøüùüúüûüüüýüþüÿüýýýýýýýýý ý ý ý ý ýýýýýýýýýýýýýýýýýýý ý!ý"ý#ý$ý%ý&ý'ý(ý)ý*ý+ý,ý-ý.ý/ý0ý1ý2ý3ý4ý5ý6ý7ý8ý9ý:ý;ý<ý=ý>ý?ý@ý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ý[ý\ý]ý^ý_ý`ý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ý{ý|ý}ý~ýý€ýý‚ýƒý„ý…ý†ý‡ýˆý‰ýŠý‹ýŒýýŽýýý‘ý’ý“ý”ý•ý–ý—ý˜ý™ýšý›ýœýýžýŸý ý¡ý¢ý£ý¤ý¥ý¦ý§ý¨ý©ýªý«ý¬ý­ý®ý¯ý°ý±ý²ý³ý´ýµý¶ý·ý¸ý¹ýºý»ý¼ý½ý¾ý¿ýÀýÁýÂýÃýÄýÅýÆýÇýÈýÉýÊýËýÌýÍýÎýÏýÐýÑýÒýÓýÔýÕýÖý×ýØýÙýÚýÛýÜýÝýÞýßýàýáýâýãýäýåýæýçýèýéýêýëýìýíýîýïýðýñýòýóýôýõýöý÷ýøýùýúýûýüýýýþýÿýþþþþþþþþþ þ þ þ þ þþþþþþþþþþþþþþþþþþþ þ!þ"þ#þ$þ%þ&þ'þ(þ)þ*þ+þ,þ-þ.þ/þ0þ1þ2þ3þ4þ5þ6þ7þ8þ9þ:þ;þ<þ=þ>þ?þ@þ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þ[þ\þ]þ^þ_þ`þ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þ{þ|þ}þ~þþ€þþ‚þƒþ„þ…þ†þ‡þˆþ‰þŠþ‹þŒþþŽþþþ‘þ’þ“þ”þ•þ–þ—þ˜þ™þšþ›þœþþžþŸþ þ¡þ¢þ£þ¤þ¥þ¦þ§þ¨þ©þªþ«þ¬þ­þ®þ¯þ°þ±þ²þ³þ´þµþ¶þ·þ¸þ¹þºþ»þ¼þ½þ¾þ¿þÀþÁþÂþÃþÄþÅþÆþÇþÈþÉþÊþËþÌþÍþÎþÏþÐþÑþÒþÓþÔþÕþÖþ×þØþÙþÚþÛþÜþÝþÞþßþàþáþâþãþäþåþæþçþèþéþêþëþìþíþîþïþðþñþòþóþôþõþöþ÷þøþùþúþûþüþýþþþÿþÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ!ÿ"ÿ#ÿ$ÿ%ÿ&ÿ'ÿ(ÿ)ÿ*ÿ+ÿ,ÿ-ÿ.ÿ/ÿ0ÿ1ÿ2ÿ3ÿ4ÿ5ÿ6ÿ7ÿ8ÿ9ÿ:ÿ;ÿ<ÿ=ÿ>ÿ?ÿ@ÿ!ÿ"ÿ#ÿ$ÿ%ÿ&ÿ'ÿ(ÿ)ÿ*ÿ+ÿ,ÿ-ÿ.ÿ/ÿ0ÿ1ÿ2ÿ3ÿ4ÿ5ÿ6ÿ7ÿ8ÿ9ÿ:ÿ[ÿ\ÿ]ÿ^ÿ_ÿ`ÿ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ÿ{ÿ|ÿ}ÿ~ÿÿ€ÿÿ‚ÿƒÿ„ÿ…ÿ†ÿ‡ÿˆÿ‰ÿŠÿ‹ÿŒÿÿŽÿÿÿ‘ÿ’ÿ“ÿ”ÿ•ÿ–ÿ—ÿ˜ÿ™ÿšÿ›ÿœÿÿžÿŸÿ ÿ¡ÿ¢ÿ£ÿ¤ÿ¥ÿ¦ÿ§ÿ¨ÿ©ÿªÿ«ÿ¬ÿ­ÿ®ÿ¯ÿ°ÿ±ÿ²ÿ³ÿ´ÿµÿ¶ÿ·ÿ¸ÿ¹ÿºÿ»ÿ¼ÿ½ÿ¾ÿ¿ÿÀÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÐÿÑÿÒÿÓÿÔÿÕÿÖÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿÞÿßÿàÿáÿâÿãÿäÿåÿæÿçÿèÿéÿêÿëÿìÿíÿîÿïÿðÿñÿòÿóÿôÿõÿöÿ÷ÿøÿùÿúÿûÿüÿýÿþÿÿÿFILE08˜`H0hJuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ìll$MFT€H@@0°H@@ÿÿÿÿFILE08X`HuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì0pRuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì$MFTMirr€H@@!ÿÿÿÿÿFILE08X`HuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì0pRuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì$LogFile€H@?@!@ÿÿÿÿFILE08ðH0uÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì0hPuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì$Volume@(Ö¾ù(KŽð ñHAP€d€HT4ŸŸ  `p( €ÿÿÿÿRSTR 0MIMIMIMIMIMIMIMI#ÿÿ0à@p0@жÔû"#ÿÿÿÿNTFS Û˜Ï#m'^ƒ ^ƒ ^ƒ˜(8`8èÈ £n†þ),d“λóÐäлóÐäІþ),d“Î@@ †þ),d“ÎÑO³óÐäÐÑO³óÐäІþ),d“Î@@ @^ƒ'^ƒ'^ƒ˜(8`8è§n†þ),d“λóÐäлóÐäІþ),d“Î@@ †þ),d“ÎÑO³óÐäÐÑO³óÐäІþ),d“Î@@ Y^ƒ@^ƒ@^ƒh ( H gBgB +m`Ð#mÀÐ#m'+m`Ð#m`Ð#m'l^ƒY^ƒY^ƒˆ(`ˆh`=Ò&Qà`ÎK:«|D`Ð#m»óÐäЀ <clienstate.datƒ^ƒl^ƒl^ƒh ( H gBgB +mÀÐ#mÀÐ#m'+m`Ð#mÀÐ#m'–^ƒƒ^ƒƒ^ƒ8(08Xó’S"O`Ð#mÐ#m£^ƒ–^ƒ(((€øÿÿ®^ƒh ( H gBgB +mÀÐ#m Ñ#m'+mÀÐ#mÀÐ#m'Á^ƒ®^ƒ®^ƒˆ(`ˆhÀ=Ò&Qà`ÎK:«|DÀÐ#mña½óÐäÐ <clientstate.datØ^ƒÁ^ƒÁ^ƒh ( H gBgB +m Ñ#m Ñ#m'+mÀÐ#m Ñ#m'ë^ƒØ^ƒ(((0vò€úÿÿö^ƒ€$(X$€$(è¿ÿÿÿÿè0$ÿÿÿÿ€—|>t é= øÿÿÿÿÿÿ «|>t €4 øÿÿÿÿÿÿ€ å|>t@Ï øÿÿÿÿÿÿ ½>tà@ øÿÿÿÿÿÿ€†>tR øÿÿÿÿÿÿ°Ó>t` øÿÿÿÿÿÿ V¡•>tð\{ øÿÿÿÿÿÿ ‹Ÿ—>t`Œ, øÿÿÿÿÿÿ MÕ4‡ž>tÀ„ øÿÿÿÿÿÿ R ¢>tðˆ7 øÿÿÿÿÿÿ Q ô¢>tÀê øÿÿ Ü‡"š4‚ÿÿÿÿ + ¬>t˜† øÿÿÿÿÿÿ€ p·>tЫ øÿÿÿÿÿÿ  ø·>tX øÿÿÿÿÿÿ  "¸>tp§ øÿÿÿÿÿÿ PèÀ>t°4a øÿÿÿÿÿÿ ' OÆ>tÐc øÿÿÿÿÿÿ |5Àå>ttX øÿÿÿÿÿÿ i5-sç>tp¨^ øÿÿÿÿÿÿ ³Âð>tPÅ‹ øÿÿÿÿÿÿ E Öñ>t ¬„ øÿÿÿÿÿÿ Ý {Mt@[Õ øÿÿÿÿÿÿ j5Q?tör øÿÿÿÿÿÿ 6 ¢x°Šn øÿÿÿÿÿÿ {æ ?tj` øÿÿÿÿÿÿ Šì4?t0ÕÀ øÿÿÿÿÿÿ N Ð7?t0„ˆ øÿÿÿÿÿÿ  ’e?t`Åœ øÿÿÿÿÿÿ Q-ag?tð ‚ øÿÿÿÿÿÿ ã‡#?݃p™D øÿÿÿÿÿÿ ˜$Ø€?tмd øÿÿÿÿÿÿ  Œ?tpE› øÿÿÿÿÿÿ â‡$‚ƒPØ! øÿÿÿÿÿÿ ÿ+”?tàt² øÿÿÿÿÿÿ  $ܦ?tà‰ øÿÿÿÿÿÿ ­²?t€W øÿÿÿÿÿÿ  ±Ô?t &7 øÿÿÿÿÿÿ  8w/Ú?t€µ¾ øÿÿÿÿÿÿ aJ@tPú^ øÿÿÿÿÿÿ ›bK@tÐðù  øÿÿÿÿÿÿ ï   øÿÿø ¡!i °T}ÿÿÿÿ çV2½Ú ƒ0óàøÿÿÿÿÿÿ ¼¯ Gt\ øÿÿÿÿÿÿ ž\ƒ›Ht0ú_ øÿÿÿÿÿÿ sFItp8) øÿÿÿÿÿÿ Ê 1LJtPgf øÿÿÿÿÿÿ @ NJtPÖO øÿÿÿÿÿÿ H „Kt ¥ øÿÿÿÿÿÿ /£Kt Œ, øÿÿÿÿÿÿ {5%git0® øÿÿÿÿÿÿ ç _×Ktà„ øÿÿÿÿÿÿ Õ«GLtP"  øÿÿÿÿÿÿ ±rbLtP9 øÿÿÿÿÿÿ Ü}LtðB øÿÿÿÿÿÿ :ÄÏ0ƒd  øÿÿÿÿÿÿ ')¤~'- øÿÿÿÿÿÿ LQlÎu€¾ù øÿÿÿÿÿÿ )5­v: øÿÿÿÿÿÿ t$‚[Ex ©+ øÿÿà  Ôûoam}ÿÿÿÿ ziRStp²Â øÿÿØ  ^–øªT}ÿÿÿÿ ,/(TtP„2 øÿÿÿÿÿÿ ÞTtð7g øÿÿÿÿÿÿ *I?TtìO øÿÿÿÿÿÿ Z|Kç­TtpJ6 øÿÿÿÿÿÿ ïÂTtRƒ øÿÿÿÿÿÿ þÃTt@¨ øÿÿÿÿ è.„sUtÑ øÿÿÿÿÿÿ ŸâjtUt aº øÿÿÿÿÿÿ ›ú m}0Ï øÿÿÿÿÿÿ Ö(ÙUtP¥ øÿÿÿÿÿÿ üB#Vt0Æ øÿÿÿÿÿÿ %LXVt l² øÿÿÿÿÿÿ  é†Vt °¤ øÿÿÿÿÿÿ YÔi} RV øÿÿÿÿÿÿ •ÆZtàåò øÿÿÿÿÿÿ _t@¨ øÿÿ( #&¿›T}Рވaµw‚ÿÿÿÿ ãw_tðG~ øÿÿH ^&Il`tÿÿÿÿ ýŠ"}в£ øÿÿÿÿÿÿ  #='ƒ}Àá øÿÿÿÿÿÿ ¢·Ø|Pö øÿÿÿÿÿÿ S~~Õl}°ŠD øÿÿÿÿÿÿ ñ ½°5}@eñ øÿÿÿÿÿÿ H)…5}€h øÿÿÿÿÿÿ ]~éÔl}+Œ øÿÿÿÿÿÿ ×Ù|0U øÿÿÀ *žg‚<}ÿÿÿÿ šD+*¹0ƒ @” øÿÿÿÿÿÿ çE­0ƒ`<ø øÿÿÿÿÿÿ )| N v`þ+ øÿÿ( ? jxT}ÿÿÿÿ ñ[ò®v}iê øÿÿÈ kR5uT}ÿÿÿÿ å\ Kš~{ðˆt øÿÿÿÿÿÿ zi#Yw Zi øÿÿÿÿÿÿ (af€Ê  øÿÿÿÿÿÿ L Ò—uPþˆ øÿÿÿÿÿÿ Én?/0ƒ@iŽ øÿÿÿÿÿÿ Ì$ –É2ƒÐk[ øÿÿÿÿÿÿ `J0ƒ ùË øÿÿÈ ˜‘!ˆ2ƒÿÿÿÿ ¦ž»‚¬m øÿÿÿÿÿÿ Á‡5]0ƒa¨ øÿÿÿÿÿÿ Æ"ù/ƒp¢ øÿÿX ®‚/‚ÿÿÿÿ \®/ƒuý øÿÿÿÿÿÿ ð[+®/ƒ€%º øÿÿÿÿÿÿ ]X<$ƒ pç øÿÿÿÿÿÿ \Ê6$ƒðH< øÿÿÿÿÿÿ j õ ƒ@gì øÿÿ ¸ ‹{s}p µ³ )mƒÿÿÿÿ ) ÷Ð 3 øÿÿÿÿÿÿ ´&ž|P‰Þ øÿÿ e»ét‚ÿÿÿÿRCRD( @û"pl8Px Èð&"p!!,!b!p!X¦ƒ :"@pl(( H":"(((ð[Ê€úÿÿS"¨(@h@8  1B5ÑäÐ1B5ÑäÐ! "ýÐäÐ ! "ýÐäÐ! "ýÐäÐ! "ýÐäÐ n"S"(((Hy"˜(pl`88  ! "ýÐäÐ1B5ÑäÐ1B5ÑäÐ! "ýÐäÐ ! "ýÐäÐ! "ýÐäÐ! "ýÐäÐ! "ýÐäÐ ’"y"(((€ùÿÿ"¨(@h@8  Ai5ÑäÐAi5ÑäÐ! "ýÐäÐ 1B5ÑäÐ1B5ÑäÐ! "ýÐäÐ ¸""(((plHÃ"˜(8`88  ! "ýÐäÐAi5ÑäÐAi5ÑäÐ! "ýÐäÐ ! "ýÐäÐ1B5ÑäÐ1B5ÑäÐ! "ýÐäÐ Ü"Ã"(((ç"pÜ"¦Ü"û"8plÜ"û"plplplplRCRD( à#pl8Px Èð&"p!!,!b!p!X¦ƒ :"@pl(( H":"(((ð[Ê€úÿÿS"¨(@h@8  1B5ÑäÐ1B5ÑäÐ! "ýÐäÐ ! "ýÐäÐ! "ýÐäÐ! "ýÐäÐ n"S"(((Hy"˜(pl`88  ! "ýÐäÐ1B5ÑäÐ1B5ÑäÐ! "ýÐäÐ ! "ýÐäÐ! "ýÐäÐ! "ýÐäÐ! "ýÐäÐ ’"y"(((€ùÿÿ"¨(@h@8  Ai5ÑäÐAi5ÑäÐ! "ýÐäÐ 1B5ÑäÐ1B5ÑäÐ! "ýÐäÐ ¸""(((plHÃ"˜(8`88  ! "ýÐäÐAi5ÑäÐAi5ÑäÐ! "ýÐäÐ ! "ýÐäÐ1B5ÑäÐ1B5ÑäÐ! "ýÐäÐ Ü"Ã"(((ç"pÜ"¦Ü"û"8plÜ"û"#pû"¦û"plplplplRCRD( ë àÿÿÿÿÿÿë aÿÿÿÿÿÿÿÿpP((P€"Âøÿÿÿÿÿÿ€À < øÿÿ,X((P@€"Âøÿÿÿÿÿÿ `S øÿÿ$I30=,,˜(8`8@`EuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì uÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì V==P((Ph€"Âøÿÿÿÿÿÿ°=°{¤ øÿÿfVV0((hrff((( }rr (hhhX 0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ $RmMetadata•}}8(8 FILE0r8`H0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ0pX 0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ $RmMetdataÿÿÿÿ‚yG••x(Px P0 $I300 ׈((` FILE0Â8``H0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ0pX 0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ $RmMetadataP0 $I300 ÿÿÿÿ‚yG ×׈(`ˆ FILE0×8``H0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ0pX 0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ $RmMetadataP0 $I300 ÿÿÿÿ‚yGE   0((hQ E E ((( \ Q Q ˆ (`ˆ@ `P0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ&$Repairs \ \ 0(0 FILE0Q 8`H0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ&0hP0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ0É‹ÔÃäÐ&$Repairÿÿÿÿ‚yGŸ s s X(0X €0($Config° Ÿ Ÿ @(@ €¾ ° ° @(( €Ì ¾ ¾ p(Hp €Hÿÿÿÿÿÿÿÿ@€ùÿÿà Ì (((ë X (@üxüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRCRD( î pã ;c ë ë X((P€"Âøÿÿÿÿÿÿ€ ë  ç¥ øÿÿ$SDS   8(0ü@ˆ&   X (@xüx7 & & 8(0ü;cHD 7 7 (x xH"v x€HX4ÿ‰  m D D (x x@ˆ"v x€HX4ÿ;c‰  – m m X (@xxx§ – – P ((P("v x· § § X (0XPp;c0"v "v xIIÈ · (((Ó x(%P%8; è Ó (((8l 4€ùÿÿó 0((hÿ ;có ó ((( ÿ ÿ ˆ (`ˆ  `PAð‹ÔÃäÐAð‹ÔÃäÐAð‹ÔÃäÐAð‹ÔÃäÐ$TxfLog!   0(0 FILE0ÿ 8`HAð‹ÔÃäÐAð‹ÔÃäÐAð‹ÔÃäÐAð‹ÔÃäÐ0h;cPAð‹ÔÃäÐAð‹ÔÃäÐAð‹ÔÃäÐAð‹ÔÃäÐ$TxfLogÿÿÿÿ‚yGM ! ! x(Px P0 $I300 b M M €((X FILE0M 8X`HAð‹ÔÃäÐAð‹ÔÃäÐAð‹ÔÃäÐAð‹ÔÃäÐ;c0hPAð‹ÔÃäÐAð‹ÔÃäÐAð‹ÔÃäÐAð‹ÔÃäÐ$TxfLogP0 $I300 ÿÿÿÿ‚yG˜ b b €(X€ FILE0b 8X`HAð‹ÔÃäÐAð‹ÔÃäÐAð‹ÔÃäÐAð‹ÔÃäÐ0hPAð‹ÔÃäÐAð‹ÔÃäÐAð‹ÔÃäÐAð‹ÔÃäÐ;c$TxfLogP0 $I300 ÿÿÿÿ‚yGÎ ˜ ˜ x(%P%8; ã Î (((8t 4€ùÿÿî €(X€(ÿÿÿÿ¸0ÿÿÿÿ€;cRCRD( Õ ¨Ê ÄäÐ8ÂÖ>ÄäÐ8ÂÖ>ÄäÐ8ÂÖ>ÄäÐadstest” } } €(X€ FILE0r 8X`H8ÂÖ>ÄäÐ8ÂÖ>ÄäÐ8ÂÖ>ÄäÐ8ÂÖ>ÄäÐ0hP8ÂÖ>ÄäÐ8ÂÖ>ÄäÐ8ÂÖ>ÄäÐ8ÂÖ>ÄäÐadstestPÄäÐ8ÂÖ>ÄäÐ8ÂÖ>ÄäÐ&ÚïÏP¼ÌÚïÏP¼Ì”)ÏQ¼Ì&ùää˜(=c`8@€EuÖ3P¼Ì8ÂÖ>ÄäÐ8ÂÖ>ÄäÐ8ÂÖ>ÄäÐ&uÖ3P¼ÌÚïÏP¼ÌÚïÏP¼Ì”)ÏQ¼Ì&ù(((X (@ŒDŒŒ.8(0Œ@ˆ;..X=c (@DŒDL;;8(0ŒHYLL˜(´à´HÕOc ´€t„`ÿ ÿ¿ © ! ˜Wâ1P,ª&z=c’YY˜(´à´@ˆÕOc ´€t„`ÿ ÿ¿ © ! ˜Wâ1P,ª&z=cË’’X (@DDDÜËËP ((P`à(ÕOc ´ìÜÜX (0XPp0ÕOc ÕOc ´II=cRCRD( ôøÿÿÿÿÿÿôtÿÿÿÿÿÿÿÿì(((0((h((( *ˆ (`ˆ@ `LÜFDÄäÐÜFDÄäÐÜFDÄäÐÜFDÄäÐ a.xtA**H( H FILE08 `HÜFDÄäÐÜFDÄäÐÜFDÄäÐÜFDÄäÐ 0hLÜFDÄäÐÜFDÄäÐÜFDÄäÐÜFDÄäÐ a.txt€ÿÿÿÿ‚yGpA(((Àû øÿÿ{¨(@h@8  ÜFDÄäÐÜFDÄäÐÜFDÄäÐ8ÂÖ>ÄäÐ8ÂÖ>ÄäÐ8ÂÖ>ÄäЖ{{˜(8`8@ØE8ÂÖ>ÄäÐÜFDÄäÐÜFDÄäÐÜFDÄäÐ8ÂÖ>ÄäÐ8ÂÖ>ÄäÐ8ÂÖ>ÄäÐ8ÂÖ>ÄäЯ–(((º€(X€(ÿÿÿÿ¸0ÿÿÿÿ€À < øÿÿÿÿÿÿ `S øÿÿÿÿÿÿ°=°{¤ øÿÿÿÿÿÿ€ ë  ç¥ øÿÿà0ðººH( H@$I30$SDSÿðð@(@( ÿÿÿÿ0ðÿÿÿÿr  ÿÿÿÿÿÿÿÿäÿÿÿÿ@` ˆÿÿÿÿ~ Hÿÿÿÿhf ÿÿÿÿ@} EX€¨Ðø Hp˜Àè8`ˆ°Ø(Px Èð­p¯ºðÿX ` Á8( ( ÿÿÿÎÁ(((@žø€úÿÿÙ¨(@h@8  Ìm½GÄäÐÌm½GÄäÐÜFDÄäÐ ÜFDÄäÐÜFDÄäÐÜFDÄäÐ ôÙ(((HÿÿÿÿÿÿRCRD( ïxä>cÐИ(8`8@ ÜFDÄäÐÌm½GÄäÐÌm½GÄäÐÜFDÄäÐ ÜFDÄäÐÜFDÄäÐÜFDÄäÐÜFDÄäÐ !(((€ùÿÿ,¨(@h@8  GÄäÐGÄäÐÜFDÄäÐ Ìm½GÄä>cÌm½GÄäÐÜFDÄäÐ G,(((HR˜(8`8@ ÜFDÄäÐGÄäÐGÄäÐÜFDÄäÐ ÜFDÄäÐÌm½GÄäÐÌm½GÄäÐÜFDÄäÐ kR((( vP((P(>c €((ads.txt†vv˜(8`88( >‰sKÄäÐÜFDÄäÐ GÄäÐÜFDÄäÐ Ÿ†(((Hª˜(8`8@ ÜFDÄäÐGÄäÐ>‰sKÄäÐÜFDÄäÐ ÜFDÄäÐGÄäÐGÄäÐÜFDÄä>c ê(((΀(X€(ÿÿÿÿ¸0ÿÿÿÿ€À < øÿÿÿÿÿÿ `S øÿÿÿÿÿÿ°=°{¤ øÿÿÿÿÿÿ€ ë  ç¥ øÿÿà0>cÎÎH( H@$I30$SDS@(@( ÿÿÿÿðÿÿÿÿr  ÿÿÿÿÿÿÿÿäÿÿÿÿ~ Hÿÿÿÿhf ÿÿÿÿ@} E0>cX€¨Ðø Hp˜Àè>c8`ˆ°Ø(Px Èð>cÁpÃÎX ~ ÕH(((( äÕ(((àcë€úÿÿï¨(@h@8  \cûPÄäÐ\cûPÄäÐÜFDÄäÐ >cRCRD( –° ‡?cGÄäÐ>‰sKÄäÐÜFDÄäÐ ï(((H˜(8`8@ ÜFDÄäÐ\cûPÄäÐ\cûPÄäÐÜFDÄäÐ ÜFDÄäÐGÄäÐ>‰sKÄäÐÜFDÄäÐ 6(((?c€ùÿÿA¨(@h@8  mŠûPÄäÐmŠûPÄäÐÜFDÄäÐ \cûPÄäÐ\cûPÄäÐÜFDÄäÐ \A(((Hg˜(8`8@ ÜFDÄäÐmŠûPÄäÐmŠûPÄäÐÜFDÄäÐ ÜFDÄäÐ\cûPÄäÐ\cûPÄäÐÜFDÄäÐ ?c€g(((‹€(X€(ÿÿÿÿ¸0ÿÿÿÿ€À < øÿÿÿÿÿÿ `S øÿÿÿÿÿÿ°=°{¤ øÿÿÿÿÿÿ€ ë  ç¥ øÿÿà0?cÁ‹‹H( H@$I30$SDSÐp€‹ÁX €ä0((h ðää((( ûðð€?c (X€  XH{ŽLSÄäÐ{ŽLSÄäÐ{ŽLSÄäÐ{ŽLSÄäÐdirûûx(Px FILE0ð8P `H{ŽLSÄäÐ{ŽLSÄäÐ{ŽLSÄäÐ{ŽLSÄäÐ0`H{ŽLSÄäÐ{ŽLSÄäÐ{ŽLSÄäÐ{ŽLSÄäÐdirP0 $I300?c ÿÿÿÿ‚yGF(((Àû øÿÿQ€(X€(ÿÿÿÿ¸0ÿÿÿÿ€À < øÿÿÿÿÿÿ `S øÿÿÿÿÿÿ°=°{¤ øÿÿÿÿÿÿ€ ë  ç¥ øÿÿà0?c‡QQH( H@$I30$SDS–‡‡@(@( ÿÿÿÿðÿÿÿÿhäÿÿÿÿð ÿÿÿÿû ¸à?c0X€¨Ðø Hp˜Àè?cRCRD( éHÚ@c8`ˆ°Ø(Px È@cðLpFQ‡–X ä`¨(@h@8  {ŽLSÄäÐ{ŽLSÄäÐ{ŽLSÄäÐÜFDÄäÐÜFDÄäÐÜFDÄäÐ{``˜@c(8`8@ØE8ÂÖ>ÄäÐ{ŽLSÄäÐ{ŽLSÄäÐ{ŽLSÄäÐ8ÂÖ>ÄäÐÜFDÄäÐÜFDÄäÐÜFDÄäД{(((ŸP((Pø €((ads.txt¯ŸŸ˜(8`88( EÓ˜WÄäÐ{ŽLSÄäÐ @c{ŽLSÄäÐ{ŽLSÄäÐȯ(((HÓ˜(8`8  {ŽLSÄäÐ{ŽLSÄäÐEÓ˜WÄäÐ{ŽLSÄäÐ {ŽLSÄäÐ{ŽLSÄäÐ{ŽLSÄäÐ{ŽLSÄäÐìÓ(((÷@((ø(@c ÷(((@ÞG€úÿÿ¨(@h@8  3°’[ÄäÐ3°’[ÄäÐ{ŽLSÄäÐ {ŽLSÄäÐEÓ˜WÄäÐ{ŽLSÄäÐ +(((H6˜(8`8 @c {ŽLSÄäÐ3°’[ÄäÐ3°’[ÄäÐ{ŽLSÄäÐ {ŽLSÄäÐ{ŽLSÄäÐEÓ˜WÄäÐ{ŽLSÄäÐ O6(((€ùÿÿZ¨(@h@8  Uþ’[ÄäÐUþ’[ÄäÐ{ŽLSÄäÐ 3°’[ÄäÐ3°’[ÄäÐ{ŽLSÄäÐ uZ(((H@c€˜(8`8  {ŽLSÄäÐUþ’[ÄäÐUþ’[ÄäÐ{ŽLSÄäÐ {ŽLSÄäÐ3°’[ÄäÐ3°’[ÄäÐ{ŽLSÄäÐ ™€(((¤€(X€(ÿÿÿÿ¸0ÿÿÿÿ€À < øÿÿÿÿÿÿ `S øÿÿÿÿÿÿ°=@c°{¤ øÿÿÿÿÿÿ€ ë  ç¥ øÿÿà0Ú¤¤H( H@$I30$SDSéÚÚ@(@( ÿÿÿÿðÿÿÿÿð ÿÿÿÿû@cRCRD( Ÿø Ac ÿÿÿÿ@{E¸à0X€¨Ðø AcHp˜Àè8`ˆ°Ø(AcPx ÈðŸp™¤ÚéX ð³0((h!¿Ac³³((( Ê¿¿ˆ (`ˆ8@ !`L ç”­`ÄäÐç”­`ÄäÐç”­`ÄäÐç”­`ÄäÐ b.txtáÊÊH( H FILE0¿8 !`Hç”­`ÄäÐç”­`ÄäÐç”­`ÄäÐç”­`ÄäÐ 0hAcL ç”­`ÄäÐç”­`ÄäÐç”­`ÄäÐç”­`ÄäÐ b.txt€ÿÿÿÿ‚yGá(((Ї& øÿÿ¨(@h@8  ç”­`ÄäÐç”­`ÄäÐç”­`ÄäÐ Uþ’[ÄäÐUþ’[ÄäÐ{ŽLSÄäÐ 6˜(8`8 Ac {ŽLSÄäÐç”­`ÄäÐç”­`ÄäÐç”­`ÄäÐ {ŽLSÄäÐUþ’[ÄäÐUþ’[ÄäÐ{ŽLSÄäÐ O6(((Z€(X€(ÿÿÿÿ¸0ÿÿÿÿ€À < øÿÿÿÿÿÿ `S øÿÿÿÿÿÿ°=°{¤ øÿÿÿÿÿÿ€ ë  ç¥ øÿÿàAc0ZZH( H@$I30$SDSŸ@(@( ÿÿÿÿ¸ðÿÿÿÿ¿ ÿÿÿÿû ÿÿÿÿ@{Eÿÿÿÿh³Acà0X€¨Ðø Hp˜ÀAcRCRD( ² £BcÐÿÿè8`ˆ°Ø(PxBc ÈðUpOZŸX ûi8( ( vi(((Bc@="€úÿÿ¨(@h@8  ²ÔIcÄäвÔIcÄäÐç”­`ÄäÐ ç”­`ÄäÐç”­`ÄäÐç”­`ÄäÐ œ(((H§˜(8`88@ ç”­`ÄäвÔIcÄäвÔIcÄäÐç”­`ÄäÐ ç”­`ÄäÐç”­`ÄäÐç”­`ÄäÐç”­`ÄäÐ BcÀ§(((€ùÿÿ˨(@h@8  Ô"JcÄäÐÔ"JcÄäÐç”­`ÄäÐ ²ÔIcÄäвÔIcÄäÐç”­`ÄäÐ æË(((Hñ˜(8`88@ ç”­`ÄäÐÔ"JcÄäÐÔ"JcÄäÐç”­`ÄäBc ç”­`ÄäвÔIcÄäвÔIcÄäÐç”­`ÄäÐ ñ((( P((P( €((ads.txt%˜(8`88( ²ÇgÄäÐç”­`ÄäÐ Ô"JcÄäÐç”­`ÄäÐ >%Bc(((HI˜(8`88@ ç”­`ÄäÐÔ"JcÄäвÇgÄäÐç”­`ÄäÐ ç”­`ÄäÐÔ"JcÄäÐÔ"JcÄäÐç”­`ÄäÐ bI(((m€(X€(ÿÿÿÿ¸0ÿÿÿÿ€À < øBcÿÿÿÿ `S øÿÿÿÿÿÿ°=°{¤ øÿÿÿÿÿÿ€ ë  ç¥ øÿÿà0£mmH( H@$I30$SDS²££@(@( ÿÿÿÿðBcÿÿÿÿ@{Eÿÿÿÿh³ÿÿÿÿ ¸à0X€¨Ðø BcRCRD( ç8ÜCcDHp˜Àè8`ˆ°ØCc(Px Èðhpbm£²X {|€Cc(X€(ÿÿÿÿ¸0ÿÿÿÿ€À < øÿÿÿÿÿÿ `S øÿÿÿÿÿÿ°=°{¤ øÿÿÿÿÿÿ€ ë  ç¥ øÿÿà0²||H( H@$I30$SCcSÁ²²@(@( ÿÿÿÿhðÿÿÿÿh³ÿÿÿÿ ¸à0X€¨CcÐø Hp˜Àè8`ˆ°CcØ(Px Èðoph|²ÁX Cc³ƒH(((( ’ƒ(((@}Y€úÿÿ¨(@h@8  pElÄäÐpElÄäÐç”­`ÄäÐ Ô"JcÄäвÇgÄäÐç”­`ÄäÐ ¸(((CcHØ(8`88@ ç”­`ÄäÐpElÄäÐpElÄäÐç”­`ÄäÐ ç”­`ÄäÐÔ"JcÄäвÇgÄäÐç”­`ÄäÐ ÜÃ(((€ùÿÿç¨(@h@8  ¶ElÄäжElÄäÐç”­`ÄäÐ pElÄäÐpElÄäÐç”­`ÄäÐ CcRCRD( ïxÞFcX ç(((H˜(8`88@ ç”­`ÄäжElÄäжElÄäÐç”­`ÄäÐ ç”­`ÄäÐpElÄäÐpElÄäÐç”­`ÄäÐ .(((9€(Fc€(ÿÿÿÿ¸0ÿÿÿÿ€À < øÿÿÿÿÿÿ `S øÿÿÿÿÿÿ°=°{¤ øÿÿÿÿÿÿ€ ë  ç¥ øÿÿà0o99H( H@$I30$SDS~oFco@(@( ÿÿÿÿ@ðÿÿÿÿ h¸à0X€¨ÐFcø Hp˜Àè8`ˆ°ØFc(Px Èð,p.9o~X Fc@€(X€(ÿÿÿÿ¸0ÿÿÿÿ€À < øÿÿÿÿÿÿ `S øÿÿÿÿÿÿ°=°{¤ øÿÿÿÿÿÿ€ ë  ç¥ øÿÿà0v@@H( HFc@$I30$SDS…p,@vX ,™8,™¦p™™ºpFc¦¦¦ÎP((P€"Âøÿÿÿÿÿÿ€º`eù øÿÿÞÎÎX((P@€"Âøÿÿÿÿÿÿ Îðü øÿÿ$I30ïÞÞ˜(8`8@`EuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌFcRCRD( p!ÿÿÿÿ€ ÿÿÿÿÿÿb!ÿÿÿÿÿÿ uÖ3P¼ÌuÖ3P¼ÌuÖ3P¼ÌuÖ3P¼Ì  ï((( €(X€(ÿÿÿÿh0ÿÿÿÿ€º`eù øÿÿÿÿÿÿ Îðü øÿÿ¸à0Q   @(@@$I30ÿÿÿÿÿÿ_ p  Q X¦ s P((Ph0wÉ€úÿÿÿÿÿÿ°_ àtÏ øÿÿƒ s s 0((h" ƒ ƒ ((( š    (h8  "hV ! "ýÐäÐ! "ýÐäÐ! "ýÐäÐ! "ýÐäÐ no_ads.txt² š š P((P FILE0 8("`H! "ýÐäÐ! "ýÐäÐ! "ýÐäÐ! "ýÐäÐ 0pV ! "ýÐäÐ! "ýÐäÐ! "ýÐäÐ! "ýÐäÐ no_ads.txt€ÿÿÿÿ‚yGâ ² (((eù øÿÿí ¨(@h@8  ! "ýÐäÐ! "ýÐäÐ! "ýÐäÐ ç”­`ÄäÐç”­`ÄäÐç”­`ÄäÐ !í í ˜(8`8  {ŽLSÄäÐ! "ýÐäÐ! "ýÐäÐ! "ýÐäÐ {ŽLSÄäÐç”­`ÄäÐç”­`ÄäÐç”­`ÄäÐ !!!(((,!€(X€(ÿÿÿÿ0ÿÿÿÿ€º`eù øÿÿÿÿÿÿ Îðü øÿÿÿÿÿÿ°_ àtÏ øÿÿ¸à0b!,!,!@(@@$I30ÿÿÿÿÿÿp!b!b!@(@( ÿÿÿÿðÿÿÿÿhƒ ÿÿÿÿ  ÿÿÿÿ! ¸à0X€¨Ðø Hp˜Àè8`ˆ°Ø(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëRNTFS ø€€ÿÿö$U*¿kú3ÀŽÐ¼|ûhÀhfˈf>NTFSu´A»ªUÍr ûUªu÷ÁuéÒƒìh´HŠ‹ôÍŸƒÄžXrá; uÛ£Á.Z3Û¹ +ÈfÿŽÂÿè@+Èw︻Íf#Àu-fûTCPAu$ùrh»hph fSfSfUh¸faÍéjf`f¡ffhfPShh´BŠ‹ôÍfY[ZfYfY‚fÿŽÂÿu¼faàøè ûèëþ´‹ð¬<t ´»Íëòà A disk read error occurred BOOTMGR is missing BOOTMGR is compressed Press Ctrl+Alt+Del to restart €²ÊUªgrr-3.1.0.2/grr/config/grr-response-test/test_data/numbers.txt000066400000000000000000000074651273104013200243000ustar00rootroot000000000000001 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 grr-3.1.0.2/grr/config/grr-response-test/test_data/numbers.txt.ver2000066400000000000000000000000211273104013200251320ustar00rootroot00000000000000just some numbersgrr-3.1.0.2/grr/config/grr-response-test/test_data/one_a000066400000000000000000000000021273104013200230440ustar00rootroot00000000000000a grr-3.1.0.2/grr/config/grr-response-test/test_data/osx_fsdata000066400000000000000000001257401273104013200241370ustar00rootroot00000000000000ÌëRKióKoòÊëRKoòЀhfs//dev/disk0s2ÙjÔè:devfs/devdevfs,Pautofs/automap auto.auto,Pautofs/homemap auto.home,Pautofs/netmap -hostsÈŸõ^Ÿõ^v@ î Pnfs/home/user01nfsmount.nfs:/vol/filehome/user01grr-3.1.0.2/grr/config/grr-response-test/test_data/parser_test/000077500000000000000000000000001273104013200244035ustar00rootroot00000000000000grr-3.1.0.2/grr/config/grr-response-test/test_data/parser_test/History000066400000000000000000002340001273104013200257660ustar00rootroot00000000000000SQLite format 3@ ö.ûö$ " ¤òÔ¤.A/early_expiration_threshold12945429317090490;last_compatible_version16 version20 ¹¹ØôAearly_expiration_threshold;last_compatible_version versionûöñìçâÝØÓÎÉÄ¿ºµ°«¦¡œ—’60.-,*)(&%$"!      z³™@éœÛz_ y5http://www.java.com/inc/BrowserRedirect1.jsp?locale=enBrowserRedirect1.jsp.Í2ß5 5%http://www.java.com/www.java.com.Í2ß 9Chttp://www.google.com/search?ie=UTF-8&oe=UTF-8&sourceid=navclient&gfns=1&q=java+pluginjava plugin - Google Search.Ìæ“ÀK a%https://www.mozilla.com/en-US/plugincheck/Plugin Check.ËJ—U y!http://dfptools.doubleclick.net/web-console/applet.jspapplet.jsp.Éë£@W e9http://dfptools.doubleclick.net/web-console/Administration Console.É%Fk Ghttp://www.symantec.com/de/de/business/products/index.jspSymantec Data Loss Prevention-þé-0ýÀ* ‚=http://www.symantec.com/de/de/business/solutions/solutiondetail.jsp?solid=sol_info_risk_comp&solfid=sol_data_loss_preventionRedirect index.html Page-þé-0ýÀK W/http://start.ubuntu.com/10.04/Google/Ubuntu Start Page-þé-0ýÀ T€©AÂ*T4 K http://www.google.ch/blank.html.ƒŸ¤_0 7http://www.google.ch/Google.ƒŸ¢H¨1 9http://www.google.com/Google.ƒŸ¢H¨P ƒ http://fls.doubleclick.net/activityi;src=2542116;type=clien612;cat=chromn1;ord=1;num=3835704319644.719;~oref=http%3A%2F%2Ftools.google.com%2Fchrome%2Fintl%2Fen%2Fwelcome.html?&_dc_ck=try.ƒŸ.#•} [ http://fls.doubleclick.net/activityi;src=2542116;type=clien612;cat=chromn1;ord=1;num=3835704319644.719?.ƒŸ.#•f sIhttp://tools.google.com/chrome/intl/en/welcome.htmlGet started with Google Chrome.ƒŸ$KžY k7http://code.google.com/p/chrome-screen-capture/chrome-screen-capture.ùB ©@z !Ahttps://chrome.google.com/webstore/detail/cpngackimfmofbokmjmljamhdncknpmgScreen Capture (by Google).ùA»Ç€~ #Ghttps://chrome.google.com/webstore/detail/ackpfhlmgjdjlohhjmbacaajbmkkklnp#Tab Expose - Chrome Web Store.¿ô¦€ Œ§É Œ khttp://en.softsia.com/soft-cats-download-1.htmlBest Soft Cats Downloads: SoftCats Free - CatsSoft Reviews.ƒ¤Ž×9 ‚Ehttp://www.google.ch/search?hl=de&q=funnycats.exe&oq=funnycats.exe&aq=f&aqi=&aql=&gs_sm=e&gs_upl=1945l7105l0l25l23l5l5l2l0l156l1190l7.6funnycats.exe - Google-Suche.ƒ¡&«²[ ‚I[http://www.google.ch/search?hl=de&q=really+really+funny+cats&oq=really+really+funny+cats&aq=f&aqi=&aql=&gs_sm=e&gs_upl=4112l7623l0l24l21l0l14l14l0l146l639l5.2really really funny cats - Google-Suche.ƒ ±€‘p ?http://www.google.ch/search?sourceid=chrome&ie=UTF-8&q=funny+catsfunny cats - Google-Suche.ƒ 4/ãd ƒ1http://www.google.ch/#hl=de&source=hp&biw=1257&bih=1414&q=grr&oq=grr&aq=f&aqi=g1g-s1g2g-s6&aql=&gs_sm=e&gs_upl=1084l1497l0l3l3l0l0l0l0l185l461l1.2&bav=on.2,or.r_gc.r_pw.&fp=e9e21f84998f5a4grr - Google-Suche.ƒŸÕHi FF‡7 ŽO http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=15&slotname=2362198502&w=468&lmt=1306132510&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&dt=1306139710333&bpp=3&shv=r20110512&jsv=r20110506&prev_slotnames=6851072109%2C4758889056%2C8331150399&correlator=1306139710364&frm=0&adk=3316004872&ga_vid=331534367.1306139711&ga_sid=1306139711&ga_hid=15156107&ga_fc=0&u_tz=120&u_his=1&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1451&ref=http%3A%2F%2Fwww.google.ch%2Fsearch%3Fhl%3Dde%26q%3Dfunnycats.exe%26oq%3Dfunnycats.exe%26aq%3Df%26aqi%3D%26aql%3D%26gs_sm%3De%26gs_upl%3D1945l7105l0l25l23l5l5l2l0l156l1190l7.6&fu=0&ifi=4&dtd=427&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame4&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¤”mŽ zz‡ g http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=90&slotname=6851072109&w=728&lmt=1306132510&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&dt=1306139710279&bpp=10&shv=r20110512&jsv=r20110506&correlator=1306139710364&frm=0&adk=491424018&ga_vid=331534367.1306139711&ga_sid=1306139711&ga_hid=15156107&ga_fc=0&u_tz=120&u_his=1&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1451&ref=http%3A%2F%2Fwww.google.ch%2Fsearch%3Fhl%3Dde%26q%3Dfunnycats.exe%26oq%3Dfunnycats.exe%26aq%3Df%26aqi%3D%26aql%3D%26gs_sm%3De%26gs_upl%3D1945l7105l0l25l23l5l5l2l0l156l1190l7.6&fu=0&ifi=1&dtd=372&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame1&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¤’+° SS‡* Ž5 http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=90&slotname=8331150399&w=200&lmt=1306132510&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&dt=1306139710321&bpp=8&shv=r20110512&jsv=r20110506&prev_slotnames=6851072109%2C4758889056&correlator=1306139710364&frm=0&adk=2524821587&ga_vid=331534367.1306139711&ga_sid=1306139711&ga_hid=15156107&ga_fc=0&u_tz=120&u_his=1&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1451&ref=http%3A%2F%2Fwww.google.ch%2Fsearch%3Fhl%3Dde%26q%3Dfunnycats.exe%26oq%3Dfunnycats.exe%26aq%3Df%26aqi%3D%26aql%3D%26gs_sm%3De%26gs_upl%3D1945l7105l0l25l23l5l5l2l0l156l1190l7.6&fu=0&ifi=3&dtd=384&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame3&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¤öù __‡ Ž http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=280&slotname=4758889056&w=336&lmt=1306132510&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&dt=1306139710317&bpp=4&shv=r20110512&jsv=r20110506&prev_slotnames=6851072109&correlator=1306139710364&frm=0&adk=2755568142&ga_vid=331534367.1306139711&ga_sid=1306139711&ga_hid=15156107&ga_fc=0&u_tz=120&u_his=1&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1451&ref=http%3A%2F%2Fwww.google.ch%2Fsearch%3Fhl%3Dde%26q%3Dfunnycats.exe%26oq%3Dfunnycats.exe%26aq%3Df%26aqi%3D%26aql%3D%26gs_sm%3De%26gs_upl%3D1945l7105l0l25l23l5l5l2l0l156l1190l7.6&fu=0&ifi=2&dtd=363&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame2&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¤’ 77‡F Žm http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=600&slotname=9004213189&w=160&lmt=1306132511&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&dt=1306139710337&bpp=5&shv=r20110512&jsv=r20110506&prev_slotnames=6851072109%2C4758889056%2C8331150399%2C2362198502&correlator=1306139710364&frm=0&adk=2218770476&ga_vid=331534367.1306139711&ga_sid=1306139711&ga_hid=15156107&ga_fc=0&u_tz=120&u_his=1&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1451&ref=http%3A%2F%2Fwww.google.ch%2Fsearch%3Fhl%3Dde%26q%3Dfunnycats.exe%26oq%3Dfunnycats.exe%26aq%3Df%26aqi%3D%26aql%3D%26gs_sm%3De%26gs_upl%3D1945l7105l0l25l23l5l5l2l0l156l1190l7.6&fu=0&ifi=5&dtd=1446&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame5&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¤•è  I†3 ŒG http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=15&slotname=5520569487&w=468&lmt=1306132523&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FFun-Cats-Screensaver-download-sk6t.htm&dt=1306139723081&bpp=8&shv=r20110512&jsv=r20110506&prev_slotnames=6717989103&correlator=1306139723052&frm=0&adk=2899817075&ga_vid=1106494855.1306139723&ga_sid=1306139723&ga_hid=310523222&ga_fc=0&u_tz=120&u_his=2&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1451&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=2&dtd=57&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame2&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¤xZ.4 Ohttp://en.softsia.com/Fun-Cats-Screensaver-download-sk6t.htmFun Cats Screensaver 1.0 Free download - Fun cats screensaver will show you how fun a cat can be..ƒ¤t¸¤ xäxj [ihttp://en.softsia.com/download-sk6t.htmDownload Fun Cats Screensaver. funcats_scr.exe.ƒ¢âTɆ Œ http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=90&slotname=6717989103&w=728&lmt=1306132523&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FFun-Cats-Screensaver-download-sk6t.htm&dt=1306139723045&bpp=4&shv=r20110512&jsv=r20110506&correlator=1306139723052&frm=0&adk=3975326057&ga_vid=1106494855.1306139723&ga_sid=1306139723&ga_hid=310523222&ga_fc=0&u_tz=120&u_his=2&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1451&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=1&dtd=26&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame1&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¤xåh ëë†! Œ http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=90&slotname=3808192216&w=728&lmt=1306132525&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fdownload-sk6t.htm&dt=1306139725464&bpp=11&shv=r20110512&jsv=r20110506&correlator=1306139725485&frm=0&adk=4138530256&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=134103612&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1451&ref=http%3A%2F%2Fen.softsia.com%2FFun-Cats-Screensaver-download-sk6t.htm&fu=0&ifi=1&dtd=33&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame1&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¢ê(V Åņ8" ŒQ http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=280&slotname=6190345064&w=336&lmt=1306132525&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fdownload-sk6t.htm&dt=1306139725531&bpp=4&shv=r20110512&jsv=r20110506&prev_slotnames=3808192216%2C6190345064&correlator=1306139725485&frm=0&adk=124017538&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=134103612&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1451&ref=http%3A%2F%2Fen.softsia.com%2FFun-Cats-Screensaver-download-sk6t.htm&fu=0&ifi=3&dtd=18&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame3&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¢ëÝé QÒQ$ _ http://en.softsia.com/get.php?url=http%3A%2F%2Ffatloss4idiotsx.com%2Fdownload%2Ffuncats%2Ffuncats_scr.exe.ƒ¢ýOm†+# Œ7 http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=280&slotname=6190345064&w=336&lmt=1306132525&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fdownload-sk6t.htm&dt=1306139725505&bpp=4&shv=r20110512&jsv=r20110506&prev_slotnames=3808192216&correlator=1306139725485&frm=0&adk=124017538&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=134103612&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1451&ref=http%3A%2F%2Fen.softsia.com%2FFun-Cats-Screensaver-download-sk6t.htm&fu=0&ifi=2&dtd=17&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame2&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¢ìâ ¼¼†A% Œc http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=600&slotname=0203846796&w=160&lmt=1306132552&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FFun-Cats-Screensaver-download-sk6t.htm&dt=1306139752065&bpp=4&shv=r20110512&jsv=r20110506&prev_slotnames=6717989103%2C5520569487&correlator=1306139751836&frm=0&adk=668835015&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1083788595&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1404&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=3&dtd=18&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame3&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¤|21 ¯¯†N& Œ} http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=600&slotname=0203846796&w=160&lmt=1306132552&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FFun-Cats-Screensaver-download-sk6t.htm&dt=1306139752089&bpp=5&shv=r20110512&jsv=r20110506&prev_slotnames=6717989103%2C5520569487%2C0203846796&correlator=1306139751836&frm=0&adk=668835015&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1083788595&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1404&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=4&dtd=40&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame4&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¤~á #\#†6( ŒM http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=15&slotname=5520569487&w=468&lmt=1306132557&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FCats-Photo-Screensaver-download-fvty.htm&dt=1306139757904&bpp=5&shv=r20110512&jsv=r20110506&prev_slotnames=6717989103&correlator=1306139757813&frm=0&adk=2899817075&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1439309887&ga_fc=1&u_tz=120&u_his=2&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1404&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=2&dtd=21&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame2&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¤Öÿ&!' %http://en.softsia.com/Cats-Photo-Screensaver-download-fvty.htmCats Photo Screensaver 1.0 Free download - Enjoy the variety of cat species..ƒ¤Ð#Ç áá†) Œ http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=90&slotname=6717989103&w=728&lmt=1306132557&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FCats-Photo-Screensaver-download-fvty.htm&dt=1306139757796&bpp=5&shv=r20110512&jsv=r20110506&correlator=1306139757813&frm=0&adk=3975326057&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1439309887&ga_fc=1&u_tz=120&u_his=2&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1404&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=1&dtd=53&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame1&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¤×Õ ºº†C* Œg http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=600&slotname=0203846796&w=160&lmt=1306132558&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FCats-Photo-Screensaver-download-fvty.htm&dt=1306139758054&bpp=6&shv=r20110512&jsv=r20110506&prev_slotnames=6717989103%2C5520569487&correlator=1306139757813&frm=0&adk=668835015&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1439309887&ga_fc=1&u_tz=120&u_his=2&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1404&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=3&dtd=92&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame3&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¤ØÑf ?­?l, [mhttp://en.softsia.com/download-fvty.htmDownload Cats Photo Screensaver. Cats%20Demo.exe.ƒ¥€N†P+  http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=600&slotname=0203846796&w=160&lmt=1306132558&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FCats-Photo-Screensaver-download-fvty.htm&dt=1306139758150&bpp=5&shv=r20110512&jsv=r20110506&prev_slotnames=6717989103%2C5520569487%2C0203846796&correlator=1306139757813&frm=0&adk=668835015&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1439309887&ga_fc=1&u_tz=120&u_his=2&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1404&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=4&dtd=17&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame4&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¤ÙŸ µµ†H- Œq http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=280&slotname=6190345064&w=336&lmt=1306132561&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fdownload-fvty.htm&dt=1306139761304&bpp=5&shv=r20110512&jsv=r20110506&prev_slotnames=3808192216%2C6190345064&correlator=1306139761239&frm=0&adk=124017538&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1586020085&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1404&eid=36813005&ref=http%3A%2F%2Fen.softsia.com%2FCats-Photo-Screensaver-download-fvty.htm&fu=0&ifi=3&dtd=19&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame3&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¥ éR ÛÛ†". Œ% http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=90&slotname=3808192216&w=728&lmt=1306132561&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fdownload-fvty.htm&dt=1306139761213&bpp=13&shv=r20110512&jsv=r20110506&correlator=1306139761239&frm=0&adk=4138530256&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1586020085&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1404&eid=36813005&ref=http%3A%2F%2Fen.softsia.com%2FCats-Photo-Screensaver-download-fvty.htm&fu=0&ifi=1&dtd=60&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame1&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¥ I OÂOq0 C http://en.softsia.com/get.php?url=http%3A%2F%2Fwww.photoscreensavers.us%2FCats%2520Demo.exe.ƒ¥öô†;/ ŒW http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=280&slotname=6190345064&w=336&lmt=1306132561&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fdownload-fvty.htm&dt=1306139761279&bpp=3&shv=r20110512&jsv=r20110506&prev_slotnames=3808192216&correlator=1306139761239&frm=0&adk=124017538&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1586020085&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1404&eid=36813005&ref=http%3A%2F%2Fen.softsia.com%2FCats-Photo-Screensaver-download-fvty.htm&fu=0&ifi=2&dtd=18&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame2&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¥ iÑ U ù}òU6 3ohttps://chrome.google.com/webstore/detail/mfjkgbjaikamkkojmakjclmkianficch?hl=en-USDownload Assistant (by Google) - Chrome Web Store.ƒ©Å^5 chttps://chrome.google.com/webstore?hl=en-US&category=ext%2F15-by-googleExtensions › by Google - Chrome Web Store.ƒ©^®¯z4 U https://accounts.youtube.com/accounts/CheckConnection?pmpo=https%3A%2F%2Fwww.google.com&v=1871234717.ƒ¨FÁ]‚3 ƒc+https://www.google.com/accounts/ServiceLogin?service=chromewebstore&passive=true&continue=https://chrome.google.com/webstore/startbounce?continue%3Dhttps://chrome.google.com/webstore/detail/pjkljhegncpnkpknbcohdijeoejaedia?hl%253Den-USGoogle Accounts.ƒ¨DWð2 3=https://chrome.google.com/webstore/detail/pjkljhegncpnkpknbcohdijeoejaedia?hl=en-USGmail - Chrome Web Store.ƒ¨uŠín1 cihttps://chrome.google.com/webstore?hl=en-USChrome Web Store - Apps, Extensions and Themes.ƒ¨€¦K bb7 5ohttps://chrome.google.com/webstore/detail/mfjkgbjaikamkkojmakjclmkianficch?hl=en-US#Download Assistant (by Google) - Chrome Web Store.ƒª"° ûû$ $TæÌ²˜~dJ0üâÈ®”z`F*ôÚÀ¦ŒrX>$ ðÖ¼¢ˆnT$!.ƒ¢ê(V0# .ƒ¢âTÉ 0".ƒ¢ÆãS0!.ƒ¢ÄNX0 .ƒ¢²ö—0.ƒ¢°§0.ƒ¢ š*0.ƒ¢ ôŠ0.ƒ¢ƒ30.ƒ¢ù0.ƒ¡óúS0.ƒ¡&«²`.ƒ ±€‘`.ƒ 4/ã0.ƒŸÕHi`.ƒŸ¤_0.ƒŸ¢H¨ .ƒŸ¢H¨.ƒŸ.#• .ƒŸ.#• .ƒŸ$Kž0 .ùB ©@0 .ùA»Ç€0  .¿ô¦€0  .Í2ß0 .Í2ß0 .Ìæ“À0 .ËJ—0.Éë£@0.É%F0-þé-0ýÀ0-þé-0ýÀ0.ùAo|@0.¿óÇ[@0.Ⱥv@0-þé-0ýÀ0 !¦æÌ²˜~dJ0üâÈ®”z`F,øÞĪv\B(ôÚÀ¦E7.ƒª"° D`D6.ƒ©Å^C0C5.ƒ©^®¯B0B1.ƒ¨€¦K1A2.ƒ¨uŠí=1@4.ƒ¨FÁ]0?3.ƒ¨DWð>`>2.ƒ¨!ùQ=0=1.ƒ§ ž0<0.ƒ¥öô0;/.ƒ¥ iÑ0:..ƒ¥ I09-.ƒ¥ éR08,.ƒ¥€N307+.ƒ¤ÙŸ06*.ƒ¤ØÑf05).ƒ¤×Õ04(.ƒ¤Öÿ&03'.ƒ¤Ð#Ç-02.ƒ¤•è 01.ƒ¤”mŽ00.ƒ¤’+°0/.ƒ¤’0..ƒ¤öù0-.ƒ¤Ž×1,&.ƒ¤~á0+%.ƒ¤|210*.ƒ¤xåh0).ƒ¤xZ.0(.ƒ¤t¸¤1'$.ƒ¢ýOm0&#.ƒ¢ìâ0%".ƒ¢ëÝé0 ¦úôîèâÜÖÐÊľ¸²¬¦      ‡ãª‡!''funnycats.exefunnycats.exe7==really really funny catsreally really funny cats!!funny catsfunny cats FF­ÖðÇ7e-tablemetametaCREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY,value LONGVARCHAR)';indexsqlite_autoindex_meta_1meta‚„tableurlsurlsCREATE TABLE urls(id INTEGER PRIMARY KEY,url LONGVARCHAR,title LONGVARCHAR,visit_count INTEGER DEFAULT 0 NOT NULL,typed_count INTEGER DEFAULT 0 NOT NULL,last_visit_time INTEGER NOT NULL,hidden INTEGER DEFAULT 0 NOT NULL,favicon_id INTEGER DEFAULT 0 NOT NULL)TƒtablevisitsvisitsCREATE TABLE visits(id INTEGER PRIMARY KEY,url INTEGER NOT NULL,visit_time INTEGER NOT NULL,from_visit INTEGER,transition INTEGER DEFAULT 0 NOT NULL,segment_id INTEGER,is_indexed BOOLEAN)n%%tablevisit_sourcevisit_source CREATE TABLE visit_source(id INTEGER PRIMARY KEY,source INTEGER NOT NULL)F55‚/tablekeyword_search_termskeyword_search_terms!CREATE TABLE keyword_search_terms (keyword_id INTEGER NOT NULL,url_id INTEGER NOT NULL,lower_term LONGVARCHAR NOT NULL,term LONGVARCHAR NOT NULL) %‹%dQk/home/john/Downloads/Cats Demo.exehttp://www.photoscreensavers.us/Cats%20Demo.exeMÚuøøs U/home/john/Downloads/funcats_scr.exehttp://fatloss4idiotsx.com/download/funcats/funcats_scr.exeMÚRF{F{ ˆ"ÝU¦vƒ;tabledownloadsdownloads#CREATE TABLE downloads (id INTEGER PRIMARY KEY,full_path LONGVARCHAR NOT NULL,url LONGVARCHAR NOT NULL,start_time INTEGER NOT NULL,received_bytes INTEGER NOT NULL,total_bytes INTEGER NOT NULL,state INTEGER NOT NULL)‚tablesegmentssegments%CREATE TABLE segments (id INTEGER PRIMARY KEY,name VARCHAR,url_id INTEGER NON NULL,pres_index INTEGER DEFAULT -1 NOT NULL)8 ''‚/tablesegment_usagesegment_usage&CREATE TABLE segment_usage (id INTEGER PRIMARY KEY,segment_id INTEGER NOT NULL,time_slot INTEGER NOT NULL,visit_count INTEGER DEFAULT 0 NOT NULL)v %%/tablepresentationpresentation'CREATE TABLE presentation(url_id INTEGER PRIMARY KEY,pres_index INTEGER NOT NULL)O -gindexvisits_url_indexvisits(CREATE INDEX visits_url_index ON visits (url)X /windexvisits_from_indexvisits)CREATE INDEX visits_from_index ON visits (from_visit) åå1http://google.com/ÿ ïï.zÂnØ  EbúôîèâÜÖÐÊľ¸²¬¦ š”Žˆ‚|vpjdò^ÚXàRìLæFÔ@: 4.("þøÎȼ¶°ª¤ž˜’tŒz†€nhb7E6D5C1B2A4@3?2>1=0</;.:-9,8+7*6)5(4'3210/.-&,%+*)($'#&"%!$ #"!          EbúôîèâÜÖÐÊľ¸²¬¦ šŽ‚vd^XRLF:4(" þøòìæàÚÔȼ¶ª¤ž˜’€t”ˆ|pj@.ΰŒz†nhbDECDBCB=A@>?=>=<;:9387654-3210/.-,+*)('&%$ #"!      ï,ï+ .ƒ¢âTÉ# "FFS`mz‡”¡®»ÈÕâïü #0=JWdq~‹˜¥²¿ÌÙæó -þé-0ýÀ -þé-0ýÀ -þé-0ýÀ .Ⱥv@ .É%F .Éë£@ .ËJ— .Ìæ“À .Í2ß .Í2ß .¿óÇ[@ .¿ô¦€ .ùAo|@ .ùA»Ç€ .ùB ©@ .ƒŸ$Kž .ƒŸ.#• .ƒŸ.#• .ƒŸ¢H¨ .ƒŸ¢H¨ .ƒŸ¤_ .ƒŸÕHi .ƒ 4/ã .ƒ ±€‘ .ƒ¡&«² .ƒ¡óúS .ƒ¢ù .ƒ¢ƒ3 .ƒ¢ ôŠ .ƒ¢ š* .ƒ¢°§ .ƒ¢²ö— .ƒ¢ÄNX! .ƒ¢ÆãS" "FS`mz‡”¡®»ÈÕâïü #0=JWdq~‹˜¥²¿ÌÙæóF .ƒª"° E .ƒ¢ê(V$ .ƒ¢ëÝé% .ƒ¢ìâ& .ƒ¢ýOm' .ƒ¤t¸¤( .ƒ¤xZ.) .ƒ¤xåh* .ƒ¤|21+ .ƒ¤~á, .ƒ¤Ž×- .ƒ¤öù. .ƒ¤’/ .ƒ¤’+°0 .ƒ¤”mŽ1 .ƒ¤•è 2 .ƒ¤Ð#Ç3 .ƒ¤Öÿ&4 .ƒ¤×Õ5 .ƒ¤ØÑf6 .ƒ¤ÙŸ7 .ƒ¥€N8 .ƒ¥ éR9 .ƒ¥ I: .ƒ¥ iÑ; .ƒ¥öô< .ƒ§ ž= .ƒ¨!ùQ> .ƒ¨DWð? .ƒ¨FÁ]@ .ƒ¨uŠíA .ƒ¨€¦KB .ƒ©^®¯C .ƒ©Å^D éé1http://google.com/ “uįh“C5indexkeyword_search_terms_index2keyword_search_termsNCREATE INDEX keyword_search_terms_index2 ON keyword_search_terms (url_id)X /windexvisits_time_indexvisits*CREATE INDEX visits_time_index ON visits (visit_time)M'eindexsegments_namesegments-CREATE INDEX segments_name ON segments(name)S+mindexsegments_url_idsegments/CREATE INDEX segments_url_id ON segments(url_id)Q';indexsegment_usage_time_slot_segment_idsegment_usage0CREATE INDEX segment_usage_time_slot_segment_id ON segment_usage(time_slot, segment_id)n7' indexsegments_usage_seg_idsegment_usage1CREATE INDEX segments_usage_seg_id ON segment_usage(segment_id)G)_indexurls_url_indexurls2CREATE INDEX urls_url_index ON urls (url)C5?indexkeyword_search_terms_index1keyword_search_termsMCREATE INDEX keyword_search_terms_index1 ON keyword_search_terms (keyword_id, lower_term) úú ññ.zÂnØ úú6÷KÅTD÷EX3https://chrome.google.com/webstore/detail/mfjkgbjaikamkkojmakjclmkianficch?hl=en-US67†rghttp://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=90&slotn63‡&ŽOhttp://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=15&slotn5@Fhttp://www.google.ch/search?sourceid=chrome&ie=UTF-8&q=funny+cats4†=Œ}http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=600&slotB PP„µð4v¢Î=žÒ“3khttp://code.google.com/p/chrome-screen-capture/ 0ehttp://dfptools.doubleclick.net/web-console/:yhttp://dfptools.doubleclick.net/web-console/applet.jspC http://en.softsia.com/Cats-Photo-Screensaver-download-fvty.htm'Ahttp://en.softsia.com/Fun-Cats-Screensaver-download-sk6t.htm+[http://en.softsia.com/download-fvty.htm,+[http://en.softsia.com/download-sk6t.htm n_http://en.softsia.com/get.php?url=http%3A%2F%2Ffatloss4idiotsx.com%2Fdownload%2Ffuncats%2Ffuncats_scr.exe$`Chttp://en.softsia.com/get.php?url=http%3A%2F%2Fwww.photoscreensavers.us%2FCats%2520Demo.exe03khttp://en.softsia.com/soft-cats-download-1.html?ƒhttp://fls.doubleclick.net/activityi;src=2542116;type=clien612;cat=chromn1;ord=1;num=3835704319644.719;~oref=http%3A%2F%2Ftools.google.com%2Fchrome%2Fintl%2Fen%2Fwelcome.html?&_dc_ck=tryl[http://fls.doubleclick.net/activityi;src=2542116;type=clien612;cat=chromn1;ord=1;num=3835704319644.719? ˜˜rßL¹&“†"ŒGhttp://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=15&slotn;†%ŒMhttp://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=15&slotnC‡ Žhttp://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=280&slot9†Œ7http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=280&slot?†'ŒQhttp://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=280&slot>†*ŒWhttp://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=280&slotJ†7Œqhttp://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=280&slotH†0Œchttp://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=600&slotAame=2362198502&w=468&lmt=1306132510&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&dt=1306139710333&bpp=3&shv=r20110512&jsv=r20110506&prev_slotnames=6851072109%2C4758889056%2C8331150399&correlator=1306139710364&frm=0&adk=3316004872&ga_vid=331534367.1306139711&ga_sid=1306139711&ga_hid=15156107&ga_fc=0&u_tz=120&u_his=1&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1451&ref=http%3A%2F%2Fwww.google.ch%2Fsearch%3Fhl%3Dde%26q%3Dfunnycats.exe%26oq%3Dfunnycats.exe%26aq%3Df%26aqi%3D%26aql%3D%26gs_sm%3De%26gs_upl%3D1945l7105l0l25l23l5l5l2l0l156l1190l7.6&fu=0&ifi=4&dtd=427&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame4&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMeame=6851072109&w=728&lmt=1306132510&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&dt=1306139710279&bpp=10&shv=r20110512&jsv=r20110506&correlator=1306139710364&frm=0&adk=491424018&ga_vid=331534367.1306139711&ga_sid=1306139711&ga_hid=15156107&ga_fc=0&u_tz=120&u_his=1&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1451&ref=http%3A%2F%2Fwww.google.ch%2Fsearch%3Fhl%3Dde%26q%3Dfunnycats.exe%26oq%3Dfunnycats.exe%26aq%3Df%26aqi%3D%26aql%3D%26gs_sm%3De%26gs_upl%3D1945l7105l0l25l23l5l5l2l0l156l1190l7.6&fu=0&ifi=1&dtd=372&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame1&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe rßL¹&“†2Œghttp://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=600&slotF†?http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=600&slotG‡5Žmhttp://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=600&slot:†Œhttp://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=90&slotn=†Œ%http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=90&slotnI†Œhttp://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=90&slotn<† Œhttp://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=90&slotnDame=8331150399&w=200&lmt=1306132510&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&dt=1306139710321&bpp=8&shv=r20110512&jsv=r20110506&prev_slotnames=6851072109%2C4758889056&correlator=1306139710364&frm=0&adk=2524821587&ga_vid=331534367.1306139711&ga_sid=1306139711&ga_hid=15156107&ga_fc=0&u_tz=120&u_his=1&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1451&ref=http%3A%2F%2Fwww.google.ch%2Fsearch%3Fhl%3Dde%26q%3Dfunnycats.exe%26oq%3Dfunnycats.exe%26aq%3Df%26aqi%3D%26aql%3D%26gs_sm%3De%26gs_upl%3D1945l7105l0l25l23l5l5l2l0l156l1190l7.6&fu=0&ifi=3&dtd=384&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame3&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMename=4758889056&w=336&lmt=1306132510&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&dt=1306139710317&bpp=4&shv=r20110512&jsv=r20110506&prev_slotnames=6851072109&correlator=1306139710364&frm=0&adk=2755568142&ga_vid=331534367.1306139711&ga_sid=1306139711&ga_hid=15156107&ga_fc=0&u_tz=120&u_his=1&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1451&ref=http%3A%2F%2Fwww.google.ch%2Fsearch%3Fhl%3Dde%26q%3Dfunnycats.exe%26oq%3Dfunnycats.exe%26aq%3Df%26aqi%3D%26aql%3D%26gs_sm%3De%26gs_upl%3D1945l7105l0l25l23l5l5l2l0l156l1190l7.6&fu=0&ifi=2&dtd=363&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame2&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMename=9004213189&w=160&lmt=1306132511&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&dt=1306139710337&bpp=5&shv=r20110512&jsv=r20110506&prev_slotnames=6851072109%2C4758889056%2C8331150399%2C2362198502&correlator=1306139710364&frm=0&adk=2218770476&ga_vid=331534367.1306139711&ga_sid=1306139711&ga_hid=15156107&ga_fc=0&u_tz=120&u_his=1&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1451&ref=http%3A%2F%2Fwww.google.ch%2Fsearch%3Fhl%3Dde%26q%3Dfunnycats.exe%26oq%3Dfunnycats.exe%26aq%3Df%26aqi%3D%26aql%3D%26gs_sm%3De%26gs_upl%3D1945l7105l0l25l23l5l5l2l0l156l1190l7.6&fu=0&ifi=5&dtd=1446&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame5&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMeame=5520569487&w=468&lmt=1306132523&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FFun-Cats-Screensaver-download-sk6t.htm&dt=1306139723081&bpp=8&shv=r20110512&jsv=r20110506&prev_slotnames=6717989103&correlator=1306139723052&frm=0&adk=2899817075&ga_vid=1106494855.1306139723&ga_sid=1306139723&ga_hid=310523222&ga_fc=0&u_tz=120&u_his=2&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1451&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=2&dtd=57&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame2&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMeame=6717989103&w=728&lmt=1306132523&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FFun-Cats-Screensaver-download-sk6t.htm&dt=1306139723045&bpp=4&shv=r20110512&jsv=r20110506&correlator=1306139723052&frm=0&adk=3975326057&ga_vid=1106494855.1306139723&ga_sid=1306139723&ga_hid=310523222&ga_fc=0&u_tz=120&u_his=2&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1451&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=1&dtd=26&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame1&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMeame=3808192216&w=728&lmt=1306132525&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fdownload-sk6t.htm&dt=1306139725464&bpp=11&shv=r20110512&jsv=r20110506&correlator=1306139725485&frm=0&adk=4138530256&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=134103612&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1451&ref=http%3A%2F%2Fen.softsia.com%2FFun-Cats-Screensaver-download-sk6t.htm&fu=0&ifi=1&dtd=33&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame1&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe!name=6190345064&w=336&lmt=1306132525&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fdownload-sk6t.htm&dt=1306139725531&bpp=4&shv=r20110512&jsv=r20110506&prev_slotnames=3808192216%2C6190345064&correlator=1306139725485&frm=0&adk=124017538&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=134103612&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1451&ref=http%3A%2F%2Fen.softsia.com%2FFun-Cats-Screensaver-download-sk6t.htm&fu=0&ifi=3&dtd=18&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame3&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe"name=6190345064&w=336&lmt=1306132525&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fdownload-sk6t.htm&dt=1306139725505&bpp=4&shv=r20110512&jsv=r20110506&prev_slotnames=3808192216&correlator=1306139725485&frm=0&adk=124017538&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=134103612&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1451&ref=http%3A%2F%2Fen.softsia.com%2FFun-Cats-Screensaver-download-sk6t.htm&fu=0&ifi=2&dtd=17&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame2&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe# ýýj”Ìæ©Í[‡Ž5http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=90&slotn8)Whttp://start.ubuntu.com/10.04/Google/7shttp://tools.google.com/chrome/intl/en/welcome.html 7http://www.google.ch/Aƒhttp://www.google.ch/#hl=de&source=hp&biw=1257&bih=1414&q=grr&oq=grr&aq=f&aqi=g1g-s1g2g-s6&aql=&gs_sm=e&gs_upl=1084l1497l0l3l3l0l0l0l0l185l461l1.2&bav=on.2,or.r_gc.r_pw.&fp=e9e21f84998f5a4#Khttp://www.google.ch/blank.html ‚http://www.google.ch/search?hl=de&q=funnycats.exe&oq=funnycats.exe&aq=f&aqi=&aql=&gs_sm=e&gs_upl=1945l7105l0l25l23l5l5l2l0l156l1190l7.6#‚Ihttp://www.google.ch/search?hl=de&q=really+really+funny+cats&oq=really+really+funny+cats&aq=f&aqi=&aql=&gs_sm=e&gs_upl=4112l7623l0l24l21l0l14l14l0l146l639l5.2name=0203846796&w=160&lmt=1306132552&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FFun-Cats-Screensaver-download-sk6t.htm&dt=1306139752065&bpp=4&shv=r20110512&jsv=r20110506&prev_slotnames=6717989103%2C5520569487&correlator=1306139751836&frm=0&adk=668835015&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1083788595&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1404&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=3&dtd=18&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame3&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe%name=0203846796&w=160&lmt=1306132552&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FFun-Cats-Screensaver-download-sk6t.htm&dt=1306139752089&bpp=5&shv=r20110512&jsv=r20110506&prev_slotnames=6717989103%2C5520569487%2C0203846796&correlator=1306139751836&frm=0&adk=668835015&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1083788595&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1404&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=4&dtd=40&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame4&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe&ame=5520569487&w=468&lmt=1306132557&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FCats-Photo-Screensaver-download-fvty.htm&dt=1306139757904&bpp=5&shv=r20110512&jsv=r20110506&prev_slotnames=6717989103&correlator=1306139757813&frm=0&adk=2899817075&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1439309887&ga_fc=1&u_tz=120&u_his=2&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1404&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=2&dtd=21&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame2&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe(ame=6717989103&w=728&lmt=1306132557&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FCats-Photo-Screensaver-download-fvty.htm&dt=1306139757796&bpp=5&shv=r20110512&jsv=r20110506&correlator=1306139757813&frm=0&adk=3975326057&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1439309887&ga_fc=1&u_tz=120&u_his=2&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1404&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=1&dtd=53&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame1&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe) ii„àù4rõ_°9http://www.google.com/[9http://www.google.com/search?ie=UTF-8&oe=UTF-8&sourceid=navclient&gfns=1&q=java+plugin5http://www.java.com/:yhttp://www.java.com/inc/BrowserRedirect1.jsp?locale=en =http://www.symantec.com/de/de/business/products/index.jsp‚http://www.symantec.com/de/de/business/solutions/solutiondetail.jsp?solid=sol_info_risk_comp&solfid=sol_data_loss_preventioniUhttps://accounts.youtube.com/accounts/CheckConnection?pmpo=https%3A%2F%2Fwww.google.com&v=18712347174P#https://chrome.google.com/webstore/detail/ackpfhlmgjdjlohhjmbacaajbmkkklnp# O!https://chrome.google.com/webstore/detail/cpngackimfmofbokmjmljamhdncknpmg name=0203846796&w=160&lmt=1306132558&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FCats-Photo-Screensaver-download-fvty.htm&dt=1306139758054&bpp=6&shv=r20110512&jsv=r20110506&prev_slotnames=6717989103%2C5520569487&correlator=1306139757813&frm=0&adk=668835015&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1439309887&ga_fc=1&u_tz=120&u_his=2&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1404&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=3&dtd=92&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame3&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe*name=0203846796&w=160&lmt=1306132558&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FCats-Photo-Screensaver-download-fvty.htm&dt=1306139758150&bpp=5&shv=r20110512&jsv=r20110506&prev_slotnames=6717989103%2C5520569487%2C0203846796&correlator=1306139757813&frm=0&adk=668835015&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1439309887&ga_fc=1&u_tz=120&u_his=2&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1404&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=4&dtd=17&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame4&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe+name=6190345064&w=336&lmt=1306132561&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fdownload-fvty.htm&dt=1306139761304&bpp=5&shv=r20110512&jsv=r20110506&prev_slotnames=3808192216%2C6190345064&correlator=1306139761239&frm=0&adk=124017538&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1586020085&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1404&eid=36813005&ref=http%3A%2F%2Fen.softsia.com%2FCats-Photo-Screensaver-download-fvty.htm&fu=0&ifi=3&dtd=19&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame3&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe-ame=3808192216&w=728&lmt=1306132561&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fdownload-fvty.htm&dt=1306139761213&bpp=13&shv=r20110512&jsv=r20110506&correlator=1306139761239&frm=0&adk=4138530256&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1586020085&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1404&eid=36813005&ref=http%3A%2F%2Fen.softsia.com%2FCats-Photo-Screensaver-download-fvty.htm&fu=0&ifi=1&dtd=60&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame1&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.name=6190345064&w=336&lmt=1306132561&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fdownload-fvty.htm&dt=1306139761279&bpp=3&shv=r20110512&jsv=r20110506&prev_slotnames=3808192216&correlator=1306139761239&frm=0&adk=124017538&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1586020085&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1404&eid=36813005&ref=http%3A%2F%2Fen.softsia.com%2FCats-Photo-Screensaver-download-fvty.htm&fu=0&ifi=2&dtd=18&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame2&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe/ 44ŽçdÑY5https://chrome.google.com/webstore/detail/mfjkgbjaikamkkojmakjclmkianficch?hl=en-US#7X3https://chrome.google.com/webstore/detail/pjkljhegncpnkpknbcohdijeoejaedia?hl=en-US2/chttps://chrome.google.com/webstore?hl=en-US1Lhttps://chrome.google.com/webstore?hl=en-US&category=ext%2F15-by-google5pƒchttps://www.google.com/accounts/ServiceLogin?service=chromewebstore&passive=true&continue=https://cL.ahttps://www.mozilla.com/en-US/plugincheck/hrome.google.com/webstore/startbounce?continue%3Dhttps://chrome.google.com/webstore/detail/pjkljhegncpnkpknbcohdijeoejaedia?hl%253Den-US3 ¼ï¼Ð'funnycats.exe=really really funny cats!funny cats îúôîgrr-3.1.0.2/grr/config/grr-response-test/test_data/parser_test/History2000066400000000000000000002700001273104013200260500ustar00rootroot00000000000000SQLite format 3@ -â üÈkÓQ P à 5 Û  œŽ SÍx½'·nÖNÈC5indexkeyword_search_terms_index3keyword_search_termsCREATE INDEX keyword_search_terms_index3 ON keyword_search_terms (term)C5indexkeyword_search_terms_index2keyword_search_termsCREATE INDEX keyword_search_terms_index2 ON keyword_search_terms (url_id)C5?indexkeyword_search_terms_index1keyword_search_termsCREATE INDEX keyword_search_terms_index1 ON keyword_search_terms (keyword_id, lower_term)G)_indexurls_url_indexurlsCREATE INDEX urls_url_index ON urls (url)n7' indexsegments_usage_seg_idsegment_usageCREATE INDEX segments_usage_seg_id ON segment_usage(segment_id)Q';indexsegment_usage_time_slot_segment_idsegment_usageCREATE INDEX segment_usage_time_slot_segment_id ON segment_usage(time_slot, segment_id)8''‚/tablesegment_usagesegment_usageCREATE TABLE segment_usage (id INTEGER PRIMARY KEY,segment_id INTEGER NOT NULL,time_slot INTEGER NOT NULL,visit_count INTEGER DEFAULT 0 NOT NULL)S+mindexsegments_url_idsegmentsCREATE INDEX segments_url_id ON segments(url_id)M'eindexsegments_namesegmentsCREATE INDEX segments_name ON segments(name)p 3tablesegmentssegmentsCREATE TABLE segments (id INTEGER PRIMARY KEY,name VARCHAR,url_id INTEGER NON NULL)B 55‚'tabledownloads_url_chainsdownloads_url_chains CREATE TABLE downloads_url_chains (id INTEGER NOT NULL,chain_index INTEGER NOT NULL,url LONGVARCHAR NOT NULL, PRIMARY KEY (id, chain_index) )G [5indexsqlite_autoindex_downloads_url_chains_1downloads_url_chains ‚s …5tabledownloadsdownloads CREATE TABLE downloads (id INTEGER PRIMARY KEY,current_path LONGVARCHAR NOT NULL,target_path LONGVARCHAR NOT NULL,start_time INTEGER NOT NULL,received_bytes INTEGER NOT NULL,total_bytes INTEGER NOT NULL,state INTEGER NOT NULL,danger_type INTEGER NOT NULL, interrupt_reason INTEGER NOT NULL,end_time INTEGER NOT NULL,opened INTEGER NOT NULL)F 55‚/tablekeyword_search_termskeyword_search_terms CREATE TABLE keyword_search_terms (keyword_id INTEGER NOT NULL,url_id INTEGER NOT NULL,lower_term LONGVARCHAR NOT NULL,term LONGVARCHAR NOT NULL)X/windexvisits_time_indexvisits CREATE INDEX visits_time_index ON visits (visit_time)X/windexvisits_from_indexvisitsCREATE INDEX visits_from_index ON visits (from_visit)O-gindexvisits_url_indexvisitsCREATE INDEX visits_url_index ON visits (url)n%%tablevisit_sourcevisit_sourceCREATE TABLE visit_source(id INTEGER PRIMARY KEY,source INTEGER NOT NULL)~ƒWtablevisitsvisitsCREATE TABLE visits(id INTEGER PRIMARY KEY,url INTEGER NOT NULL,visit_time INTEGER NOT NULL,from_visit INTEGER,transition INTEGER DEFAULT 0 NOT NULL,segment_id INTEGER,is_indexed BOOLEAN,visit_duration INTEGER DEFAULT 0 NOT NULL)‚„tableurlsurlsCREATE TABLE urls(id INTEGER PRIMARY KEY,url LONGVARCHAR,title LONGVARCHAR,visit_count INTEGER DEFAULT 0 NOT NULL,typed_count INTEGER DEFAULT 0 NOT NULL,last_visit_time INTEGER NOT NULL,hidden INTEGER DEFAULT 0 NOT NULL,favicon_id INTEGER DEFAULT 0 NOT NULL)f/tablemetametaCREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR)';indexsqlite_autoindex_meta_1meta ¤òÔ¤.A/early_expiration_threshold13004550673278168;last_compatible_version16 version25 ¹¹ØôAearly_expiration_threshold;last_compatible_version version  @ r @0 3http://www.test.ch/Testshop.:h éƒ …https://www.google.ch/search?q=why+you+shouldn't+trust+beardy+unix+guys&oq=why+you+shouldn't+trust+beardy+unix+guys&aqs=chrome.0.57.36737j0&sourceid=chrome&ie=UTF-8#sclient=psy-ab&q=test&oq=test&gs_l=serp.12..0l4.8808.9098.0.10217.4.4.0.0.0.0.122.336.3j1.4.0...0.0...1c.1.12.psy-ab.cLezoFnPQOQ&pbx=1&bav=on.2,or.r_qf.&bvm=bv.45960087,d.Yms&fp=45ffec9180951345&biw=1487&bih=1003Testshop.:h éq ‚U{https://www.google.ch/search?q=why+you+shouldn't+trust+beardy+unix+guys&oq=why+you+shouldn't+trust+beardy+unix+guys&aqs=chrome.0.57.36737j0&sourceid=chrome&ie=UTF-8why you shouldn't trust beardy unix guys - Google-Suche.:h TaÛ ŽäÈ¬Ž .:h é  .:h é .:h û|I` .:h TaÛ2  èúôîè èúîôè ÌóæÙÌ .:h é .:h é .:h û|I .:h TaÛ N§NW]]why you shouldn't trust beardy unix guyswhy you shouldn't trust beardy unix guysW]]why you shouldn't trust beardy unix guyswhy you shouldn't trust beardy unix guys           ½ ½U Õ3http://www.test.ch/‚~…https://www.google.ch/search?q=why+you+shouldn't+trust+beardy+unix+guys&oq=why+you+shouldn't+trust+beardy+unix+guys&aqs=chrome.0.57.36737j0&sourceid=chrome&ie=UTF-8#sclient=psy-ab&q=test&oq=test&gs_l=serp.12..0l4.8808.9098.0.10217.4.4.0.0.0.0.122.336.3j1.4.0...0.0...1c.1.12.psy-ab.cLezoFnPQOQ&pbx=1&bav=on.2,or.r_qf.&bvm=bv.45960087,d.Yms&fp=45ffec9180951345&biw=1487&bih=1003)‚Uhttps://www.google.ch/search?q=why+you+shouldn't+trust+beardy+unix+guys&oq=why+you+shouldn't+trust+beardy+unix+guys&aqs=chrome.0.57.36737j0&sourceid=chrome&ie=UTF-8 ¢Ñ¢.]why you shouldn't trust beardy unix guys.]why you shouldn't trust beardy unix guys ôúô ¦Ó¦,]why you shouldn't trust beardy unix guys,]why you shouldn't trust beardy unix guysgrr-3.1.0.2/grr/config/grr-response-test/test_data/parser_test/History3000066400000000000000000002700001273104013200260510ustar00rootroot00000000000000SQLite format 3@ -â ü kÓQ c ó ¢ H î %àÒ—`¼kû²’ C5indexkeyword_search_terms_index3keyword_search_termsCREATE INDEX keyword_search_terms_index3 ON keyword_search_terms (term)C5indexkeyword_search_terms_index2keyword_search_termsCREATE INDEX keyword_search_terms_index2 ON keyword_search_terms (url_id)C5?indexkeyword_search_terms_index1keyword_search_termsCREATE INDEX keyword_search_terms_index1 ON keyword_search_terms (keyword_id, lower_term)G)_indexurls_url_indexurlsCREATE INDEX urls_url_index ON urls (url)n7' indexsegments_usage_seg_idsegment_usageCREATE INDEX segments_usage_seg_id ON segment_usage(segment_id)Q';indexsegment_usage_time_slot_segment_idsegment_usageCREATE INDEX segment_usage_time_slot_segment_id ON segment_usage(time_slot, segment_id)8''‚/tablesegment_usagesegment_usageCREATE TABLE segment_usage (id INTEGER PRIMARY KEY,segment_id INTEGER NOT NULL,time_slot INTEGER NOT NULL,visit_count INTEGER DEFAULT 0 NOT NULL)S+mindexsegments_url_idsegmentsCREATE INDEX segments_url_id ON segments(url_id)M'eindexsegments_namesegmentsCREATE INDEX segments_name ON segments(name)p 3tablesegmentssegmentsCREATE TABLE segments (id INTEGER PRIMARY KEY,name VARCHAR,url_id INTEGER NON NULL)B 55‚'tabledownloads_url_chainsdownloads_url_chains CREATE TABLE downloads_url_chains (id INTEGER NOT NULL,chain_index INTEGER NOT NULL,url LONGVARCHAR NOT NULL, PRIMARY KEY (id, chain_index) )G [5indexsqlite_autoindex_downloads_url_chains_1downloads_url_chains „B ˆStabledownloadsdownloads CREATE TABLE downloads (id INTEGER PRIMARY KEY,current_path LONGVARCHAR NOT NULL,target_path LONGVARCHAR NOT NULL,start_time INTEGER NOT NULL,received_bytes INTEGER NOT NULL,total_bytes INTEGER NOT NULL,state INTEGER NOT NULL,danger_type INTEGER NOT NULL,interrupt_reason INTEGER NOT NULL,end_time INTEGER NOT NULL,opened INTEGER NOT NULL,referrer VARCHAR NOT NULL,by_ext_id VARCHAR NOT NULL,by_ext_name VARCHAR NOT NULL,etag VARCHAR NOT NULL,last_modified VARCHAR NOT NULL,mime_type VARCHAR(255) NOT NULL,original_mime_type VARCHAR(255) NOT NULL)F 55‚/tablekeyword_search_termskeyword_search_terms CREATE TABLE keyword_search_terms (keyword_id INTEGER NOT NULL,url_id INTEGER NOT NULL,lower_term LONGVARCHAR NOT NULL,term LONGVARCHAR NOT NULL)X/windexvisits_time_indexvisits CREATE INDEX visits_time_index ON visits (visit_time)X/windexvisits_from_indexvisitsCREATE INDEX visits_from_index ON visits (from_visit)O-gindexvisits_url_indexvisitsCREATE INDEX visits_url_index ON visits (url)n%%tablevisit_sourcevisit_sourceCREATE TABLE visit_source(id INTEGER PRIMARY KEY,source INTEGER NOT NULL)kƒ1tablevisitsvisitsCREATE TABLE visits(id INTEGER PRIMARY KEY,url INTEGER NOT NULL,visit_time INTEGER NOT NULL,from_visit INTEGER,transition INTEGER DEFAULT 0 NOT NULL,segment_id INTEGER,visit_duration INTEGER DEFAULT 0 NOT NULL)‚„tableurlsurlsCREATE TABLE urls(id INTEGER PRIMARY KEY,url LONGVARCHAR,title LONGVARCHAR,visit_count INTEGER DEFAULT 0 NOT NULL,typed_count INTEGER DEFAULT 0 NOT NULL,last_visit_time INTEGER NOT NULL,hidden INTEGER DEFAULT 0 NOT NULL,favicon_id INTEGER DEFAULT 0 NOT NULL)f/tablemetametaCREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR)';indexsqlite_autoindex_meta_1meta ¤òÔ¤.A/early_expiration_threshold13041104111242869;last_compatible_version16 version29 ¹¹ØôAearly_expiration_threshold;last_compatible_version version › Ÿ‚!  ¡ ¡ ±  °  ©Ùƒ…i [ghttp://en.wikipedia.org/wiki/4_(number)4 (number) - Wikipedia, the free encyclopedia.[¦ÏþŠ5 g5https://www.google.com/search?q=four&oq=four&aqs=chrome..69i57j0l5.1607j0j7&sourceid=chrome&es_sm=91&ie=UTF-8four - Google Search.[¦Ï¶íÔb )https://www.google.com/intl/en-US/chrome/browser/thankyou.htmlChrome Browser.[¦ÏL T o)https://www.google.com/intl/en-US/chrome/browser/Chrome Browser.[¦ÏÑwM ‚/Yhttps://www.google.com/search?q=download+google+chrome&oq=download+google+chrome&aqs=chrome..69i57j0l5.2743j0j7&sourceid=chrome&es_sm=91&ie=UTF-8download google chrome - Google Search.[¦ÎÙìi [ghttp://en.wikipedia.org/wiki/3_(number)3 (number) - Wikipedia, the free encyclopedia.[¦Îe/ï i7https://www.google.com/search?q=three&oq=three&aqs=chrome..69i57j0l5.636j0j4&sourceid=chrome&es_sm=91&ie=UTF-8three - Google Search.[¦Î$h€i [ghttp://en.wikipedia.org/wiki/2_(number)2 (number) - Wikipedia, the free encyclopedia.[¦ÍŽó¨ a3https://www.google.com/search?q=two&oq=two&aqs=chrome..69i57j0l5.419j0j7&sourceid=chrome&es_sm=91&ie=UTF-8two - Google Search.[¦ÍpnÅX a?http://www.youtube.com/watch?v=EzgGTTtR0kcMetallica - One - YouTube.[¦Ì¼ö a3https://www.google.com/search?q=one&oq=one&aqs=chrome..69i57j0l5.335j0j7&sourceid=chrome&es_sm=91&ie=UTF-8one - Google Search.[¦Ìi#†u [http://www.eicar.org/85-0-Download.htmlDownload ° EICAR - European Expert Group for IT-Security.[¦Ë¾†s ghttp://www.eicar.org/anti_virus_test_file.htmIntended use ° EICAR - European Expert Group for IT-Security.[¦Ë¡_lß~ chttp://www.eicar.org/86-0-Intended-use.htmlIntended use ° EICAR - European Expert Group for IT-Security.[¦Ë¡_l_ 7whttp://www.eicar.org/Home ° EICAR - European Expert Group for IT-Security.[¦ËDåW[ /whttp://eicar.org/Home ° EICAR - European Expert Group for IT-Security.[¦ËDåWd,W s+http://tools.google.com/chrome/intl/en/welcome.htmlGetting Started.[¦Ê¨¸;(_ +https://www.google.com/intl/en/chrome/browser/welcome.htmlGetting Started.[¦Ê¨¸ 8 æÈ®Zx" ” ªÔº  ÇlR ä.[¦Ë¾†s0Q¶ó  .[¦Ì¼ö0T"¤ .[¦Îe/ï0ªàÏ.[¦ÏL `Ãõ¢.[¦ÏþŠ50_˜.[¦Ï¶íÔ2†.[¦ÏÑw0.[¦ÎÙì2î  .[¦Î$h€2  .[¦ÍŽó¨0  .[¦ÍpnÅ2@  .[¦Ì°ä“0.[¦Ë¡_l '.[¦ËDåW \z.[¦Ë¡_l.[¦Ìi#†2.[¦ËDåW.[¦Ê¨¸ I€".[¦Ê¨¸  ŽúôîèâÜÖÐÊľ¸²¬¦ š”Ž       ŽúîÐÊľ¸²¬¦ ”ŽôèâÜÖš       óæÙÌ¿²¥˜‹~qdWJ=0# .[¦ÏþŠ5 .[¦Ï¶íÔ .[¦ÏL  .[¦ÏÑw .[¦ÎÙì .[¦Îe/ï .[¦Î$h€ .[¦ÍŽó¨ .[¦ÍpnÅ .[¦Ì¼ö .[¦Ì°ä“ .[¦Ìi#† .[¦Ë¾†s .[¦Ë¡_l .[¦Ë¡_l .[¦ËDåW .[¦ËDåW .[¦Ê¨¸ .[¦Ê¨¸ ‰ñâÏš‰fourfour399download google chromedownload google chrome threethree  twotwo oneone  àeÆ û à‚YY GGG/Users/temp/Downloads/googlechrome.dmg/Users/temp/Downloads/googlechrome.dmg.[¦ÏWñ‚Å»‚Å».[¦Ïö„»https://www.google.com/intl/en-US/chrome/browser/thankyou.html"440b8"Tue, 10 Jun 2014 16:30:00 GMTapplication/x-apple-diskimageapplication/x-apple-diskimageHSS[ ==/Users/temp/Downloads/eicar_com.zip/Users/temp/Downloads/eicar_com.zip.[¦ÍÞÃo¸¸.[¦Íå }http://www.eicar.org/85-0-Download.htmlapplication/octet-streamapplication/octet-stream S[ ==/Users/temp/Downloads/eicar.com.txt.[¦Í9XcDDhttp://www.eicar.org/85-0-Download.htmlapplication/octet-streamapplication/octet-stream K[ ==/Users/temp/Downloads/eicar.com.[¦Ì ôDDhttp://www.eicar.org/85-0-Download.htmlapplication/octet-streamapplication/octet-stream %Ñžk%Dhttps://dl.google.com/chrome/mac/stable/GGRO/googlechrome.dmg1chttp://www.eicar.org/download/eicar_com.zip1chttp://www.eicar.org/download/eicar.com.txt-[http://www.eicar.org/download/eicar.com àøðèà èè/http://eicar.org/ êê/http://eicar.org/ úú ïï.[ž}ªÜ ññ.[ž}ªÜ úú  >r ï >ÈXÊö&+ ! ݈ W jZ  »+[http://en.wikipedia.org/wiki/4_(number)rghttps://www.google.com/search?q=four&oq=four&aqs=chrome..69i57j0l5.1607j0j7&sourceid=chrome&es_sm=91&ie=UTF-8C https://www.google.com/intl/en-US/chrome/browser/thankyou.html5ohttps://www.google.com/intl/en-US/chrome/browser/‚/https://www.google.com/search?q=download+google+chrome&oq=download+google+chrome&aqs=chrome..69i57j0l5.2743j0j7&sourceid=chrome&es_sm=91&ie=UTF-8+[http://en.wikipedia.org/wiki/3_(number) sihttps://www.google.com/search?q=three&oq=three&aqs=chrome..69i57j0l5.636j0j4&sourceid=chrome&es_sm=91&ie=UTF-8 +[http://en.wikipedia.org/wiki/2_(number) oahttps://www.google.com/search?q=two&oq=two&aqs=chrome..69i57j0l5.419j0j7&sourceid=chrome&es_sm=91&ie=UTF-8 .ahttp://www.youtube.com/watch?v=EzgGTTtR0kc oahttps://www.google.com/search?q=one&oq=one&aqs=chrome..69i57j0l5.335j0j7&sourceid=chrome&es_sm=91&ie=UTF-8+[http://www.eicar.org/85-0-Download.html/chttp://www.eicar.org/86-0-Intended-use.html1ghttp://www.eicar.org/anti_virus_test_file.htm7http://www.eicar.org//http://eicar.org/?https://www.google.com/intl/en/chrome/browser/welcome.html7shttp://tools.google.com/chrome/intl/en/welcome.html ¸Ã¸öàì four9download google chrome three two one âúôîèâ   ÂËÂøæðfour9download google chrome threetwoonecom.apple.LaunchServices.QuarantineEvents000066400000000000000000000100001273104013200343240ustar00rootroot00000000000000grr-3.1.0.2/grr/config/grr-response-test/test_data/parser_testSQLite format 3@  üXé¹X9/AindexLSQuarantineEventIndexLSQuarantineEventCREATE INDEX LSQuarantineEventIndex ON LSQuarantineEvent ( LSQuarantineEventIdentifier )ƒM//†ItableLSQuarantineEventLSQuarantineEventCREATE TABLE LSQuarantineEvent ( LSQuarantineEventIdentifier TEXT PRIMARY KEY NOT NULL, LSQuarantineTimeStamp REAL, LSQuarantineAgentBundleIdentifier TEXT, LSQuarantineAgentName TEXT, LSQuarantineDataURLString TEXT, LSQuarantineSenderName TEXT, LSQuarantineSenderAddress TEXT, LSQuarantineTypeNumber INTEGER, LSQuarantineOriginTitle TEXT, LSQuarantineOriginURLString TEXT, LSQuarantineOriginAlias BLOB )AU/indexsqlite_autoindex_LSQuarantineEvent_1LSQuarantineEvent ÆŒÆC U/'sDE3CC2A7-603B-4441-8E58-2F0D8C086FB3zJ²com.google.ChromeGoogle Chromehttps://hilariouscatsdownload.com/badfile?dat=funny_cats.exehttps://mail.google.com/mail/?ui=2&view=bsp&ver=bn4r U7#AF56A3C1E-D965-440E-8206-5952EF7EE688A³wËå¿8com.apple.PubSubAgentPubSubAgenthttp://test.com?output=rss ®×®(UF56A3C1E-D965-440E-8206-5952EF7EE688(UDE3CC2A7-603B-4441-8E58-2F0D8C086FB3 ®×®(UF56A3C1E-D965-440E-8206-5952EF7EE688(UDE3CC2A7-603B-4441-8E58-2F0D8C086FB3grr-3.1.0.2/grr/config/grr-response-test/test_data/parser_test/com.google.code.grr.bplist000066400000000000000000000005651273104013200313630ustar00rootroot00000000000000bplist00bybiplist1.0Ù  XUserNameYRunAtLoad_StandardOutPathULabelYKeepAliveYGroupName_ProgramArguments_ServiceDescription_StandardErrorPathTroot Y/dev/null_com.google.code.grrVdaemon¢_"/usr/lib/grr/grr_3.0.0.5_amd64/grr_0--config=/usr/lib/grr/grr_3.0.0.5_amd64/grr.yamlSgrr(1;MS]gz£¨©³ÉÐ+Óø/grr-3.1.0.2/grr/config/grr-response-test/test_data/parser_test/com.google.code.grr.plist000066400000000000000000000013361273104013200312160ustar00rootroot00000000000000 Label com.google.code.grr UserName root GroupName daemon ProgramArguments /usr/lib/grr/grr_3.0.0.5_amd64/grr --config=/usr/lib/grr/grr_3.0.0.5_amd64/grr.yaml KeepAlive RunAtLoad ServiceDescription grr StandardOutPath /dev/null StandardErrorPath /dev/null grr-3.1.0.2/grr/config/grr-response-test/test_data/parser_test/crontab000066400000000000000000000000361273104013200257550ustar00rootroot000000000000001 2 3 4 5 /usr/bin/echo "test"grr-3.1.0.2/grr/config/grr-response-test/test_data/parser_test/dasinfra_metadata.yaml000066400000000000000000000000171273104013200307140ustar00rootroot00000000000000toast: 'false' grr-3.1.0.2/grr/config/grr-response-test/test_data/parser_test/lsb-release000066400000000000000000000002131273104013200265200ustar00rootroot00000000000000DISTRIB_CODENAME=trusty DISTRIB_DESCRIPTION="Ubuntu 14.04 LTS (upgraded from: Ubuntu 12.04.4 LTS)" DISTRIB_ID=Ubuntu DISTRIB_RELEASE=14.04 grr-3.1.0.2/grr/config/grr-response-test/test_data/parser_test/lsb-release-bad000066400000000000000000000000141273104013200272430ustar00rootroot00000000000000A=d B=e C=f grr-3.1.0.2/grr/config/grr-response-test/test_data/parser_test/lsb-release-notubuntu000066400000000000000000000000511273104013200305610ustar00rootroot00000000000000DISTRIB_ID=NotUbuntu DISTRIB_RELEASE=5.5 grr-3.1.0.2/grr/config/grr-response-test/test_data/parser_test/oracle-release000066400000000000000000000000401273104013200272030ustar00rootroot00000000000000Oracle Linux Server release 6.5 grr-3.1.0.2/grr/config/grr-response-test/test_data/parser_test/oracle-release-bad000066400000000000000000000000301273104013200277260ustar00rootroot00000000000000Oracle Linux Server 6.5 grr-3.1.0.2/grr/config/grr-response-test/test_data/places.sqlite000066400000000000000000005000001273104013200245350ustar00rootroot00000000000000SQLite format 3@ ( -âûûû#û"B e âùòëäݰ‰RÆ·Õ;¨ ˜yqiaYJB:2*" úòêâÚÒʺ²ª¢š’Š‚zrjbZRJB:2*"  ú ò ê â Ú Ò Ê Â º ² ª ¢ š ’ Š ‚ z r j b Z R J B : 2 * "    ú ò ê â[eZdYcXbWaV`U_T^S]R\Q[PZOYNXMWLVKUJTISHRGQFPEODNCMBLAK@J?I>H=G<F;E:D9C8B7A6@5?4>3=2<1;0:/9.8-7,6+5*4)3(2'1&0%/$.#-",!+ *)('&%$#"!            e ØøðèàØÐÈÀ¸°¨€XPH ˜ˆxph`@80( øðèàØÐÈÀ¸°¨ ˜ˆ€xph`XPH@80(  ø ð è à Ø Ð È À ¸ ° ¨   ˜ ˆ € x p h ` X P H @ 8 0 (    ø ð è à ØMeLdKcJbIaH`G_F^E]D\C[BZAY@X?W>V=U%=$<#;":!9 876543210/.-,+*)('& % $ # " !          e ŽqòȺcäÖ±«œTE6' ûìÝο¢“„ufWH9* ý î ß Ð Á ² £ ” … v g X I : +  þ ï à Ñ Â ³ ¤ • † w h Y J ; ,   ÿ ð á Ò Ã ´ ¥ – ‡ x i Z K < -   ñ â Ó Ä µ ¦ — ˆ y j [ L = . [§óô¿eZ§óópdY§óò"cX§óðÜbW§óïaV§óîJ`U§óìù_T§óë´^S§óêi]R§óé#\Q§óçÜ[P§óæŒZO§óå%YN§óãÛXM§óâŽWL§óáIVK§óàUJ§óÞµTI§óÝrSH§óÜ*RG§óÚçQF§óÙ¢PE§óØ`OD§ó×NC§óÕ½MB§óÔtLA§óÓ,K@§óÑæJ?§óÐ¥I>§óÏZH=§óÎG<§óÌÊF;§óË…E:§óÊ=D9§óÈãC8§óÇžB7§óÆXA6§óÅ @5§óÃÍ?4§ó„>3§óÁF=2§óÀ<1§ó¾®;0§ó½l:/§ó¼.9.§óºá8-§ó¹”7,§ó¸O6+§ó· 5*§óµÃ4)§ó´|3(§ó³52'§ó±ô1&§ó°©0%§ó¯a/$§ó®.#§ó¬Ü-"§ó«Ÿ,!§óªZ+ §ó©*§ó§Ü)§ó¦•(§ó¥U'§ó¤&§ó¢Ö%§ó¡š$§ó Y#§óŸ"§óÖ!§óœ› §ó›W§óš§ó˜Û§ó—‡§ó–I§ó• §ó“À§ó’G §üzC žûBÌÿÐ §=ÞÛ žûBÍ%‚ žûBÍ"c žûBÍAžûBÍ 1Ô;bÈ€2;<ŠRÀ2;<ŠRÀ2;<ŠRÀ 2;<ŠRÀ §=Ö žûBÍë žûBÌû¹ žûBɈ«§=Á/§=¿~ §=ºË §:¢Y §=àØ §=ÖY §:¡y ÆôêÝÓÆ unfiledtags toolbarmenu places Ëìõ×àË unfiledtags toolbarmenu places     Á Á†<c‹~http://www.gstatic.com/news/img/favicon.ico‰PNG  IHDRóÿaÀIDAT8½“[H“qÅÿ/AIXØC!BCV©“oÎÛÌ ssnæt[šˆI‘ó’.ñú`–æ&ÎÊJLí!Ó%˜3Ø$[Í©ÛüJÄ[2HI¡œ–Ú<½IT$½tžÏópÎ!äÈÓÓó/ÅIgR”Ç?,6;\%Ö‡Fð×ó Š ‘Ê×$ÒÉ_!ƒ±ŸEùÇKâä£EÅŽgÏûá0ñE]…Qƒ™ÙÊeoŠòý=Å:ÈŠIÉ)téµòMƒa+==øx%ö°,…‡`½¡/ÁãG¯2~‡waŠŠHI½hÉ/,Þ5aU«Å´L†é.æNs±Ru›æQ`µÎÅ"Õ†ÞÞ^ ê “'N77¦k@Pp@(Ú¨®Ñ`iy9åïq¾ÆÚL)v,.pZÂ>Q†ŽŽGP©UP©Uxm4"ó²ÒAŽ{2¢˜ØíšÚZDDFA7ô™e“8d‚ur ¯šZ Tj4µèõzÌÌ΢üz!„°9E@`ð·J•ŠŒ,Øl6„&™‘_9‹Õº›z·© &“ 4Mãv]=„¢Çn\n¨ŒÇ8Î%£­½ýƒãp | ëqt<é€V«…yl ]]H½piëL¼Ôìííwâ—1ya¼4E ÃÃf¾Á­;FŒŒŒàiw7”¹y'$·óiþ¸Dÿ  dA´ØYWßÝÐZ¶"[™‹X©ìƒ@(ºÊd2]÷ü›P-Ž…ôlâO ü-.qwwwÙüYL/Ÿj/_vÜ^¾ˆ0ÁýÌIEND®B`‚image/png§Œöš[û ÐÐ/chttp://www.gstatic.com/news/img/favicon.ico   hPçħ’}PP3livemark/expiration-livemark/siteURI-livemark/feedURI=placesInternal/READ_ONLY!IbookmarkProperties/description5Places/SmartBookmark hPçÄP’}§§3livemark/expiration-livemark/siteURI-livemark/feedURI=placesInternal/READ_ONLY"IbookmarkProperties/description5Places/SmartBookmark  Ó®G!J´m ( +1309522451689.0§ûM]! 1§=á%§=â‡E ehttp://www.bbc.co.uk/go/rss/int/news/-/news/§=âO yhttp://fxfeeds.mozilla.com/en-US/firefox/headlines.xml§=áy$ #MostVisited§=ÞÌe # Information and resources about Ubuntu, Debian and Free Software in general§=Õí# !RecentTags§=Á+ 1RecentlyBookmarked§=¿J ÀøðèàØÐÈÀ ö(ûö%B$"¯'¯&Lhttp://www.bbc.co.uk/go/rss/int/news/-/news/world-asia-pacific-139864568 \3ûöñìçâÝØÓÎÉÄ¿ºµ°«¦¡œ—’ˆƒ~ytoje`[VQLGB=83.)$ ü÷òíèãÞÙÔÏÊÅÀ»¶±¬§¢˜“މ„zupkfa\WRMHC>93\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!       \ -ûö$Þ}Ŭ ñ Ý ÉüéÖðŠwdQ>+ ¶ £ } j W D 1  ø å Ò ¿ ¬ ™ † s ` M : '   î Û È µ ¢ | i V C 0  ÷ ä Ñ ¾ « ˜ … r _ L 9 &  í Ú Ç ´ ¡ Ž { h U BhS>) -‘-moc.elgoog.swen.\)ku.oc.cbb.www.[)ku.oc.cbb.www.Z)ku.oc.cbb.www.Y)ku.oc.cbb.www.X)ku.oc.cbb.www.W)ku.oc.cbb.www.V)ku.oc.cbb.www.U)ku.oc.cbb.www.T)ku.oc.cbb.www.S)ku.oc.cbb.www.R)ku.oc.cbb.www.Q)ku.oc.cbb.www.P)ku.oc.cbb.www.O)ku.oc.cbb.www.N)ku.oc.cbb.www.M)ku.oc.cbb.www.L)ku.oc.cbb.www.K)ku.oc.cbb.www.J)ku.oc.cbb.www.I)ku.oc.cbb.www.H)ku.oc.cbb.www.G)ku.oc.cbb.www.F)ku.oc.cbb.www.E)ku.oc.cbb.www.D)ku.oc.cbb.www.C)ku.oc.cbb.www.B)ku.oc.cbb.www.A)ku.oc.cbb.www.@)ku.oc.cbb.www.?)ku.oc.cbb.www.>)ku.oc.cbb.www.=)ku.oc.cbb.www.<)ku.oc.cbb.www.;)ku.oc.cbb.www.:)ku.oc.cbb.www.9)ku.oc.cbb.www.8)ku.oc.cbb.www.7)ku.oc.cbb.www.6)ku.oc.cbb.www.5)ku.oc.cbb.www.4)ku.oc.cbb.www.3)ku.oc.cbb.www.2)ku.oc.cbb.www.1)ku.oc.cbb.www.0)ku.oc.cbb.www./)ku.oc.cbb.www..)ku.oc.cbb.www.-)ku.oc.cbb.www.,)ku.oc.cbb.www.+)ku.oc.cbb.www.*)ku.oc.cbb.www.))ku.oc.cbb.www.()ku.oc.cbb.www.')ku.oc.cbb.www.&)ku.oc.cbb.www.%)ku.oc.cbb.www.$)ku.oc.cbb.www.#)ku.oc.cbb.www.")ku.oc.cbb.www.!)ku.oc.cbb.www. )ku.oc.cbb.www.+ku.oc.cbb.swen.+ku.oc.cbb.swen.+ku.oc.cbb.swen.)ku.oc.cbb.www.)ku.oc.cbb.www.)ku.oc.cbb.www.)ku.oc.cbb.www.)ku.oc.cbb.www.)ku.oc.cbb.www.)ku.oc.cbb.www.)ku.oc.cbb.www.)ku.oc.cbb.www.)ku.oc.cbb.www.)ku.oc.cbb.www.)ku.oc.cbb.www.)ku.oc.cbb.www.)ku.oc.cbb.www.-moc.allizom.www.  -moc.allizom.www. -moc.allizom.www. -moc.allizom.www. -moc.allizom.www.+gro.naibed.www.9ten.daphcnual.srewsna.5gro.xunilutnubu.www.5gro.xunilutnubu.www.3gro.allizom.snodda. \ ØúôîèâÜÖÐÊľ¸²¬¦ š”Žˆ‚|vpjd^XRLF@:4.(" þøòìæàÚÔÎȼ¶°ª¤ž˜’Œ†€ztnhb\VPJD>82,&  ü ö ð ê ä Þ Ø\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!       \ Íúô¯¢œ–Š„~xrlf`ZTNHB<60*$ úôîèâÜÖÐÊľ¸²¬¦ š”Žˆ‚|vpjd^XRLF@:4.("  þ ø ò ì æ à Ú ÔíæßØÑÊüµ¨ ÍÐ\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"! Œ  Œ Œ Œ ŒŒŒŒŒŒ \,ûöñìçâÝØÓÎÉÄ¿ºµ°«¦¡œ—’ˆƒ~ytoje`[VQLGB=83.)$ ü÷òíèãÞÙÔÏÊÅÀ»¶±¬§¢˜“މ„zupkfa\WRMHC>9, §%¶\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!       ëë\§%¶ mmwê i ý ‡ Î L … × @ ç n‚''ƒMtablemoz_bookmarksmoz_bookmarksCREATE TABLE moz_bookmarks ( id INTEGER PRIMARY KEY, type INTEGER, fk INTEGER DEFAULT NULL, parent INTEGER, position INTEGER, title LONGVARCHAR, keyword_id INTEGER, folder_type TEXT, dateAdded INTEGER, lastModified INTEGER)q;' indexmoz_bookmarks_itemindexmoz_bookmarksCREATE INDEX moz_bookmarks_itemindex ON moz_bookmarks (fk, type)}?'!indexmoz_bookmarks_parentindexmoz_bookmarksCREATE INDEX moz_bookmarks_parentindex ON moz_bookmarks (parent, position)S'5indexmoz_bookmarks_itemlastmodifiedindexmoz_bookmarksCREATE INDEX moz_bookmarks_itemlastmodifiedindex ON moz_bookmarks (fk, lastModified)335tablemoz_bookmarks_rootsmoz_bookmarks_rootsCREATE TABLE moz_bookmarks_roots ( root_name VARCHAR(16) UNIQUE, folder_id INTEGER)EY3indexsqlite_autoindex_moz_bookmarks_roots_1moz_bookmarks_roots|%%;tablemoz_keywordsmoz_keywordsCREATE TABLE moz_keywords ( id INTEGER PRIMARY KEY AUTOINCREMENT, keyword TEXT UNIQUE)7K%indexsqlite_autoindex_moz_keywords_1moz_keywords P ++Ytablesqlite_sequencesqlite_sequence CREATE TABLE sqlite_sequence(name,seq)‚f W'„Wtriggermoz_bookmarks_beforedelete_v1_triggermoz_bookmarksCREATE TRIGGER moz_bookmarks_beforedelete_v1_trigger BEFORE DELETE ON moz_bookmarks FOR EACH ROW WHEN OLD.keyword_id NOT NULL BEGIN DELETE FROM moz_keywords WHERE id = OLD.keyword_id AND NOT EXISTS ( SELECT id FROM moz_bookmarks WHERE keyword_id = OLD.keyword_id AND id <> OLD.id LIMIT 1 );END$ %%‚ tablemoz_faviconsmoz_favicons CREATE TABLE moz_favicons ( id INTEGER PRIMARY KEY, url LONGVARCHAR UNIQUE, data BLOB, mime_type VARCHAR(32), expiration LONG)7 K%indexsqlite_autoindex_moz_favicons_1moz_favicons ‚K „etablemoz_annosmoz_annos CREATE TABLE moz_annos ( id INTEGER PRIMARY KEY, place_id INTEGER NOT NULL, anno_attribute_id INTEGER, mime_type VARCHAR(32) DEFAULT NULL, content LONGVARCHAR, flags INTEGER DEFAULT 0, expiration INTEGER DEFAULT 0, type INTEGER DEFAULT 0, dateAdded INTEGER DEFAULT 0, lastModified INTEGER DEFAULT 0)GEindexmoz_annos_placeattributeindexmoz_annosCREATE UNIQUE INDEX moz_annos_placeattributeindex ON moz_annos (place_id, anno_attribute_id) ½Ãgú A   G  t ÛG¶6ÍGÁÃ|6--‚tablemoz_inputhistorymoz_inputhistory CREATE TABLE moz_inputhistory ( place_id INTEGER NOT NULL, input LONGVARCHAR NOT NULL, use_count INTEGER, PRIMARY KEY (place_id, input))?S-indexsqlite_autoindex_moz_inputhistory_1moz_inputhistory!C/!indexmoz_historyvisits_dateindexmoz_historyvisitsCREATE INDEX moz_historyvisits_dateindex ON moz_historyvisits (visit_date)C/!indexmoz_historyvisits_fromindexmoz_historyvisitsCREATE INDEX moz_historyvisits_fromindex ON moz_historyvisits (from_visit)M/?indexmoz_historyvisits_placedateindexmoz_historyvisitsCREATE INDEX moz_historyvisits_placedateindex ON moz_historyvisits (place_id, visit_date)33Gtablemoz_anno_attributesmoz_anno_attributesCREATE TABLE moz_anno_attributes ( id INTEGER PRIMARY KEY, name VARCHAR(32) UNIQUE NOT NULL)EY3indexsqlite_autoindex_moz_anno_attributes_1moz_anno_attributes‚\++„otablemoz_items_annosmoz_items_annosCREATE TABLE moz_items_annos ( id INTEGER PRIMARY KEY, item_id INTEGER NOT NULL, anno_attribute_id INTEGER, mime_type VARCHAR(32) DEFAULT NULL, content LONGVARCHAR, flags INTEGER DEFAULT 0, expiration INTEGER DEFAULT 0, type INTEGER DEFAULT 0, dateAdded INTEGER DEFAULT 0, lastModified INTEGER DEFAULT 0)$Q+Yindexmoz_items_annos_itemattributeindexmoz_items_annosCREATE UNIQUE INDEX moz_items_annos_itemattributeindex ON moz_items_annos (item_id, anno_attribute_id)‚F!!„Wtablemoz_placesmoz_placesCREATE TABLE moz_places ( id INTEGER PRIMARY KEY, url LONGVARCHAR, title LONGVARCHAR, rev_host LONGVARCHAR, visit_count INTEGER DEFAULT 0, hidden INTEGER DEFAULT 0 NOT NULL, typed INTEGER DEFAULT 0 NOT NULL, favicon_id INTEGER, frecency INTEGER DEFAULT -1 NOT NULL, last_visit_date INTEGER )sA!indexmoz_places_url_uniqueindexmoz_placesCREATE UNIQUE INDEX moz_places_url_uniqueindex ON moz_places (url)m;! indexmoz_places_faviconindexmoz_placesCREATE INDEX moz_places_faviconindex ON moz_places (favicon_id)e5!indexmoz_places_hostindexmoz_placesCREATE INDEX moz_places_hostindex ON moz_places (rev_host)j7! indexmoz_places_visitcountmoz_placesCREATE INDEX moz_places_visitcount ON moz_places (visit_count)m=! indexmoz_places_frecencyindexmoz_placesCREATE INDEX moz_places_frecencyindex ON moz_places (frecency)~G!!indexmoz_places_lastvisitdateindexmoz_placesCREATE INDEX moz_places_lastvisitdateindex ON moz_places (last_visit_date)G//‚=tablemoz_historyvisitsmoz_historyvisitsCREATE TABLE moz_historyvisits ( id INTEGER PRIMARY KEY, from_visit INTEGER, place_id INTEGER, visit_date INTEGER, visit_type INTEGER, session INTEGER) ññ\§%¶ úú óó §%¶   B¦à]¯‹+÷Ë«vV ñ ª [  é ¶ „ W .  Ñ ¡ a  Þ [  Ø • S Î;íµz:ø¶u3ó³s3ó²r1ñ¯o0ï®l,êªh&æ¦>B K8*China to limit forced evictions§óÇž§óÇž>A K7)Washed-up turtles spark inquiry§óÆX§óÆX@@ O6(Sri Lanka cricket board dismissed§óÅ §óÅ @? O5'India actress jailed over killing§óÃͧóÃÍ>> K4&UN court issues Hariri warrants§ó„§ó„@= O3%Syria rulers 'almost out of time'§óÁF§óÁF>< K2$'Swap deal' for French hostages§óÀ§óÀ@; O1#Cost of Euro mobile roaming falls§ó¾®§ó¾®?: M0"Russia condemns Libyan arms drop§ó½l§ó½l?9 M/!Swazi judge in king 'insult' row§ó¼.§ó¼.=8 I. Colombia condemns rebel attack§óºá§óºá>7 K-Mexico detains massacre suspect§ó¹”§ó¹”@6 O,'Indestructible' botnet uncovered§ó¸O§ó¸O>5 K+Crews 'beating' Los Alamos fire§ó· §ó· ?4 M*Newspaper firm ends street sales§óµÃ§óµÃ>3 K)Swansea ChildLine closure worry§ó´|§ó´|?2 M(Orange hall is destroyed in fire§ó³5§ó³5>1 K'Tributes paid to David Dunseith§ó±ô§ó±ô>0 K&Troubled trams project to go on§ó°©§ó°©>/ K%Labour wins Inverclyde election§ó¯a§ó¯a>. K$Driver jailed for timber deaths§ó®§ó®>- K#Falling branch kills schoolgirl§ó¬Ü§ó¬Ü@, O"Skydiving benefit cheat sentenced§ó«Ÿ§ó«Ÿ?+ M!Queen opens new term at Holyrood§óªZ§óªZ@* O Pair deny Stephen Lawrence murder§ó©§ó©@) OGo for British staff, firms urged§ó§Ü§ó§Ü>( K'Lockout' threat looms over NBA§ó¦•§ó¦•9' ALive - England v Sri Lanka§ó¥U§ó¥U6& ;Live - Wimbledon day 11§ó¤§ó¤L% g Tibetan 'singing bowls' give up their secrets§ó¢Ö§ó¢ÖP$ o 'Get sterilised, win a car' offer in Indian state§ó¡š§ó¡š?# M Indian athletes fail doping test§ó Y§ó YC" U Bumper crop sees US corn prices fall§óŸ§óŸ>! K Monaco set for Albert's wedding§óÖ§óÖ@ OChina arrests 36 in Alibaba fraud§óœ›§óœ›A QCrowds welcome UK royals in Canada§ó›W§ó›W@ OPoland to take over EU presidency§óš§óš? MUS in CIA detainee death inquiry§ó˜Û§ó˜Û@ OBody in US pool 'unseen for days'§ó—‡§ó—‡? MMoroccans vote on king's reforms§ó–I§ó–I? MChavez tells of cancerous tumour§ó• §ó• @ OHu warns communists on corruption§ó“À§ó“À> K'Doubts' over Strauss-Kahn case§ó’G§ó’G. -Latest HeadlinesžûBÍn§üzC. + Getting StartedžûBÌþºžûBÌÿÐ+ % Most Visited§=Þ]§=ÞÛ'  About UsžûBÍ#žûBÍ%‚+ % Get InvolvedžûBÍòžûBÍ"c0 / Customize FirefoxžûBÍ´žûBÍA1 1Help and TutorialsžûBÍužûBÍ- +Mozilla FirefoxžûBÍ’1Ô;bÈ€A Q Debian (Ubuntu is based on Debian)2;<ŠRÀ2;<ŠRÀM i Make a Support Request to the Ubuntu Community2;<ŠRÀ2;<ŠRÀE Y Ubuntu Wiki (community-edited website)2;<ŠRÀ2;<ŠRÀ%  Ubuntu2;<ŠRÀ2;<ŠRÀ< IUbuntu and Free Software links2;<ŠRÀ§=Ö žûBÍëžûBÍë3 5Get Bookmark Add-onsžûB̶ÔžûBÌû¹ žûBɈ«žûBɈ«* #Recent Tags§=À\§=Á/2 3Recently Bookmarked§=¼(§=¿~0 1Unsorted Bookmarks§:¡y§=ºË, )Bookmarks Menu§: ê§=ÖY" Tags§:¡L§:¢Y/ /Bookmarks Toolbar§:¡§=àØ  §: z§:¡y #j¾}=ü¼{; ù ¹ y 9 ÷ µ u 3 ô ³ { 7 ø ¯ c  Ô ‹ Bú©~Q"÷Ç–j*e #[MDeadly sins§óô¿§óô¿/d -ZLMagic roundabout§óóp§óóp.c +YKWho is Assange?§óò"§óò")b !XJMaking way§óðܧóðÜ-a )WIIt's quiz time§óï§óï+` %VHEnemy within§óîJ§óîJ)_ !UGMao and me§óìù§óìùO^ mTFVIDEO: Syria opposition's 'reporting revolution'§óë´§óë´F] [SEVIDEO: How a 'singing bowl' makes waves§óêi§óêiG\ ]RDAUDIO: 'We weren't freed for chocolates'§óé#§óé#G[ ]QCVIDEO: Warm welcome as royal tour begins§óçܧóçÜGZ ]PBVIDEO: 'Why I joined China's Communists'§ó挧óæŒDY WOAVIDEO: Filthy football - it's Odd Box§óå%§óå%JX cN@VIDEO: Student march in Chile turns violent§óãÛ§óãÛGW ]M?VIDEO: Monaco Prince to wed Olympic star§ó⎧óâŽ=V IL>Is leafleting a public menace?§óáI§óáIBU SK=How defectors come in from the cold§óà§óà6T ;JP KF8Three-month-olds 'hear emotion'§óÙ¢§óÙ¢@O OE7E. coli outbreaks linked to Egypt§óØ`§óØ`@N OD6'Gas-less' roo secret sniffed out§ó×§ó×>M KC5MPs criticise forensics closure§óÕ½§óÕ½>L KB4Dinosaurs were top head-butters§óÔt§óÔt>K KA3Ticciati to direct Glyndebourne§óÓ,§óÓ,@J O@2Arctic Monkeys up for Mojo awards§óÑæ§óÑæ>I K?1Bjork opens Manchester festival§óÐ¥§óÐ¥?H M>0World of Warcraft offered 'free'§óÏZ§óÏZ>G K=/Nortel sells patents for $4.5bn§óΧóÎ?F M<.Google faces 'wire tapping' case§óÌʧóÌÊ>E K;-Ex-Bundesbank boss to chair UBS§óË…§óË…?D M:,China's manufacturing slows down§óÊ=§óÊ=@C O9+'Slump' in eurozone manufacturing§óÈã§óÈã "]ž7 Æ r  µ p  ¦ < Ú {  ™ ®8¼@Êiû…™–&­7Ãbî]" )Q)http://www.bbc.co.uk/go/rss/int/news/-/news/uk-wales-south-east-wales-13990987uk-wales-south-east-wales-13990987ku.oc.cbb.www.r! 5)http://www.bbc.co.uk/go/rss/int/news/-/news/uk-scotland-13975323uk-scotland-13975323ku.oc.cbb.www._ {#)http://www.bbc.co.uk/go/rss/int/news/-/news/uk-13987623uk-13987623ku.oc.cbb.www.r 5)http://www.bbc.co.uk/go/rss/int/news/-/news/uk-politics-13984512uk-politics-13984512ku.oc.cbb.www.t %+http://news.bbc.co.uk/go/rss/int/news/-/sport2/hi/basketball/13984154.stm13984154.stmku.oc.cbb.swen.w '#+http://news.bbc.co.uk/go/rss/int/news/-/sport2/hi/cricket/england/9524736.stm9524736.stmku.oc.cbb.swen.n #+http://news.bbc.co.uk/go/rss/int/news/-/sport2/hi/tennis/9526615.stm9526615.stmku.oc.cbb.swen. E)http://www.bbc.co.uk/go/rss/int/news/-/news/science-environment-13972556science-environment-13972556ku.oc.cbb.www.| ?)http://www.bbc.co.uk/go/rss/int/news/-/news/world-south-asia-13982031world-south-asia-13982031ku.oc.cbb.www.| ?)http://www.bbc.co.uk/go/rss/int/news/-/news/world-south-asia-13986366world-south-asia-13986366ku.oc.cbb.www.l /)http://www.bbc.co.uk/go/rss/int/news/-/news/business-13985428business-13985428ku.oc.cbb.www.t 7)http://www.bbc.co.uk/go/rss/int/news/-/news/world-europe-13973248world-europe-13973248ku.oc.cbb.www.l /)http://www.bbc.co.uk/go/rss/int/news/-/news/business-13986308business-13986308ku.oc.cbb.www._ {#)http://www.bbc.co.uk/go/rss/int/news/-/news/uk-13979606uk-13979606ku.oc.cbb.www.t 7)http://www.bbc.co.uk/go/rss/int/news/-/news/world-europe-13985064world-europe-13985064ku.oc.cbb.www.z =)http://www.bbc.co.uk/go/rss/int/news/-/news/world-us-canada-13984912world-us-canada-13984912ku.oc.cbb.www.z =)http://www.bbc.co.uk/go/rss/int/news/-/news/world-us-canada-13986769world-us-canada-13986769ku.oc.cbb.www.t 7)http://www.bbc.co.uk/go/rss/int/news/-/news/world-africa-13976480world-africa-13976480ku.oc.cbb.www.f ))http://www.bbc.co.uk/go/rss/int/news/-/news/world-13986092world-13986092ku.oc.cbb.www. C)http://www.bbc.co.uk/go/rss/int/news/-/news/world-asia-pacific-13985359world-asia-pacific-13985359ku.oc.cbb.www.z =)http://www.bbc.co.uk/go/rss/int/news/-/news/world-us-canada-13986970world-us-canada-13986970ku.oc.cbb.www.d g;-http://www.mozilla.com/en-US/firefox/central//en-US/firefox/central/moc.allizom.www.Œ] aUplace:sort=8&redirectsMode=2&maxResults=10sort=8&redirectsMode=2&maxResults=10` c7-http://www.mozilla.com/en-US/firefox/about//en-US/firefox/about/moc.allizom.www.Œh k?-http://www.mozilla.com/en-US/firefox/community//en-US/firefox/community/moc.allizom.www.Œh k?-http://www.mozilla.com/en-US/firefox/customize//en-US/firefox/customize/moc.allizom.www.Œ^ a5-http://www.mozilla.com/en-US/firefox/help//en-US/firefox/help/moc.allizom.www.ŒC 9)+http://www.debian.org/www.debian.orggro.naibed.www.Œc o%9https://answers.launchpad.net/ubuntu/+addquestion+addquestionten.daphcnual.srewsna.ŒV _5http://www.ubuntulinux.org/wiki/FrontPageFrontPagegro.xunilutnubu.www.ŒR C35http://www.ubuntulinux.org/www.ubuntulinux.orggro.xunilutnubu.www.Œo s?3https://addons.mozilla.org/en-US/firefox/bookmarks//en-US/firefox/bookmarks/gro.allizom.snodda.Œe i]place:sort=14&type=6&maxResults=10&queryType=1sort=14&type=6&maxResults=10&queryType=1‚_ ‚a‚Uplace:folder=BOOKMARKS_MENU&folder=UNFILED_BOOKMARKS&folder=TOOLBAR&sort=12&excludeQueries=1&excludeItemIfParentHasAnnotation=livemark%2FfeedURI&maxResults=10&queryType=1folder=BOOKMARKS_MENU&folder=UNFILED_BOOKMARKS&folder=TOOLBAR&sort=12&excludeQueries=1&excludeItemIfParentHasAnnotation=livemark%2FfeedURI&maxResults=10&queryType=1 [}äU ¸ 3 ®  ¯ 3 Á < · AËYãcãeçdás—%·EÂcà[B E)http://www.bbc.co.uk/go/rss/int/news/-/news/science-environment-13968525science-environment-13968525ku.oc.cbb.www.A C)http://www.bbc.co.uk/go/rss/int/news/-/news/entertainment-arts-13981560entertainment-arts-13981560ku.oc.cbb.www.]@ })http://www.bbc.co.uk/go/rss/int/news/-/newsbeat/1398035413980354ku.oc.cbb.www.? C)http://www.bbc.co.uk/go/rss/int/news/-/news/entertainment-arts-13984487entertainment-arts-13984487ku.oc.cbb.www.p> 3)http://www.bbc.co.uk/go/rss/int/news/-/news/technology-13973145technology-13973145ku.oc.cbb.www.l= /)http://www.bbc.co.uk/go/rss/int/news/-/news/business-13986877business-13986877ku.oc.cbb.www.p< 3)http://www.bbc.co.uk/go/rss/int/news/-/news/technology-13988329technology-13988329ku.oc.cbb.www.l; /)http://www.bbc.co.uk/go/rss/int/news/-/news/business-13988373business-13988373ku.oc.cbb.www.l: /)http://www.bbc.co.uk/go/rss/int/news/-/news/business-13986142business-13986142ku.oc.cbb.www.l9 /)http://www.bbc.co.uk/go/rss/int/news/-/news/business-13988795business-13988795ku.oc.cbb.www.8 C)http://www.bbc.co.uk/go/rss/int/news/-/news/world-asia-pacific-13986456world-asia-pacific-13986456ku.oc.cbb.www.7 C)http://www.bbc.co.uk/go/rss/int/news/-/news/world-asia-pacific-13986453world-asia-pacific-13986453ku.oc.cbb.www.|6 ?)http://www.bbc.co.uk/go/rss/int/news/-/news/world-south-asia-13986371world-south-asia-13986371ku.oc.cbb.www.|5 ?)http://www.bbc.co.uk/go/rss/int/news/-/news/world-south-asia-13986842world-south-asia-13986842ku.oc.cbb.www.~4 A)http://www.bbc.co.uk/go/rss/int/news/-/news/world-middle-east-13972350world-middle-east-13972350ku.oc.cbb.www.~3 A)http://www.bbc.co.uk/go/rss/int/news/-/news/world-middle-east-13988701world-middle-east-13988701ku.oc.cbb.www.t2 7)http://www.bbc.co.uk/go/rss/int/news/-/news/world-europe-13985354world-europe-13985354ku.oc.cbb.www.p1 3)http://www.bbc.co.uk/go/rss/int/news/-/news/technology-13988279technology-13988279ku.oc.cbb.www.t0 7)http://www.bbc.co.uk/go/rss/int/news/-/news/world-europe-13979632world-europe-13979632ku.oc.cbb.www.t/ 7)http://www.bbc.co.uk/go/rss/int/news/-/news/world-africa-13980535world-africa-13980535ku.oc.cbb.www.. E)http://www.bbc.co.uk/go/rss/int/news/-/news/world-latin-america-13967904world-latin-america-13967904ku.oc.cbb.www.- E)http://www.bbc.co.uk/go/rss/int/news/-/news/world-latin-america-13985706world-latin-america-13985706ku.oc.cbb.www.p, 3)http://www.bbc.co.uk/go/rss/int/news/-/news/technology-13973805technology-13973805ku.oc.cbb.www.z+ =)http://www.bbc.co.uk/go/rss/int/news/-/news/world-us-canada-13985611world-us-canada-13985611ku.oc.cbb.www.l* /)http://www.bbc.co.uk/go/rss/int/news/-/news/uk-wales-13987072uk-wales-13987072ku.oc.cbb.www.) )Q)http://www.bbc.co.uk/go/rss/int/news/-/news/uk-wales-south-west-wales-13980388uk-wales-south-west-wales-13980388ku.oc.cbb.www.( E)http://www.bbc.co.uk/go/rss/int/news/-/news/uk-northern-ireland-13988517uk-northern-ireland-13988517ku.oc.cbb.www.' E)http://www.bbc.co.uk/go/rss/int/news/-/news/uk-northern-ireland-13985089uk-northern-ireland-13985089ku.oc.cbb.www.& 5])http://www.bbc.co.uk/go/rss/int/news/-/news/uk-scotland-edinburgh-east-fife-13959276uk-scotland-edinburgh-east-fife-13959276ku.oc.cbb.www. % 'O)http://www.bbc.co.uk/go/rss/int/news/-/news/uk-scotland-glasgow-west-13980594uk-scotland-glasgow-west-13980594ku.oc.cbb.www.$ 1Y)http://www.bbc.co.uk/go/rss/int/news/-/news/uk-england-hereford-worcester-13991163uk-england-hereford-worcester-13991163ku.oc.cbb.www.# C)http://www.bbc.co.uk/go/rss/int/news/-/news/uk-england-norfolk-13987822uk-england-norfolk-13987822ku.oc.cbb.www. 6ñ.}Ðñ ë ] ¨  “AŽ”ÕP’OQÕW¥ó ã´Û 1 vc » ÷ 3 ‹ Ø & t º Z ­ ðDà˜Ø gf³;http://news.google.com/\Bhttp://www.bbc.co.uk/go/rss/int/news/-/news/business-13974474[Bhttp://www.bbc.co.uk/go/rss/int/news/-/news/magazine-13863498ZLhttp://www.bbc.co.uk/go/rss/int/news/-/news/entertainment-arts-13978724Y?http://www.bbc.co.uk/go/rss/int/news/-/news/world-13941001WFhttp://www.bbc.co.uk/go/rss/int/news/-/news/world-africa-13977178VLhttp://www.bbc.co.uk/go/rss/int/news/-/news/world-asia-pacific-13974472UMhttp://www.bbc.co.uk/go/rss/int/news/-/news/science-environment-13976598SLhttp://www.bbc.co.uk/go/rss/int/news/-/news/world-asia-pacific-13976596PBhttp://www.bbc.co.uk/go/rss/int/news/-/news/magazine-13972256LBhttp://www.bbc.co.uk/go/rss/int/news/-/news/magazine-13956313KBhttp://www.bbc.co.uk/go/rss/int/news/-/news/magazine-13977583J8uhttp://www.bbc.co.uk/go/rss/int/news/-/news/10462298IBhttp://www.bbc.co.uk/go/rss/int/news/-/news/magazine-13973331H@http://www.bbc.co.uk/go/rss/int/news/-/news/health-13956252G@http://www.bbc.co.uk/go/rss/int/news/-/news/health-13962068F@http://www.bbc.co.uk/go/rss/int/news/-/news/health-13973002EMhttp://www.bbc.co.uk/go/rss/int/news/-/news/science-environment-13946941DMhttp://www.bbc.co.uk/go/rss/int/news/-/news/science-environment-13959091CMhttp://www.bbc.co.uk/go/rss/int/news/-/news/science-environment-13968525BLhttp://www.bbc.co.uk/go/rss/int/news/-/news/entertainment-arts-13981560ALhttp://www.bbc.co.uk/go/rss/int/news/-/news/entertainment-arts-13984487?D http://www.bbc.co.uk/go/rss/int/news/-/news/technology-13973145>Bhttp://www.bbc.co.uk/go/rss/int/news/-/news/business-13986877=D http://www.bbc.co.uk/go/rss/int/news/-/news/technology-13988329üâóϾøixƒ7÷)~úÙ¿ü2â7öÉOþëg_ýîç_þòó_}þá—ú=º CLo>üŸ\ÿÊ_ÿöË_}þëõן}õ•þ+?ù¯Ÿñ¯¿ÿÉ7ø·ÿþ›ó~ó/}ûÿîÃo¿úüË/æ'~óO>ûí?üÓüóÏ›þøùþÇõ'?ùË/¿øð„Ž£@^ðÍ-Ø|ûƒ¿÷‰õ7ÿïO½{›ý½Ç_½EüÅç¿[ÿ9J¤ôF¼ø)í³ßþÛç_(ñ—}íïH*ÅÏ‹ÉcJ1¹¥·QLSF_ ¾xJÑ%ç|z‹þ)ÇÛ8>¥h¨ø±o‘”cMøc–ñ[Š?fƒrlä~Ì2~KñÇ,#*ÇNáÇ,ã·Ì2’rü úQïßRüñÊÈsÿ†âåGÍQ7G¨„?~ŽÑý¨9êî-ñÇs„ž£n=Љ~Ôvúce.ÕP~ÄÒÈ\¡zþÇÏ2⚣.ÖÐ"ý¨9êb Ì Å‚¸¨°ÿá9ê!F0×>E˜üÿ ŽÊ0G÷?án…”âç_üòÃï¿£U>ûêÃßüû¿üâË_OÀßÿúËû‹_ùí'ÿ)gú—ЛÇoþ•Ÿöû¿úÕ¯¾ú0¿(RÔ/%ßþÉç_|÷'ŸJ¢(qñ=v1²·Îÿö‹ýâwÿúSÝ2ß?…øéW~ûß?üÖ¼õ e°ÝÁ|Ô¶ýÍÏz^¸O!}ú¾øðÛÏÿá‡ÿÙÿþlºÿgÿ©QÍßý¼þÍÁžðßñŸ>üú7ÿË/Ÿ})Ï.o«‹­¿þõ¿þãç_üŸúA¡éç_ü÷_üîËßþûÁüÙwŸñG?ïð½ŸøÏ¿üÅ?~÷Ãþâ¿ý¬ý}þ‹>ÿmˆ>WèÌ¥d¬>ðúO=uWjXo"v+c~Ñ÷¯ÜÛo~ù‹Ÿ,Èÿ_“η¼?ÿ—_ýî³ùÍEÇyüÔ…O!|á݇wçÿw§ÿóÑÆóßF‡ßûîÿòÕd²o4ú½þèÇ=ùÕ~ñ»ŸNyê\j©…˜kéª.…P²d7Âèж~&—g¿ª¿üÝêå>õþSpŸ8~G|w´÷‹2‚ïïôôÎÚòhŠ‘ÂÅEýʽº”e?z¨°§§ÅeWOŸúø‰‡wP=ÃÍz²×¿ô±ŒÆN½+‰C¨=õ¥žÏQk=}`Nê¼?Ô ³'h˜;‰ƒO¼{ywéx'ùƒx­ÕÒr/KÏj 5ftÒCñ-ø…xÏQ°iŒ—míü§.}âÜ;Ò;ÂÍÆØ°ž6Ü[/Åç„ {Uȃë+c|ŽÚ]Ü—==áS‡º_êéð^=¡BˆRE]F%·‹ºëGÎ = ‹ù-„‚ZdN ”>qê#¸wï^·¸ƒgÒ B”&¥$L=§” »*¼Ï@m£ÅeK;—®“FwÔcæ=Àë´ÃQ${ŠCá½Ö{©¹Kô©q+)<ÖÎ@ážv—=íÂ\ÈÓ= ¨{ã½ ™r(•šnF<†Ú’ èžÄÃCXØ¢Ú´E‹Ë±×£Ž¤¯³Ej>¹œûHJ;Qo­ää] M\^yàÊÜÃ[ GâdöÄ»b%‡Ÿ8yG¯NνÆ1A­Íõ:0âSdñ5&¤¦QäcA Ô¦1Z\¶CýKæ)i;öüX=jAJ7Æ k*—"€A¿ð" Ô/21Q"yóð@P‹Ì÷ ø÷@/=¥u±q ¹¥Q•å*@\„“ì.Ä3P›.¸Åe螺OOGÑëâ¾ÙçÍévT(c X …Ü Än±¸ Ôæâ¶¸l{=ažÜþºX‚†ƒ94ÏŽJ©ø’dÄ+VÖ5×Ë Ԧ-Z\NBé+$x‡›7Ƭ ª‡]n1ç:¸¹tQÊ Ԧ-Z\ÃkÐ…½½/~¬žF¡6 ¼P=âÜÊôÃpÑ.ÃAµ©§ÅåЋԽR£Á›½òZ•à"ã "¡Õ”Gtê’t¨¸ÐÓ@mêiq99{pzåÈïxó]d§\8þö êÒŸbVÿ.HÊað*â6P›zZ\võœ7@ü‰—wРûæëŸ!E£Þ 5T!¸ eîRJ¹¦¶¼N3PO¢pÖ@Pßü£»]‹Ì¶^÷iN||‡{#ï|¤šzîÁcuH4È(9Ö±4Ox µwÀ›\ö6P?#Pg“ÞÉ©¯~³ž2ríú-Õ1ѿ͋GJE¿š[„æê™Föð†üHPƒÌ+ 4Üë1yðÅåJÇè ‡J­HÇ8ÚBPµ·ƒš\¶õ Wh®î'm{ï«g4 ¸4zÁ1ÇPJ­¨û‚ ÷nʸ; oô 47ɸô*¨»Žø»wPt \.¥z=VCÏ© †"I‡2¤-vPµ¹ƒZ\¶]PüÒ /uÍã½.½z%Ô’÷1R·Od´”Ø÷¨ÿëJY¨Ú\ð—mû$5ÑOœîÝñÝzfÏ!—îuÓÒ…Vû¨µ'AH}ðð+=Ÿ¢`WÏç\}€ç]ñ<äñf=烋xîÁ!É¥u)¢!IγÒó9jWOƒËö¤.½†œñ ‘n¶O¤Ô„°yä.DF ÉE’¸ÐÓ@mêiq9 9¿¾ž»ÙaR¯$@ëÉg=v«Ï£Ô(¡ ’ºÚ? Ôæþiq9^ï„ïÄ·ë) µôìqÇ9tŠ£á°–¼Èˆ±P°­çS.{zò´O½µy~÷^‰ø͵1WÕÜöçû–§*ΗîÔ»^EHê‰}ú„ ÞäC=-.‡ëÞgRÌÍçQQ²±ªÓ§[¾Äyc†I·Y²Ž1ÀÂ> Ô¦}Z\öôTg)μY§Î½c¼WÏ6_ ´\W& P$è]uÁñBOµ©§Ååø-x&ÁÉÍz65 % ¹`n=rBŠDŽVç»ÚÕÓà²ÇŸ‚¿®”åöõÞªû¬ ¢(µ1öÜJ‡Õþi 6Ïw‹Ëù’ßN¿~¤ÝÁÏD•1hæPɼi¤^ýè\É Ԧ-Z\^b‹÷žåàb&?šÏ8ÔC®º[Ð…T2õ¼xÞ°P{¶hr9Ïn•»ófÀÃp¢Þ2’×ý©êzÒÿ¨Q]<âBOµ—dhrÙ^Ûi>9¯ù+ÓfÀ'ÝIÓí;T¥gnp FZi÷µi‹—Ãs;Ì®›Ÿ.4^Ë<ÍËç²FÃE#Ô±Q]=­[¨M[´¸œÜÃÁuw{ A·£[£‘\Ëm0DõFJtPâ,ÅBmÚ§Ååà)ØÓ¼7R?ýæ§`MR&îQÃâX£HÔíj¾ïàj¯4P»z\_.Ó;Åí*ŸÖsô¨qFN±©ÿ†¬›|÷óf!æ &±Òó9ê#*+â#= .»z~G†™J7ïŸØ]¨±–‚€>C‰Ý«=HïÄq—[¨=_Óä²í]ïêkÞ.¶øX=#Uº.4ìÒËpÄ 9P­ ÷…žjSO‹ËaªW|§ûÏ÷Té™Jâ*Jª,Á’ x®‹œw µWÆkr9ñ5¯w`rJÞ«§Ð€EÂB¾ôyxÒ# ÄùÂõXOµyY\Ž –Ò2SÒ_}ñŽu‹J‹75 µ¹¶-.ÇÅ@ºWÒÍ{eά^²«­ôÝKp¾CŽ­'ÐÿY¤ÉY¨M[´¸êIºQ¾»×úÁUãDÆŽj»„Fnd’ÞÆ*î1P›qÅå$޼Þ'(l—ã?Ô®ù˜¼¾æºLY×Rõ­¸\z)¬´{ŽÚµ;ƒËq. ɶÝ}ì:®AFdÝÊëž”$dz†G뺢z¨Í3Úâr˜«5«ußáuE’P©BNìºgôEc³6jêÜs âaå/¨Í3Åâò’Ò•»m±‘¤AµUÝ‹z/ޱ×Þ»nî!®Ú¾X¨Íµmq9y×xÆMñæwFµ%)FSz§>oò^-.çïbznßlŸ£zO…ô†Éç¬üÕãh‘†ä¸|Û1P›gÅå8>DÑûf=5 ˹§™^æ81 ¸Ñ)i„‘–ojs½[\ï¯õ~s¥Ep…F >ÏW€\s.9‘ËÐù´úXO µ§§Éeû<Âë<â÷àï^ïÁ»0@j-!çÎ!ùQ€³àâþÂBííŸ&—CûLê,½;w³ž1Aႚ)Ù`n¬é·XäY¨Mû´¸žïðN^]¦›õìÔ}„¹èИg³ßf*Tm¬ìó9 7õ4¸Æå8ïˆn.ÒïÀfÊI$B`Ýú9Œ‘Ä¥¥žOQ»ëÝಷÞqžïæþ9iÝû«îúÕÍâ°QÕ}ÆÔ¨á4Œ÷éjSO‹ËaÝÊÕÐ(Ü­§D! 7"ÆÀ¬¡²~㪠­%×y¥çsÔ®ž—í¼Ö¯»8ºy—n^ï!7ˆ-I,Œµ°Äb@lYšÃ°¸K²P›zZ\öôŒ×ù~åµê_nÖ³5ÂŒCB‰Ì¾K0ojk_éùe½—“ ðHPƒÌö‚ço ïîåP˜zµ uõÈ1khâ’›ÝRG”E¡……Út˜,.ç­Gáv¥ª§g u–-ssÒrbTÇ%Ô4¤ÈÂ@ Ôæ‚·¸'gzÙ~0¤]Ä$ å«moê~>æù&½H.²PVaqo‚ijÈ40ónÞ¼£{E7ò?ˆ7[ÖJâ9qö±¶êè­6I+ÏÒ@mžÅå°½‡xwárÏÂqvÅÐØg‹kt±4ýb)­Gm†’—ígÊxuå™÷îïøºŽpAwqàJî„Ñ î1B¢8/¹…üÊ4PO´“Ĭê½Qz$žAfûÞÍ_ÆH³>ÿæ¼àÀê÷=g¡¢:Â¥§œ1Cõ„Ý*ßÀBíݳ›\Ç)ÈÔó…p·XFq¡{Àµ¨%€«¹C®P+¬´{ŽÚ@ä·ôèà¶Èl‡4éÛ„˜´àÿH¼23” Ž€U=ÑÝ^] I¥øº i Ô¦1Z\Î''ÀöcÎCíZï}v.¢žŽº)Uõ1j&VÚ=Gíjgp9n A|û=Y ÍT² çƒÂìI×u+¢•žjSO‹Ë¶Ó31c:=pûÃM¥hŽ·Ò³‘J+µÖŽN·ùF©çÕÆh võ4¸'{w÷&b…¦ñ‚ÔÞs¯(>Èìœ$XÄL¥D¿ÐÓ@mêiq9t,ájàvó=nWÞAî‚5´m C˺ÕçTÚ"±ÍBY×?zŒÐƒi&™mO(ÌŽcó.·3±Š×p”J5pÇá‹$ÈA¸‡ Ì´ï9jóªÇârÒñ¿Ù,é…÷¸‚÷.0tºúñVJÑ; qyè¬®É ÔæÍ„Ååà ä‡ñæ Û0"rö}UÝÞ;£†i®*Ì,aõ¢m 67F‹ËqµÝ7WØ¢›I¶¡Íš`$Dlj%½Õ(c¤E†¿…Ú‹¸M.çþîîA)è4&ÃÖ£Ì'Wrq0<¶ÚAÿÛ*ȱPaSOƒËIÆ/NG(È;Ü›¡ŠÔv—›&ºÂzis£«©£m û4P›zZ\ƒFšÏ67ßáœ耡Fè©d(®ŒÊ13¶´8Ë-Ô¦ž—cûÔ@òæ— Ùœg-{FvEfήîZ3oaŸjsÿ´¸gX…™Ty³ž¡¶ÎCìHƒ ö–}íQ”¶ð—,”ÕZ]M->ÒÓàr˜Ds¼&ú›õ¬q8_(UÀÔ%‡F-Æ 0Vz>GѦ}\ŽŸ½)ÜnŸèbWÚP»Ã™ QÚh}õ9Þ›kjSO‹Ëq5)øW¾–!‚8n=TlsèF¦™!Qxº|PÛâuÇBmî•—ãêë8¿ÙQ¢³)jô‘KÎ2BlÂó6–W{¥ÚµEƒËá^éßÝK“ÓêÈ ¦<Ë5%«WÛ5|lö,_ ‘³P›ÚY\ãreò¾îNc,è#õ¬~ZÌ ¤EŸº:nB«ØjÓ‡´¸lW=ÐìP0}¸»ªcɤ1n•EóŠäÎ#•$.W—z>Gíêip9î>ÜÝYúÛ(Zè¨ÞºìÄÍ”0/Å'çòJÏç¨]= .çÝÑï·ÏD)Œ}Æ %wñW×g\_T‰Z¨ÍsÛâr6­c2r÷€HLyNCÆœrû¼5 !¥•On 6íÓârXu+ïîžv„³‹E(CºË8cŒJáqÎÆZžåjó,·¸v]¼bœ'Fž£®@Ƙ0K,e¤>4,ã²ef¡6mÑâr<üuVÜÝì“KbqµõE0Ä^Iª€'r¸(À±P›{¥Ååp²Ñ×¾ÑÍ÷Ò JKÅ*Qý‚è*ÍA#µ®î× Ô®ž—óûµxw·yÌѵRÙ;ÝïGSgҼˊ5§äVwjs½[\Ž3,g“·ž=@ïÞ§<'´ph¹;NÝCm®ÊRϧ¨m=Ÿs9\ï~îŸ7OÚÜ{ÐóQk˜Ø3éî—]ˆè¤ÕåYn võ4¸¾GζïáÞD"ÔÔKŒ-ûÙ Î|²ÑªjqPZìŸjsÿ´¸üdT£nvcñ³,8¸ì£n_¡B<òòýÌ@mÚ§Åå¸ýÌ?xáýïìC8ˆŒŠó²fT 0(Í>åÔ—o;ʬÁ oÎ?Ï"sHÜU3o¿îA=c?B?[ëÖÐi”èkw½-[¨ÍÅmq9,½ÆlÝܾ ;Õ1Ç8Ñ=Þ!{?·¬Bd5†ØBíêipyI2̽YÁ¤î]" €[œÓF\‰X[tÑe×kn =-Ô==»ÙìT€›dNúãøk¾n¿–}¬ >kä¦tƒZ„Ë준O“ï>.¢u eî ø– j‘9Hc þʳƻ8döQâ(4/rqÅŒ ix‡m®[¨½orÙN/ × ïz¢ßœ®E09ɹÁæ¸ôÖF˜=ø1Vz>GíêipyÉ€‰{Ó iÞÊö9ƒÀetiäZ¥qËX:ã¢RÜBí¹›&—ÆC_ʾÙ>Õ5á!#8š~3s×#!‚~]l ÔBí¥²›\NNøëÙ÷¯?j§áÅÌ"MÁápXRé!¹\[¯£¬´{ŽÚ´E‹Ëñ°(ÔÐçfïB­TŠ{É¡…*K‹[ï+=Ÿ£võ4¸œç~=´=ÞÝèŸt#J¾ù##1”â=ÆAÔIÄ­Šñ-ÔæÙcq9…áîæê4§†%§ŒûÌå\ŠÃ쪣԰4¿²Ïç(ËÙTi j9œ¤Þ]Ú® x$Eý>Mýà6Pcコ¯®«sÇUã0 µ¹¸-.÷D³=ŸÜ}¬1Fïu%A+Òq¦ÛS@r€2ô ø¸Èé°PF31u»ß‚<Ô"³mŒøm+uÍ_—ìF1×á5æ­1bG'óvÐ'_± —¶:¹ Ô¦1Z\“þ¯Kõ›)(Qž#˜BJ„4f+=5—&™ãê"ÓBmêiq9¾T§ÛÛ€Rè½5/^0ÅĽ ®À8°rj•Vz>Gmzå—ãqQsy¿îR]ÄÙ]3ËpŒi°žŒ@=$ˆÀ*÷¢²ÙB§´÷éTL˜dÎÜH=¢É¿‡›Ošt1Õѹ&äeŽ[“ÚJŸW}‘íf¡6ÝH‹Ëaj7ú9äÎä:àCÈ%«AôÔ™¥4 =Ÿ£67K‹ËŸAå aäʹ¹‚FÀ Õ/²-”å ‘zBô4¸ì®÷«ÝÝÔ`;{ð‘v%8že\ä¢')×VVõ?z ³‡Òcí Ô^¦ ÉeûÁ,ÍÌKЛÞý½ÙÔÜè"ž $ôÑçÔkNÕ5G±´±hñk¡¬j½oÚw›\NÚ¾Ðå”ÇÛ×v§ÊcŽôˆ.9ñ¹—žªX¼+GÝ@mî•—ã®î¥MUiDîyØŸ þ±zαŠêc$/mNã6›¶€znB¸pJzxöXüR»ç¨='ÒärÞ~„î~“ 4äPâ̹ Œ Þ9 Õ|ÆE΀…²n{C|£GÆh‘9ïsû„јjÇ|°Î×…èf™œKÒ\\ úeÝ`pzK5È7º»`/¦Ñz¥^g_÷8jì)ô1ÔŸ¿ô9jó4·¸žæ8³0ÜëÞr"cË9¸Z‘Ü`õælºÏ#–•vjs·´¸Ž1áÙ¤ÖÝûôgB’¡1ºØJ€³¯4Uª«Åm ¬Å-ø&ðHPƒÌùxÁx÷|Ž9\¤ÍæÍµnò¢žrÏ ¡†Qqu¯a 6·Åå-.Ç#P€ïnëkÃYÛ1GR"!•4È÷2¿F ]WËBÏç¨]û4¸¦¤_ots4Ô£«="Œ ¨ñrz xIê®èRÃEµ¸…+ËRÞèA…®Iæ`¾\ÉD!m·ƒy ^r‰†eäŒÇl›Ö%ûîÕ†ÇâY¨=c4¹·VVþæ6YÉqà=¸YRX®g+ýb]ƒºi¥çsÔ®ž—Ã6nª§¿ûî(¹êKÍKÌÓm.½æœÛl-a©çsÔ®ž—ó”t¹»õKr BžCHpö?ƒÉQbò£å…³i¡žD—âœ>øæâ#A 2ǽ€ç ××=¢%m@ÆQ7§<% 7Âh–Å%jÏ2¹lgºà|€ü:…úæVÉ·â17ï! ÷T€«þÖKŒ©Œ¼ê!j¡Œ«Ž Aá£b“Ìy*Öì=v· =;ð `Nû :©´ŠCÚKAŸ¢>BPN}Næ8¯ånß2^¾úŠçÞ¸bM¾Bç¶zm¡öò³L.Ûzªk¯É(/ÿ8BY7xÐ_ººs¤Û<‘¯Y×—zÏc‘Cm¡6n‹ËñÑ=Kï½×H¡ô®.=,£¥‰:u¥„¦ÛVZéùµ«§Áå0n¤Ùè%ÜìªO3è9ƒº²ž~Rô@uTC÷‹8ÜBmêiq9¼¾ÖöÍ÷ GIàÔ ¨(ÀÄ 3Á,r®¸Ø+ ”õÌKña~–Iæ8ùò Åú#ñƨþ‡þ݈’Ë|h)®sA_ÓÊ/7P›®¥Åå°‹“Ÿ—l74KRñš¹Aê!k”F­P‘Õû1»³<ÔÓ@mêiq9¸´ž—À³EðÝzŽÚA5”ŽÌT=¦Ò²~«¼Òó9ÊZÜÑ=¬Ø3ɧÌaÎ/¼dK1f= À@‰‹ 麰H×X^œ4j󤱸¼¢£ØÍÕŽó~ hTF¨ÈXòÜŸæ4ÚÑkžÝÔëi 6½r‹ËžžWY=À¬ˆšóËnö„¸ÄÒæ ¶ ‡kŕػƽРr^$[¨Mû´¸Vðøk>ÔÍžº†ºÝé†3"EŸ…kÐï+Â>öU~–…úOÈ?Ú,-2ǃz欞›o-sŒ ç¥óú%| z€†ž<G¸ê(f¡6Os‹Ë«þõ¥%úíÈGÚ•P¥ŒÚ†ºt³z8×ÎznV©!^]Z¨Mí,.=H¼û@Oí—zå5Ô…•«Ã")ûQz©â+s-K/Ò@mjgq9ôÊçÝÏ+KSÅ!Ç «A„jÓ‰´¸l;å×K­‹s_ô|·ž¹Ž9j¶%,ܸñ>'À‘*¯ìó9j×> .‡ilðŽôN7GÜÍjT¦áYmQt¦«Y@àÔ ú±h™a¡,'2¥7xÖb’9|ËáYWï_×öSùRòµˆ†¸Í3ÌÝz^öÌ]4¿ï)jÓ-./Ik¹9¢éº0GÝìõ˲/5Ö@gÕaty•&d võ4¸l§µ\YÞÍëÉ›'n¥Aêò¦ê‹lÈÜzmiਅ|M«Ñ@m:G—ã‚/w—ã²CÎÍäA:ÏQªÜCΣJ鱞êc¾TD™d^ÑPìæŠ(v¬ÿ:BìjêÌšbu·¢_nõðm¡ö Ôär’™¡÷,éyåáÃ.ëI êÎ…ŠŽ’Z@ðÒ©•T¢–ÙBíjgp9ÿ4 xàöÆìJôm`Uî£ ÷äIZ¢†>G¿Òó9 6õ4¸ü$ô³÷|¤6(ê9 B±b×ï4:Ô‹HÒBmêiqyÅ”›õ¬Uý:GÎ¥YeX¨Œ$ sÙ-ê›-Ôæz·¸œ4q’™˜1_$^WkÏà;u")ê»Q²K£1Æk¾r„,Ô¦v—þ$ð>}ËWjW»þI©ÝWäDs¨ER$æ.®-ž-Ôæ:¶¸¼$â¾ÙçVGL90¤y%EJtg câ¸òy nêip9>·)l7Q}¤]èêórŽaªƒQtÿÑ¢ê’B=,WÚ¨Íulq9Nö£ÛG3&œaX£y@ªû–bœ»ç¦ž/,n'-Ô¦ž—ãüÕï-Zf*®4ì³»8¦6{%á`)4Hwh·ò! Ôæ^iqÙ>£gû°™º?ۇݛ2À‰Êµ¢¨”›ŒÒHƼ„ì°è~n¡6÷J‹Ëaæþ,rze K ¹v*¬1Dô"äCuàªËfeÖcí TÚÓÎâ²ýò@³ŒÜ<·áfÿ»Æêb$ˆ^=" œKìA*-rÓ,Ôæ^iq9¿Lã»_xøÞ„‘²kÒ PêÎEß ÍT±…žjSO‹ËñÌ,¢»_nÅÁhÁõÎбrΌȅóÐï­§@|öX¨½³ÇärÜXuæšß­§Œ »ØgÕ`Ñ¥åJÎCý»JÒJÏç¨]= .‡ãëÝ•gîoÖSÞØº~€ièééZkÔ1÷ùÊ·8Ë-TØÔÓàrبöjà}ó;õKÌe Dü¢ ÏBmêiq9´ÏtÝWÞ¼ÞjŽaúË®û’DÄÍöîó9zUvk¡6õ´¸¯w¸½1µ—jÎPª‘¹D—° רêùº(»µPæcY|z ¨Eæ8—ßÇ»‹#CtQC9iktE’úz¦Îô”Wj öZà™\Ðྐྵ~aš  Ô¢} ꀸ\òŽJ%Ì4u¥ÝsÔæâ¶¸^žOá¶»³=ÒŽj#@F¸ZPŒ’ü`=4©û¥/.€-Ô¦#dq9y Ó±D¸»›ÄØFâNÄç;©èæUœ†ƒ²´E³ µ©§ÅåðÒm¦¸Ü="Obï}ôyñ ]]ÀUX«ºÈm¥çsÔ®ž—ã JwæGQ‡nõzáâ;¸!£y‰)Õjs¯´¸î•8/Ýn.+‘¤Fà¬û½#*”ÎfURîn¥çSÔ“+LQ-SLo†³šLZÎ;¸NÖƒûu'ú%;7ºOº1å0šÚ‰Pϲ:µ ÔÞõ¯ÉeÛ%¿Úõ;œÕ /¼þÑß2&è=ÇYß_¸jðÐ:G ¡ÅB;µé-Z\^1ÏÍÝ{ý+Ef½Ø T§M‚þ•ôïR)½,NµyÊX\^2gçæë‹b€!®‘”ÇÀîÃÈ­³,r}-Ô¦ž—ã.W³ÑÕÍöYÑK®Å!%챉gšôcœM‹õn ŒQàÃ[ô5ÈœÏ-J¯œ.5Gžc–2{Œ ‹Æ'a”2ë-sÁÕAc ¬*Æ·€Ä3Èœ:Hw7¨”¦§e+”æ ó ‰±¦(Õ;IÁ¯bFµ¹º-.g™üsÊ›®î{ËȤ_©µ’™dþÊ™Ø%u‚Õ¦À+Ò@mzB—ƒ¦7þÚ-_Yšœ=5Júm»K˜tY‚+×8îÒ-Æ,Ôž-š\«Jü;Ä»{sp\ÙIν`j®¤Ú²oµ7Ÿû"™ÒBíŇ&—Ã>aV•Ü\¥“T¢Úz©Ñ·¬_ˆ2ÇAÃûE¢´…²:KG|Cy$¨Af×µTMÃU;O°Ý•é¡xÁÏbÁÑÒÌ`ô\’rM.Ì V£áÊŸ£vÑàr˜Ùë߯Žu7ã|*©m$Ì¡ªµœ3n¤ä²Òó9jWOƒËqF wïxïåO¦Â^×S­\ÕýýÄ>È]\”ŒY¨M=-.çñîËÞœºWkºÕl³%Ò˜—‚ê·J‹k eÍ-zè©›dÎ_Á`»¬ä‘xâ5¶óWÏèfrädˆË­ûÙ%û±xjÓ-.g)B3=õö§,¹»îÔP7|î2{¼j V£”ÈmÑ{ÖBmz–—óq¢ôŽ7>Ù÷î ¨]d„9$AÏÓVg©Ö"eÀBmÚ§Åå 4â›™dIñ›õhµø˜±I”ŒšŸ¥­•uµ-ìÓ@mÚ§Ååx3ÂÝ/c9GIµv%#7ۤƎœÔiŽËJÏç¨]= .‡‘\/·wëYÓp¢¾ò𨫌5ÀI7#é¶Òó9jWOƒË¹}êþy³s”GUiw/Ø……RŠ\‡TíJæ}¬çsmêipÙN©ö—³ 3za÷TåÛ®YžêŠ þê³Æ½êÊ‚TýXj÷…»Ú=ç²åriçâ» ïáuB¹D*ãÈA£³œf®bʈ¢¬©Òjs[\Žý =gnnEK…™Aïûˆèø (" Æ!\V~Úôƒ,.ÇçÌŒqn¾a+ͧؠÎÌ _˜KÀ!e§^H\•9Z¨Í}ÑârÜãÊ˶}>Ò®Š‡æ¤uÇ諺+ s« õ´ŒAV1£Ú´E‹Ëaš/97Ï/ÈUÝE}5G[Ž%øÖÌ»Öæ}Z3jWOƒËq þp{6en×ð HÉ#–TsŠ% ¹õëzÂÅÙc 6Ï‹ËqÌ¢šèÍzfá˜Á§F¨æ‘PȹàºD‹—F µiŸ—󆪸]ñP»RÔEsqf:àô>®°ùäÌêÆ­lñ9j× .åß¹'õ;R®ÅÏQ!QНžõÈÌ17=¶h 6mÑârÜ_Qãípó}PoÒ[‚Ò;`¬òJ&NE’Ë<--ô|ŽÚ´O‹Ë¡žn®m¸y¯µ’†d<€0*ºËûšç¿êBZ´#±P›öiq9¿Owïpo–KqØH²ÓhcÌ ‰L5䨍µé0»…¯i¡¬Ç=– 4ÉlÏX×°,7'ìvŸ~(ž´Ñóè4cW烩â`J)C­n%ÞsÔ^cr9ì•f3Z|ÝÁ]f9‘#sõ˜DÝ׋h¨«¿yNzŽ’,´3P›ÚY\Ž=¼2@,ÁEÔ=‡wº‘3»’õ—Îâ{õ =o,ÔÞ¡br9.qîîBEw˜RjsE#±='è!f]>¾–¶*yŽ2ËEâ[|ð¾mR9É3‡+>Ä횇•3©“¦áC•<ô9W¥QˆÜgÎ]÷+ó4P›æiqyIõâÍæÉ¬ÂeŽAOY W]!uÄìõ¿®Îhµçó˜\ÎÚ¤Î#Zîîy^„z­§µQÑ*­ó¼‘ä$éY¹ÐÓ@mêiq9¬+¹²SïÖ3Wp-‡YÖªGÀçÕ²ž®¥Ñ{_TÉ[(«í€woü`Ú·Iæð,Ç™Dàn^ð%¨ ÇÀÜ =dÎSÔ¯¤Ñ°/i4Z¨Í ÔâräÀlãpsß–RFÂ-† ©I@à»ïºð"Ê¡Gz\ꕃŸg4àÝ/cuý;”9qÞÌHLܽóêÏ Geql¡6íÓârœå2'eÝ{F×PÅq©ì8"—Á[§sgòi¬öJeÚgzÃGj‘9(X†p5ÿsw§°éw(×Yì“÷%æÙžÂõ܇KAŸ¢6 ÔârÜ}g øëõt…Ì-4Ô#2ÖKç#J]”AX¨Mí,./‰oÞ,1ä4\áÖzL¥Ï1ÍÛ® ËÅm võ4¸vîWgä{o0ªF_àz+ÛüB2;çª_Ç Aî" ±P›zZ\į÷Êp»žÔ’ó)tLYwüVEnKÑÈy­ç3mëù”˳9SùÕ8Õ9ºÙÙŒ‡ž|F/ #GHW—Üš_­wµ©§ÅåØÙ$zeJ`M‘%ö\{! ¬«)«ÿQ°ÇyŸµÐÎ@m®m‹ËaWé™Îr÷ŽšRk-ö 0ê>Õ½Ïa·CFY4s±P°©§ÁåÏ …MãàÖF”‘ªÃ\ŠPýZìu§"î‹ç\ µiŸ—³çqµOr¯,{ªcŠ-ú&úûo\B(RJ#JYt±-lÑ@mÚ¢ÅåpmÇÙÚóî§2…D#é/ÁSNìbtwß+ýCŒº½'õôJ eT]N¡Qƒæ®|#µ«§Áå¼õH¸ýBÏIý–ÄM÷'õë„|ÎÜ(hWúªTÏBíêip9ÔÓ¿ƒ†>÷&¹4︹9JzVf‰ºÏ“†t[ó‹I µ×>Ãär<Õzúš|³žÈX¤…\;ƒôD[pUÃâAc¥çsTØÔÓàrÜ]Ïr·}& ‡{«k¥G/9¤1 -’°,lêipù3ð5ºù8B.űž¦Æ)‰´Å4\ µw'lr9¿cw—U4dGÉÏÔ<ÁêKÖ#adñ’ϵ,î’,Ô¦}Z\Ž×»Ã»dÖäÒ˜-Ò¢S—ÆL/K4óq¯ìó9jsÿ´¸œ¿©áÝÓ[œ,óAPmB rê•‘ µ¸h³a¡žØgb¢Dü–”æšdN².ã|DŸã¯_—€ÐF¨s~gɘ‹“ª¦ä‚Fs AÈB<µ¹¸-.Çyw÷|Ñ ‰°þÖ»—f,’ÇJÏç¨]= .'ÙZ8“aÀÝÝo¬©Ü2T ¬ÃåØúì³"¦”Wz>Gíêip9ë5ƒËÛû·5q>•Þ²#§qGÒo4|‹Atãw¾ >ÖÓ@m:G—Ý„£¯/Žf0¤Á:ܬ'&ˆÅ¹Ô5BP‚ãV²”6Â*¸4P›‡¹Ååðâf°~÷þ™±A_¤;lC²®,I±¥9`QÖ…žjSO‹ËÁ圿FEÜÝÓ­åÜ$s™ÌQ¤æÒ¹ÖžÓÈ~5™ÙBíêip9ÅŽÛ}W?VÏ*qpéºõcÓ ®gŠ 0pöqàââÝBm“$ùfr¸{Ý@”Ö¢:Î5Guïp^z…$N×Xʺ \\<Y¨M[´¸f²ã¬ÏaBGkº¥Çž[mUµ&SàRjéjƒºÐî9Êš¡é-ò#ñ 2»ŽÐ•¸>ŽÎ~‚¯3¼î¼~W¸¢Ç>’èJ©‚÷³D{5ÐÑB=c¤¢°{!šd¶#DžW®1Fá…â‘O‘†ÔõßÐ]†rÕXBcY³ïÊB¼ç¨½Ukr9LÃRñö¢ð5(K=ƒÇ9êoNË^zÃQô8\èi öž#L.ÛMúâÕ9P¶Ë%>ZO¬É«‡†—¿;çÆ7Ý»ŸÍúÊJÏç¨Mû´¸ìÙg¼®{ã7ÝëêF»³Ô®bHƒîä(®äAÂ|£>Joc¥ÝsÔ®v—ãn´3òæ=óˆ€ÃÍNíêŽåÙÐ0ŠS_#b+‹NMj/*1¹l¯cõo®[âw¼ùŒ&©t'êØç°ª¡¡*a«ê»•°xR°P{·Ž&—Ý3eúÛW=ý,+‰7ëٜ˺'5ý ‹óƒÚt=hèa»°Oµ¹Þ-.çeyñî™Ë]½ is‹n\©é¡Õ-.³Ú¹æEú´…Ú´O‹Ëag¶9óî¡.z€êV•R(Å ™c£GÍq5ÜBmêiq9žö¤öy·O~Õq‹%7¹öy3E”뙺Ú? Ô®ž—ÃôÔ9óÝÝûÄݳ÷Péw8§6¨e8Òï‘#Oy±¨ÍýÓâr˜˜ÞCº{šcϹ5ÔKC uO|Bž”ð9»U'F µƒ[\Nnqùêd+Ûc­?ZÏÑ(ÐBíj \<×Â!…ÙÛb‘Âöµ¹Ú-&‡ `¶µ¤{„4èÒBa'¡”ÜÕïÓ“µéWÏ^o`jsµ[\¶ïɯ6ïÞ!ܾ{v H$ä|Å%œC=Us?»­,ô4P›zZ\õôÓ[º¹Ë]3 jöç쀮s.RR©.÷ÜFYÍÆ´P›ëÝârèÍÓL¦t·žìÓ íRĪÞtꓟ­¢þÁêÎ@…]=Ÿs9o Cw'T«IèIê!Ï7–³F$±ÌÙÓƒ%\D›ÊlÞœü© &™ó6¡îîÎÃ׊]ÜcŘ lZ%Vn#'¿ô9ê#ÿHPƒÌyãêð÷úK$ŠŸ¿F5Ðkæê¢ئ}ÐX¼„[¨½or9L¾²áu¹Šèjtª®¬y÷0Àóèið|{^¤£[(ØÔÎàòg[ŽÐ],Ô°h|Üt=õ9L^½gô…ï»ÊÌ,à7~´¸-2Ûã__&… ½0³` Ì†s‰*æ\šîO.«Éà¬KX£Ú4F‹Ë™kùMúô½ïkjQ7ñ˜w!#ç9 «”>®º…ÚÜ-.ÇèUOº7]m课çR)ÁÙùg$L¶õ„­3¯Nnµ©§ÅåüâˆîîI4¢‡C+A½9µ8&’ÖJÍÁŒÅ8q µ¹Þ-.‡µãWƒoºÙŠÒg™ ŠïœFuºý·8/.-mêip9|¸œ¹Ó¯l\=عš¡úŽ‹/úÛÇF®‰‹…GZô]µP›kÛârìDÞ_—7¸CæBUJB=Fç‹kFÖ€XA\éùµi‹—í³<ÍD73j|aÙê3d›÷Ù¹N]ÿ{®•úªÆÞBmÚ¢Åå¼yÿœd¯-ж#„Ù' sQ÷Mÿ‘«2e€•žÏQfÄÞˆ j9«{róBýî"Qõ7d¸™¨ ˆñæâjoêÊôÑiÖÍ,}ŽÚ5PƒË¡Âl&øÂl­‘i&˜à¬tsKp¬J6‡B²hðb¡6‹Ëqó»Y3voöƘQ UC’¢`Œzx6˜)( [4P›¶hqÙΨÆ+£ZfMÎÝNyiŽCêNtï1äÎ>çjÒo²ºï5P¸©§Á对wß•îƒÏ<»U`€ µÌQˆ…FtË Ü@íÚ§Áåð}']×ç7_jT‚È£9ˆçèß9” õÀƒ_ájSO‹ËùûN¼»Ft´ Zî­"A*EÊœîDÿé"ûÍBmžG—íõ.WÏ‚9bkûÒí¡v©ÅÚ y,Õ•@³<˜E£_ÝóV·çjW;ƒËKú=Ü|Ñ ‡’Ýlë…] xjJN(^½ºÕÙc Ìi2ò†üHPƒÌùÓ˜¿}³lC­Bƒ5öQ­§Hóyd=:ýù½ô9js³´¸6И׿ïþæÃ¼ëîT"ù0¯ôÜô£¸Ö)†>-R-Ô¦ž—ód"¼=2ïÙiøÒ¼GêQ¢º%µ”&¥BåÅLW µ«§Á帛 ð I>üæ·_þǯ¾úûÏ¿øå‡ß§ÛŸJ щ‡ðýâ»ô¿þú“~v}ЂéþáÖϼš<%ÿ¿ýúóÏ~ÿW¿úÕW~§“ BáÛ?ùü‹ïþÄ#þaÚö±üxv¿újÍÌG¸~Ño^V¿Ù¿óG¿ž'?íúƒÿøXãû£õ×ýãÐïþá7ŸÿæëE¤'”êMÔR1ÍóªúÚ4a ,nclÔÎ"2?õÙ"úÛùžîóž.'n61¾e}_Uê^”úà’Ñù:'’Ö@˜r)‹Æ‡jok2¹ìªúýâbˆïp^Ðù}YæÒhdH¾{—"„X»àâ9ÊFm)h}ê¶]Ò¼ìšÁ¯¼_­n·Ëê³ïշ诜ì ð0ª/!­zWX¨M»´¸l«Ê3#oæIÄëÝ”_j—-&ÊÎùÑ %—Lº/%áõ?[ + Ô¦‚—í•ýuN#^cjÃvIâBÁÑâðú –ê‘}ý…ÕÚ FN8ÛnBVxp™dn:¦q†9áÒ¥wxi<bMº9 dô1䪋J÷ü:€dY¨½µmr91Lù&mb:ï/õ1ƒP)€X3™oèiær‡Ts-uÑãÂB}„†Fh’9¹Ä¼Rp]k_+¡€§ž’D+²Ïs(ŠÃLЩ†¼Èr´POŒQ}E oþ¡„™s ¯äˆûÏí›ï3ø!zVö2o¶¸'ɾ{è‹èÇFm­mëSOn1¿›yåîš3ÿ}UËÌ‹ËeŒ€môf³¸êCOÝq\¼ô[¨ÍÓârî …« Kº]Õ*L„p茒ôoH´Ùu¢,‹€ÈBí%Ý›\¶UÅy³ 0wàWÃþ'+Å \œBe =ô¡¢¨Ry¥àsÔ¦]Z\NNr¾Úxò»O/>Éç3–X4= \õåæøÍÞ°Ž‹jl µ§ ÉåÐIW#Txñµº9n†¸ó‚°z‰)—yÎ]Õ[¨`Œ`Âø&øHBƒÌÉ2×…èy³Ýta!¡98Ÿ¤…†y`fH<2{Œ /r µi„—WèÛ¤ÙT–ï>^0èW Uc4œþ[ô„¹µ€%°,p õN:=(n7ÉÈz%éÍtæÙÌóµ»#ë‚â”2ã\I)PÔÍ=¡­²—-ÔÃJì§„î0L2'k¿i¨2˲ýk%Œ®UIê¦Í* (º7õ=ÄÑu!Ž•„jkm[Ÿºm„i^WÌ4Ñ4Ÿ#èö0G7#¥aTgCݵÒ]J sâ&ôU› µ¹cZ\NŽmº®0®ÎsøÚ¥-84>XƒˆFÊP.ÎÒɱ,D²P› Z\θ&c¼VÁ,‘]Cˆ‘Õï8© Œ=ª!„Ucc µ© Åå@Áù"ç{ÎkJØÿ“‚Ùë_5uè*Λ‚6Ûדþâ¡¶Õ m¢Œ·›ôØu´>öðíÆ]o7üâ»\ÝÈóÖrEœOÍA—QÊ•òS¸ˆ_,Ôžš\^±xqH84R…ù"2Ûç´Ü4mʹ¹Š­×ÇFh£ #”‡ï4æÇœÐßMžs·Mòû¾¬©þT]71éî®>6j#‡ÒÙ-."-Ô¦aZ\Î óš—öÚË’Qƒþö•&c½-¡H­\ ¦Æ"!ÕBm*hq9QðÛ-º9î&X-l3€Eê5g]=R°fáÚ ^õ÷4Q[ ZŸú’5WIÑ÷T¨øœªø™Þís¤ÔkÝ«º—U¿µ£ªù©¯Èc™]KU5Œ¨SÒØŒÁçÆ9ea7$çXâJÕ稰©ªÁå$ñ/ÎZa]íˆïD¯\í‘ÈÄZöXÃAÁCj(sh)Ñ¢ÂFm)h}ê+ÎñY E·Ûeñ^½¹.N¿pŧ6'I¦¸H²P›viq9Op³l¸ýn2vJ³ºëÈzŒ6gu¥¡'B¨«¦ùÏQq3ù`$¥Éä<……æìèpûsbòmÔæÕ±S×sb–ž\¾&Z¶P{­@L.'–. ¯;¡—î  ˆ†æ’ ¨ª4â5úH‰\‹ÔBí­u“Ëy© Ì“ýþäY¶åCªƒ]ÄâªèJ“äCýÂ+U Ô³Kt5¶ü¼C˜dÎk èâ;Êí²¦r¢<'ˆcÌ1'¯ÙœI·±E1¶2ãvy·›»-k¼ Iãõî˜îê”ö}Ysk5tõRRDŸúÌ0~”8;„óê^ØBmî—?¯"8Qu¡` Ô@êú/¥‹¸Ä†´\%É“·P› Z\NJqÃ|ñ™7š³Íûk,¹7rà AÈ`*èX¤¬ÇÂJÁç¨] .‡oü ÀT_z-œšzÆ rö1‘zʬ)¶9 ÉŶˆÑ-Ô¦‚—ÃÛ7¼’+Ó‹‹FSOBFM= Ô(nh´Ñ|ì4:^)h 6´¸¼¢‚üöäÊ•‚…}޳XÐ,B9§Î¸QÕÿY)øU64¸œy“3½/^iæ/Í â@!3טl¹åB£W/m´(°È ²P{6hryI–9n§®,^£Ùâ2â@ÁS÷\bÐuäÕaê#"m~¤ Áå)@€Ì*Žœ²”NI£Ûœ»psµgŸŠš†F »4Q[vi}ê‰ç¸W¿?šgb|tº-Ո蒸2ÇgW]r±t·¨l²Q†­º7xp-d~ì+^Ñ€Šúyï2ÇOP'=“„r-<‡3H[¹BÊšq“â[xd`’yIkœ°ý¾»0«¿[}nÄ[AÖª´TÒÝG~ql£¶Ö»õ©¯hÙäåÅI<sÁêUµÑJ Ã5.5šÈm1dÚFFèßà‚Ö§n+ˆß47tWÑâý·èâ ¤:§’ŠÓ5Å\ËÀ†=%Ðs6."mµc—æ§ž;Íž¦n&øÞÿâ3sCu÷×–#V=rÍÜJ&×Z]¬v µçuš\^‘ôâØQBÓ­Ü xua•’HÔ¯U«Ô´(µQæjÇðHBãc_´a†Û{Ü aÌDJ®˜Ôëè1 vÝÀdPÚ¨-ô>õ›¨Fåáö{tI­PÐ-«å0g@–A±Øs–¡›ØJUµ¹Ü-.‡>ázô™ed·«ZÓì[ „Ig§NKõ’<©Í «¾wjSU‹Ëyó˜ý3ÜK#¥õ‘ô¥Åø6¯p’/Ô¨õEf«…ÚTÐâò !l¯ö…‚}t13oõíÐU0¯Ý#µ© Åå$ðáyçi&¨¿öA<ÏñÂ}çò¼±‰…Ä“ ¢ÿ=Äâ ê ìØÑ=ÉM2‡¾Ðåa:Ù~º]H¨b¥Ô9ö„ÙÇ’¯‰÷524ê]ä`Z¨g¯ßÎëÿ=~ý6Éœ—ùy÷b+”Ê0+Zë@¯§b€Òą³P}±Ž-”Ya«>˜in’9‘>…4Û¨;é_ÚmDˆ”cm¤Þï5S¯=‹†±JcY,dõ 9è·­LõH®Î*ãÒ£MY´.°P{¦Éå,‘ d¦À@ÚNS_)Ø3$_kæ4»J͆rµI FOÁ¯´P{ Ÿzb—é:Èý,ž ÛKK+"{/8ì {—gŽøJ1­Êú,Ô¦]Z\{¤_“×@Ïò—6%©DAýÒ¸ Ñ”èQ"WŒiÀ*EÕBm*hqyEÕøl4û1Tc&¦\"ÂÖ\&<:„Ä«_±PÕ@mªjq9+•š%|ižB¯½,ª)#QEzFá’ý¬™u-Šóìq‘|n¡6´¸¼¢0jfõ¿ÔE¯3­Û¯ÑZ™OQ%˜ Ì8K‘ücWÈB}ÄEG|pÝf’yÉÃmý[H8ô·¬'$øÈØu=pÖ,’†´*,±Q†„áaøm~ì+œ^Ü•¤9k‰@@HÝž ê-ùØo7jo›\^a„×øÝçK‹]7!`v±bŠ©Ì[ì˜Q# i’oŠjSU‹Ë+Êó€Þñ¥~O+µÎV¤¡ô‚ÑÇÒ!éOäľ“÷‹+ µ© Åå¥9_ܪ²Í b\©7êìòu"§ß±ªÜWM¯,Ô¦‚—WxŽê{ãK“);õ,J$ Ã(<Ú`Ÿ{l¡¶Ê‹èÅBí)hr9kô §ËŒ^üv‘íBÁ¨6Î58[3‹s!eõÊ(\$õ[¨ñq¼‡™d^1‹H}íûGGí*hp9ëøuÇ&uÝK/ÌúÈÔDtEÍdäÑr© Ï|‘Óbi›(Û÷~9i~ì+Z6ÍúÙÛo&°†–`)”Yw¬X}LP»§EBª2§·¥Q¡ù±/’?Àó÷Hµs«F8Bàá2ëzv†RÓâ‚ÜBm΃·¸œ§N†YáøÚ Ÿ!n€´Ö±ªÒ5œÈE¿Çh¾”žVÝ‘-Ô¦‚—Wt¡EÙî¡ú?a—¢ç|côXEÏ0³½›Ë ûÂI·Q[ªZŸzž~.?LϦ¡¨ÆÈ]ªAdý:ÃKˆ9µìÊ¢Q¨27Ñø ÌüØóMtþú¸ŒhHð#Œ2柮À1ÇÆ_Ý"ÿÜBmn—W4¾›-æ_zç;†óCý:ºÞ J.£ë K£¤Þ=¬^mÔ–‚Ö§žûL³ÛÈ;ÜYõù¿üðûïD{0JÌANoømrßÏ?ûý_ýêW_}øÝüI>ňßú=?ÿü‹?ü AøÃï}÷Ÿ]?sñu¾ÏPEùê§ÿôå—ÿüÕš¡ˆÌßÛ:þXjý˜ŸþoŸàŸ¿›îšnÕ¾„™^3ˆOÕqXz}«,ÔæØt‹Ë3³ú®/õä¶,^Yxc½ÍÖUµHX÷—™¬\„G×ÿ Îç¼Òõ9jWWƒË¾®_;=p墺WÜãþ' —4\+e>„!!cÂÀ)bt)ö…†j¯×ŸÉe_C¹Þ4kÁˆ^qùŸ4¤P¥0„ÿ¿·«ÙÕ䯭ûyŠ ÈÖ J"%êîô dad3/ `6 “EÞ=dµÝ3\Ñ*}Ÿá^ØíÓ>u.%’Eðèc©©qi±&,Ø‘jSC‹Ë£õj‡.è}uÀ³²™âÔÄÕ7ö½A$N/ç– js-[\ö5„ë<Üë]¡÷¯*èû^×”Gk¾•XJc—Ç`Ðñ‘Tã*ƒ±P›¶iqy´GÆë®Ëéù¢V”ßéÚ\ÍqV¦N(™XÇšC–8×1Àrß4P›öjqy¤ëïwˆAû2]ó­Êb’0ƒC­¥kg¬ÉõJ±dZixÚÕÐàòdßÔˆ,jèÛNJ¯·Íž¦/%ñl#¥ìpÄIG* ‚Ec¡6uµ¸lëªAQ¸š5…«i¾A×ν;æ:]!ÙÄ GIÅr‚U±Ÿ…ÚÜK-.OÖü·AEâ£TUý£†N²ZÒÉIbÅùšžÖ—\âEiŸ…ÚÓÐäòtͳV˜ë8A8«¡/b6â2½/ú–c÷ÜúH9sÍiQ¾b¡öÖ·Éå‘ïáßjП˜Çø†A'SÅ‘§ì÷g–_ƒˆ‹óS[Ä›jSC‹Ë£¼'\’WM¾ç³ò¨&¡°Ç4uÔ3€s ¨ûb?´P›kÙârÀÝøWdüN×Ü©¤–\ [IE’ÁyèÄ \äZ¨MÛ´¸<ò3ר˯±ånÁèڨъIä¨#ÊkÉÝaÕ¹Ežn¡6uµ¸ìëªIúO®QtÜ÷ˆP qöép’Þèa˜:úªDÐ}¥á=jWCƒË£³uàÇÕƒíõ¶9JH¥ûæ3`*’½I ‡¥¹X'¸Š‹ Ô¦®—Gº~k®x¤»Ã?jè]Õ.<ÚæLv*Œ•Ý`p1cÝõÅy°…ÚóG&—GÒu]«å€ć5>%I-|&ÌWGØä5 söFc¥á=jWCƒË“s¸o»)|ÀÙ³L …[‡©í± ŽAµ¸a¸8½³.Ö²…Ú[Ë&—çv(ù·Þ#†—ï‘>&ô޳‡8ݨs¶¦Ç ÍñjªŽ…ÚÔÕâòèŒøºá¾.Ñ>½AW‰çbìÍµŽ‘]AèÚg*m‰´Òõµ¹æ-.Çöͳq‘—é\/¾áÄVeŸ”ƒÈ›Xœ³[¨M -.ý·»¤k55¿Þ6Kœ3Pr$žØ»¢ÙG—ôÅ‹¦êçJ×{Ô®®—‡9¦¿rLÇã"qœµT_1gŒ. Ù¹@’·Ö$«[Úæ=jsß´¸<Ò0\wkþÉ€õ±ÍJuô‹G òJC¨¡Ç€d·ZÙ¦Ú´M‹Ëó|Òy-[=|çÖ¦#¨ôθðH1‘Îw@ùä…†jÓ6-.lµ³ƒö¢ ︟ô=¢¶˜ƒHX«Ë=#†&Î5ÔÕä' µ©«ÅåaM‚ÖX^%Õôú; B=875¿ƒ,©‡ "¡üò‹ØÞBí­y“ËÓûtú½Ê2]óA¹š›Ÿ.v.°›£ÈŠ«eN«ù¢*ljhpy¤á×þ:œãtÍ‘ð–r˜ÃuIˆgªcÊòU¸/5¼EíÚ¡ÁåÑýÅ×Gf¨Gà°†®Fíç¨U$ŸóH_çsKPG¼:ë°P›vhq9¹k<Þëcöà}gÂ+xœ¡ð ©etIŒcu·f¡6mÓâräþB›ýƳ¶)Sü&w¬ó‚ò@öÀ˜ý@¾8ë°P›Z\Ô­5p‡ý õ¦³ýä?sèôÑG3û¢+¼²Cµ©¡Ååé]EÐ=2à‰ÞñßiC.ÍÉÊ©kL™[GGB<÷Õ]¤…ÚÔÐâòHC÷“óWÖñ:·ã…ü¬ˆŽ™’øÅ¦W€¾H’¶Ò𵫡Á婟ùú2çø½DH}â¯ÞU¤Ïì|ñ¢d«xÇ@mjhq9pwëtŠÁ'áßiÈ¡Æî}×%›å,yC`ݼj9b¡6ã‹Ë™º¡¼m‡?ï ,*â,ËJϬiV}7è ªžZ/öH µ§«ÉåH¼ãßr'®³£Ô|ƬZ‹­¥Ê5DZ Ô±P÷íú£×‰Ÿôš7É[ PÅv$G^ézÚôé—Gö~ ×0oAy8‚>Ú(]ö{ÊsTh¢äÁ¡÷ENn¡6mÓâr¤a„ì›o(²–oñadÒÇ›5UtaŽÒdÇ™ËR×[Ô¶®÷\^Vè£ük̓?m›Q'5a®ãýÄ äè`Lm#R—Þ¢pWÃ{.O|ºž¹…«!L:1Xç; «“Ø—SÃê¸,ZÜä}® ˼Ç@mÚ¡ÅåHa ì‘.Ö°M_A²·×Y†OcÈæ^kÆUŽc v54¸ˆ‹®y·ø†sVå¯* 2s”LcèQbï1Æ•ÿ6P7ë›1bLðÅÅO„µÈ< Œ®äQ2rðúªU1w„;9 CËu²y˜yÌ>ââ…®…Ú4X‹Ë™Ju÷Žj`±êÐSÈ2•Î[žÈòñ‹ÀBíéjr9sCÉÛœ+ }ð, KRc!޾’÷Sò»LS<«_$êjÏ©›\8¤ðàtEVôeÌ–ˆºœX³³bž£»Ò 畆÷¨M;´¸<¼HƒË!!¼#Q×2zIádï'±ˆBÚòZ ®W7Ü\\Y¨M]-.ûþˆõI_œÊ¾©Ma^¯kÒƘzã€=öÚ˜’29è`¡Ue‡…Ú\ó—ç]bt¸#oûù•†²±ë#šÜ}Ó û:й0Ä*B+Û4P›¶iqyÔìë¸x]®½þC¢“4ZÃ^¨¡˜EáÑõöZogoi¥ë=jWWƒË½”´“–ýkèXj£Xä'šR)ò-1”â]T÷º+e¡6×¼Å塟‡|]¿¥ûNl&SB鮌)CJZ”ââ’ÝBmÚ«ÅåH'Rñýá ö:*Éþ/¤‹|4†e½É×äH!¬b*µ©«ÅåÀ’«Û®rÿ]u† O™Úìbɽ¢ö¼ò#–Åë µ·˜\žâ¡0œ¾ÜLЊÄ07‰•wŽ\0ú6¹†´Ò𵫡ÁåHÇÌàO_t$è¸ô” "û y@I˜G©}敆÷¨°©¡ÁåÀú¾ºÉ {Ãú¥3û"û=NŸsÍM~M×´ì—ëûµk›—#ºR¬!ÎÜ£cž$ûy–©8®qj—äÕi 6íÐâò4ŽÇ««‘?Ý}'…‘Zm-QŽ8˨ءÔ(q=¯]hh 6íÐâò´Pá:W y[ÃÙ#%Ïð©éûŽ-džÓ£çЀ-.:,Ô¦®—§—ìî·noˆÙSª¹6q¥ÚmzÔ”S“žc ÚÜŽ—ìjSW‹Ë™éúøü욯1Èïuq¡.-Ÿ½ ½øîÕ¼òßêFC§'ëÎ}ª¡ÅåéÜÕ}ÇÇw'¥6\­%ûÒ%gK(Asö1†¢óÂêA…ÚôG—#Ú½¸õÃþh4ÐJµ ÿUåÂHջʹŒ÷mêFÃL)ú¿0}"¢Eæé˵ôO’9†pú²ˆ}k3fæîv†:%вÀ<ë&õ¹ˆjo“4¹¸Ô¸Z ¼á²ˆ±q—:–1`&‰ð4Ü£È1aiá|,Ô¦®—G-^¿.p 8e¿þ²ˆ%)®atÉŒ#ò<ºŸX‚ì]NÜÀâyµ…ÚÛ8M.RÒ Ô_/-ýëŽY›pŠ“Ç†HÇ«U+ü=/6S µ©«Åå@± iQÈá—\`jqEwÅÖž‰—q–Ö¼…Ú\ó—§ÓJ°7$H:££çÜ ÓìuT ’[…‘\\ézÚ´M‹Ë‘ˆô†5_J«ìjŸM \°Œ&FúD¿÷1ÆJ×{Ô®®—3íâ‡;{°Ä-´ª«H;Ì"î Cê3h'¨¾ZójsÍ[\Ž$™·cбÍ9¦K!û^2Kˆ]cÓw»i,ZÑX¨M]-.O§Åtôú¸4Ã$ùíÔ\œE‡rÅ8d‹n„…Ÿ·P{kÞäòè°‰õUŒÄ¥Z5öÂMï J÷Úq5J¸'{UrÉe¢+&† Û´P{¶iryÚ.;_KÚ]óõ¶‰]“hZ¨ã ö™ ¦!æ d¡6uµ¸<ì¢"±½êš¶_iþˆ®¹éIc‹¨™BpÔ†dÙ-§UK* µ©«Å倽^Þ0ª2GèÑÕÐJ"©ÄVf(f쥭º­X¨Í½Ôâr¤]¤w\çì}*ú2º tYÖ[§"y‹‰ËX[¨M]-.Gâ}¼<çì0¤”*$$ŠU{ßfª`¸’ÚJÃ{Ô®†—…5âçeÍÖ°6L<9èØMIN8È5Rõ¥&^…X¨µ†â¸=ððŸˆh‘y²À¯s<=`>ÿÄ0ϪɈ¨v 5TÙ‘$˜Ž¾UJq¹˜ Ô¦!Z\ŽŠÐñörB"å›ÅMNHØ«ÛÄ4¨-n‹,Ôž†&—#ó€·g`ü€£)ŽÀCd=n ÏÉ>U¨Ð¡¹^Ó¢*ÄBmêjqyÚ¶ïzy€tÜ6C©‰Iß?G(uÀû(Z< C¨½àÒ䲟¨Óßû»C|Ç«˜‚£V(¥W̸ §Õ]cè´:X²P›ºZ\ÌN:GÞ kô:7¡{È}ÄšfJ³ª+miÄ…?²P›ºZ\Ž´¤Ò‹¹×,•<#B˜ÚáGî\ u±™8eksQf¡6÷R‹Ë‘‹9„íÖ“+ ø Ýõ0öÖÙ·ì©—QEø8§…ÚÔÐâò¼ZV[Ö¯R,=ÇTuÎGªèsªÍ¥. \r½Ï‹Ã µ¹¾-.^láÕêëõûftL.ºÖ"pn‘»nV¥IZ·Šã-Ôž®&—3‡ž²ÄÏÆJâC‘¡Ô$‡öY²àT$çÓµ´•†÷¨] .GæO«†ðÛlEç&ñ2ãhX¡ÒGåäju“VºÞ£pSWƒË‘ÙÚêëõUŠzœXõy„ ¦îró4SwÀ4!-öR µ©«ÅåÈ1¼eÞj¥™‡}.4AÖRIÇ–wl=ÔY/:,Ôæ>`qyzp̯™™SSè4%3¦4°•(9J(ˆ±è˜èQVþÈ@mÚ¦ÅåiÛ¥«å¾Ž¸;[¼P9NÊÅ— Ù\Ê@{m‰[wçjÓ-.Š?ñzÑ‘?üþ ±Yß¹:ˆ‰g¨ÑÅJeÎÌnrM©®^Z¨M]-.fÓ_mßár ±eÀAVrdò¬Q 댠²Òõµ¹æ-.ò£¨gMÚÙ&Ÿ~ WKðc6=«8:Õ2kžu|lËmå{ Ô¦†—#ˆ¶/-—b¨ì‹Ï:zøê$ /~ȧΖWm-Ôæú¶¸<½ ¼fÞɾÎÑÔF^_ÜW–ÅBÖÛê™Øw`æÅù¦…Ú´C‹Ëni×\P‡5Ìãh€úw×÷ÌÙÕÜÛÐF®ËøÜ@ݽ€ÙãÈŸ‰hyøÆ]7å:òåp yMMi±2zÕµ å’½GÉÛVƒT-Ôæb¶¸©:RýúáÞañ(a¬£\s‹WjOW“ËÃ'n:‹µšË»7èJEÖ¡ WÂÆ­ bq‰x´ŒVºÞ£vu5¸œ©ŽIï.µ9{©É¹ÙK5I¼\GÁÇ3­t½G᦮—GÁ%]/¶®V‡¦·€zæiÊbÓz©¬5½âÀ騋Ï54P›¶iq9 k¿^‰/_o›X)$¹Ë·˜•I’ŽK©1d·H(-Ô¦®—#3`¼cvV£¨^%uÏØr/y4eãzêV•±jsÍ[\Ž€èPѳÉP£6"H¨Ü* ƒ/q°~ø\Yù#µi›—#3ý{l3‘¶"“D\©DÝ›GÉìwÊË—®ÊxÞîñø‰°™§SÁ¯ÎkþÆYã,¹P‹PF’ä$E}brN%öÚçê$ÎBm§ÅåˆCòôŽiÌ­y©¤%°®X8N N®7‰ü(¬½ÚÔÕârdø†èú†çí­ó€9gM§‰„&(±DÙÚÄðº¨M‡dq9à$zÂÓ¥ïœ8Òšc(ÉA.uêélàÐZJ‹@ÞBíihryzL—†éôP“¹÷ÌuÊ~/QIæy8ýK›:¯4¼Gíjhp9r£´íÜY ej5—Üp–®5¨»ž:ÈêEe¬… ÷<8÷%¸OD´È<=»˜¸´=hc)âÔô-7Ò˜õ‚EBæsJ½¡+ïQ{ŽÆär¤ Ö»w éâmðð-Nä13#B/=IÌìq5$ÂBm.p‹Ë‘«4Bvöø½œ÷QÜCĬe»­x…e·Oc¥á=jWCƒËC u}{=1rgÌuä¨8¡/?ê¦oë©!9‰;WëÛ@m®o‹Ë~öˆ×i&êàÝ#__×uıçZzG1ä2¼Sû;íä¸Òõu£kbŠø ñgÂdÖyM+ÁÓõØ]<¥¤i°tl»9O®8èÓM×V5¯j×8 .ß¶xÒ÷ø–£ž¦Ë˜‚ïaåžýLzï*ÉF>­t5P›§Åå€óñú&нþÊ­3•ÑÑOÔžd’vP”…'s•Poqün¡6uµ¸<®ày»‰×éšcÑ{XYxXÒ¬yŒØc…ƒ¬+]ïQ›û€ÅåHÓ”ÞÑ¡·žgŘ ŠG¨=°‘å6‰!¯2$µ©«ÅåQ–IZâÇÃÓÇï½ I'û•Äx|–¦ä]c ÇGX¼»²PwÇĉ9 ~qŸe™™GEœNg Ã×öð¯/âì£åQd©Mf”Ï`ï :'§‡Š«ÍÔ@mn¦—Ñ}Ї­tøiJÄ'kHÝãuÎíb-Dí’ñÍEÁ¦…Ú\à—‡£I ^ œ·7Î…†ƒ§šBî½av­ºI—™ìXçÂùX¨=;4¹<|4¤u š‰_?«a¬sq’ Zöxâéö(Þ³C’p¡¡Ú³C“Ë¢W³Ý@a¥a%Œ|lŽ稳éÎʬúžqq5a¡65´¸œ…G§gÖ:7pEVÎ5çš ¤¬êc,ÔæZ¶¸9V—ý ] µêTòŠÐdƒÂ‹^´1²¤Uñš ] Ôí¬p­¡/ôÉ]¹Iæ‘qúß*²uLÎÙâ­ÑJ–È÷¡Õª“λK£¹W"Þ£6¸Åå@!¬Ó;Ý7µa_ÚŒ³¥ˆI9èÀIô <µ—ÆyÚ\ô—zÔEx.øèÃåPsKž ×ÕÍ\d™E¦¶ÒÐ@mÚ¦ÅåÌ,—ôކ2e&˜ nDüfžCÏce’ê‹ ÜBíÙ¦Éå@aaxrü¾ÒGôµsw}Š#…)jû&É|!,# µg›&—¾'_#4^_c4#ŞŠ{ä &QSw˜9·œš_$jSW‹Ëöš—m¾aFðLN’’1ËÎÜØU”:Ñô³§±¸²P›kÞâr “GúÀýÑ$+ ³“M‰js¹# Ç“dÛÓGµ5AäERn¡6mÓâòtþV–à^+Íœgè<†Ä|(æPhÀèØ§s\ÛêÑ…ÚÕÕàr`Æ ¿’̳W곸ÞGñ3'•ÓÖw:~»ëlhI—¨Íõmq9ð²R€¿Å•j—íÉI^WJÊa:j­Ô‚_Ù¦Ú´M‹Ë£.œþºº’÷7<”o‰b@b”Þ‚>Ãs\Bˆ±Wˆ‹)jsÍ[\Ä þãzoùJÛüó¯ÿñË߾ɶ($rîKþ½èçÿÛ¿ýéOÿõË_å÷ÑÎþ÷×ç?ÿù×o¿ã":øÆáÿþ¿^ÿÓÅ]ÿðÏþ—ŸÇK/,¿qüäÏúï_~ýë_þó¾þyßþ¸¿ÿû?\ÞÿþÍH ûÈIgrr-3.1.0.2/grr/config/grr-response-test/test_data/profiles/v1.0/nt/000077500000000000000000000000001273104013200250005ustar00rootroot00000000000000grr-3.1.0.2/grr/config/grr-response-test/test_data/profiles/v1.0/nt/GUID/000077500000000000000000000000001273104013200255305ustar00rootroot00000000000000F8E2A8B5C9B74BF4A6E4A48F180099942.gz000066400000000000000000010651631273104013200317150ustar00rootroot00000000000000grr-3.1.0.2/grr/config/grr-response-test/test_data/profiles/v1.0/nt/GUID‹7aUÿF8E2A8B5C9B74BF4A6E4A48F180099942Ľ]w㺎&|?¿¢×¬¾œ Y–eynÎvl%ñÄ_Dz“]ûÆK±U)uÙ–dW%gþü ð%9U»ß‹é³Vg—ù"A@ü¿ÿã?þçŽód=œ¯“ÿù¿ÿãÿþÿ€_þóyY»í䘾eñû¹(/ã¼Ìv—¢üL/èxQ'ü_ÿØ$ÇøòsœU»2?`y)«?þè.‡Ëøn³Ÿãùz;Ž“Ñj²\/Vü1„:ƒï‰ÅkzÀj›m2Û>LwÃi¢±¾…~ö©†~jâ»ý( |r™å1=,˼(óËTû?#…ó½žoq—â<Ü]òâôÇ?ºÿøÇp<ÞΆËí*~˜$ëxmþØZܺ[kVñ <—Pm;zÎçñÔ©zѯª³Ùb¾½ÛÜß׿=U9 ×øí‡áúþLaî÷;7=™CÃ$Æ‘/ãñv½ÎèÀöîË:†>mækwÞ'íünP1ÙÜÁ—GëO&`pcÏñjrÿÅÐm;]Œžâ±;ôÔ{¾ß“$^­·“Õ?§Î·ú¿¬2þÙ¬µ§÷K⬱þVfÕ·â°O¾å_/ëôõÝç‡ìt€@—ñqô-Û}¿/ÊQq<§¦õÿL`òAÆâ?6 D@à Nü$à _(B¾Ze'À[£Çxô½H6S˜Õe<Ü `<\·³‡ÕþüõG°~ñ:ñÐö.ôn÷nršeÇÿ·ÝëÙ™zI/»oûâm•¥ûêŸ×ìš­ócV\/ ûëít¸zˆ·“ù:~ˆW¬3¢®_«þê"ûýú¾áç!0Ñ)¿äé!ÿwŠCW / {¾!ßp÷¯+hÓŹŠd§ Öïõ£nÕ‹WY••?²eQDm`Ëóô˜U¨{XŽî/Àp»¬ª&û*¹”ùéíîúõkVb¨Ó ªLö–œ³]þ5ß g¹± ¼¤§}Zî pà‹Oϯ‡ÃÃ5ß«u"ò‚¾ï–%\d' ‹–Y9J/Ù¬0£âª¨¢0²«ì-¯.Y™í_òË7Xu,( ¤¸–»lV쯇lZì¾ë>úÞ-LeG+{c¨é¸þ8+X§ô·Ú{˜ÒÝ·ìþp­¾ÙyìôûNè&'˜Ä‹ƒè†bZ߯gAÕˆUv,~d®\CS=NÉwÙºÌßÞ²RBy¿î_Šò»bè䜟,uúƒ€D{x8ïFÅé”)þÂkéòIç"â¨sÈÆé%ˆŽU舘ÙÀvPªAñn§Ï”åâD(^‚űxý/è…E`@^p:ø,U’#Š»Ñÿ¤1<–>]|ESA”û=ñíç<û)¿ âQå2l~ ÌŠ4zM+íöº<_ÇÖp ‰|¾/³ÌÐiZ¼ak Ð´Ûu†+¡É)=ƒn¾Ôñ’úgho”¯éî»Äá,JN@\|Â9Ô¢F?t‹-áàznYñ=­ò½0P~({ÌÀ~Þ@Õ‡xí0Ó„8Ý‘”‡3ZΗ®w$ožçÙûÅ47!²y²?ȾØa;­ý°¥º É} 0KÏ ¡oJ·ƒ½9 hÖ(ÓÓõ"Ÿ’€5”V–V}©~:]AFnk‡ÆrA‚uýî}µjÙ÷ãy–à'PÜJÕÅFŸb+‹£•â”ïÒrYhÕìu<»4Ë×ÙÔÓ×üm•žÞ2­º½ üºÏ®¨ÍÔéGý½»»5¯„½þg Þ&'Õ·ƒY-"+ÒwyQÝ%Oj&Bø˜Ì]Q\Æeþ#+iûýž»2K¿Ÿ‹üt©’kuÎN{#A^Lƒ¹æ‡K~²ró¥ç( -;ŽFÉÏÍ£R…k$΄Õ=Л®Ûèi4•c¶+Èhvo–¡}ön,‘ÀÎ’_gtâ;mm¯g) Èû¼¬.zAÔít²\zHß*õ%S5ˆ¸êc~©¦iuQ‹%ÚR¶y?r0­} æ/èlÀÏVa³Jðèíª¶}œvuhÓŠ`Ë?ÈršxÁ¶|s*üI w7|{ºþù++ õžƒ:ˆŒn ¤YÜÝí^ݽ×õe!XÇyqAÛ.µ+“i…©{ ȘL»»ürLYÉÛÁÞ#;@ÅåRÅ.K\íë# ÙÒóå º*ùš“üß‘ƒú7ú†2Ÿ|K§8 ”$:E¢ƒ$€€>déÉó°{¢“-@4/Aæ´™#jÑò µŠÃ!¯€Dãì~hÉhíÆ¯o ¸¯Y¹ø:|…j8ƒ²øyªL_ÃÀkv›vrB·éG†Ú¨A¯ï·U¸O{=è5qü‘èfÇü훊˜õ†ªõü¿Um .R1ÚYÅÎÍ„¿™Ù±ÑLx{àNÕç!ÝeT1¸Y‘Láøt)?Ú(×Vw^çlŽåðz—45’̰6í‹£þ ¸µ V ôaн¬Ùá0FÍT¥å[fÅ9ôZ5±£”À(õœìÒ“í¯àdÄÜ$¯÷ð† dèŽvñû•M‡E0%î¡k³ý‰þ’涉.Ϭt5Úá™Q ˜#®,Pôgœ¢¨Q´ÎIÏDÌXXŒÍJ¤sº—£ä.ºã#d–Ø,mÓôßjÆËѵ¬ k©x<ïÓâ'Xd°`³ãýéR ³WÚrÀë ”¿«‰R_±£í‰êïÔÅŠ (hÓìGv€%;;i°/Cr°á®GtK¤œc5ËÊB›Í "=Ž…9JKÝPiBIc;ædîO?´Á]H£EÔ0Ùž@øÙN­‡í}£):"E/Ù åŒ, ”3ßA}É.낦F +‘ Ì¿¼Øç;9ñ}6À^¾ ‹Ö%€m€ü䨀*ãÖuœë[ KöÁö.ìÓ´NƒÙÞCpYö†DãÃlZ¬³êvû¥,è[fXçÛf+‹uqI¬´,¹+ëŸùfÿÒf˜øLkœÍaY¦4ï–2³(d¶#bJ„Ì£ÛTÙÞÚØšGœël)´DØo e)›$tmƒ Zp¨}Á¨³¶lÕV¯Ëk«^=]3’Iÿ\®Ç¬¹¶ÐP=Ãb|_”V;¼ÊkÊ8T/`ÙG“'Ù²"1,0`a¸ºbmtôÙH*蜡§r¾(oä C…ýN@ p|ÍÌöxI<Ž’ñ3øZ ¥u¬Ó"¸uÃÈ ”¬aOd²…ÏÊ©ÒNc—5ÚVõôz¸LÁ’½Úøò+Iw6!Óìôvùf€,ðM ñ 5ŒÆ‰«#Äx—ä C (BŽßA1UÆöéö@Þã°7à†Sÿ Òšþ4áñÉ œ«â´¯ì§H^ŽH¬ÉxÁ„PBˆóŽ“Sr}ØLìXîµ.‹»£­RÍ LHÒñm )½O ’˜<OÙ‡—T$¡5ã8ÍÞÒ“0Ìëžt<¹9ÇùØk•ÇQQp˜«O*Z# šÒÏÆü¢7?ÑÛ¶ëˆÒäŒQ…½^•l”ƒ4ÑV¯Êׄöuçý³îòÛG~ßa¸ß£EF\íDo²,0 P”³¼:ân‰Ž |Rè¹™À£90b¬¸Ñ*0½ÏgdBÓŸË&‹qöz}Ó€Eþ€ DÅóxzÈËFhWü¢Ýng¹C{sö†žê4?æ$]~5=•Ÿ²GPˆ?Á6¶1 ³}£[ïz<Ç¿®§d®ÝªïfmÜÅ-¿Ùx­–³gr ¼øyÊJ÷ ƒÁ¯*Q(PÖã(e£žuo‚4}À€.Aá…œdK,Ïû{õÌ¡…7_÷á«•Ñ!­*;Aôßj#I¿fF£+BÜœš_4ƒ±¥â4KO ¥v*ô?Ž™Ý€ëzÝ¿Ùx|ºå,Á߯¿‚ÁÉ6ü¿I'Ë] „¾ÂW€Rø7»döÖÌ´uþ6½m}e  u½Îç,$)6x¶N£¦¨IÝ„ýæhLâhΰ)!”±)†‡BJjwДT0—K©ŠÄº³x s%™ŒM´G›~BéRí$;|›ð`Kx±H®àTQøWNažˆB×DˆÚêKÓ€E8ù8¾‡|7ÍOߟÓÃUP #L=:´‡=m¨†±Š_ êÞÔ%d˜¢­Öc«è9{i8zf°6“6bâ¨0#XØ­qv*Žù)µQtè÷^ÁÊÈJFí‡{hB­Ìz˜^_ÔAwëîºûžÉÐzÕJ¡¸8H\Z}œvOYyÊè ³‹â £ù|fåõLwìƒ×Z*ç©)¬ø³^ Ò½‘qá©P¶ð¡FÏŠ{1Ò®ÙÇœ:…ƒ&]¥‰‘0±„œ71:RBÓ äá€C“ü}¶Û#ðsëÕp §SqQ ½ÿv-íÙe‹iPg”½oÜam=‰¶_Á}[–Ù×üÝWÌóa™¥FFðCƒ[8VP>žà)cV:°áå´öý_¡µÅOëôà’‚¾.Ð 4–¾˜"Ø}XeÎ<¢9|r'2è»Ðq¤{ÝÏ;ÓšXÒ\ˆÚ×ü‘®YÇo¯PÛøò¹8–Pß¿ñqt âuü ÕèÒøŸã\Ò„µVÑ']Í,aúQ¿Nf pFÙx^k3¼³q(×Aðû‘pá%ĕߨAxåŒnàÕ°Ù^qI|PZEDZaviQžxÔ Ñ^OeWˆŽÁMW›Ot=ù=´l”¤ó‰Šþ€7Â’Wß﯇ƒ’.‹ó:«Æ)*ÓcxuãašÅ Fà…¢g veñ”..D-î–^1­¶œ‰~x$ær ,ÎV…óy!|‹;?KPË)D)Ϧ`¡û,Åíλ\O"д'8Y}g¡âb&V@š pAÉ%-dzÀؗõó}¾•þ'J °_Sì{òC*ÌSÛð–ëǘÎr2¸|™öfJ±£l ‰6F¤nv£Mv¢’l„À8dmDÂ×’@wq•ßÓ–^ ZWä%JÑ(ùiY¹­ „T—ñ’–'sâG5ÃSô˜×!JàZ«öÁqÄj§ÍγÐ5Úà$’àxBaÈb±Ÿî ›ç±8ìI ìâ)¸eb…GUsÓ=m!°hcíQq«—EÄUEùÍeKp.£kÚ¼/˜×±BˆàŸIÖ’äaDcúýð»Võ;TÑ‘ 2Ḛ `J½–bœ7§ ±^è5}a¯¸&£m}’Têù.•jô Ÿ"W(>ü%Ø\«X’µ-#·‰ÅÙnÓ+Lhj,Õ«Œ ʽ¿Ö s’¼„˜œv¥ ‡è µÛ†&‡®ræÛa P$WÏk–A\‰/õûò¿Û)vÛ}[¦+O× l)³ÇÛUGp€ÌM@´¨§¶–;‡šÑÜò¯9,剸ëy†,ª÷G‰Ð“ˆ¢ÌÖï$kž(²û©ªR‡}¬Å9;%×W°ð+»‘#>ºLËÊÐÖ ‹¾¨˜8HÓGršÝ±Õ^e«Àúb½P^+¯±’I`.Àn™’J4Зä¢Ä4ãôÃ5±hÉÅî‹…Âü8A:¾‘.¡4bxÜ[Pç&5ÒÁÂz7aÏyj@aß}UǾÒ=Y½€ya Äqø°KEj¥ßχ|—_Pß™å¸Ý\ Y“Ë-³¥*­­#7R-ð‚ΰjº+XGXOºP¬\RgrHLFLÄ’ €uÜÀеÝ„ÈAz7q2r%t§ˆÀiycꫳAB]ÒÜr½à¾±³Fˆ¾Â7_q÷f·b&§»:%7Ïê*Kªböà¤ïs«€5ƒa°­8(ˆ¥ÂÈ¥‚¼}19!‚¡ÐmÁZ_˜LÇu^»Ê+ޱä¼Ò ({§9 ¨ Ç,TrÊ ¨=ࣖ¤Á/à—†N¨#ŸrZü¤~ø¿B:ݨ“ר k’Duü†DsW×eºËVÅõ‹¡åPáΪâõ{é :¡° ¡`ÊÅ&Ÿ«#§J_‹«É¶t16ç=¨å$;)_Ñ®ØBóÊxo\.¹¶=ƒW”“±ÕŸ‚…ž‹ÌÒÁn!éh<À—´½x=Ûb½ÅÚr:½Áàk>–”ÆÂ#ý ©E¤aÑ«ÅǬî×rPsUÙ„-AX÷:Ø)Œ1¾ eêÚó¹ÝÞŽ”unÔ"HâÁÔ#›OâGä)ãçåSüe«C&Û»kµÊÎêd°þcãºN@Fu­Îøq¹]eà1¦'ø×w>LºgW«2¿Óí¼P‡ÎR£†3›“½í‚UʧA{Ç]‹í¸8¦êV„jÔªh NΠé·zKÑbü  C+þvxÎw[ú~`Ÿñ뛺M¡ìã‰&´V®U¬ÎîÝÀëDü®ì~÷âÊžµ0—eQâ¾ #¯a’Ñ‚Ø3˜«¸¥"PH«ƒ@vRîW~`úý¸Ÿâ¦ËeéÛ LÀ|79}Å;ëfÑRC=Qk–¾ë»3³JÙîG½ÈʨB˜o*z¨ûD׋>š†]$îÝ Ã×w:î‹òþzÚ™oâÎV±ˆ²åSÚ”Ä|ðq}¿CŽÅ¸¨tõÊ1"A]qÈKÝ£1V…:TgNt‘Ü!uÔ$7óåx¶]m¦ñv›LþŠ·«x8zŒm›tÂáËÕây2ŽWv|ôùæ Ï¤•º¤½‚n äI·@7sº¯nÑA£aK¥x>†‰˜p'(’ÒÄ&ëáj]C‡Í–JÒ–l Z,]L¿AÐäe²Á,-¶óøÅ0€ü6I?WÙ,ÇÃuì6­ÕÖµ(ú´J£c¤V4û?ÆÃm¼Z-´Ú  •Ë'ó N—EË3bÏðÙÅýýt2-ºö5Gëõ9-s´ó*»0¡l—IÀèû›­(»|ÅGsM×·|Ÿ•`‡•”V°ØlÆïñ¾è˜¢)Ù±1ï±»¾~Äj,s[\ج;q'  µê$âPþ#=\•Õ ÎVËVî(Ý43ý±ûFÑW‹Q_¤ûÃj«ÙЊ²(@¹è®-׋>#‚B_arÛá‡Êõ‘W=O–5zqEl°N.RµºX;Y|k~ЂÐNˆÕ7¢'c»Á<°z?úÜ„nü[Øã™À,‡kf.‚ÓA mþê#J¶¿'uó!;e{¼6lœ¡íÏçþ¹ªô™›`à3G}VÁl\>èÏU³xæU» =5W#úA·k;vù9Zn’s†×!L ¹#¶ß0W”1ÁÛU‘GQ/À(“iôØÛ°Ö†,WZ1¤´/?² ÞÆ °cg-çº5¡!Oåél¢øcæ|QËç<ÒžO{Çù‹óìÒÚi„ËO<±}_fÿ²E=QTµ÷‚ÛW‡ìÄm^€pö¾€K‡a äDSÌëÉåçy¸ÿ¯kuÑq®ÊìHuìÊ40´C„(1%~zâ“êü”½'5èÈŸuuÝî͈h’È¿Ôy;­}Ѧ8Ãï ^<+/ê-+Í£N¿Ç[«º\]ÄP‘¡›WÑ»bâÕ™ˆI¡ææÃ’L±ôNÇwPõ{d?-g&¾¨9M>N;v¸lö¯kvÚÃuÅ(ãwèËž»VBR‡ÊS¼“¸Òk’§çŸT4ZjyŸÔ2E+H‚R|‹$Q §£zx!ôÞ “Ÿ}ÅTæ;y«Ù–¤÷Ýk”bkeqÅ ¯ïä9wÐñZ¶›l c)Rçcò).¶Ü.]PÞ—v¶G¹:ÛrqŸÈêé–VÄyîAG®O¸;¦”&;íDƒH¬£„kÜ ÖUàcj¤a³`™Ìygà€p§.m%œ8ÍuÙ–k—]ž²·ßrìD)M@B¤²å–;PapÈyà…þ'à¥ü+N´J¾¥]U•xIe·Þ&èë¨Ä#D&ÙmsaÓd©kê¹0Zðg«L'lâñ¯¼¬…ËéÅ!¿ÜX-ºN.xªY'qŸ _‡ÍÐðu Í·¢_ð„5±À_I¦«^µÐÜÅ&v ‹JÍqV:>¿[®Î¼|‰0¯dô«\8tÖ.ò(>¨å7XÛ;¸9© ¢Û¦ˆÂëä¢[ÜXj#ûÃýÞ–{âx1Fg{‘-E$‚SõX1¾ŽE¥ò!Mª$=e””¨G€âÇ,}§Ýâu±© ªïEܼöؼÄ/’ñÄïæ8l+ŠV^@Uß/ÅYíü)ìñpf4ã!š…΢¡i ð-¸W‡×'8à%” ß×ŧ}`2ÛàÍÝÓð'ºßwX°Ž,Ó¼l€Ä°µõ5¼GÅîü5z¡¥ñ}šïðêéí%?u}†á6 [ï&ÙÝnggu$Jo‰2ìzI›9>÷>W¬âÜ’çûåœé¤ ¤¬T=^(ßa /H*îÏçc’Þþ÷Ù{Tì3ðq‹Ém •³ÅÌ2XŒ'–aÞ C÷9ˆ¢Jot’³¸hX^j>m+wŒ*æ\¾S¿+kþ¾(U”Áêò 'ÊÇ¢RËb¶1;ŃÆhz6o %þR’Ó3¬„Y /Ðì9K%|%EJ'Ý$ ZÏÍ0 _Ê‹ú“Â|&¯Ýö:ŸjŽhÐ^©©?ÈXª¥EXÝ»õnë6îÜ**Œw³q£Ö¾®ëˆdFñûuÐ'=|ªÓ¹ ¢Ægêgô<<(¦ø«8ewyj÷tÙÄåRæ¯`%pb¿¯YÉn&ç9ð]®Eþ3UwíEÒ(°E³‰O?ò²P+w}‡8ê‰EHïA+Vß²={pQ(„ ‰±¾"À˜qôM7«‡ÅõÉ>çꨣÄU¬ð3ŒsÓR¨œ&R^¸“¡gâ}Y{ UWà–[“¸²Î« ºÇ—#@C³ SÈž¨ò¨Qîfëìû¢¨x-?˜¶Ù](gHXP¶Ø‰’E¡'Ø×\??ÃtÎ Ö¹‰,ÎËm*²÷dGŠK ¯-]ÞaV¥›“>WjÒ*qb‚ÍÙ—Åõ²øZKQHÞ¨¤é—^6UúÆY#½:ÊÊÛ„k<64‡CœQ8x'ÚéLwß,N»†{Ê‹ÓiQ(_‹,æ) Øí~·±By°Dµy7!ât[GåUHe»Õد+:”cþòòƒ”RCoxRŒ6÷g`1‰B1ãÂ>×)­k kÅh+º±DœïóòˆùÍùx-É5S©'¨ëà­5`W°ô£¸ÜgÿE‘“/4öcq9£Ÿ¨È*&Lɱ;q³‡yuÐ%+Ñ{Éöú*—éOÐôýVزÐ;€)'ïÒœ”¿(Œ~Ü \HÑ-ø=2ªáïÁmû=—ýI˜Â«2Áðð7ñô{N»V3¶×ÙË†Ž­RÈN©gä¥ÃUœ"ŽÄÙ "Ø÷ž¥§ü,lxŽS©bs­a'‡¢•)î)j{ûU¦¸ï˵ÓÌ?Né1ßYýù%KK{Œ­†lš4œãÎ@¤adÄ"R˵Òv)¬)J…MÞ“â@ë½Z´‡oö`­×õobœ€ž>Å?¸Ö—ô¸Ý°Þ€ŽŠ²¼žéb@çVQe¥òDDöhOöÚê°*ÀŒaK»¼i¤§aàÈlL²š\aÛ°‰:ljÇÕë4ÁÌLƒ¨­1“;Ùfé Z ëôxæ >QßB Ì#aË%‰#rä𳼉…±Ká:âyHhÎΙàÞe°r©™ÔA|í'òŒÏò,ªà«“¼Îªü.Áô!‘}Zú3Pj9”ô¥4O”bØ¡¶Ä‰¾c6yaÞçÙa ßÒá|ï ªV¬ºõÈΉè=ÂàO®I2©îÁ’>Ð%g3×\ŠxéM4Øs»ŠZ„­YOH‘-ýtµîY¼;¯cLäÞ ¥G®ÁÕá­óKcÿÖ7eû¹±ÆÌ¾"nuæ,ÀÜ&ÇL¼ÎõP¬ŠÑá¸À?ÄH·éz_X)ª¹†6ÞÍÑ…"2r^î~RB74qŒñ\„Ì • Uém¨r¹MB&"öœZ\^ó¬"à ¤¤BN&„£:*¦\û)6Y=(S!iX†IŠÀŽ˜H[mK¢­RÇ ŒÉýu§ühàUìöHPàT „é½x4èú’‰©\¾ºÃ Ù]ä¤H^-¢ÓÚ;wÝ h¨óAbáíJÞÐVMûQ hÆ[QWºÙvcqRmNx`®²Ï$x]¡º ƒŠH¢:íÞ‘Jø—ÌKB®ÛÙ“ k¾OŠ»¢{§A7¼Ñ駉5¼ÒM8êx¥MΊDY‰V¿½ VÏ£:ôÅ@)ÀXó}„ 7g¨œè* CÔKŽÀÒøAšÖæÔ1ÞJ†•¼ëŽÃ3 DŸc9Ò2!uaˆ9U*U4+0,¯BÚêÂ>Ä­GL;.~žèF{É!ËÌ\Î9Œ”D‹õG¡t‚`79‘4µÌ½ÀZºwk“ Üe±œè…rª ·ŸfæbÚw j JcÏžfÏcv¿>õ=מ4šÖé›ÑðÒØ}ÒV94dR‰° ßãiÁÙ_/ø˜¨­,œó!gm&H*Ö02 zrv@¼Pæ€ì£„B»~BÚR HÍ$è‹%¦æî¨§×,f3GªT G9Á°ÕÅZFÉØž #ØòZpÏÜnP¼'YÕhM§‡.%ËVo´úÞ-X-ª"ý£uQLa}hnΰˆ®ÏG¡¾”Åù 6Ÿ« Êæôýì¦ïÉÓÖ¢WhG£Táž•R ¥¾Û@eå„Áâ—³÷6{µ«»>ÄN%«ÐîUΛɉÎј5ÀÂg“hßöþp™½•û&V ïAÎíÑjÕdÄ¿Oó×2-?§a}²Tï‹3)–x€ú\­.;U—õ•zýˆö3$Þuä_ä^Ñ,jÐûîp­Lž¢–´A¨àêñäËhD"¥¡æ-«2ÛA=0Åhìl÷×h¾C΃në0ȲºPR‘&:tÚ}L_ʼnݰï;Řÿ06<)ÈÌô8š½ðpE7½ä°0·óh‚v3äWµ#z‹GèšÂ>çååŠïšTß1’ #³G˜TæC§ƒæ‰[ Ó"«Á|\„öŸÜâ}^Ò1OR̵y²–©<ÙüY¿ ¢<³ëÜúƒ9^ÉSƒH=kà=Äóx5á½BÒ5öòžü-ÙÞ©GÌ¿àÍçÑ£zqY¿ mBßO‡‰ÛÅòx?ÇS ¶ ¬ôàp4m—‹¼Ý»Ø¬FVFòûÛátºxÙ_†_f‹±ðqY­GÛ—á“m…® H²ÎÇw_ðï:N öâ4pu7ÁgÕñ êÕýpëJÕ¡%'Sp¼ïþ°Zlæãíz˜<9ÚÞGR*ŒíK¬·4Wéi#Ü€Ú'hë™ñS¸ãsxÇÂÃèw྅÷üßw-Ü Ü ¸bê:[ùm{Þo mÇé¬Ð§hÛïÐûœ*Šs™ä¿˜!&Š{Áo ©ßÑïô„úÝo›že 4_£m±ŠgÃÉ|2°èqñ°I˜¿u >’­1Ñ€@Žm4&^nÖÚÔë¸ý-æÉB§‘XN‡FöLÇÈÔÈÍj¥rH,xe}½úbóL8äÇ÷ÃÍ´Öuh>ŽŸ'Ð÷áj5yNM×]Jˆ¡ é=Å×$$þ? TM‡Ý%`û¯&ó@ÈOý:8{ß3ê…Ÿ `*ÿ¹‰ûiW•°5EãÚçÃjLÆ0ËÅt2úb5i§åû<õ.ù®ÿøn!ÀAÔüsBÝ´|ÿ  WÕ'H+Iÿ>m›ÈZ¥Zl£é|a/½‡ƒ^Ë0ôB¤i³ÅÌ‹íÝjòð¸žÇ‰]*È#ÿEÅñdÖRÙo¡ÇrµDÝØW]ocPt¯¿˜”)–t¶Þè  ¯z6b;d¿¥]3_5¾icÝè˜ùت•Ÿ ’Èdx_g„AÔ†3K±ûí6–Ñ Jj‚µ7«åj’4>¶a¿€­²Y¯Õ*­ïµ Öñjúk¡ò (œß2˜—ájÖªò2OÖ–˜£Ål‰™?ìlõ†I®FãÕbfaýð 4ì“E…Þ-PIý}ž¬ÖÛ\÷aÀIt5hˆ´‚.Oæ‹Òc'‹éØšNîÌ"^IÃxñ2ß®'³x±Y['×Õ†‹Ñ“³©N»šûµÚÞMÊ,ïÈPhÐi3èëpÅIÔìHÝ4~‚Åa– q¼6~ÝZw¶—ÎzÅ¿Êëâ¹¥M•*æz9&%ÀŒ"QÉÈ Î©)´Žt‘Ýô0r–üÙâ–G ØÇc˜«†GÝë¸JÍ©£×ÖöZΤÌ`\.VÆz#g=tÌQ˜ÿõDuƒY“nzDîh—ó%ø2Éz1kv# ]±@®-ˆ¡Q=Õ6‹;{·EkQš˜¬Ù‹õzJÞ g¯ÁG¸ÂÈUþ¾áý=Zß_@_Ã@Ð1Z‚*~´6 ¦D<ùoµU7#¼¾ÿ7Zy‰Ñ°fïÖsä÷Fmê¾³4uÂèoT­wÛwÖ _Ö†åÎ~Öû˜Ì[{ýªw¿S[ôØÿ¡bFüÁ:<ÞoLël2w+u£‹ ´ 7ëÉtò—–œ_piàýÿh³Á­~ðßh­ÖJ舿ÛJƒ÷½vVv‹‰y‚EÈüAx»Â”纅k‚O>b²gZhä݆Â?ÛÛïú·+!ÂÒ[‹¶ï‡íä·4SD­&.v-çfð®ïe`*trQ` ƒKäˆe÷† VøvÝÓ½Õ'§JVÁ ¯ÕbÉíÞÐöª‚aq;hÿ“¶ÛÕQwàÿF•Æ üàwj‰A|6 éÞ‡Y cTT“Ùff{scý`8¬;î(˜¶Q‡˜Ê5‰×(œ‰Úw4šMÎÚu†™LãxÙ¶ÞGŽ Û@JÍrV6ë(:›(}×24˜Ñb1U"á¸pŽú_cLz휜`S舨 ·Áº?y¿¬Róé*¸5Ö«áǬN:ùf,b£‡¬ªô€)‹ee(>s:ý>jñ÷³—¹ö©SP˜\øŸ,¦—%çÖƒŽhwéñ‡=+¶±õ]0Ûå}ñ ßÑù‚w]Ìýy™vèuÿðÆéŽÛCؘ)…;r8S+âh… @÷(ÔõQóñ㜕»ô r<§6M¼•„Pj‚uµ[šKØ}‘V 1æpeóQ9ñø1™þ€XPŠcµY®ÑžW<\·KÎŒšXuõʼ‡hÇCèç¶È®“ÓëÜ}ÛŠCQZ´€ÖxåL‚h²€üê€0²äZ|ýZÑËJ~~QOQN€¥O6ŸC8 Mª—ü´ŒÍ©z¼VAV1ÏUb²æ&霾dâ‚”2²ïwàC×måö&–û¢‹‹ìxs,ôÆñr—í-4Ô—½U_¡³fâ(»*ÌwßWÅá€×íTê;ÙÏ@îÛäAð T¦ÌÃÛœò:^mmŽQ¢i:ìXœ’Èc€’<Áå› 8ñY1ܧçK3 NŸ!@Ê’Ru,\<šN‡óW´‚w;+‹Sq­pîÔ›o“òÌ7=ÌÍ$#4]ëöªæŠŸÊy»rU'ÅÝ!=}Ï.ê[ïõCÚñ§;JxÙ#/0]Þˆâú Ý khs"­<;0b Ó'U¡ñ)d³F ÌRN¬T˜”"‡–)cE§oq/ìm[óž$°õJO•9È­[²‡¶:ÉI>9à'å-°‘M‰ö:¡Ô|cp´Ó>)âËO™¿= /lRÜ7ÒSI£vR(‰W'ˆ·{bC¶£xPŒ)Ùk8&¶N0©ª+LœI—¨ê¹»ò–¬Dø“ù ŸË4³ä´Ûkƒ+ÆoÇÓšP,.߀ȭ iRÏ\}—8Ò„¢xa?Ò¨Žþ=¹B§åg¥Þµ¥‘Þ]ç¥}ïÓ®ô….VîÍGŸWqÁÜ{GS´qH@ý¾=Û´Æ*Lë¼0óªkø QÅ÷$ÅÊV$OÑúüñ俯g#"Ÿ9’ßF ¢Ú'ŒÌ )P;ÆvH-ôt&˜Ÿ~8ßGøñ5»Âø´ôã‰^kzõ»Œ*w —ª×ç;¹^`®^é…¶ŽÇÂu6¯~Íß*4÷Ê6 ×cbŸÙò]e¹ÈäIfrÿ6VÔêà0w÷Á †>vîÞ¦íuxõ:£…&7ž‘¶ÙÙ=|¦“?:Ú¯Š#§ón|m £µK|Íô’€ú©èž'Ô@º7‚‚H´†ï¼á£Sìtõ‚H ^g¦"¿Öô¸'¨_Êóé°6£b™£¨×ç­„hÝh5Zǯ—˜#Ý|wQá€GȹëüЀ%oÓ| ¿¢ø—Z'=^PÏ¿Á4¼2í ,æÔdA6Ñ÷ú[^Ñ[„øÒDØ€º‚ÄÇ`%„ï|G½f "Ý7¾C5æ6´íDÜBˆ÷³Uoû  ûDv Õ j½¿²²ÐO²é++Ö¸ÜsïÜéïöz}¡ŸÏ÷•NC¬³Ôç£/$ð¾r²^G ³V§¹· TÅ\©B—úäTU.^GdËuñ‘#TÎ"cd«>_A2Åì¦Šæ ¦v“£+YM=Yo4¨Åñ…›n¹2IR¬a!{û.í*S É4Ôèk³ÂG£¼Ìöù¥’ È½Ž”$À¨,Ô&#ƒ!Š4Íuæ'Àµ©¸Ž`‹SíMåEwœ6Îx=gÖJ%.3‹Ùò;B¡il✭!ùé»}…b 2CÈÞ@°¸*J~;ç‰9–À¦¾+jä ÊíPÙlO8 ˜+ˆ1Í~d»vŠÙžím·kú‚3˜ÏëñÆlH BÀöéêL½’Îë“-ߎhÂðFñÔU-·B˜óìòÔÑ'«°XµZÁ;Ó¨Zv™ “6êxõ:7‘bç×ãºÌ1ìrÕ/a©*»üöä+†9ì,Vdý0ƨṀʅÅcÊ“ky.s\‡Å}FdO¶T~ÕËÜæ”ÿëšqšxuÉPŒU弯ÈðÔZ\kèHµ¤¸ŽRåB*`[{!g'iÀdk‘\û <ò7•Æw9eÕBxx ø}u»B?RCÓ˪ÎO!Z)^aÈHÆÄPLzª‡åkn®½ï¤Xs¨Ž©ÓB_2&å¿@O¸C 0ËŽ ’òˆÔdÑ÷9˜ëɼÌÚu¸Í’d ÖcûŒƒkpñ¦·‚(+ÃMöodDÚŸ§ŸÐ Ü!ôi D¾ä"ì]Ɇ-Èš$÷úN/·¤@ÒÍ…92 ×q€µK€ïE­ —ÿÅroµk;V‰‚,˜h§U¯ü`â¤êÈ܇¼»RŽ’ã¨x´¤}À^_.% mñÜ^Ç|hP·®È†‚ßÖé9ûD¥K¤½­~„Ð(êwéBreºht{§8ù!ÀÖ–ÃTeõΈPàù¶úah5,ã”ûB‡<™ô:oÅXlFné¿÷B1ìOñœŒÝqñ‘*±Õó%?š¸½a,˜ëùüZó™¥.zIË£Z±'yÂv¡òå¾°Åb´˜bàQ'×Á½àZ‰ Zs—ÞæFhG B—ß>*LŸî‚„¥‚ “JIb"é³+Œ}úGe¿åý0ÎeÍs`éú¨Þ[Ñ’Ð7’ËÈ-A@ÐR™Tf’|ÿcsÉÏY ê Ÿ–g›¼/vœŠgëƒâ»ãÀNDFøê?ÌCmûÉiý-[¦c"ƨçTÄd‡ÍëÌÒÿ*Jñºv‡N´=«ïñËÖ&)WϾXRÚÂU–ÒÓÛa­¢ tÙBÛis}mÏìÓÔñ ÏÅkœO÷ÝŸP`+£C–ž®gÓ­Z¢¼¨ìWÈÞçRëʪbËIµây¦Þr4] C"„Ò¯˜brjÅËôb¨Ä¾ Cr˜íëÑ6ÍrzÂGµÔ÷Éh=µ¥zÄù¤"¨§×%„´@ä0;´â„Ö¹Ø$]èókaR¶››¢JõiP§¼`:Z! Oé‘D­Å’àýzó°.·ô¢ÓCÎμµ—ËO ê´lÎyžžf*-6¡TþkkBÁç‰É¶zš-OKÖc¡œ¬øÏàÅÙ¢‰G%zRo4àÞ6aÔXÐúiÕŽÓiÑV5Gq4‚éU­/[t ®{¶å—)€sIß&¼Ù”Ÿ&ã  '¿ÌêªH& ¹†ÓÔ‘_î|t&o~Šäo78ÍžKÉ/jóÜe´Èû%šù¬Ù»3ÔûÈÔ÷[qhCl1.gÇ·q•ºþg@fò Hú8Ûd|åF´\TÚÚÒcx}ÎAF(zž¬üD!4:|»ÏWøÉ§t ­ÁâýèwëðgzETÁ_ßèù¿S>@Þ\ÞUJŸµì¨%jrž)½.ßù2Y>f™"¶ ‚ŽZ„yS6Ò½ ¡VHIƒ»fCAô ŠÚ j}fêP¼\–möÖÒ¢P„-^e-½|¢NDQôC6Ò ÛËEgB¯BŸðÚ?rtx•!Ü„=æÎ€Âà}®Wk+ .[ñ¼ör1¢ h…ØOÐÞy½\ŒÈ¯}e½;0 &w„¶ÿ›û! T<­Á$_¿³\ûÖGëgÃùð!^á…½ípü<œðüz8™šC÷¬]/G;Â~DtÝctÆÐËžT I¿ã#µúµŸ"’Q“·SQf›cüŽz›öBC›oâÐT(Ìô=ÆãÑ¡8í2óöðŠÛ†´Ç¸ü²û&z¡s R7aü?òâZ>¤ÿcí2$?™·êõ^jE_ Z0³ &H™Çx‘•‹{¢[£áè1ž=¬œÖÉúòñp3ž,dq—yW§~q EÝ{·Ù®ø,fåÂËåNUîõÈíqÔg‚Œóû‰SJO¨Òçx…IÆœñˆSJUÙ€˜‹1P;IjжɽäDŠÖÇ÷«‡É½;Ïb.Ç÷‰[ÆšMg§‘}ꉯΆc¼ˆ,çPvjÖ¤IO°Ô]¸e(Kâ^ãåaG¶|™¯zˆùWYpâ?ñª™Û»¥ûmJDó5œM\ !Œ¾Œè|E b6tמГ9數ÌiNuÑü{à²K_°Û$Ö4mÈ6ðöén¬S$ÊÙ åçÛ]¡Zž’x4»ŒÊ=CS\vJ0Åtì]°Ò4©u' E=PW³…;¥ÂðØN7Ãûgw©äÂÙè±&w¢³³Ù¨FCñÙ™;Á"Йý¡¿ ¼N?!q*%Pcùß]º¼ Î’qât+“>‡õÄs&0°tá6±¶óõ½K]ÑùzQ_µ!OóçQS- Z,Gw"Yê®R¢b¼ºŸNî\fâïB—p3Kò“ç–º·-Wñ}¼#Èe 1÷ËÕd¾N–‹Å´¦(déZ¾Ó ÑHò»r"H¾ŠÇw‹Emùç.®–#hÿÏ/®‰Ç\%° ­k6Ñj=ÅÃ1ŽÁ•:%úÙ# ï–~}­Œ„’JF£éDí$JžŠDyÓÊŽ8–O0Aý]·–rÑF¼Â¼¤Î'Ä*Å“áÔ-õe)j•ØU+ž(_o\“Ñ—_v-Ñì£kô‡r<®€ö„œ$µ©è mŸ€½T—±à%5KN YNF®ŸI ¬«¶)% Ó,wÛÀd îyNùs²tÅ@Ðñyôˆ©KóCìO—`’(:9„ü¬ 'h;Wéˆõ{ .Û2tçÈsKþȪÀ3ÉêÙU¢®¹Åªf÷=×KwY¤£U©ëÖ ¥¶þóÞõ­¸ÕÍØUà‘P%›ÇÑØU#ÜáÍ|‚Ù7\ ËÆ&¹Ã tu€/ŠãÕÃxâ® Üáçqr7t-1Ñ6”Ž¿Ì]› ïµr·Ô“¥ÓzÝH–bŽ"×)óe±Û+QdSc8Z_´ŒV]Ͳ „06¬¾@hçD ¹æö…‘ƒp—ñK×WyeÞãš/µyfÎËØõ^Åp^ÀÀw§OT›ÌqgŠU K|p6Q‰…ÉâÚòÈÒÅ‹ëtô _’Å艦8.0óÏŸÉð¹æQûê†S¶ÇC¢¯×7 õy\Žñž3Ët¨Ï¾áu¿¨‡ùÊ«}·ƒ/æz-8~‹Ïã÷R!ž7ÂS³$¡ð¬7`JÍ Ýp+q–ˆÂr|z.>á]oŽlúDDƒbb<ËX³“ø£ ]O0>Έ՚ŠE'|²ž¬;Eqö³}Fùni‰=Þ¦ÛŸõŽ­m“Âo×cuz6/úÈài_ZÏ‹ŸO Ź˜ˆÊð¬UÏxÊwªÞ§ó™<ã*æZ£©ä@§|ñód¾ æá3&½¨³›•e Ñù$KËÝ·á~S¯’Ÿè3@ªý‡YþX R%°YZŠx^Ïk4Â{š÷¥>¤Úa»Ý€jW 0\ï<6ò˜_øä^'q$Jƒ;ônÀ*Ë™Q½?˯'~ì,ì SÇôÆvc\ÜiõÂÚ!?Ûç½Âþ@ðƒ-å1•©×^.E—ˆ{cj¢‚_Ö¯£ÛlÁyF+äd8O™~ìŠR¸ÖÇqMÃý]«‹9Ý·ë;´V©°æ´„Î#ÕKìsŠ˜AÆ-=×ÕfÁ×<³©rø!ë›â@`Xœ‹Êž»uŽ‡Š§Ý¸Æ-dÜDZµÑ‹8úN¨U–V|¸¾Þ*Í > ©^»ÛoË¬Ì ;(ŽfãSzÌwK`°×uÙä|¶o°«ô´•’é=(Û¦x¶ aAèÂöªô/÷Yz1Oíª<ÄÝYüží®—ls¬ômi›À˜ÆÖ½Ë93Is¦²´¨«{ßi™Œ<#¨C<õ°ÏÕiG|°ñûm?ÂS¯î¡UõãԸƙg¶Ã»DwezÚ}+Ú&‡ ‘i•Oª Ìs ãwAWÌA Yúž¯Gùx¼/Ÿ²!„+a×4›å§¶FØTW—OxC(ä{Mºhœó£ÚX±Ã̓{šF!:º°Ñ3ºQßD¨Ió,­º]k“As²r‚ZÌñ½Hsû^eµjÂèæ~ˆ©Iå«ìGn/ÌâyÞVi^eÈ5´ÿkSií¦xˆä»D :°#™Kü:]2ä-\ò-Ý? š—™l Ì :)Ûi¡ ¸…›æQ‡©R‡‘F|Öµª¨!böçÿÄ'D Ñ“¢”™ïÁ‚VXåôÇéµ¾ÜÒ @ï6F´Ågt3­‡@mò9 Ôý ù‰›öf[¿2z—×uõüh}‘ê ÄŒá3å51å XUl“Pð êu%¨T«¥VGG00¨U£`Uê7ÝscˆÉÜ»O¬€EŽ8~ æIIÁð¼kòߨõ¨‚÷ b Fà²8ãK½ ®pÔs~öªõRü Ûà'Ð{<Å`šä}š8Ñ(¿ÆÓ^eÕõH ê"ï@Ù¬ ’šºx‘ßãÓSçaRýŽ®|4X‹E§¥oŠ"â;¸~Óå¥C™É1'дԩ›A-ž£¢,¯ç‹É†'º Å *ù{fè±ßRVϼd(›0uÞô béÂÒÕâ=‰‹ NyšغvæhÈïÂËru{Rùå¶¾C.{•ÇÞj/u/úD.M,3©Ù\ˆÞ1´MåÃWõV¶V˜Ú¤t’t¹S¹¶¸ÕrÌV@¥J…6DíP}+8$¹‚ù°|»ʼn± ï³ºÌïÒ²„ÎâÝok“ðähr“rŸì/F¢z AÉðr;Ö.ßÙ .¸@øróx«áRuÚÖå« Ä õp€Iyb0‹Œ?OŽ××¼[–ðñ¨s0QÙ´ìhŒ2S•꿤dz¾.ɯ 7íKÌÃÞ—ù°í¹€§,;0ÚÑÇŽÖ8ÞBÉGE ~ýN½Ÿ 뛹o®®åv“â*h²öÄ—Î×ÉުؠË釠H§¥šÐñ9›IÏ Ò§ùJ2HÐËÏfƒ]ÿÊm$>WcªÀeRôúç5=]Ôm,mÚl¼¹.¯™¹ ‰œè¥Šš*§²" ?Û³:ªI@e‰µü¤ÂÁ ÓßÂëìù«•yË„@S̆÷Mqû0å|,Ž"0ôÎ$ VòÊ4¶®"ÙÖì£rì=¿/³ì߯µsôgd± 4\Èxª•Qä ØŠ-åJU Ok HމZÐ\—¹=щÓJ>NþøÓ1Ù až.“ƱÏÝšì³ôt²§8•‡q)Øç:“¯‘:ö­rN\Ž”ïèuÄí*ÓDÕ~YÄѶœd/öT®˜ã b}u;Hýƒ¢eòÐÛÕ”À6*ò!¼›µ9Ó¨é÷ÝšÈÆ”tTçýôyë9g?û¾,Ž(Ãäo÷¤ÛáO訄+9|ü#Ÿ]Ê’ÒÏv9i8—žR–G,E'Îjz\ YyÚR±Änƒ)}×!çoù× íŒpóÙ®ùP[>ŸM„VãÝ™|žý9€^¹l+cb¿y?,Ÿó;> [IMÉ–ÜH6®õ<ûªØÈœ™»^0è{må4u½ ]…5Þ3:‡Ö¨ŸQˆU‰¼Z%§ùõ˜ºq¤PvÓ(– <\]9Ä…úêV0ɑ͘‚±b–pQÁöS›‚¡?è±ážË,Ö]iö.΋Sv÷qɬãF¾‹ó²Ì¾f¸øø6¼Ú¡²éÒº]>f+ Ú¢ý8´†¼(¼%ôAm….*—½êD¢WëŸE½×bý3f!Û^O\hÌu8ß©.Ö,ú°Ã“þà!9´2GÙ’¹ÙT $únm•B }Ë!(0kr3w[Z”Öéq±šùÉ)ù™žk2¡@ «¯ äUðš ƒ%YF-Dõ×K[Wx'^–I_è*öap?i]èx¨IÇ™ÌDö%QGƒ×…ªÛ¬#<ÕÜ$e£d©å³)I5–¹ §±–CC)b gä´iðÀ#²2P;ÐN·~ê^_õÝ&æ%|eI-¢;³dkâ̧åcÍ ¥M`IE l%OßN…JP^¯AÂs»†y¨÷þ!k#’ t»¶Úmh­k'‹ëZc¬ÑÉ ñ›˜®6´–Ïô˜n/9šèÕv˜©(gí3Ž C1sø¬f‘ÔñœzMÚ}–Ze_ÑžU_Øo&üº§þP(øÑº›XÜó[‹iW%â¤-"?`Ìl %Ã]¦mxýRî€\ÒYú–ïð•ÏÈ É7—ˆBâ,TÐE¡ ÌÒÜ©Cv¡ìËtÎQ§;svEú>Ó"ötxËLJg".XÚ8¶ßÐ]ÓY®×/|( €°x(™ÒÌì&˜g743ÀH(z§×ô Œ¸BÛPN×ÜffÃAT÷{ìÔCñ›z漣Π>4&¿Œ¢–3£qU1Û)¾»Vº^WBð Äv ”HsMÜtõN35틈fÌ®Ûòë Võky.ªÌœÎêGœ¡€?Òü€ªJiNñ˜Aà‰‘[¿B>æoßsì ¦g¾ <-~J,qW~—š{d`a 0òÚËU|O7ÂþÜ,ׯ˜¤ª×“?³àè iŸÀ¼3ëbûfƾæ°Q\p;âBÕ‹ ¢• ÍXuìmdäpÛà@K„Á4W~ÅÁЧ+h©6S0Õ9™*^Äé5¡üæGÞêw8³¬që唳ҾeF‡®±¸kšÝE•H Þ ø!pD]ñ´‰ZÔ+›ýÏð2+nzí*Þç&Œ£ó˜ŸGàÐçx’EâÁ„ç0n É9zD°¦,‹³‰ ªR¦ÞqA·U½”Ý]mÂmÔ€Ì!øXÀR=tåecèLG{²Ë|=`é!ýÐ_³‰Öô‘’¾ƒPg)1Öm› Si ]²§)·Ï;ù³ÜPÛQ‡–™/ôn"~†ÆKû¦°¢t XÊD_Ç~ê®'$–Š€6xÃ*ØìÑh™Ì/92»~>åj¿<è„n)Ðwïó²ºp6¬˜Mì0:s¥DZÙ”Ò ›àe S¬[Þó,ÑΛbÈ­zË´(‡³õEûîjMéû­h¤Û̳ª†zÝOê%.<§›`†Åý,dg̸”–V …”";–r»(r~ ]œ€Âëû¤ŸH„µ™ö} DgýÇHŸ_HHË#„:àFÓC²+•ÛÓÁë®7BØúÌÑ p‚‹¨z¨¹àôX€`‚eQœyÞ-X=ž)è‡Ð¶æ8‹ Óˆº½gXÙ×äh. l9=ÏD­õi3$p‡eËßykžÛ7/‚Ú„Ê tÄò¨øÃoFa™3E¨ˆm!kQ¨O#aq§­.ö0ònB¸Ï‰“@Lº¼ÒNN2Z§D™’Ðƨ1), ûµídÛŠïÕA_ñ€(›î´ ÓÂd-K9D’“f\,‡>K‘9pd2£ãuZUÅ"æ¢ôñ~ ¼Zk:w¡Wq©áÁѨÀäÔú™Mg46Ÿ'Hƒ¾ž˜Op 7pËŸSµhÑÍ¥DZ!•5vÙàPŨò­}‰"ÏšÊYL|áˆAñ--/¼¹ª¡ä;òs­ Y’FK‘ü&=4èxšÚ`¥æ€*Úªpl„® ®f-ôBèUKq F)æJ®`Xf{¶æ{µöp Ò:F–ï‚~†'Œ0Á÷w×R¼ªzç1Lhá4–ÜÙþPiɵgL#Ÿí†YŽâÂl„Z¿½Tœ-±VO°>ÂTTÆðÅr]n]ÇÊX €LâŽXvu,/ήhÝÈ¿Z|† PRkéy²‰²öPq‰9”ŠÄ%<>ÅÀ90ž# ¯íPÇ)VN >±Å.îÑ¢¢uŽ£àAQÑyABjƒåâûÅ*Ó 2&DÙ>{(Óó7KI– }6@fÒV€®¨Ëòì¬3ÂHt4É‚+,£ð˜[ò »H„r& #¤¤¤DâB¬¶EÉ@Ë…D>§NçûííYõLr1Eu¤æÚ #B+vŽUX#ÝYF¶¿E¨—hUÖïs¶b¬—.´–/¾.N¬Å˜©o’µk4`.eú>ÏÉgdÒB_Ü$tÂEη}©3Ù¥'!^|èÛ…È ‰ê}n¨n ñäɸž Ga¼”gÎNb1Ù<ûÉž‡Œl™}þKæMbÎ]€°vÅf‚Y¾&)S©ÇÏ|ØbuÞÆyK½Þ@ݲ ¢örǬ [0•-í5¾ Œ ²¥x†ƒ :‘ † Gû,ŠÞÕ)„v…z{õR‰cãÂù_gdz³Êò°;@‹7níþ´K|(Ì'ÑïzОB™G“Bx b-V…¸Z_)E€òøú¡Þ(‡uGÝéc óïºÌ® Û ²Ãv¾¤Ã/¶FƧÊ-HÎ| Z¦Uµ.†öª£çË‘æG²%Ðÿ85_¾ááSÜ7ÃXq=Ä"éé€ÁYm`;{=¡·ê*=?d☉ÁÕg ¯ˆ ÚÍéªvöšæs¿ï€ðôºU+d…ÚMf¶¿ìMM¼4ªoH°y/ô,ó¤RcrÉí »¤ ën¿ãßh¼„®Öj!\Áœ•#¡&8ÚžCK"ãøÒ2Q)ïQq|ÍOzëSFtÌCzvÎ’xb+DVÙ×Ú„‹Í4=NYjÏ¡Db(žEø†[μ›ÐáIœ}·áŽ`\ÅÙ´3w\h?'úrx±(T^Š@âk[¾Ú™ÍRwÃßç=¸cǛ娫| sk3 ¹³c·µœú{ ƒ;|·I;¥&1¥±°ªèH{ßæ ^Ÿ’'(©:66ÊÕjÎÅövú¼&LhÖpÇÄ—Êôí(÷[0K:eAÖ­G¨ H÷ùr&azºÄïs¨µ+Ý34Ú°XÅ[ÎØØX×§ Ôx6Aóz¼Ka]\—HIX@¾š:j·ÈºNü†r)]õšœ²´ÅqZŸ™†wZ õÒ\ú.~žèÑ)|ˆ$ú ½9;Xê¶=_‚kžÔ*tgÊ…ØkâÝžðØÔCö0«HF}]¹JÕwó9Þ;ä î+Zfå>HqZ¾þ¸´!¾ÒÈóÑÅ5¢ÚÝ (…ª¹Ñrî÷馯ÆUæ=’<Å–,jó“¿Äl d§¢ï0íË ¹+j·—Ÿc8¸Ô¤ÖÀIøä¸¾¡û##-Ä_T{f:æogŒEãö“¨RO'£®áè$K÷·Ž1F‘w™ñìÄÛ‰àAÅïg4Œœ›ÆBã©Ã&µóÖ g[-%L`ö± QÝ}Ëšpº¸à:;>¦‡¯zzI¯Ò` ÍóØ8ÖÔ=¡ú&G0¼²*±RI¼™|ž6„°‚söÆbhÙ;òéŒzÆAQ}ðPÍ{Þ!ºGsˆÁ.#âÛk21Ë0;¾Gq,Â]”„S ŽeX–é‡Ò' ÚÇ€3ê®p¡ìQ‰Í&á‹w‰±´%ewï(÷óù˜­²®˜&¼rq± VšµÝ|3ãK 7`îÍ!fßV°=4¯B™AêÚ=kb…àH¯ê½(¼-‘ži‹=Ûsj´ØCî‡*E®P“?e›I,0:æD™UÕ#Ù£œW!?Û¹>d•˜vž°ˆÍÒï*”LW}ÔNÖñX^ßr Ýê†çÅÅÉgËÄ|KºŸb»ʒ9ë£Eà@ôÕiðKy4>Ò:›œðªA§ÉìR¤Eó;Û³3MÙ‰Ð'æi™aRe6Šhz¢Â´1hî~¡æsz²Ãp¤M^ÚÞ%F²»²óB/7îJŸGÏŽr—W#§AÅnyaéJ¢ ”ž‰Út:A£âVkíË‚¸ÅL‰EBx!“³#–L!ŸQ«ùzdñ•v¨-½;âC Œ ŸÚ3¡÷  ³"˜…Ä‚µã\bè4AB\9½Á§ÌY°…JX¦_þÃц,¦fpN‰CÊ 55Έ½‰€àiGĺ°'„°nÇ©ý fé>Õ". Ÿ { œrJîÒëEΧÔd²i€Ç€Zb³m#!Ë:zˆ±¿–Ê/ÆMêºuÍ,YÄüÁeŽŠ& rÒ·ýfýv#®Â¯d…ôxßîhçÞcÉ9…Q´<@ÃdÛ‘´D7”¦clU€çU§l¿~¥Å’[P„ßg"ªã7 XŽèGÔžµNùjƒ»BA Œ-õ‰ çàíÂú‰Á4ª.z?§å‡8M/%£k”–IøTdoÐD0guùÙQ(+[ÈË!î¯|1ÍÁz!T‡1ë¡•…©Ž\à ™íwÃÂNŸ²Î¹L–ÅϲÚÁUÁSu¸{²DYgm‘‚®°$Wűͷg€VA0ŠÌ"åïêÔ0*a¹¡¤­à‘Îc±–;ob܌Մ¬Ìýw¼¤Ò¯#tðÄžb5bÁ1K¦â†ÒwhÀÛÚ‚!øÆÚÑì'ÒAȨV€š@ØÔX‰ ÂHÉ(½V|Æ«·ãö!=1n4’>'|&˜Voj²0¨“p¡[Šæªê+ùúÂI¾["b)¼•…E?a…ÄÀå!=Ó=VÄÜY|½m¨ ­¦¡í8q§‰“ÆœÐAÉ1=\s_0K}•6-½:µ!oW7Åè"Y/j6ÈUö_"6–ž­u†1•(™‡¯·6Ù€“»‘ ½ƒ›P«oˆ­hOŽŽ]$5Åæ®–VwåÈU5×=¬}Ã9í¬› ]úL´ñ„eC»„•ídoP亂¤Tð®ÎR`î“R/çc/}6•Mp6)‡<ª ˆ =ÚínX—)òØdÊP`Ñ®#œÃ€ðÏð’É›°|™Þ€¤œýóZØX@ ‚¶´cØõý¨Òד„¹¤tºc0ëém|×í¥ËZt”" ZPÌ;´yÉ®AíJ;Æ43 í`R×eåS•gæ©_²0ûn¹Üç?ÒK& ¿—qZ•:0Ö­0ö&:"¶ìF(„à~_=ļ`öMèí¥§ëÙáëµ£TÚz´k訟׊á >{t¬o@ ”pM€×¬.‹ê-[hwtl¼Ìûæ[“á9Ý7|-\˜Ñìn¨ ›¡nâþªÒz4«Óçä,m eQÚ¡¬&Ò.çªÅÖ¯ÚDñº)ofRœ™cHâB½ÎÒSúæÄS<ÊT"€÷ÈåYqëq×^ªÍöŒï¾P‘Ý#d¯j ´8–¶…á®0F_©ºË/êNKs{Éi1P‡ï û|᪒ á~ ŸÏð97”óy;øúò®Rüº×d9OÒìå„gÙ¥œ¦ú½ñôBÈ›xïàÔðž õÌøÓxØ£ÞvŸmÿw ¼K«‡§üT·Ûw;äwŠ”’j‰dñìz¸äçCÖ8€ÖëZí8Ï.n‡¶xÄʽøž›ËM ”ÌU›SŽ/+aì²ÜiBi7ƒ¨C„p ›s çÑ5À A„¢š±«¬)^¦%#èØD(>e_O+›ÆŒSmplêܸîΑçn¯7 ã$5×ã@yD‹”ãÉK4nMìŠûdyÕŠyÐàáJ f3RÒ†.Éïbkqcx#)D°٫$¡>re`=R0†¼Ùy° ±Tù‚Wu§IêŠ ²pìN=ŸNiýüèB’<\ kå YeoO™3‹b ]9ëJÌ?(U_5ÏÝ#ù­ÅµOÖ6½[8AÜG~ÙObô4 ”xm(·.iC ªA¬S!ÍKWGá0â¨ÖXnâ?s¼‡shKðÔ%ÔÁÜHñäbÍ“Ôñ&äåîšöœB©Og§LÑ4}5%äsIünÊXþt¸W‰Ž—‡Cñ :Úæ‘Æ(*U4›ûÆ‚A³™- ÐZdSÝFòVà;Ö}¾·V†çqšÖ¹Ég)=‘ø}~yþ¶Ç,øˆ3.Ì/ûáëë7ƒ*“+™ŒUªËÜëV€bSH l ¬´._+ýâÜ ¢\$]´±x5ÎB†™™ÌaPu1²¤‚Îsi“TúÝ>-Z‹×³Þ³2VåèPTh€ØÐ¢Ä]÷ù=j«ä9äÃ`G!a:rß °ÚdxjR¹?ìM`òС2-ëlÃÅ÷C{–¿½Ç´i0ý1ý->åÉå žøË/,¼ÒZåNª†¡%í%tÙ/Çr»ÆÕ.ðœ0¤½êztÊQE¥¿U©8jBJV…šf¿kXX!;Ü* ÝÐe”NèOL½©ý˜žö‡Lp…'Øê<A”¨ø ÍL_A¤¾˜péEªëE¢ ;o$º1¹à_ –=£îÈí^òèEr€èƆ?V/·Ó?ÓÌÉz22Õz·zåT[,ãÕ©=œÚz–kõ^†_ð1zƒ"»ÓEÝm&Óñ|±žÜ™NCä.IŸ‚·ñ|l+D­}×dÜ./ñ f韛˜>AÁìZé"¹Q!hæh–IžZºÝ.1ãûê9^/l£akî§›äq8.‡qb…0ø5TÊl;-üy1ÝÌ-‰á}Ò<ãI¼öæV ©ï7S+î'Úç²¥¦Ž“»x5GAD ½I,džÁM´BZZÞX"ÓHAßn:@*—«JÎbµ]?®ë5ÔnJv»Ô}ÒDs Û%q²øD9vº¿[‡ˆMöU­Êjy?™O’GCå°S&¾ï“[ß@½ A¬æ×ÎH€3Ò2ýs3±†„ßïþ¾Š§ñ0!xûž€{âé´÷êË„´¹•º`ÜZ#Y¯H½Vàr˜$Ÿí#¨×k±ÚDz„Æ“i/·jí†å‚•|«×å‹5œPÏáQÕ*È™î nÃ.‘5*jgŽå*Ö#%oz7=¹*ªÛ®,[kSwÛÕ6U’Dó­VnÑ*~»(^iÉQ¶¡U÷íão€Þ.—¤ ºþm\+.˜ÛΈIð¹!Ñþ·–kBÜøN¼ng;wæŽ$ïµ[®Éô:lu,æ©ÁÔìÀê:¼VWlW³ÄoÔ\Óšé‡7$Å~»zN6 ~÷ñzôèZœíŠØA3çµ›EÆÐ®°"×ÿÎrD¿}Õ@!ÈýÔ'°ú賆 _Úv½à×XâaÏû °´9;á¯+ÈQ¶[éëÇx5ƒÕõ¯ÅÑ \ KIŇí\±žÌÑ0v”ŽkW]ývÝШìVjWBõJÀj£'·*íú¼êf9f1í·+JÖßXÛÎÑ ÝóÂUú~±2öIÍXì´sbK6.Úùñe2Ÿ‚ïŠÝvA`YÈÚ{ÿW¼Z(³ï~R3ú½vV¯À¨óhr7Úïx¿ƒg²Ôˆ÷<Ç+»¸ç,gªü,8Xé–NƒO[Øx1Næ[ÔK-AN¥oññŸËx"²všNÖ_ ŽÂV§Läáh´ØÌш«1+E-|9\=IcÍ·€n!;¨LnIE¾'ÒŠ³Ô (JM02§oŽœ„ÿ×U¶`ö®'¬98ç—¨,f‹³ÜÚòU ƒ7ÈJÇ`,Î*¬æÄúµînæ š‚ó£†lA! 9Z'Ôupv¨(©ZŸðøO*¿ô›-4Óé¶23Jˆ–^Já–Zz)y†ñ[ðrî ½G‹9ØC´‰dWM$XNÓÉèK³Ý>Lj‘`ÁAsùQ[—a‡£úåœ;¦­Äºd®OCIDÔ%ËËÿGÚ»÷¶${ Ÿeq'™Å  ^`€•%9Ö‰di%9É,²DÛ<‘D®(Åöþq?ûíª®ê®")ÏîÞìNî_?Øêªêz9áŽkm£¬Ÿ¬B:ðbðæÙå{zx¤°&K|)étZÞc¨Œ$·„jw?› .Êkæ“|lùzØ<³YpÔ ‚wFr|€,OVm_“š'¦Øaæ`—d·çžÌ®v¢v£xÅèƒ,{¢À>‹bPÆ;¦ìayèçùd}6_±Ü$‡õ1ÍàUÁ=bwÚ‘Ðã8W\FvDÃöÁ™“añëCÏzÀü<Å£ÃßOb²ˆÂLTþ£-h–'‡/Ùî¼OŠ˜­åXnM³œqí@ãx\Óä´Þ®OkÙª|í›vû¬&«B7Šæ¦ý[$€õÚûKÄ?Ámñ⺴å,™Ch#Zùص¸,î+Vr·ô¼SÑ<åö=½eš»9@:^áË¿uºMØØ—úÌ«]ŸQ‹]’f)ºC˜ Ò§y%Z:LÌÚoÁcs‘ìð8¾ÁŒ¤£ÃczHD™—f0)ÁÙqK)q†ÌQuG¹äs܆£±)¸['[´¶Ù¨èd£±žã¦8c+%\‚(ü; •R¸¾NØrg%ð2Ù¯ó§Ìæh@\TÂÙÅòi”ÖóL+aT~ÓPþU˜›¼Ph.4¬¼ß€òëšjMª¨Ò—dÇQiàÚmÃÝi‘®ÖGŸpÇ̹ßv»óã|·~µ¶1Ga@ÙðBûaŽ þ¬B)fDЫÚèÓr˜º:¾ôˆö2Ö^¬-HÑ!ïæþ˜å¸Wéþó³~È¡ïR©›Sz.ःQÇæ€®½§ ~H]„P LDµëPb±üKØ!§¼TœÙÜ€ô·Án]v1ø 9â^Skt8ï5ºýF%dpI™K# ýÒ+2†Ì0„Ñ›š%‰$,1Mo);›´ÛêçoÀ P7yÞÿ ¡08ë—îc¼Á»Íçó6;¥¯®ßžO£P‹ózYÊálÓ1Æ‹&zëUÑŒƒ…IìGH£  ö§÷¶Á÷øn-Bi”0œÝ"íñ‚t¸ü †ìäÉñô*ˆR§Sž·‡t÷xü­‡‰½‰sIaŸ‰¹&9+6ŒLN’ ˜$oÜôô:Þòžj5KXo!ò废÷ù—ä”%[»y 7c~ðbu|¬I^Ÿzœœ­fP‡ ¨„îú©ixzÖ‡Iìg\^ÜOàtóJµ›â›ožé²¨lÑ@l,L7ÕïB³ûΟÅ'Ê£®{vÛ´ˆ%ÆÌ犼iÙÌGzN¡ áÀ |;œÅ‘w—÷×îÈWh滵Hbcü²¨/—wSž§jEÛ~Ò¾X¬®L ”Aì8[ãÆìJtît®Ù®¬² rÜ!ðíØ,Ù¶çÊ:7ÄW`,o¾F³·ÙAº½ÂðÄúÝí§l'>f¾³-¶ Ø‘³î”0Re`¸INeŽ!ïÚ*¸Åùp C,h‰½ˆ â«Y×Åú™ì…ä=%Èûì(Ä Ý:Š Kfµ¼ê%ƒ€²æËÌ5t”A) ÇßjòÄfÚŽ,´šîÛÌ“|l¤çšÕQs­u•úÐ]ž×ì&½Š%©‡‘ :s2Ù¼ž`™ìE¥¡à×á. U¦‘†Z¹ÊÌ90ûðú˜í±ÓYâW2[•}… Ll„DÞßÎÌt®:ÖŒ´ëµ÷¥rïÕ e7éÉ:ñXÅBàKÐõVµÝnו:F†5ƒ7ab$Þ¢FAYòÇÆ¢:„l£%¾æ ZR‰!Ïrî¦!’P»0ë#O]á厀)ßîÓÃlG_©Ô+ºMé.ß và„ )Áíw=ñ¶€ifnÀìXÅuÂ:piÉQâBÝaà.7ÈÓÍÔÅÿ Õ<¯ÑrÜ~!Êdò Î8^Êö8뉒°}‡ùF˜j6½aùÛ¥>'Ù£s  1eXÌiu«¿™VqtSaÙ8E¬²«…¬Q#¬Vàð>ÿ%u a¥„8¥§3ÆÆ8q,D8Eb_ßüìŸO™ ü×qLrlžJ×Qè¶ÂÚþ˜E]1;H 6ë9טÑ÷jJÝ Õl’“k™œ ?œ‹{rë.5c|8BJçcÎ4©®LŒ1sèÊExm€¨ĉã"BU:›'‡­›û(ÇÔ´zê2ðæš#• ”x"ÓG“J4]ÖÝV2äŠ9h5ë˽W,>ªA Rª^ì|/>Ó‰-ÿ çd›=RJ’”üùàRgÙKº\}Ι¦÷N׸³´«€ñáz—>>40¨åÔ×õ$.‹n3¬é‰Ö^vÔì4«8Òf¸Ë¾Ù®éM©Óa¶½¼ßfSS0>äç“x"Q ò­Uò3w'n[ Éëˆ1Šœ…ÈÓ/‘à d#ÿùôÕæÂ÷(÷ -ö»»^ÂÏÌF$î lj;¨)Ô›_,…Ø å»«!ûv«¡BQ UƒZ ÷‡Âx‚Í (ÁYè/òËË‹íÒ“G¾Š d3ª@'hFõã“Zh¯[š•å]$§óñÀ;¶×i…µp Âè„ðr×bSHÑyåz´ž¯¬Y(O D:y±¶9»Û Ê˯ëfe§(ZQóþsM!ƒ|¨œ?K9 -¯¡¿ç›R×°!.e-?4TqºuKâ¦QL³£,‚eí Iy9vÜuÔT‡šÂ+ª2§ñÃX;wMapé‡Ìð!›‚Ÿ€9Ò,£Ød-"pàÍjŸ°ç]NG}‚Zœú‚»²åbÃuÄ©cfOò.’ârñÝRxôÚEÚml5(q/IöQfÏ7wò†÷(\ØÒ«BOÊJ%¨Û|½–ÐêiøByå³°3]¿8Iâ¶+•^È ¢Z„”sz-qX¿¦‡V×BÓ/AÞXûä%7qu+Ñʼn Q©\³‹QXi]¬(”Ÿ‰Å.u#°F~ ­1Z/’l¡“ÚNEÞ÷ÌÖ¹woˆœ.­…€áqÇÍV†Ã+z2ó ˆÜüЩmp.j{&éö˜ïO‰!UǽÐAvu¡·Âêúôr\ÈGº°Üè|±&…B [J¨äøp$[à`ÊÐ^j¯«Õ J¥O6ª±}¿+EiZ‘î•>5Iâk‚Róî»nFÕ2æÈ;b†Ôk>Èê]UVVÿŽÌ1\ÄŠ]ó Yè‚Í@Ç·sç|Ñ{í•Aþ_ìm—r¸lØÌȇ‡&‚:Œ½/ý£‚#àŒ:&´ü jÓËh5Ìöëô 6ZÔ®AøT'-ÿ(f,™í[œÀ*Ômò\?"ï’0éG–£…)®Ýò*¬4Õ•*M7Ò¢ºGÅÿºOÑNŒ²t˜Ò†ø4S [¢¿ÙÀBîE¾Ì}®é:˜¸¤}vôyþóî”î8®<”A#pOÛÇôpb;@ˆíæ† vÓ=σڰPhÂyä %>„[×[ª[ñÔ›ù†BùÀedÔúX:|%^­“äŒ:"?“¾x•å®”+Öˆ—Ú÷„XاC†f3uçžx½ C7  ?_¯Ó#Fu.½&¸Yà£íÂr²ÕEºK‚a$)XÃ Þ »OÖ‡Çóúу¼­|1Úß'Ûm²½]y{Ù†¿‹›õÎæŠ_»ô7þ’w¥#ÎCéÃÆ˜BˆŽknø…¹µÓ‘»ÐSŒ –×»¶>ò…¤!·Ò…ByñÇ Š“á ªßøW3²Ù³¯Ïk÷G;“#¹MPüov/Ò7x)Y£N³íy'uÞrL!J™"üP(Ép@R%GÙŠézód¦«î“[TÜž²¢¼.þ÷Åbaüþá”ËÄ)`¸#64͸˜oÅñ ³¯.Я±‰ƒ!3ëÞCÿ å£ÃÏô˜\¾œfèõø… $ }^±X?×~D“ì X²Î­ÜŸà®'T^ÊüCLaO›œ§&(üZ™ËÃïóAó›™]ÍËt{®…\Ñω†^cj0©9¯wù–^« ä9ÎL3Œhf›ÄPjåµÊ\îS¡{Y’Ë|(D|%JÅ"«C dEmtÌUö#9ÐÈüÍ_äƒtë#ýÁÜû– uÄÄ>ÐÓ‘8çAQp9ž²·ç*Èà€ƒƒ¡^T‘ŸâM°DÔ×_®1zÑuÚ¥:vëÔÈ‹To`Eã>c©@ô§ÅEoBàú¨Œñ.ld¸fûÎOqè„ÌŠ%£—M‚Æòæ6O>‘o ±ñuþïçõátÞS|õµa‘ì{,xß‹™÷aÅ wËùe·Ìôò9Ir›¦Dáп‡*è­‘.gªqýµvÈÁÓ,º¶YÎ)%Þ0I!KÃô¬f‘×]}Rškˆ›'7·HÇý]úx ØÐ‚ür±}ø¤ˆdgàeü°'ΕHbÔQõJ‘ózªpifÀ\t Ðûx>±B¹‰0`6í®tÜiÇËö%ˆx¸À}¤§Áãü;àBwlô„‚sãBC‚öÉ0Ë ½’>“¥Áa&P¤ÖL»…tŠ-4I³2ÀÈêâ,û€—z%·ó $#-±Ì6 ì¹2£æ»&9Ê'Šp÷›ÿ„i²§ ?¥}!ú² ífßò¼"¤#–µP¸y v´ Þ„º´ðOʹYó!s»†«˜l¹w;â¼ç3{ʾB¤))ì]An€ßùÞSG?m± Ì¶ð­ˆš8tôõtJªíX§Hn{ŽOG¼)æÇßâþ ½»+!ØËÐ>t ¤Üˆ3¯-e}€k¯WjNÇ«oŠac1žËj0Y’#â›ÈÙìÁpÄMTÊ6&Ìð‹ÒÑ»PüÂØµm5õʈmâß]8b‹”CºÏ­F_͆ÌÈ«ÙÇV×­4Ê=ÙÏè…¡ðÄ£…8,RÚ(bñîŠäIF¹¢§d©ï¬¨€ˆA™Â6*_êâÓ¾¶š¦;¯°Å;K Sî.JQmØqhˆ×rŠûÛÿ;ìyÆ;Nì&´¾œBˆò™€F"Ý%|mEMÕïsØ®£îBZŒúÃønpÓ_°þ—÷ÏbôIÆÄ‹Ç3ŒqÊb ¯™‡-G“ë›QŸŽ¡öˆÕ·†˜à6ø¤-ÖûmZü@±ùÓëSÚŽ%Y¬A·dÈê±ôÂÕˆš.þ²°Èm»ÈöÒ@»ãÞÊzÒ^wY­9¬®ƒD’{tíߊgá¶cK ¢l’ê³K›Âi¥nÇÀ/6Öì˜ÕäúH÷N;ì9Ë Vë¬5“TÉ.`ýy!œƒ|._Lw'ý›M"lÒÙÝ>ÒU—â78͹âš>¼—Aà%ÌÅiÇù¨-=ñ·9f>aúhpWè&Çö´XÊÄє‹ãÑå…€sŠô7 ¼ Žs@Y‘bXz÷ˆa ‡É¦¶'ü~8³˜8L!™è î›ûdðt>üð Ž7º4 ëõi¼3‡v½7ª·ž¤n¯›–ï ™ÌM—å£<•Ðz´»>U# Kô\vÅŠÐ>¨ŒZÎ$Ì(§Z~VÞ?e{^[— §týHò+Ç‚ùʱx}~JŽ´* ¹ìt“>R~ŸºG&dFú'UŽé£ÑñvIˆ0ûÇ×ôôdßË@=i:ì~m·ÚrMóÌšáˆø-!l—Ê8GGWùQ£ÌV.^Þt‘Ž/ ÂÝóÖõHRû:]MÃü;ɹ±f»¾\æë…@¬SAŒ˜pÖXR*<Þ:Þ€ pæ>ËÑJš¯ÍÍYYbæ­)?ÎÀcrde=lk5ùò¯ ¶,"ø¾ìH'­àíEµ°BXb7r0¹cAœ×Çíˆm™á˺Í7“díV0’ç…ò7ÛüÞÞ±Ósúk@-ÀêlÔ‹“áuœÛ—¹ê}(½ôÏ/†;úƒ3 µk •ÆÙiV‘ð..L¤Êm‚<$M5)_ôRº;m-ä¹ÇŒì öUÈ¿\?$¤Æ ºLÝ“VSA]–™×6´ü8KDŽ,¾;<§‡í°脚ÞG‹õ¨Y¾Üe'y$œñ€(kVÁe¼^Ë¿O ·4XŒ¦Jùël1´ŽâÞès¹9f;0w´d cb0ÝZ&ý]º.èµÌ\õË”•½Îü1àÔçË÷¥T®ç\7Á$‰ ŸÀÚQ–Gº €eW˜@c€¨é^:úcì-¦!nº,¤ÔG ú8d‡WòýóéÉÜàì¾å«µV †â‡&OŒ³(CX“ g ñ&è63Ùñ5cÅIÓÅ{2p”œ(Y<¢wÏŸ#&22•Ë]ü:*Áåìhz·ÿRñÕëÀüþèÞEZòülÙ¼Úrò{f÷Hi<>õ ¢QJ„¾Ùð%VÒ±jŠòµüV´jgËT—aÝF fóàÐ_iÏ/29÷H)“¦”Á‘ß…¤¯Y½ÀqȄʎ1È:°Š© £Z˜%š\UÚ)}+Ã<ÀO.sj¼NƒcÊÈÅC@×úÀ Áj–† ð³œ^XÍßt"Klß=z‚ááVš@~ÃF.²íz®pj.ø¤WúC¿=£õ­˜°ñ>7[8³ž¥MÔô¨Ãæ ¬ü*ÏNTà¨F©œYO*W#¾óüœ ˱FÖÎ/YÓw êPJ']™¿ðÑÔ óó½Ù¾ÃõfÇÓâIO·äÉsb‰FyªØóGÙük—ªRvrÇíEâk6?¬z´rjºâkžëÖÝS!ÁÁZLV÷¡ëlšlÓó¾v ¹¹MNÏ ð”¾¶!N'Cü÷ú~{Âi{]Ý®ŸÈý'“kÏèü¤ ѰߚpKnÒÖa÷ ‘G`,›v˜“™—·ˆ¿Hh[Øw5¹;üVT·1Z½zÀÝÁðô`ü 鮽 êþ9ܵ”ÁÄOÎϤ/÷[¶QS»~X l¿õ­úE€hr÷É®²Uý"@F2sg°§6þLÉû6]å›3RŠ?sþ‚f3¤Êû«lbÁÈ\¢Jh çûÂg6ïx¿ç%º™÷«Wh3ð“ôõœWèO&¦©lÆVX q‹ÓõSoÂH£2·A[cë(߀îy³–¡KýâÍ¿dÃH›¥îà¤Â¹ù͵Zÿ°T xJó겸þV›ûÊÝr£†'ðC¨ ØŸªrT³‘qüHŽgða2ÜÃÖL§-‘U?Qä^Pø]p‡ZÍM ~Qà3Y9 ÑÖÉv^³6-¿~æ&ÝmôÛd}4ì&jÐøÑ®íiÞ&;l‹•õ¿ž=4zÝ€”ƒ‚‡(c"Â4[~”|ò²ŸF°=JC@O<óþö„Ü6©2„hS © ³Ó0V$ƒýÂ۱Υôج[‡l6Tïƒãºxš\ëúØ'U²hjÌLV(\ï ‰gVBvFnK[7e×§3K!9Ðã›k#âݑvùh Þ €Óõ‹rŽÆlìmÕé4=”!Í P­€ç‹pFt‰£ÈЩÑË)Áě̥`Âf~58¾æ§Z”XÔòÔ»Éô@”¬¼Ïq}CŠun¶ý9Ïw†ã+‰³)> ±p—Yt2ÉP˪mqÏV`ø²Izb9ņÅ6k«#C×­uýRMîú ÒªÒÊ¥…+ñ_fT{¡'4¹ÜmTg–7"Y^¬qMðý…½¥aÊ=­ H5†ak%¨”kªì^Äýž»…õ”Ö[ÆCÚæö¿•D£)æúbÿìÔÂ1¿Ô[Ržò†³àL…¢ Š=Çç™’¼–'ìÉ9þS.¯'¸Ð¼ÊÆõºÝºâú–ÄQaEbùPB±Ø³þC:bªÉ¶À€™_ŽAC[]\ 3¼÷ŠzÊ‹¬ªbi˜˜çߌ›‚ˆVzª³µ@Ñï ‹‘Û å·Xjæœn"÷– ¢FG|ár½ç9r±¡q¦ü•ž/9Ÿwé¡9”üeΡTkˆ ¨q[²Ó:ö­'ÒÙ’’‰@§T,NÛ=µ$u®‚*:.!J#™NÉ2+»#>OÙ³0À'}«ó2d¢’^½‚òS³ëœÑÈ98·§0Cì:9îÓ›%b w`-Œv 9ÞÂky-‚9*ö[Ý/ÿ>-yÝ6]Þ†€buWÜHTƒ°‘~YÂ2n AP…,Î ㈭øI¡ åà)Uœ84•wvZî ûž­¢Ív}jãå?ÏëcÒà„nÓà›ôc¯“Ä·øùÚ Ã2UV«oÌëÍÉZ§ãEoÀDTwA $pdŽ #¼è ô6Ï­´k1jA“Â|5œ©[¨HW¡¿åoòì‚(dÇã9»Ò==KÇrÅq8¦D@[ZïN Ì&ðæñ8úO5àõ°Ëž¯E |å ÞÙ9ÒøÁs2'¸3Û«TF6#ðˆã‰ ó=S²ÖŒ|ƒ:>YõòyS”¨ÝI¾- ûrÖô"ji_þÚ=óéä@ç#©B¼/xóÁÄ©‚ã´Õ€rÐjÝNœÏžœš< ±r+¼ˆ‘Y»dxRVfăl—ÉPȽԒñS~–ÊR«Óg÷&Þ~Zƒ¼„³zTKõ û«ÇŸG¸L~Vä&G›áh›.ònZ|Vl}dc‚™õu_«ýè°3 T¥¬ÜM/ ¯ö†«µ™ñ\íÙ¶†ÂÑV›è¸&0‚À_Þ/¢™‚(t9XÞßí‹©7¶ö™ØT¡0h:†D!DŸ Í" @÷"ùg!z#-#dCŽ·q°S¶Év²%ÇAÕ@ä¨Å‚Vp²K§‚.áàL¥o¶N–“d =l¯³#sÎxÜÇ…¯A sî¦ßÈUœ–ä½ûªú=Xb¥º£âu‹$ª¦ ,þ•ÈYhú ž>í ïëlkù“M`Å#/ÆkR·ÚS)nE@Žó¬)Ô+aÊð’«±,hËI›ùø…×lìÆ v¬)Üg TQb'UPeè–ã ºtŠ•ñ†w~4@VÀÎ6pRãYð„wŸ¯öýíÏ5F Ow_×Gˆ>-\ .¦t…ŠÚLµh饞 Ø5¶ÉEDØÏØÕÂ)Їª 6N•&é Ø­o¼´K9 ÕÓúÙ ¯.¬‚Ôà‹mÉsÖ膗`ú˜5ƒ¨v6…¼‰Û¸[;ºÂº¥áÕ›m!©í½KääTˆÑxý‹]Ú ¨Q *oŽNO4×fMÜc:ä,;bUƒ‘Tä¬j<»Òhx?3W¼|ÝTèÞ˜MÏàB Þ p§“¡pîy`u>’]õ¸·}¤ ™®_úþýÕ‘.óÆA¨3g:|·/p„’Mà®)㉭`MÆ/w¼n_>õã°¼´­ž¸y‡®/ãÅê®Ù”g‹þ§Q¼úc>Š¿Œn‡³E<³åìÚEŠÃsÉìÃmj_y½›dàŒŒt £êçùŽä×B,@·çÖwsÞólÊŸTñîZ°]Seµ~Ôƒqæ€`b½ xê;÷¶äŠšˆêÌE¥ÞǸæðÏ6Ð-»ü)Ól›>¼‚$/rïÉh–Fhw1emY;÷RÿÔNÖ^p >'¯”çë§ûájµ„BK:áúî.FßêùôƒÓ–ððuîZÁr"ïz½O1Z`œ°‡¼™¹¾—YmÙ9E®kÝ…3¥çÇ †ÙçìUÐêµU@Ú-¹õ@CPFr;¦#ç–YY–œ?¥åŽÁFGß&[NËäxÁ†èïÚfóù?k—îÓôàM6"?}jh†™Ì{Ïü•wg#¬GW¡Ž¹6PÜ—VÑÂë‚xrq9û ¿ô†ÿÛ$[ ÄñÔBœí¯·A¯"ô›JàÆkoJ“¨¬*‘ŸY±Á¦:;Ÿɽ™_>~bÇ™ÈaDm_FÞ¶³‡‡ÛÌ5a·­oÂÆïËͲ3ˆùDGt>'œœÎjD\r;œóðOp¨Âã é—ºìfO¡_*›jѺ8:3¯júòàô÷+°¼/Ø}Ïω¥7" |«á0æšãw'ßD§ãMýêQVùAG²ç—ç2tØHÄ¡†ãá¾<ÙÄHhÀ©Ð!\Ì&«ßçÍ]d™RÛ/c¡âtN„SKìÉ‘/ÓËZSY/¥ßâ>>„»SX“ú±6Ñ6Éþ¢Ž_ôþ(O†-”n¦n̸´Ýà UÜݬ_ie7~MÑy·>Êi‡AT[\Z”·@úüØÐ4ÛÌïE¢„ÂÐÂÆÄh†»LÝUíd ÜyG\B?UgJlÄ“å¹ÈÍÖÜþ´­6ù8îv¬ ߉XꘉvÐô÷ë2{ÀÓNÓúí¹Ú¾”îÊ2Ù¬ßN¦ ®QWŽãuêráz#·/_·Vj °v>Îw8_,@Q¬s6µ„üÈ\±¸Á=e‹©ƒi‘láo"ŒŠ÷£ôå~³Ùbùñåª5ßïNÒ㚣ʘò£~\óî÷Å-?¦Ô ^Žeãs€|šÛ/i»ÎO.9RGõR:i(s™ÜÍdºÍásœVÛ­SÚÿ¹«ø-z %–ßbž’¾íÄö/é{Ò@Åç\eŠ•b›×cÄù5G4¼i¹Â!£e9S9}‹*TDÔ-¦C€¸¼ÆP¾!'d^€é&Ýgâ:øsËÁSºÛ“§0…p ¼¦ÍJƒÌQz»‰Àߨ”qt•®m>xî;(V·WAú¼ÊÈ#T¿b\ì ìã¸ûâ2Õ€éêú3Ë0rïÜrÔDËÛ—`¼ڹآ½m}›í E†Õ£ ÛÑ%(ÈõdhÖL°DÂY•èê:û?+_ÍáéôøjVß÷{é°ˆ¯úöRžv¯; ~R¸{±üºDkGŽÅ?NY.ôŠxCÊÓðÓI‘é ¯FSî7Dþd¢5B]TU&4d¿žå”#’¤Í»ËÔzýÂ0EõìlNÕÙ¬; €7›–Ü•Ýõ±Ó4‚BÅ@ŸÙaÕµp'oJ7£¨oàw ÿµ>£û—´¢ ¬d×ï.­cê6uSåÑD~ÌNß%»h—Š•ÈÕª «Ô{ÐiH1L6©3¤y±4„¢$Ò7K}¨l0Û´?³²"ò$Åbj6 ¿™¹ZDbåyF<½ƒgð×ê-äõ/©‘’ˆ(¤Ì׎»kùo@m[ËtAðö¾DOòBSz/–ÐÏÄ­£ûxWlƒ¾$Ì5“›.høb7’9<¥#ÞöKa!㾈¯OO3Μ¦ïx¨ñS´Ìع¦‡6ÎØ·œÒÍ©)ÅÍá‘u èY#&Юj‰­6Í~²„jÇésÚ5…äfŽÆNýÕ«kF¼†ß'%€?~‘·B@”áLµ—°÷ÿ)—ËžÂrÛÔøA®‰ÏIÍ´ùà3jÞ~ŒÿܕΘ×éK¤pÈý.ô;ú³ð9ƒkŒßÇpGûe²?é”ɘs¡ïNxr©`¼àü©v›æâõÔðÔ[€á.~UãpÓRç ­#æÔ•Ö(Èýnš®ÿ/;òµ%\ÿMc½Ðß]†q„»ì@O^óäH‚¡;ÀJÍKêeÛT¤†â«ÊﻹYÍäT>uâÞŸ'æSbMhX\^-Œ:ÃUÖÿ™ùw÷ Œ«Sk7KÎÞe.ø¸Uú´8'IGʯ΅4gîõ¨¨A~v¬"Î?AZÕºãÀž—° ¨†K0}¯ÜÐ2qrZ(ÊÀõÃÆËOO" R³é±ÓTD¾ÄIþñ¯–¡žYó…ÊjvvPÆ,’s!G¢4*ÆÿÏsz4ì{ºGÁMrŪö¶¼wkaã¨zO+^P. §[3f k†Þ­´`ŽÒ4ieŒ¹š a»hZAS¼AOž»´ÞB$]^̶ÇüˆWC¾ý9¸òiöO ©Œ‡ó/:b¦U±IÍgË<—ZˆÒTX  ŠíNx ĦóÊá­)í3 ÍÝ"ñ¯€(ÃøÑ™#˜n 5Íî6F²5|šçQÕrx]°™Êíã[2²R¬4é˜A÷%Vq^{’¬r³­‘´ìvW‚ZÍk^ Q£›ó—…|Ži?`ŸÓ´Ø¯9‘Õáø^ù6Ö|wµœƒÙ÷¨¨¾¼ô´$PÀÀ¡¿ºª+T%pÍc¸&zdn õß{¬ŠS9÷` ’ã pûƒU¦:BuCðÅ5±÷á‚kéî_=?ïžÚqµZ*£+À—@V¢ÄK¢[êAÄdô¡3¸P è5ç]Èi¶=ذڧš¨ãX¹¯Ãq¼M)ü!„>Œ§ãå`v{=þD6ÅnÔ`ç‹Ù—ñp´ˆ§ýo çE¨/£Ûþb<‹M«Ñ·úúo ÍÕÝéç¢"OÜ[=ܽ©i¸ì‚‘ÁŸ"1ðäÈU£7+Œo¯'ãO7rð.`Ò…*ËUÁQ)Ý#ç[ØÒˆ:Í7«¬ÆÓÑìŽ;pŠÅúïÓ¸?Æ+èb1êOyâ{á%x5:Vˆ‚Ë\ðM§což¦¥_oF}ÔŠyk˜äô”m‹øÓݘût"¤CSŽó¨û|G‹ÅlÏûƒÏ#ˆ :Xg·í.s‹^}-Ó……AÀb40›ié¯L»¾!Ÿšíë|Ž:¯å9=ñÓ¡“.Laüi2»êObá?›Î ¦ýñm<¸"?2?S´zJ‹azŒ« tßž ûÖ€¬!nRãÕHÇ]uf›²ƒˆM33Þ²úŸé3@ Ág¹Ü}…)_éœ4œÔÇTnˆyµXyU7|¦r]Š9LÐ Y4ÔÖR~ÕSM§Ýv [QÔ5ÛaK!f‡Ä:â“Ý´»b¨œmöŒ쌹ˆ\âÔ`»%̹xrjSÜU±aD,ÈÙ¥Ç_ó‘{©# qîj~{Nã¥Aö!¢ÔeT‡Äô¾Ü£;ïOÉzxds¹A*)ÍwÐëõ¢P# ^¬2‘ÅA‘±2²ó¸ µEÊ1OdbâùÚC?“Ú^LSaÔaEgždU¼ˆÈÇ5G”U(à·ÓÛ+7Ö_nÚúŠÒ‘™=<ì(¾¼ájµÐiɯ Óy -¿C¡ÖÔ¼C¶/"瘢…ôˆ.bU MÀÊE)c}ŽCDŠ/ªó>âfóéw bPÞ8ïóº½Ô@všžŸÈk­£;ÃKbaÎöqKŽž7ˆð{¸ f[‚NÏâhÁòË×.PªÊ ~CW õ-0ÖHâ\¹MXLþüÙì´‡PTh(6ŒfçLÎèS®Z6+R7‘ ñ~-^ÉíÊX­xµ²-»°¡Í5dCX»ÛlÕbÕfF\óNmeƒt¹’*Hµ‘!g]BÊTa[ãŽÉO³w\dj³…Õ–ò4;¤œñÊ ;÷jCh]¥§ÑfƒÛ±rÔ$±É—/ŽÑÙç«‚¥Ñ8—¢Ó ®£z´Â0¦Sª¦/F bßA¨—‡}Jh”´u¸f-Nø¯ÞH¾ òTÁsq"”E¶;¹{(çœáâ(¸'Úêä—p"´OZj‹Rªá]p| ]HPØ“ÕֹѲŒóÃ|ì˜]\çÔñ‘骵òt+ò³ÈqÈÆ]Y2ŸíÞ« -Ur±løì PEC(x¾;Í„^Ã>l˜WÝ£®Óãþy}´÷,›wÁ̆rŠ>*ßUÅrâÅæ¦?ñî‰ B¥ïþ‡òrEÅ1‡¸#½n©¬äËÜð©è1®l¯Ê€âÃ]‘& cTû§Èû™WP>«·å° Z½ù™è:“ €X‰Ä;ì¨çÍ`º¨ŒVn£éBÌqOvnKÄ¢[Õ|Þ=d[Kdb<9™·s~Äo“«t;—áQXmêN¸ø>ã­Î‚ÍI™Ê²­kG~ „£m-BD™ƒÞ¬`|D}o#Š}‚†O-AåN›_&7¥¡¸°ä\.gf9½J3(ÜkC!È ìL€æO¯¸ GV *hòcÓ6ÌþJ÷ÍÉY ™¼®kh±îæµo­^›©‘¤l®Ðû˄܋ˆXøîes.©ÈM±\,¾c—o¨[W¨ºõÈñ­?Mœ&À5n5‘sÔ'Ñü7Iïir!¬“cA¾çUNˆ¢œŸ‹:Ž4…ÖÌ8¾­qz`YÞ2°õü3Â2à¥Å«s±JŦT>ßÛ?’c6§ /aÛ¹DÆû[<ß<-_÷ñß‚àowÛ›ôñ0Û½þsö¯Ãó§Ñ9ýyw8îóŸéþgv·Ü=Ý™s<›=twøqgp€@è]rþñR@Õ¿ý¤7g+ý·=*Ý<~`'§½ bü·Í?ý¬4ÏßÀ6=þ)æ?oþÇSµù';ú¼àÄ>|‹þÍïªÍï¨ùŒó²‡ÿõèw¯•æw¯¶ùì›oyÙå?o>ûñr÷/ø­Ü üÐv³ÞYuU«ÓrGü?ï(¯.r~ÄöXþ¿å£àý­C{•öŸíü°:×ÿõð»»û‡SõÀÙÓ‚òý£Õ¦tÿÿ|αº§Ž´§ÒŒ¢a…ÿý3Íwuß‚?¥n܇x—ÿ¼§"É*˜ŸÙOyúÉ­Ü­õŸ÷p~J«}àOm/×Åâäú ÿë/ù¹©tòsc{ ˜~Q+üï?ãçã¶Ú~²¤N϶ ïUóŸwñ²ÛŸ§J//DÉ7xcZQÜÿ/ºù×KQ=ë//¶Jf ѯ§Ç 0íñÃ1Ûdž‘3wgœðoù+æz2w/©ðâÍ“Ô'ŠrÕt¯üñú8=ììoÐöùgãtŸÇƒÉõ2ž,oãñí—þ„Z-÷Ž¢A·w“ !Ü›ŽE0We»‡Â0Ž˜­‰PÎÙ †Œ1Ø+Ž'g`­f 6Øe`»úad¯ˆƒwÛÙAÑk°Œb¶¨„š®ÅÓz9)€¢ƒ2Ú„A¾Î³”åøðvP ­oعa8ôõî\<­²IqྛeÈ'0²Ä>ð¸÷1[-'+8´i©<éÎd\‚†)X¬$‡›óÊÔèŸgJLfº jšù„Óè–7¬…KäÁ´Â*dbE ,o”—~ú¸? ÍP­½ª8±ìR’¡N§®ŽU©ÓÔ"Ù kШHÙí\Ì[»·¢äâ­‘tëÚ^º\ú#ã^€B'Ñ‘ð*_„W6Ä/5{ãjí˜ù¢7j³²õèNôh_7Üסní+¯F6Â$$XOrËw›údõÛ~üüðl°•íSƒÅÌÜ £Yižc&ô}Üv³Ü6F媰¢=£—þKÙVCxÀ›Þ„WözzÕGΉÞ}!Єµ¹±Î®‘BB4‚TC·çÉ­Ohé;W$`ôB‘9ëŠTZG|}¥ð1V`Š §}÷´&]÷AÑS‡ÐÔ˜ßmò"¤[ÊÒÉ{²©ï4Uè±F¾‚bÓRÓV¿[†E­ ì¼Çw‘eÓí£úÔ .Tó“C=tË3çï\`,©W›|™-Å kFÁ¨ÍE4¹Ù‹Ú¼› 6-ÝÍ^³ÚÉÔ|˜é¡cÁ#ëó`üaµ7ãíÕëíéö¼¿wä%hW·ë˜BQÝÒ¬X=EëN^Å^X‡¹ŽPnއյðæmÔ ì•£ÊóáQ³ƒ9>ç½[žVx éæ„WÞLãâæ5çÐ*’7n¨ò¡¡³2:lg•ý•Ú â·R»´p?'ÇךÍ‹-Î@TS‹ "]7NɉG¡®Dø€WÏé]í<—†Í”cøzXïÓMy »åÍÍøÑÑʵóäâ¡G•æáqéß]Aæ®0’ò:‚〹p´•Ùnµ`¼7äÈ#5f©º]ª>ÎS^© ]‹Xf'xæ¨.TÆŸÎÇÃ*ãwwK_š‹Ó'O_ì³¼/– ^³Òì[¯þ;hOðzÍ žR݈“vÙª#®Û•A£:À`ò³½ãèš½2ÉÇ{òÒÖ­ ÀÀ>U• ¤ü$¹ 8Ë/aË„c*î }â¹ðÚ|œÕìçí0@l*䋆:åÒªŽ2zÀ¼Zý ²ÁȆ™9k ÷G3î·[Æ`†*.U+ñyKá«í0ô€aÿë–úœ`~\O‹9ª¥9ä+]0A{óªL£[ß º>'HT/ñO­@Q„Ïèk´s^º•«IÐÛŠÔܯº1oO޲Q0¢®KA+? t7 C”*lKeÊJ!ÛC¤¸@q6.¢µc^<%[i SöñÑS«aq'Ã<ä'gítС:Oˆæ85’çh†ê0!S{ 2FªUC$ñ½Â–Œ±ÍJï–¨•f¯Ǫf í*؈"jžÂ¨2OŸÐ¡IôíãVXƒ×(ËãÕì6£¬³Û¬sëꙺÖÃVee˨f7hW1Ð$À}vå“8éÆûõ uë¬ßãCò¼Ùí×6YC«íUPp²ÖAЕ'Ppv5:~SÁ  ·!¸°+ÊOåÀý1t÷·Öâº_ÕÙ‰ŒZ·Â¤™Ü76íV“7¥g­Õ«kËsY„Jj{,ë¡IT;jQŽ!$Tý7¶J¨N-*R3qÿ°iÉ_Œ ª}GÍ׿Âè),ȨκìGš°k›©R¹ù,½Id±Pßìƒxk=oñ¥È ù¹²}œÛúþë¼oIsnÿñÿãgÈ„úê~J#0¢É!sîK}ØÀçŸ{åð8Ø Ëåò6{ŒûÉäœ/nªaß|Êרclyns¡–l²æîè*Œ=²_øcÆ+ Å¿k˜¢T* lÜ~_/Õ‰ÚSò³Ú€{­·ü—êT"ìc|„¾eK1Ýî8”ǘ´æ?ž§äk.¦’p¢wGç]!™­“‡Ž¸3S† ¼óií<Ô¨ýPeÍŒ¼  vé`æ7¹Ë§t?à·SSÔñëåry™Iéøfï.£@¬Ö=u»8äú€7OœÁÑf´SéZ?>:t š„ ‡ü€Ãôˆ:ÐWèúŠaè5êi-uÝ áB&º¬l§Ÿ™»ÝVjÍ^Hd'îZÙ'{ÊXÕnzb '³[›63’£¡@>=c$gõÇô$g,Q9Ùf:ªaJA†ð%î:2%>®•:]0–’· ©Àâ(g~Ÿ>YâÖq»&w·%LZndåSvÞ<ݳŽqÜ<Ìc…âæµ8œ–éß‚ ‰-œËù4˜ò¯yŽŠîcáLð÷bËQhE¦UòuÃF(¢H%ï<òbz7^Ù¹Á¬ÕL’òg=„?êýÓóÁ¾Ì¥ðè¸Ñnµ®Õþ0y[˽ƙK⣽¥ZŽ!…ŸýÅü‚Ÿ¬g3d°qýøî[ ?ÿ`*‚êèáãÅjb¾ãc a_Ì™‹1L“×–˜Ðu¤ÚÖ¹ù Sõã» Ú½|ÀM/`÷O!þŸøÿ½õçÖËv£ÁC<í/©'þ@_ú7ôÿáô—áüe¿ûe8³ÿ¼š›¿¢[~§í”Xg8yÿ®ø›kùä~¶hÓ/p0Û­_ãÓSZÄêèÃÛX«'§æ—› ~Qï]Ðv¿5_à?ú qN+Mµ˜‹èùß®Í/üÍü²£óæøT«Ózè„­`Û»ïzÆ6èõÚMSlz …ë]ç/N•¢Ñ`t:C3ð4lôúCΠÓë¨k»òÎÃPëü:ÓÐݹ¢’ó_Þ¡ÕhȾÌë]ú Æ&\ ¿õ¿}x´¶ñǘÖÌéy-²½µãôáïíÏ£7¦¾ù‚u:>' Öincü¯mþ«ŽÀvÓlÈ™gU ‹,;½³M¶œ´T.ÿþÝ&³o5¿Ÿd ê-¾ÿj«µàŒÕŠwÏ…kôíƒù‹Ñ 'OÑ»âÞÙ‚V7”Çú]ñ׿Æñ»F³ˆ{1I±ñ»<†HqñúãNð˜¶Ê‡w/æÿÜ\ ?°ø÷'óA¼·D,N·¿¿{‰Ÿ ›k´ÔÑsUàÑ,› 8ãÁË;<ÝÝÕò1¶‘¬ãSoÐø$ÞCö[ü«´õ:©*LË}%[¥]þ _ÅÆì?±JL¹¡Jù3¦™¾³cLLX²ý ?ê÷w¹ý”v³]êä6;ÅÉ ‰ZÈ“äü÷À~½»Ø¸Êì~‘áŽÕ~^Q‚ðøam{i4Kãšg9<—dÏÉ‘BÔ£Êöý¯fšm/A³]©r·ÏÙ÷™®$ÓCj)X–v}¾[!ýöHQmM•Fù[æd…E©ñ‰”:ùh¿%ˆJUè%`¯ñÙÜÌ›ìñN©±uKƒ^ÂèB•Â~¼µ±»›Îg¿Ù é9QWåŽÖÇ 8žgHƒEßo{qÒ¨b?¦¿Ùñ7Èm•§ØU¨:QÑ9Q7U1 8\ovµŽWP¥¼ó—Öµ<Þ%ëÍkœ€ç ljø|K)|R…rÖ¯a;bPŠS;aŽG®¯J•„{±Ì?ës(»xT¼!’‚ƒ3Bž'kCK>°Õ­k÷èrÞņç²ú-~¤ÝÞ-MÒJ0à5±·Xk ª[¥Bå|• ºJ²G+Ã<÷ ±k…Ü%´Û[ͺ*0¹àlʯ`¶. ,,í‘=!3UžÜLô¤~ÿΗB™bB‰/õI\꣎€i¥òЬ\¤†Ó¹eѺm}^¾Ÿ¯'|F|·;#&,]ÉsܘVÎæO³ËA’û°M-“Øñjœ‹Ø'LØ Šê±Eòj“wç›ý7¬.dsž‰aèèõÌyüïßm ì„QØTyþêvBÅ›‚sÔq¡"‹çüâtqŽ-­ŒÝã^üËõÄüxzãã -ISí¤çâÝ–X˜ŽšcSðüû}=ÅYbIA<ЦÛXb Íȃ ®ŒŠ>j¦/6ûŠûlwë‹Qð {ÞZ˜ŠeÕ¨Ô±¬§¹I([:^Šb¹qSf²ºQ¨ç$v³¥D w/ÿƒÿgÆGNñÿ˜õ öFo·ÿù’øçrw¼ÿ‹öR0¾,~E@Jºôþ=ˆVÛ¹g$–iP¤Ý®ØVÃnGUšÌn?ý 5Ñj‚ÉilþŒÜßû÷sß䯓uqú|ÈžXÛÔšþNÝtä6|ߟ¬F‹[#V-oF“ɯLä>yõ+¸–ý¿ÿúxÈŽ†ü¾ÿúëúxˆ³Ãîo^ð§W3üþê\ ¸Œ‰ÊO)X) QÄ2Ш!Aµîƒã!£É•9ÔÍú¸Eûßœb-ý©}ƒŠ*n‘ìlDuBt+ôÞòP‹í ÔÜ{è„‚D Wé©YµUШ \‰Á“ÌÜa¬MµƒJØÈür`õÂÛo4m¤mJt È ºŒ¼;l“‡ÔÚäâŒÉ+ùýˆÞu«Ó¦¶ÔM²Î‰‘ýËïè{ð+Kê’ ¼¹ÁéD¨ C&´Ú·”ß/fw·ÃønQÍæ³¯£Eó=4ú[<‡<˜Kl6RLâ{ÌÆ¥†›÷ž"{ât1Ô!90TÀuþ ßã¿Â_ùت%`¼œ,©ýú”nž0¸¦‘Â~#Å·á±~‹Ñt‹7˜¢ ÃÑ`‚ršþÒ±Õ¡íËGSƒ‚¿þÉ/+H¶%Í4?Ç™ÕM=5‡KëÈ@³¢”.PõGƒõ!2âb–¿Æ;R?Ňõž®T%u»:^¤Û¢FüÄ ØÖÑš¨c5¡):¯·›A[Ž-l(5„©Âé2L6 Û_b8 ñ_¶”¶ 2˜7Ô÷Äoþ¢:]5·Éóî•r3þ•Õ.rwü5~ûD{õÌ–07ýIÌRÍw¨Ž"¿ÅÇÿôôûu²1ÁT×€ƒ¬w!wÎsË4Æ·ËUÿv02»ÿZ·_ú7¤ÄiKZ ÆÇƒI¹¼íOG¿ÿ2\MîFËÁb4b}ÜÙPm¾˜ÍG‹Õ1×X®fóÁl82Å|·ÜŸd.XÜŽ¼\>À&éEr„á¸ùwÅ»‹ì‰Tª7üùõÚð~Ìǡ݊ þ³§DM Vq ±.uÿ•ïQ¹«>`%ø6nù[üÞü%ÿ ~³¨«âÇocƒ]Ÿbˆ©døð=3Ÿa••a¯­ˆÀ‡n÷Ý/7ÖHª¹2Eïè)£UªÓíRR×~Ž®ûwø¨¤÷–YóŸÏÇ*>=™±ÒžÔÊÀpÕã¬Æï¬†¸ ZtIx>|ÞÎ ~JàöühÕÐ1(Ùâ ó6D<ó?¯ó|¤:JÇùa2ûÔ°O,­Ž¼=  ÉjØ53‡Ù籫¥5’í L0{{kv/NbÊjôÁî7zmF1@NY`hü¦±~èu×A·×^a/j&Û^B®§ 1Ãm¥û7éCÿRûÁη¯m%œä8lãÝ"?7|ÿÎt9¤Fx5^ÅC8Íã9DÛ´-ë· šÎ†w“žh©[¦ÑköZF\Jv%~aGÉóíf‡ßá#½P¦¤ÃsÖV¬jל*ø¬ñ|ÐjÆ |áî¶{Zùú”ëëkÝ~ŸýPJrô¨/ýjÛvc`ÓR"••¶6Bø'W4ÿ⮂ÚZÿ·ÏiìóÁ/xøöklO9ÔRêäî5¤Ã‹3Ô?‚ºø½µŠ‘ˆýJã ”’ºë/µÛìø¯P|x4ñ8xÿË‹t4ÛÖëõ>0©‘Ç®gÑÛZiøùuÜæ2@³^˜ÐõÑ9¡Zp4dGU¡\±¤¦ü©¨@”áãÇóëcPmI=—üí]ñÛÿó®øe8aÕ‹Ô åýÁ|üýûüvôƒ=í(Õ‚D h©üaŠÔ¶%| Â1R ,ToÑ;8 Esûss‰Nç}KÄ»¶”rL¡çÔg]F‚6ýS¿°2­úãÉ’ ¡Ü3 YW»Zu˜ü÷'“xy3žR^©›˜ü¡{m¥SƒO["ÅôrY¼¸Ú¡bnúw«Ùàæ³—PIP4ºí_á˜áîPï ý/‹ë1¹ÎÆ|¼r¸—sPý£©:æ~I#N Ëá‚F6=Éî!~~Jw6l[¨-oñŽ ²#Bæâh͘~m­Šæ:¦¸ˆ×i?^s×@lýZ¦êÀCŠ©d³29£S§«˜pUDzì†19EuFý´Ks ëœ@(+Q¥ÌSu6k7LÆ3ÈB°ªNZœÖ?’Ãî•§Ö§©DnU'–ûIi3milJ± êѱÈÔ2LöênÏG·Ôº¾Uâ¼Ù`îNüžéÿÆs®£T„®ŽÙ£kku»ÔÉdTG »ýMžöwéº`’®N¿)\þp½sþˆ€éª ÁLºdÌC“¦@¹G†{ëuŠˆ[']ñXÚú‘\äQ £NWí±íµÅëû}ØôA>1¥a>%,ø*˜¸ÜšŽ•kh’‚5ÈÑ¥×V ÇþöÿÎØtÉà ÐBGÞì<ÍfüMÅ“`Y“ਯ&޳«xR—ÓÖ,sf6þáÕü–»7R+©€Ó¦àÖ¨©CU*ƒ@á³ÃÓ›‚>Lb˜ý jêÅ‚'?ËêûË¡5‡PJex–¡WQv1ïjóþ3ØÈ <·=`S‹Y>%ž ìöÔH,yØR˜bºŽô<5ÚãÒÖ­¾YçþLu£{©œìC†v¦NGÏÁu€‚P?Šmî›u4ì VÜ›ýhÀ?|ž;`»nëh¥6ÖÁwÅúZTGiÏ¡Î×éøÏúQ2G?Ï­Þ™ Áà)T—KžOÖçÃæÉÆxl¨Ç‘kÞÂÑ,@ÔÃ'Ĉ×`€ðî%¾=%üäÕÖ$Ñv4i†:÷‰Y¾¤¶ÕQúÄ~ñj†yÌÙ¹ÙÃH+òûçmšÑcÞΞ™N'T6ÁlËÈn9Q«Öá¬U‚Ãè¶NOËzÓŸ­pë½ ¨œÒ@Ó‰RZ (]šKbs"Ô–ÌÂÕ`hd’U{ŠÍ4E³«ÿ V¿S©2º¹߯×c#A~-–Ž9î¨ã˜ùšƒU&OÞÕd6øßÍ?-úCb;Jb½ºO†ñp16Ć_¾ñ:€UoªQß-nG·ŸˆuT’MGÓÙâ~Á’œüÕzócù©»MÛAX*=çÞ“[ät°Åpÿ}÷zñÁÞç :~44€MôÛkm…Øš!üä®Õ:°K(‘ˆ‰êš²”®—ðä;µm¯Ì-€&»ÌoÏûüãz˜ÓÃÛ­·4-uWÚ¬© ÓìŠ@Ï>Ø`¨¶ÁS鲨ì…Ë$€²þÑp ¨¢ìb†KWB.`ämÙê©Céùx´öüÐÞ禘FÁת‡uÌ{·µ}ö¢ò÷ÜÚø“Ød·ô=šH„åFý•ÚÑê6(Æ ÞXrÌäjê·ßøÊÐÝÑËɰ¹Ìu•ÑÑhˆ©ê©§Õ«ãškt{ê-îʾ/š­6ÆÆøý}ú+˜^ÚVB½íl®¥µæð‰‘/ã™a~3 Xi\ §,³‡øÛx>±1]ÌU^|ˆãûŒD0ų©<`ðv®héÕ9Ým)Û Eh:…“õ=—U*š²Ñ —Ê rÐÜŒ¦Ÿ,}KÎv0ð¶¶ÅÎÄhÜÔ å»n   Ê¡xN×9èÀQ©Füûï¶’bwÃþÝp<³CÐâ÷`¸˜M© #¿x0Ï­q>™XôäÎ2ß4ø¼¼›’D¯”ƒñõèêzþ¿lJ«F/†Çàåò ¦06Rnœ¼lÜõ oýÍìN’ šQ¨úš^ó8úç;ªÕ‰”vØ`*å’qÀò,÷Å=uï fÓiÿvOÆ·¬gP6J¨\¹ýCê!I Ü\# }7u•.Òyuµ†”òpQÃJëÃ)º®ýÛÁÐHžÆåñšôW׳ÅÔÃ[ʰÅèšõOúlñªÿÉ©RÔõ?˜}ù{@ ýC0ŠøŽ£VjakË`mE­9Ø»ç€"…N“Ù“•~l´£²qÒNñOgåu:zžTb½O÷á3÷£ö ÔsƒãŒìG‘'AüîLÖA¥“u¦ë¼CÂI›‘®UJï¦LN”Ü‹…ñj16M4²ÕÃúGb6ÚºxŠŸÓÝ.¶gz*ן@ªó¶\G‘B]Ç´l•(…íæÞÖij‚¬êØÀs”ˆPËÖÑ/غ)j8„r\ðØ”Æ@×ypOìÉ [ ~ô ëàcÂ:þåSÿdsWF4sMeYWë_É13ýÏ»„ë4.kÀ^@lÍ3ÕÑ÷ŸªsÈÔÀDOö›µiGù`Mzqt—÷‚©Sœ 0çå¥~”n¢TçlÖß¾l™ṵ̂WT'èFûÉ)³ ïÔ5÷£ïU?æUôA¼BÑ›uŠØðqöƒ’›J;®ñEº‡ƒÇšv+Ëå}]d†Òòa@»ú–æåý†©ŽÖÇ-()Ìvmò[Ó’ÔKuìk=·„Yøžöåj÷ŒÝúÈuZ—׿„)j8èúÖ6ü=áŸÕ±ÃÚþ…fºÑ þ¬Fñ#5gß'šðòŽ>¬£‚ÁÓ~ãY»<ŽtP‡Du¥²×upŠ óié{”JQ×TÀkúž†¾<—VèÒSG=õ –Cd´¥"Y?²…W\±§~7*u2ü"ø„fé.FT c6Csú-éÍ´¾Ý~'Ü¿òµ±I»¬¥íìØ+™L`•hÁeÃätÓJFæbpFõ¥=?Þ u˜`$qÊQ¤O«Œ¨¦)á¸NóR?ä WCéIAkåjëàsDQ<œw¤»l©gÅÚ:F¸ÏQx :ʪJÔÑ>Ç\<¯…¥•tuöëÃÙü Üöó”炞½”8.êÐãájÀÆ/†ç¶˜t¾Ýny…©Î ˆ§©”yímNÏk¡fîmÔ¿ü™-GïQ`_Cý4k¾'uSP_G ðTÇÑÎA0ÅÚT§Q36¬ãCý@M;-ô=šö #ÆŽ^  ›³M·ÖHÐeÂk¡ÒÞ9À=€{zl]† k\dȵ©LºÕŽ>.¢Ž|”°S[G›Qül¶D0@³áÌý³&NÑÔQù¥@Hø¬¢öɆBÓ^½ž’°ø=¸,å'ÐQüj}÷J2Ôv‘í+ú^¥=€,r>Þ¬Ïèÿ:ZÅ@œrz’\ÈÕãèài‚zÌ‚H¹¦Å Q>LYÿ¦º[Åy¼ÓÆæNA †h‰š6UuÐ?Xk_—êè*ë1è§êŽê”>´1ü’´>=Ñòh¿ƒAzA憈F»˜ÀÄ6¹?0J-Ï€]òA%¨¨8½Q«DÜ¡Ðk·nŽý¢~Å»tŸžâ÷dÓÒ£™ v X²õOüðIoaʺc&Òm -ÍŒî2kö ÚÝC¶ßŸœˆ „¬Ž4,_^)§9è 4Û"ýèã5'dfF:/ç»K çSË¡´4c™6Ví:©£Ñ*M¦PÚvšAX)œE[™ŠªL=¨° ' }´8n»[èHÏn ŽV@Þ9 MœchõÕj‹–Éɹ'7{íšÊß¿ã–bü¶fÙ3Ú^Ñs±Vˆ0l~Èùá©¶œ’Æ6˜:Q“ÒýÎØ¯éáÈay ¤Ñ«X<_›Ãöýû0)~œ2R:t*Ó\E~ÿÎa ¤Jê(¥ÿ¥ZÓsŠ\½»gz{huZzVÝ2]¿`,Êk /uZ­“ŸçÇ4UOÓÚ¡–{òóÒ4ø³ÖÔjW`c¤Ÿ¡™ µŠP>;à³#öÓÓV0“©ÅÒj‡|:VxKÐJ BZã*COÁP:†øF<´Ôá ´ôÎuNÖqÙVAÃi¬ÅÏŠšžw¹©Æžö¿ÇàŒ!2 ¢µ¿uu€¢ÚTGCüIYkåí:cîGIüo×Yò÷4ÿÝ~¬¢@f_¼P…ÚÐÒ?œIÒ,¥-ªHxÚ‡P‚Ò7µe²5††E–bÝÕ†­0ÄÓ¤¦nê'h‚0¢nÕÓ9AÜElV¡Q¶=õ«ð°¿ê_õ—ü~ 8M.óš{5û®xÚŸÏÇ·Ÿô£µ’åôv¶Š'³þaðÚ§¤d›ÍG·º¹V-n9²æ©ºg9ͯƫ%AXV<ü:[ðË‚2!ÃÒ¿ûÒNµáåj1¦·ø^·Sž.s7ò¦³Ú(w8˜M—K6•'[º>t;z¹Ê¦ï‘"Ñ¢XŸªÃ0­Ì´ñtéטáõxv5™|fÛSÉÌ ¯ŸÆ×–¤ºÃ›ÁܲPýÁg~ìU+v3_$÷ëð¢³ü4CrÛ ´açp¼»×x|»}ZŒWÄö±i¸èdÖüì¥æh2¹™-WFßF¿M§üsqwk~ÜjÂ?è\½§}ð¢ÕП=íÇøº‹a9 BøoM‡Õ(ÂBO=}A’ç ’ãâœçÄ”à$Öµuùª7¡át9Z|ÑKn¨ lLÙ·«z‡PvÈÃù@Þm"«'–‚¹ÉèÛjt;ä–;º:Ú“¯MñœžPbä #Åç‚Zí¿ <,ˆ‚Ž—Vfkì·€0@‘†F*}â»ÞŒ°¡´ô _©dótk¤ÂBaÕj;ÓöÇx ^G«˜c/;5åhÜÅŠ ­|D99_òzh¶Ì°DûG2‚²?@{Ⱥ¨V©Äi©ô}kJ(ï‘ЙÒÜ£Eq$+t/PDÉÌšÿ,ÖÏ–lЩhOVÈÒv T³Ã|ƒ¡]ñ¦dÓ|ÅÍ囯`g½Ía3¶ß×¼&;Ó  Jµ%¤Q.e£FõZbK¥ `§Ú)x¯}9ô qúžu špuðÞûˆÞÆ$@Ñ+‹Û¦ÛØ+ÝY…~~°L™Rº …sRÕó H©Jt¡ŠuJ±üÛ‘ØÄZ›#_ªcŽâzÖèµêëÀó‡Ö!³ñïU÷ò“­¢`'Ïm Ò <ü“ÿOT3i¯xßXÇAÖ°Y3´Þœ^%þ`7ÕÑœÃï#¦L臧ԻÐáÑÇÐÇ:ÁˆRŠBš2÷Ð÷Àƒý!–È@˜y -C­Á¾¡è\¬vµMñ#RbDMÅü>ϦŸ¯o'8`@%˦ãÙôÓÈZ `z,Ên?9;¿P]ΣÛ/ã |]í¡4Z,f‹ñÊÐî½ù¬dট›˜µ2Œ¡ÝZ?5úöQd|jð,ÿ8Ö©uHQÚ]#4 €¼° äëÂÈÿ$Bô´ïÄèÛµóþT2èèÛ|¶XIïìR‡æ¼Æ9~ÎŽ?dTµ‡ô°¥wKOÕ¼³A)pþ{ôä1dñKz<×»)†—†:êÒ’u|'™á‡ã4Ð\G‰‘¹uÕvÔa׆՜gUnu »’Ù`á€PüÂÈ…m^[‘\**˜W“½¿OÀëò=¤<:¦`“ñ+›¸«îvÅ2Z§YWúý»æUºmeµlú°}ÅY¤”-ž“£·wƒ^£ÚÀ ?ÿýœÑËG»£è¢EˆîêüèsFz°`~kcEþ97$¦sMŽCY"‘dÃbí¼é*ÖMîúÔ‚ºû©0ù™m‹Hh‹í}n¬ïInŠØŽö2‹¢v³cví‘v\Gq‹X¢=/¨W**?Clè‡CÅV?ˆNSú¯µ˜ºnõ˶üÑjã6ÇWä¹ÅpCWfÄr“ñÓbÐÔß²ýô' ¡w60l›3ç˜ ñ+ ꥠF'ÿÜH”ì ÓÐ#57sÚô¥´4h> ï(È‚Ü'ñóô yVÂq†›z©Î{÷~¦žF02‰~¥Ó„#—ll<-Üd…õº‰”Ê‚``Ó /Eb€À±|A“ÌÓ³éžÎŽ@X}âéy±z÷\|HNü,¥è7C¦c$+µrŒ>òæ1 ŠRD”£ªc¡P~›Òz@¶>¯xцÚü÷©QìÌ×)*¶«µHv¤”jËäDJ%!2&( |57SF±[=esÛgN®£>êì²Ç‡t%0¨ŒAœr < Õ÷r–®`|ØìÎÛ¤è²Ãë>;³O ºì„bŽ# ãå(¿ï0Fž)Õ±‰YpWj•Nqôaó¦-r–)ƒWkЉ¡¶ð ¨yl†À¾Gê½lô’ã£éE¸y–ãi\B¤ùÑ7„’Òß®Ñ©Ž¾Â.×¹&…Öù7G†¹c¹ŽZÆs&b ßϯ;ô>3§8+ °”%±¶£nëþråx+ý0x=ÞŠtÅêy4æ«EÀïÊýK‰ÖCba5îŽR$T½%õÚõø›p‘ÔøzÒÿ´ä7¹jXß®¾ § VëBy“Ë%唜§£Lv <Æ a“ v§Ô~l¯x,SŸ eÓþòs|}'Z|/g‹Iÿîvp–\¿C|>kD¡.fIžíÑÕˆ©Ô¦Í¦%¨+±û!åw‰¦~Œª€¾y«7l§oØøÊO÷/Ã8v[¿‰ÜòšŠùƒ&` Ÿž\ެ«Ckɘ¹ªUjHVj,mv [@ÊœX€ŒÈ VeŒ*}c'¨ïrá×uŠì~P/é,þ1)3]€¨àjš-(÷™‚L•|í¢‰^¥xzr ¡|’1Ú­ó"ÙúV´_3b€o^œ7"ïz»ÃUn’ϧº¸ër¼ê$ “ Ê3‚pÄáZ~†¶ë` =%î*(ƒ ]º‹ÊöAÐIöó\¢šeDH“©Ù»:´ÍMúød_éJ¡íšm=;?“/ýarÈö©i‘R¥**ƒnmHQÝeÙÔ´¢6ø59AînûZ“l9¨­Þi*º z˜¥â ÚW÷úMv²1Ôеv‹Ù šŸ®l¦*ô‚¥vUüň™€zé×ìCZo Ñ‚‘/ÈJB×ù™C–ùŸfß®OkHܦ0¬öUÊÉnÔEòL”´älF!wð8 ÚÍ9«¢ºJÎ ŸÑ_rTµºã›/"jŒö5eWwl5«žM‰ ÅV’.¼­¾ÎÜ¡"Ϧtinƒþtìk)®)ÿ2ŽÜ€$IOûó1…˜5³ªf*îÅÜe¯z*àºæ…רæ˜D­PÍWZå´^šN¬2 íêðk”×xöjæâkßpù_ûŸÝÁ¯i¯=­a™2VÓU6Ô÷}B!tÖ*Cn]TÐPYx·Éz7Ì7 kßî jP[Z ¬8jƒÚûõ£ÊÇj€,,³ƒ´‹nóí2н‹¶tò,ÄÈ•pq«Ô×çÃsJ6z:ˆñø` Ø!€Æ‚¢¦À©Ò'[±¨:ÓÌ:vxŒßã§,ûñFNG8#O÷Òɶ˜Â§4)Z Ð’ï›R–âdRކ†œ’G0 bwl2MÔÁF`Ø‘î¶Û®)ÁH4Eå‹þêÌñHÚ•öçüä|¡”JźD0o«ŽµJÈ1åÕž¥€…éË9÷Ѷ2—7J)]¶§¡‚h‚°qY/UÚ¹OÚ§ûu‘°÷ÐÕ‹Zª]­Çõkœg¼ {J‹Z_Ðfª\/z¢K5Ž˜:ó'uaá[u~:O/ÕQ6oÕñ_££s";ÍêVªr’­¨¦:.µ³Üi^Ä‹Qás-/ÀD¢óoÑp4GGfsFŸ¬•ž³4 ’ ÌPàp Ÿ7¤[’T³#´d]*÷ZüN§ä¼:ÎÀÄåÉ1ë#I²é+©C­{È”Q=¼®ªRkÞl“Ÿâ.BX Gêˆ(´ Ýò¿ŸûÃÙ¤O2´iëç«!Œ&Õ¥â…MÙ =)uu”÷ÏCû²Ѥ@ç cø<Œ)ãzJ>ïr|^ÜN\ RHþU ÕTu²fÄ:‚žªc>°oÖi•ÝR äZ¼Ú:Úˆ£\‡Ð« *û:J”,×±±’ã¶Ô²oV–T*83dª£X¡ uŽ0ÛÔz µ0Ôå:è¦$ð0ZÐØ´az¹Ž°ÛzŸ nu´Õãup‰¨ŽrD£z)RµËu¬w{5nwTGé¬ËurkïΕrªÓŽÞø3Õ† xTþ“­R¬"Uçy¦2øŠˆ3°åïQj[ÒãRä_Þ-êý@ \–(l·ë€Ð7#Ô.Gƒáí UÝÕô#¤4Œú¢-¦=ð ¾{z‰-c§‰‰­³ÚÓË&Øå®mi[‰ê4êể9¸I¹1¡ÒörEf9œ;ªé±)¹ \gtإŠ8 [‹Ç¾Q§<8î§nlàE–<šÝ8L "cªŽ:þ¥\¨ïßå¿~Œû÷†ÕA·*ò¦Rz­ú: ôO„w.Nº*YSë˜Ó#O¼9ÒIó-à‹ A6Ž”w^]žTgô’§Öÿ`È^»¥4œÞ{Ìö0ñSb“ý6ôÉ­AƒQ¡ªÐû“ ËÏw©l"ÒÆ%ÒÃPjÆâsç4…Wq7.bV‘Pr1& æ1³MLR2»oDuuž^ ˆpe±ýíÖ æ½W3AFŠØž7'Št–'§EŠs`´õ]ªîê!¬™ü/û ßJuÔ£>Õ!߈ ’ìif^ÐB$èÃŒ5f‡Ý«ŠÈqͺ•Æ1i;‰t¡^oìØÑLÑ}¶>n«ùœôù°¨Šuªzc5¨d+}k4N^Ÿ³#Y¥6Où9eâ6z †’ç£v~ŒÙ¬JÝV©0]-æÂ(ã³Üà>BáŽ5é®ÔßãércT%ª£ÉVºX§Erg˜Tç3¤ìe”ÒÐmuÜR÷óM¦Þ ,ÌEY®`”¾Ý¿zÕø|Ú/ö«½R@À™R²“þ­·æWßôÿ`/‚H¹tbh çæoÒ7W.¥AÊôþÿGÞÛ÷¶q$ý¢ÿßOqÎb d=9|ÁŠIñ-R²ƒZI<&9 ‡´­\œï~»úmê×3¤¨¬=ûÜ`׉YÕ=ÝÕÝÕUÕõr%mžñèòÒTµâÛA!ò˜8bý‹›ÑϽ‘ŽAsU¿'n˜ªRÚI¼¡ºtéÇ ñ톳UÖM“z‚oZõãîhüa^]›r²p;ôËIG—ÍòÑK£oÜ*X-0ÈmžúáíLó:*˜Yg“¾yF£›™) qýÈ*& ð1€ß~›“;³ö6„Œ­wfÓë`8ÕO1½¬‡~ø«~x÷Ѭ“Áhf• ˜ô¬syk"#8Ãk´žoLl1&gÔ0í낹ßú¤Õ†»mDù¥LÝ̨ž0Â$G£^¿o´à9-G°õÈí·ºÁ}-ã²(Hž|¨¾Ï •ã¾JS]=˃7CBˆeÁn¥+Éì)˧|ÐðT.v×é~Lg[›€ ƒi#VÎǦO‡Í'£ÒUj"{’Á+6ö¸7T?ýrÄ[ æFF>‹b’G@hàӽ‡ ò•eã9M)A¯b–¹8•Dˆû£«°Ko‹ÆuˆOP¡ FÆ×¦"È ó^Aý¨X²¬ÀYò {mƒµÀ<0»“Q4ºœÆ?Lþß…ÃÞè.Š˜þñV‹:D†ƒN_œÂ“-Ô邘:‚Ù˜Ã" kÜbºÓÐÜF 8Ç4³Ä„‡ á•ËðŒ[x@ù0fáñ`$³að†!™ƒq˜›áŒ£Áø£^40̈…Æu«³»HãN÷ÆÔ0òÛÀ¤˜å Œé¤3ŒèAÐÔbçGØÆÅÚˆ•‡Âu‚H p®&£©üµIãÕ„»N`Q†Õ=™#´®Rƒ»U"ä]ðFÈ‚Ižá…pÊÛ ¼Oã«*ÁBKÁî ^FóO‰e+& ìëù6¯\v¹›?® ¯¸­€t j¢g±`iäª2ÿĽÄÔ‡…'¯ÝKbH¹$/óhÀRK”ͳƒR¯8(dl¹çYô×2O"=U™ÚOÀ6æ_»ªŠI²tƒÑa/ëñ¨Õ'm„-µ<ã!F ¸qŒ6¼ÎÅü«P©uánÊN¢ßªð¼¥°ÆvuëU‡ŽæŸ“ô›Y!)%Õ~Iþ•¼œ#2É}p!e‡®-éB<ÈwÆE‹ª)™™hKç«„1=l„ÎHèK³ÿ`b(à=w„ Æ"먎6Y,ë£blîd-'©Jä8 ²¤‚Œ%Y¤IF)QMáX9ÑJÈòÁìóܤø+³@ÑV 'çLM =Ìu|§Aðê.ÂX{SôV05.(' ¡Ž;I¡ð âuð'U‡?ÏLh^‹/ïw)i›ļ@âåLð,}Ø›n–龤ñ>R’-îH¾q—aÈÕVæÐpc#ˆ¡T` O&-—µb¯ðà +¿& ¯Êd!7λ˜Lƒ²Pâ¯ñƒ–cÑqŽ„¹uAð }˜$êYN[H¨ÖØ©µÓ]±ØùéçD˪°«ýÒ­tm#:ö&1ó‹#Ôæt³“H‡dNî3ÏÅÛò¸c²âÂ)<6j3¡pzƒ©õ\Çx¶ÜS^Jw|`ÃáUç&¸ê›ì!üÆŽ´{Øþ]çC¤dP1ÌU@j,°QäX£ñ44(`Z”ÑljºñNGÑ…ŠÑ%›,;Áò‚°`zNMyWƒÇ¡ám—çÒÇ¿a²§Ìe“H©¨Lqf7L¾Ä«ô1NWë¥朲t™×Xs*èìd»Æ@ð1¥¥Þ›h5Ìë8\eyÙ ã¡äIÍ‘êìy`¥´¥Ú-d‘<,7*U§y·®0[qžsOzåõð»‹$¦L¢zfÒl Kšn|Vâ‹,…ä·6‹dâùh¦ëC{ÄÔI]µÂf"Ò&„% eÆ-AƒÈ4Ü )Tq-é"Ó¾‹©þ9Ýèk}É!]ÊÛÌW”ÎèYzÞRÜɇ\ƒ)S³(0æ%/G7ן;²È2¥í3>š„W!9Æ“HÏL}pBF‘­Þ«%ux$`ÊKNžic•÷]&á šPäë†lÌ9¦8°ñè2¶õêIWMwô±Ü ¡HRöSúÞ+àXkpÄúNç&ó,ØÆ Šâ¤ÖÓG`5k&FsØ%*r—ðLwð>¡CùZž§Ê­‚æ’C3+Έ›´PÚœA¶†:Nš°lž@~#Ž>nLJìi’<ô¡É¸û±øUÞòSíSÓþh¥oæ‹ešé§3R§ v”g i¶À`­ ·óÕ!1`ÎF»å#U§"™}“»Yᄲ¾¬/•XÖho²ãÕj¸ÍPàÃð*.QŠïœU›$æÅì# eê`LªX~“rLciæë.©ÍUk00( S©[à02¾¯zc(Âô¸ËŒ8œnj+S« ’½€Äe#ÊàsëºaG‡8ƒ9[A˜¤Ùv&3zV{#S[ñ1¥°Råð±ZÅòYùI—dÄaè6‰)„÷­Ðftâ^ñ×ߺÄd Žq0¹ì‡&î º b§ê<®ŒÍáóDõiÞôA«ŠÝ*¡jU8!v䤀»Y@Bn,‚§S!¢‚Z«¦±”f)¯ž}O–é­ö4ZÏåèðO57·ÌÿfÅKé7vØlU“0PÕ„z&'3]Ixõ,ÑwÊL_Éð&6uâ—åþ)ž?<,U‚@ôû9Ñ„BWª h²I/!¯¢,‘m3Áì¤k¯J,í¹’ø—²Tž;¥xÜì©¶ÐB7À޲ÁU²üã~¶§ºŒÏ:›sŒu“–K¬psjLpWK|·ªcÊøüû!ÙÜ?Çd\ùQ7i¸ŸKÒ[‚IÑÿ0ë]¼I®ÉˆvY²×EKZNÍÕ„ãÞ?¥™:¢“X­šÐ°I¯’‡½ÙW‚Øz.µ…'ÉâpO5 É(´ÞQjXs•ë½ÝN7yRGm!§›¤ŸõÀ ;øh“íN¬röÀjÓc]QÝ„<9è8Ž'Ý ±­dU1Só”Nc½}nó¯00•OS?!rý¡=ËhOÈ&X¢Z4a‹¯¤L6×U n&“\_Cïú¡NƒSAQ Ü õM(˽áÈ\a1×^Ù>Î#N£ñhÔ·3q¾2ºèƒ(ßP1r¨À‡Tn¾‘No#°7ëB:l ¡à˜\‡]ƄֱÐe=݇½*í§mv:YÆ“ÎQƦ~Æ,4Òm@é$ÊõÐå–$‚çe6:,3¯Wè'Ç»4œÎ Ù]µ0pƒÈ’$V 0W¡¤ ÉpU¬nw¼)ÝR}GEætêÝF†Ç1`§ŒÇhãXH)_ÐÃò«QÍÌ÷O?ê·`\æd÷À4gzª&»ÌT—¤Œß\ƒ?Í7ûtmràÁð4'¯‹m¥{J>óOº·ÞšŠ’\§1ŽRºŸ¶8áØŒyAO²À6[¨Áôßl¡el‹ã”*×nL©Ó‹ÔË`Ò(\¬„¦½—éRü—RÑ3â¿Úá )ŠºJI¢ü”´%_>h¨ƒ@nKx‘¨†¢»\ © uÀ—MH©PBS†CëÅ–[ [|šÓj¯©á[+‚Ôs¶ÉèØ("Híç°1†O¼7J´‡h*Óˆ›';P Î2U%4w¸ðp•ÓmG×îZìRYÜå ®%=Îã7êDÔ™8o³4AdN!yMãà áëòòiç],sÿSj‰ÌÃBK ^žÅ6ÊAUòÈÃÃiãŒKÖ”Ô¦ì®M®¹©‰¼¾›n»d;zÎîYŒh-d63 GôR¨A&oäÉmñÀ¹Mã‘ôøQw+SƒZufI¨*"Qf)Aö ýa+½®d›Vq*Ó›¯BŒ¥£å,æ'ÕM(j †J²FÚmIJRõÛ b­RDK'f&–/¦ºI–bÍc˜ôuÛ_³}‹Q _i¯¤ÐöË.³ä2Ÿ¯8 Ae±UEv?¾_IeUâM¥­÷<ûÚ¤óU’É,⻼Ú9–®§6ÊO{š*¢Ò šmeŠ$»ß)oÃR¨Ö{úh›à+ݦ°[ÊÛ„)ùþê6(7m3ú8IÌØ ;¹¼Íd¿šmïu¼@EzbÓj½ÓÁ **Eó’ÊùmtÔQ½Vu7¬Ûæ×7Y™6. °1ÿ©l½ª¸FÓå¦Ì±¾ß©à¿7_ _ty¹øÏw ³Û$û1[43ûÓÃ=-Ÿá·ª˜ýaµŠ¿Ì?™#ˆë _e„m¦2Š-×øGÜUóðO¨ûI° ùGR¯—Äòa×fmõÎ6£k¾—W‚„¿vuÔ~Ó­yTCê§:K^á©`±Ïõ­dXDÅ9îÏÎQmEåò¬ô)G&Ø*Œ»T(\;s«é@ÙMu‡½“»Xe_ÛKVòU‰'ôú%¡â0BÕf˜ÊL*&ÐßtçRVè2oÿBw2Þ‰ö"sZN¼TÃ,ä#K™‰[PÏÞ+4‘Ï!fæo²ÆR–#¦jö¬sK˜6ÚHš˜ßÅ{ÇÒBûΖ·éªªºMÛ%Aiý7óê9mÔ5ñ£nÓjÚhQs*k¥þ5Že¹±âÄùp­9ßÊ@/¶‚ŽEî‰ß&zEQm”1ÿ°ß§›kY k÷ÎxMê–û²6‡Mòu«U¨MÓÝhÅ6±ýùŽ3¶Ùz›æÞ¯¹_D«Š›T}€y‹zÍ+v®+ZØê!¢ã†³{ MŸ[­ðàa ñ$Í9²ç;{•£d³PÞ¹&ŒBZMZÍRLÙçD ¦ö BuÞ¬WÎnò‹jâî5hbÊ ¼¶³ˆ²žŽJ©„Ù«§7˜{ÿÚ SY¨NrÝü"D f·¢ì‚¢õ2 žÔ›ÅY•Ä ^èê¿oãY–ÄÿSza ýL•2stª/:\¢å£9ñžÁró£åAF—hk£O¹2G/–;v(p̶Íb©sYT Ux”Z× øå]éë…ACÛ¢±b® o¬ÚèA•+¬µœ­\À¤ïï îE«$Ùš/×Ëqîæ»u` 2Kmw„ºÔoEwTmA¨„ÂÈ5‚g »@#Ô BÕ+E˜mlƒÙrWG]è•d´qíîõšŸWÅßÁ½KMÉEívyÕõ‹[[¡šey5 f¥¼S¹(bÛVßF†b^a!ª÷62´ó û Qko#CE¯°â µHÅZ½|R$BPՋȬ}­°9âP(Œ¦XÜ;!ˆ*]¬Rº†;`ûüE·²~x£—Vk»ÖKªN» î¢÷2>(ŠøÑ&¤”w•,„§›„êÎÂÀÓMs-Z·Ïo¢æ‚éÝN7«·Œx¡‰ºr*.Å&É|»]=“Ü®Zk½êÆ»û5‘A|—.ÙT(9/GëaCëµ­³Öêd1­Rôìn õ6N øªcJS¿O‡€¢ñUô_ ¤¦?›ãFä ýñÙ`:½Êû@ü[gÓÑÖ]Üú¶˜“GÜšhÍ_té©*Ïr)¥YS:“i#“¼Q+ݪwËõ|÷ÜëÎïŸ]F9¼B„ÂÝêóùN‘Ü“NÖ¸f² ™I‚&›‰BæðþP •Ì$ɦi‡‡ã•t«þQZTâ Ž“Ÿ ¼ö ®<…©—t 6Ëc¡M ‰¨ü*î‰ÕiPfQÑais¸ ½DÁI³1ý7‹#À:A C]éÎÚ.‚\Çq‡R„¢¢éu<ŸÃEdMå-O™Z*$wÔ6lw2‡º³bk¡×Ð$©p“E$Ô–Ü×í_¶Ž%wõªfW ­Y?Æ™¾9î,þ÷!Û›">½I§«ò?²p^x(›ôÂAç*èëéµZtÐÖQ"ð3%“â©Ýä%™œa™'Aïb4Ò©º[`& ”yÑÔx VA>°Ù˜quR=bï›: t­·x6¾štL ]vÉ$躢“ñõ‡(쪜uä›È7›*a"/ù’*ˆŠFÖS×ÏÉh6ì‰ÏÇÓ‘â…Þ¶ØÂ?ãqG…6ƒççdÜOFïMù5¸>&‘Ê´iÞ×¹è4™ö§×Dsz¸6 îa6¤°º‚'—bÅE¼¢î~WñªSS «ÑÀ„vuÜ ©Ði’ÇQQ^! ±À¤K,Ìf¡«Ïk»VÅõnë(4kΖSEŸûó?žei+JÔÏâ90‹`™¦_³ÈT#"ÁGßé‘Þ½úK[Òý’ ž‹ö J‚òÙV«¡yVWüI°«lWóû„ÇübP£Qëv¦ƒ0ZHÐL«±òyt~/½Ÿäßåå¢Ý@àTëþd|OþôJ ä½"––]ØaŠeƒG¯«óûßB^?!Ô¤:Sس¨\ÄjoûùÎàÄNìÊb£¦Ä™-#­†Ù;!gäVxбóà(C¯bq•AK MÖØ_û•1¿ÏÖÔÎEF/ðÄr±ÜK›Ðý4ýtØÊ3ðÏø‡Y_GµÃaM䨵0"Ký 8"ZÎpÄ8ôˆ>,“ÕB‰Upj+|…#ÑÍàa¹ª!Vn{Èä°KC!YfÇð ùbƒ¹GÇZä"_Mò.Î>-·¤àêðJrüòë¦VSÚ l1CÑÅØË µ6 !ÁrwX~DÝn? †¦¼+˜¶£.¹ãÖ ”Ó…2¨ShvþÅ~QÀ9Œs–ë\†ŸqU5 y JÐÄ–:ð£ÃÞø~Ë|Uì`¶]ØdL˜ÝṪjÓ™É: °c®5`:kE`â·a5‚éÌDüÀ‘Œ®ÃA,D›pð|&¾‹Â°á›ãþ×`o‰Úm~®¥üôèr*îLSC¤ê€x­.Ø Ñ8{Áø|hJ®l|±1ä…àÆ ›Œ ‘Àw‚`·ÑØ|’³-!“…B0¤4â†ír°É°.SÀ—gƒAgò!DWà=F®è¶{=ŠÌ6É;zŃÎ0¼4Uõ|ôR‰îµžñL2ˆ—¤z¥·©p^Så´Ž+%.¹{s0‘ßFÕÉPcÁÄöÑ}²™ -Ôæÿ…C„1wÑ}¶tbá32ZWæë f4cRLÀ’¦ð„òÌug”ÁýLÎ5p.¡k)“ïÊù€©e.µ”z»ó£ñØ×÷d¾ÈX(±WÝLÞĈ7þô¢/„¥ùr³Ôm@:ÚÆ¼ȯÔJZÄívµ41u ªáÆ)Y=\ ±VÜ P“ªÝÀ¯¯çÛ§tg5XüÐn9/ú!¶.­TÀ†Ò '»<ûNµY€Ùì;m§qô¨¡¯å5MI£Y@Ò1ãèð£ŠÜ› R­1¯@©ÝÂÙD”ß~ƒ, ʲ)åí–w¢‘HbiŠÉŸ@ó–wêKúpêȳvlì°:ÒJ¿–kñ&sÑU|©öRA§€ªIý÷ubÜfý“ƒÏºÄ>æbJ×X>ôv o‹d/Ä?e³¡Mo¼øTDÜŒ€îûD€ÑhB*îM0çEâ<­!Š÷÷9™9Ñø˜¯5RÙtyÿɼ{šw>X#¹Qdª¯ßîólÊ(ònŒ…š@ÙäµmL³ˆñƒ˜î~·$ËÎ?46ŽS{Ó²r@S ¦EêÞ’J=ÚòìuÐ8n¤/î‰Ã.ÁŒ‚ Ñîæ«OÊ3:wýDɰd¡ñÄ$!}pŸ{.Ã+±Q:HëÛro´Aw×6¯X±%ÍSñ <¯?(¡”æôÄá¹|YÃÈE$˜²LU±š¦ò_Xì3“zÈ&¡ÊLZl´R-ê±o4‘óG>âÌcsÿ´K7ärà ¼H¯ìnt'SM E;ÁÒ/V%Ù}ºË‘?KHMé"ÄØE¨Ú(ÅÈí“Ô ò…Ä ¶SGâ¥qú¿7Ö/¤Ÿ•y%Ï ƒ9¡¥m“ÖÆ­7Р Ðrý]æõi»pnÚ%C ² …bùM¬­àdÐYªÅÔζRK¾n„Êý¸³l =p4"Í•‡Õ7°Ãâñ 3¼ç°ÛÉâ­RH‰c•Ca_™¾¹OB³í­ å6]ÖIáᢎn°ÉÍ&À]¦÷ „´ á4¡LÑôb–¯¢×Anšì¨ÂêªiÍÙœÁʯùLÄÙŽFQÁ¬ÚÇÕD©R›Ž>rÆWÒf¯ÂÝ(.Nµi€ëÊô)‰ga¬„íø,Nä´?K÷põ€‰bµÑ5JZ˜šjèELm´[¥ Z~’®r ¯¬JÁ0à´Á çMê6pñ³6ËÌÖɡа|UmªàáKm¤ûUÙdæ2øæÏ„²:ßëù3‚nIM¨ùƒrþ”é(ZÎ|>':dú8ÝÀ5E´¡¤ñ¯©¬£"3NÔòÒêjߺö¹mhKè6À« mº2"AúšisZÒ7€6\ºß¯”Ͼ®š„FQi¯¾š¯ÔNÍ…î5:ˆ?¾9Ä‚Q«¯øÎrbJ#£0(5Ë›…>õÖ©é©h%N[nÇ©ŽÓÆxÈbåwÓTlšÉ7ÿ¹m"ÝFÚ•cÁ§Ñ89ÓfrØÐ·t0ƒm#.3ÖÍbº+劦´¨z=OR-:|$iZ¶šê&hÿ*41?ܧTæH9×`ÆýB“ÇTè/ógÏv’ÈÆ}WNŠáÑ“?uÌâä3®,÷wæ+­Ú©TwŒ’XÞæ-àÈYÚ‚’œæø ÇMŸ#ž%þ57õvbÑé?çPìId‡ÏR âK¢•fe ‡5‹6ô ™JèbåÙ(ÔI¿FaŠÐüa…œCp뤷½gvA¡ù!„ö*ŸÜ¨Vƒ,ǬæÚוHR#re'pÑa„—É U…ÄׂğÚ3•ïô¸sûÚ<Ë„B÷|º0)a¬;‹ÏÄC§B¯¼SîvðÛn€1]o§_•h/5E,LáXâôS²Ñ”nš¦â.Ú<ÓJ›¼’±uS× •‚¯nUÆåœ²½îæ m$ÇRå³íÖMÀ Wõ,K:«½ò¡Œž’Õʤ¯æò‰@b–¯z R  Mo³Ðyˆ@µœªf\ž–‹H%.Hرi´à5ä¶]tL¾kÐ"¤÷ah \îWžÙØðŠ%`ýÒÂV³iØ7 Î-nƒaodŠAÀŠ*ˆÌIÏq0‡`BGð:4i§° ì °‚-éì˜Là-  ²ÜÝô$¼ ­š —9—Q鋙͉݄œv·WTïómô!2a€Ðóu¯·Ì>ik7Ù,A…`u0‹ ‰Ë•rÂÕ9´9J¢øø5]•†aÀ›ÄmØ FÆÂÁˆŒí{=øÙ݆B:cy÷àìß–ð (ɽF7†®ðÁÈpäX»×ÑŽÁ ˜W$ÔQ°tµ<Ê\y°¬:;9m»äm) …$øOSÔ3“Ûùn©šàk@ÓéZ ČЗ’Ü·[e] €:6¼ƒé6âÒ?¬öòÁg8nWS2Ù/ËÍ!Ï /€;Þ ’È`V“ìL€›§,ÄòPIEÕÙ Ô„‡g_㙜̀ 7ÃäÏ¢¿ZIÜOXtÔ,ÿD -]+Ã’Ca¢ÏB¬V9ŠóÔÕZ¡?]ÍÂÔ¥ $äH–•BîD[EA…NkÜp¼R/‡“‘Ì|ä‡Û…ÐY,ô@ÞÅi’ëÄç¸>ËE’¢ #Ž-šÐÁáÃÔ¶¬‹ò‰ï’¤—len¼V¥‰Ë§0­‘J([¤ßÈä@doч®þò6Ú)o/½¨ Ø€KÚhÝì#qÒo›’ïè|F‡Ü·)å²[%Ê|.cª8Mïjž­ÑÂÄ+´íìeÍàiîléƒ@KHúEÛxkJ®Ì1è‡ßÖw×AG?âîy‚ÇÁd"®Y]¸|L¯G½H-ÈÇw×ÎK|(ì÷ºI2HùˆÐ/„æ~£‹)€Uì.V›Zœ„+A(å’y-çB€jžiÃÏÙÝ ìŽ&†øàc.@6Åb òÛoÃ>µù–å{¡wå·ßºË%54Ù¶ã®NµŠÃ¤V*]+t])|9§HÇñ¦‹ 9§ÉñßÐn2q$¿Mî¢Q÷F–¼`ÞV`¹¿S5/ÓÙój>yÔi£‚«¥#Õ€IWàên±Ô>¯¢[íXÇón¹©y& &¯= —nuê7¦»Ã†Òß,‚¯{ÊÇ«8¿|#€ /Yå§ ~/w<á|WUË‹ö¹›h͇z]NÏ<™TÚPðõ~uX¨š:ZËs¾Mh±®Jãaµc]¥s›T¶ ô6’l‰åþIÚâù–S¶š,‰ß„MÊ ½ÅÕ_Þj“ÖdƒÁ|EdòÞegJN>I¦"\è6à•$Ú ‚«èÇ7Òô-‹Ù¦J¤¡ËíÍÂ|‡ÏI´2ðÅHú–”–÷QçÖdƒÇá Óë]él¼WÁE µH”e~•þ“¤ ñ#/ÁãQ?”A%­ &Á`4èH ¾å¤ýX“`0º ô@4_Ýß~û{o,þ'¸ë;í…›$‡÷GWï´…L9†Ñ~¤(ôfuÐÆ*p3ɱgCÍ¿1]NŽ ÞŠµ" 7ޏ‚¾ö§ב;žÎî>¯Ùí×µ³u£w<¿Ñ*Ö€„7¦Vi½ôû„²5 ão”gèÎ6Ã^Sm‡*ÿX¡Nük§ÿ­ œU;ݪjZA´kµ›¯óî)n ”üß~#AKüÙíé5ôq‰LLïo¿Q9âÇ'qE|e\*É>×)o¦Ú!g‹Ñ—KÓCbç­úBìÚPzbíTM^›ðjÁ‘ÇBÛKª”'Ä!5NG[ðŒò^86a})d~-ÖêGpmÒN˜z£ù¶öÉT¬=¬¿ŒÜuxNLl:z>ÔGÙk”¢t“t­9^ß™s$²(Òy³“6ÛX¿ŠSëd£ŠY\¯~²ÍêÀ¿døVÐ|©YÅœúÓãã¼Åß“c¸jà9`‰´ñ’2xb>_ïz=“:îŸà2gÚÂÍVt™kÏ<µÑ¦ñqð9ÜÀáŸ#·]5Ž"N:wÆk¹ÁUtÑé+‘È8ÔÇ0cÂ0l£Û^¤'np]™Ü‘¾·¸'ERUèÊÉÄd°pίӊr Å{tØ$g3uÅ[§Z] CU#ÆB0z£]oÖ_h¥¸'¶jU^jÅcþ»šÏ)i•7I7úrm·OްŸ~i¥¦Äyû…V0-Óªé½Ð ¦eZ9®Ø ¦eixr„:åo>7ݪqò[jRòÓlÁªwj Úü(ÒÄ=Q%.E«ÆÉÖâ§’ªNIû"öa›ìäWt:oóöy­tà—Žk6šgµÒ3Ò­Zµ“­$‘d#hbŒÊÎ 0ìGâU¦Ãµºcãý…1ÎÄáh2xó¶­#ÞšÎe FAÏg–k ïHfÍJ٥ʢ§3q*•®U­;z€N­e TYŠùðŽÇÀ@5oôÐ!†Ã;:TÐáÓ9‚.ö¬¿ãš`vý‘Áv%·ìëΤ§c?e÷^ûÌâ& ¢îD·k¼0zlwvu;gÝN¶Ý ó½Zõüv“ ÍL;ÿ¥v&VüDÕª5!…ýt;º÷u,ík¾'-øÚ.\Å›éd;cá’ß{‘.<>µá¨jGÑÅ®šM&¶º6Ð.vºråWAWŽ””7#—³e['pôqª£™ÀÒi tÊdž³‹5”ƒŸô;³ÿr;ŒPЦ GeíT)g£òUê'Ñ”ö§†%S.›äaí×´û¬6QƒòIU^huòäœS\Ò d—“¸ñ⇠Û^—xÅ”µÓÏ%|”Íê‹­ìêæ£ôëUß;»=‹T,¡Ý~©“Ý1/Ý tíT{™ f×åI¼š^ÛóÎý;„•¦ÿ2t3òô¾Ùh‘í²ëvQ²2iI=ßÑO6Û+óE1£9¹E™KµýÖÛ^ò@Î fß;¥ ›¥äÏ7È Ô®Ù|çÛQÒÏæ]åéf“®Ô1rް&kD"…£ªæ{~:¹¹»‰TÂ,S'ÛíÐÁÕO€Òä‹lCK Bv« fN9¹}úCÙá­Ñ~§«ÛЋ¡×ßÓÿµµZúç *]lÑæØ;3ÑÆZŠA¨ük¬ý¢êÛœP·šß®ç:4nMŽÑÙnÇôJŸýLaþo³ÅGµ7«Ž†Ê›õfƒ1%Ó~ÛŒõ>rL(›Î×Uš‹nåø€ æÛéz«£»?¶ÑPÌmYqž*8îDÜ3&Ç‚¸¢*Ççfâ>ûm³_¬Vo+]çÇ« „vJ€JåeÜ7ƼR¶\ìÎvIVl1‰µÞCŽWÞLEø[^Rk¶Ïo#xÇ…æoÎ;ÒévÄEt;¯òŠ1N¿*ÑG¾ƒµÏhÏ=,•×4ºWa ôß8Öì>~ó¶¶x»Y?VÇüPÞÊ9Θ4öX#Ê·¿J̧(@ñœ ²¾?ÈÜ?±Þä^íŒFî&wìÖ¼=ëRÕÛ…)€ÅR{¹y°W¿œmö÷«ôñí^g«y޹{6è]Ò]rØèç,ºQŒÕÏy¼ïrv,ÔüM¶Êþ©Ø=ôl¼E÷©.áµ[x¢´9Õ®±õèsÆB™_åƒ~ó‰RÒ>,Wo³g“ݱ}íì}½>!UR„æKí2-qܳvž{‹ev+ôÓGÊ詌Ørέªï˜hb¿MöªH€ï˜T‹»0*>þa« äýC{§Â¼âîŠÜé3³>\r§é^gqu»Ä1¸|Nb «‹ßÞQXª--ç–ü!Rg²¦zèºv$CÇn¢©oñwè™3»8ÖëS¡ø+ ‚](Ö¥”ÁçÝ›­)söÞ½YLc“ŸÍX¦|Öó¼×sØÒ™š­‰ «Ãwt¸¡<޾$ŒãÁbåÿ½7ºxÞ«49e®fÑí?TµV–AQ%ƒ)ï ©kR©o#«0e*l†Jƒë6]—ÿc¢`Ï@•ž`4­D; QúO_>ÃgûÈ´9:ü[JÍÔŸÇÅ+ýG1ÆÎ½©MB p™ûyÿ2 &b•5¾˜Ez“àËõü^gÜ‘%uøúΟçÛeÍÓ¬_úPñ­2ðí(¾Y…3_ûÎV…8ÝùÎï(¶¾pqmMlÑûUu…ÜL‚+ €ѯàç‘þ<Ÿ À͸]õ/L‹*·¯«Žbútt `ë0h˜“àÓncˆ4u½¦C«èƒn^0jpXø`È×ñ|·ñ»}½Rñ1ÏüP‡‚a€úü¿û¼Óá>X‚5ÈG%íÏ÷ÚÁ® 6^ ² « |œûYQ…wµ‰¡WÁCÀ£qeHÇUÝÿB‡Õ`nL°Ó }Lý®€çÈÇ91”ãÄþ˜à+ ä_˜ÇÁeŒ@˜Ç[ƒò†`ϺŸû&$Î÷øûùFÝnŒb–‹û¥9ÙZ ¼#ïW™?$ŒïËûÔN¼‚ð&ò”ò^LüW3BèÌŠ² t÷ì_]Ês¦½0¬ª ­æÏTà1òa,:Ú©TâM -æ~ïÆ €Ó`‘ø©a#\æ€îµa# ˜<ÖxÅ €Î飷f†[À¨–Y²y¤ç=Ã~ù",²öK8è‹ÏþàV“L_ÉÊ×Eé}lÉÆ¯x¾Ùu|pÒ1ƒ–,¿6SǾº3`V ŸÌ 4ü¢ë{ìó«b‹Ÿ-»äìG†ùUíEát56W DY@teºjਦSÃö[˜™ƒÖ'øÕMÐ/ `®ðÏvÖŸÚ$ó;Ó†s¸0èÌ ¹¸“î¦l{˜C\qºê™à<,A×|£Ã5ܧ.ï@Í›•!Z ÇpeŽØMàÚ슪ÓbðÞl0?5 M 0¶ ãcWc³%ÎÇdžú`Ð €Ùy 1 @tkZ4 ·KSÀvåìÖŒ Èdï†éਖúUàÆs?4¬¸‘Ž1ìù‡L:Ä›ú°"yMíº/ïN„‡¥šUæ+ @sþÄÒp>þ .’‘a„B4|¨ –ó€”Hìá}û!¿¥½†Ó•æÉm´·ÀÀìs¸žý¡•À2û87ÜM°iNµÇEÎAp~\å‹Ï¢”óÓ¤ûäŒý1ûÂn]ÎtLráGüiÎå-xµÕ xeæÃYÀÓ|e%~GLJ|ÕLG Íó­‰'?Rm©Ø}ªQÏc#YæEh(úŸoO•ážë0;=Ãê1|­3K=âÖ±&ÒË}»JŒŒ%Zª&`î‚&æ0ŠtˆF!5:’H©_?†ÿYÇ9ªM&' GÒ„ZmAFÜSbšøÛ·Z> éi™Ÿ"ÐÂ¥1ÎÖB„³°3⸓1A® Ïîþĺ*⧃=3ç áËV3jaœl <=ûáòü/¾I àÁ¥´|Ì=\JËe®é€Öb¶×ýÓœò)·Ôj–B_4¢-Ë}Κá¡P©iÁï…åÁïÎM 3–=Ð { Taû (çxœ«kP~}ÀËÞÿžû?ÍP8àÓÜ7I ªÀÁ?-îÓ5מ¸Ð÷é“c4YP> ñÜ\!p‹Zû7æŽÄ0½\>¥þÙdààü)ý”7çOÏþYyÏW­~‚ïE«ÔïJÃGÄÙÛ­m:èöÚû}³´°•VŸýþ­ðÍ`Þ%Ì+C³‚ìz™K÷ðj¿þänÌ‘â—ïzÅ(Çg»Þ0ý¼ êˆ ¬²ßr©¬5'·$?hdÏN.£uú”oV0=®wl||/¬…”oú.Zõñ«@îõÞsŽMÆ&½Y¨à$ñïùžÄ÷ÚqlE¥Û€ˆ³ùèµ çÁfÛˆ¶Æ‚ÐlWA•Ø$þpl$¾ 6«\ðƒ»HŒìåÀ´ÙØï£o'I{ƒRˆ¦$»n))14-åÏÜdinаðÌë»@k%•`¾ž›}š}ÚmVo“¯úiç–Þ3ÉŽ“0e; Û9pÁ9v3/KU€J»¾Q9ù6Ý ÝÒ—kÛô]<ã»ÎMKoÅ î\NƒIõƒ`lʃub» 쥑{¹˜¾ÍU{¶ÙS²È…N¬I²Ýû†ÕÕÀØ(àwõ»øÐVð(3¾Ë ln€•’†kcâóúý°ÏV ìï‡?Œf.6?šÑj³èßH1Év0|§ù‘1‚ª™­üÈ(º°0ÙznFÝÆtω¬ZÏùJ¶þß9ÿãAl3qã\c¨1™¸!, ÁÙï~Çœo°]d;0VèwޱîíZÓOYÛ™$ãÜÊÍà^” v¹Ú!:l vH¸K44çðÙç|£'³=x¼êúÁR•=Ûײm$£’o2Ûm{/_™µ_ ª~« Ý‚ƒÂž:°÷îï·Ë­µà×+`*Ý/¾r_Ö}Â:À#—š@Ö ú³‘ìúäO ïïþ“?ñ °ßä·0°Ù½I*™©ü©ÉH‡‘]û?µú_­ý>H‚ã±ÿc š_ËŸ!ÁŽ{xdZçâ‡OþÌ<ß,qØùcÃY`Y€`Ê×Yƒü™C¡lô ¾jmˆÑ‚Ÿ—þíÐ,oö…²•|⛄s /&MÇÛäAÖ`xCÐ2O«~Y/e¥‹w”ÿp«’°È›à«TôubО±Mž¼C§>{g’ÿŽJ¸_ÒŽ®Û&ÝB“Ø|‡/Ý—ÔŒÌFïO쉜_—Ïi®†CW<åªp\¸¾1’„猾ì¤ÏS ½Ùm ìÍSÇî"ó°±0½3_ÐâÀ&i¿ñÇÅržéÔõù‰ú£7– r(Ë­a¡&Aí§,Ô?à|gþÑ{ÞÌ×Ë{ƒÕ[f¶Ä—@Ì¥/‹˜™NrýÇår—íƒÍÞ¢hçoïï)€ì¾ù#Zͳ'·_öˆû‡,>ß-ø¼sZ(›wnǶP˜·]š?Lfâ›ä9oÏÊMY„LŽÒÌÙî° •…ÇD‘‘uÀZ`¿ÜïMõèZÝÒð?þˆ;Ùº›.’ ¹äÄÉãR»±äë,UiRà4¼ZC`üÂûÛß©ä ]¼ÿ/5"?ó*ë„”øû_UñŸû_“ÿ¿Q@Ûßì³…tŽ {Xå@ö2÷8\‰XŠÍÂ0jCVlßðÔ‹_‡Za­ßÙìçâB߉nú™´^5 ÞO_ž°úÔ4ùº—q1Ke£æ³Î1¨0y~#ö]"{Üh^^6}Qþíf:]Ç*–T:LÎ¥ÏR¬ªÀAªÉ]‚̾~Mù‚;WÁËSÛžò½ñ1™„tðu½Mmoö­p2îd©ã_Ñ8q·3ì}™ˆÁ”Ž}2 zø}DéŽã~0 `CY „ ȧò¼ŸèÍÍ~=Û,7²ê‚Ì «% aæØ$¹§§–忯E ÑfEZ|ƒ³Ï—ò„-[=<Èflý¨_Ž&A$öód&þœÝÑäŒÓ|™’z;ÝÄéV¦ž”OðNð¦Ê°hü;É܈óqÊzà2Q¾L{}|\2þU¹ê Ó Ž‡Ál>VI²²3à5½4µ €·Ö•Û`Jàªô›FjA¢òq¥å ÜÍw뀜L‹¤R±Œ!èÅåT‰5sTE§û½Ã®8’.Kð+£±çâ\P²wq#s¸ÎׂD$°:û„Mµ3j"¥Z³ùˆJ“õµ^' ꬗þ‘Du‡”²9ßp‘ó¨va¤ó¯@âÉHælïcÁ[f“@ð‚ýà$o÷¢x6¦¤Ï±I¢tËÁ£a¬r‘!á!NƒÉe§ õ'ø9èNˆMŒk¾»ˆó GSú·ÚCxqø—YD]Šòâ‘ ÎdÞR-(> Q$c ºÉñ’³C)ÇGqwÐÔ^æ»ãL¦ôK4wU9¥`141Êц¢ FÛdƒ (&€ü ×…á_)›Ž¸¾qU†¶ –Ùš"µpKcOœ69<:ÈR¼¸“5L§“3Î8ù&ÉvE‰ºéîz±’=k÷dþì$-Åu`³[Âáh„”PU»¸æ]„v+£%Á÷²I2«7ÖÝN¿Fâêbï8÷5ClÖÙg¼FÀþJGbÅÑ@ö'¾.NC' Í“4"j'¶ÔÏñôz6¼‰9ZÝùìåd4ˆgÃAg(ÚÁ5šžÉ@uyÙï\E±,WÖ .fWôy`+Gû‡~Ú ‡qg<îâ¿øò© ‘XñöîhØ Ï¸ ;÷ûîÝ;¼ú:Ý;ÜÙ$JÙèÄ1Kï3Ö9à›0 *Cu<ù ¤û´\-8È´š$B/;ü#V8Z-¸ðaòÅ×4<ÌRAd uQò(PGüÜK(#ž3Ý™˜ÅÍ$ënŠÑÀ!g àë’ªÂ=Â!·«ªüŒ«¦â[ú«Ràò¥À$8Ét^25ž†û9ÜÄÞ•$ÝñŽ;}q¯ ;TH0ñîu8§‰.¸sD©ùŠŽ—(7 ƒ®ßþÚny…‚iªQ,?#¯_gü‚Ñ2KU“4¥’Eë ¯€*Ub¬TÝÝr=÷…J$c  "B•4ät,KàòÃ%ž <'e P’²ON&EX“m°p+gHhs­I*öÒûO²Îhþödà’â¶X¥ÃÝï“ô@ÛpÊŸyꌜ= g½Â›»¡€¹vTe¬G8‚CJj¥³NM€áG[ërœm°Ì濳̋¸ëS6Gi7}‘ñiû¸Xi"éÊÏ×Éb¼Ü:wà æËU¶JÁ¾olúÊt†1” äêšä•( # ¥W)>‰hHµø¢!^ñ!DCjÅ'kQwÍKfb“ æEsqÈ&ÉJ—Eà’"RÑw ù¤  šÚ«ëô3éP_T®Mß`ànGc•”JnXùʺ•‰g ¸dú³HKGÓð2ìžI½¼ CÛ¦ ´VKÆóGf|òJ0Ì;—k÷pÐz‡µT p2ãËþtrÆÈž¶o:^8ˆ"â 'Aïb4º0‡÷.'Wáeà¼oýpÁ0¨J ºŽ°ß:ʬcm0h§?ƦMÞ´¬Å`ã`rÙ/Þfpz—æ0ŸÁÂQ4ú'È<MÆ“Ñàœ–×A¼µ,ØÆœŠº°0Àk@å®3.NËé&U唜^SÍõѤ'x!Çá †·á„ Ή ðÛmX ØUNÐËÛàvÔç`>稅”ØàœœTO€œœÃÛ.="€À»ïÏ:—·åíŒÇôŠÖÁ¯×aIdh€sÂFc¯0|NÕîè6^!“µÛé^ƒ+ü§í`4N]Nàî%Àjuá°@á§ðôý%À8o¢ Û똓—þ®ÜãRƒM;GääD½vmw&x9aÇÑu€k9§ô6‚sXãDíGgÌœ¢Q4»}8ˆuXSRôÊéÙ"ŒÓ3x‰»­䤒Åî~®sjÊ\å‹ÄiÙ£çÂàý4:< Ž< 7ºTÏn …÷¶+uoŒ»© C˜ˆ ‹iá‡k¾è]‡°®>ž„+ ¦3¾âÀFD¿ÒÁáUì¹çOïFò¹’Ãù¨ʔʦÓóÝ,¤3€ÜãºÓ;pCï5œ9S2ºí^ÓK1ûn[\H>ŸáÎ2 1Nhà½Aôa8½æ`úEã!´æŸ½ìDSá&'ä$wàᜒ—]G”i6‘$Ô¶„óm¬p£7}€wDs¾9@€ë‘ƒ ƒqRb_ŽÅ©z ǰå9L a ªkvr„:rc—¯µ@~§e((2 /:CÎ~Z°9¯o¥T]´Á½¡Z>ÂÝ}È›ËûïŠv› ¦~7šðcÙ®")s±x|qÛâ\€8Òæ¾¶ê´¯ÔªñÔ›6§o¿Ç©Ónº·h“C¸QÇ™:\G× ·}WAÅÍ›96æWœ¦%ê‚_…-§ÍÞ÷p?÷> Ý/qºŠ]^†Ø'îmÓÝo è¢Ð&Bŧ9´U€Âšøm„ãŠù>BgÓP®57âˆ=(n­Ë˳ìŒÁþË…Lù#/)A ˜ä|EyuTÝq×…ˆÝèË’9JÖJ¾´:dO œ ¼ÌÒH»šµ"ú’Ae”9š[§ÍœxiVÇLÇüîxËQ>GœäLwéçåâ‰AÚ—'Mev) (e#IÖxˆû£žBEo“}ð9Ùì‡i?uÞCs`?Íöî@'{µ’VËaóûO‡-‡Õ ]f…±ËA¿¸ð|ae_0êèysÿ´K7Ë?|å}7Kãí¹àÁ×ûd«|Î6ûå†ü“ûCÁ‘­€%ó]~@<À&™,L¯ÿŠÌ;Z­ÄJ/f›/”~gË;@°ÆùÌœœÀKÓÕx·LÉוè!=-­ÊàJ,Â#zªP?tÆ1P2O¶˜™¬c ©ÉÒƒ%CPj‹ =>¥ÇœÀw?ß.¡ÏñîýÓØ¶s¾RòŠ<¦&ƒ3<TxÎr•ô–»ä~ŸRØ\áñOÙ~ K9Ö–¡ØŽúËͧ2Ï ÐsWV†QËÇ’mSůÊðêo|©a.«U0/Ciù¤Y‚Ð2ÕòQVë.ÃjçX«2¸Ïà%Á}ð¸¯Ç{j1<»Áf1z0…\¬jþUå[+é^†i¿íwÉ|]†bW†^)ËêBË(á58=°íK;Ë×E?zêpÎ"fËÅŒ’²%òìQÔèNU*óK¥2ö‡‹²—pƒs‘îŸN-T­Â¿ºJŽ,|­šoÃÏIWÈ0b½Êðì:ýrH÷eºVËév¾ËéŸP†h—K{ PÌKž]°Î~¿[~<Ib^ê`—ŒD¤c.vµÂÅ‹´kç¸/ˆš]5éhHjýdó¸*Áµ¿˜gËû2»hÑSºÛ93u»faš/.Êyy#’¥ÙåC”QÖeèµÝðþëòõ¬ÛiEËT;h—á58ž*jR†fW“‚°ðóº]MSÓb‘Í2V8ËÅ·+ª®k t=F]ßÙž¦¬ûü|V:ò  §’o(UÙyúõÔ¦jä+œ)N¥£ÕKP½Â)‘¾&e¨vM‡‡õ|X~í4êî|Ž,A£‘Ÿw¡Xˆ}zŸ–±Þã©R *Á±(¡ÎaZ‚c½ôFÍoBéŽ^‚ás!àHˆ»’`FËçœè,ׇË4ø*«ê²vY8sb‘5¯ÍBˉEÖXaš}”Gù¿_é´°À_ NnR y^¯Ä¢"é pDé̸²ñÉ´è.r‘¸wž˜w™=ö¹”gdhÑIaï2;¾Ÿr‰&ëÏ?&«Swée †pŠa_fÇ`ŽcOà©ý}™iÿÄSü2£{çȨÚ9Ö IÁgc—Çã9^J¸ˆ±6 ëxƒ8ú0ìžm%ôO¹iÈY° ™DÇŠ*?¨cß”&ÄørôJw#yå=ç_Áh/ œˆûÑu£6Žã.=þgx]Y¯È™§Ø&YˆKÓ |‹üUÎŽ†(OèÌ?Yš4ŽÑé|ÉpŽ^J~í¨P/%²vô©—²Hãq-MyÍëé´Ûüо”‹ÚmÔ(4*I½-èSyÉù™>™‘œëSiÑùÁ>Λï>¢ÿòÖ Ëv[˜Íqs ÆáÅ!Ã]4Gþ£!…~kükÒ ’7VÞ›Ãqˆ}6ôÏü7¹·ëû µf{-ˆ/<Ìï“¢5t™ÏJ˜ry¸,ˆÜ}šo6É =2».@ ·Ëi¥F;ØOr¸ÃûE%}èº!Ÿ½\ô.ýPX[Ê#ö_ŒÚSÁs¿&»VX‡Þ%󽺢@ÊÒáDÖ„£±µÇÅ×áðô§Ãt›+C©*ã.ãð[¡p÷Ó/˜*‡#0`­¤w’ða}Nö2X$€šJ|©2ÿ HE)(žX usVYw’d«noÇõu®ãqX+R* ,Ù†3î\Ñ£ÜY&S13é…kæçÄ¡WËpÌ^ §t­ ÁDóVÕ*Çò S|Åö;²·ª-îºòéÖÈ'ZG»Ÿv?ÜLQI½ãäsŒ¼.N­Þ©¤ ´p&Á1JR=ÕJúI/+D#No™Ý»hÓhôЖ,Fx‰"º‹Ò:Š’'$jq¦6•7°PDrßdÂÉ/g˜ÝïfùÊÜBaOå ²M•Cå®âû †ý0šèá茬_*•‚Òä_žR˾ÀyÊQ†ÁÇ;²ìñ‡Rå/S@áñŒpÓKs®×t«rðM¬dÊP”Ÿ#z¥ˆ:¢œ÷Xs§þƒõ•Ï C lp´”ÛLJÙÁðšÍ"©Šmº4¿Lw©˜*3P»4/&hóš~Ùü8F«Rèe.NÝ*'fË¥úè°¿O×B6š‚'½òZ.áMŽ7‹P;6{F¢V½°Wò] A >“Ùx“ Ýéç@Ê÷%-ÂðCÚ§ÜGÇ»ú—9‰¤ŒÓÕ\ñTÈI0~]x%pâ0&eŽzáu[=lçF` ªÇy3vДZOëâ9ª…Ôˆg!uR³†©[HÓ4,¤å@šÒv - ñˆÊ"²½w~V^'îÏ:¢w?,¼é—Crp¤3/§îx¾Ü9@\b¨ƒ@ÓûîƒÏZÓ'q£/O)ŒµÁ4¡I%«‘Që`‘—LC‡:®çÛ§tçÀšù` IUX%Ý)ùÏîøžô-Nùž„3 =ñΉ4ÔO 2åaï‚•ìAÓ¢ÏJ ›êÐAô%OcÐÀ¦Ôd ÎjE bÒ´øF(w2WÊÑuŽ—ÎI$0˜oæÉîDþOÓeÝ¥87ƒg¬œ0•æfÓîhð§_írtl §˜ˆÁC”‚àPC¸sÇ×Ýä×ÚÑyAwfÿ?5¯ ¥®j¡—âõ^-ôQv›–à °Q+Ç(P(Gpd·† /¬@³0Y\ƒ– /ˆYí£Se3ñ]¤\j‚¥¼ë„SJÔ½9c%ïæË½|#½x¦B8*•6_DA?ÅâÁ±8%Þmnæ­cËÕªŒ%ȹL‚Nô¢?—tßrDrÚÏmw·#Çž’Ôej¾;±:óç¢?˜šé.:dÛDÓ^ÿw;JçduR÷ÿÝÎÞ™xýßíäõä伨õ·÷â4$|2-ÙæÒ«º÷ïv·ÊŠëܾž¬ €8ýxÌé=ïý;1z1¯?>§¹AÎÓ$¹Iž“8æyšE ÔÓô(½$™s‹—ïs%¹›\¥K,îpMþÂñÓäw Û’a×:_…‚=¦;7Šjµ8<¹æÐG¥­å#’ t4T"ž o¤WvŠ âÂT&Dˆ6W Ò…Ðê5ˆx F“2¢—l›/>h ÖCq)Í¥’vküQÉýk9"A§EËÿ:ä{J¨=vPw¾6Û¤b?î»Ø`=‹îºØRÙ—×&çÁ ˆ%ÓŽG“ðêØÜõt.wóu¢ü–õ7¡Ó0î}va×ôOËúrR¥©Ï×â˜b¿ûßôʪSVAÓ,‰¶Ë g65ç÷É|™Q^—•;ÄñåPpÇét^Ì^8ƒå‘_–­øòÄŠ‹Ž(—Ù¶H6 ââ‹ð ïíÁ’j $Kåͱ‘sÆ1¡`î £ä®É’Æ£’VÜvÎÏí|¶9dêÜÎ]t;¿w¤‚^³×;·‰òh†žÁQ¾2Á[†rì!w'’¿Ì#XÝ •$å±Ýë«>n{§T ”{Î=§ÔîaC®zç&ú!˜ )5t!­’¹ÀDÚA¥b㙀|„])o0 ƒïiýç‰!‰OBv@.åq€g³ä~|va5ÌJ¦æqu*öíâ¨ô”óB[•V ¹Íâ–?.µlJš¥ò™zt˜ß€ž²ÄùïJõÿ ž?6×J!PFðý{y=‰?Šûi-v…"»mšÁ›q ˜4 ‘}À,*o%ŸG/_RrÇ S¹pÄö™(Mù»U¡©ºßCj†|©<PÔñ _§CÚq»zò%#Ô·žf% lZÚ}³´“RÔt‡n—uƒ(¾;_!/d/UüÍZê¡0xie †ub¾)ƒDܤ âl8+R6D:çn2λªŒ üw¯HL.Ž®ô L‚`0–)¼ÅÍ=xi|Z%š{á&pêk~„¦N7…œ›BÆ©½ôâ ô0 ëÀ”óBGà?zLΖ¿ó §’×›uO ÊÓ21.÷û»åfˆ|Þ‚úóÍ`Π5€Fô¾Ž ç´ìÙ¡ªz50‡0MÞa»"ºÓLÓ"Üd¹G˜&\ôªù>ô¸{'‹]\PÊ•—ï¿åA&–_,Êü †L^—8Hžƒds›Bi˜aR\  ½Ìý 3¸T¾Úç ã‡Ü9\¹…Îôƒ‚”ppü†+Œû³«q¿óAwv…Ê~%4«“Ã2Š¥~"/²Ç¤éÉ“þ•á°*CQDñŒÓêxux”®XƒG÷D‡¶zÉÇTªâC¶O×:ï1‡Ö‘¬pÜÙ åÀ ò‘Kö)üªÒ—“54YèüÉÜfÅÜ€üüs‚ÂÛd·æ3‚ÕŽmÅreî×…N+Ä2}¡‚Ê´¹Jæ;ûq!`¬q½&IbŽÁDè* Óq­”f%[0J=³/P¿2C¢„fNïéz1K×/IŠªßbMÿîšZ•عßoY€ÒkôÄÆb;UÐB[ŽTÅ\¤DEçÛ5 96h]¬•3®†~÷Ü=—§Þl*je–Žì=¶RÅ•j;(:¸ƒySø¥SrÇ.Ù‚C!bœ¶øµt~Ù …ò”äTm5}§ä=ªÕª VX†SEu3qp$‘ì™p+\´Z5Ä”»`œlìM§Õª— åñn9^£¬³4Ûߥ»O9V³‹©…p¹M¨–ï–#µÝN¸_ À‘A·¢ÛëÐ¥B»z±¬Sg:_æKrú‘o) YÏÐk§Ðõí‘c×K¤®úœí†K‚ë9uWB­Î=ŸÛÍ2\Ö—³"ªÑ‘¾Úe¸¬/__{°öÅÃwLGgˆ„)î(å*^ô÷1pUàÅaŽÐƒPVtÕa¨XZÖ‹Õ­²Ó¢~ª²‚SͿ놖š—Æ#+ªSæÀs3“SqUô¹®" @8²Ùíω†”F|[ ¶ä# ŸÇñ¬¾Øn:åÎÁä…T7é§9Ù0#1¥U¸Û^,Æ Y,kÅ”>©˜F ;Y¬ /hj>¤…‹3´/’…׋3ý²\ÑÆ1Zø%+úpœ6Rä~G¾Åù8#e“° 6ïŸz}|¹æíc!`Šèhül¿;Ül]È«Õì¯2ÝWaLñµÈä6¤‘ç y-ÎŽ`Ñ™4Œ&gÈ<Þ MÒ Dw0Š·i”¿ËÒ†}¡® Ïw‰- ã”ĵH½äãá±Ì=™áDû…2|ѾsħK¡Àáð”«]zØv„ܰáÖûš;î]"¶ÓŽ˜u·î`…‹¤¬ÀPÃA›­3åP‹ 5ÃPÎ#Éh‹¥%Z™¡°fpž1%ý”8.¬9°»")\8e‚óÆÉG¡áqow ò]·¤B0"ðµ)Œ]zfé/ü8Ùu0¯å»ÄÚíÒ]ÁNé%/ƒQ||8«b3Y©Agµ’×ÜÝ}Zn .7ç£kß”`ÊÄ$0ªSÌ—øõ&y.ñæ£4.¾gh™Ñ¬‹E¥\@B¸¬š£5`Ò¡…dÉÂ5눠ÝÕœ ’» uçM{¦tà9ë1L¨î›1€&)Հ؜‚Õ—ùsV€æ b¹GÉ’L‚+•ŽàÓä‘S´Þé6PSq·PqØ ¨+´PsXÓl_„{¼9i\…‚ö± ­ó¦ (Ê¡bY¶‡âìš/›_«¤‡RÛ톽Äp<ðT:8÷ŠKá~Ê«@ÖšÂQªå(…®<À“ö®Á….êEœNVPÀŵ(_0¯Yº‚¯èZÜP £]²¥Ø/ÛTÁW§|‘Ýðå+Yƒm/S§r(®@ ëL>ˆdw¡°égŒ4.¼fÅMUQTà £€ÖvHU†ã»'£ æT8õœÔæEMÉTäaœ|Ý“}sØbr±¼·Œ|Ïxwžs ¸æŸˆÞ…6ðÛÛ•9¼é|»€`”F‰£‚C‹5)ÍʳÁ=‹­²mà<0 ÛÜ/`=ÞDòêœ$5ÊõÀÄ»î þZ(- ?ÍrßÔF †3íÇWÁ0˜„ÝX÷‘~N”|âô©“UõéíôiŽS »’ìhÇÁ¿æè!j‹(‡¡E£¡òTè·Aÿ´ª®ÏPg“nž×̯¿Ê¡!yÙà5ô 3(k¡eiIy²¼Ø° iqÓÙ¡[GjAÍ´)œQ¶RtHòÁv ÛÌw\×5‡Ý†q/èôd×ù§Û‡ž`0t|Ë^»s(Äßy%°ÎG¡³¦n¬MŽTð« ùaþ€V§Ë6j"˜ÂpÑ”›ƒ‹ÛrçKÁ2.R‘‚cé#\» DY«4˜LF“x,.ƒ`÷:ÓN¬á—Ò‡ÎÜ‘%=w-ål ïIBI:Þ¼ptkÆbëÆüÀ6JÀxZ›†!Ða4¹¡pÖ(8Ã'‡>W™+æØq]ðJ0Š¡xµ"Váí¤~¬§BÐ"•2Y™;ºîL¨ÊnfqÚ Í3ÃýbµªyýÅ.÷Õœ>6(zîÍ’hfušÏÈXì?ØÙòä=Îceñ#ó,q 5GH¿4ë •h¨4¼2B*Å!w¶÷ÅÁÖŽ g±E½Œz×é~Lh“ô°goEJ|ÝÊüMÊ}œniÏ=(_Î+td8·%åV]ãývnS–l¡]h7Ù¯ˆjµ k‰_ÀÝ*ohÅZä“&»ŠT^µiÿ½qÿö÷ËÙP:Çcßßþë‚ܘ•oÙMòüÓýýBh®AðÓÍ,Ž(EÉÙ¶ÈñAÀ¢©ŠŸþi HÁ §ÑO⟿W.:ÎO³á˜Š?Oƒ÷Sú5êÜŒƒÎ¬úýI÷ZÛ3~ªþtóÓ¯bÕZ«éµÛêPé¡(‹ö·È{5ýÍf½â7O~Sô®Wo‚?ÑGnñ儺öòAЯ*ž|p592ÕcÜ› dtèÒi®lXVËk¿jXDù×ïCejü¶+ñ³úäMÙžÐãh—#øú]Frb -¿êUNä/Ú(/µá7_"Ú·Þ=ç°tPä~ó]Î7ýI”³Söþ^0yÕ7~²ç¡Ööê/þ¯åG'ø †açÝhV›•×Îû±¢³'xî÷N­fvŸlÓ4Z~\ iïÛîH1‘o´©›qgz­1OòΊ`Yí3gù­WðÔŒÿüê½rö&.—›E?™?|¯%þVë«6¾WËÅ¢v»~ÞL¾Ã2~5,ΰծœšá·¾î¿ùj—hÛxé˜ØÔâŸ°Ý G‰,ACåCÉW©ü|Ý¢0¤»Ðœ¡VuD¹Çø­—æ•ã­4ñ¶ 7B+Ü7 øüÎN îŽààúß -¿þ '&ØôjÍök&ø Eìs»:¹>^£Yþ_¨X‰ß ×h{-¯rz0ÿ~åJüæ Âì„Jµ^Ýè¿£ºut˜íZÝYñ½âxý~~ÿôo ö÷Õ`¨÷pJY£‰¢‹5oT=ÏåNgÓâÿÒkùÈL…ðØª•®ú÷³­J»â9÷ر¡|…òȰêÕVÍ÷ʆu¹K×Q2ßÝ?©âYßÍLáŒìÇ®ÔýæëÆù×$Κ Íå_Ê7´1œ5æºWlƒyì¥!$ûn£„·;›V½ê®BÙŒþú-tö¤¿©Kèi•×ÒâîÁ?=é×ھĪ×+0ÓaòåÛa¿©†}cäÄf£‰–ÂØÿÛH.lÖ^³Ý®¼jÖÿךN¬¤˜éáßçÝñlÅk=h UµtäÑ>¼ù¾±T‘¨AÄá çPà›ØL¾ñ¦,Ÿ_Ëo׋óÿþÏx§B%¯8öÿޝT­²3yrÖÿ oT¸’“dAžâ2Bþ?ÌnÍüÕ†÷ò”þÝá't ¯Úø3Äøz°6ˆ 0JÅûæWýþ$Mß{q(­©ÑùÚ©±WÚ5ï•cÿF†ÆW Òw;®ÎO®¯R¤é–QîÈ þB5ï&w·:>À^²Kþ2šY«X³Y?sDÿ~´P”jí?;æï¸Èšá×kŽXÉGGî¿ßa‰ì7±ÙÄúž7–¿rq¿Ãp¿Éºþéq}ëç´÷ÇlEèsc5™‡Øß¿s¡O¡æÕ*z ßeñ_Cîíj¹ï>-W‹ÿH]Ü›­Ê‹úÿ…¸^kø^µùZRü ëõªï¡(r7_}’ ‚¨Þwt: ‡Wý ¦*Yº»ŸÆM‰ñÞÄâyöœµíâwõÀøVÃýŽ߈EœškMϵ¦=>½ZnE«aÃÑYÇeú‡ç_§%=ï’þ|óö²Ÿ~úйï+ÕkT¬á‡¡RnÆ2\+S†Ù09ìwóa(Yã>Y›³®¸.;™¡”âØ¬±Sô`]/‡[£ q’ZÙÖ*+Ì‘d¸½Jö¦ú96:M©¥¦¾äç×½‰"#¡Mßñ·~йŒÇÓ‰YÍkYi~¸ÍããÊglÓÕj3Ÿ ¨³X”µàß§¥ËÛ[«Œj¯ô†³{¨ îé7¡‡IRB•Ò.ò׿æöA)õÏìÆÎ%ßí¬  jÿ¾Ø{¦©·<èBZU_ F>Z­•ÏCF°9m9KqgÒÓ`1‹B­Áˆ±Tû²P,TJà#“©â6³ªÕóMµ$ÒªB½å»ê¬*:m5+ÅNG‡³=Ñë}gñ«9ñ—ãdG}ç÷lG—K.¢ªŠ’^Â\ön6 -MdfÉÞW4ÿÓ­œ*æ xEûÜ)p²_E{ªßýØM·Ï³Íò^~ ŸˆÅQë«ø†]<†]Uue"8uþjU­Ûx ¬ä]HRwSì@ôze7y*êN¢u°ÞîŸeò‰i*+»f/ š./­{ÍÜwPwøÚžlW­ª='º+Š]–Ñ]½Ï»©°QÛ›äùŒñäžÎ+¼¹{¯jÿ& Åe"Ë“ÉôàÉ¿úqþSÜ ¢î$“ÃOÎèZ‚mWðã—Ë]¶§Fÿê×QÐþkõ¦Ó³·®Ì¹ƒž¼ºn¿'å ô—Y0 ,'°jH»ßþ4¦îSrÿI'6yPÿ¥s):¾dr® ¢!átÐ[À’Aç4©7ù÷åy:ûPš]U©T›n'çojä‚7¬lc{{õBÙ_«botÒ_=¶Slç·‡ýÀ·8Tä8îý»Vn¹oW ³ü§ÇNòè òìJVµÂTN¤Wï±*‹´}MT-hóú ë!móO‰>—én¶¡Ì‡ËlÿM6[½êñÝLiô¨Tò·¸A ™­Â'Î_è?Ï‘˜LTkWÚÀ•¢d¯Ž•¬ôݘ5mFK†ŠdâŠÍðª "úò*…¾‚ý\æ²x…ÄH$h”»öç}ž/Æä ŽdVÜ~ Sº^ö;WÑ ëtÆUÛjU=6:{ä0_y⾫ӧžÜ…ÂDæˆñu' Œ@%î‹6£.S _qÞhFUih‘õ&m¶óñ´»ÿúêÑL$­ÀtX¡D0¡Pö/8ÙD¦©dqg’¬ìÆU€`”Â(§Áà';í£’ È©rHr$$lÿë£yo¿Òª9„¥„2à«x™·ìôrŒúè ±üg=ßç ÁÍ:̲ƒ,4¦¹Î¤îX*âK ~b['Œ¢™De‘²3¾vóНqÙ=ÚûN[Hª^­ÊìnÑ^ܰ”ÛÙÛ…Nr#¿¹©› χŚ•dž%çôæl¢ KÚA=©Ëñdð2<ï‰ö!COµÙÚN»Ýg³íÂUOï&Ë©üÙ®Q¥Í©;۬ϣïû\ íÙãÙªi´Guô^A‚0ÛÑz\³Ì¿p•ì_Ü çRÆŽÄZÍë\ÀÊ?ZT.Î^5­ü¾ï9x‰`Ìßl7¹­¸_f⺡#l¯òŠÐ+ø„sèÈr–ªÈΫú>1 ® vdšI™ö'¦ÜÕkU¯æáPäÕ²Ùgg›œÎù`¥Õp>8x´¹FÏWÞ,9¨)ÉùŠßm=5[s/ù•–óa­Æž=C»|0ùtgŠûœo<8ªôš­rRôšyøŽ@:u|“õúWGX«Ôq„Ód·^n毓°_ÚßÓ8˜ÞÅ‚ÉB]®ht¢Ñ0׫µfÓIöê-7¦84•г2#æ¼v3yB`Ê·å}o3L0³z[<¾Tr›Úí?kîFÎ#l‚w ¥Ž—´gãÊûáÝq ŠéIs/h¾¸¹ÊŒ"¹Éƒ[é̦Ëu’ößy7¹¦ÎÖù^.´¸ ƒ¯róPî`n}éªêÆöätõðŒƒRÐÉWÁø~½Ÿš£tc£à[LÛêjÚ\²ŸÔ5»G?]{'cÎß•V…]][ÞQg{oöÆq£Úï`Ü2•]î÷Þ¸›ï°ù7ê°Z5ûLöÛWXnγ ´|f¤Û.4½êʨ{Lö*)³,nz\¸9.iY-«Ù¨7­èXÓsäuÁ/r_ÆH>Îï÷¹Dyr\4"Yƒ.ÙË…¤j.$a·ÙŸê·š»Ep½Àt-ú¥€ezA]ê«szJ#*~Bí ëH)K¦ßz•ßÙgµÙO_;1£Ÿ´Y II×áFœ×ömwGµ”X¹Ðú':KÆžüwÂT*?/n;êO3†(g˜ÒÐ2æFH ÈUì½a[åœ}ôeǤ|µsQÁœäUÿ˜ëkfî)Ÿ@šÊÿÄþå÷¢1|·r·ÂüƒùîSþö÷"-5ÓGâ3?ç1,uwäö¥áLöp„`Eö#èÄL*ûÞÚXgò­vêcÿÕQb—,V©” õšª]~:º +-ßoÀ‡ÿÜÔ¬µ vÔÝa·÷²bYÄZ^ËRÌYaá.…~£dÿgyF£Ûg­ÖYÖÔz- þ?ÖÞ´»m£IþKØ—Zm½‘l$'óΗ94 I“‡‹-ͯjë®*”ÜwÎIb³/4½T×^¼²•®ÏnnùÞŠ; 8ÔÒžÆõñOŽÄô}3ÖL½ ¤_€ÿïïžö1+ »&œÛŽ#Ôåûw|òÔ1ŽÚãü¯îJgeã%¸½ÒE¸Zú¿½ÿþˆôË2Ô)©XŒZöï_- À+îõ_ê°ªM¤0wø“ C*«ý“QzÚòþ׺Mܽz‰z2“àj}^nžù ço‡nÿÏh°0y›ùþ?ûÃl³ˆý“ùç_xA:xñçËÃz¶ýÛ[ ~»2ž E–n~¼†úïŒ$j(±zÄ­ñÿ>rÖTI’ Þð¨4rÁ©£ed˜·Tºq„ßt‡1óc¦½¥€,—nó°yuý^ðÎl%uåŽ?¿Ký[_Ó$F,Æ×05|Ü-×ÿ>Ö¨JÚÂ/Èrþý‹,®-_½{È*G|¸³(ÿ#bž4ŽÛ•>?tÑÅêïžÛ çÇ(¾y†ñHÏŠêy¡ ñOdÃÉS• þÃôma[=¼mæÿ≌„;3Û͸Aü ÌÄeˆL<õéMÑú‰–†ßÔ5Œ7ùåÝ„¬HK«l‹Ý þßÒ˜h|êY'î_ Ò깤/*Z+2ÙQ*ydþ ù‘UR1ß_ïæ-1Õø¿üEïîþ{ZÙeäDçQ‹f<÷Œ¢A4'¿ÐsMé*O« ’<±÷ ¾ì¾ÛwÛ~ßý»_g<.äu·gªøÏT4ÀøKéØäŸh}’Z#ŸÉC­QU“ôK¨òœY}™ñàðoü•–éd×ïΙ %ñ¯#]æßWœE<2©Õ¤¹WÞý3!PVà¨ßeßù}wüå6þíù‹ˆUG¸×ý;õ7'//kKÊÜ ÉI½kbHÏÚáﲂS\_e tyÿ]%ó/ôÊÆU8:ñˆ×ä¿f1k¬7Áá?©ò2Òÿbómóct“ÎÍÁâN‚Mû½¯™\!¾‡Ã-É ñ^.WDmÝÛÛžkÿÝn€D˜é ˜ìù ÊbŸþò‘ØÂ5žÑë½ïξÐF~À B~Þ™zŸ-Û³í¶.šúÆ´nui±ý¿,@c@zß³9.}·w°x#D؇ãÒ¾ªjÓ&@>v¯7›CUXXÓ†ƒa7_~d/]¹¯ ˜Êb0jˆ¹íŸÚ.\WðýCØÝlî M=ú¶;˜€Ùsç>¯ Ä6¢>ûŸnΰíÈÊ(LE$–ýa÷öçlu´½ÖÉøÝÀ)¬€¹^ƒdg‘šm$"–‹[ €2³›ÃQ>ôóïX‘Ú½62[ £æauc÷¿®úͳÃd£ï¥ªÕó9·F§]¿²o/"/€\îq'a»móW‡ŸÔëålÿb_œ—vpåé䃋١{îwogpLŽßÂßnüZÕ‰#\Yü³ãþçµ_¯û`ÝÊ)ör·üÑÝv‡C·“ýÜöº¿èAlŸVo×ýnÝ-\>x8áÜž¤Û¾ÿ~Üšne?DG}‚Õq¨XÀZ& n 6ì^GÊý¤¹]=˜”ýay8ºñ [»é’|ìaÒùEEwT·""õŠ-hßkЭ.vÌ9¿zíä˜ N·Ú ÜÙA’üîù Œ­ˆOà?cq®èö ? ÷únO@"¢îølµÃiù8Û,VÝãìÛŠ*µ¿1¬hcê|Õ;c<¢Ò*‹v5E™þ(ßf^E]‚`g~ìf‹n÷ ëRe¹íÚ‡#T¸¥K;x]Q·Jæp¢×¬Uí?‚ïf¯¸ž?»@o»Íóá…—]é ïÑ¡¹ÛÌGsó›%ˆä°ÛašÔ‡•«)JWQ_7»S8=Ö€Ûâ…µEB³cõ¥ßø›‹˜ô—Q‹ÿ9îjJERÏÌI‰6¦ˆ~ÛØY݆Ü?øU´ñàÆ¨³)eÕ¡­’–…ýàÑיͿw<Ü3ÌEOåiŒCpOaq6íà÷'u^dÅÌ'¸g'Ç(˜ëã†|x°@'ßÁÂìãkÓ,o'çåa3Ûî_úù&†ï÷ýC¾­=;¬|z”7}1ƒ}´2_TfeÛœDìÏßÄ•¶ßñ+r7•³-fñ¶-Ü, JÂtÜY+’"P¾‡Í3:¥f´´h>®ã2×Xƒw ÔoQ€<0õ]0p]Ýn3[ñÄÕšŠÌæ5“ù-Óê]ØÃì‰ÉN¢,µ…>tp˜–‡7ÿyÙ`·žËÄUªºzî?NÛÄ;þ\v?Ý`R,mœü’¥S{ÃAí ÒÆðšô‹g"Jás¼é@öL<®ßwá Ý÷Ä yŽ#°$ràÅ~ ›|׿Q· Ü'©Ÿ5ñG¾\î·ákR•fž±Ûpxd3”IÝ V˜ïãÕ¸R¥°mæOƒ˜Ûà f›€,mÓð˺žP¶2>$Å`5ñÐE*–•MdÇœ}BÕy51æ°»ä0ËžÊòñcGeéÉEóìºò!ïQù´ªr·M”à•ÌÝU)Íf{$ö&ßÊnWI]gíú|é‰8l¹¿8a/µõB{ˆö©ÙH0ÔÆ­IÆ ÛŠwK=ø0Aê~Z2ÄÊÎC±èí±× #kü‡zÜ_3âØ_`ÕÌ+©§,?@}É!•¹ÉÜ=xµYDNioË\mX‚ w!Ù‡áˆø«0KÔt àF™kò:“ÿ2»2O?ST~LÇ5ÖÄ#Ôw@¼ÁöÊÜ¢]½¢VzÀ·µ' :yÕ9.PÀS7ŠngM"ù¢ƒ!Ôéxœ§o¢xDÿa¬þÔNàâWùƒr½:î_˜ç ÷+9*»Ût‚%A_[wðXO_î™1B™76þ|Sóh•áÎmK7úš¿nVËÍwšÂ@Ç@BŸxäzv8q„$·°ãKý}@͆'®=Kä)e"çX^ãùváÓßøKÊ 7k3x`‚ÎÑbt÷_=Ë î–n+ƒ„†—'rê¨üø30K0̳„¡(ð©ðº @ï6†ú§äw=€qM1…-Þý¸4<ÊD{Ïnð1ÂALqe6ø¨›5æÏé7^n(Œƒa@Þ@[#_¦…¿T’œZ :w{õÇŒöª°øíô<ÍÑ3¯¦{W˜½ÄA~À„C!ÎdÏÔ3óÌÓí„ôßRO€”¨“|Ðü}ĺQ0=\O|äµãY)%˼ƒ]¡ëc+“l€zè6 IÝ’äëæ'ÜܪiÖB+Þ0wñâ|¦E1 cÆÎÚÁ$ÈñâÓ¦U…uà¸ËÁW¢6˲£™:cân¶½ížgsâYÐñÍÌr[¶îcVy¼²q;#ˆ0ÇCÖ]Ÿ·ÝF÷Ož¹{•)¥€`7t|òœÃ¤Ìƒ.…{Ïq&T¶CM® AXóºE?à{w‚æ»ñë%a±8 °fÀ6ÂNbÅH=þ†‘d’È—Ië”aŒî[/»~Ó÷] ‰:t°jp ËÁ_³\X^2UO‡! Ɉ‹Ʉ`Ú/–OËnq³p¤Ts üqR÷`ªùS… „ã¬õú¸­œTÞ|våtÃôR¯{Ànÿ:óË8¢°GS†<$rÄ퀵˜[8^•i’,‹5ÒM2ø^QímHÚg»g¾šögäIá 0G^›ûˆÛ>´,õLi„Ê7ž¿ ùy¸' /(üây’ËlzX§Ÿ ìW×ßp)äa;tV„Ä{Yž%ÞI¾¨BxT¤'oJ¼^“zêϪ`žûá#•¸gùá®ô2Š F óÏf‚…²y™›f÷ø zÑ N¥Ó©9I‹¬LöžÌßhz`#%±bY™º<w«’dwLAÚÄ-‡èDÂöú”¦u›$B§t/­ç냌2͆o[90Ÿ‘`]zz wgµn<7êY m’øÏ9|þ¹évBÛUQ䀋—5±·x±°žµF¼q4ù?³|ÞÌV@þb¤FÝí?rŠ˜¬Gs@\AÓåfA…ø˜ýÝIË´u”ÚÞ9Li’¸ÿƆ fÐPÈ/g{‰`¯V=­Ï6!™=AêË6ÖÊ *¯ÜΣ,ññ2>Jäc¶¹þ‰š’ÕìízFRQ ­zòµöŒ¾7›N0ɰ€Í¢¿b·¦¯HšK¸ÊÕæ‡¨Q_˜€;lêX¬õl»ýØ­¶œØç ˆµás?;0åE=¶ÒEMÖh”ºþèˆE¡°ˆ_³Ý¾îìÏ[²„{¯w®L³‡©!±ŽyÂ2jð‘!¡^s| †,₦å¨T’"Fã{$™ÇÃîù2Û¨lÇÀûë­ð;Áùü9Û-Ø9\<ÑŽñpídoÇ5)7Л°šX?Ô´Ñ»ð sb×6Ÿêˆ5ÔSÖD·¨àq7›óxZ->áPv…›:™ø2Òƒáª\ËT¥h^+³idœ¨¼6…9‡•SãbÇzc+¯'Waá+ñLÇlކ,æÕëfd)úT‹V¿~êåÊÁÓVT'ú}x“¹pØÉí®XA¨Ë|r(Óê·'¹¥i˜~{’¶SûNäÞŸ25ÇX<®Õr ”mÖÝFho¬§Vð^ë ÓSíÄâ´ðФe3 ÃP5süŒ‡Ùf·ûä©22YóEj‚Z•“`î‹©ÙƒKåíåœR‡…Ÿ/Ë)R2Ä^ôÂìåe1õí/ÇÞmä5˜?aOog‹õrcRùô41ÚÍl€,£7Ùä·@(/!Z9 ´dÆV0$+LžõnÎï$æœ7;œ³üH\ŠŠ ¬½|«¶¬¯,Ò5Ì“Á{(‰‰.·sUYÕES½Ž¬.ÚÌïœÇÝòù¹Û žøƒRÏøîÛÙb¡†"b“D÷3µßlf$Ù,•aA½~䥃ôÀÝ–ýiùL³ýyßÇ*OtþZ#±ÒTEŽ]Í rßjŸMš¡il¼b V™ÐÁ§Bž.¸(PóðëÂtªØÑÛÑþPM÷v…A”pRì>TÒÐÆ÷¢©ðOªôÿë'ÙÌ„<øømÁ‰nú«Œcꯉ –eÆxŸcj8zн xˆè¢‘L<‡Âìùr3£C‹,ªÐ®ÿãü“€Ô³xB¿©gÚíijõúCê’è.ÂX•¿†°¯›½æê'h€Û7¸»ßYž$ocÃ_?'»@#²õVW«÷öB­¡ ¿ódx¨o ~hzûÔE:^‚¸Á©³>vÜ®–“ÛNÒb“úÐÕèµh¤ôG'z¢`°9Ju÷¡É¨ƒÝ‡ ‹ÚŒ‡w7\bN!û@iáS&f€îü© ƒUÛÀûðxÖ€TãÃ@1ÒïM±†‰þâ!û-jªŒÏ`j™m·žËLV‘Žw2GOH¶83áâŽyŒ&NåTûSÏ—ã1ÜìÏ6oŸŸx÷ì¸ëÖDÝBäWÕL DAWÒx­8$çfc/˜åB"òKö„ãJ &PB!ìZ£ KбÌ&åL–cÏñcøäï=¸7öN,â1|ŠÅæÑc¨µ—S1&•'ž¤aÏÆß)QI§èL=žàÀH½á¤Ê¯Ç'Ažfvྛíû "AoLJ©í&GÕŒ§ž {cøÜ(ÅxO~Ý,Þ¡˜ÂæNð.®gxxN±Hìx……gšaf·‹ö?'¨qO\P¹Ê_ç»·íLMg«gdÈ^0Êó°ì;.`WG×8Æ^vsüŸ4fÕ ‘Ì,Ùc{ä"¹ýjcŽ_Üø¡Ûp~iŽ\jl&çŇ·õÓeÌEÖyd òßóz€Èí3SŸ‹Ðhˆdèè¯x¡Ï¶ $~ýa¶B¦r˜×?’dÂÜìQIÞQfï9® ìuü)c¸ùR„‹ù %Þ?_ÿK>VM’DGU‹º:ü$×Ï=Çg'‘%· r"Bе§®Š¼z!B†eeÝ*ÓhÁËàˆèïb­極ÑòŠ(]覬t_¬Ö~궉 ’ƒM=U­ˆC›±'êùé qð‚Šú5B‘–ËÍ|™¨Ÿùùœm·|ëhÖ¨,´RÌ6yÏ὜h#ÙS⳨’‹&Ð,vŒE‚r{Õ˜¾Ñ¥„ü74“Îö%Ñ(ô6ä.ÂL¤yä%ýëÕŒBYóQÏ’Ž65—4²Ÿ Ž¤©£»( hø¯Môù‡©qê†ãŒÜäùóؼбqÚ¸ÙjèIDưLlÖsùŒLˆ@nÖ¬ÆWEÁýüùvùm“Jé!2±Ý™WЪ,@HA JÅ}0ÃÆ ¨~ë@Ÿ?wãHczql™øÒ(ÝBû`„­ª,±qÿqùLÈ«#¹ñÂ1¦ëªR?N€‘?äùóÓë^‰1j£ÌMd9ÂØæ? Ô’êçÏÛëõuvÙÒⱿì戙eÍ æ¾?¢÷ÀÓLŽ7âÙˆ€ÇÝq#vaBÄÓ_·Ò¦;Ûþw'Ý–meêí\×E®{Ûv³ŸVoÛ—è8 +ÕêNG œÉ³ÅÔ þµ\P¨eI)Ç\÷›C ²„4ÿ@Ù¿æ1Oà9ø2;¼L>ƒòZ2|ËÀž§ˆ¸`¤”žz¶¨š\˜ð¬ýŒáB*×¼g9C4`ïiçC6°²WÒŽß&â›`\™ÊÅ¢âæsC“qIžï–[x°Ÿb¾ëvÏÝØ‘}9–Z5$´Æiå¡óÚi¼ôùRbž$U2€Ùùs¶[J„˜sÉþn”Ëa÷C;&€JÕ¿,/ûd—ÝÕ«(ØÑKZiMh†D2UºÄ1ÈÖSf£ô8¢Žß0ɳ D)KŒA…èc {†Ò2bŠcô”Gq]B4òÒí»§ Iè“Ê'Á¼Цû#„±ü(Æc˜0s¸?Q\Üd†¾¡d³Z£nhsÐ&è…Œ‰š8·qÜ"xªí!ï¼LUîa8» õk˜¤rÓ&…ë”R ÍȺ±Á"Áˆ± ËK¾Á‰Zb‘繞)”儈 ÆTQ™ÃÉõÇDfB«‹:€98xݶ©}lD¼me/f®ƒO‡x|exã$•?Þ©š„ïMšÔ}“cÜR (ƒb|¿ú5–ÓB}oÜx¶UâsÀ?_av…ªŽÀ—·ýr>[ÑJÆi)"o9áQb̽ÛT³žr¢§psË,K™x–Â1\é2ÎY»™ý³_UVñ»TµNl]0Ö„!GÅ\Kêÿr¾¼Ùó‚È)>@%r ø®ÄÊô¾ù ^,fÁã°Îô8ÜìÉt¡šStšÕy€fúĩվï³%[ûáC›Ô¾ü¯åæË•è pÛ›{’ýϽÝ^In™ÊÔ:8Óýü°’7™ñÝ*,ÓÆAl‘K R×0ÒÚ›•ýƒyFÎßÜ刬X^MÝùB¤áõO!Ï6‹aÿ*y/±6Ö#^ägk(õ£¸Ë·á-n6*…•11w‰4|ê7píqsÕêìN*“«Fw4Ù†Y)1½DÐg"Qr7[!A”FCaIEÐ%žéSU÷ˆ»SƒÑ:”→ªêÛOÕÚð<ÓtÈì *t°²¬çÍB¬ºF¼s¨8bĴ㞆iÒª3†‹ß¦š…L\Ô[2îíámý­_-ç·Ë ¹–5ú±ž€‰<\€l¯ºˆ¥r,&#]I~·ÉF.âmôð²UÖɰ)&H<À±ó¹ÑTHûà²»ÙØ`O©vzÉ.ݸ>öº@yFõÉKàKìDU*Ûþ³[vÖáÚ†{ÔÛ°ÝÄkQySyý½ÇÄÐÇ6E#Å Íæ½%¦´ÄTš;Ê¥SÏß‹»kR_14^ÐBeìb0'FøG{¶ºìLCéE7@)|æãò°—m€±£1Û;•4e´Aƒ0_hÓ¥”•ð Š*Ü~‹Q‡˜^ Ñ˥В€Du$z¤¡e©[^€aòÇ1u&÷a“•ñìŠÊÒ>®Xô°6àòÅÁp‚çãŠK¨ÅÅ\ô^X銼zÃñy£¡.$ ¦?V¶^T‰oþs6ÿvÛýèVœú‚³)VUVv€b/Ð]x>Ç´UèÎüêîÃÊ$*º¦`8‚³Ýn†§ ÷Ñù™»A÷H]àØÇON EZàT£GDg€“ÞnѼ]ïfÛ­äƨqÝÕó‹Ùj~\Ù팙ä–ÝÜ„%©ŒŸµPvìƒím*øS+æF\K¯›¥¦^Áà;R¨§˜Á«Ñq‘_:é£Ã ‰Hë2L¬ƒê_ˆ|½Ñ‘VâËŽõKbt¥‡Ì!o䕃Yq4P¥‘82LÂÐp“û°åêS|Rîþ»Iãוë"ÎT¡Õ‹MË_ýæ¢ð²Zó(„S»™í“Wmnú¸ìf!Ç'O7j勉æÁ&j äÛñyú+¢úQ_*Ÿ‘o˜¦t&óo¸¥êzÜ$§hRô› MÇf–>o}1ÏÇkZ÷§§}Ç{NŠÎ±Ù¹*Ô—ób~b¡ôt“À²°Ï£Ï¸nÝëÙþ`ö†À&z”C«ÎQV$zT¯»ÃüEÕ¥ƒºP×%€ÀKX–š2Q~'CQÂÇžTôQ”EgÆy` …#Å@†*¯õØJ®0>hŠÓ„×Ð× Ü…#'0N4‚Ü gµªÁ¥y¹;g+Lì-s›Ç:‘˜0>u0˜W˜î¯¸ªeUz$\Þ‡7¼Þö!cPaZ•‰1’½|Ç(¹'¿(Ž9…³V5¿…Öˆ˜ söX§Á÷ Mú~DŠºo4å3ãqþq†A áÂ)z/Ìí~›Ä‘¹´,•%'{©½ûæÚMBÉ6K$°Ê„ßGŒ_‘"Uo§¹[ÒºVh`MlÛxåÕ3pqó„W‹òi…€‹ùÍf¾#…¦óî6·‰ÕHÑî¤ýÞ o¨…lŒ¡x‡ä¦Êìv1™º˜¯dÿ›Ä”¶ œ f=37sRØ×an4ÓÆ;æÀP„›ýíìÿ˜ž<Ìg:Õ aqÌ÷xéÑI QÕ°« —0D/‰˜L·¦{½£0äÆN9-¶o¸ƒù œ×úÝl€J *&Ð ¡äJž¡)Fkf•ᦤA3Üg'— šáÄ`œ×O¡¾šñ´ïÅ*\â C›É“†“–UªK9d!ÞyÿbÅi_¾qªd©òº6^an†!"#Ú®q…€XßöÏ·ýþ@™ º»þaQ®o›Õz«~êA€}û,'+òX£xc†‡ù®Ìff°9ˆ!7Tž”ÎÄy:{áiNá<ëªYnÈZÄË[¥öÆ€6F\|S?ƒšÃÊUÆíh:8á ¬¥¡×êVʘxr†•¬daú)žXÍ,±FE’Ô—€Ì%nyôpëà–ÕÀ9@äú?‡†è¡ÉÛÒxßÍ-“Nt™ûŸ3̯4Û}—;ÐLÕý *×Ä2ä²ó·ÀƧUnøâû)v iJZ›÷Šÿìüu‡µUi7-cÀ Þk†E­—Š}@mâ䛌舆HØ¥Ög&ð£‚ìl€ð#¼æ·îa”(±Ž©!úwþx¹Ë9ÐKöáÄÓùb Qö¸dpZtÞÐEeÁI³ÍœóÇî”ey vŠS&õËjæem„€a¤nà¨í¿QÖÜ6ÚLÕH_°Ðv¿ZVÊ|v€-7›x\«D•_ if—Ì6ÒT¥¥ÅÉë.Oì(€ŠÝ€¹$:nM^Ùa`ò˜Õª[¿% Êd˜fÐnùŽ ½R0)j*û¶¸Nv³ œ;áAà4$îÛpËÝl wU”YQŒ‡^›ÓjÐìy/äó&qÇ5š­û°êž8ÁŽ,²,ÓåÂø]IºCË]Øké„d^å©a H˃qÝIÑ'J…,×·F¨úÚ›ÂY-±ÜZ£ÍpTc`hm§Ò{ÀdÞq®ñ˜pñÐŽ+1GEâÚ‰À~ŠPä¹Qe°jwÀÇ%&x{c©ÍìZF f|5{fS­—…è;Äxwúî §Ž·T]ƒN,Cn²ò–?è<UÓ½á¯nòÁSð_Ý®— ÎÚ$5D.´Ül'‡¢²^i¡ýóm}|ØõpaëÕfñùé¤â/šB8n/Ô­~Þ %mj™²+YDùêåûÃqM ȲŒÞ;K§(Æ’Dq½VO{ œ˜D65âvD.•ó!91蜬¥E}‰@®SÐìå/4¨6DjAQ»ú'k;\Çû CËÍóüÀ¸ÒöÃ:Ì›RoxYeG$:”‰ÎÔëqœ¦©ñ‘ß½z±ñÑÍqÒÔò瀃§íìá€íX ùrùdäLxM–¸öà·‡&¾éMKè7õ¯½ÙüÀ­ c¼ô–Jh‰ÞyØr÷¼> îGÒK’ä·àZÒO•x4ß2×ÇÕJ6ѰWJ~±Z}AΛ 8+<æþä{Ke¿ûç_Tôîq¶\ɽ†?rî=]a€xk¡e·ip¹äíj7RYÚµEBƹœûÝBvm]ùvÔ! 1å ÌvI‰!žV!(O 0Æ\ÔÓTãZ´Õ»¨³U •‡[ðc·[/7BŠC¥ªBTn8°*ÓeXb&Ùu«DfÍ(íYäÌ%Ô.Öï°¯9°Hªì\£¡ ÞèØø¡ïż©Q)ëà™Ìž.bu¼$ûI¡!:€Cù©|5™“à]1˜CÁäJ͘v5‰ÍHÆîצú•WqÍ®¹T-Ô:ØŠ¢»€æ$ÄFr7”J^ýÝnÓ­lO‹`ã’»¹;×ÖMÄòD)¨6Ý£-ä0ÉJR 26KiV¦¦û1’˜ÿ¸8'n’”ˆM©©ƒt\oƒ:³ÄqGç¸0ôª1›&¶Úׯ~‚§”}C…ƒÍoúF¤›d>æ…ùebÛáçýqs)þ²,ˆ¶Ù£„¹§‚T}ÿ×™=‚ÒR¿©‡ÁKgaûãŽÍ(lÚ?Ñòª] ÜÍçAÀ= ‹œƒÈXèzð–¡qÀ‡hXhÄÃÃåûØôˆ)\³Ü‚Øø¨™"yQ˦­U¯8΃<¬›<Ñ«nMÚHòÿ¿›½¢iý¶Û0?Ûïo9Ð=m “å WëSÈ éCªÃ3=¿}ïb-7€a÷1LDT­<×Z+¤üÑËcÕ%0äUІ>w¤ºT_£ ÌWzÞ/Þ>uÝb/ Û[/Q ? IìËÄÌ(ò§a@qñˆÐ*WF‘¬hÉêá;.- üã0¢È ^yqÆpé%–º8æ˜aU?W0_v݃I°¼qüu‚ËÁèAÖhýcþÍØ§‹¬ªÌÁÝò¸¾_›Ë%AGŸÐ|×ÿÒÀã–úi¬vÓCŸÃÕê†ùü-Š{Á‡J)pž4ª¦èjyà’;w¯ÑpS¥P‚¯þPpd[s¡-œÿá\g…ЏÀvòÚÅDåÇç9^O&S7ªP¸&׌ð¼T»·ÜW‡åvåÈkŽVæÊÁiûc?Lm b\kÈ9Á±.5žçu—+ `q«o¡¼6æuœrØwžfÂŒçʤ­cŠt“ªi+s”‡O £‡5†ŠÓ‘G ÛåzéÒZa1ÁÆt*‘†´Y•s€µ. Mºï6@¸d×µ­Q¬%—F¸ök»$Çyl«óÜš3Þàm3ïCu‡¤m*݇÷@}`ŽùÚ^uWSwh× ,¼"Ý¢èð^^µæåØÀkðbO+-œíðƹFVg‹®'ÞטJˆ?œÍ·Ë?aG?‰çV™%õAïD>}f®›FH{éUX¾ 0îÆ“%= ZеèÅè–§Z[43­&}#È;'¡HšÖL3‚¹M…À°çäp7뛎ʺªË[‡<¡°jwÂ=ªÉ ¶šê<%š¡,§¥GØE®òñ#L ãR&¥2ÚÂV^mV€ˆ$»Ñtá믛éS¨É}³2„øo¦ØÄ'³m3se• Ф#‹ îd%ke®6Ï0Á—˜ßåé%3C±àa:Ñ"ËÔÅôb½•úÕpépR ¤ôþkR³Ø[q¤Bâá ¬Ìà0ÏÝvI¾ÕÑe¶¨Óz€±í@82#R`ûeO.:’ð¾6Àp( Žì±a76j d Åy>öâ‚Å) 3ÃmˆÂq¸M£Ïm½ØÉã…kQ¤¹ŸãÇ>,wȳü€*ýsÛÍžø@£Ýw‡cÿ‰+®$Eëv”â"@}ÖRÍ8N R;$Ø&µß R½xSO;RVÆ€°Þš4ù˜„Êm-i’{„ƒ“S/͉ŒMÄÀUeèiÄ|žúóžDQ ¤ùx4AšƒÛ=µ§…Ô—”2/¸ÈV š¼[v ,± e1|Þ<ŒŽUm6h¾Öu­ñåØJIh'gÖK³ã¿ýk‡vYyÂ(ý‡O<ö°nú5òïCb?R%¹(Ôbä˜ùš~„D.D£ÄãÏ~R òZ’‡â^\|pÙCÜÇ]£T½ƒcâq-J-ÁàödË¡U:o Íx¹‚ðbsž‘™ÑDRÌÚŒ—\a6Þ[øïy(—#×Ú¸v*¼®eV.$Á"ÛÐåj5âXP^0·KÀÂLwÅÒw gfáßhx°Üõ‡]ÿS‚N`Ib¿>VÀ¤á‘ã²I™˜Á‘£5®Ÿ–ÎÉP㟠býjW²æAVFÅbÐ+³ êÄ Ù^ „‰ ¨"­šQ“©j‘V(«ê P¬²Sƒ Ûîu9ïŸá8½`0WˆVÈÓ ÄûA‡Ì•™çÀ’ø¢L4£‰²SdÆ_'Fa$‘½%K.V³åúêÿ6[WÉT×*¹Žô×mÐý°½n;ÁÌîŽóC\Ó¼õËA6 ú)ꬬ-ì®íÈ™¿.×GÊõú3Ôhý¼o‰°’ÌPj"¸Ð4š`ê²Ö?óA¡S¬Ó,²4)}/úlQÙS M³ù*ê©db‹ÔÄÞìm3ät´T›Ô­¦6“³!°ÇŽC{à+áYk¾’RóÂb?°Ó6¯1äj½=¼éð¬¬)€"¶gY•ŽZ#9¾Þ-Í]ÅcV¦Žæ¥1×_:n€ öË Ü° Þ°iÝØëÂ$Àv6+¤ÆŸ-`ÐÝQMZŽ»nÑ=I0½´ÍN¸ÂïE;IJ’‚F-jèÓrØËc·Þö˜,ÆûVµŠ.»9RÆý­6¤gfD2&鲉Ô6kš›cJ7Q{gë‘ Ÿ‰!ÃhŠÝu9ÝÝxÕàž¯›AT4j}¿æSŸ{«¶ßß¹¥Àø·ÕL‡•][+VËêñ¸Ö› ãhÛlÐXÔYR þê×”?!‡¶À¹í?F¸øÝÄ-§•Ÿ–ˆšc8eõ`ǧeÛL¾æÉ§Ê,«’©§‚Ð W›Ú¯¤ŒY:ÇšÝÁ·âóoÉXÊ) ¤³<u6HêC±°$â©f˜ø'¸ä—R=£ÈÜ ÞwaâÂýW[s„ ¬÷!ÒiDÌå ;ÅJ-Œ‰~:ØE1ê™z ƒÜ­"Ø@!ÑH¸j4Ü¡­B€¥% 8­Ìt1š§À´S"#9_´ª,d¥ä×™¤²ø¹••_2[<¾ÞŸ/Ÿ­ƒS‘!A´ŸûÀxã––®°‹fÀvœDkõF—»~KJãpaÙA×ë·3öp°â‰‚ê„à! ûª´dŸ7€¤À°ÕòÄBApÁ( ËŸD@˜¢Ì©¯6(ÀGk“¿Ra,F9puøI–°å²±¯‘F˜k–[»1¡ñCG§U¬&@¾-kƒ®.lÇ`Ì¡¾z­aXÈ £ãÖq±<v²ÈÒÚ^Ú× x­bÄ'2óÆÒGÎÑ!ðQKݰ-Äž€P•ší6Aö*ߪD/O’Á ù ½ìúãs Å„‹¢)ÍEÈ#F“Œ˜T¢é/±~Ðk*rvñå&è^ÊCÞ׎âŠJ³xçZ‹–¡GM—q÷"Ûm$Öm4€»ÙaþƒÔ/ê„“Áhðº‰%€A¶[ЗÐ"‡yR[¡¸=TÏ«ªMý‡Ý?\>š©)ìåh«§àx¥ hù«¢lüÈã]ÅïC¹)yâG_äÅppSw_]çïÆNdEâîl}¦°›= >&É$XDä›ñ¾#åÿó7âd}#qJ"D?ΞÃ$Âæuá—Œ¨¸]³ÒÞj„ 7Ìa=˷ܿ譼G¿Π’Y5ùõr׉2Ð:°HE§%R€êöãVS(YÃ?#¸,8ï vžæŽÔ)øMÔÞÖ 'ÅbPk”Vþg`vbfj”2e@qhÊù€•¼^Ô¦ÄÈÎ ®NÜʼn½PðÜKkPx`{m?Û'¤8+º*zë¡ÚÄjÒ9ffÓ©M8kìuybµ.R›È”±+Ñez0¥'Laeî¨–Š¢ñ m‚I;øÔÀ°ÁÅWÔíD[ˆh¡, Ÿ=.¦{ñßmµÓ‚°£'úL îlÌiSMÀ¬ÍÉ$ŠYc²q¼tΗý~T„£¬Ì%g€êŠ »²UÎÈ:çÌ”ž»ß_JN¶:©¬c€´ÚW%¥c>p+;Á± ¯ñd•#C[ vwß_Jª›$ñyÒÏ'÷G¡D†d ¼È@ð±ÜB¹Ÿ³Íü¥ß‘mm¹÷öµÊ}TñN®#k“€M¼Áqj¿Á†(çl‹xkõ!/b—ê ¿³õ›2¨`Ðþž5®Éu¬…í¿;6û;¸»:á—ËÜYRgã7‰‡¹öÔ:c²&_ ÄurÛ£ƒcá7¼ –ÿG•c0GZ½‡¢”ãj5Øù¨Þ1Ÿ›ß|ÂÛæðÏ-Ó I Én|r‡Yu7š¼Ü¥6{É! œcö=/ „Ú× ª¼¡øgÉ7ƒØÝ-iÓ¶ôMNùÉn\¥éØzD“ªZð›Œ;5S"¾ÕÚ Èüæ’½}ŒCFñ5þãÆº°¤bdåtè *Y)@ýËEUÊ!$!2VÒ*Š ´^:apéT§g»ÅO²ÎW.7 ižþ –»ž8elR–“#43ÒC Yn²©÷ÝÍPƯG¿ Ãã‘m>9"¨AЃ-ž•S#’¹¢tïõlÚÆÛO %þ¡M&¨k°"â>³6¸ $[P ”Mv©·¼9›\Ð1c^`¨æ`×1Öéy™ó² W$ì"®¬l’»†)UÂig1òüíluXŽüa(‰%ÍàØ(݈å(ˆíVNT¿7ëÉ¿Åʱ;¼/»Åõqc£i¬aôflÀÜY[Ç åô>[!ðÆyÿIí›8Å;£8jÇøUUEfÏȶ>êཱི´$‘%¤j†—X†ãÃçoFqÐZ…öÍþŽªv¨ãOšº^x \mTÔè"gÈö< ˜'~XÿÄð )DZlvÎyCá)¬µ‡òÄJ~°Ÿ‹Öy+Þ#ÀŸ~ƒ™‡ ]‰‘Bêl©’˜Ñ"óÜ6Îl‡š3ñ€²á–ÓU˜±ÈgÎÐup¢Ñ.ͼžÐÏÙi²¯ÖrÔÈÓ°{¯"oÉÆ²”)âFö²•'Bªáȹ‚\çX®ø³_•”š •Z¢ê[tÑQb,W³í_þuÊA÷â˜iU~ˆ»ùOü¯ë XpKx…7¸5•9lØh#,KŒjÊ&›ý›ŠÆj+-ŽoÃ3ÉcÚÁz€¤õl±àÌ%I;ø0jožÇÞ¾ŸiÒ‰gDÝ\Vn/€Ø>È¿Z:“ED±O´¼ÇíXvÔ„#·ws2-&aº~%°ƒiŒcZ´ÓøÞÔ~'=“Õl‹ñÏæUºW?«’¸-7øçÇ×΀AVËɉ«0æ¥a½›“y0WÎ’£3ÓÌ TÐUu© ¹Úb¶É!2åWaÓ¡[Dƒd±!àP#ÖGÔ:òÄ{¨ NtlN3'ÐH3—x/avybuNav\ˬ (J8ñuY‚ÖN¡"Ój† Lñg{Y>cÜÚçÏçW!\ç±—øb»\Oaƒœ¶w(Ö9¥3ß›!ÀnFÅ6Df6+KÆ‚&Ò¥áb‘YbI\I0Žf '1 Ál‰ ÄãnùüÜíh‹ógkvÁç?ûëoå 5¶U´€‘ayxÁlÝYÅÿÁq.}cÙ*„‡H&Îç›#cf­\äÅúa×ӽв’U;ÆLláâÀL|æs)´ƒ3-ÊÇçÖ/ÁaF9·s“!ÎaQz‹©/ä—†¼`q¹«Âù3+,xauê|” b OÔýΧÐ?q$ ão‡‰O&¿GªÍÄš>"GqHÝõ{êÔŠLŠb~`tY³†k…RU&¿ybæ´µGq†ñÊëéó…¢]¥U} qjä/›áÈ`¯Æ,¾¨;­†›)ø6ºD [ é1¿)­ž•Àj«MÆ-&$¿ÉJKV Šÿ3ؘý…^0‡ù‹9{ȰÖÌ ¾Ž¨¨[bb>ÞXÇo,Â9‡ m'·-ÒÆ¹åŒ —Sšp8üöD…øÜ¨¿ªS{ÑØæþª1!›#\p¾Ë çö`AŸ„ ÈǽxZíV˜0^2Ä2^þ“8ÅÞ÷†Ý[º·õ‡Ù”3•ŸîgË=Ìäêéc7³¾AhÛ0ó„ÁËç &ø¡­â,­6í¾û†ž<^[á8v5¸¿ ±µwÁ…±H¬™ƒa,§Û'à:sAÒ“‹Ÿ„++·Ûÿþ=³Ôò>÷ïx›¥ÀƒeÅ/¡_AþŠj§fâë1V¸vÌXÍu6)rle†F앹›Yjçe6ŽÈ©dö}$)‰úÉHЖ&#@_¬Ï¿×­4/ìn÷†qh…=€ÆÂn¢[a2Ʊ$ûމ®6ÄçÁ!€­ ŠìV+<¨ÖYÀRF!ÂjŽ®pó0†€EÌp_'SÀaÔ"|išVÀ‘:ó7¹Ýî 2—»XKkîcÜÔ¦-j¿nN—72´O¨ˆR¸öFs¢áÀR´m6ÙŒ|êñ¿œwï&Ö9Í%Úàã”eEëÖt‹ß8­‹߯T$ì›lp‡4¾»~w C„×ÿG© ]ÝÝáÄÌE˜å~hóÇn%Á† GøµïW?ÄŠ”¯s)ë |§ÕHݯÏàT¾í—û//œÝ ½»ÜˆÖèL[a¼V­D9äß)Åî×_7öÉ2·Žˆ÷=S£ÉŒq‚p•Yï\á4tÄèQë´9!Çü„vDZlÔf`’N2{¾0;ZF‹\Seí$·Â91èÿÏ!⩺Ùnþ‚±ÃAíƒ)GLÄŒE’bMAdÖ2Cs#Ì„…&öX2ع›Vôàv˜—Ðy¤œ›  !Âý)^Öyê@p¤ÀSñȶžW®=c€côÀ·R×/ÙÔ ‹eæ /ß´LËáÄuš¬-…š\h,ƒ·z².&…-?INÜÁüwQÙd$Ûàfg«xÅœ½äf°Ì £ 'J´PÙQ$ Vã‚°>šàFò‰jû¥‚…óor¡¬jÜ€z|¥ÔÈZ®"s¾Íèê;H–8åÜŒöhYìæô$ܰ98£·F:Ù¸ƆÜ<¬ ±·ç>ü\‚ì(‰–(™>‰¦¨O‘{ÇŒõ Ò… òLK¤”óÒòæLlGŸ¡{\iÄÊO9HRƒ“ß8¯‘gi!«ï¡F/°gV·h3Mtms­m陋ø±šJ$‘¸H;:—\ÌP!¶Ù/ÁX\šj ôáµä¥[8ÀXžaâ@ŠEoÿ¤\¾¦Îø ù1”LM;ìÉÚù,j¥)ñÅ„ÃÁ8Lêœô¯×Íc/XJS™‘"‚ÛPFß›-–qÿ‚ÅÓ¥†;pb¹7rh}ã‚,‰- ·u†Z|H%àí—£}H/Æ-%NÞïä åèý=Ÿ¹ÜV sEÇ,¤ gÎɈÜÞHÉ'òº•´|Mj8 ®I]þÄrCbgàf.¯.î¯î®>=þ÷ÙåÙ—Ç«ûÿ¾øxöéÓÕíyMdm´ê+òâóÝÝçOÿ}þõúúê>àâì(îáâì{üpöøþw{óðÐQà»üö|ÃüþE,Æ(\ZèÚ\Ea\Ø…ÌÂl³ˆjgÊav ´£¥Oee1O0­Urb6UQ71hU«7êÐÄPìËŽ?¾VýÄÃï”Ю†S‘W¾á$¡ÝF¤ä y< m„‚r÷ef¸Ð*ÖdóCV¢¹¨‡%D&Pe¢²Eƒ²)D+ÌÛ­¸¯›É¹¥4Nï€üì¦f©õyìÏ€˜é²ÚMÄbÑH¿y”û‡öï³-L'HZ?: †cy0>:ÁÂAbê¡/Öô|w`{ë·où…cs”+2‹ãıvPòŸÙîÀû-Z2n-)šÕ=Ãä5:•ßÉñ†êN…×#Kh&Ì?g;­‰ÉauY4Ô fàh’©tƒ­·ß1SÍ8qcÕ‘ý ¸¯›Ý42µS"ŸŸLí% Ã‰Ù—ßQc51½Eݶöü|õqÍ$`Jm÷ÂÌÛÆù§1Žg¿õ ˶‰|¿n¦Æ†>Ãöœ3ÈdnÌTáÂí‡Sv.gJG‹$f°H\—´Ml8TTáÖµº=VLÐvÙ±r¥9 cÛJ D¢B£á=5éÆdü[QÉšð’eÅ; Tô4nƒmqo`né³íüóîr;§òq†Ž¤¹¦zŒP˜˜uÏ5G”ß¼˜“Ãn^†ì9v‹ôŒÂÄ±Ô yš°%>x;;ƒˆš ¶:u®yY" Ûc¿Ô_à2 –®*& ÌÇï¥VdôºqÞR!¹†GXj>‰“ÚÒnºS­åíÓò*i^Œ—!_à,aBÑÝVZíp‘hBý²& qj5¶{u³±‘>UUÕ#ìÿ®c•ÊËŸ¡VF’%i5…´,ÜOI;…ÚÞ0?±ì6KÆ Ã†€lÛnÐçJˆØ—Žã²sÍ!Brù¡<á¬Á¬4ÒŽÚQ¡w=ûr- ŸgHXÛ”Q8rOð¼9hn!ÊÁ-¬.=’^ëÖøé—O4è™0BOYl‰™ÑáeZCPpX€di_×hðÕä–÷O•¨â4¢hH¦«Ò”¬Ðaúºok…c$êÅ{åOàˆ=3íx8n)åüån/! iãGwÜ£áÌÜüiÓ¦î<î–0ldUH”Â…ŠšàW„´$u£Ôg0ƒÖó­1Œ°>Ñ{ôC­çT!î¸`º•¼)¦¤V¾¿N§_/YÌM8ýàºS(Å,®91\G‘1›_5 ‹Ð/Õí¿ðü`é·x1ò ÓqYhú=ÄòÑ8Å=«ÆH¹„ÏǖȰ`ËC·û±œsTÌ\†I×?:÷àEÒŽÁ¡¬|“#F²ßd@Yãy\î·«ÙÊ“\ïš>Ðx3 ØšÝl.Ž€ÍÈhyï2U_O4ªRйTj°±ï¨Øí@`6wP@S¸ËÇ~ÜF*aÁÄPø‚cHýÕj¶ÝcùÄ·ýcÿÿÿÏ…£Ê÷jÍe¤¸¾Áq¥;°6ž4…­5¨Ï€OD5º}âêÇluÔ^#'b1÷§úÌ4ï2à·GÊý`y›4WËÔÕúxŒÎ4»’IW¦¤ _Úh0»ZSÏ—zþÌ·|éb‚ðg` 4üzÖüWXâÇr6ˆ0?ü½*Oa4{xª5”xo»Ê4äbŒ°•:ªXõÛt¹Á©Þ“¿îL@dK®Ö<1g»ù PŽ9J“2ŠWp莣Ö$ÎgvñÕ¦bÝ•Ð|àv3 ÆÄçóüol «ºŠ)ìàÒÇXØ‹HÜÄú¸ØŠš$½ý³Bƒ8ÇyéîŽÛ櫃/&%,ÖÕ«Ì((m)Îð5ˆÜ¤^‘„t5sè–,Ôý!ñ{b,ô£EK#ˆÎÖ Ñþ(ž¢"<æ-¤W6aðëd£Â2iµJ Â›L,¹Eñ™˜ÒS³læ<Ûƒ±e¦™Ã#„㑟£ýó8Ié”%µK@ £ˆ4MTto9ƒd>Ñ ]}Á5©6Èá'Jà4*yLXWqøÅ—V¹FHáâÅZÞ"H¡‰ž–#‚§…¥1­ A߉» Ï|Hvð¤ åT¶tp òÖf”Ÿ£‡¢N7kkûõ„ÅJËט+ƒŒ7ik·/z.õM*¿dж[öâM•©Ú¸´=ŒÃr[3MÔŒÆ7¥³Yjȧ@˜ŸÅ3?#kr %8c¾¨ e$\ëÙÓÆ~“ƒš×ƒwá[vò[s*ÔpÀí23+k¬ ~³%f6ÿZ/øšh@Ê¥:„€…&- ?_m°¨3˜p¢k&S„ Ò#Vƒ‘¨Ñ$ixóV+@„–?î‚sCœ€åå` ¬eòCIÍ (˜À ‹"tA.4rܰŠ!t[“Ê–v †'¶™˜xèm“µ£‚“¸@snx›$ELÀø«'bò¾6/+7šå Dˆ´^qú\JèÕü|è»yè®1Ó‹äíc`[†Ž ¾ƒ?P4Ŷ2K—·\—˜ujü‚º0›œ TmW&;ƒ±É à«}Ì¿†43 5I`’O& Ù4C$¹­Æ0¦¼,²ª ÞsOÛx‰3b-°x†Ý¾ŒL²j€@ï7ž¶‰ Y 2ãâ‡Nö>Þr+ìqŒ« YÒÊ8 0j¹ZX¡÷ 0ŒâLŒ{Ò  B.54¢R{]\àµ1f‚0é¬%œ¾îQ%TŽIÀt®C_u6nî·áJÊG~ úV“+5³E;¤ö ®oÁ3ª.ÕºiàCX_gçU`‘ÊÔZŠ‘š©ŒǾ£ew†)T©ƒXD_÷´Ô3ñ3¸z=à ÊjŠ4ɳQÿ”£7æ¨R2àþlÓlð€EWež!J|€ûU,f ½ßn+ÛmSŒºu_ÆZ¬ò‹Õ÷LÅpX³*t [Ú“®ÞÍVt-÷› ‹ÿjšÀ—I2z€uæ ”-ÑA{Œ]=(C–—yV·ö“úí›~ ’°Ü5Kù¦ KйD=ör Ô~~è9À•©¥I6¤¸Iné¡Ôˆ r$Ò‰ÑuFÀ§¶ë5RÕ¨“¯TIUSýÃw©K.Öë}>?˜5·º; ¤skÄ`Ú¢èØÇ6Ì´)Ð ®åü#qd–çRóÞRc~ü|â‰k6îåTàRi2‚*£ö"LÌÿϧc:Žˆ£¼—Ë=ÎÓØ BÍ$ ¾H9Ì’:sÆØÀÖÒI×®¼¶» sû#€øasR â<;zþ*ÛcÙçfoe˶݈:R9ñZ±rþz÷á–Õ³l Â>„–\që`îZ“ Õ‚ÞÜd´&0£&–¸Æ /# &€xZõ?\4nÒŽk*JM®YìƒÆœlBã“„ßïö5ݰ²ØÂ±›ú¼ìÝݶFTâ'ˆ{Å”…’±Çî%`yˆÒ ,OÇ&þÜñqc(HÀP„ˆà©åoÆÜÍ^)._ÜŠÄ_8ã`wŸ‘5÷‡<àhÝô"á¸pŸJNÓ˜—±Û3Ë¡P&µH ©›ï×í +ñEضnÓbÉV¹vD8³rÑ6¶<>œ¡Ê*VP̼a˜MAîjt·‘iƘ‰ç§¥¥mÇçpHÝ\;,‹a‡L¡.ù`jŒP"‘U‰ûvtá2œ{ޱkö( `À¸ŽÕ£DÏi¯¨[‹)h:KhV—e3xëô=‚rC>xýX@§¦tØáxÉ¡Í~í‡nCÄÉÜ…µ¥†˜é÷m¾ŠäÕrK‰ ¾°’9«3Y2‰€ÕlÌ‘Ú f¤S“–­‹ä¼yêÉ-Í Þî˜I–_»¦Tm¸õŸˆ:5!¼té§Nºú0^jNX¦å±^‡ß‹i›è€KlØÑyÓ‹<Ñ$ÄmMŸÐQÅWW>hMpzÏSÏÝYLŒ¡ls'&¡¤6¡Óh¬¶ÎˆsÊÝ>tlÆÆ\+vßlä1˜·¨µ`­òÞäUëÉß9i¸Ï »46Wè‰dCwkUy>·¨áÆŠÆ“ûQRU<×¥»ZLvQú™•õ‰ù²B{ò¥ÍtÖD@ÌO…­­$°…ã“1¦‡é®Ði"g?à"×)LzᨻaÈ$ˆŸ9 ÂÝä"‹Èu¹0×¥g@qwQׇ÷Ùbâ…måwÝw¿\EéI8¢‹!œúƒ(Gs bTLŒôm¡ †#þm?ÄA‰®¤¶Úéö9Cß½:£ëƒ÷s¨6—:$§  ÊBS»£Ík‹»› Ë ¥IžZb™™$æM «àÝ~bóÁ$ò^X˜ÆN›’„ y(KÙÐOKZ",”9·Ûß‘äo©íeü”7D’ Ö)X0/ÜņÇ"–îâ ÷¶ÓZÇ $·¬­ÄÅRv@+Pävà HIY‰ERÆ€ ×ËMÆíöwPÊdaG’‡»„[Ü`õüDˆ¬É^Ã(ÊøÓå¶FÔܹ ÇíÇZ K‰-Hô ÍÀ¬K©[ìAø²›F#9©¬ùÎbœÍ„KF,úRébeGÚÊQ;vfŠà$³*w¼—šy×W?ò7øáAn];Ò¾Heª4v1T¤ØÔKcP´i;H¾?9Å­ÝK‡/1íD_è&ù£Û¡k’7Àå~Îï=£²ïD(ö¢Ãq¤ü„¡+¨ÜK«ßBcÚÀèEÝVe:ñ$? ×ì™ ’vê|©Â/îk3+±(íö˜,TŸCE±Õ¬4zøÆnaYÒê`t°îÜÝuGt´·ºp\ŽEÙ®œ@ìa ç§žšLqÖ˜øêÉñ_Ý®Ü7s·Óðâp€ûnÞÁ¢<1ÁFÇÈÊ|°YŠÜoqŸüʺö ù{j¿´r=³‘ÝЋ¦È) ˜±ÄvG{ƒ÷1pæöˆ ã³XŠôIÆØ¯wª+ÀÒYA™×&E¿àè³=mvL›v0‘ˆ%ú¤˜$wOËîÇi;fî_N`ï7lrê·8œ¿HÑ6N¹ 7Ú°ÀHFX‡^q34 ,Â5æ´LŽn¡7ÇÀNX8ã>õ´C•ÚW^å˜ñ.ÛÚiŽ)^5d£Ë¥Ö¬- =`” s¨šPŸšÄWdH­Äöa»Ü NjBÉ–[ϧm”\oÑšÕ¨p²œat••îåÚ/ãUçŽElwžÔèÂãˆUúdG£Ö±à‰ÍXæ'¼hwЛÝÄpkxtÌî¼ jêÜz°J»Èljq^k{È-áÃü)/»~#ëd:P+miŽ¢8‰òªC—€ÅÍîJ“Neš|ÊLp•nS¿í9Ê­¼s‰’´!‡š—ÎÛGPrê$¦ zr MÕÙí— q-rsIßß‹œçdòØ0;¨ne1=w\×Ä4MÂçb³ó æ‘TëUï좻%¬×±“"«Q@ÖŸ3rAôbåHJ+½Òr¿Ž±÷úhq€Š©`PØ-FC “#PdÙqg”w*ÌœsO’öpnùÐWÎPcœ­¢†#úéçiæôslÝÝP ’ßêvŒ½½Ù¡$u‚–Αp‹&-KuªÖÙæÑK‡áUàH¯Áy6$oË ³Tü»ٞ‹ ¦šê]15h]o2{ÞCšÊY¿c}’ 0¦Ã ‰¢`—¶£ñع‰¯h¬Ç8>”{¿b/r¢Ó{IIDµiÖ°O/ëZä‰ ^‰ /ˆOLšdш‘:ŸP<”Éx´¾;K'³-ùB6$ŸC Nò$á‘ëÙþpwâ6¹G_¨½¤×Ëk&»s02 ž(5íœ ½ÓnªÌga ÐÎÇ%Š’@ÛÃXFÍ*«Ÿ{•ô0ñD?öŽ<ÖE£"*€œ-Èü‰N³…‰cÍÍåD@k·cºËAGÀäÕæí?02Ï*çƒí,Ù~Õ&þʺR§œ¯²Fw·ëjäÀH˜y1­!m°xmbNa4´âOZT:èß–KOsÈD¶ªÜ}e×8w4™²§Öy]`ÓÇ5»fIÅxúÄWI;xõàRôê̘°,²Ò0UfB©p÷sVY'‰í'rÖa3F.F¯\’EòôS¾€hGoRs[ÓxØõªP†åoݤ™æ¸By“&B|â€D¸Éât6•梌Hé-ò€Ô”šÙgT˜±ó¾‡»EH]æfÚv³å'¸H˜X%‰×Ë#Íëcÿ½^v«Å^ò¨€¶ƒ½Š¹ì¢6à•ÎáÐAŽ7L1€0T¨"ÿ¡ŒIÁ»'¹¬¬(•«ÿáïÅõû 3ò[ÛŠmÅo>{’½ BS¸H'áVøÍñ§óñ8~ÊÆÝè³Çõ`õÒ¶Tÿ‚WvKù¯~#‰µDÖÕë5âÐ.­ ŸÁîZ#ƒ¬£î[¤P'˜›²4ŒÇM36i¢ºy@ï,¶£§[?“úc¬­Œ“åëræÕ°…ù²ñ ›F¼HnÂB#Êñ ÆÐJ€Çþ¯U”~,ý$0Ë[õx¥òóÏøÖ@'óB3ÃQ»£JƒÉW•[C\¬øÇ¶`º¿ù3›JÞCn_%µPÞ˜kÄÆ-ŽGF"×x~3Û.Ù@ò@eËÌíKYãÕR6En¿@¶íãl½5z ¸"C×±p½Ð}QUj^C€\a1Áhi¼Ï^M yñ )«¢t3.:{ßMš›Z0'`ðYb}ÄÄÎ7‹zŸ&^šñ&Ï-¯I`¶°SLUc8wá~0•¹æÍc+©¯Ý™ÒDmM!OZ«òxí†`RL؇`·x}êrÊ©ÁØ2 ‰FÚ1 s™$•Ö µ˜‡ ¬z5õ¾©ûóMmÂ÷53X‡¯™š1Þã#*er‚zV ³nN Ü\Þ…#ÌÈ%…hŽ»¸ùq¶\Ée·¦Ôn‹X*Ã<1½þô,ñÈ…úd  _W½x2jý‡ñ]±t®¿Ñìm޳ä‘Þ^BŠ›Ô^fÔþ±?AœÕƒû/­A8(bÊÄÇØÃFH`­²Ä2›Ôh –ðoÃäêžÁØÇí3Øáï·oCn#3¾P¯DÐ,#ëÀQ–z³P…IŽÛüsÙ¯Ô~§Jw6¡8¼m»;b±Üd(èHQo‰ƒ~Äì̘[€k§XQâ¾ûÁÎŒÉæ}¸£Ùh0dèþ”F!‡áâþ}H®GöÅ™Úd6"ŒCý}^'²L§e]™S¹Ùb,R•^ý±g Õ4¹ØòÔU™×ÆýU|…~ig1š}yd’]o‡(kÁHéI€µÆÔEò> #¬ºÙÎKñ¬dÐРðp¤©§ž‚î>V§žòÒ:KåÍè{ÂSXä…ÌÑ2íH;ũŻ hƃÿ¥Á(Í~ÿ‘`0ÒøŠ“1׌™ÐšáÔœ°êTÅ/T—ÓÚu’:;õ±ëÍû Q·©QhÈ' ;öHѵ?Ðá’~e5V•§öñ–ÒõhªéÊ´ó4‡uIiX´!`LÑT;Wã‰û ÇÜ\òäïR½¨É*ƒÍ'dkëHް¡ Á¨¥ÐU–÷3•>Sn¾¯8QËä†ÁäÀÀ!^冘ב(†fMiMMx÷~~ú%o¯I•á‘Ílû€Eát'ìEÑé±™BÑ7`ŠfcÁÂÌËÍ'¢´Ä‚ºn;Úy•±yJÈÊDµmôÐÊ<Œ™ÂÈ2qÎuL”£HtœRÁÊ]m‹5q˜É4†ŒGƒ5ªk“ÿêUk{ýâžÉr«iÑÇÞ7—ekûñS“¦_S¬’žc•˜Â'è[š¢Ÿ›ùò·Ç~Âå{6&®µeV6XŸà€Ö‰rƒŒs|zŠ"m¢€Ýo2ð˜¡7“¥*RXDÃn(fÈpÙTœpœæ¨hZ“ßÀCŒW&^1ŠX[z‹Œ ºîY¿„) µCWw+is3³\ëá¸<AÙ(¦doŽýˆÝaòk,§O…ôØ“,ýÔ6Ä0ÊC¤ÞjUjnÖ§S~ä‡a6žä#ìØlf†ÀÆKÔOyŒC6·÷79´ÌRÎ'=|£>‰‹WzöDšÖ8žå¾óú4±u™›©ýÅ2“’©4WÏÓà}º›Ç!…ì]wË9ˆ ý¢ ~gÁ»Âª 0Ë:Œõ;ÔÏK& ˜[uq|© DƒO€Ì0I0P¢Ÿ¨ ï‘qwCË]c¹&QÑ/ÅzÝH'¡«þ§¸RUl„ßö?‰Ž>ÆS¬|1îön¹à’Ds(Îj¾ºõlûÒŸÂ)a“:0:›˜&Q?£‚Hòo%&ïÎ)à§#Z$˜¤šXͯ’$kZ«ºÚ’4ù™înÁSªá3úfÔ¯ABÛ¿t‹àfÏ̼Ò[Μó¢Ä2åZ˜šÙ¾€½rܽ¹4jucÞ½rb¦Ë·Íl½œ3  mk/‹˜”ê¦Ò¤Y—cHxF½'Ç'†{c‚ËÛè)ޏÀJWFÙ!1ëaš–y1|‡Ï©/1î ã\Á¤¸‹ëemb/ Xó*fÎvó\¡NRsï•Få_ÌÁ0˜J-œ¼jÓ&·äæ¢ÿ!I›Nù§X†áì:qžÙ|a§„§ÀIã>ú‡fúŽºŽÆ$È#ÌÍþÖtfëDÖ&R S ÚðfÏUÒNôè_NZ.›µ#“fÍ$L…¡¢ÍÓ¼(F(ûjygî;C¢ëݲƒÃ¸e­e%®W‘{ÃB?–xl¹GÍ$Ì}€ çy•\_Ÿ‡íñpvÁ»Ïê+âêú†#v+·äñé‘ KšžèâáæÃ§³Ç¯÷WÒQ> Ò]c°Ym()Ñž;=Àe–šPÔWIùe½Uc½3löŒ)WaUˆÒJ’GZÙ¹£ÁÁÏêÚpU6GXЩU¦T !½øø¶ÅZ$l§ÌpeÕš|͸]þ±;î°”ü\ràyeÿs¶[b ’{¦,gÁÏØ9¿„c~,jæ†]ŒbVjr-jí¸<®×oP™Ð¯Õ§ÄÖËx݆߉q-£°¬,a™B}™-wSÈÆî+N÷äTql° #¡Î Þ”V7±E #¼vÇÀ¹âè 5’¼M¬àÆÎqu&SŒ õv€ƒgɶŠÿDLÏ«´ELéoÞk¦ c®ÖÛÃ[”a3šÕÀö°MÑRc»ª?R%dÆ(5DD.¥j»âœiÈë%i6xÙ£•OUÌXtÆäK¿ZÎß[¼ÌàÔÿ¥á¯7¡¶ › j£¸D(ÅÀ|èúu'Ì£1²PŠ"ª7GÊÎT;Ä ”æVÿ0ÖåöP»vïÇaô8“0Ö¹&6¡Â+§CÚu”»‰S?óAÂp'L!0J-”æ’C5ŽU,gᾤ›ÊMÈ—Ùî°<˜˜Êhaœz¸ÄjRè\o7Šf¨âÒºm}w¬8‡¯ž°EÝú­ØúÈfª©gÐý»yç™hn>Wû >w½Ü­Qq§ÄÜÒ-daž9õŠ¢LüVÕÝÎgEt“¹¹'n5 ;dFK;„¤â›c\7òžÁSroE›à‰ù±ÜõÁÚ‡>8å`„êÖ‹ª€Hb4uNâÆâv¡ÂNHåin2ÀXü—ùOöm*ªévQð[óÊ^¯6Ýùpq¨]P·v|x’‚eØTûh¹6Ž;ÌÞÌú½´°Ty„¡ 0¤O̳ܞº›ýe‡ѰÔ:‰NpmQta·XÎDÛâp/‡”j¯ 1ÇüŠD1_žæ¢nÜÐAÀ,wKxÉF8·9cã‰C@„¥„ÀBówp à°£Üç|ý'VXû£{“<úœB–´fÃÇJê„$ Xf¶Èô{ZI፬“7¸#¶p«=éùÁ7P@f›ÙM5eéLÀV™`À£/2cVätî£ ó'™~‰žä½¬¬‡.”X#Î'gÏ0dBAŸ·‡åÚœ¤ Þ×Àîè|S^'à—p§†)ÁĸÈÕÓ!|ÃÔ–±¤f_Bô Æ}Lj„ò¦¶b$äš\r¨º4þ´&ƒEK/­vuar4LdFH‘¤ 뺮ŒY9´³4ÂIE2cØ´˜F‹c´¶Û/GëÀ yo#À«$³”‡Ýîy6c"6º³lð À¹÷X™ë8(9IF9ÏØ)g˜+Ö¿²±,¯Ün&è§ãz“ØÅè(¼“L–BãõzGÕPP!z ÷ öðö‰ýz±CË—›¡³PãrÊ¡¥°òù=©ØÖ_Vǽúªâë¬é¾›÷»EPW;]R—Æe+kçßUue•‚ÁVô¿,pQv?¿‘S|Œ©÷Ú´þ«C"›wNçÌ’Ò°7϶XrJkzT…µ’„¤5'uïŽ"üÂ×/­] ”é8mêÊ+,­1=äÃ9q§¶,‚÷È ±”¤£ºÉŒëáöaöÔý5߯ºÀR%“_7ä<Å–—!jwé`ä1î§±ÚtDNû¢ÖE•› ³}Ãò8“Úoib9耟$C­™.Ì^#"ÖD3)x ´æ¶çCà79UE^Ø›”šá<ý츓?olI,š÷ “bDHÜ™ÛȈn|ò¥… 01µ”âøí:È›­Úï$Vñ~ü§ƒÔz¹*âámý ÷œ©E#tmØ!F ŸÒD¾nÕÇã÷7,@mkþüJ鼇¦N+k¥CÊ‹h>ÚÌ;àS¿‚’Xé”éqÌš¶´Ã4ðæI,Ö–üóîr’Ž™YÐT1’“«2ûJ¨_å[ÈÙ§ÙO»Šéâ=”xÝ #©ƒ ˜+â1`ª«þbÔ_Kô ÙÞÞF†$Í­3HHYcÌΘa¡ÆÞg1R—4ì%?xF|ÏìiÙ¸—,7yF–iâ*lÀ27­¹ýejv x¬&Â&m0V C¨Ïßgoý䋳|ŒÖݲ²5ÎP âÎÕQ NjHpà®á´™ð‹Ô,h0 w, é 7¥éON ÙŸ6–OÓ›®,RËúø§¨k- Y9G˜õ:­Ou,nØ='t—» Çxï¹Ãa®²ÆÞKüðÄØòÜZ#ÖÛ2KÜ®2­ç³'ïf›YH|ÞTѵôz†‰P`žÅ)¯ÒªF¦é¢_q ¶bJ«¥èŸ{Îi¡Athñ:_@:1¶„­ùD„ÜhœÕ-‰&@nÛIã\ýš°áv‘ø;ê >ï`_³¢¦$q4ýõOóÏßÝþìðùé‰c—yÕDÝVD…ð9jÕ/¶­®:©täµ±ì0€E‹>޽·‚|X·‘›¹îÉRwÝo!è='Âá”fªè8aØ(­3†`¥òx|¤A>è{gßÛ“Š>„zðŸ.Q†ÐQ‰¥Â‰ŒÞ €S=~# ¶X3ÑA“NvŽËâT®ýjDËH5#¯‰|†€F_n „ê&Ø>ì' Àw‘ »0“#}”föj×ᆨ4û£ ºg´Ó`_H+ˆ°<ó3óÈõ¾¤˜]•ï*@Æ s0ÇĆ›9ˆòÞõžÓc†ªHyc:F,ÆšÀ/»î‰æ ¬m–œ¥Éš)kÄÄ‹w¥@?høÅ ,Ý¡xjº…ÚßqÜ¥Î->°€ËeßÝÍ¿EŸ‡:‹9§ lX¯Ô•%€âþµRÚ(èÙ¼$¥Šö‰ Ú£4´?öÇͦ[c%L2ºö†ˆö4Ñüäa7“$Q³œ. ÅÅ´Iò› º~쟡_Íï¾2>Th†b÷®~ø j›ZpmàdwÓý æÓ¹H啼.'įªJÛª9p¹áŠªl­Óé᜽׭àðõ“+lظo˨¦t ãŽùÿšdêSQx€{Ál•(‰3ÎÓK·ëD÷ù0ÜÏ;à©Ãªp`VUF³lxðOu×\xû¸Å¬uAU"ÍÂøÝ‚ »w/Š=\£Æ­æ6¯8ô›r¹ï€ÛÉ’#¢‘¤ŒëØ …˺›ªð'žz€y ÏÈ#~Y mj Fl–×mê¡T&WœŽgZP7˓̭±E­‹Ð7dCè§ÞÜÍÌñA²pg^À¼+HصLïŒ!ÚsdÐóÑû?oŰÊ5?ò°™éµñîc[Ìñ4›õG÷ÆN–ÍÄùçà|ï¨ÝÁËúíÛ½ˆI¦Ucc(R_Pä¿û^¢FrOàc±ó9y¤rû®+>çè{?=¯3 Ù´°ˆ¨-À6|äƒ0¸xæ' æ€Ü–0ÎÌ~¦©óàâH²ª­Æ/ jJQëPA÷u3wúôºrý-÷{˜ÍËos®tÜ‘ŒÚûnX(b¶Üüµ\-.f»EG/3“Kbȃ2[¥MVÚUA_Ëác šºWOîHQ÷_ ‘"wFuS3‘ݶq€ó7Þ¾)&>k«IÓÞ¼YùÆ’ó÷;` wîÉÍ3ytžºâ‹²uBW±ží ‹°‡[H{áØ½!tKuÄeÈö©æWOñØãu +?ÒÍf°/AÞhG(I+³à 8 îÌâî™bŠü®dÔ©Ùª¥ ÓËÇ9Á¸C„â ’îÃòÛrµ< Ÿ{nÿÛ&©£t˜gm¾Å‰AZ$œWq°§¸:h( œÃWŽ„K’µ»Žªa·.;±ŽHc=/!x³2˜¦¯ùŒ}YW¹²î_Êyxƒmnƒávïs_z•©4ÎÕEUí°9¿þ*)>)³è~Øk»ÑWJ¡˜c2aâëÊŠ‚ 0ÂÔYLUH¹Àë†åÎ1…]Y'SVÏ5rÝþ2ìyS|¾ÖÒv3újý´Hîvò/WDi+õ6Æ×=³†`ƒèH šEî6ûýè]÷kKDzê'žm½÷žgŒùÛ™ßè¨ÜE›L`<ü›·‘ a¶m“üRȹsÖ¤«ã©6jßÄû8 ‡CšÁù¾.?܉ò0‹ßÞÈ)uöÌæež×Å¿þIpÕ(óøîƒ¾ O{U•Í»(MtœÅ" $³Ó‹! Ûßô(ß[WÍ÷&qö +i\†ë$ ‡—ýÞÇ´R6º›ïlÊôT'&Hñ+®A™£R­v5ŒºçÕ'ß™2™6{è’ó•Vö…µˆ[É“ @‘C WeåãbôÃÁ ê"çU.$sjWëËßÛ]¨¬îhU«i®öŽÆƒJié©m¼š„JÊŸ²#¾Ùû fɇp%á¶ŽlG ¾ÿ¼ý±G 1ޱ¬~µævíäõm";ÈaXŽ{7=·b<ì¶-ªu·x†*÷YS%gsÿè„û•¸GSIø£ò·j6 Ü%N—>îŸ<Š ‹ÎÊõæÙ+Ǽ×_Y$dV܆Óg±®c…V†}h›ÚÝìæ‘gİ F³og†J?™{Kã—àû¯«Dnµß$sŒr%¾B¦·Ž<Ûâ0½uuSÍ­nzë ÛeYÖñîê+Îô¼Iˆ˜¶.%Ï»&f!Œ;¡Ìóåe$~LQ’ˆ‰^ƈ…W tãÖÕÒcûf–§P½“§ºÒ$9*PÇòÍQxXμâ|KÁ™»«â×(k¹÷H%Ã?оð…ìMœÎT‰€×cE]kŠAVõk…j²¾™"©HÂQjkg6p !b¥ë¦Ìºîèv é[²&– © )œ5Õ lšì=T ‡¥¹¤?&¦Â™}Ä“#þ~Ønvù•¼Í”Xi >®V³k™ÇB¡“މ3ˆY1bvÔõ“ê û™…é/ Æ) I#h†î¾éf–ëëzœùt]Ïì”øEÅZóz µi¨RÔÖyÌBLPb:!s@D<Ä ‡3Q¹ܘٺ©“# ðsDcc-b õ¨Ú[2JX´sGäXµURMÚˆnàqóE3¸²ÏH÷JÈRÝeÕÌçèÝñCêÞ¾Xÿ‡Y,Š–š±ûÃÕ%›¦¨bµ¥‡Š¨mPÜ4Íå oûËÿ>A|ô]÷¥ƒ±lE$ýÈɇ’;F+æ5?‹Šî¼ ÷´V q¶ˆºg(ŒÃ¥ä2x™@hMNÑ]6ÖÜ‘ÒÅôØyÖÇûäg¦ÃÝ·e3™üô{õ#ŸJϨôª¹Ng%¥ÜÉ‘ssõ ýT½Tœ†[Ÿ±²3M 8ÅÌXCsU63=I€AT“<èµ§°ß_ÞG¬û”´+™{¡GËÒ§k}\]_H ÏYü_Ž/§un»øÅ±P’ÕàƒcWhL¶¿ªc.-üju¸yfìÞ[ž¢%õ8ÇM¨jfA±¼&êˆäÏà4*»©bÓç Ó-ßuÚnær-­Þ–ÍI¤7–³©ÜíSŒ¤s11~ç]²p„ºØöR¡‹]$©ÌB¬tØ;2mÖt8?3áˤÐoæ1±a¼Ìfp $6D „ôf Ñ|ôå´«¦¿NIJ8µÝ@@ODm×q‘,7Õž¶w:OôárMñy®­#‚®•bôTך•emþC¤k­“#.È Ê/Jí‘O8RDk$O)=xt‰¢ÌkÜ»^Fó%vJØœ}š„Û‡Å޳°E{¶×âEtÉm„¢ó˜göÕåm(ÕQ5ehÛ„‹õ¿]©ayGøÉµÝ X¬©ŽÏâb­\ÝWÄ „¬±z1hçŒínóë„©•δu[ÝSïÆuO<Ç^ê{XÚÉ IôxÐâQ}ñxõ]›ã¾ªXw… )à%YÍUÝ¿€žKÔMH?K¾YÑU )ÚlkY%}Üqÿ˜AÖ'ñ«²þ*°ru)ahÄ+LººÿìÙ°6¹Ÿ c§¾õêMV— 9S°2QŠ*ë"«â/‹@êÈË^©z,ßmµNs-ì?É_õy}ɯ6Ú½-Î5µZÊþG–Ó,~¿Ã+V.ï·Ÿv‹õál­Ó'âÙUÝ^æñ n¡¦‡ß½ÔîöNä~¹øsÊVïý—Í6&d– °hbR¶U]¤-P’|«ø··[ö0$;Ì륯èÛ´±¦sKÎò¿3¿Ñ©í;ǹ/Ú¶8 þ5$ÖÄjÜm$˜]]ÉöÆìévVÄs”­žù éLò¶­[8ëé)É) ɚβ__ƒWy—îà)i*¹!“‹4 •<éâßhì“2ä×uóõNRî´±¶s{š©Ì‹¤Wâ&ÎÖK^X£©Á΀atú‹®IÙä1Aèê¢OÖ„åÞp¥¤Ñ‘Tå¡ eà^©ßº?lvþ:Zó¸‘Ã-ŒÕ?V±z†ÿRÕå±”Å3·k?³,9¹6ñÉ6;–ŽÆáø]*ó†¬E>É%Y#€ÿ  ¾DºÒÔäÐP6T1¥ú6Ãòqs½x“È÷ö`ógìV|§5åžûpPV„>+RäƒÁ3BÜœß+T’â~ñK@ÃÉÖááð¶Rƒ>Úøqü튕T¨_-;„Ú ³+UCá(—ƒA6.€Tç0tðÅÝ/@ ¡'ž KeExN eÉHN.³ô«¬àÔAµÑ2<@ª+LPá¿‹†M—³ù1BíCƲÌG!-òy=NN(£s!~Ôpr"¯&áÊ9HÞgÈܰ¨7ç¡vÜêéÐÂâÑWƒÿ‰$;{>®®%z¦ ™L™`~féÚ–ço_!Ò–M†Èo|-®Ö[~¨½´^í9§§rÊãšK¶6ֿͬ 0,JixÏŸhÖ ¬©G={ú㤘öúÌlÚ¤c{¢ŒxÇŸ{ ivoA0ÀŠÃŽ«UDâ«6¤×"ˆ& Ä%dÎr/kk³ØÝnIU¸gXïTgûµÿ©Á@ºÂœ–«=e^¿Þ<[Œxupûùñ™5Ѻ0£¼³Lõ ÃÄÛecIö¸Q6ëqؽŒb vŸéC² †pAR‰ -kÓ˜q›æ÷Hê¨`‹Õ^_H^{Y¬—ú¡À ìhA{µE(ú¶É–N¿ Æ]ßÒíð/£U¤ô-çnŸžÜ:ûœÏÖ³O€I/g‡óÅQGØ+‚qW;HÁN~:”¤–flKŸW­%Fðí>Ы£LREÜ6·´® ‚ò@¿yŠeâD–£Êç×¥6¬DYU!W«k=6Ä‚“· Ÿ)qæ²Ì Ÿ_…äqãÃñE2Gûù•[Îǵ*ÍŠ¤å³ÖeàЩ“2׃6Uœ•ÂÎW®N|VPèS•âÊÚÚfä:®­g”ó-E+!lÞîðæËB¥%Ò‘æ0ØÊŠY _yqpä*<¾Ÿ)µ8}Ò»“:ºÓ…3öJ¿üst­?wšà¢ ”á»PÖ=Ë[[ÿ«=õí·QÊEuVIïó+¥.°Ÿ–A2üüJA‘¡8·¥Œ¢†ÝßÔ+/‡ ¹¬mHÔ M¦¹øüêsâ-I]ê¿ZXø5MÄg./ÊÖºÐ|0ad-ЭWoTÐ]tسÝnñ&ÉQ‹Ö¶ëáçøã àk'DVÚN—º6øâSPYy…i‘–0øp|~eHǤaý½-µX5}¿[š¦*bIZê‚Ckð áøñt†¦åJU%íÕ|]Aò_€¶j[˜ºãN–>û&¹®ì¿®4¸3©ÿ©Î*¦Æ$$†í!Òñ°¥2Iß}Ý‚,AÝ“ûÉÔ éšÞn—@$º@Ûà3^WÌ?S=»0¬û£å“+ŒŸwàÈݶ Ù2nœ­ÓÛUF@êuó÷`ùÊ}jwo#´íTçˆëÍú™òax‡æjÞ:#§CyÌ[gÌ&9.w•|­‡G\®WއwÂú §•TŽÉ`Õ™/šÂÈß«3â¿zø5ºGJÕœ¸•:º`ŸsX‰ÛŽOú’{&ÍŸ £G ¦æØ‹7Ÿg<§ à=àHާ7lˆ+Ð̼µ ŸÅ³!¯ ¸8ÐN™¶ÀìEáŠp¶^ÍAÖyÞb·+Z¨/$k#µŸ:áy ÍQYÒ;s*{rÞÔbZmeTm%¹}B}:F-vAùÃN}­²äÕR^œH’ÕÿÐýª»o×Qê}99¼m«í×õˉ ÀC<©¾ñ”ÁÊèÞVtRA£lçmÛ$ÍŸ¹2"kY¶+¡æר½µš:Ú y „åsï¸ZJq M1mb]âöM)¾1»¯R:åÛ8ü:ß×Ë…º—UUfÔUì ú Ô´Y8në‰Æþ´Ø¹£ãÖc)ûʼcÎÑß‘bíß.MÉc5Ny”¬ª ìÅf†aëð3» -§£×‘¸ Éæ2$jo+QàÚé®ðH¯Ö~¹ Kò1'UTöÂ'€½vuïÈ r´;ƤnaC9<+^…&‰ÍWëpðšÆ^³óøsÜÓKZ$í˜?†“þ„ßèP+õˆîàÝènÍÒ'_ªw 甾x1¿¾yi)i3{âË"éÉ/Õe0{÷๞o†þ_Ü@³v‚¥ª[\zmõÉb³¯‹5nÅm¾Ê‹™®ùø0ÓådºøçŸýž¹žMÜ“¦ˆ?!SýÔ½‚¡™BF€Œn?í6¿\»òû\@ù ¼€žumÌ£8YVùËàž†ï¢uç<ƒA¹ŸqFJ*Gv 3ugÙÐ’uJóPÊ4 '¾u/Ÿ?A}fa`ÖúçÏÍ*ðzœ¢#ˆTñ‹6*‡Dã†á;,éè‹ù¡pR2Žšì,þš|ÅÉÓÝf¤pìéA;U¾c± Ž)ÜììÊ¥×­Éì%‰Yß2fþ¢žÔà™¤‚©PéHž‚à$!wŽ„·¾‡ÍdgónKD€Þ¦|º?rŽ/ Ê(irR@x°«/î/Ï.ÿº9»»»¼øëñþìËÃÇËû¿Îÿçñò¯·_¹Ð¸Ñ þÉÍå—Ç¿Î.ÎîöÃç³/_.¯ü$¯Ö÷ê&œ“4–‡?Õ\#JL¸TÌþç¸ Å³ œðÂѤf÷PŸ¯Ê…‡ç‹Z¤ˆÚì,Ö…€Š±LÇN0+#€æáö̶FE8Ñ?‘á ” •a&ŸC;%Á>Y½]=r~]ü­#ÔÕzÉZŸO‚U˜ó›`ö‡IÅðÅPˆ–{ìaS®ö6|ý¥/w\E++RBº´×R݆Ò. Kè»Íî 3ÿ8Jt.åí‹AoÄ› Z#¤¾9Z| Î »q·Y­ÈB«=tu“´£àþR³*ŸAÃ(m g°Œ·‚é=ŒÌjâ¾ßoç‹£ˆ8ýªŠZÝg?G^}ë¥ÎMO¸‡ðè4“÷rÛD°‡§ÝfeÅÒùÀ'==:Î!dusç½Æý}جF±l×£yÝ¢BÆO>zç =î–˜Ÿ&KóA¹´î!ý>n?A4—<Ĺ¥¹#ˆ& “´.Z¶žâoJè†sÓ·4Í(Üf¼âÝ«¸Ý5õZ(zæ'X©n[4ëg¿Ÿ×‘R¿®Ì•oë§Ÿ»ÍzsdÝ{^—­‰QÅž€(*gÞ|ãÖó7+fO².6À7òÿ!ýA›ì¡Dqä! zü« ^•°j¬ÌÚŠ1““ý¸‡‡ ^Š•^môtC¸ é™»¸cÕçË1*{KÔãÛuªåÓ@¶Òt)ðáÄ)Bv|‹ŒÛ©Ýè3hó/ä^'|'pÚ®NDUSWÉ/ýBJ: Ë1îÚ9øÌ¼Ç5†|ÈÛÑÄû‘²úúxη`$„1— 1 ±1TvΑ™Ø8¶œ.ôÕd°k¾®íîMýÄÓêiMÖ&£óhqÖŽñE_àáU¼ã&ƒuRs{Ãâ%ùŒÙHØÌS„„vQš?»S¤FÚ] TdXKy³Ò]í¼‰nO„/ý¬‡áo:¢8ÊuÐ~Ø-ö?éAa—²Ë"Ìš‹á™ÎŸ)%Ì,AHáš®ËáÂè…º[oåNœñ®rAb‰.0å#ƒÉUƒ¶SKLmĪ)ÿå³:Ú=—•°¢“¶bO¡4G/–û Õ.õˆ@êèâá eÚ7¼›ÚꟹãÓ¶É—}°LYƒ´mrŠÊJ>`+gYwü?Nî`ÄÝÃ[&?ÁhýàŽÞV=¦]G ¹ÿo,eù‡%Í—š> h“ßW©ô¶p4.9´Ê¯ó¾е ¨¿v}Wp}+)# "k®6bÈs¼„'P…²3œÁÂN¡ÖŽîFSfð´"Ü ÷k ¨ÚŽÿÜOg¸š‹!â2ò¬†µ"¥ù,ý1w†Y &Ú¶`ø l×Z·«Íåú¿D“daÙ»ƒ6õΫj¶w ³1¨7s Ky7÷^€hr«“xµ!s‘Ôá¿{èX¡Ýøýxæ­ª&!‘HuP…º×Õ"R¤Ý$‹[qo[n”‰‹ì «õsq < Ã2§x\'8üZì¨ Ø”•z¯æ-9Åp*Øú³:Û(h©ò¾­âŸS³gé˜ý°4O„ªé¢»ŸÅ+«_Wð:òßO°ùì0S!ò3×WñOŠMm’6#1ÀH?šþñƒb•ÞðÔSDœT.GMWgX†ËC ?ŒBN÷¾€·pÀ(’P>‹TÅ#®)¥³-Ê“i}^3úžÂ]ûÔ–M ªL’Ö[íP0¥cœÔëkÀÙ‡ÊoðB¼p2L*ŒöC"ªCPÖÅQaá%œ`i‘·L§g«qÁ×´ÏñxMr—ˬžùè.e)ÖÐÕœÔçy3 õ]t8H v|Y„B~]D€ÈöšèVrçtñîv›í î.)F|5J°D(­ô<:âóyâ)ûžzÂÑ1¹¦²{UiD'Ïñ^+Çv=·[Vë§D5‹Võq³åE}Fksí’fª‡µx’§RÏ”×>ÖMÄ/ÉZèö×Vê_ÇR'êº@™ —ya»ïÒtBY[Æc˜zkÑ‚Ÿ½lN•Fçp¾d E7•ÕÌ€á]Ï˾Ç>^5úË?ÇÆ•;Á¼‚™BC`ªƒù½Ú—Å÷ñg²ª@,öE°/éô/|îËÜLƒa¤éêy½Ùiš[ Þt¤±k àÝè®'­V¨alÚÕþv;È ì"¦¤Ž«½–p L ôÂOkq¼ý8xÖÇÐ;ýi·øA1 Û¥¬õÑ÷þ\¾¸§‡.\¨œ«/#È7‹¿‡3wPžF" š‘ ¶ÏWaÿ¸D\˜(ÑN±±Mš tEÀ—h“ÀjrêŒ8>†¹7,¨RØú‚yÔ ?¾Qf…ªÍ‹hKe)Ã!Ò$ÜîÇ÷k*¶šˆä_3êéÐï…|c6?Pf˸æNh§É­%(‡ÉÏ/\ µU (N¥(ë"ï; ©ÜèåJòËŽìá°Ùb(#’•{û²Ù_E®=ºäÈÂ?n@²l:P°X‘òãœ&^\Â|[±P ¯¾ÕÝ>ÉR{3ì) giE#Ô)&®-Aà†òß'Ø*"Ûv,ÞÇ«¼EÉ~1Ê5¥¥×Cì fŒš€6R‹‹;¢~÷ómO‘b‘V˜NA¦Ž }|à·è$Ó=fDí@cÉt}T{Jƒ6H߇•ÎÉ×ÚΟÇû梫HÏåQY`A‰'Æ|4÷Ë߃Ñfo’j[øçÍUðSÍûÕR# kÐì9ÜÔ‘¢ÌȽ¼ j7‰‚t€ƒ›À-s¸\ódeŸ°áf8üܰÜßem}ÝûIÌ|83$%ƒ×ÙUuY;äZY0&Ó±ç- hÅà Õ1°·tˆ”¨L?&xrø<. ]f9™ÜoYÃÓápîâ»æ¤£:oììHAÕ¡”â8¼Æ„ 8OÊfïAŸ7M´ˆB´lôd-‰¿%¾êÌ@•ê2h?Çu¬÷­kdY%e=(Wó¢G‡é=u ¬(ܽˆ0³÷ç2“QGÓÆ"éûy®ÕlИiSGÇ•wâ&Z RÿÇôRWvQ·gßYŒ þ}€m¿ßBuVµÝkjÊ>²@p¬â¬y3Ç\S¼S%%2ÓÀxÈ#kí$܇“Ñçüsýl0NØ_ÁÌêfGj: +ðIfŒÄ5«îÔûï•©âqô"naë$°’Bò#>˜bœƒR*/¹%iïšB,ÝùõýS3”™æq “a*ʼ×ÿ’Cnbðö㺚Î]™ÌˆHoòéd>nh»Þž9ç¶ûÉ\’-…`Eê’™‰“u‹Ü·îÕeÝ2•°if;Ó´Øò–3›"¾tÉ©4üÜ—O{>£ßÏÖª»®Ôªï}j+à^¶vÁ¥©hz êôõæâcTi¡ËÑ·Ôpëñɉ!¤Ç}´H?úK,gJÜ¢ÉnŸP™JY, €šI`‡Ãä®.,7›áT]"£ƒD¾Ú‰ˆCñi:«ˆŠ°·vÐ¥^SÃNÊ1¡±ýg÷èçþÑÑãëDßÔ5U&×ÑS°2À‡± ¼A¾åq£¾îy)¢vòk¦THBÚÕ¥¡"E{§õiµù¾X¡“X´± ‹mÕ[:EËg‡]ï%1UäÉç¸Dô!4ó¨PqÛÀƒi¸‡§ÍŽ Qj¿ylWM±_×[î5ƒÊo އ{A›x¶û>úâ€-ú¯rëiu¼j§Ôϳ/¢­=¿ïü¨*ê ”žšjòl5ìqM‰ n¶}Ò5ЂU-¼ø1+Gí£Ç 3±ÔE&(Π7æ†ÝæQwTgÇì³sÛtX1ºÊ½; ¾*“ÅQdÑÛ9#¶õñ‘W€¥[+âžg¨TØúDs)ËÙÔm@R»G3fÐeÈÍÇ·Da !¾æM¤ÕQ?š¦ì³É(ý!¹›.£Î»ÎrÚGØ¿}šÔ;¹“Žô£D¥s¦ã¶±}S6Íû“»ÖµèuÈXʶôeøåY5w˜‘õš ±Éz<¯Ø.ŒFÛöõ)À)8Ú”¿A|¼ë§¬ÒÌÜ‹ªÈ&ã½~,Ž+µˆ= OG:ÞÏeãyûˆœG;M‘GÏ7‚wŽ3+¨àSŠb‚3£®Hï¼D°LFu7ìôå*‰¥Ÿü‘S•´ãþ°ÿï$xÞÕà6騹Ϭ'K•55ë·œ©Ì]Ñ:‘êÐ5>¹¡Çˆ³*°Is¯|ju¢e‘£€%VOú„ã4®&îzúñÑnŠ¥$…Š…ô°éI4JíØ” ¥ˆ2lkœ þT€l\ŠRðºéªw@ À(Ú¦‰>îÃN&¥ Ý.·Å  •îí#‚u1켫¿;,g’與ˆ^ÐæŽñæÍÜÊý‘+pªÁ„ŽÅ;9Û“ GEäh|iäOYVy4LÛn„{Å)åâÁU—ã)6k.!A¼ÿ^ä·UEVÌÛVÙ§”K ÷3ˆÔÛ^¼,&b$2¯®¨çn\ò³ã¦àe½ºz™3Qæ'Lä_ê”hÙăš*Áj{±¹ ƒâD³Íx Ñðv›­r¢î¹Ë¢¿‡ØÞó2‡¡-Ä_A.Ÿ.«qcø YÈyßEååj”¬!ç›çã–:'_"8Ù†P¢¾0l¯ Ôwõ*FW¾mxÁT3§ÄpŠ}ë'Jš¨ºô¼ÆT Â.  vßé€ xؽ\rì ER3©¬­Zðاb5»q‚ž±+#ýo€`~š\.·js"ɆüׇüƒÊVû)¥ÜÆ)*ü×Vß\a”eÙ+¼Æÿë†áñÛƒ»¥ï9֯śJ¤óëa\q tÜ3ùÊyöÈûa­ %û„ð€?«¿ƒVòÑÒóÍá°yùºÞ³ƒÀÏÓ¿ù<¬¶ê˜\·]ý/~AÒ׿×Z†÷?ð‹Õü9Õ›ÍÊån…½Ø¼•UÙEL#…ª¾ø¸·~ƒÈÆ>§Y»!Rëˆ= ›5}ýzX?~Þ+;ŽOáýx…kØ…$¥mt„ ‰>Áª…ßΑ71I¸s‹L`ÖË_ãòð“mr 9¶e±Œp–á²YìaÑAÄö½ C'ñ y;eè3ÖtU¤ $ðDõN‰»‚rœ€Zä'ºp7¤Ë’ÖHs_Fª gšyÖuTÔ‰§ iƒ"ƒ{Éín9„礈,k =ñBF¨ 4g†_§èÀñ HLÝÏ0fy{:²#µ}ñ@ ¬[Hh+à¹hEï>•MQl!Ù¼fQw·ìæQ´Ñ¢¨²˜¸-â¾Óæï0‰Dûw05~bu! ûŸf³p8&¾Ë‹4å³›<@p-±±÷Mpâ.xsl'¡l@úÈXyé'ßô}"AóRì%D¢*â%¥²o¤+¼^6ä×ð¿jîc˜Å)±'l¯ý džF ê^ê>ob“­´T-c KŸZrþ˜ xh¢ÙúÀÑXdËÄìÕ×Hæ Èu×CPË–CÞ‚ÀœvZgàôX®±¡ÂuÙd'!{ï Ú'Ýp\¤¥4¸ø~(81ïÅÏi ð@yMeM®¯ñÖ„>.9+×,#¿úì$j"äеMàõ¾]ªsSÞ'_=x­Y䫾­Ú L”TO‘0KÞ^M œ 5¬ãK«3:ª2¢Æ€e+]¢æ6(ÇaíêüU¶WëÓº¼8÷¯t v=‚Äxqä··P@£­#etvÇ §Ž¬cb—­ÉƒÆeRiH­¢ìiM TP Æ:Q õ‘¤ã¯ÿ¬`Pwt¬Þ¸6Ýyn5s=ÆQîâ­Zç5cOЯ֒x®OÊAæ•$AoŸ£ìá˜ê1©·KæÙr#°±ê´WY7ãg]|ljbàVAÀy‰ŸŒö³SS·*‘\#}žg.ËH:¬ªöÏSߣm’µØ×Õ†w¿)š>:L.†‡Ò³\dóPÃg³1’©*¾Œ öq1®[ÍVf•ô[F{Ê>ÊÞA9ò8JQ¤æ”bÊßâ_òºh£µOŽ]p”¦òóûïD}ƒ&×>ÃÁ‚G)!Np¯uÜÏ¿QÌ,þ ^×=¦?fVA™ƒÏÓÞg|»Ý=@~äÏ£Itа<[ѳ!(Å<¸'çfAÒ¥Mm0uÁ6¶ŠÅ®.ué")Ç“þ%½ÁœIeoäúª[ðæFÈ b°Ãì–XMÉe ]ùÁ?WÀÖÊ1:¨< B;œö¢(ꮉ¸]DZ¤|9ü>èo²H¹zCe]’;‚^×î Œýf_”èñp3ìž#¡Txä"23Ÿj_[FžQ$\Œ ÞÝ%IÚð¢‹l¬‡"ʯ¤+ï5¸h×´Øj³?¿ÿ-qŒ&•õíN”C ¦b`‹&7“Ç™õø´àꙄÀôG3áÞ}ŒOâÆ³®¨“ÉÍ¥è¸i“ëÊæ~ñ+±³gޤÂy¹£’çfaiòe nõB±qªü=?˜=žZŠFsY6e‹6Ìæ.DÕ Ì[I’ bªÎíÝúÎÑR›QyFÍóßB›²a9¼,/Ñtt·Ô×7.².jÝQ.û˜ú4}ä|IRT‘òéïÙfbY³÷9/"¿]MòMI!A‘{c˜O}Óop£6{ïQ¤jÿ(%×–Ó `­:Z5xîv9 JKTY‘¢}!e!gÎ[*²è}Q(D•5ù‚Wˆ +Ä4 4`x>"ªGªWÿoñÁ&Rv Ö"RáDHÿg ë?Á 4Ť_öä¼@(È)oæ`aí“V§¾ 2æÄÑ-VQð}—aòÁÞ7î]¿HD篡8Uß!÷Ú`†ÓL¾u*?²a 9xö_÷’†Ð@ÿ6«Õ3u—k{F C©øFâ@SƦW…% lXA·!yÚ­{Ù-xòfèyÄÿüþè€(g¼„l~Œ#VTÆ}Å-œ €î“¤”wñý¬œLHNK!²4¿Nª1D«(A¢ä¦~ñ«¸ŸÝŽ(èªÉôCØ‘Znô}HPùƒ•ó„¿…h)wU€ h7Ûjy¹¼ˆ@ïdªÈº r÷¹c×<r$)X¨M9*z´07Ãv âî-[’,2çM˜¡uU#Çì˰ÝhXNâ4Ê>âCΆ(”£G=‘vÝ·¨«Ãæ8S^Ÿ÷S`8lK넹¼HpT®cÇ^$jÿ%Õ8ŒÑ$8ãÄŒ-«l0ožÉÕÕ}QDOÞ¦CõŸÆ/;–E²ÔÊîô“ž#!NM< œuh³£(°;*H¦64äÕ=Vr™CW¤×éjÒUÉÁÙ³rÉì^X `;kYd±Ôj‹ø¼NÑ\Öq׺ì1#6ý†\›Ÿ°ÎK“7ÑvÏÀÔ±±("ßçzð¢°êtkLjuÑÒ l.ÙPÞE0:—MŠÄÔ„ˆû÷ õ#)PL-j‹tp(=Ü0™QPOÔ/\YdêÔ‰»D5ŠÕkðqÃN†ªz“LÚ9º×©~L6‘ø'M_ÚUÈRy&*y¢—ëQ\±I„Ï¢¾çyçE$Z¼ƒVºR¡ÐC5*·;vÒžìÈ/¨–³Zlöß=ß\gN†o£n¯6/A‰šhNH)0b´ì#ßø€ ÷ËWòΩÂI46Òº„|bàÄ_u-ª³}_é$tØ“íÁ½ñN}‚ )ïšEűãè†xû„¸ùdšU4ãVcSÎÖK/_꾑#. F´ÇùfÅ“¿íÑEV±S~C‰»F¦A]­ÌdrÈIç›B„TNæÇw|&éeŠ,ROr±à³ÝSê²¥ŠT"‡¤Få*2è)a%[ÖK'_^~¸S^ ôJáhœanX3MU"/¬Pïg/ÝQà’'Űò¾ˆ•B.iOƒ&ïóYæ«2k¢k)ààÍ0,Y÷Ã)i 5 ŠÔß»€¨#£) „@Ítõ%ÍD8 ‘m ‹ζ£7±.Æ•f›Aq°ê°Tf)¥çIWî ÕÑ–@Ð=(-(= zœ=ž`&Ð5Œ5è£tO8|ŠŸX%¬užEÁÁµ…o-•hÒn9é‘î|–ònAÛÈ­Š›^Tكʹ êj£QX¨ìøº¾q'ú§ú—A ƒëÿuýDéÄŸž üîøÁ2L•Ü5zåH3qE±u‰– eFÀêÜJÀÖ}ÝSè«è³ˆ'Àý‘JNÊ-(#‚ª„Q¸]û̳EEç(4I¸HË…¼«¢@Ô´)è µ..v/©ók›CÊ$)*jǦâqÂ5Ý4|Æ¥\¥0œ¾PA]lF¤±Ž%ÅsøŸß¿õÞÍo¹öÎhk«Õþ¯I=® TºÖwŠDÕEdx}¿¦SMecmO_߯êDhÜ^ã<e‰ÙŒ^±„©A?ñ:ãT樣MÊ\¸0$ìË#É} Dù;H{¯idêŽõë4uqM~‡ÆÐ¼âEež·¬Z8y¯äŸÊŽlä÷:ɨͩˆRì\6p‚‚Xâ¡_·ÛY(hÉúy±÷$WIKÌË@J{¼çk9,?.9£_AÙ’² ʾI–4–Y b²B¯Ö®#8‘ n­@îäKTqªJÇs¿øugIVöj¯)‘–“ƒš7Åþ¹| úV2+šÇ$ {£›”ÖmGÒª´‹ýXàlC€{.GÍšØ\È’¢Ì€Í_(ã¼Ð“¡BI7Ã3z¯ýº‰IÉL´â<…ølvy&;üpQ£­ã5 °Ì•”¸® †çZ´˜š~‚)ýÐúÓýTŒiÐåy‚©õ[ yÝ^þ^¼8 Û·{ZbƯkŽÙuÔÛ‡b°ûvƒ`o?06À­œ,2¥º‚8‘af?tÔ¯‰ŽÈõ晿LìP2ºÁCæ!´MJÞ+°o¼nET$%Ÿíytz| ·“rC·è ÄK×7Ãò>˜Ðë5åÑhîÑ^ÆÉà€>P|v±9hñTë|ùßãbõéëÕ…4Aº½£ßÏÇÕµ4@¥5ßð[ºÎâúµåÁÿ$ŒQµ¡J?òÍÿ"ì=˜ÊÅÛEØ•Hñ+VP.Ähá¦f÷À5ïv›g_½¸´Ì<,Eqv»µ”QY âÔ*Iò8ÒòÜíóßZ¢8ŒÛa6Û·(#SÖ˜ŠðåEƬ¼7W’A. _¿('þ$»Fúè3fDÉä„9L®˜Ê>"^D*†Úº< rèS5»{”,µBwÔQTci{ÜEhŽåƒÐM÷ViÏ5ÿIka ת(r‹ÿcIU®y›®Öòîî¬Í±8Ñrófa"%%›WJn««Ðùýð4Pt½WGÕEV4Ðúà |?ý¸¿Pqça¯áŠÖE‚z I°xzhÌÁèOPθLdJý詯¼€¾Xù¬›n§’ÓúÇ&€I±†OM¶%¤Íý.ÁÄò z_øº±¼› »ý5,y·¤£‘de•±ü#ù¸ÉYÎ<'\˜aû¥(ˆÁ}XÛ9¯†´š,9³[ø’¬8Î]Gé镵kàn¸Gû¸w²ø3ßbùyÔ(Ôι;6¿Ä!^VN””ø!>î,v¶“œ¥Á1·Ám€RàÁ…à@ý’ûjXÈÍLŸ1˜v?KZet~׬JuK¼OqÎmf‘ÈæÉJ6°T)$¨Ûݱ TÝáÈG—+\¿k$™ã¸×sêÆi¡¥1žgÕD¬¥Zr¢IÄ™njfçz+5tÙH ìø.•C´ˆñ AFßlÝÃtÄ›6]6Ë~J}ÔL·bP¿‡}ꨮký¥·wò †“‘4Ѐh`RŽÖhf‰Üœ„l(Šrw¸¶§ª†ÓŠMyÝÑå&b>‚æ2èp©ÑfhÊ3ÿw¼–_›[7§ó©ðIþÎ8L×ÌZZ;„n¶5¬êÿ=ŽOßl^‡Tƒ<”0=l=ÿ—u¹Ú„V F‡û­þ)ªêâ>ÔÕÕ›e<áW4kFÇ::¬ OVPzÓ-!”¾»Ã1î¤Ìá8ˆÖxrä²hèšf¨èó¼Ê’¿G4/¹‹Ž\tUÚQ^ž€û:Ø–ÏßBSÆí§ð"Z ¾;gz¸ÃkD¤­Î'8±YARž:TÛt³(X“‡æaAÔã%>£m%žú‡a±#Ç‹ƒžÝëä Ž|/³QÓ6Ašã3¡"Z¸æ <–1þnáÍ0fA@é-$#Ù2ø:j}ÑEíT„c\µ‹è<$ïAÓÁã+å^ôPQÆCMŒ"š¬oô?'Do†S¡ƒÞÂãùp8~×|»Ño{ iš;Z]´ä‚›¼¬5š_ãÁ­8”4£‰6ðøÉi×¼™@fY”"úñ~òàáéwíDâ}@DS‚h¹o e4‘žŽ²œts³÷åýðÍvü„Å£(‹)bfMQM`ñ8òjŠ€Íð 禤à âAäM!R@ —WP¸·®…_É'DÆ$샧wãÄ"˜UÇcâש9Ñœ!§#©£ç(—5÷'HYïŽ/dzÿê'‡í iŸ?;7ò›£»äR#؈Ãæëz¯Þ˜eц€Ö½KûS.¡Q]Z„Îûೃ;5\·BÜPìM}÷g¤=<$¤¶mªóvÚ|”Ò‹™’~©¡ÖXZÉ}#ø´ätÒ”¬ï}T4[« =3`£Öþ'³]»½· š"£µ3þ,…é×Zgæ\| ‰ãìáä-—Ÿv›ãÖWsÖZñ”†$L å1.G¶=ÂE Ô2¬0TDæ`÷ÅÛÊø…A¬Ïa׉JéÊ3pŽWòÁ{¬® Ù0ŠË::ÿjöSÕi¨iK˜ù»(­à¦ÃEU±¥­á„*äqø.þqÍ–kÑÊú0„V_Çõ…Ÿs/vºsÆŽPóüî–p\˜Ÿ<Û>í!ô®…äR‰Û‹¼Î+ì"Ìwoµ0)£²±ÕÇ(He×à|±b« åð%skÇ¡Û&r¶hŸ%*¹—*¼I¨úàJYÚPHÊwËYgMºŸfѲ&Mçý¸9[ïGYC3LüÁ‘ÍK'ù2ƒé¯€ðÄÿ€\½»øwnJ/‹ÎÈvš &:j;o-жµÏkŠÛ;âˆö‡þ×*²umÓõ ^+Ù¶BkþÃn£u[ªRó>ÔUóÀ9Š`"ûÀÙ¼RŒ‹|WQÓ×—½Ìêa·VJÕ‰^À=çÔ O‡„¨ää`a‹.RœO®EVE¨#)™žÆíŽì0ÚQ 1MËéèNW`'"5Qê’;Í:ÙfîöU äqcwMq<>,¨9ºJ»íSÛÀÇkÊ›p>ö“L÷á&›Dõ9m°Ãjñ&i´ÈlRû‘Zµ1w‡ñ·'rë@±1ƒ¥‰¨ ý"Ç!ø_|y£J‘ èg HÕèºæ˜¦ (wLíã’%ôK”49yˆØSêOó'ÂÔÃÅfØ;ÂÏ馌†9a¬·M((~‰FZU ZTjv%VÅ ÐÓÍaÂ÷u7¥œ •­´ÎšªJ:“‹‡–*z²BB;JÞÿá™]èÅ!ÞÓf'U”Ý^›Ìm¸€q,î¡\&à˜I;SЬáœ_þÞ.ÖKåÂöÒ¢hLÓòV åjüc `ÇÈϧūÛÌ °Ïàhòˆ…ý#ìÇq·?°öÄñÊí§Ø9R ÂïÇ石x`X;ËGT5.Âoò]ÙŸ±¶²úquÜÿtSv ꣄*u…ÉÔÒì=;XMãÚ¸©úÒ®ÉË º(ó¤g‡›‹>ƒ›„Í*®“!ˆ]½³Ü “„³U–ÝlëÒÏš\»£v©Ì„ó¡É›qQ¡9ËâNdZ0PPuÕ§ wU×A¹t’±Ý3rášrÀéC6·ý žòN8Ú¶~?åf›ϼƒü/q£2H±³•ÑÑeDx¦çA󨱣‹÷Ãc{ͳ4ÑQ8:f* ‚è&]íþ»Rf¸o¦Í‚%•1ä΀jPp TÈGnå8+ÑŤ'ÑDŒp€‹y13pb–9B¥¥Øa„&Áëÿ^u5M ÈqS.$<†}·{ú®|0˜ÜâU—Ãoâl¡²º+çÁ‚aúQ?°ÃüÓæå…<\!pIʵ³Õø¼Ö1æ3„ñ2 ØÖ«¯‰×ëí‘…ììeÙT^)¬ME¸°öW¦î°M“-MDi;€2RX$¶† O”¬FÛZP•iö#&>JºÍ2ˆ0I§]d Ë >ŸZ±Nï©«îß iÏø…ð?3Ú? Ü=2ÚIûÝb”ÔLUßÍ>ÉÎ9¼¿ÐkЊ _(ðBE:–g–"A®“ÅZÒ[7yYÌäV%ˆGDÊ‚¤Ü«¤p¹^´ÎÆìH4߀¶ég¾å÷¿¬»Ù-{^ÛŸâ5áFS3K+G›Ÿ0ÏÌ$”A‹êD»$ø(šrn°Œ*Ÿ¼5?ZD‰ýà³6º°l¦&÷¨ôø÷MŽ M¸)$:ž>×T´UŸváÛª¢î³j¦Íset,C³,iÙv®GHLÅî ‘:)DøÍÎôÑp²*©»ÂÎ#÷j…ßhÁÎû(~b¯üst˜<ˆ™­ µr;Â;,œL åÕ^Ø•aiW„ž28m{®R3!¥ éQï½ ¤½Ý+§°Ö¼ØEÑ—8 a¶æY[sw#àñû~˜òàæ-à0d$___‡u=¶| ÃÖ6l%¹n]%ŒèzpoÕŒ`gq‘Š™×@…ÃžíÆ¼Àù¡Ä™Q>'u”@gow“õ„»Iél6;!ôiüQݶàE8P^–‡•›²™M+æÃ5åE^¹)€Ñ¼Û ÿþ—?­k"M`°œVö…YÎJ|f}x·Zp¤Êì¥ÓõäŽ%ºõ!jrY•Ör’FRZ­öŸ¡*žº7é]¬rA]kïÀtpðv•MmW!™£+’~(tv¢«-Z”†%u 0¾±ª´©‘o—Œ/Û§?Iq²Ü<ÇØ¢ìšdÑ'GÀq’Evr©ìf–l‡O.Ï‹ËÀÓˆ÷Ê •ú'S»³‰ñšÀøü½²ÂX_wî,YëT«‚¦ŽÛ3(úÅÍâ÷ør|‰N%%”2.aÓƒæ°`‚9Õ2ºV›IÁ4o9m°ünþyÖMp'‘E| ão¹'%0eô85Éa"qK½SüRHN¤c¦Ú¼I0 wÃÈ{m¿w#tü –±+«ä;бûAŠãd°Ä…œ˜ IyS'ÝÅqv¯åTl‹Õ‡·§ƒÀºRhǘÁoånožì¡¤²î ȈAìng¹9’‚ǽ@l¢ 6Õ.7ç'ÁÊ(øJy×.ʽ7cÙ¡ASFh†c‘• J ÏÀø=²Ç§ºöw6»xˆp È¾¿}WnŽÖ䜼wB ^Õ +¿ÿgx— Ž‚såLýÀ—ac~E…Ò·BßñCjû8v(ÈÿÝoœHŠÞ ÓÎùTE1™n8`uV€îÍZe¥œ”ÞIãdÞMZEá ¬¡4‹`áŠìYI;¬e<= ›,˜̈>¸vA}*ge°ÌPó¸«çǽf®¨ë"AO%¶ 7SÚ<Åuy†—p'¼²vÚÁ¡Ä  ³>e‚ɱ«²™6‘‹¾*빟†sÖh÷¯p—Nü¤p‘‚ ‚ö‡qɬò$À´Hè0ÔêÑ&É$óqµY¸@ ûAkþ¾=.”±÷ŽZÆà{5T ðÙŽ›Í­Š¼9ì¼Æ,Ú¼!N´Ñ#–(Ì)¦&ñJ>%zÀ&ü0åÀíþ©YJðÏŒÐÑ3f¢éA£¨¹Â(*ä°•¿VÐ;ž%Í`èÀKŠÓw6©.€5b%ë?ïÁfΉzÿý¹Ù-õ´Ä=ÿÃÑŠûçG?ß¹ªŒ—³AßA¹¡žÈaoVLé[‹bèD&"£®¹O"ÊÝÁ&àxØ=5¦OêãOq ‡ä«ÀÌX}ëÃf±öOtû-²¾µÞà ›AŽßRÛ·:à„E C~½è¦°ÿ{t/jàý™Éì@¡HÀ—eDøÉ±¡*/÷M…}…´Ótp³´!r’B…M´+SksfÄ¿ÿÊè`]-×l(ƒi÷¸ó73“ô¼e'ð*´ùÄÈ * !}<ÈY)ZØ©èIî^}Ô Z€~-¶â” B<¼ž!ƒØä´]ÔÝÝð}ÏVÐ_;>°~³ÎÖËéù ¯•nÌÛ¬ñ¸Å\o(ëÄgzïúôÇ¢&=)Êâ87¾®Áä žðÂ=žÑDæ€áqhfú<ñ2tm|;ìÅG7>СSú4NŽžÊÅ€âe晣äX¥"-sŒñ=ÊÛròSµºCMïx~ÙëÎ9nVjö½Ø¬îaâs2ùêGU3éìqLHou(þ©å½tSJÄYßV«HñFÁŽ=a.ÞÖ‹—ñ ]aêXÞgÜØº)ÀþÈ­À«D‡õÀɤá‡ÀÖ=¿s=¹‰t×ôÝ·JäAÇ}» Þyt‘½BœÌñ¿Ã:ñöAÛ™À€ò°B6¢ì¶oè@Ù€°(2"e  H¬‡½ritãzoðíÁ Žœ®†Õ¦/MÖØ8Òp‡Æ ›}¤ Â’–Ö, ãÙö KJNB9û»ŒŸ¸i²€ì½›h[$°ÕŠÛu=3åA›>éîãø{XBO`§^EÕtÐ:¼ltŠc]UÙRÅ+;žÇµŠ?!-¬7xç”ìÛÖ´l£Ej,¡k†òT¥ÔŒzÒ§£¡äo}1Á@ÊÌæˆÕø}§:|YeQ)×1\yZ(¼|&Á¨œT[B‡`˜* È?œ2vXâP+ˆƒý­=;8>àÈù9©’oxŽ@¸$wÞ.r&@¤~ïRäy%˜]¬Î«ºÛ¼¼Œl«”ãÜèj+ÂëQ25"<ÿç¯ µ.üØö'λ?í¢7ÆOŽ\a¦­.þ5jÒ*F\U ÎäGq4ƒ U21…ãèÉÄ0Ãdz£4`|–’Uíçƒ? *uôQââ UR¶…´én7¼Ž›ãžŽ;CE@Q~:ŽÆ¿”Àø’M…o§.RfŒwÔR¥“s]ÝEñÌ=s_ðî‘F'>lWú]\~w‰6/âW¤É3~(!jb”K2ÚºxTˆýö}P)~Öæß:ª$ú¼…ÅŸ‚j‹,~{ԈɪªÞSKKÐ2êdl̨—Å„§AÊ­+LÀ HWˆê HWü}®8ÒÄ)HW¼›_L銟8* Ò‡t¤+n§9®x_¿7p]ñÉ¿§dÿû!Yòì]”_óâ]”_ô÷Q~ÕÓÆ(¿ìéñŒQºîyº¤1Ê/üû+áW¾x÷‹~é‹wGï×Þ8)~ð½ùJy¨ªj¹ÝÏqc(Nê«rq†Dõ0qe]ô‡#ãäP‡Æüª¯QßY︗8*ÔÅî—»¤{pïE7\•Þ€ .gÄE™=w<GÖâ`”@ß 'Ï™-? °“ªÏá¡%Äjñv¾:n¥†µÆB”° ã븸\¬1ð ÏžJŽj @l{ ]mŽnþÜËÙwIµCÌ?ìAÌ:·m› çoÛ…øŒ¶ ðcŠ¡„¶ãË6T>á‚ {e#à¥Üc™°¯Ú}€þ_JN`Õ(¯«)FáaÈ¹Ø êût¡ xoùMaWPĉ]¾K ;Åá ‡!b„+‹!ÕÞqÆ:PÑcT yh³z+çâ}$ÃäÉiº<+£Ñmg¯‹qåÅ,C)$\ü-GJ›°·6&‡ßªÖä¸ÿº{åøÓ qZ9‰³¨º9Æ¡YYÏQ~•¿©«"øP²€¡@&˜ hÐø qDå CcOn6¤|¯­EÁ¼!1q<¬`VêÓòpÅáy›[5]×¥“B6O#•ï%+Ћæ€ä£c^„n d4ÛÁèƒB¢¸X§`Sþ…çúò¢±ý=¨r®\Ãõf³•¢šf·á†rb?ŠZ½…<ŽãÕš´â É–2«SˆNE¤÷XiV Và;xuH»™Ò¬«í¨êÕ®‹€^+´W¡×têcœ]´Í!joŒ«¼?vÇ'¿„Ž©îÚx4¾œ½q²ôR ¥@k¼éË;óZܬìVeýÿV½ÿ»å³á@”¬¶¨Þ©:‘L$³—Mçïu<È8ôxÏKâ„õn®Ý"ˆÞLäèjÐÍ˲[Ç0\«Uc3 S øò¦ñAøžYPD°‹‹<ŽºÍí¶È™wT~W ­6%(GwÀ~(¼Æ‚Á8ŽVeŒC¹«¸9Š<ªsä©ÃþFª™>ê"A\Ÿ[²W*†M _6—·WRˆæ Ì›7ë&Q!!z@ð‰N~NÀ^(“yçÏ<ÍSܶqR~yNÐæ§GÇPV–ûx0ó·²u ±˜’’×ÀådÓ°úºÑ1…¡Ærs_b­¼ëAQíIwñÈÌߺ8{ b¡Y"–Ña#d0·ÅbŽdô¬ ¤‹ ` õ+TšiDLñ²ôé9™ ”jÅ.¿8µx¨·å^ò ´Z=µI Ê!˜JÓïlT2ÐwpÒ#¤ígaãÃÓbz€…jð=J=„ 7,*æVWÜáø²2Í‘{Ü‚æ^²·»‡ôËðËÎG˜ò´Y/€õLõ±”ˆ*åG­L H¯ ×“VœX5.1ñœÐô¶K‘±c¾Ä€‚MÌj Clè™ÕÄå«‚ñ¶@îkßNµZEXâʸÐ<{ÒƒDR5Š˜wb<Â3  {Ÿò9 |¥HP4Ì ¿jC«ávÕÙzùŸ'ö xž¿§Be§ôî-þš—Ÿž1Ý‚ó7Ÿˆ¨hš¶Çu vïìàîïG'6ø—“;ò7 €ðù3¯¤a ÚÑä†ï¶pØqå€ÕH´À×þ)0œe|'b ksþ¹£îñv‡Ó>TE ÕwÊ”fŽ ƒ§ÿ’U00qíÿÂŽØÊ¤MV˜œ`ëô— ¸ïAY­­Ñ«^v5žUÇØ€›\ºj{Ô>pÓ&–Í*(½ XEÀàž¥ÑQBЪDÍ´`-Ê2ƒŒÂcr˜ÕVËÐBó‹b`G-õíÚËBØgy¬±©ä=î5Šëå_ƒæÑRØeW}L‹ƒ“)νlQ3K;AFÌ¡GÚ®qCM‡2cèÚ=ªB5C§“ÇÝÛ×õ¯¸ÝW˜í~t»GÓ÷êJEi]c#ì®Á³ç@A±n ¦@„ò‹,ˆ»c™ èïb«väu-ÁºbkžÃ(ûûU-ñ¨/¡ó¹£°º0C±1ž!ð)_×O'}7ðøº~oA–±F¿®WŽ¿ íbwÇ='íAå/u°þØ0>s\4kÅrÜq‰4Æ(Ü©pœè‚æqb¸$¶CEzÐH­Œªb„a±­<QòŸ—CIksúŸqX-5È *ðX@š’qûÑI +< ½Åß3é»›ò[þ>á†c:‹ßiJܦ«MÐúh¢ÉM=´M”ÄàÉú›/¿’€mÕÞ$AÐÑEnGô·.Ä,Æ5‡€Ð3@^íÍ Š“çZ‹Îz{;ƒú²ñáb´KGÝó²´ «ô;.± cÿB$YÎ/ùûT¶8[¾“b,¿Z‡IÃâT] ´„wvbi„SÙ¥®Û"þéo¾^ÝCçGú΂Ož¢xùüG!MµÓ"ëgêLYÊ7¸M·‚"н[‰–éJ0tÑ®äþ)œ½œN^ò5?A2AÐêé ö ‚‘êæ8R¶J UÍZ8ãÛ?vk×m ÚaÀªK8"á{nz~•üc»Qg=R°­[£@Ìy ·Nüøcx“½¯¢½·üe hê"»ë{î$Ix†“SªjÛ£HñPSÍ‘†ÒqF=ž…ÉÕ¿ZïÇeò›¾Í“îãßȕԕ¡$¼]ÇôåÌúÛü}6ÿÎ×ÓÍÝY ‚R-Œ˜.¦,-¥Á5ùD£ë^.Å®ñ~خވóâÜ2³-&˜¤µ¬ú2h‰¬u®{CçaZM j*: ¯ éëŠ[wF¶OÛ“#¯`zÛƒ#mAðëºÞ/h‹ÎއŸŽ&ª‹œ€<Óé;ÖÊÆ¸­ qô r¡’…T¤¿ Ð'ˆ1dû÷à%C×–eØFÿΨÊ>vrL–»÷æê¯÷——Ý}º¼øëîööšÿùð×õåÇGöw²èµûpùðpuûeæ7Žæ‡à~ä‘W7Åí•…ù¸öog]} ¨‡»ËWg×Ü/ç)CÜÃþyõxé~q}åFKÿº½>{¼º¾?™Àz¹—JzåŽg,Žk²ë a.ú*¼V(+¸{“»bu0Ý[d9¥oþã†õHcæå¹¸|øpu÷x{/¥`-þç¯ûË3ZæûÇ¿¾~ø|v/ÑãæÛç÷—Ÿ®/ïcTÙÿè:L;òW4@æ{ògŠ9¯3v?ÃŒ[7£pR~›ÊòÙÝ@PùvØ}{a÷”΋7£¦ ^°—ùáçãîMëånt}a¹är9Tõ ãçay·ÙHÞï¶Á±,—Ÿ««¾–¢p.Í'לݜzqBçî™2y݌䃯™s‚©ô$z³ŒòG§{˜Ór)ÞÝAßó¦m£¹Ü,Wd¨y2‹ÍûM]Ü„ ¢ÚKÖãb›ËãÞx¸&Ôþm~íI–7“FYUžƒpóìAD ŽˆÜû‰÷¼gr›YË —?{&Èj|R#­ÉjÁlå2xÙÔ•Ea{ˆ[³óq­­vðJNeßËÏ£/Re°O§ ƒä_·!K©kÕR‡rRåÕÍɱÈ&_lO¯V«»lV–=)¤Ö—bÍëÎçö÷Å×Vsu®P5ø4N–iê ðšN§‡äT½©©f1˜ÑÂÝVKÿ8(Žœ—yYL!îs'çìÑ"高rGòÑŽp¶Á—€›ýaõf ,„ÚY† ÀO£©ÌÜÃè„»¡Êð,´@?Öîm?î¶ò·zFuÝä!~ßÍ۬Ϧ{öÍ+޲™}úsÏ|dCéö¢ÑüâdÞúSÖVfEÛíˆr(FȆ°%£WàkÍz5úÝÿ P´Ò¢z">þ÷qË' Pv¿øÚ+ª–—‚³?œ­™Hư.ª1îÁ}˧êÍÕÁ7?nn­¹ƒs+ˆ$B²I°Kݸ’Ä‘¾@·ãîZxvbäý°Ý)gò*Ræ½Åç æ BO ·>´~Óü>å‹ÐV–.Ô¹CcøÝÃVÁ V9àÐ#ס€òwV@X±~w>¬ŽZ;w²o›U”ìkG‘ ›”XÿY­ÁÅÞU÷fÚ\‚¬ž8‚’ßo6fødèUsäœm«•*¨ÖKùÇs;ÔeÐÖ”l9Ãùð¸;®é>/Á±Â½Yeä”g¬³vAä!R‡׹ɹáG<¯`YTèšJ=·ÔeµÐ9'Óm$@²ŸôûuµY?ßvÞÂâXü¢¬ÓÙêÁ±®NÈ~;—€ËÆò2ò¸ÈÏI–õn³•ÚLh:nFᙢ•§»qà–W¨Ûš¬´S#P•N¢.ØßÛup¾ºzxð²6Z@ƺí—T®Õ{œKNr `‚#»ýfG~@áë©`—¢4uÿ3¢øüJlq#ÉS˜k’H­h¦›0ü\Ÿs©ÉQ²‰ ñÅtç XpÉ[³aƒ¦_€¾ˆGñ‘·~8æâQÕc“ž•ªz÷RHr9`æùÚ²­³¹~ýИºúeªj OÌå‰Óñ>Õò$µUÏ7°:·¬qRJ‘t手 ")”}“ è¦Ü uðþh%è¸=ìàó•‹ÈjJ&ìÉGeÚ*Ý€‰®^ÑÓqGeûd#…­_zþ¡j¹P?ŽD•ŸPçpzPàQ0% vGßV›­>]Ú¥Xðv#9ó’²uر•Û£l4æ¯-­>D@8!Âį/ðäè:ÒèàË.X¶0»=ºýñc¯¼r3íÑn%\Éš2k¥ëF˜³‹†Ï@RÑUã>Üñ[ë芖nýcܽР®ö$"ª§\Xï9>›,*Ã.x–¸KÕâ¬9Ý«ë‰ìIãJã§²¸'Ê:¥ÔŒ·ë‘eRr$;wJ«ã8F) þÊQêñÉD­$‡r¬Ïj5|ÜHO1.–uöFóçÅžcøš:Zí—˜­ÞÈ‘I½è›h·jøÕM›né2HÎmQ8¦í›DÛ\ýð ŸÍ¾i£Îþ؇l£Eصñ)ûæsÇ Š„Zo×LÔy2‹>íƒÊ‹ÞÂŒ¤åq3:‘…,îüq³åd© [+É]VÌ=ò¶¥êÓ«õ2¸Q !YÃ3Eä©ßÂj2€W:)ë ä‡12ÖP.¢sD7O¾CœŒ×N8¤ÄËÈ€;ŽdÃ×Ⱥ‚ð<ŸÈ%^ûKZs¿pÂU>÷!½ :£ºÊ²tÖwÃ÷ۤȧƒi'äò'ï?‘ç½:§Téò:j¡!u[¡8§´;J÷NRc×KǺ&K¬ï&y/1q–+ÙOÖÙQ”Ý~òÙÂb°oÆ‹ïÏ7 'þX{í©˜¢ÌNÍå³ L‘²<Ûú;'!^Á"°åñ`ð×õ?Á£!òõ ¶€"3¿¡›‘}uHÒñÉ`kËõ|c© øg×’{ ûRæ˜Ò²âÈ<Ú/†|ØgŽª›Úä„€ ý1Ž28þ­nñE ?‰‰d]àJ²®#äÊ¿ZGú›¢3Wû€]­ˆPÂý/º:Z B«ö¬iûªIÚTÊ=SÐu]t³ 0r憲¾™tk#ÚÞA|×"øÉ]•üyž âdà…£{uqá7¿ ê› èˆ·ÝÜ”\=Á¸ßÓXîœÕßPÿ@–¨r|9Ó¹Lõó8ìȬþÆûPç''ºî³*ÙûÒùâê‡wò¡ÉG>vÕô‡'xù²kAå`Ø—áEuUU—Oª!þÜ‘)f§Àn2+ÍŽÊlSOxð•mÄh„V¿zn¹¥·æ£(aQŸ)÷΋¹^’+=³Û¢øîÌÒî¡zq‚ m@Q³zÊØàVVb;FA6wMßNéä›*ŠÖe™î;kê÷¤OÛLf Œ¢qÄ­€ÚJ,Ìø¿Ã·³ÀÕçy‡#ÙéÃKß÷9ÞÕ9Ôù› ä’Wa¯&°ÖbÒ"d$ 6Õì¯6^ÀËKŠg˜áõb ¸ ÷¯å/•tšv9só rÒžû²ˆ[h-Ð+Az%{ÉBâ;¦¢Â 5õì¢8–%“ÏšZĵ;1Ðõ. !‰‰žšò&škjH¨2|@Æý“ħ*Þ„¼…^¶­» çµ!f×á¼BƒðņAÜîê ÖôXB/4<ÛKÔœÒÀúo4AäÖ×¥CÊìØ©12="wÀõæðS5ãYDmw J˜mP tTÁº‰`ð•˜>S |ä2² ¹Ddô¦,zÿGrßÃÑu¥nåtiZŠ‹#% #)ñ@×ÃâS²Ìü§oÆËÕ(å-À˜÷0‘Jyn?l­âœM“‘#¶:?’«=ò 㸼x Ê&Ří¹Ì›ä;Ñá%s¨`%îËðËÑY:2ªvq³·?Œ‘.²X¶9ÔÙtêÃÚ Ä>þôY4 Dcée ¹DMƒ{NA×CþÞå,×äHüÒÜ”·Óýôìu¥f¿ÌŽùåï…ÛC'5;ñACú@¤¼üýÄejçt¨ÆmeÝ~êÅÑXþQ÷‰¶ªÁ,M ×Q+¤ pòþ°–Û#Å:"UEŽŒ¬æ’‘Í{ÞÓìóâp/¦È´LdXåΨÈû‘H÷£•X —þUwìC;H^ÄRIŽ{¢ât7˜õ­]OB¥ž Wk¿@uWÀq±Á’]V%*É!ô[õ`rD™•ŽÍ‰:”Û*¯|xÄ·ÓÇ3™À.6¿ÖThÎÑìASáHvò7 /ˆÑÇ£žÀ¯ÖÐ7ð¥ þ-yÕ_ëüM}‘)ç)<Çëöhfžº+; I„ zÀð„P…¤³ºûé&/•È«4›€öªl»öO»q{$Zm–%;JªŽÛ8f‹1˜,˜@•@IYÈqÿ“¸“‰EÙqõpô8g‹'Ƭ­µXœö1Žl8¤©² ºjÑ]S׺¢<¹W˜«! =èEC’ÇWq–j1±åŸè6/âUÅþÅ*0u]Aùº>î©D«'Ã[ ð̳*ŽËjã¦Á›¬¶{óiA¬¹zzz/´®ëËáarðñ£”Æ‘mŸ<ã@÷BíbùãÂ7še¯Ù§Áò4ú{šµ%\ ¢dÕ!Ó^Õõ=¶~ŸìzIö£f: Ž®D˜@Ð:ǧÀØ6ÂÌ_Å\Š2•xƒ¶‚7åSp0-š¬Œ–šÍ.d+cö=«D4<÷äÖqß0eRÖÂ+„Ì¢‹&èÍ¢Ö•1j5…øòÆü&[¹3†rVY³°XEÛÁv 9åAöokË’ö¨¢] Yêi<1×€Þëբܗy´ A«Ã¦¶ýa|òΠks8oR½Ÿ;Zm´&5éÙtŒ~ l :¶>ùŸû³õrŽîöÀµ{œ¸é‰BÂX ú9_¬ÿ쬨ùKðï=95BUåÀžP¶ïRÝÇ‹¼kŒ€|~Û`r…€³tEuüñ¦+—w¨dà«&¤K¼}AšÔ+Æj†¤Œ%±¯ ÷ÀìOÄ6R„BžvÄzˆÜœ6(1­M‚£ðÜ™qìñÅ@¾¥ÞRž[6Û1 êáÊǾ/†^Éé¸9ôÈqÀ°Pm¼™Âø(ûT[{MäS€¯6»se³Êvqcꥦóœ ý÷@:EDäTàXŒrnTÞÅ_e]'æ£ódí‹?ü>IYÛ ¢~’œÜ½°/A¼¢1ªŸ£3Šû*³ºÛ°«ò3º­-0_iÞr³¸íû¸áXâYJÄŸk—÷³_+°œ•HÝ 8ŽðP·‚6·<Æ;X§¶S×@ŒCÙüjы͊Y}Óë|öAÅ£{ýŠjŽ2OFW’WõûÈ›ÅÚ­æ.T!Ò[4?Ø?ÝYROG­çÈ–²Ç EGá²¢p©,š 5³fÏ8-:¶ÑóL1÷ßi†ò>zN¹ÝÌ!<Ãr¦¨qø¥0ð+sVPP¸m#ÖŠ!k8IììÕæ5žzmà å™»d €¬B”’‘x #Gu†4y¥Ú•×;Qi¶ªn¦¨«õùb²c¶%„À ˆU ;ÚÏÁ£ë¦éÒ•p”oˆô™ƒÛ>zI¶ãŒxÊ÷mÖ¥ýÓbPä-Ú¡r»9Š8Þ9O'§ tiJÔ¡I@ÜðY¿áæ·Íá±,bBÎÍî@ÝþðÒ#UUG+þª¬èþ1,¯XbËû<â^ST°E!†3òãINÜ@ؼ[±½‰Ë¶u/™Ÿ$Õó¥‡AS1múj?±TT9º’R>ûÍ÷ABveß"¹dwù›“[FÍÙ»Gnìþ~x>®» "#}6¨Ñ¯ö¿FþÛZay¡½÷Û´Y7 Ü¿Úï®ÙÂ骬+“æ/$¦ïÏÏOÞáËMßK±tÇ2¼•î "ˆH gq_6Z§Œb@Êù?›q Ö÷ÂqevÏ®߇•pûBªÔ”Bîp_¯—¿8ÞÆjseeQ<Ä@K`”Ñ^ªec§‚ma‘STÑîŽÔ(=¤ãLZƒ¥­Qñ$±°¨Y…B©€o¹ÆWpSsdü4]sÒþdI7>¬²(€käT`«•… Š ­­Àà¯éÂR‚é/[Ñ”y4˜¿Uw\ŽßÇõú›,Þ*îSÝø,€ïaUb=#Xs¤Öu¼NÚ¨ª\ÉòvD®W2)ñ™e%+ðSRbC­(¼7êIü5ˆVÈÑi«¦Å}}þ¸pÏÓÒ|$ì5édBŠúûBÍ?ÖImµ¼G9ËAŒÉ~Qnç‘~G ûWÕMwYƒÝxF† ­šjÛ±*8Ê•1I$T’Òè,ÉHÀfÜo^ÔœnŽ„¹=ö¿‚^<½¥&r†Ø»¥$×R,⦆²jµšŠèu)d“<%eoŠFŸH}ô@rd”8$•ur SÞZO8Zó /H¢la¾PT¬D~ydóDÐVÒTMl’¾øCdRèù:/ÍP^†w#†A”º¬…& ðÈù¿ì£Yl-u„£‘Lm}àO•¡SóIèça¥Þ‹…‰p?0w'/–À º6!b¬}än°n$0,7¡¨ÉÍ Vaèú!£¡¥ÁóG¢â²ª99õ/®ªDNOyêoÍVx¬ÄšÛº XLQÉËF铀а)ÃVU¬˜ £O"_ìä“jÑ;ˆ QIx›(“(N÷q÷7YŸÁÆí$ö·HŒðërœrÑÆÍ‡mÜòVA nÕÝsDã€:¢µ5î";¸ÌGˆQ^œ/Cy58)8‚уyÏ»…wŽ}gUlFfD.ñ»_Ó ÌÞT×êòé‰Çð¸‰ëSU|‘4æk)ñ/'ÉÅ­¨ÔŒjBH#WA\²J"€ºbMzœçöûa1®½9Vuè-xÓàD4è—<Ž÷Œµ²Mšã¤Ù¤š¦gJEQ"Ðïo6 9/ÅAT¡¹)1õ ¢x4¤O±óu»[;ò°ú Žöx8eª   ûŒg¶‡“Xçp ¼<ì‹ßPMPZo¨ÎËù Qk§ÞE½ÙBD[ÑÏöÀŠ6òá2LHpþ?eo¶ÝÆ‘m‹þRöÍ#ÕØæ)Éb‰”=îyÙ"@ ×€–¸¿þ®.b͈LÐu_4lÆÌDd4«oÔi¢H %ÉÝÝóϧ ȼµHÂbèh±áߦ˥Ppw,¸íwOP{Eõ¤ƒÁ\Ÿ<{sóÄýÉT¥ß¨á%Ö‚™mžÑ¶Töà¸{â&GRš0BèÖ4à“‹{VvÌ Ó÷uàÄ$°Ñ‚*Þ2tÿÜ=Y(Œ‹ú1ãž¹—ÔmÁ„˜˜µØUe‰«rðêÓv˜ÂÇœ4¯@Upcº]­Tky@”×áZqNYoÛ%á¯@¿ˆvááœè¢ÓÙûc¸ÍìÄw.K{‘ûŠ;fÓl›‹4ŠžØ"j~d¡ûÇÒU˜NÀ7+ƒéýu?&/´.Xýn£ë pÖ„†ŒIriY#H‘¡ƒu\=­5Ó&È~º„žÜDi@¥·±4N~¥O^À²öÍî™|Äl(Ì&øU‰7)Œ©,®ñ¥®2P¾Äu_v Õß=ï‚wVûP˜5¤[͉ Û;p÷lx±ŠLp"†€ñ™YRHPÕ_`s›T5`lœ€$¦Ü3Òd¢øè’Õ'TºÙÉ5¤šªçÎkÑ£ $¹`uöhé«° ž`üd¡½‡N‘¯QºDÁ[‡ 6Î@òçÍWm{O`1qtá BÀÍçÍ#KÞË1Ì>W©9²ä¹Ψ˜?C’-˜f>/§ÓõiR-¬àk7ô =.­5©ù$DvÀùõùzêMYÂmú¼œTÊ{DXˆ—j0w=ÂC›H’/ÞîvIçT´¸-šžºó;ËÍÕ *Æ–M¿‰UŽâì«zlñ°܈¶¹¸ªËD"ÝI)± nBϹ§~Öµlf¿•«Oܵw†9¨íâÉ Øýì-×¹Jša Ù?ª®‡\¡)‹ Õ=ú|‘Q N va|.½6pÅÆÑmñ`ô}UµÕ5ÜY‰û*ÿA`ÙI;‡žH{‘·™#¹6 žUn‚¢¹Y#“‹Ï•§8F£ °†‰®=¾+©NÏk$6¾ù¦EàêfÄ j?VM¬á‚íQjxf¿áNZ3+ÌXÎñ€ú»JD7‡ðáÄé’¥‘.ˆ æH1Ë®¾?a!ôU/*ç–…bšeƇ€žö©‚ŽóДÙüd¥T€Ìën\‚ÙùýSÛr9ÉyˆàR7b—äÅGÕ+“µ%ØÍaýnóHwN7«®gxPR¤–q1x¸lX—’jkÎtÕ`Õ } -‰J|.rß'$•1$s(òÙ ¥ L“´š¾h³õD ˆwÛÍV' ˜nÛ*¡)Èý—`PP„ÄÞY€X?2V̹.{ 5S\î­ê²}s¶”ÏDNT’R_ jj°óæ”ÔK³B#UÑu9ö©“÷khòMIÝ®†0{… å‹ç³*[Ì1XÆy¥ZÒ3Çüh¦Åj5é¿›™HžË!¿L<Ä¿†v%ºs ‰—ÐYdaz<¶‚ @ŒÆçC‘Ã4 œ?íÝfO×)Ú+h9¼8Õ5†tûƒ£šÌ7ÇÑ}þž…LŽglò/ '·_-ÓÜp&P i!a·H'¼ ™B÷;  ‰¢H&+Y£Ì£C+:ú‰!YK©®6“z¼x‰ ¼MfqÞÌ”­j(RyE5¡h¬)l‹*P69O;î£öÈ“ˆ1pß`nF n…‘è ‚ón î®.Æ1ÿÕh ݦë±L±¢f¥»R±A@~‚"¬/)OúŠå!ÐU™2Nà»òÛö«¶K+†KÁ5ìÓ4V¼Ú*ƒ¸;H0pVa²¦Ê[u)UáñÌX?4u›½ý6*]Öô¡ hœWíÆ!QèÈ&ð޾Ú2ûí¥J“’d}Å‚‘·ç’*°RÐUQ í:ÅÀVë¢èðŸç‡)ÖŠy[$d† h¥¡,²%šæß`³ÛZˆW7`ÝUëüøÛt‘ŒüØ¿·GÁ‘ø†4š(UI$2B,Ç \vÚ8Ì2*]¥Œ·h=#õÁ–Þ’fW(äÐÇD=Ì1ÓØaô÷hyǙէj±Î£‚˜ü©Ácx›ŒÓÃ<蹺lý‚áŠp}Å.·Ã•'rU´JFÌÕàGRÓ±èT| †ôÉUïP 3Œºö½ƒWUÕ]ŽÑÖ°ñC%ϱïAqÝÙ“XÌ>ÓšÆ'ß9›¶„³ø(äÅú° rà¼â¿è×Ýô•MNXË©aƒb•¯!¨¶$Ålµcê lújŽ’^]ÞW†YW5ûEVo|ç°Î R5["Æ«VÕÔ“±šk|Òîëj:¼ÝMg“’{ˆåW¹CA£Ü`€V±òûë*E¤Ji&‹ˆƒñ *ŠvCYãµH`ó¢>YIûtؽÄ7šDÍ-Šq­Cò–v¡¾@ bý/î¿O?¸Øx¬zT%¶‰ûïϦ·1S‡ôLàsD­FISöøÖï÷«±ÌûËvÇeI(·Ö]eR*öþÀ½uµŸaSXöžd½‹ŠÂ‘MCp6)Õ1CÄŽ.œ­®ˆ÷—ÍjCjŒÛ–Øö÷oc­ö~EGc°;l5àB@Ù íÆÀ²n,Ɖgª…®Î†R“Zêê‘Ë)ˆIšÌ,äæ+„ ”ÀýÍ%ÿ>.ËaQ à?ä +º×c¼ˆ`¿¦7ÃÄ:óU ÝCRßX`cÞ ·6œVξ5ÉqV(c,V¾QÜe«­©Ï~;=“FÂ*ËÖÜß5éÐù&©"È®VhMaM<ÏXÑ딀Lª)`IÃ#ø7ÂhâÎ,›‹ðqÏftÞXåÛ4e†˜Ž¤ËÁ†ìW™,§Yn\ËÖ2¶†6;Èfc¡ È­-, }XLúö°9Y]‹£ìàGfî`—È––TŒ®¿˜ð)5˜ºÝÛH ‘A«”K*2Ö$¯ÞýÇ ¡®¢—%VÓ°Þ<ãS3IöÀƒ¸CR0ïGhÿHŸ¢›+´¦Úc5y£ÕSV[.T¥a0íO]xDà‘h6í‡:ŸIb[…7AŒ•2l âÔS.Œ¯›-,M ¿m Kƒù“jU‰œ æ—µLl£.³WŒÁD_ëþœV˜äJ9àÚRrh¢´Æ•©]|™A² $:tÉ„®Åý‚»YQÊîC9ˆ²Ã6ˆp2Ñ¢ýU!¿o¸xnn&çºM²ð,‚Ÿ+vLy@„p† “ EU 3 †8Ý/‡ý+¡#.3µ¹.’™ï_fÄrb~-h…`ÓøAît•ýòBŠ_ˆg.«U &ç.ÂÄ1r¾ÄúiU…½¾1ÞלaeÒ>Aùaê}„|ë ÃLÚŽ«Qwé¸WzŠE­A4Ê@¶ 1Û¬€¸w…¦eFÊÚË"+.h •Ù´è¬$·ðmÝò®™ ô¼”îÆWo^‚8\€ýVa «ã¼@†!¢¥1eŒôÑѤGØPçGÃ/¦ÐøY9I!ÇM>몧½8ÒvøÌµQ0¿†9pž?VMK›$5Ìʤ Ó"ŸåG5ì¹_PáM‡”hð#úËPô 7zœBÌ?ö ÁY¸hS•Ðp«­SÓ)q‘ ©L;.7›ÝæÕRšÄÊ»8é2)2dH‰‰¥É²ƒN^ð7#ÈüÆ…¦D4í°Âd€Y0§JŸè›1ÀLœç6²cŽRejö{Ì$å.)wŒZ8íˆYP’°¶·#mdqø`Ьf3&2‚¿åDšÝF«è”¨Ð¦ã‘Ž—\þ´HPæ~G3VØÎ0ÚçU Gå8„ F‚"¸>¦^¢ÑéÓà³’> (È3ÀH¥ŠyÞ냓7@Mc¤~ óÁCú%¨ùÓ§7ïCƒðZR"v;mÖëmÃË¢‡¼N«¾]}å½48{bÁ-ÙAx6Cäjm7§Hûša¨ü^í5(z<¨Y‰57-.¢¤‹. §.{k·h}ój̼ۿÞœ³W‘Búž^¢ÄÏOuÍÿŸ§BÄ”ô’žýwý°B%^ ‹D¤•=‘ŽŽ_¿ˆû}:hš²{Í qÝ_ë8Ø‚Ûp ¤=Ý æri„e‚ ½° §Ø€Q3)ïÞB Öþ†øÌ·`B|˜þϤÙÞlyuLÖ˜¯Â ¥½4`£Ÿ¡¹f¹.õu¹÷Ö=ÍÍ€jŸìíç]Ó˜”q„¨5&z¤:÷[íC/µÝîZ5ö”ú…PO¢]|_ý©Ák´×Zš„Ú@iµèºªîWO¡ÞªF¨°€E… ôÆSìêr‘V!œDÚ¸¾ÇA`ÝHbì¢äz6¢4¸Sq¯Ý‘;‘á"±å{ÄÀ2ˆ°øÒþÃI÷®…Ÿ$À‚[£(á»Å¾žæ´-dÛB¯ÎѲa ôèmØ.ë#öÎÐ* #ÐVZ\ Néªì7@É ±.²áЛcì½ÐþÝ×oIÅ蓌xôö¬ñ6ŸBS HÞÏÛb8‹¥Í‚]]jVPsÁË qåk9y¯Z†Zãã°ïmÙ3<øÐŒfôð½\y‚«‹›ƒ@‰Ï.{xõVªd$i>¨Þ‘žëÒÁþÝD´rË‚¹Æ§0œO¼êíÙGûX†Ã| ha¯%b‘’D⟩E–¯Î’}Ó@n¬$ó4BJ0rÙP`àô³ÒÇ"ª_€‰yB4ýÚãÏ øÄe;ÑO¶ßj4“ØÇÏÒ2V°÷J‘­+iÚ¢WJÈèÛkŽ;Ü"Òî—ÞkÝÚó%kßá>ø½ÖƒÝíD5`BmO—<#R˜ Õg±¬UU½÷XBUŠ_Cr…ÎBBÆ¡ty/µQƒc˜}PkMû.iI‰TaC¬%??=éÕå"}~'Ä¡G¼¬j §÷iµT¨šÊø.¢raŠžÒ'¬œ@îšn¸&t— 'ŽëïÓ/ÑüŒP°°%Þ§²(Uyò™`æU3Ô`qÝÇl:¶<š8ÕlÒ$ˆ™ŒÔƒôÆôƒaF[Uo¸‚’[)ZL‘`¸Õ¦ÓR’žG_BYƒ½ÔÓÜm¸¢·àq÷eÏi4Í2 BZû%ö¡°¦yëKh‡#c!Z:d5HûR¿QŽÀ±­1˜&Ü'3±¤M¦Ÿ°+ô¢ßôq{øó¼ðí¾Š‹w&í §Œ?s,°gߺN‚g²Ø^æ«Ôå…gö×Êvº‚‡=L²V+ º300Æi$?Ùs‡j‹Õ7º·*@VàÍËíZ9 x>¬~û?n‚¿iæ}A É (\ ¢Zøy.|AëgE"ÁÕëÒ&á­.ë…ßT%Ù¾¬éj©T bérÜÍ,™¢ÆÇÖêk½o ÐxQðÓÒ2wÕbõÙ‘¤t…~g ÑrhhdN.mØÿzš~díž:ˆÏÍÇU5n!C×ÝÒÕ¤YCÔcÌá´ik*'´ ÚÇòŸ¹æÏ¦PÙ«•)«óYAmÜ}YÓr•.ÜÒ…|ÜmžU£é bŸ•ìÄ v{Wå¸Ê)ëP“+\úëØÊÈ:ܼpcÌ]j9„Ø/”û»&½w  ÌàZ•n[öê\Ÿç]A‘ý¬˜wižr{ö0ÅÍúíó‰‹è;=”è7XFC«a4Ôil!@{yó„Žî4è·çÐÒX“îI€qGGõúÞxOŠq k{6Ý3©åäñƒ0ï)6¤âÁ<ǾK¥B8Ç¢ÁUû̾ö­ÞƈYv±º=‡°4wzE½ø ùdÕCÍƹTà/#Ù°î«×@ÁuNó*Éyn¿_nÎñºÈ&â÷¡]Ex-‰Ð Yëö,*„ þeuÑnñ,üüÏÏ÷X²r®]ÐI½‡úÌûsGiÛ@ç­}^0)œóÁI 3KÙáö± ¸Zi¤D½m¹%,ÎF|•üÕYõŽ¢¦S0,à‚QæE+(kÄCd‹ À(Íãhågƒòg»äù4ûÄ Rrë̆Àw© zqm8§Û Ò~3(GhZ$ÛÛŒ·iÂèʱ€fbl9BãHF¨šÍN5ØEú;Èk\è"˜·EÜÛõfâ®V»ÕKèfÓV @j°@Q}+Ââ†ô}Vª%¬q#8èWê¹HQÜ¿¹Ï–ô!°™ˆÍ#á}7ç7Zݱ&Ž“Ÿ&õ¯µhhù¸9}ËœT*–c…ͽ¥ÈÌ(}ö‰Y')s>*uÞ¤ ^¼4Üì·\ÇáÃz˜½Û†ºÓMÝ6îGÊÝŸ,>:—è(ˆµ·úKBS’Á?OÂåJ]5ÆL™±E[Î+•ZϼØk]@Òû'¦â|N_õ‘·k¯GÏaH¬ì÷¶ìÒÔ8HºT qÌà›g‹–U1s{Mû_¶iI0×CbÕ3°+¡U€â}§²Bg=ZÚšvï #»Ž{¬yJF•iR5ÁKH¿s‹P³Ð5ÀØ®P½âá]-#ð÷¯$ÖÖe_yÚ7 DÐm¦eAƒjûÏ«íYÌ‹ÿ~ž.+ÍJñ,®=‡ÔÂ!ó¾žÄ79L3¯‰.cÔ2[Ƚî^ª­dʯ§•FwÔÿ&Å̯ïX¡nl¬b‰ÆJ8E× òc ̉@’PÓR¾xF­®¡ÖÞòR`™Ê ’nöêšÆ’%ÂÜGHcÚsâ0!7&ôùq¾viݬæ}Cѵ,ˆ±ñð¸%P¬SÓ¶ÃVö¶¹X캋ÑÉZð2+žN¼¤Æ^°ƒÄ“2㪂Ó&|VÕÝD(bȬáDG›éçý•0vÑ´`;ºœÐF@”É^‹@2­°·m-µƒ¼JFÍM¼JU2ñÄ"p;…Ò"M9@°Œp cû¼“  ¯¤Äq~'õEÖ7X¿¸'Øg—ÂÙQaÚõéI¥® {ÚH*þfDš%a83ùts~9<ÎB›ëš)P ½sV5` ‘Ù·ìðÑh›"Š×ù‡ÝݯöP“†fæPZ±X(îö 5ÏN!˜‰«'w|5@u) Ðõ²p¯Dl¶M ‰Rnª¯ ®†#5ž»¨oi#÷­²ÏCõŠÂ…À‚˜^ȯ-Î0£kä:1q&H³ô " 3Q=ø3p‰8]×U‚¹ ÁBûŨÀj?íc˜ í»k|u‰žxµT°Ïÿ+½å—çC<]Ñ‚B‚¸@ ¥%ƒ‰ô*½Ñ›2+x¯y‰^¹fo× ä>¨^Ù ^œùíŽ,¸¢ í`HÓÍ%)¹A#ÆÒ\ÌB!5ÄÏîÏ·Ó³'¦óiÑC¾c?¹ƒhÿÄ×~šÑ>(ú“U5m5RA¸ÃÏ º>ngísÙ85üýïÿóûÄæK‰è¢ÓôwZõýÏÿÜÙ“$KC\º¸ŠàÆçÓéònóH$ÕìÄ%©uÕ?>ò»xE4߆ˆJãü²‘ˆÅ#ú?@cüê#öýaýééöp|¾T8—ˆâ¶mj$]’°êm+-BÞjTXT=¦öKCÄ,’9âF[¯mÖ<§¤$6õøä‘³u‰ÜEŠ ñèòZ7U%q¯ïVÛð=QîFðç^<1Ô¯œ~bÙ<“xÒg¤ ­Ôê1Ôà«»b*µ fs/¹õø‰Ÿ@ÏôK óyócKG"î2N*ê–øÀ½nu<¸¼K‡’ø›Í ÄóßîVç°,ý\irúæ¡¢C£ï—…C)÷ð?ifLè^Çšq´­’Ûžùüm/ÜÇ\¿Ìƒt®@c°XYBiÁðõ5Ó îúnxÆÉ¾úñθTqC¾¼òâK)D?¼o-ÿvU\EzW~gß.½3Ð#'vv囲÷^GÙ#oW»–4"gì¬S—0ç}T¯?,ùäx 試(Šÿö) Ìݞ£Ãò£¡Ûdú‰w»ÕAºó\ûîê£@›²pQ~Ž$QhNðð}{Z¿òkÑ uí¯<»|$åYùÙuyå íµ/xæÀÅÍ…v’Ÿ —üÑu5\$Ó6Tm÷_€ß¼Ä,ó6e¬ð{tôê¾(¯]u¾g«µ$’býõ³½¿®Š«E[ úÀ8 U€]¤¼†CÂKÀe¸hYa’£b‘8iuZÎcÂk¥-@¸{\œŽÑ^ß<¯·—›Ýê´û —ê,o^̨VA¡ðÄì$µÅl˜ž¦¿6ÂM.3WZ%9[j¬.ë>q'UJ¸V ¤{WÞ½Æ qDɲéýX@¶ØJv/_Ûÿ<[Ôo¬„MÝT=F;”xV 6+·eqåÑTÐçíZ­“#{óá™Þ×=žŽÝñqñ&4}]À %Ø[Žû§Ïæl¹µu IßÑ+¨» Q·a¼.qW“q¬B9c6K§­©¾±-ªbM+(ÔåàÍÆ2Ø3Û[8’Žô"¹yEá[  ›Í‘îMÛÍaó96 $!4›#›%ëj¶0Çèd2èöü˜î½n¨’E¼ÝIX˜8båínËÉSÜüÚ]Ø þDÂÉ=Çÿsè°–a~cØrØ%/‹ÛÕz+€e”Ÿ<®Cüyó7ÝðùÚðjÇÀ…òüت@:Æfûw<Œt/Ê!fΈšÃñáƒÇï›ö±lP=õÕ‡ë%¼ÎßEh×ëZ°i³ŒŒH"ØžSûÅÖ5â‹áÂ#[y˜oéí¢¦°Ál:*ªoÝ·åàK©ã¡nÀô|ö µ…àÃÖZ‚3+ö!q÷,4A×Âì­^KÝ^Äþlñ) 㣫ý$jVfÖ ÄÒ»lüý‹ÉYI®f=Ý* ¤6ÃÊ//I»°‚ÜŸìñò¯Í‹&SA•Gßš}×ÜXÂ7=xô“¨6ÌÆÁøÒ5 *óðîÊÙ\×’éŠÃqk>g¢w-“7Þíž¿Ý1K \QTc«$ÇçOkµEk ´æ›ÃtxÙ“’ä<»ëÛEh¦`‹E «ÍtUk§î¡õõ:ˆT¡äë8’œ‚ëþ)Ã\ôÜDŠ2BÏom¿nZ€p®o-Ú] g7ÏD_hñå¦uP†Û³Ó êc{éºõpæßÅ ¸9„¥ZÔ'Ø4ì©®lÁu.ÅcÒ¨òJµ«Œy6¢²Y1¶ã¿ôø—KëlLÄZ5Q7dä õÈ-\††ÅשÑ÷ø­˜ÇÌ–=(yÒ°usÚ¯|dœm è¡ zØìÓi•èrcÕûq#Ô¿|¤™y«¦ÃÑE*ØKÑÌ×P÷t×̦Þ×%˜å¶™-ˆž/÷2³ý:¿UÀÌü‹ß®ZÅ!ê³Q<#uß%„ÚQáº-Ý"àãóî²=rCÂmâWt½ŸeDBüé qÓÄö¯»/¼Ÿº‚RÅP”OZÆmj9÷¼˜ E庫ê:ùù(÷Uõþf¦XÓ³eÓ$¯NÕêÎ[mëpN ï@Ð+EÇ«õógC‰>MâO¼x±«ÙµE:ùDåæ¹€Äã®L÷Eß7ɼ—eðt/F-IàåØdŸ ÷Ã)«…Am¹ƒÏ5D\²*Ý…u·oQT++Þ°¾ìÒAWuÙÙ¦ëÇ—Î@•~à²\5^ôCq`à[0xúX\¬à5Ø*T]‘~`Ð’y¯Û*YÄT n†ÄDŸP(½9èïQ ËmÅYsñ—„Ef`¶vùOÝ6Öê05IzžbffI—_;sí`šŠÎ®à°¤Ó ¡J>¾x*tCE(i'0ÑØ¡á½ÓqõM–æO*c v7i‡xýDorúûåzãCª¤«a Õ8à h¯¿ éy_Ÿ/›³KÔœj È€¤Q­ê„Þ¬@ŸÜÝ0!AˆáBõ¯ M÷E»o() ñÔrδÅ!&U³ê]uŠËø]Íuóß[b@˜©å,¡‡ØûU´.Höup®(ð…‰ÊB¾7‘«•tr‡tÖÜÂw¾wœÝÑ¥KW2Ø|Hzj²×*½4=);uw ëg¦5G%|rL¨[ bmý¯N¸J×7Ev¸ ßôc ¦åü Ó}–š.벨««ÍH/÷_'¼¬öxÑÙ3¹9±ìªn>í¹M‚tŠvœ-]Ì¿IhuûsYÏF.õ òZKïRÁ§õÀ6bq°b¼Qqm¨²«ÄJ4𰿸j2˜ 0¤Rù¢úM&¹¨Én¡píç¯A#û¦Î® ônŽ}]g´ÌrW¡g²%hjR èÅ£Kç¶ÍO¢$ÍïW[ôcE‰†´ÍŒb×®“—²J.q±ˆÍÊ&FKI¼è]þ“Ë’>{Ñ¢iPp~ lfDhžšÀs?´(õ¯ãT®jËrX|#‹W^ˆª‰¢äÕ7cÎ8eLEc<Cï²³œØ2/§†sO’L‘¿‚~a¿Y Ìl¨Hèãóææø:\̸[k‚ÁF’2CÕT§B"ÿ­Në÷±Äׄõǹ*aäÅè© #®-s^˜CƒL¬Ñ\Åë6Ì9ôvu€51`¡¼ž·±dÈã$¬>•K°•dÑÑÖ'_+¸+N¦¶ï:ø:Mt’êѱ’B^j†«Uù3¦„¾ÑýÔV@-¬6õŶUQâ ÄuC.a {ºÉ‚c°.kPÅ¡½kdJ± _Ëåa:Ú¶3u^ÓVÔ¯aôD/hp¿$i4´F'Ó.#8ƒ>o¤§ZAÅ0Âв 4Vèµ°ö‡Pöxð¬Eáé"M,¾´±G7 É?î^Âö´$bŒU2´g-F–Qº&„KhÄÁ/’ΘÜ'¹'1º¬*\TÌ_Á"vƒgêÌT‚¨Ø–®ÖyfFüé‹W³‘T-¥‰´(q±“ĺfµÆxÒˆŸT;L®¯!²+ž¸‰&“àˆz÷é‹è~þ zwå-ÐÎûÕßñ{{´ÛÛ€…ô(KódX›ÀÂm=G?7šÝ›‡ÁtÀà“Ú¹YCá:1òr^m®ßI)LB!¨ÝÑñ/as· í56éA5Óþ8Ü —!Ö‹$êC7&¿—k‰,ÄAT’#2±G“ø}ÈÏ?¾«œjuxëïýôs‰|4Ã-›w÷5Á Ôb‚ý¶ýö=±Qr{ŠbÈ|?L?2 §Ë ˜EÛ4”üA3~ZBþW†tm¯ú›bR]HBrÐ\›m}RdÙvÕ(ƒÄ;ªk“Ÿ3kÖÀ–˜ÂºpSŽñÊKÁ•5¶õ5PBBèW»jþš²¡öÚ×ç  Óžiu5'ª&ß±a:-]º)9fµ¯IÞña ±eÑtémœÞüV àC¾p0BŠ€Wu¤a¬“›5×jª²Lwé5Uý€W¡AÁ OÏO…·ú¢*ñ.Óɨ$Ý—Tÿ ,] ©[¸O¤¬$ý4ÉÙjJ B|Àʧ÷é ÎÕ—FŠÛ!†êï7Z•»É$‡5›ªÀ-¼¦³ôm*ù¬6A˵al|YEr"ÒGiv£ÁÌœ"-ÍrâÙ(;(çÎhi¥ó¤ÙÏ›HÎÆ$XÉæò[Åu Á‚{™ŽÈ× GøþùÌÙk‰€ƒæObðSd%b˜™ã˶ïIÔ s+W°•¸Æ$´Fé""@a,z`$ÅIÊG¨œéwúáûêGì1B„>æ¡\Í™+§Öc 8q ¸2™/¿òÚ…ÍÞ­.ß-ˆ –/û³~Ñÿ³Ýì4I+1k†zô¤7\qÒ¶Ž_:ýx7̆*«`­â˜•F4k"¥{Ô½ñF›ûÁ‹´®5xb7vÀü±Þû‚ÒFv`°k!§*Šôuï?a™ 9”9$ñôäiöÃÐB Ç2®®¬ )èLËוcF„f‰DþØ®rJÐÖˆf‹\¦Ñý²$m‚yT\6-hÊÐÆzÑ€¢1flj'\qèW:£A"AuZss8±P«b„B9âJÚsþôUS¿¯ ŽˆUc`à’| ]ý}·9?ž¶Çˤ֌ŠSéS|@*å+øQvÝè«iþk͇"´~Vûb5¸üð髵¬°ß¿h°c˜½&=!½($âÖüwž†SEéÕ€3Hïå òyó$$C€Ç²§qب~ÐC(øY÷ÞÁŒÓyãi0–¤¤ASZ­Irö‰•—3#(|^0?;é¨eQ6=”ßž#L®+½姯ï6«|'k®ë^B8tƒÖÖHZcÛxÏkß’w›S¨œ¯auÚ—•û)T¾Õ€ŠŸÖÞ@|ñŽÿ7ö“îÊö¿sJöÃê›}a²FXc&mÓsüMÜ“_$éz¾â´#QýWÔç9¦t消‰ítºÁïRÌe>ý®ªüLq®®]sŒÖêzŸ”–…¿H½ßžQôÞòPú–¼À`ááò˨à‘õzS‚³r:éÛúÒ­þ€Â#å…çÛ¢#m©e8¡"žÑ>@”82iÑÐdƒPºë:Ÿ¡‡=&[¦å°=ªX šË€øÂƒ€Ù7p(pÔœ u_;)¼=¿›ÎJ ,%ØK2w×”d¤ÕŒ t“Øõþ_\¼¥Ø²ó—¢K7Ä£Êßq=H°õ퉹ò:“¨/ÒÑ‹ÉDŸ¾zÕ›—ß5ƒ‘n°ç4¥ï£Vsùó¾zäT†g?úµ²¸#¬¹¬ð1ƒò´BrI0jÒOJ¿zàcF.µ¶£•U4z8pÏìî”c ‹–¸"}£Â$IÚ»b ÉŸPÓÌ@|Íâ‡Vžð öE¼‰Ÿ‡Œœá'65þÌ lU Á øpDR­\4™Áüœ4•q¨ˆ¾^ÛSÅÛÛ/ ðU¯¹©—¶2i¾cQ:b÷ÆèÇåóë¼’{M5VXHòÕˆù±ª*øq+Nj3œ„–+VjNº[© `÷!#@E—¦ïK¸7<b‰ §ì=ÄM`ºî›W¡½2C å;Ãf®rÀ]¿1܈ª[‚.žªt5ް¹Í…®EšË:ëK$þS-ðÞ/‡Å½!éîÓ5‘°é\‹˜Ï¢.Û²ØÔ Æ„ã=eïAê<Î…ÞÁ°Vuî?”¿•ûìZ")3óaêd_ u`••?F–çÓÓÓYûQ¶Ý8àiõxÆ‚c§^ &‚^>^mQ» ¡²&ª{HPÓO9AlëL Ž”,šK¨û PV´›}ór³»l/Ïkk7”°.…ί:IºU×d°œÙʈzÒ8R9´Tbì9³Ÿv$NÉ­íЕø%çP‚Ù•2¯A¶*é´Ø$Î5¡p("¹ˆå—ö-2Ö öåLêìoZï›ä¤©¼B—øJ ê Á2á ¯ÀÌ{¼[{ÎÉdÛ÷5|)‹[â½ç`KÛ áJÐ(—°Q¦0xW›„³WÞ܃R³Í^œˆ‰¦âiLžq§ã#tâmÐÖµ—TSõz  \Œ6虑ë¹Ü0&¿†ãáwØ€×Á,Z?êDËÏ‹: Ñ=|M®ô^5 4EUÁrþ'[qWÀe&ôV»ï2Wž¢ZÕéðL'ç£-Àr‘›ES–]´Va-"£7ÁbÃü·»ºÂQ·?þ$÷)Ö‚Ddyü¤xOÀš“†ákïó$ÿd§èÈâÕ¹®÷@—‚F|EèmÊÁcÎÁŸRfPÐÍ—C2H“"õü:¹û 䮫ÉV.V^û0ñýÆççÃêëfg¥Š»¤ð{i6Ç;]ÃÆXzTq£àG¯CÖûšã×E¡»Ç7ëµ$¤˜úRrxyGeyaœ3Bc¸<›r–Â9&6Œ({s¢¡/‡S6ø rëñ÷òVн·¤«ŠEàÈCÀ–!úÏDCz‚ä5àjÊYÖüÍmŒÿç<”wÛÕ·¤ 4s¸˜EGá´£Óô3öPÄ{'x«z4CG©'¢}Ü f-Ü8tÈ_}{¶•cûÅ+“[xòpÊo{9Gñ†#1æ!¡O4½hþÐYª£ÿëíyQáòSÄp¬­Ö^z÷ö}Eh;l¿Ãü# ‹+TåhmÁ3в=¿ìVßÎöîד—Ž~^Øîéù¨EÈé…øQ†¡ýäß 4¡lZÏÉ]€ýÔ¨t®ÃÕW3”ÄbæMë…Çç°Ðä‘PÉi „EüK‘Aõï²îc@û5xZÒ¼è»þŸž€¢átD¢ž| NéÓíh¥Ïðd¢k1‘³o(ñôðfq_ 𱌵1}Ùýq+Îa) ÈoÉPð=¤õ—¸¥U–œÚ§ Oov|uµ»¸p–_7â%™õþ°Ö¿ÈHÅ.‰@‚ˆ¡±jõX2c’Ý"BRÖø‘³ø5<‘˜+UŽîÏf”…ô§ôKžAÈ(·sGóbTlä+æØ- þ¾Ù¬µEC1zDØÝ]ÇçÇ™ÀQ”°fj¬Û­#ÔÿÆnËuß8“›Ãb×”ªh¢sâîé—¯ªíKh³äJ¨ÜXÆàØeTôSŠèéŒ=EsLÊAêø³E}Xþa©eM¦¥ S‡ˆÈt£¹±GÑ,ã4 $PVl–ß ]ʪ«FßDY·ÕOóûÖ-Àøž2õÃFRUéu¥¥û.Lhž{±ÐU©`Ÿ~ÝB²G;{^g”‡c%Ó5@ ˜'4ü¢ ß´HR5i儱S81IéîÉWþþùH4ÀZÿ´CïÇ„š$–X$“ø)-÷hâ§Ðï«ùí·ÍîhÆcíLJ—*” ¨‡Ñ?Òø!K¡ÑžÃŸÑ¤‰d¬›tüÓ{z_kqU&a§(2]Œâá@Ù¥ø=ÕзÎožB#¤Í¤…h*»ª­¤š–=°ÆÚ+°LJol¯NA¡ÒîÎZæ¹™›Á²,V´JqiÇØ6Ee¦¹"‚ŸNu)Ås1«ÍzBÀÚevA”oŠnœx±ŸðÊ˸ºNéçíþ`žâÅà6¸@”ï.ôF쨴3ä 凛ãñÃêù §º¨½AHD0K“xl«*½s„°Æƒ4†fdŒ™‹HW·9y”^±È°ø=@Ãù¼Ý­¹å¥h«þ¾HñýÁê>ã›JîþYÂo‘§è7éÉ­™³PºÐn{AÍr4N­Çy·Yå›Wu}‡3{Gd‚ã¿7*¯†6^öÉûhÅxõ2bìKܧ°¬:!/¿‹c*íkx¶¿H¶j€¥e}l«3 nCwW>Ô#¢E"Í~æ¡I@ÚŸ%´óýz¼ôE‰“•(­]‘XÊQm–eФ§žð:Á`¬U~ ʶq¡çXÕî^ |{þm:slÝ-ˆ"m¸_”ÛX00¼n}óÄ– øö¢Á œu½?ŠRª‰l[ˆ0\_fbìMÕ$ÃÚ¤¯9±†vv îp£aÄf÷UÛtéO…§?n.«µÆIó[’í˜}î94x"¬÷ñ¸ŠŽ­Šô×Ò5e$KîøRà _ýV>+ =½[Hßä®DŸ­ÀcÙôÀ½á)ŽÚë¸,£U;:‹+:oŽ$ºc&PÎÏÛðœÄ^Ø[îrWšÎ²wiE\Š)Ç¢™cî7‡IÉFõK<çù(¦ºä=×X$iÈ£ïZŒ#Þ˜,z€¨@”²¢ vÆä¹…×É(ëàˆƒütÕm²ºÜ ØÚ0ŠW^pN Nsòù·e™Þ09Ûßi=ö†!2ªB6êaUŒ;J™ ­Z»9“ÿª’m1…´ïŽˆì®ßÿ´ä ·õ\9NðÁ,˜fµ‹ OÅyÚ¾]),Qdª¡FÎ’"`‰ hăiñ²"ÑÒ5xeF‡Àº1Âm„°e÷ú½ÿôåÁ¿‡«Õ—¾Jam8ð8ýº›¾®v:ÜÔ@bùóGiÜmš»[…žøÏÉ÷1tfþÇb³8æ? i?°þçZœò²WàJlvÏãÏ»h#¢ú®×¦LË~ÈU3¶ìuðÌÑã4Ìs ÜìNvÜǪ„«ùZVK6‘w ƒñÁrP6Ã2’~¶«"¸dñðákªe—RÜÚ‡§%„ÛRÂX+n°™V-˜k,ôÞü#°.ƒ÷ã&ؽEº[tº°vSDç˜{´v*=µzŽk¿Ní½Åèô±¡s[õ]Qä@úRI¥8ØÜp{¹¾ ˆÒò~¦83T4¦&¾ÕÂ87÷µÓ;“V~X¬p9€„ž¢´o8+bUö Ó&vN ”C‘ºvœN$Š¥Ò…˜J\T:Æ÷R•6“ºèZTεŽo§c,?Çf88¢2&~'.:™J©¥€Pµ9¦­Oš¾/À¤q”¿[šÝóø‰$>Ë'Á}z¾|zò»Ã†ßÕ# &¢–±ì(T8)ÆÖÍ9Ü¢«0mVç%öÒµ¥‹àn'}€Ždðú'®D¾¡ e±”¼Õ¡F‡µxD‚)ýšpØ o¢ØøbÃÞ˯ˆ‰€&ûm>™½ š|˜Í ’ØâÚq)âNš¥“-‘Î6™åc;â~œz4ˆD­DšžOGíxÄ/‚»p }”ÏZ /;¿ P³K„´íZû‘q w°ÆJ¼7­_]DÄ€ˆrA©?º`r† &°PÌscap#çÁ‰’Í@ˆY¨¥Ã!Mx¦–¥}p D^bÌ»pféJƒfw‹\*õŒ’âdÞáÍ6;^‹Ó³Ëqî/´{ÓªfŽ$.HØ$h“t厨²X+‹ré7µÙØiûø—¥ò7­h ÐØˆXú{,ÑF{Ì쀖b§+7Vò>x˜ŸE]fh­8¨¯­Ë…ϸÿ¾:mÖhô‡l˜9n:<ÑýwK1ó‹¥Ù*|&–$Û@£bM¿ß÷ó2]8ñN4Hx¡ïÅãÆÑ˜¢w—7BÜP8UÁT!¶n˜–ZF‹Í²Ë¶€µ~ó†àŠÊ\”Í€,+2ö›@æÆ>9ÍÚ˜N ¨óÀ¶®+8ÈŸoY¬ä°ƒ Nâ%„ DŒZ÷Öm5{ÕûýQ Ñ[À@†=M?t4!ŸV? å-H9„¥M<³Ù&0?ÝüBÖfH),¦s«ÆWæ¦^#‚f4FŠÉÛ¦ 2aø×æÅ_5rÐ:"²¸‹º,“µþ¼¡£ùýö)ºI>êÒ¯—Êl’mW‰•/¸|¨ß^~æ—rÄÓj˜pën¾JNcó%èa9R4oG6°mÒâŒêç³{åú± |Åžàðãݸ0M+²­bŸ&rÍ€ «G¢'hQÇ Ž,HŸ¬à5ø¦š  ì®êáÀØÌ>®¶V?JʉL[£ñå ­M›lå"ž]áëàÔÌÀ__Ã<: z|¯t1Õ… ŽÆÍDÈäw„B‹4ýÇ Âé›9Ìå.t7ܨWw˨eôˆŠÔ¨ {i[`õNFJ»~ó’©3à_=*Çaáîæ°Ž÷½å€w˜«¢–í—^»èîégð=l5™¨J§CÙ,0‹Ù5ž< *ÚÏ`+ ÃeY;íf&WÆ·»éo©aÃÍmWâTnÇ¢qio«.,‰Œü}ZÇ ºàäl¡SåÝV´¡_¦“ÅGm¸>Ñæðh<¦€MlÅô!r*ڌ۷Ón·:ž…»Vwrã&õyóuµã™!´Fö½µŒŸwïÞH?p?Ú`·Žlð ö#}6ÇEÑmŽ€ÛŒM‘=á™(º`ZbË ¹‡¥§ûÍù<=nÝÄÜx}¨÷®kᵜ‰KŸD\0s}Ø|[=¾àÚ¾ifà‹d@l¬‚‘ÕŽ!0˜9¬¯£ Ó›dã3˜Höáõ8Ì—àW+:÷´ !Ò7»íJ%æ¦qâu¼)ïÜ<Óåp€³FE×è%ÅA¤Üç Gô¬q¹¿Œ‰½ÌúžÏv Ê¥Åâs#‘{ìøõÛcui«.ŸÆo«Ý7×ûJGˆS vp«+dçÖÄ+Nðªü·µÃÃa­dÅ—a¨ª˜eš‚ƒRÌ'tdÆÙù‚R²Â¡~¡KÀœ yI±Joe›eáý}ó#¹lî€uäy“,.8çô€¾ž.„_/rÂ~’—Í />ýè‘>X}'v8èȵï?säþy«hX ™ÖxXZO½µÆWR6€t$W»T"±õ¯Ñ¡Ð÷ ~qxˆæþÛ.­^£‰MïÍü©Û³G˜³•p­y£^oСÌHÓQô ¬ÀÃ<6ÖÀhZ/Lš> ~ø¬!³Fªñ+=ï“õÔü½~bZ6Ð;ÒÊQhY:©Þ‘Äí’¾ê§L²'ï:Åã ½²Ûë4è‡ß§ç_~†åj¸À³ËW§¿t NŽü¼Ù˜\f[P×^üŸðÑóÆÇ¤X9ÈÕŽÀ|m<È~˶EÀ9/6‘›éëf-áV–ê+/êXÄg¨¢¸ñ:²{- Ö´Õ­Æ«ß÷ÈÏc`4È3ÜâäzƒDÆîOmÌ_RDüTz§elcv`¶¤L¸¯ÊQÿY~!ˆQ’ÄCÏ™ÅgíT¸¶×»Ë(<%DXƪ‡yйÛ*´úæ@rü+]>á¿TÇÒÉÃôyCüÔ2»I£ê’íä'‚0#:ꉸÀ¼ÆÊ LÅ'î7œÊ~ZÿXBçx J´sPÿWOLû½zø WÂêŠûµ©À­} ˆ³§# <áÊ~·°•ÙÝ6º1¢‚®FØey ,¶Á—ØŒl[kßóƒE>Õ#Ø’¶NEÅM.ïüD»zÚêÑçXz~ülŽ Hj˜ct(þà!š[:/§“ôõLØöÙ8ÅQ‡þt¼|zS[ºZx•2=Vׄž û,Š_;è¾;´™Àm-÷ ¨F?öNåj¡± ë ”ukg@5Y á=äàlI’Û®C£Þd»J¨Wu·åÜ:›íÃ$4vË%õ HÅ ‡U „«mc!ž”ð‘>âæ»Xèàa2C]¶mÅ3ÂûVuÄ[Z˜îÉ–è,y?–ZßÃ2KUÅÄoÓÍ€ÀÁET&@òá«Â-þmuNÏ0 yÌöh}h'¾rÖ£3!Ñôî“<ªY5hybFrï1˜©Þm/š¾¥9T6·!0Á´¨–ËxÁ÷D›LŒVNÆJùBÖ£7'„Ié°Qm«¸Ÿ* 'ŽÀ{û=1Ç™G°’nÀ C’‰;V0HdKŒa¬él]Œxó+áÎH¡“äKâ-$Ñø¿ E„56ÐrQm§Ç l° ¸¢Ótº}§”¯Ç³ükhËñ°ÂèÞë&yÙ%œ›w?¦Óš“êÏu±¹õ Oàf1zù»ù»@P E5dÒ¦“е‚0‚œëêëö¢jlYtÉ¥»å›Ã›ðîw‘´ïw…Ý 2rËnÈé°{±⣕ž-™«èá ± IÃw/_[â,{ÔT¨ªGm|+ô‰z :´qt,ñ¹òp®§~yz …ÈŸÁt^¥­ÊîË"Þê]On›W~By ÐæH¿³Äã‹2_R¡gC­ª‹üg]ñŸ‰ÁR©|X~`Aj&NÁS_*…”\:8/öñÚ·×ÉëÎnÖSÊQöHðp{·ž¤´ D}VP«á€ý…Îç?W»¿œ¤—Ü€Ò·€I©‹hÁh­\-àÖnxU¤ØH ƒN}§ÈRƒNœnw!o ±(óXŠ{ƒv‚CEIÈ€hÃ90fn‡Ma÷9j«)b#)°Ø¤5>EB½4ŸLf`3×€/h銥¥À<B¶ü¶4ÊŠ w̹ªŠ…pµWÊèí!V\%a¾¨ðçÿ6¯J4,ÅòìˆBòöØ8kíø]¡~¢Œ@b-<ßbüÉ—³)¾%’¢Db•¸Ô7ˆà·ç7Ѧy!ÖÜ™$ZL<›ç\­_ë"7hK¸=¿ò³à¥d¨ëbCÑHÙnÏmLò¤ðœ?ýõ0iÑÕ°mÕDÈ2Ž®ydƒrë„sÝž%#Ž Ý[k“Ð#)d„金 É¥lÀ2Ã*^ÇpdJéÙÙ%¸ŽKÂmÝ#êÛ¿DÁ Q5R.'ým/ œ}Š ¶„ßœ¾n9åí÷ÍÜòþãêŸMnâ‡GÙc@$þä$®ÁQUdÔo«]¢T¶}Q£ÁUº»ëú³¼õŠ F·§”pÈ€DÍÞØ£„ÕÔg6By )'\G5÷äìóþö#DÄ×ÕXÁ à2E(Ó›¶È9Ä·* of¿@ç¤Ô+¦E{ ­íÔVqzXj_C•“ü!{¹u5b‚0ޝbMj¶£n~üæ%l0=‚—‰Mlœ‘ AÖv–ÞÃË%37ǬÀä1ÇG\[Á7Îq™1‰¨Š.ÈÌ”D fãÓéH‡ 7UU"4X)·DqRz[£Ñ2ÄC¥ó 8» DÑÇëä;\=œ ¥uD-?7”¼=…ÚªŸÏòíóù”^0LvU?›gÅÀpÑs0Ã>ó…ÀµùGAèßÍçìý­³8!Û§9HYÓ |8«N¨y&1?Y’Æ&Ö(ö‡˜®êéöíê¸úºÝmC A ÍÃC©8g($dê"1J\‹ªÇ%3€y´_Óç/Š?Qä$jfsÀ½aU´o®ÀÒZ¶(SÁYX´€VÞ M雹Tø¸wÉO?oîè<Ò•”¶®KÔ”sÿ|:ž¶g$æ·.ËÐi:ƒ7©Æ—IÒ 6«Ìâ@ÒÓ˜"]Ý€šM ²Ê9îr˜À’­èŠdì›F¿ÿ߇iæhé@àµ#0ã<°šø>Þ¨%ŽO2ˆKIT‰à5úØB?¼WœÆÅ8Î.þW¤-­PØÄ`b•“Œ­6!Wû^Ò HÁš;’…·üNZ@ëÚÖ§ïc¯Ù\Ð÷/Ú#ëfÄ)›Ôç¬SèÐb’ Þ[GÄx¡8\´¼†Í£ŠáU˜¿“ÎVºçÎÄ­œÖmß%§îŒ‘uH©J:¡ \/‚fúct w]Y$K±|Ñ£Úöé ”ˆÅ#Ó`ý‹ÃщwN¸‰˜á)¸ß°×Q’Bf׺¬Fµî7'76˜úÊÌ}–çJr=àE”.̯u]€_×}™Àåꪆ׋æ?¨ô‰ðv®¿†|`ö˜Ç·Ú î¯Íháûºï®ã É;ì“ÜoÒcä᪃\eVvD™EÂKŸpûÎ1´‹u2Á»Ýó·»Ýê!UºòhÁr´cºÄJzŸ‰™6Žd Kj£Ç+è4~ƒÝ°øÓNÌ»®LÏêenµ±ÏH¶ÀЏ)€¥'4ŸÏZvrö<ÞñûÿìoÖka,ZW…ã‘·3àxäÅTëm¢sÓ õ¸“OÑ—DÃéi¨š¦©tlêñœÌ qÔÂc6Ø/FkÔczáP¨X–mš$XÁ{n A1ö ¢Ã‡ŒT+ʧqÍ5›Oý…_»íá¯äê$â"—£“¥Ýn.ÉrÛPÛu uí ³li´{*rÉÙZ8ÏÜn\ÆY8Š,™‚ˆèï^6î{ øâYû9Ï–lPѱ–11Ê:VkëëÏ¥áÄѺôÙ¼ˆeY½‚O7’ÅP˜¥Ç9'RàX%®fFY‰)Du]ÑdÚˆa,¹É ÏÅJ)•éµ`K“B-â&y]ÏVbTýsõ—ÊP]"“œ8ãÊ~cm?)¡hТqzXÜžNÓ)ÔhJ§'v ¥3VÕ%±Ü~Ý\>nw;º{Óam½k´9e…RÍÉʘ±—z{ˆ‡­èJ$l‚¢s¹=X†ÒÞr¤´ÚDrâ+^Ûýöýø ·l)eSÌakim‡N•“ÛÓç_ZÕ‰ö ö$“QcÃ[]»u¢ÓíYÏä$Vu†ˆgA %'ÌÓ´ˆÿ»ÍÐt¡~ÄQ±›àâiu«mÍܾï¯PÐ>D…ûý—'®î¿ÚîžOÀÖÇÄrÒRn§ ’õbÀ³”:—:r-úÝ÷—³dõZ¡­ŠóÕq¡£\óž-D ðÄèqb+ì§“l|':“l˜¡›5€g`x‡ý` e³/²§ÓGfµŸƒ$ØÕéeý¸'V‹†ÛF‡ ‡º“]›DÜZ&¯nÑ/ÄŒi/4Z®Ï¿ŸIˆVRßUEò™6ärD5ô=šU¢”þ¬,¶ +|<€¢^C?6 øâ†ÇZ¬“Þ±o ?E³›È8ä—ì1[&JoKË•ÊMã2€S8Ñ&yâ`{s—ÿ=DNØxB•·g7‘xj›/eØ w‘k¼à•e2Ÿnaü\†³)áiT>ƒÓnsÿck)ä5¶ˆ™Þœh«ó%H^´Zräròl!­Ñ Á>“Ö‘+™ë¯5Y#íϛՙ»œIŸ@þ• ª=L’Äç£íY l€Ž[æW¨áP+€6’V˜:Ë%·jª„&p³ÕU9º°4iàÆÀ'‹ºšT $Q8nOGMSWâ Œlq„çLÌd+ȲÖ^“,·n]ú¤Ä}ä0–Ìá묒ïn³9ÊŽ[Qjˆq™Þ‡´¦7Ïg«šIJ<M5ÈM°—˜€x å7Vgí ϘÂçòãî¨çîóóáUH+ÇÁÝ SZ•&f*–\Ýr¯ÝíÞ«Ã/ð¶ß¾_6ÉIgù1vœ.¡(5ã¹V nä[ÿ’ŠâÚ³l!ñq’ 9$Jý¸ikƒúƒAf+œµµ×Ômo±áÌt«=ÈÛ |´“$+i0˜æšhz\‰î‚ùmû5…”è5‰*$É •&ãH/#›0háñ«2¨f=–ô'xK´€lPr&atR¦t=}³êd¼ î¨Ôþ­AéÅödD_Ü 6qòøÒ‘n¡XÅô9©íD{Ï+Ìá¹Ñ XTžÁ¯‘¶ØQUŽææÂ¡ýi@o0ïè”Úr*·…º¬òF;]ÝyI¯Ë⥗+È›ì:eÑE\;Ó ;aÜšÛ¶Uˆ*S´ 1%ІÜC”âž»©üܬù€k8ëPïŠcäDa©’´Z|EFk‰5xøY÷¼«¾ô¸Xδá/fãx}Â:¾yþš%µ\lÝw @» ð;1Ø4’ú]_RÄ’éÅh ¶L4k@q.ĸæCÅ[¥.¥M­+R“7|ïY÷Ü=ÇŒ±Âé^ÁªÏ]…|HRxå /´IO³ürøzMdqj;Æ•;×c™oÀ燤ð¾Ò#žNB \!±×ꮸU-dµM![ïæÇê…°y[ˆ8BœDišˆa¦_Í1~/>>_$óŠD ¨XD†“œÀ2 ë`“ ÆöwtEœ_jxe)E¹ñz¦µj…±†¸Ì—Ž…¯Uñz˜ØšÁ jb¡ÄgUÀÍ%ôßc  möÏ•Ópfj:ã7¢å~ø] 0,RCšD»`ðÀ¡k}ã觇¨%²AÖƒÇãÚfÊ»ŽÿàóÂ#K ¤KüI.p³ÞoPˆ®}Ý¥5 à™ˆö;’.â(Ü_6x1qżfç÷ÿyÉ@MƒËÚ¾<Æ64ež-µï˨¼”g®šLû³¹ã1ô¤(plLÇ7«ËEÔ#ëXQW#¬9²y·:í¯ R™¡Ã$=ò¸VC}ÕÚ©Tk§C¯;Á½?³¡uËêäý¾Ä£Y ”½Ôïwâi°wáF à›EV/¼¬ì’ßõVPˆµ×«W×x´ô™…/‚rrõ|œO¥ÂcÖl–MwO!P”Ø=sgà¤Ù+äÏÌ€¦ú‡»Â·±Å]Úª¶âüU Y?“µË¹B^J$IqTðâ÷tд÷ .H®F૯$A ™±ß] 0ûN’ {儲A°rqôh* Z… ¨~Ç«:6a›¬0Gô¾„½°&!O•¥ãƒõö,êgbˆ/Ço§—”¥ýýf¦¶P»õ¬W’ÝÍDÑeo"ÚŠKÉyÏÙów«3WZ|;•R“vW´¸Þ‚ Ü;*þmß @l¨¿¶Ç‡­ñ¼r &I¹= cFÛo1¾‰H1Bô–!EÙH¬ È9Þî¦ÃÆå]ÌþÁsB =úŸ{Å)³¼X'¾×Õ@‚O †5HÜ-(‰7FF+ùrÂL$lŒrêQWåT 1u-2q:_‰ Õ—‚{¨’“BTâ—íiÏ1^¤k\¶ÚhÍb²úQ¦ï?¾$ú¯n‰ÖØçýñãzg6É„Ž¿Vûí#°˜aDâ豌›.D‡ßâ*"xÐßmΧíñbÑú-ª×öŒJÆ V¤ÂÌÏB]UE;ûh­: %¿ÍôëΛ€šñÚ±ª’Ë`•°0=Ñä]Ú=*»ê’[rûBGrùÄ2dÔÖ†8Yß\íŒøO ûâ` fLfÚò¹àC¤6ñ¾AîlAëd2ª|Pãñr˜Î{Aì¢[† +[±`¥>±ƒÒàrVb—„ÍÝ<¾{”…8’!a÷½$”¯é[äFàQÛ±XÅNë ùôýam„§–f`B™†Ö•(áDŒð»ŒƒÖåâePýqA׈è·û…ˆ‡º¬«áŸ±þj0ìܪ„'µõ Ó¡vWèÂßMÛÃåýÏÇØê¡oëqiêK¦ßzLÈD†•skbƒ¯ Ssq=ãÒ‚˜ïàþùÌÑa¦oeõOH_¸þ°S¶x&f'¬NÌڀܞ./®‘çvÏJ=ÿ•-S³¸LrQ-Ê…¯iµt´­‡úÝê…ý6öº¥O–n]¤©¹W—UýO@8€K×P°Ö%Çpmõ8e³ôA¿ò?OÏHÔåç—ˆšˆ‰ ÃÃgÿ¾gY,œÎgnXÚ tsšEp»Û‘vº‹¾+bfÓå² Fð±À3Ó"!h–ÎSŽ…E«‚nÑ/ÛÃVú9ò ]~ç)via jøˆ±â.†ª›…ŸS©€ÙÝvsíîf½D|”Vþ¹=ì¦o!À9a"r&&s1¬Åkt7‘ÅâkDÛÚµ‹¸0™VUA‰ék`kÁFbÏ0.-Z…Xò)«k¯vRa„¥m˶øgtô¾««ć†)´3‹lüÀBÎas–HHÏòa†±[Ú¢+®îŰ´0ª½g?/_$9Š¿ —–â¾¹Æì9¤½ráãPGøeþ]õ­àÐI‘uµÎ£î¢ûnçb—ß½9o‰EEŠˆ¦X\[T+®Ó¼°]÷ÏÇÍI:ÊÌâµ ÈcOžf [V/]j€¹ ¶(ÿ2ßÝåÙ&Pñ"§xø¾á¢ÖFW‚,H‚è¢ÔaèÿKêïû´¢sO"õÒQ·P>ã‘ÖKä"Ç:m_\½ÿ»9M¨|ˆ´²Ä_ ¿tq¾Œ•fõþN4»-âü•éý‘®=n&¨ÚTœ9ÿu„@¿šS˜-ðcr]´š+I%ÐaLg¦° ’ÒB‡hY; ˜¯æ¿%ÂÓÛP©+‹&9i â®[&(²e¹(æïYào-ôtpà’Ì\ýuJ ä Uòü‹Jb\© ªd*(]õ¾™/žÙy©£S¸aL3Ÿ²*y¾”u‹Þ`‡]#-{O`í5!=Õ¦ûµiE¤&56ž£ŠòžÃ5—£xÞga¢}bÖý×o "ĶIΜÕçýtÐX¾$`©ì ´%ü–Ý&H܈ ”¦>å $ÃX "Dg…úhBêÚÅÑ öËý’Ÿ<¬µÐ2=íyÝtFÜ„¿ËªaR‚Ïp–áÂ.•¿Åå~­k4DÎtˆ."9hÁ!†¦S†DïVÌ#¸8ÜŒØC†kƈ…®äå¯ç£_QÅX[1öy1KTjúiQ„­3×´9K áØ„z§£•Z-†dÂ¥KÕ]‡ö0 1BWvÏTÔ$ÜCˆp ý2þŠs®`s}2Y>]A(9H†•¸ù)š* þ [\l;I.³õÃÃ)•&µv g‚că`ý¨yBx$ŠžéM Ž[‡þ©è+XŽê<­gèq(†ìÍû)j‡oñÄÈ\8÷É êÑZ×]ú^Ì`„¶V;ÒX¹L¦’å¾èÑ º¨WP u:zÇŒÀ£é[ÑÛ§Öt¡1ʲ‘Ý+ÂãÆ®Ÿû<õ·Ðr‚1'®É÷×µÐNÐc´!Öãxi4{þö÷¯|l‘”<ý÷çiJá˜ß~B_ 6pŒn?±T3>j›ÿñXó°y+ùItß~úó´µ¹–É·äÑ\Ìi t·ßÓ)88Ô5YÞ«¸¨ÄÇهњ%`³sàUÀ{”*=¼NH˜ë›–iNŠT{qtRhD_Ÿh´nÇkVëíþyçÁ(fø¡‰K4¢ÄâO€à@ßUöɲpA!kÞÒ˜¸C–*ihì¡1I¥¬Ê'†%#u1çäQ d½ ‚õ¸ŒÑô—Ñ6·U&o„Ë‚'FŸqEÔ^ì§ECHæB*:üà0fe…Thq¼=[ð»,ic!Rü˜ÄÛóù9M©6õGåTÍ0,°èõq¦Ï²šµ8GøàB\-my¯h»g¦Â®OƱîŒf¨uHºíÀ¤ÕøØ —ÿ¸ò“c}0ha]‡gÆv•+9LIPÈû8ѹæ^ GÔ‹Äm„/ST(râHav}CªxŸûôÓt4Fyý¾ùOÒà›k ¤,ÚÍD¬±Q²’ˆo«8ãSV’f¾±ÒŠŒ4 Ø£‚‰N«!5 Ïcq‚2ˆ "Ûyn®’,ùyÖ™·‹Ø/*- Ë|É-í$+È´/V8v«É»¶™aä˜ÁP³ÀiòÒ!®ecƒ‹®GI‘GäjÄá$dȨ°ãÌsZ8Ô a3ÆtÏ£üÏ}{ñ's¬ýt±uJHb¹;´*-P,?…xáâ2É I@‘UôNšÔ¨òäg^¦¡I1ož/Â, $c‘LÞ…U}oTÍÚ¶êšE`xŸ·í!¡´X†rUõ/G3HÕ”ÕÊÖ_æÄd/x{°}‹jzâÍ·¦"iÃ豪Póå*HÒ&:ÕJL’õuì:‰ö ê7äÝr6D²ìúÈÒTBªø(ÝéäÔ†š‘îXðN3–Pn,â¦SFÙûäéAÕÍd5Ç+dÿ>Jäàíᣅ(¡æ¤Ua¹ z.°tÜQëÍ,œ 9(Æý{9è9)GïXLA!B@B<ÈÑ3“ÐW†¾äÛŒ~<Ü­XÕ ´™!OAºÒj÷(rßÛ7Dö¿mN6ov¦°¶¨=ªb0=%5/B— ÔE eÀ€OÄíÐ»Êø:ÞsUÏ"¢›Ä%k¨YDtú5†YŽˆš¹äh7ÏÅ•@ᛸLŠtšÇŠOšÁÒwû;·Äq+o#DÜí^z”¤$¨÷«y´)* ¨%bƒÉƒ³žÅ-”ع4Ž,°±Áäµ`γ¼Ð„S„¼—TÖV-Ò4‚ E1VBÜ µÏàãÛähÝ/[§X(†æUêͺڵÉ"D«ôéÐ,–”É&JYŒ™Å¢È]œ?E½œw ^a3é”5ʽa*¨œÖI0äBdD_¡ß_~"é¥L‚z"- â£úE5É ¥âYš²1ãÑkÌH¥ž´Ä ‘Мÿj=ãWþg-²$ÖQ’–ðÉû¯»+¹úæX]Á~äl—ÇàñÇ Yz¹X·ðr¥Ž_"pH켸Lñè %~ý¸‰âÉB‚C[µî¢¦÷> ìíÑÉ…(+þ±DCºi>§cÂâXLf+¨ ¨%âš5R˜¥‹Mº0Ð"'³œh´Í¶hÀ<$Žƒ}˜¾ÙFæÆ‰1±¿\×´¬iV–q7óßç#bœ”g$y ²–¶ËÅñð“âzw!´-ºç§1 2ìyþËBZRuá@dËäòe_7 Førb„Æ0¦/ûãt³cmð%qL§&$ΣÇ ?äú«Âš1Èí0)ÎŒ,oÇý¶ ·VWP‰Re£ËÍG€ &‹ åBE ä¾É6Åô“¹às7Ç‚²fÆ<8‘ŽD€~~xëZrÜWbθ&ä?6'±-FéÒÕó! ¤R$8ò$FFÌàòǼõãtÙ&0ÎrðÂn³Ì¬1PKž{%s¥?¯²:³‚ur(¬UV»€úŒfÀprýpϺ¶¨y˱ÚÌdÜ6Ç8‹YDûÑuc6­€Qˈ‚™ øÐX [º!À8eÈM³·g0è‚Uw˜µ#NÈwoÌž,ÉeÔ?óa¢)ÁO^Ž”‡­5\ð+NÔÒæ¬Äߣ¯«s¨°èÇÈr°”ØíÚJ½ŒÎ×b&PÜÓ¼­ ›Z†Æ'B½sû_h Uõ®­Ã­zo—É:s35¬ 0¶¿€¹oz¨%†»ÿ„÷Ô-\äS&o*Z|“wÕŒ”£- ¿7Ü6ûýêñ{Z—ª:aÁP HªÍ†b¡ÊiÇߦ —Ò…>xë'4u A2¯œe å‘´‰Ïæ"M¡?¤Ë•öi%¾•àŽiénáãûšvðy÷î<^ä›»,UW/ñg 7¯Ô^y”ˆZjˆah—iŽVç˯Ӵ֜2¾IÛó¢!ÄÁ‹T•-xE¼&4ù7sRðÒÚ:ñ?ÞY]B­®Ì üÅq³-@´ Ä&’m®­¾­V³kÉ¡Jþ:¡‡¬H~’(#e.áÇ­.¯Ôäzõ9¶—&sòçÈ\Ú,§-É óß™öûíåÞ;ëüíáq÷Ì„àõ©ÐmÞ݆~ë^Z. òÞìæ?Ku'+ãÑTnƶ ±ÔjšM\¹œÍDlöÐ¥…êÀá‘Pãîdíø&/šß@©,ý®Wn:ˆˆjEµ“ƒMƒˆ6]ù7¢ER$ï ·S÷–¡ffïz%c¿OŸ~¨•ƒe€hì¥ÂÅŸûm4²´ ¸,Ž{)0áÉ–r¥j(y8C€»ª Ùù¸×äÁÍÆ&•Ë€hî-žëw1}:HÖmÀ×PÚ¦.j(øøO$Bs׎ð³a«P"]Ñ´d!DcFƒ¿éä¶e>¢Q +Ç’xYÖöl CÉ/C —Ì Îfù9\ º•P=8޲?ƒöñË%œý²A£_ÄU%áýs†kƒÏšj[‚ dC1sª)ñBí5Þ˜$ÒÖÎä#§1ÔK¨ÖsuÙ¥A,+DDóìuñEVZÆÃü †á/ýd7ûškx,ÊÄ?ä.{0¤©àrqQÃ|Æ×²I_ƾÿy6’Ü(Õ‡XÞ×›ÇG F¸:!”¿/»óU³Ò”-¾›ù»ŠtäØÖ ’_ÚG¼dÕü÷ÇÕÏ·x¬qF x9²2}žNIÙ&ØÊëS Èá{ëûÃNª/ö–3h¡îÕ'BüI¹sÜó‰0‹0ô[¨™}È£{‘àw;cz Ô:‚Ï4ÇE&C3EiÏ lKíðWg;Cc/‹(ˆ À\4EÌß3 9ŠHü3)Û§'%c`}"mއ«±_¤(ÒÁXøŠÛv¼˜UÚÝ¢†âÉêâxuº)ò—É7…‹ HÈÈSäÛ­àDÊ>’˜{] Å2üã–}´¾üEQ †ý>Mgyï™îW'{+ ÒŠä6—o°Z2E¾*Ò X‰ah΀B@tÍ¡(úl,1%:øy“²w.àÜt:J~^‚$1RúmkWŒ˜^SξٶåæïÕvû5[F¦=ßã#1c(ÒùÞÈÁ€uk!Szƒco^×dX¦} åë›ÙošYX?ÂDœ&[µ,"†Ë=†î¤F8Ÿ®°j}÷*L [³ 8=ŸøÂ¶hІ³Wg¯Ô69Ù5¥õë²7Îpá…C¶Ð œ_èªjë®øG¨‰ê}›çûÍeiÉ«!§'Rki7[r0l¾”ͽO!ù±ÏnšUæÄ®Í6qg»‰ æJ ¶n!%Å1ˆ±Äup>qì—»jª&õe +ðy³šiR’¾ ç7Þ¡¥V;¶éªfá*T_CÉW‰ ê:!\:½J3æX%Ÿ5U*•„’z€r½°Jµ Õti¢¡ª3+5,ÛýãjçS‘pá„·‹c1´ŒÔ€ûÃêh3~d rDUJ¡êÓåZ” M²½ÜÉæ¿| hs”ybVª×”lÄìÁß6_qZ.¤—Ötq.ìѺ7p…—ÉI´y¸{ŽñSDjž"…('>BP?WL|u¢:ë %^y¾$סš}H†Ë˜N û¤Ž\ÁëÀb¹'I²]Yi¨aËh”Åñt'@2¯Pð&0‰Õ$˜™+Œ$|Éxú"9;k-IÇ¢3R—8 ÍUrµE56$Ä4ƒ;-ô¹ÄÀ¨ãß̉yõb/käI0ÜAÄûT5TTÀÌþéÂMÙ'=¦èÛsÐÎ¥×·lÒVô@A»Tnè»õÆŠtblÉWx³&P(O\,'¶ü<ý!´Xœ¦¯ÚZH›‘ÜËac!;­îF¨Ø¬1ÐÖ‘Šsƒâ†œCõ^% ï²u>t¨Ÿ&ô ;QþíñùßÏÓeºøÃ[ÜÛ=Ýöó¤w¦¿6š7BUÙ³\ ¡¸Õ}wâ,ÖóÌÄÔ$õ‡DŠ_—F }žžéüiþ œÍÐÆEŽêг÷jôð]Kaù?ÓWÍêùbAußBë¸EÔ›¯4J²5ô7ø¿ŸW‡Ëó>v÷d×F?|úF7ÚɲJ e Ãf¾?>¿}yÜ™èSBƒ¥÷»Fç®ñ­Ü®á¡\D€Ò Aï™c“÷Öœ¬[.Ïq$¹ -…EH×}öE÷ôoöƒu_Žø%¤†è1 GÓVÇs°ÇM¿>ocÔNMÌ¥«üEó§µÃC.2õ³:fW€Ó+ E—÷ò=¨˜­u ð»Óv¿"‘,¥hPª¢–¼S2×ÚŠŸñžM€ô¢‰ëEj«ÄA-ÿ3džîÉò¥g‹ qÿ6b6aØm3çXøÏí¡®¬"CHpñ]iËqó¸]ínÄýÍ]£áÜrž½'{º*‘EWÏž‰ï÷ŒÕÄò:âv­þ5L¨æ+ñ[ ¤·Í¡ò‰þãÄÂà$ÏÑÓ®IÐ.O:~n?€yÐùµGÆÏ Ä<þÞNÏg‹÷e#—X@‡™ °¬þx»6¨fPáioÌQpi—סâ2¬{~f؇4ùèÙÇ{ #{ג޹G½†åÞä|QB_”ªeŸÕ¯ÿ<›R)tª/’L !$ph°1o.ϧC¦>»/(Œ¿¢ís%™jžkûlâH$Ãfï@N°>S:tM YÒâ¹¥ÌPôs%}Óýf÷¤ásc3SÞF‰øŽî®&ic¦Hr•[ ÀŒ¸F]3N›`„äU@s^…‹è#8‘Œ\9Î}… òý\Ûn×ÐÉw·ƒ¯ªÂñ’Õø°ù6Í~Õw?ˆŒºz“h¢îÓc¨­€fÀ±#aV€‡¤óÁ3½‰-”ôÅ+ÐDòM¦¼,ÌÊ,½0A‰–îxOq‰øIü¿Uæþ¿½ãS‰Œ…:üù<϶‡ä-šº‰„¦‚RJaÜ/ÅX#œÞ«ã2÷àŽp\"]ßü¹½|7Ö.Áõ¶³$+ÂÁ ò RÀzè=ßÀ¹É­¤]òc%ަ§Í © Ñ!(ÑÚÇ0ÿä…ŜӻyzÚ,À–ôoЭ¶ïM”Bx't¦;Ky2ömp´›F#r+ §öžVÇ›ã£(Þ&…­&>­ï›u0¢ÇÒQLN×1âBkq¼ÈñáH„¿7ìp¡od<ŒpÊL‰?‰ï9­í×FœN-³rÌøMþ–†Î@]‰¯ •Mg¿"ÃHé¯Ù‰FÕ3¿t¶YWEŠbÁ{mÈýø—l£’µæ’˜‡ÿwc¡2IBÿ®MÂ&‡ü¦nHF¥ç™•Œã‡;œtüÿü¾Yy~Ë€³þÿH{³õ&’¥]ø–j 6ÝÞÁŸe`íuÒʶ6²¤Öx]ý‘™ñfVɰ¾ÿ P¾•••CdÌáʲ–£ÆaÐÖ‚oWî‘g:ÃŽœµg<ÍvV]¹CåÖ·¢c ëŸ1âÿA¢œ(.TÕxýv“æ6KI4£¦ «Ú åZ«CÄ•ó¬Žû…~è4s7hex^FèÊ9*¼»úȦW±íù,ÑE c³y4A06š$¸ØÏ!…è Y? ì _ o]õMUTc‘2oC ÚÙfvÂwDæ!í³k§¹Å™uížaúô|°xx Ê›µÆ»7«pKh·°9*³í¤\ÄÓXþštŽ6 XsµÃá¬TÔÃrå“¿@VÒƒ/w±Yú°Ê4‘ ûèy uè0GaŠfŒ ¬ëž¤¹£äO¡ÉmAl!(gWÝïêTõ9~š3@ù;¦Î PI4MßÅÂM¨Å$Vڌ퇺OªP.÷˜šÀ>®ÊÜ(,”®>!Þ­~’0§So"àxBÛO_.:l’oÆøºœË —cèån ª†<Ó’B#†+ó µ›(ÕÆ„OT-BÓt l(y‘о•]f7ÄnÂJ7¦TÌ ÚïŸ9·ééWé Þ/ÂOˆ5Ã"s*íb$ -3#\LXò_e$À駈3)¾›•\v:\¿÷Á¢ÄÉB¢çˆ'Þz»`?OêÖÞ¡ôÍõÜBmzdë3 k~ÇC¢“ömJ1†—˜ë°»bißµîkï…üJ&›©)ëhÿš“Rº¨ Ýím˜bJÚ‘üó‰›låO÷´²„°)ÙF¬zHfÎ;úæ`í¢s*Gm bsÞgp†9oûŸ«Ç'®É®$Á{yaë]? ë´Ý‹˜&·õ°äm·üy©Þ…£axï¶k_˜ÒÚD´°E›ð>„™O& Á̽zìÁn¾KmÁ>5«œ¾û¡að²ÈmL+K‚eÔ>²ˆÑŽÌ@Ÿí’«étdörýEP&n­|& ¢åÀg„˜ "9-Øs.¶ŒGZ&†£ÅÖiÙñ#àPAÜx]à-4ÂØñkkÔÍòðô×ð2]ñ½ gXÍ\A‡SpÑ… šWⵓ‰ú¿ª§s‰ïEÄ_ìVÎw'¨”^€Š“Jç'!BÙç®÷¦o'{cíqZ0÷ &{4âbbëX± ÷j×Mа‘A!º²9G69èWRD sÄe¦EÖÝ%Ð΋‰‡"{Í6ɦš€Ý?6ߢcZvÑ.`©?¼;œ‡.oû&A!ãOX´¸XÆÝÉrl;S§/D¾Ÿ¯5kÞÞl/‚ ß ¥jJÔí®—‡dºk;¨yØÑfðåÃ8¸bq“ÜüªFÎ`R¨ÍS*8#|6 IN›ˆW?ÿÏË´ÁŒ&T¢;1ó\on¯næ›Õƒ¯öÊ™²ß½¯ì‘¡aï…xG9W#mˆ¬@£]Šä†u!|Œ?¯†2¨™çÚq0¥3”Ùã!V]‹¸•ì†Û¥Ía%˜Vƒ‰og3‘pùÆŽ‹éjX7—'8ççjúHƒ§¨å1Ñ'OõÅÊoÕXCCä·H1¤d£Ì­ƒ˜&ê‹w æÔzy;-]ÄL·xâ#æ¹O¶mÝáEÃê ®ÙŸ„ë6²KT"‚ª­ã¾8÷Oú©´Œp®9ô@ŒND€J|‡³ ‰e”€´0(ãlµùç´:<…k4š b`!±×As­N2|5MEûŸü¼ŽHL8×v1Ø»©´8 ÎçW<:ù…±S!§ñf–?× çÞ:ÒèZ˜%&"ðÊ'?¿ÝÓLÐ9Z©’‘g¤‡eâ,£wgD:ñ qÍæL¬þ3øØçt+pxg1ÿGótjöÿ×£Ž÷;6šÿËc*Mæ3ј¨’yv”«,‹ì h6Î&¾7 ~­ÒþðêëSë-E‰÷!"ÃN U4Ó|%¤ :H–PÉú%#®C³——¼·€z+EЖiÀ8«ÐGãÿªmyŽG‚¸8ÉÁ©8BNêl»WÝÏxÃ6ìtçmÿaøñn¾Ú;KÛIßÝNbÅ^Žh}pÏ$Q;[?ldÁXv‚ëvµÓG6ÿÚ’) ܧåÝ%ÀÊΙa^a7ždrOšý…WÒdÁ\ÐZ3'aWg`º®íÊiXñšR¼ý öi“t”¡oÞîӿɭÉ2øH\oÓŽ['˜{É–4f<ºõ%š2/Qýe(áÄoŸ‘Ňoج¼­Yo ô7ÕX1ÈZà­D4á/a—3|´›X¯G0d±Û|_í·.ÚľLÍ0ÌmßçÝö@SýÇúe÷úëó1¡@}ãåjj‚qáô3 é-v«y4LcÓc|3 Àhü;v[’ TL…¯fgŽ7Ãܧأö¼IÛÏ ª+GÈ«çÝñÅ¡ô]„xDÒEö8n\Ò™w®gp¿uðCŽæ-Z.ÂàËòwO`†ÒÔ©îò²ë‚€È.€W_Pâ º†·Ûí~é.f¿C¿¦˜ncé»*Ln¾wZøìãú›ÞþnþÃñ6®òßçRGSb͢°d—HH:Öòyáémcñ#ˆÍYž‡þ=˜@ÆË¬ª€BN’ãNÓl¿ì}p6,¾ÅC$? ¨Ó8K;î?ôý0yù­ÍÂYË,³lÚÔdï7s ?ÞÚÿˆÉÝ-¼×mŠ€„üð,ÒÈ,=¡nXåy:ñš·ërø~½}{ܯ%_¥!ˆ¸˜NM¦‚[˜.Ž’l0×QËœa0ŸRfÁ¯Æ0,ÈxDU·]=z™|ôR¦oJÆÌ÷°ðbÄ@ÜÊ|]KòRÉwËš5¸cøpɪ,•ÆÒ¼8\7gô® – ªe2k–Ã3»)|hSâÅøƒ¯úw[FËåEžÓÀ_Ü-ÞñU/霙Oó¾PV¯¿ýâæòæà|GZ«¡pçnöa9„»•KáÞ¡ÖÙimuà»î†¯ó5ç³ØÞ`: òúçùâ««Ñ#¦&ôëÜi‰ìŠ˜É„3‡ `|¾›/‡‹ÍêÙ(uÓçM— ˆÃyÜ»8š%'UÞîãGºÚŽÊzx³"nY3™ƒþÝöøf¾÷µ±rðà–\[÷Ôq}ñ•ÖŽNœ8–Þ ìöû}˜]ªm·A¨›^}§c-–SößGÈr).ì®òc õ(Ú âœF‰§(ÐÌãÄŒÞX¬ž6·Ï÷[÷,fF?d²P‹ÐúªÅàßh¾ÃÜØÆsþ¢¯*ÌJ&€;¨ ì¯Ò$‹¦!F~9ûA‡#I8ŸjpflÁQ’ØÇû‘Ó)9Yƒÿ!Rn’±+NÄ€4©¤.,V±;Wìâ°X­þ㪂„*qeŽ]:˜ï4‚…½ÐEÕDŸƒ`„5V›a{ÖÈÊ :JI2Ç…›®Šp›—1Ž…ïà (8:’àUƒ_ã·q«z.E´÷.îápõÏÉ)HšÌ ¡qóá0hÅÎÊ‹RÃ:ö[—Œ–)èÚ¨Áûê@!ÐΈ|hw¾AW`iTòÊ’ËZCL9·ò\S‰Q‚M&[ˆY¯G1‚Ò™HÀí.—¤K¾ü¢µ‰1‹ v^âlÒ¯Ã$R¨³Šc õæôð ¥ höëâ àý¿?ÜçŠ2>'E}˜É>yËjqvn@Ö4›nœÙ3|!×IðÙ÷žX9¶( Þ’ ;¤­ï}/˪©£e%nlÎÞX‡§£%5…l×R™ÏKt>Þ»AÓaY6š­–dºäjȈݽ¼?­”žEôÑ7]l–'>\ì÷óçÑ~ؽȾû@·Ð@âë~®î¨’‚¹»,$JïÛxv/3 k+ò²¬²´er0eUŒ¾˜N™åÐׯtVš¬Å;_Ä©‹ÅZ¯ý>µÁ_ômÞ# s\KŽ¢n†Ð»¸oú §H·Ç[oXlk˰t4K;™t+¦{µkGƒC=æ¯ÈÓ1>ØiI”8Y×E׃{jjC–£¯‹Pl˜FBOõxø )T÷‹ªÂøÔ?¬ÃË‹jšò ™Ô·§5ß‚|Qßoß¿½¾âi)Yæ@ãím8w¤£¢D‚q:rLd&Võ¼DÈWÌ2ãÇ×KB>ÆèK ñôŒ}ZxiŠ›$e2"šÇSi»œžM… Ø„ÃÊó׺;30µ»p*lDùݳÕ$¦¶£6Z·b&äË´÷«µ«?ð—‹^-ÂÑuõRš_c/¾¯Å# ÷ƒ SR‘ć팫)˧¯sØ¥†¼Øò³²ªÒñ RÞàÉ…÷+c‚¬¤œû¯ƒ[x]ÒxœÐV3«‹³ 3 锸U×GÄQ!J+º˜£ý®J«Àµ2õ®3äpš?$nò™ôËípø ú‚ã|µùÂnöó½³2Ÿ„[sûc³  6‰X0‰f7F¡÷|™á{O»5ËÕc`F;ø/§Ðç§ëñrºâ¼)¡`aÄ2–¶J€_†ù·3`bÒÁºÚ¬ÙÕž¤&త3'Y¤„å¹ÚlOOŽŽ:¾èÝVˆª <ãæNìðòúÁ¹–Åõhy¦'0ë-?ù9œž¾®o§^È÷«oÃ…Ø42Wàè^ˆãí¶§£;¤!ÍtYdÙõ˜ H˜“ù\í‘å°´¤®|Çe1Ù4`7\‡¤®~*çD²MU%ij²®Âµt-VRÑÌZ¾q,å·æ4É ãÛnª‡ð¶ÔG¢Æ6 ý"м-ÆP/èë#ÒkÙ78Êi¨ôZZ•'†:go0øªÔò÷'/«b¿ÙaŒºdïùب̤Ð|3\-ª°"7„y·Z¯A°«ó¨mÃZ¨7ž7.#±7´Þ¿ì„äÕ(4:ˆ¸´((ðEÍ­ÁYrM7Ý$+hXß¼=év¢®;hÃæñø¤bn“Áàw«ýáH}ye 뫪>þ$výcuâÏ-sKKî‘A9I°+ÇÕÔÙË2 {ä–ïÐô֛ͨ@iۉƧÂ-ÂH«ÝXÑ%Ô$³~³«Ó“ég?ù‹µ£»DNÓïm*ä=~ ÌË6ýÜ `ЀàËØÀ?ä)Ü·×N¡KyéÙÐσ¸¼´›±Ñ¹˜j¼Ðm$Z¦ ¥V@Éó2ÒYq»’#¡v*$fÑäжâ0Õ£6±ýns¿}÷ÓÙ ÜB4Ñw:F)X ÉŠ : ³æ6…µçŠñ¸3°Ýk•­~#xŒA›êÅ  ø ð"-GÚ¢Ò¡šuiŸ—%~ A>rÅ\Ц6yüöT /›ø“rZ2ŒH¢Êë¢Äsô“æzsÝÀvùãÓõ¥‹ ½·$ÕÀæu·(Ý…Ýr{,}N˜¦ËqCp¤²èÑúÕåˆ:qÌ–l+/š<Ÿõ-N”<ª ªÛ}9_¬'Åé"‹ncKWÇæô[Ýt 9'ÐiƒîL”Ú¦ÂGá*Ñb¬¸Ôû󾃫OÁ E\ƒ¥Jâ@®›Þò Rˆ5‡®Šzrµç¦C˜éVMÆH[w“ÎîOŽ^§Ì‹>¾ÆÝM¾p@m¼´LöFìfá:SXè…¤ý:é‡ãëí×ùÚç"é2ëãÅùÀf³åiqÔ›—#Ëâd·ó“ÓG¯ÔÞÔÌ‹ÖÄS=;· 9×rÞLbô%GŸ§$¡ŒR’½§y¸^¾yñžSð¨;ËJÆ_ÙÁžçYË?E†‡õzI´×)q´²¸VUíD:v—:î•Á¦KL3švA$ç`Á6Žô ¡4ù~­K¹Ò€4vHÊ’ $hÞo5a]}>!yu>EÛd‰Ç@óh e1ÕB<¾Ïºå" “ÀXŒäÛ@Ñ5ÎéÂóâ5; ÈT·uVUS]ªŒÑrñú©II™0HQ?­Áig.8HþVï¸*â[΢9‹œöÏå+xyCSDºY}"½;˜»úÚYYèš=mbÛ{^›ßv@Xל¤m¤›cSMšÕÛ2êÌ]÷[o¢'ΪŠ>@ÛNry·<¢1m|}™ã°—ê¶^@ÔÀg’™ÒAJÒzp‰ Âì0’ëb ʯEŸÐÙPFÙ2ËŠ8^®è¼´ìr!Œ;aj¼ƒ¶çm¾e„;oóEUÇõî{5¡<áRÙk «ŸZƒº@Ë$Pt!½…yL½"¦«âŸQ €7 ãËŸÊ‹»¾I>dB¥ÓäÑÊï¾7s×Vñ4g§5“@ºt1š3S×ÇŸÚLN]•¡h1 ãË‹ü@_–5Õk@¯ Cuëõ ¢Ó:«‚êò ”§Ì šù¯RýšŽ²—©x! ^lÀpYòõåÇYwI’*Ê+<„IAÍÒØÂût¼\®”%ÅfÌ3#ãz-f“¸ÆYn!02ãº8‹/GíR«jθ²­¢ïp!$`£Ë:sÖÈ—±…¨´ ÅÁ³ÆÏ@Ý¡Qôºˆ^ƒ€ý͹ôàœ§•´—z‰çMŸÁlfZ€hÚhÿ*t%itkíCÓÅ!½BxP¸Ø—ѹF°ì=¾ž2ƒfu‡‚‡F%™<ÏQËI\ß„ƒR—Å£I0rómƒ<€DY³ðy½‰Ì†$‡¢]pÓ|Ý+eYüê™è¨ŸE+›ÃŽŒýoÂõy[W£‘¸œ¼ÉûtÐNø¿™KºËWµ¦ÃkRŸUÎÈghêHŸÉ‚´Y“å\mV£Fçfþm˜ö¾™ÃdìZ‹²¤a7@<9.^O‡KïFb©%¹/о‚cÀÕǃÐá‚!¹TÓ\m´yYín:ŵP+nfË›—a"Šýþúöv¾WËz›5¨ý½!z²zó®²àaPVM$ QªØbW„–‰5 Sì<2Ñch•¸Êõ]š¢ŒÈ6ήŸKË·ŸÌƒ2ëì5Ї­–¡èz¼)>œž¿ûè~’íyðš´ìwÀAhpbüãò\û¨©FS{}$­$çw{›zM×AWK—‡< Ë]¥m€’'<‘B9¶‚ƒAÐh³p;. ­‚Ö[}£p*¬ Z{W#ËíË"‹6Üíâ~ËaA¡’Wuš÷ÛÕfLPB FêóêNû‘E µw¢c5j›Ú»²„A¹à‰ :_æ\†w ;ĸŠë9Á/y-^6ógÚat“ý{»Iƒ2*V^$OÐ>ü>ò™ÓÜ£d.a ¾ FÈË…¹ú Ý@ãþ^B•5ε4ÂÄ\ÞÚ&AÝl—§uú=mÛ7éH#O Ï«tž¦'¨èû·ùÝ|uÐÕƒî™è®v€@ ›ºE‘šÈírû¬ÖªHš4ˆÖŽDDŽ9VäOºoÒ­Ôÿ1JB«Â>×z퉓¬Š÷¯Æ™p³&xLj‡"«¢8¢d¬ñ.-ÛR@ÕZMB²/è±Ö¢Œn]γáì&ËëÍLÓ³”È–ù æVT÷ÑóÖ >b-ª²3éTäÊ…ÒŸ¾ ¦?¡òè]œ4>rŠÇcswÚ|Ü,†7´7Qp'ó©qIˆ…ñ¸¾JrVþ«v3ñ¾èUôíWKÌÈv³<Ð^[ læºß*\w@Ã:ƒ%º¾b›ß>¯öÇÓ| f²Œ“ÎâÆP‘4©a:žµÊ1Šå´Ð 'y„=Jjhå Tf&úuÎ\boPf#}ÛL4ÝQ?kQU•ün1ÑÔC@ŽNù‘IšÂhig¿ì3ž6^ÌófD®á‡Wc_½JÊ&"½33èy³Ÿ/·žuQÜÒì5ƒ;#ã=;{Í€U¸ZÆÑÎÚ§\ÇÑÎ:¾òa8Ç«ååö9—Ede¦V¦xñqÍô«Qˆ.“i•EýÿÇÚIŒt•³£&üpB#Ë_ç>+YúO‚ú<s–n¸;ìåP“SÛºî¢þ”êǰœ=ngÇØ¼ýúv~T—A¬²)À­+ ´7´rR[‰5ɳèó­Ý÷Ÿ—xÁÆUF5Y—M">ÈKhŸÕ4Àõ@û5:c±ºÄ³ŸJWt¿GÔ:Ú6¢9Š »vs|Ð9‰)H„³9§˜/ ‰êáóE„ËlðÙÆÒMÛ†²xò«›“È9ÙÖ·i#*Œ€AÛM|¯bÑ”¨žŠ~#Êê0ï™Ø%‹'˜x‚Ô}qâg5k1˜0}ßb´ÝøîcÑ"dÑ:}½8Ÿ$¿ËbªãJcÝ$J=+s«“"€ã~ƯéP$ULÄú1kˆ_Ôb’kam²oNyNopÈ]mùÕ°^Œ'È‘uίÖóÝaXZ}–Ð×S5u G"ǨFëä°ó@TŠ0z)-œ‚éôUJç9ú*r%Š !If ®{„Rs…¡—v .½š8)kdÏ4Á´Uvfð¾8%aËŽ0’‹I‚Å£˜¼åÓio¨ì¾§ëV2r]yäÛ= muxòÄw̪1R¹·C­Ùë3Ô0u"Ÿ®7G]¦,ž°OìSùJ6·‘Mhf­–¶£Þ;´Óy’Þ \ÒÐ|¿åÑI’‰·+"ÞKÌdÎñ¯ÉB÷-2 Ÿîßuq´W¿ÚÝY!6¾è¢OˆãšcÇÀ–Oy«ú"ôö£‹†‹°ž{Ââs‰Q*ðÂO€QŸYY¢Ä‚«}Ä“:å(¸PÐG~Š\Æ(UVr.pTd ìƒoï&^Çk¢KQ ¿$çkÒ' M†Ÿ6?ô@¥i¢‘rƒ“š:ºò?íÆ‘"®t4n³ÝdœH‰É5&QɆ`îØÉ'¦¶EÑEÂËäsñMï™Ò•¯{´j'Ðxý¹¸SÙœÃúÅ-:fƵöƒSà‘à¶HˆÌ¹£—ªØâšlpî\S0LK6 î‰3N–·p˜)V8çÞÄM¡@4nT„kÖo—À².Ñ@¯¼mÙºA·ì/óõ7Iò4_¹P©ˆßeO¬õËùvÇ‚yvùc¦ÉÐòó/U³ˆ[1ЍÿšÍ¿ûŸ¸þ{Øo!Ø Õ(Ü„!8N†¦Ø…èÂ^á&Kµy´À9Ný3ð¯ÍöÇFÝÅ«¢Eÿ©]’x#KÞA›­:è9©—s9pŠ¿…Óz†0N:QZ“PZÇû¼–.—î¸Ýû„×u?õ¸÷®µYkÊ($ …=séi.W{­ ¼Ùîb3_¿ˆlün¾ZKlIª‘[çNrmÜØOß\O¯{aÖ/Œ¢#RL o²CGQй +„v™œ]–³[»Ô+’‚Ô›Ù >®Œ뤡(JÉNˆåðü_jïÑ™e÷v;_ ØÞ%t l]FûÄ'uBZ%‘Tóøf¿ ÓöÑÐ#3¨H¶¶£jÇײ‘m)4¯ââ¸b)Ftu”¬Äg L ¸ÄïõU6ÆNqxH6¥pŽ~^Ùã¶ÍÒìŒjFz·Ý31r¯-"®Ù=î›uƒšHlõzgÖn£úÉaBmW-Â"C—`F΢eð:;µ,`D"g¯€,ùeÖd¯õv=w8ú€ªÏ‹W€ÿê‘g«ô;Í£M—‘—wšÐqŒ«Ê¾öŽæ Øgƒ l¯2CËCvëUH¨ZðFOoï¶Ê#õ×n2¦Ÿ pÞLă]Ì9uQ`ïî’ÕôÏ«c8£âÒ£ Å„Œl£­"­¬3H69‘ÂlÜÍälGgÞG8KN§Œßî#ËbÙE:–ÄDkvK-j¤ËÕÙ(-l@ìVäZ· ÷ýb—sÌÅÏC–ú|%ô‡{:¸K¬)"MùNÍ  oŠ‚´‹Èƒk ¢´³#^G!J“|,$ÏR$Fy·†ÏnàJ·Ð=ÒŸ¿| ’ä#æŠîŸ&Ê6±K,`‘ÎÒeêãS!aѽì"‚S„:vJ™Çk%ÁoﬓÈÁ`á®øÚ,8ÿG ÄÝnÅ7 U=Ýå-õ˜b#r}}¸x¿Z 4Jöëc’sò1¡} €$’rZÏ÷ ]¸†’Ï(b±ÎmtBNò¿Þ¸kþ j+Ú¼¸·FnÛìf"Êå¶ŽbŠwSžÔYEØfÆýiICŽZФTþ y¡ÓÍþJ­ºBÇD—¹Z°ý4¼ÓÂRJÒ"òÂp#~øaõè×£Ë"¥¼C iôx.IãF›Ç(5›œzhXùŽEÌ£ÀþåRw€¸¥=sÕb³¬Á<žxœà°Ø#âÝ– ät½%ŽŽ qÂN% ®Ôu?R†*T® 唄XÄ_Îh—Þ7õ8ŠlÉ»àÿz±v5g¸0Rˆ Îk(ˆ¡9žë) ½yñ”¶-¢4›ý0œˆ•XG篬Ûñhm«Á d‘'‚;gj.]b!´÷"ƒ@„gþ„H’+ñ«}G{K±NÒJÊ’x¥a“E™]¢'¦O Ç”åÍëO]L†Á)™Ñ¤a…p….é5¸;A:¦vÔgLébÈuz=›ç#›y)'–=}„¿0<Òæ‘ZõW¼y‘pjÝMþß<vg:eN|Pä## —UÑ€÷ºý´ÒÕžOΑCÙ¦³.{w¿õËÊ Ú©÷{ë}Ðõ& c'iÞoœÙ³}–¹ üÁÃ&A°dö‘'”â$jû%>ë Ú@˜ÜømÖÞÎ÷Ì;Eà"J¢`¿FJCüºj£±ºKqµHJnÕXï#¦g«ãtü£^=)BÂ{ÐC2q¼ï†§Y=³b‘íkò ]³2Ÿ?¦«V4cB:#\¡“Oä{zL½æb³´ƒêÙMºê(Ôx5ý£Fº%é_ä÷°ó¹\B¨ÔK2Îà‡á‡·5™æ¼‰hï¦ô¦×K¯9u™§Ð¹ÞÍIdq qXjð#WsÉ7Ê!Å=®ÃÏA»CÔRþ¦³Š(Ýn"â é£pþÿZþÐB¿4¢‚~Ÿ‚¿/ñJ¨¹õˆéÍÉh³)4ûA(émZL§¶snGNdMÎ\Q4á»Ýo¿:Õ¥„´Ž]^´yÄrû²tï®>Ò\áš$ëÈ£sÙ8DpU¿û'ÞÁÎ/Ùú“@'Ì a¿°â¡ÀOºs*ر²¼g{ï«°÷ó©€ÅàÈT»Ù'Ö˜¼‹<êvAÁGû-ýU $Ñý¤&éõÔ­ÖBC²c)^Õ >/c€8qká/õï þ%¦WõSΫÃx$À°Üädu=ˆÈ¿/ï¨sæcE\a`Ü¥³a¾_­œÓx†ecJGúÊ{Vã¾ì¢Ø¸]ìÄ(õKÀ0ÒÈÇX›%¢:Q\u 4Õ›ï7/¢ÜÕ)\ŠºšCetÑMb½#’èF`Ý#ïÍ‹1:e‰³ãj4꬙x€ö[©Gƒ2뢩;óR¼“¼MÁPäÛßsÝùEÌ~‰¿Xšê=Úb´ŠLb‘zEÚ?îfë­fFŒ”“>X¦€c{î#)Ÿ“XE>¬E¬(ºÓ° GÞñØxj8¶zãÒoàjñö!)Q=ìv€b|cF„ÔP GÒCdÏôÀÙåLJ‡ÃpdJ ®ì> ]-Ídž¾ý t\–Z›F“¸G.&wÏ™Žø¨ãk§úœyå]Ùô?sm=ç¡™N"¹ò3‡%sÑÒ)éBÔNë RO/Nã»cÂÕ«¯’ö/,ãÎõpæ1™—2¢‰òëª+F¸ãO—TÝ*xFOè~ 3Q¤UI£r e¤o”z çøŸÄ‘ÔºåSH¶eNq¬uÖ²ŸSEB4}‰\Õω¨ì3È)O€ ù9á¡9œ}zswñöþۿï®þ¸žÝ_ÝÍDöèCHíì«;˜.þ+Ø9j((Nf_w“ˆ¯&‹pÄo“PòA]²-m%5»âòîΛAÁQp¶üên7GSó2ÄVøß}Ò½>˜Å©Åe¶»F­Ìµµæ|žõ:+ã@À…˜eñåýüQ…à:›À€~*`9N °¡+»u´™Ýë§zÊK[Pë(zò-Em¾Éú3‹Þ^±Á¾°Ï©Œ®5‘Þ0.Ë©ÞúRÜ¢±jSqûÏKW•yP‹ DL>”½hòªŽÚãAZò5ßJ3øöiµ–XâÆ|‹¤=è<óƬÒôÁ¹{Ù“ÁåFšõüÌ5w‚÷Amü}þt÷tAÞÐô‡ÎOi©„`.ÌØ&ðͨ-b€`œ¨Ä}‹ô˜·â"^°’O@’h"ƒ Û$Iµ¯à¸Õ6GBI>>oˆåD„~›õ0Ü~ùåãÝ¥o®û¶›ÝJ'ByÁ9bØÿĽà^vE)£ÖNŸr“JÉ9:€TÐswà û~E2V1[ûN¾PebÞZ Â]èŒü#nͫա+G¹^\¨>ä–¬²lc†òEä0#êg*é 9ÏMß$mW?­JО#A.=ꩆ>‰Z3p# ˜¸=p*®]ÊÚ†¸yÜë´·Ñ\¨´Å3vùlD”º3@Î¥ÍzîozŸXÛ…{Á\žC²\p–ÍÌOœ,ú.PZ¥¢¾†‡§Ëm„×Á}þ¢‡«‰œܳ=V]7F'7ò¦w^Z^sÒF›7…h aÖ¹×@Ùv¨8ÎòB3WGƒâlØñ¾3•£¶GLyn鎵™6^D¼‰dTѲ+õŽê÷&¿$8ÏØiùp¯kYNt A ^ÕHÕvþ~ÐU]ˆŽ2ù-ÒÃj%&™~ï!uY5ÉÙS›ýFÛn\i€à9Z™É.XØ©é³HèžìL¯!ya¤qÒÈí•[„™,må"™'ù¬Ô´JéüÀnÇyìÒ=£ŒÈµ¶馡¶?–V/Mš¾,ž>Ÿ¤/Ù D݇&è Ôe0]£¨¨²ïqî™E½à“¿ã ¦{9&‡8s_GÄhë@áÍzËiž¶ó˜ühpŸK¡¸ò‹ôòæ…œ^[}]bEV›éc‘—UDGD­ï&âÜpP(L`oiÅ—s²½{sÓóyžnaÝÓÈÀ8@´{dv>ÇÁÄz7ïµãªëïlsŽåz{0Eíq[píjÙÔN´ý‹„qµÌ€Ò“OÎ €Ï~Ú<ÏwZåDº éˆøˆ6‘üæÉ¨»(>Ž®›x7ÐJÉŠùˆ+ö¢`´ŽHRî.¼ÛBu˜R¼Fͽ׶ÙT«°ª^3ÕWáŠE<ús%ÞéÅKfyŒÇÞ>±¶Dk#¯çûg1k™Æq‘E!í‘$ÿà‚öâתRG$oK$Ùˆ”b@\rÞÀ"›n±³é,i¦G|Ùî×Ól™ÀÙàO… ã~ä ’¬b‰÷"X=MG»oÜ~ù~µùÝ9ÌîŒ×ÂeDš/à)»}å)Õ[cß4ÃMò=Š"®Ì-mÅ.úñÛ-S,­td„ ƒ©Ãœ £Îf·ÏÍ‹c¿s¦>þ"PÔ°]>zÂàbE±²S˜¸K" f•‹á÷R º&lº„õ« !«~cb.Ü‚ò.g½ÓWVr<Ê•U•åNš j‰ ÉÜz£þ¾íl]W®h|¥‡‹e ˆZÇÙ¨8šŽ %r“·Íèÿlå\WV6Ñ0!x¶-›qÛôðsŽ+ÌRôÉöMX7š”&´€óõåéȦŠ#Ã6!PÎ $mãèV;5Ú—ÁvJ‡Ë*oŒ/ ú‹ˆ%{ºØîŸ„½ãÔ™›_£¾Køú— À­D’ PtÐfbŸ 8xq:nÕ«ýÍ‹m ),fâìê"œ1ârجˆÕ\=>I’-.V•Bÿç´=Îa!@›ÕwÑ}ë›à>Bli S¦Õ{™bù«,Ø}´: Ñà±ø_É«ð¡-¢7¦Qî®í¹ûsõ|zvSê€.PsáÒX¥Êd8=¤ªƒ#„œŸ¬¸#ÞfC°$Ç ûa³" Pry9›–›'è3Ö¼|5º v×é_}fLYØμ=ôޝGèR±µWáSd¬FêGOKÕ¢ô2¶º3³à¬fCׯ^úá‰mæÒÔ¾Ö~†(íü¨íB‡e ܧñZò YAýl»‰Îât|"J¡»öÚ\69»ñ)÷`Ws6ݰ?+e¤Ê§òøåþÖ“ëS¶—Yi:¦B ð%ˆ»g\ Õ åtFáìNrôå°9"Ö{<öÁ9hi 'h æÎnÙ-“L‹»p ÐÛyï»oêØbïysŽ­g¸é5‡ y™ÎZš3î¡R{xò­³ÿî¥cf¼ìƒeža»í>°RN>rö¬îÚâŸ]êû­‰E‘{÷ìíŸh¹îÒÌ'31­¡hÁ1¸4¶¥ …v»Ó†Ô˜ÑN&àüùƒø&5ue$xÆàÉ£Á2\½wúdùï£þ^?õ$vt*˜á4#×y¨˜"«¾+lÖ8=@y‹Ûš êÛ¢qÖæÞt¥FqåSÌ’6¤­Ù~+Äò¦iZÛ]´C”,Ûyn-*~6¸ŸSâzrœ#Gü‰úðp±|^©–µ6D[9mŠã eTÊÜöƒ"4©Âò¦kâר€å®XûVñO›`ˆòxÚO›ýÈßù\Wœ"DYï%qÓ>'kG»IH°¶={‘ú)j3bÉòVØæ¢F&I1Sty7Ùj>­Ü07/ÿßé ™’µøx2øæX;Én,8–¥xŸ²‡_—¨°¸f˜Ícx"tûé0$OD€?OÜ?­Ž ¾yñ0y°nÁ\<ñ`:²¶¥&Ãc…ë † Ç•~_iå(vÜj¢'Ö,¼>¨’àzsÜÆô™³˜W‘>rVÝQåñðYp¿}˜Ïžæ$®™ý†î¯2‹†þŠlÛ€‰Q±Gw4‰,'à¤Îm²¸>Áåê°˜ïe³©þ4ùªëÍb»çJìô¸wymBrÖFW]Œ^é³.ÙÅ‚WF¸f„õ‰òœ(Zߤ‰hæÕ…V‚øŽ¾IG*kºèpÑc7f½LPo÷óÃÓÇ Ç+´‰wІºEü@ôè /Yúu eö÷<Ò²Ï&‘ÁN™¢ŒGJ‚×ái¾^§@ˆ»àkrëµÛ.z÷Y‡·c›AžCŠ®eš„Ž]ÝóÓ.IPÈ“ûš8PröÙ¸ÿ_qû¬Þ‹&‡ƒƒx ÷4˜."Çße™4·ðƒ!ºŽq¶ýèØf¸IùÇÝ® Îì´ ¢Ò&¦)"‚ÞRÄš!G±õ`Õ¸D‡Ãðüu«lоìjœc7ôI½\Krny¿w%~»èâf­®BÉòzÿóøáŒ¦]Ò ¨˜x¤GÞá4þ@:éN©tç5þîò¤…ÓX™D¥¾IÁ(P‹°ó&ÓÔQ­¼lЈâ„Þº¾ º«àð!Wò9Û¼Ÿ¹´LzÝÆ_ Ò‰(á$‰ƒjØ ˜º©Xe´qR6,h劂E8â¬æ«Í;5E~¾ÏbGk_é-ê_ÎàèJÅ.áÂâ¹$wÎP&ª§[o›¨ýýüëàU9ÎÒÙEÍzœJ!Ò2‘G­à Üw;¦ªq3œWnã©XÄ»ž/5ÕcÅYe³ñ™{õ#ÏÛ¾nÓ÷ƒHPá9¼…ÆÎtsU%"] ßĉ›m[Xà^Z˜Cw#µVìÑT±-µ<Ì÷wØËŽ6šFixFØÄéèŸãKR®•¼'ÖSsÊ!¼w¨¨‡^:wÆ¿;šüz±?Qw3A7‘j°×¯ôqIL®º‹+A{•Ó‡prb/`t^¹=ÚÑ’@× Óî®—¦Q¾8„AsùvHŒr\:ÅxœålÝ¥îáãƒl§¥û ÉnXáâÉĜԷž;d°šË±—P«>âL×Îësªå9ØmÌ+ÊÍŒÓ^dª—o‹Waªä@õù™DW½à?Ñ=ÐG³­…ÊÓÁc7ÁZIJó¹È&°ª—_M¼„kdk:cÿœ¤þ[VõÑ>88_o·ƒÞ¼X·Ò-â„¶@rÞ´5ÎÝa¶úºv~8}!'ÏÈeG«ÎÖÜüNœ!K-vŽiæ›%[&ä'ý¸Yë­…òù.Üh¡³àÄ §‹1p¬ý(’ &º¼ß²X³xîæzgZí:‡cD$»Òy¯a‚æ›í’„D¹TEwí’—û}ƒ<°d/H4ÄÉc6‚H⫪¯CLî |!O¨uw#ESu¸m\?³Lê;àˆ°sXæ4Ò` w;Öÿ›¯]Õ ™O£í‰ ÷^(× ˆ“;+×b˜+²öÙÛÒEye€{d¡C3°ž ö5JàÀ’ž¼³ƒjØs„í]4QRÇœ(+‚+Ócú¼ËEêëÅÉÃà^½{ÖÐY»ŸÙ½0Äšö–‡hímï!NGýÌùo`î˜ÐÙÛ«ºÔ¸„ezIw€,CYFMÄëÎ7KÉ+I.´ P¶Nã|:FØSe#ãû —_ã›@z‹,F,“öÇÆpä# º:H¾Îùqît-òÍM4Ó6Å¡ ¦²IIºú6"ŽÞwϺw ‹›EH¯KÍ•ŽžH˜ á¥$ù)òTaŸ=°tí¤~áßÖ]W’ÃyÒÙ·íd“Ó$ãÑ[&5ؼ9 $ìµ["ðæh-×c\æ„4P”=R½mÆ»¢Gm*£§T¢!Aã‰Ï°õÑ•äd{‘cÆfº€ÜHuW\nì*CŒÜ#Ÿçû“Šñg°[¥½2éýva>LP”‡·«ŸN™ÏÕ²Ìy8~ž/¾ÊϹYrW>è&¤¤Snmuø¦i‰løÓÃòËj³¸Ðˆä{ÚŠ©Þó×ÕãÉzsB´˜—àè¯þàʃÛÃè•ç .‰T0[g¹1Û+ÇÄó[$ÑÄ(¯}QE}^Ò$-Km0†¡W«ÑW°ûl5‰ÑhûÌÌh"þ†> ‘¸önµþ1ß[\Ci©¬`Tœ‚澊¦A^ÃKÃññ@ì×t#˜Î™u¹±-²2ÖšÓ/2!xu} }r{ûÄŽ5N´A6‹§ýv³=®·‹£&Q+Ma¼R¢ûj¹Ö`RàJŒØñPÒEírØÆ¾Š*½üù+ßàÌÙêøÌß–X÷{_¯‰½7ýïÏ>¬—u¯Æ >;M'Y“À¢ž ëtq½õÌÊ}D ­¸8aö,±\‹ýËN OµfÖæ« 4w¦L¤fjRµ•ó¯- jUZ}E«ªh ‘Úþ ùõu„Ý[+è–/æ ¹¦ÛÀXg—âú‘ÓP8>>Ym3ruü!m¨fmrX;†ÑååårÏj·ØmŸIUÛýþdU’3PO#,ôbŽÙØûd3ΜGžßí0!IÕ•­á»M/?fÎ]Ô¤!ËôHmº9ú=ªÚÉ™šìú¦V’Ø¢÷e Lžv‰.wÏvþçG«˜Cì”%ž)'rˆ^]·unë9ö€kk xÏ×Û»áŸÓp8Bñ_¶ š"ýÙÜkÉ»Ù6Æ"<ÿÅ3-ºjaF”°‹ž›aa$c,O†£› Þó—.œ²K´rqÝwé;à ÎöticƒîNœ=\âï2Ð’Æ(|-Âøðn8m}S $(äÔT ZT+ZÕ–¹ˆ!êp¡+á3­•…i¤èøv¾x’Kz%‹çëòh\”8}\PÆCán+5“´hRnå¼A§gZúÛ-ñHæÇŒV¡pw˜Pä›|âþè;}³7;:rQ@¬K@$›;Ï£q †þ/L¦›`ùCˆ2ô<u9 çŒÔ;‡ªr ø0üÐv¢¸@®}»Ýdxjæ4“ì&sàW¨ól#œÑéÛY}cÝ\÷Eƒ½0èÓïËšsþÑÎþyvåœHüæÏbal£=KÌS+Àó8ÃŒæ]$·#}yUà"ÊIt}…Ó¤0lÎò Ô[ñäÐìbq}ÁKÖ¯•]uÂÉé¶Ê7Õ¼#Š)¬½1‡\7ä-4-ÇŸØÁh˜s•NÇUC&|„YÙþr›#Ž0'Ç[À.‹ÀyŠ Þ-!Åψ.:ÜárØ{Õ‰&¯ÎÚè.‚4 yCÔfÐà5ý׳|–cÅ$ÀÄÓÒÅËÊvn¸ðÊ®€C¢w’Üy ÞßÖì+L2¯a[’šý%ÌÞ³ 6Ä·p…ÞR®YÊÎaXÚ³cJ¸RÌwŸÉbÛ¸qöt:ê%’“ Gûf¾ó½‰0‹òó(ëÄ‹CÊ3z.ÐÎ!?zE‡^{䦸ISÂPÏÈ¥q‹Û3ú\ü6èÅ®§æHQZÝ' 8JkŒºzÞ_TXi£’+Ûî%À7YÛKñ’«,`dÌíã“é¥ ÜÇòú…îÚ‰‹B“l×6À(6ý†ª?¹g O¦S‹5g²Ä¾=þ WWý³H<"Jú;óÜxöÉ¢¬²"Ffzѧ*j¸dfëaªðÕô[¯SP§d›£ê¸ñæq¯züB†êöéå@÷ÕZ'ÕqÚ!&Òr»¹Ðö´h%SŸ6lÈõá,dßyöt‰îÝÃ0ž9Ql¡æ:eÙTˆCQC 5³Âpû(×óõ9å:UH@z_hïÙd£þ²¼¼}+æ R|YÆDËU´†Ö°/¥%?ãÓnêo¶ÔÇÖo‚†ß@í.FäP¶’^`å˜7§Ã‹’«â1Ñ6ÈUF”l:KÑXõ:\ìæªÉŸ;1'8ÿš˜]®ú—N1þ®àSî[9ÈWöæœEζÐÂQ4å{ˆ=ÎŒRH -Š–ÚœpEL™à#d§«ïj8z¾ïs®`ÖeÉ[b.ž­x)âf¾¡;cŸ°Ñ%nÝ'¹±KйKÇÓTgêN±Â¢ÉY+N‹P%³ê__ójØ‚/¼èâ \¸‹H2a ÆâüåXàŒ»é]¬ÿôM–·}3~åèN,@³¨@ˆ#,„{ÄØÑi²ÌJú¼H(;ÉVp/F¤½*à=Bµ×óÅÀÅ‘hjuoÁ¥“`;IÓ¬ 9eèÅ×­ HYaŠCHÝ;Ekˆ»áÀF&…˜ôy!7‡(ðò0‡qUŸ€ä¶8{ÝÐ ŒÆÎ¶{#)gcÚÜçi“8¹Çi¯Ù‰ë ˜:©M(ÁB½Ã\ºâ݈q´iØ%œ#¬Ã.eÝÅ«iù=Ý1ƒá YMbÎîÓqµ>hVL’jA©^[nÚÙñê8÷Ö"t±k®PÐ:Œéä˜í§–Û®¸$bôhÔ_°Ì>5Qst­çl¯©¢fO”¸Í‚G¤ /bO¹5ÒEŠ˜ÝäÈì…ëß)¼|ÑÍÞ &G•:½;­]ÛÁ~ @5²üqZ-5%O†5à®6§çà"Y¶¨YÕR®0:5@aiT`éû‰Ï$²5wÕ’—pi„vˆ}! Þ@c(bŘרªl ÅçZÅÔ´{–†“Oõð~»ýæìB|N@áµFOMήn±Ñœ†Yß#ýÄn-e@y´SH +?o¸˜.D“¶ÆÛ»Ñ—"ÃZÏÞúL  …òDªAoðvȈ áPé(ƒýññá[@Èî« ͘ üu ‡ÞUÃ>#{4HG’€ÓPæ°ÎŠ eJ5-%õŽÄ^]¬*/¢^Ÿ·©8UÕE]À>qŠ÷šˆ–™á;pÂ#SU2o—¼rwô"÷YÕ 3Ñ(iÆ»Óä»Ïj²».o¦Poã¿‘µ˜ØÛS4^Ǭq9)Û›+:庭Ôœ¹P^ãLȂjT1A-6ÁÛ‹÷D^÷çÒMzEYïn˜‹RS|æOõ‡Ó&ÀN=“j†ÙzÐáKÇ*± &áeÖbîeÂjõzm‰Žµ¨hhCu»ó Å”‘ÁI†I¢ª¯PÉ5zÎODZ@Zì±›!}¿7(ø8Ú“ U87Úª³Ò†öð™"e—•£¡À9Z‘U£Õ™â„§LL"tãQoòA…˜UxÁ«ëƤ®[6#䫺ö"R3Èýô+»Šv?1Åb³LYŽúþ…*S ¹gø6ŒeZî6Ú6hï ‡e­F4ÌI5Z+\¨¶*òÆÆËÏŠZÌšQ[QsØ÷y·:&#œ Q•PØ—³ÅÓà XMkÏP:õP?$©Q¼™ÄHEw“R䮯ٯä\¢O] Wí,óy¬Äo­$Á jö´=­uèïò Ía;o/›ÜÛy•Ȉ8WGB55 ©Ù,¶8YÎ ±/r!‹U¡îX¾k‘•v…·á-o˜K–¢_|g‘ (ű< Kä§p³¥OÙV›—«×énažüÒ'ý!’tµß E¤—!édº‰ÓTÂúÇ4ùHKúðãß…E3ù"^×È ”udÒ»ÿyဗÛàôGÌ\‡öÄ»ä¸Å zÖ€eƒ›‚ÚzšÉ^Ϲ4ômÓMÃ}—ÄÃõ@1F˜è£úhÃ"Ñàš£}ó (6«7ÅÄŒÞï_@ué¹sú¤†>%˜¯^‡ # µÏç$j„Ô©vˆ^ª¦Eý ¦6yRf™-|§&’r±$5/]Óaö+Ú¬œGàô¸p¥I%oݲV–€\b€½»cú&á=æ©46ŽS†“ë17ÏI¥®Ax}‡Ú¹ÈÏG_A»nzãñyØ“ÀvyzÞ¹ÁdYâ~wÿçtynqœóÊ1«¢|z¿ÝÝ¿ë®6 _ ”µì:ÖÏWw×ïþïßo>½{wu÷÷ûoÿººÔºÝä}~÷÷Ålvuwÿ÷õÝÿ¼—8WKBo­7ÿŠðü»ë—ú‰B° Q¾õòêóõÛ«¿¯?¼ûxwsqýñÃßôóÝÕÍÇÏWúPȬëºþpñöþúóÕß—·÷ôé#æL\Ïþž½½¸gÜ÷ò_ÏxÜwúÕYÁ.ûÏ Óphl4𻫤ëàôç¡û^ýF%è§¿‡‰›/¾ºüßq `PÞøó¬qIïi§Yr Sw…ÌÖÇe)ž›æžüy)!R!…¦Ú±ê¬­‚NísÐ’Ýn·kW¦bþx˶@I!Fâz’}–Ú4tiZ„‘§-l54?³ÁNÆË•לʰ,'Š;\«aOtÁ «×»Q-:zpZVʃ¯Ž? Ô¥.éP§ýDòC³þ÷Õ2<¼Ùà‰È%Ý<ó@?Õa‡Ky9£fµi[ü ùa{7|åm]´FöÎ?ñ‰hòÃàßu¿‡OÞcç7}Îs¨W?ëÓs±¬tÎ;Ë÷{OEïìL¿yöiɦm/´r$¿ñHü¶*;û6y„Ýï6^}aP·üÞSñ;-yô™§õ^M_„”ß|,y+ž,ÿ8X9¡M™½Šºú©¸ÀLãøø»Ziî0d“‹:—RÕüD1q|Æôå÷G3"FÍÄ¡ðyÇ¶ßæ:ïl´ò_lqû)üƒä=LJÜ7Ô–:}äì!,}Âoä°ë{sÎ0ì[ÈÞÒ7Jd&'eá|agŸ¸f<ÿ]?Énºÿ]²‹õ\ÙÿŸN’C^œ‘ß¿;SMþßö“ÌTÝÿïú‹f*Ïÿÿt’ÌT>‘¿¨åZËï!䨔5zŒsË™8ËÐìKÇ+"ɘ=rî(fÃ7õØÙ§úñ=;vÖ·#ÙKëâ0½ó'îßÅ–öÿüxçç—â4>yÏÄñM"ÜØ!i˜â³è¦,·lÿåã8Šÿª›xŸûÇ«îõx:Š_vÃò¯Ë ìH]6ÿÍSÉ=ýë§ñUg7‚Ó7ŒºçtºgØÓr< IxÂ;Ö#Îûçƒ>r{:<±ý7¦¯-ŠçÒ×6Œóƒ~¾Ç릞 ´){6Õàé£_Œe¹ß~™ '%bL$4,•ÖæÇŽ$S˜Æõ&ˆzÄ6y¶È,»Ý\XÎt{ÇVI²jRu"Ž˜Ù9øõ~§RΈ6ÐÍÒ3•£Ù4hñyˆyº59hÒiüœó+jõŽÉëâWHýðª.ǃ·å¼Z³ ¢½ÛŽéë³”JN‚ص£àE/ÍXPANáqΊ&Ÿ˜‰@|ÇDíX<ã™XÛÑ3\•c°ͽíWÂaŸdîë­ÄdËtßo/·ÍÛQ³En¼-¿Ü\GÉVB-N[gÕÞi}¢C^ôÑÿ× Gãš³z-¾9côr¶[müÉ,ó®NY—ןºà_}®,R!íwŸ¨go¡Î¿×ôqÖ2z¶QÞßy6y÷ßÍ^|ov]õ_À ¹ß:×í!ë²ÿmÉXFÚˆÐÓ¯Ѷg'òìú„²WI¦¼þåÛtˆºÒœ‚¸É~û‘xZúEúkpaW?‡ÅI¬=šœá¬Ö„8¦×øÄ´'«?¢E=VK!xй"»lâX¦Èh6뱜<áÙ›¬Í~Œ{¶œ1S̆çùîI’úð'æ¯ÍgØû^Çë‘õr¨›‰³q–/úñÌ)¥?KiR&ÍkOùéŠ=ÿg£9ƒÿoö±ß>G±›Ú±¿ÛC²“FÑë=Å̶¥‡=|Ì&°˜¹®F Âç>±µ•ôÙççÖ<ÞùÄH€ëq~Ä¿^‚¢è~õÆDøh‹Ñ¬Ëb´§­ë „ºÖ1•òTPo‚~¼Qšb%Ú‰«àü3·O“½úüÙ+¨êºÿî¹ä*ŠÑJ©jÙ9Ó'þȽÚ1­˜ÆG7P–•ãðyÛœ;x=×%8˼ Žß0fDož½ÜÁ,åêñ´=BUNfuG'æü³Ý°X=¼¸´9út^Çö4«˜<%"Ñ›FúøI°—aÚº}‹È0AÌêF:¥—ÝbêS 6ŽÑòn:Š~¤YÝT£W‡Ô%ÊûkÚÝy1š‡›ùޤ†øZ³)p¤àq˜÷ΉÇA^^Œn¢7Z‡¬©Dož½k2?Ý÷#+]Oe|b¤½yqÕýxµ>mž“9³sŒ͘¥úpÔ¤¹j‰-])‚ÃŽ®†èFæ¼G'6dÌQ~üìÊrÆÞ¼ü9ß,×^zéÄ'°zU¬~ªRúòñëCòˆ"³Ô¬sw\_l+qý¼ß¦ž tÇÚ*zF¦j–ŸÐ—Û›]-Søz¢÷$|ê‘*œø8<û/:RË©'»úÕ'§¾}´¾ôH„£K LŸ>SÔ¿|F^®lÛ_>™Ž}>¨çPÕô¦¢aHˆcb„ôRZIùs~¸Ø¼X;déqíš3ºnk |ƒÏt$õJN3XD \ä$ƒËd¤U4ŒT)ÓÇ%DPûr³mi樥ø]S#DâÛ¹(rôEr™Ä£(­°7``LùÛáÓDÆ«°˜zB¨Ç̇­`\zõ+‚uñþvó¸Ý›ï¹²úÕ˜²”`«õ’¸ff´sh«ü1?> {_ ¼,zÓQ | G»Õ2Ÿ}~àš+'Wä%Åúú+”Ÿ›$Øñä Àö` CF¶ì§pö»èŽƒz{üù'½À">§m7"£ýÎåʈ¶¨áÓæI:zEo\Àé½\®®~áËó ð¨ÝWdç­‘Øzåä‚RÍ€cD"¯É[8µ©HP†ô³L§=8„šNYm”Áã}%1æMï j×óÝ–à¸:…‰¿¾oÇÓ4NÝIÀÖØW~§¹–$Hï–\¤-Xl\Άƒ~–ñ{úHXvpj’¶ƒ(ÂEÕ®vüžÀ8kóÐŒæ ¼ÝŽtÛ 1£ˆÖÅ\¹‡“ç æ¼Ú^[@RñÏùÚφ'°oÜ.‘,}€b>ÜpS(WÌL¯¯H¹`ÃMPEú6g;-4meUH6®¿®´–û—Ô³¥ñT°ëg¡Š\}4 •ó«¼7x߯Ô/91C|Yk êìpwÃn»?æ²µp‹ck&Í %ˆšõé.kh®´ïròͶ«­­¶ÂƒÖNß ­½¶¶M<*©ˆá\¦“„÷EaYÕ??p?­x¦×gžãÝâÚ=yâ ´˜Û´´ÚõÇ™> –íØ×[G¼\)áS*˜"AÌ6ój|× vu•CdºüÌü˜"¤r•©ó&ðÌú);¦I OªXîA=< "°)Ú=X ò͈ \-¸Âúú……™ù"y‚ r½›ÁS½¼—¸!‡ÇãÜë¯,o€o½>ÄÄd½9çwÄù<)3+\ªƒë`]Å$Ã[Ù¾Ä䣨A.òïtŠ’_lZd‡¸™ÇÜ0½Îä'A¸klįCåmÁMrõ}möï­åé]Ñà`8Ðáy®ß¯¢;ÜoÚ¼^=nžƒÊ|Žp{ùQInŒõ:Ó¬øÂ0Ê<â:}œŸ({§I䳺²]IWIpÏ1¾Ê_T¶ÖÂ.½jp8:VcQ@ŽíÏÜW† YŠÿ2JîP¯ˆý‘Ü”R‘ï~Î yü÷Æà™Î΋t,Ѓ’€jèÁœ>¼zSâ¶äZÑ*Aú/bóüv£É/x{ÔqòµoöóÍâ‰=O¼ ~[²D¹j9ÝŒÚ µdÁ}HíŽ"ÿûÓÉjËê±³Í7lúåšÑ›y“”N‡<1.¥Ö¸`Ûñö°´ÉÒnƒWÛP ë-äà ce¸É¦X·`2YKíãš .S”¾Òu¡ÅÂÑ#³¨-Iv„u:‚í¦Æ3—‚ãÂÜs_œsö+KLÆ=›{ú,x 7õÖ~ £°põ 8šú»Ó>>¦¥iTQ£³YÚõ«®">ú—Ï[-üRWán{àk¹€ÍÅf7}2£ Ä*õhß4%Ü<0Ž?VŠThãXi’ h§†õGÙ€g63Ñb ?„;¿AKȵ<µíÉfš|Üg²óZ¼Ò˜w ÚÚaþÍ_¬-ÌÓ–+ˬç/ŽÅz€rµÙ ”€±ÀM[*Q»î°yQ;‘Þ‰%)q,?LíD‹‚«åš^Y–¿š°çì9ù íh‘dO€v´y–|ë™å¦&Éâ5œÛ²ÆÙyDéª-zàG\“KUÌ2.jÒ̘^n7Ìû *ðÙ9ý+Ê_áD?ÐA¹áywÚlí^úÌm1Îé.v»õËÍê°Öëùf vÔ¥È=è2L‹0æöªt*h:þd×:ñ΄üTàzöŠTh&!Wor¹•zUo1\ŽjŒÅuH<Θín |ÉìtØ ¯ËÜu[ÕØK IR_2¡!8ŸW Y[{Å5èTˆ¶CãåU²´ppR,b}”͘¤c¤«&ªf3æ·moîcÉ#!ó$ ÀÇÄ(1à€ N;œ~œ³ô†Ó6žïJ ~~-Q´|œ›É|bÄ”ý¯š슺9‚xPQÕœ’GH°¡ƒÐ“¢ü›ƒÐØ¡*Eÿ{Øoat¶‘fGè`Š˜¤r0!_ 41Â…ÕÌéue—Ldš/¢€¨3ƒ$ÙØ0šÌÉk¶5 ïŸN›ol©¥ ÿK“z¡Ô£¤o!ÞR¥¼=Š—l:Þ}u ¶aëÄô( ÉL<åýôÀ° ƒ`2ŸUàºj9cò‹AK¨†ÐR‹ûÝL4¢)ËQ´™ùó Ô% Çâ,¼ÜµæÉW…“Cd›4i6½Ñ\f :딦Zš6z/‚D¥¿v%­}‘t, Pfi³è¾¶Àé᪋ú¡ŽQÊMH)è^Ît•ÚÖIAF̸3›åiœ¨ ¹‚¸²#æ5üúèŠðIz &iõšKIײU%Á|u ïÝì Mô%|w,æk›¶¢³ú  3~s‘$ؤby)Ê¥æáÁË¡D>ÃܺoXm eWôñô™C¹;óbïr•¿_€)«:^BŽö˜­¸ ÒvKróÍaX(ãRŸÖ—å+†®~ZjQ+©ÉŒõù²ä0>WFÐê]r6YØ•¬pœŽlY ²ܲÔp^Úï.½&ëdø!)$>‡Ë*S9'eá¿\8W7œá´\/Öó½ì£ Ï„]:¿cƒˆ—m‹¨Ý;3¤*F0!•÷[¡" ,ŒÐPY­º^Û5²î Ü-øvGuFÒâT´§)àR¤}iukCXò1Aqê˜O½ta~ ÚXkŸWÃVÓôée­¤'ƒaÓ Ø¥¬JÝ Jôîë­Y»- }~Û¶M =Ž;nøß?ä8]o½KuQ#ñðíø…â"5s%*¡év„Ü0 ×줱 †1ñŠ×èTIÍísz5¾FP½«èÇ îC'Lß “’_ð¶_a $üdU ÑtÕÔξwddî €—ç¯ÛõjÁµ^£7•ý¨3[¡ªXš£¶4Mt˜F Ë¤ÊØh%EÇÓ– ¢ $Ì^…./¾Óy"k#›°\€<3Ö2ž£ëv=¨àbÓ°c‚§;ΞeY FÝ*TÿûGðöŸ¼RU/áp^ÎȪ!KÜ>¿Ë›©žâ9ŠI¤s:¹ÖÂkÌ ûx’¢j{$8&ÍUL-˜…™§£i+$¹,ñ#Rµ Ã–Öð5=šnæ;¦£¢Cν„Ù.é†L6^ÓãÌ $½×ª&¢YÂ1 ó†Ó4¸¹‚À¡©P­$°™‰öºC"S5~47ÚL6`ê—¶„À ©M6ú <7A5ì"bé£fØôuW½‚ÑXÞ ò**Z°˜ž»æ34 •J‚´ømj-ÓO•V/ø(Ž a¸£Å:Ygé©džg!1Œ¨Šªàã›·ª¢mx¦ú0o¡éû8G/C"^îl?8úÛÓú^UuHNóÎÖÇýÒÏRÕâBØÇ™à«ªÁs*©7‡vÃsÂŽnðª®Î >]s–ÏÓüÑ#«.}ç(•'¡Šñ[§Îl•ᦜQøT PàÕÜÞW¶È¸f®-tq$BÿõtmF¯D…qºNYÖGC¯U÷ .¡e9šmG䡌¸ùŠç²ŒØùÒNgÑç¯LÀ蜡fúUx|æ¢{ZŸ:çëuº¡Š®Jû´¢Î}Û{â>6¹~Uämëô{p²‹èZpÍ],ªÑYóBAÔMă ì ý,òñNaDuŠñöù ôÈó—þfræÑ)À€MÖÆ`O¢€Aç6%Ëe|ikM#O·:qXžÝú%H\s'Éæ«êÆu”}t¹³cÙ7É:Ÿ?Š%†-þ[*X¬Uj½Ÿ&ÑR£®°Äbi·Ñ¸hç³*2ûéL^„¢ì"}VÌMæñ8w~\»ýp|û¼$ o˜»Êl• [“@b}²¹©­4Ìã|¶ Ae->wµ]†OËØ³§k Sª>-W슾:|‹cš¾6/ àè¼ÜÌœO(³ JVÏ mªD‚€g3{l¯\ÒpâÿÚ;ºaýÅOU‡IÔ¨h¶¢üúSOÑÀEˈïÊjàðV>B­–HW¿ÈGaòy@r˜ådJ‡º5=Æj›ޢü3cU§€.ýCØF زV߃Ÿþ+`¼:´"¶·´;+ÍõféÒÔ8×¶èbG¡„1 F@·óåÒ«)ˆ‰“Vï.ÑÔv›¬0¾#D—b?X‰ ½{yCkædàÕ°„¸¬0öe¥*Q!¹°Ð,“UÖÛ1d¤¾>ìAsÉÅÛÂFØ¿fóïCpö-åa”ºÛè~°…³Ò!VÜêJƒYLÎì®âŸÚa¿ €5ÒÅhêL­9Lšûý†fŒxÊ74¨¥bìj_].WÎYôËóŠv&SlûBpBdœ7Tñ³síîlÓÛÌZ¶«¯õldºqÀX-ÂbGeùøÚåÒQ¶Åjç“=å½QOÄEQ¨ea*.Á]@ô‰At÷¨¦9Ûb3_¿¨fSä㡼 áפz0\mêÁ3U58K®W.èà=¾}¢ÕÜ«HS´°^{ŠkÖªù«Í²nòg z¿z^)²_®€ônñÎYÑ·Ô,Y9ÄZt8ЏáLÖÞ¾¦þÀýxNÞ™#¿ Ë‹5/“:7C“ñæ3[Zð×FÙÔ·†3ÉÆpç˜÷;íÏsñ:J°Š\s*Ü2jýkØo†B|Çq ²1±=x3Ð( Ùx¤ÌívçèsèÖ²DÕÛÑêŠt¤—N1~o\_Oθ•'¸è¨eS½±÷Áõápò¯ìÇ38æûÅSôÊ¢«Ç‡NpÑ+Á7mñõ|¾2ÓÅèॳ~4_÷ûÕ³–?^/ |Wã*DvkSðÎ¥Ýf¢î=¤ŒQêy7¸6ý¦; Ð kÔùš¢àpooó¶`øº“^Âh@U&@q!—TS¹>¸7é[5’Ìê«+½Xoß:ÿ„û7ÃzûÃïÐ îñÖƒé'gnEO¼¹A­$—V†fŠ&OãRÀ’!ˆRr‡†Øí>làj_&1’:#ñ3yõÏiÎà žwT P —òâ˜,œfW&-Ì<gð. UÂÉßkHHÈ¿Â(é¤`­O[f„ÝGIÓ‹C§û–.ãAã=cdÝÀÅê‘®‰¯®7!óC _ ‚©BäTE; 5gÑ›nP¹:…‡4:”ÙN*¸qþD¸ƒ4ö;Í;®ÎÆ5̪1 'ع ­.) ®’é½ôø˜ç¥PY7 V_“lÔ¿Ân7;eÜ€¿M >2k²ŸÄ.ÖäÀ•jÈû6ʘ’3‰L'n”x[e¿"ý¼sY½}Õ>Ÿs½¥éöלñÕfIâßnXz ðÚ´"˜7È!ÅOm³Üm…öÀ»“tDíæO»rFÔËí‰é9ÈU%î…8Þ¤WÓꦠý9^4`öq¸ûí´ØÜô .ÊÃÏ^b¦½[éÖšŽbƒ œpž‚oô1þ£`7Èÿm ©p7”9x.>-5ZŒ=ãyUéz*δ‡1¢ÔZˆèðó“‘U!*+Hî`»¥`SC˜åZ6ÜLKSAæ]n¿æëËçùÇݰ‡ÀPd4þØoĉ9Ô+HëŸîL$‡ò‘2øG®Šƒ*n®—•ô C~3 ›ûí‰C¼ºÂ¦‰…ò$%D‰ÊŸžóÔãÞìU+K6`U]‹k‚&M›Køß̨8;(fS 6¦„ÜÉ+¹·é1± {}"¤àC 1ÿ™åÝP’ ‚ó} ÛgÐèÓtrx£Òà.êÅñ}²vêIûæåf8>m½K:Hh.B•‰éÀ+s‘í£ÿªšÄ1EÆ<œêÌ7ЍGQšpïBš=Ô iÀü™wÑyŽÞÅTÓ§2‹U£(„2™±pòé{¬…ë+âØïg³ÓŽ•/Ë…:¨]ä«ë Ë“·sŽã|»]:å® ÷óhÅÜÎaבۋõà{媥vþ\ø6‡j]{K`ÿòŽ} ‹3¥f ‰ . ôTW$,€Ö˜3:¯ž9)ß …„`R òž‰åA–ƒ (´N‹s½Ù§#¨÷›è Øà.ÐÀàö½ù¸L`|É“´L7óo!fIh[@MRBí&8 FY2§ËS€×¡} Tžm‡í ç4"À·K[ĬbØOY VƒÕÿÄ%à.®´y¼¼}ëéŒÝ5Šr ³ÈìXn€â\n€[®jJ<$Ë­É3Pf<<ƒÍÀ(Wˆù½Ym¶ô)Õ…K)K¿õh>6«(¾—÷òx—(Øá‰j8¶ƒ§V|ÕY±ôȉ+*˘…hÅ©ò&.ov¹ ÝÈ ©û’} †RÚ8Š]…]d£“Ú;yQ„é»Õþp„¬¡µ£ÎY‚e²:#isûèo¦®ƒó*›iž÷1ÏŒµQv=¾Ù;pK¶ýqŸÀòÞ×ê{„ÿòea)ÈVQpotPšöˆ?ùÅ%÷¢$qÐЋGÝätíƒ4·“É ÐXØE‚ëŸÂÒÅS¯*²:zÕiGwÓ-WeÜ.>lå“ôû‹õa R† ¤òh£ñsÞsK›5J^V€µOf9+¢IŸˆ¢Ä<p³Ì~ÌwJtᚸŸÃºÎßÞš˜é¤{ÈÇøEkO3Ö¡>E³rY«3qÒ\XVô•„Wêõ²´ÀDð¼ÕGÎ'ÏGŽù<6ú¼¶ùü3lz G±…ì÷úÌõf±Øý$ž–*Sø½9ù-äÏœzèêøCÍi$Ût)ÔíýI£uö4Ú-ç’#š§ÿGH2X¦ þåæš³PY$% Ñ\Á¦@Ér˜„]†þ€ÏøÍøÈѺ‡$ÿ²4^ì÷s‰,zÜòçB$Uk¨¡ô˜ ´4 ˜œÂ£FWÂ'%ÌÁ K>(Ân[°v…8Jú èûC %¨¼¦ƒ.‡w•àX›œ6Ã-íâ2QVS±é¡F†`_ÍRÀúÙtFô>¢ÄYñ̹ň¤h÷Ïayýlð¢‡káº~Ðgt$  Cðx-â¯t¢)àÞ¼¨–œÄЈŠL‚+Á즑¥Ô‡AWiçô¼S½°œž6ÝWîÿËr24‰³ö͆qñP*ÄÖéI‰¹ y0(Ã!neÅa‹œ@kƳ2ª€Àñ…•aúšIé°FÝ¥C³ãØòãÉÛ|@Œ Í\*1ëhLN©jþg-ª}þýCýW¬ ‰EÚ®b`ðsV,,ƒGEwõ¿Ìž¶§µÄúNì~^¾Y߬+m1@Ô•å~;£»dØxLYƒ6e™Qà׼н¾râÕA˲tΣڃ¾¸œ¥¼÷~«j-}?è¶¥øv»f[w;kŸñ¥_=H¸¹á¨{j¢ú‰WZgya¿ÜÞþ={÷·0 ¦UÑŸ/ýïyòû¥o *ŠÐòÏß§ÕR{ì‚kûòLËø±,iþÇe$0Onÿ³Fpº Úb¥‚|Ëû÷Ú6µH[Õ”É<üó/}O í¡á_>«^›;,æódY)Hè±ÈÔ/èX)á"¨o©Qø»™ Àϛ֮mjÛAµ³€Õµí(j¦§\BFÖ»p°¤ý¬ÊÒœØ<Œç•æ|µ™| ›ù~µ<œä€¿Ú,§±Á±Õ°q¿½Wá¬âüni§¾D—X‡xœ!ŒL!ZàBz‹¾©2¿AÅŠ³b¾/izF’¼7îÖq ”Øq=N»?öÛÓî–c^4s`oècúq…oͳ*8‹!žX¹NÌyúéÑrÎÞÑO¼€$Üï«%Û­ç ?W /ã3[Î×ÉÚWýÔε›™Ÿ®Gº·[Þ£ÅÍ‚ÖÊÆqEuÙçÉžR¤î+VpP%¾ –®+cøb4n¼º2×?EÉrLŒ4¤Xˆ€Óí“…›Äúq¦_%`­W›q¯Y6Õkò=ÁPƒ†çhˆ„p˨§ÿ½wím\I¿ï¯h4î·Å,ćHêb1€,Ñ6Çzµ(»NMc ¨$Ú¥[²¨¥ryóß7#Ÿ‘Š”«Îéž½÷Ë9eE0Ÿ‘‘‘ñèªGVŽŽ0èN­”î 7ȆP…U 0Õ‘/=i1P××ýónûòÕ‡\Dž±Ì(39;*)ã9Â9ˆt”»âtGx2‹€)Èšˆ N‚¯A ô”›QÕŸvÚíDÆ&ɲMÅónù¡Ž¢³rÂPãt*„»]ùeµÏdd’ÊYÅÂU+¡Rv¤J¬ƒÊȳíûI|•ûç-u»åkfÒ 9x]bcÑ×G5°Ø NÈAqœ-/ˆÍ+°ÅÕÂÐT‚¦Ý;(¸¡Y¤FŽK×êõEP&usM¬ixC¿“yhöðÂï·ã›£Š3‚CYÞB¾ ON ž Ø0E¡S¹¿„ƒfò2êÿIW¯G×5Å Sñãß3Ä‹›€!¨&otÆâNkn=rª•ð/±?q|`Ýzm]-v»Ž!×]v‰1^ž[E›šL ÅKà—»Ä58F¬Ò5q\aæÌ^>_ðß^©‰VÆšDEЩ'äËB¤UsøVRª¯Ú½ñLC{´î€—>GWœ»žë[~L4ìWØ ‹™——qùK+iP¾›…P†Á8ØLtæŒØä‡ Xw…‘ÍU.pÚµÔKÈÁ︾ÄÀ³l@¬™~s°á³wò‘䈄–bã´ê_Ð!Û‹ü$;A»OtžªR¾ò¯„ shrÈLõ€ËIxZˆ}ÁIP꫞ªºŠ¿Ó’näC˜È.€0ÅäêÚwJ¬@íWæǾbªV¹¯Ô¢w;±kT¸¢Ž6¸U“>)*§rŒ§k(plqO©9_‹¨j´”ð’‡$ÃJƒŒÓ©x=œf_ß+(qïùÓg²5ÌHç!WÀfBŒ^k|ê¥'5Å5.¥ƒ=Mé@ ÂV„šBqŠ#¸J®Ëï4îüÈ}Y=½/*‘Åôþ½N¤‚½ÃЪ}UÍK‡šÊP g‹üžú[ÁÄwǬøÄ=áPÌCÕÃJª†ÉgÊ Â]é‚XÌ—íþΗªù˜Þ)uï3'§ ßxRÎq{3ûùŠ/00¿ˆ*i_,:òü®ŠÊ(<•Ü­Ü ‘°§@2-ñO%P ÷*ô|¯£ÑóãuÎÖìóº„Ê ‰½æ‹êkɶ' éßÍ­÷ë¯[ÿ9W;Ù¸X5²,aäøÊ…(ã€)¢x®¦°môú(0;ß·å¹RÏL^7B1ýœ0oÓ%³vrŽG´”›u½Iœ¤°×Sá >Z¶ßù£˜“X¹/"Dþ†N)›k Ý8Öiö ²ÏÁàê¶²½vì¨A¸ÄO"O_žt…4ž׃òxdG3òé:âÀC#d£I‚nm«ŸðO•!²qùÞ׌ÀÅ»´ÒDÅ~óWÌ)ˆŽ= õ“žÞ¸ B½Î† ªB±À®OÔ›Ž”9‡¢5Úžt®6Û­Np Xb)ñ–äz*ô}qi³ ¶Nzüj{—ø£D‚¬\€È”öêk±µE?bݸ“èåÕ [p®&Êq¾º' è –Ó¶F²mÑ»[¥g"ø7kü!gU!¨?« &ƒñˆ{±(Fï&ýÎÉÉVµ\Ÿ°¡(|x™Õ(Rác$__2¹Dz»é5î)‘Ì+H¤»tj•še¨T'Ñ$ p“›ÿ Q~ZÁSLO@mà–a-Q&*Œ'ô7i“õzª$(Á$Û<)NodØ*±8¤cë)ó!;T^ÇôiÅÞVU^+0?ïÁNƒûP%$E6dZòð.YC7Tõ d7§8Ó7r«V_·¾RJ­{Ý‚P |O] *MÂÆå3Š|cëÇ1ÄòeDžeœEpÁwB„׫ޛÜV$Š4{áðo K»Âˆ6+0æ…Œæ"û¨<;$¼rÒ<ÂÚöiÏËD(39 ³1Ž•³ 1$Gó º}¼Æ ¿!ÈÞI¯fÀ£‘ï³{Áñå®Iðæ–L%äM@œ*ÚY†Ä0@ªe)¹ÚD ÌŠÖ(˜¹5j2,,ökŽ`>á1x „î gJWô$‹ÉDz‹àÔÅÿ¤`O¥o¢`VhlóºÝçCÊO:E€ñH 9èxÊ/IáÌoP†9šÂ¢S£±FxÜ¿¿Ò3àyÚæ nׄèÎ! €•’p)+2ÄY)¹­}<+JiD …ÊÕÔpdéN)'„¡r\8ÌRFß’ñ"Ýâ@mF2SA¹4N›çÊ!H^kQ¼‡îvd­§Òú9’^T‡ª7\´¦=ìm¤Ä=ø¤ä©¸@:kmáJðG‡öæ]΋&òüzLÅvØ‚ËT$ ªyðåD,2õ„Zÿzü/™³²±°x…5W§ãw4bÓðØâLŠ7´0I¢aƒ×ëq‹°“ hœWæ;†6*NßQ'q` ]±ÃBÔ[Ü Ú•ªÑö Öv˜« }vðÀë.½yçƒeˆñ²S¸€^Š `Yží¡±0Pù«)œíþ.ý¢ü%{vXi¤óœùSò… ”yˆ#8 &ƒïÿÃrÜžgL,ßlË*§É¥Yô"á}èH ½Wä&Öz?ˆðýL0ޝo«#S¥x9Kæ|§ 2P¼ò¹`(£n“@¸» *µº Uât_J]$)îRÄ÷âž§‘¾ÐÇo¶ûÕñ™MBmĈÍO?KbÇ'¸ªŽýM¬IŒŽÎŠ?'M>Ñü=žÅ-à!ŒGXnè„:eò/DúC-ÊÞŽ£{FôXíÊN¾Ñ"C‚¾©‹óQ(—´b ÞH‰KI‚[¶ÈéñÕ£&ǪøvkÄr_ü`>žänáo0n­› ßqÀYñ¹Îö´~¨ÔÛµŠfXÒHr=3zw=¿ãBÄË,HÒ0ÅêÓöP¡O†Šº!‰’9hôʵ)P)S¼ÌŸÏ€‰F9Ë|‚$>þ´ÝÕNMVÉÜ…hMðD¶'Å"ÁÒ¬0FÅê{aó~åeµ~OOoØôFöB;mIÚðà@bEèùq•Ľ(ˆ} šô¢ÔNKz1–²Çs]X 0¯°d-X8ÙòfáàuÀx_¿¢Õ2ØËj¢òãf {Q/t–€££É°LN$ʇ`a€©\ Ä郫‡g@:5)Èq`"CEN€AëÏYŒ?À”Áó‘¾N¥Àþ“§vÂ8ÅÈ3¶t±ÆŒRjXš+:P]€/fúù‡˜ Z_»9"¡Ì¯G†‰œî4$&ñrÛx6„¾O׸8n&pU›]}ž"üŽq­p £CÜy΀åãÒpQ$RvßK¸ZE¹,c†6Š'Ÿ0+». ƒ˜LfÈUuMì7r"ÒÎðža¸ÈVËæÐÓÔ/ŠGµAÖ¡ ƒ')712 ñÓ»D¢©uÖÓÏ Eƒ·Bd}%W_èY#×' â¾å\h‘éó*¨Ä2Å ?Råð$éJ6v5ñc¾zC×µ.Ái—àœ½(ð«ÊÑ*Ex(ôYÀ4•KÕɆ‡š1·5Á@¿"Yìk×u  Ñ;›…=Q"äé‘9vˆ±Ú5€¯}yL»ÂGôŽi@²Òš”Õ1Õ1US·8Û ëqˆðŸs¼™óùP¸cQÒR†°3Ä&¹«kECpBL0i,i¡]3¡@™*['&ªvË!€¥yôj¸*„MÇEHÈîwºei*À¾PödÐ$3uØg8Á„Êv¶¿‘¶Ò•¦™ë§5Ôø ‡é–`O—ú8ÝjšœïhÊÝ+:„£8Ã1t0ID]jÑÑ|°IüðH~‡•–!n ÷hË,<ÉÔ¢ª=‚c2î‘§hw1$˜§vH8.5 ¢äPÊS“ ØQÑp@ÞÇÖLúÜÁmƒÊ+(è"n~8 vïcí E.%õ‡Õ©^ÙF#íä@)yQiža‡r±qåÃVÒѳ Œ´?Ži>è8V)>ÉößÅŠKç‚NW™‘~ËfØ3¨ƒÞ´ HxM:2á.ùyÄâuăGU{Ì$D_!õ UQO»£/Ãb-ò ÄêNÆ0ª °‘y='µ+ qZFºÍ{(k†©æQIo A5Ÿ(«siÖˆ>i*H+D8«d’kLÚ5Ä›÷Åû¹œªð9†Ý`â…a-:Ñá¡¿.å7v×щ”$Ûxó®.… ‘Q ´ògÿT¾òó%èw\\ >êF¨›œ o!)]Eņô©­¯&JÆ P´²8Bºçó«Jg ít} Cƒ%jf*Ñ9Ôïû-2Ž'ßÓwE—|°ÂÄÄz$Hسâ˜IÇÂöë ‘ì¬¾<*Dž Š®© m…3¨XÀÀ+h–N Qh”£n*€Ãެì6€û6–]15DQkõåR+ˆœXF­TÀŒ´á³(k|ò^ÀXÎñI%cZãóõÍ‘Xöøüž6“!õ¦Öw ðµ)d¯¢t”{H„³ÛÂÛõ3´‰°*{ût$äX=ß…G/ôµ98J̆(¸Ô„)­&Ú<æÅwrŽ‹ÒõµY¸«Ö^××ñ¬ÀŸ^ñÃák±cOÌ(ú7ˆc´ÀÇ‚¥‡ɸZ|¥©$XKbDÄxQEqY£•áùwi1™§ó‘¨‹–̨ KN£¯ Ò ]!zA`dAͨ´,f^¸î­³(Yé ¯ xu^6àXqˆºš½ä[O-4+Ø‹=Ë•ÏYÏP/A/ÄD0ʼnhÝ•õé¡xç(6Äk²ÐKB@ѪòQY|®×Á¤’´ ”?œYh8D©F4ä3›±²GÊòÃÅ—ó‹"”P½k×(,ÅqÕ‰A1½4q¨' 6[mü[Å~´ºÅ!ªª-@¸ûÚSÇ®k¢¢XÎD°gÌK,wäû¡ÔÀ´ ðô³qP\Aèï¶»jWžÄ ÃŽŸÃŸO+ñ}àcÍw3Û Õ@Ð5¦Àm"„Ä¥ ›P•– #Í @ìMUbb…&y¨ìû”ó‹8Žlø³]×óPö5ŠÌpq#ªRŠ€Á7«òîQÐ×Õákyäc@2õ…ÊÕ€h'tW©9(&Å&X°ÃPÅI˜.Ce9v×ÂQù¼‹…°ÃPU4ˆT4Ä{™˜ç®<ЫÍ$æb2ÝñvµæµMGhÊphÆ jzêØRÌ·TÑ M8Ç ØbC#Lsu2… T/F®JßaèuÔ™epC- ÝHÇGÉë$‰âì"Tú©€¸.¨P•=hÎç¡{̪6NÀ¾‡Fè*5N.L$¾pËähUöåÛþ®,7¼!u°ÍüCU{x\½-¸hz:³v‰r¸ÂÑøÌúäp)©ãÆŒ6Ž‘êØ×0$uêk«—4­?­t9˜…{vÌv™î¿o‰Tw]~ÎÐ ‰UÇú9Ä0”wš»*:Ù'tåÓ¨ â\¡×UPVc@1•n`{¥w‘¤@3~ñÂn’6Th&*ÃnV…_©«Ö¢üKRi¤x ˆ§1°>©Zs€¨8гØ; #F0$>ƒCSç£`c94Ztc†ôŠàã@<žÑ¾ó>Å`Ìzó ¡ªc ~ÑLáP·H¨*Ï0–†PF`)o‹L1¹Ÿ ¤Æ–ù#Be£8ãÇLLG¼Îß­P&,#ƒäÓÊj&Áh´>’Ϻ«8õÎNGŽâAâç ×=îw<ÞÙîü2î/%*N˜5–Û'ª¸ÒPûûrÿþJ´ux|O±ŽKºl„Ä3„‡—ÀWÜEyÈ• ÊGQ Ãr·yç(ŠQ0”Û˾bª’ ÁIŸ3¨gËH ^V1Æ,Qý3a ðnÛQì!«Ô™'rõö$D[?Pg,sÅ^ >ÒÝF¸+€Ô‘É:¬ð»:áüwŸÔ¹æÎd}dÅd¹˜ùì#$È:lÎäæ´"k%ô±ÐGFÇ­¦¥®}dS¸Ív|d@„鳂¨õ{ Åâ}dEœEé)Wšúä#;"ÑìãÛ1´˜2 ›sùÈJèBâ)žÿG–‚ ¡é3–‡#$-³Ç]Fò‘©‘ÁMÉGfFöXÈr1›UîC”CÇ”›€ .<Ôn"+"FT‘¢!Jºøïo`Or¨²A‚8àŠl€L¬ÔX$’HˆTbdƒ¨äøt`)°²K‚®¾È P)7$úWêäÈ.É!†Þ {¤…!ZAÖHŽƒ5Û™ Œ”ÖÙä„dr$§úÒaóaÔÕ·QÚÁ‡ÒDàši”è“pÝH:LÌD‰ôJ¤)0Ö*d»dPE¨Ah|éÖ7d­4tíH¾W %dGHg7àröú+u4@&M 1ÎÙ3 ¸¶tÈX)nrdò d£¤wi7MÐM5_êp‡Mza€Œ‘ Å<ÓÈélÙëZˆÑHø|½ d”`7Ý#¡ÄÜð¸a 7FÃ.«+Y}ûpà@è¦8ì=¼ˆ%ä7°ÅÞI³ó®BQ-²-2¿4鼨¤Z¤GRyŸLÜ ‚Z-Uƒ)¤Ö. šde5>á9 ê¤Of\õ5GÌQtõ&ˆ‘nÆÐÌË+ˆ1AGA‡4DæK†¤.K4}d¦d²VòŽ ‘‰’Á䥓tŒ•½=ïvöPI_ÃCgIÚFBd¯4‘ ‚‘d¢*"fI¿ÅB$F›˜R° ‘µÓB¬ß\p„çbá!²šøÈ~!;¦…¦øê¥Æ >"Ëë\m¬È"k~bÛÙÂ04—եȇöÌÈ™ú¾ÚaClˆ.T†d *!2ÅR iC1öˆ0³}Å üÓXŸ–ï4»Vˆì°KJadÐ麉ñ½RÏ_¤ìFÆQG\Þ ‘ –ŪGºò{ˆ¥à¾1øÏLÏúuç™n)î_Îåiå8Ia,K3’ÄÒçJÅ”Ø&Æ^d|ƒÓê‚KhN±F: ãºÍf ·g°?7®ØŒžÁ¶)Ä?¼Œ&Û3¸#C‰‡ëyª—ʸc,>›ÙI{tØ5¢™ø"óbs˜ÌcÿDš-\L7Ž´ÖÎEÿ°Æ¯]Ž˜¯E ­´ú¤3; ©¨ùRðýê¸QÆ”IÈ™“FÕ]€DUÀJi„(àÓýîݸsºÈ8("…s’'SC¦(€;Äd˜æ9Y¬>pÃuet‘›£Õ0ì.}„¿5ˆYåºE ²…òXó.žÓ``üB×ÕfD]° M¬‹ÔRŽ¡Øfx¿XM)|؃n„gJ´{Fnžb„ žžæt»xyMAÈÏ8Ó¤G Ѱ÷D+wDIm R·1è ðZ ² d9ç Ùêx¢™±yÆKT„Š!½K›`7ÂûG .·n&—„áéH4Ôxh£îè‘@°À7`VAàM©Š"dz§ àÚEvw'¡YÜ™™_}]di·Üábd•†ì¨_hi#¤Õt‘™] ˜Y;Š)u‘V8Ï,N·Ž`Ð5 ±r¢h´üwAÈÈtšDw#¥Ž.âWô6ý=ˆ¼£Ñ™]ô"U$”'‡N!s9ÇÀU„L]¹ë±!BöršÇ¡pEènT9tä­ æ‚ìà O©eWºc#¢j„ìà¹("fÎÙÁ!¶I)R2äˆÎƒn¬M”ÈjQÎ’G²Â¥}~¿}ùªù"dçpÜF囇Läº?˜é~!‹¹ŽiÐ{„Lè:¢ÒV»a Š®ŒEÈè®ã ’ñ]ÇÀ†T}?ë”5¤˜êX®{7BÆ}±nìÕ4©Äà¨[×­É$"ô P‹©= èØ Z„(®­wEèmPL­+BÏœ³¡(Æ|æ4ÚhäQ‚yŒƒVË8´ƒö×Ôª2QOÛ‡úõ4:½ 5D=÷\ÔâŽÆœCw4šåeµõ7Ó¸£± ]UcOc>B´æÞ)¨Oã%ØõQ;ñ ¦àiìÅ¥iľÆYi¼·ôžֲ¦ƒ$:çªU/H#ˆÏðläl 8ñQ<Ó"ûîóíË~µë3çYÈsMM9ÄÈPÏ€´Îù¼@è0Cvc|~bdfÏOåA‡¡£ …6÷,¤ÄHgá`t9ÆÈÂ.Jªs?%aÁŽ‘¡\Êî:³‘D¬Ä{Ì ‘áA"hÂîJtüÆ‘è¾øºzÓ”c$ÐòSˆ‘ËâˆðÄ‹¥@d‘D·¯ÂU½ùÇê|?¾òàŸ·ÅŽ¯+²¥?îwú rŒL9 (î¤%Äç ub%Hœ)d zIŽ‘eœìàÙ’÷¯Î×Td™zÚ¼âeLaŒ“?¥!%€'È6À1 ý.AoŽ!ŒgŒÌxÀ¿ÜhÏ/dßD4$Qæ}³O8äOÛ•}Ödu߉ѣu%ÈþíP>A×ç}!a‚j*ÈÝ­kCXÁc>kÔÀMãB‚DiŠà°. û%gÝ)1–Zår°„¢¾àé²ü*ƒÎ‰Ø e¸å]ΣÑÅ#¡Si0 ¬€0—ìȈgg™§÷ Cï–“ÑÝR„ïùlò§@ @b—«j½Ý._‹×íšæsL:Jcç@Âf8BéÅ SÀ½ø4¶\ýV¾ñ2 ‚ –ÛŠ~ D8ÆËWòûŽ\Åf¹ZsV Ô‘ËÃúô~(–Ïç=8µôzœØ‘¦]¾TÏ,})‹ìÈí]V\"!#‚…[—å·-#"O²˜”g‘êx¯N%¨z¢ÿè+¼”øò˪¢Î7М܂/U±:R=; Zà‰·¸Ül_¶bÒ¢[Рåj b¸tþNZÜž_ŠÓÛz¹/yÖxT»MîÊ/ççeÅ~–œ›üü¦~ïz‚<ï*ò3˪'ûqYÙ?¿1dBÜÒð|8kƒ  b<‡‘q.ÇíþôL¶å¼?-Ëóé@ µA ‚hÈŠŸÊí.î 6D?¿ñŸ}ùԵݓø¯±””·,òuyXW¯3RƉ×Çk[‰•$t)Yë¶‚jÊ —èžø•Ž™Óp Ž ÐBO¶{æ Ÿ¡…@þúFéN¢/ETñërÇÀK$à3YFŠ=q÷oÑBuľß(ž*ݳU+çI↨¿Ýò¼Ûîy‰yîÊýËÿbÉ^eÞ¡Þd¥nZ õuõ­ |é«Ü-±>¯_*‚¿®øb î?wT·F)(áõ …*\‹0®õW¾ÂR „ùxU, üx`9ÙzþüðÎö®b‡Ò´H~û%ÇîÊ«ü^ñ¤])P3bf»é+VþsE7_^S‡¬d¯äçJÄIó‹ÇÄbΟ¢z :œ÷ïŒAˆ êÐëô$[—àb/Á]õ| |"RY¶\¥1ÿ­âÖÅA$ [ûHÌjõ\¬ KvîY&AH¡<ìG–3PA•:Ëdb¡lbÏx§i±åâgAc’Uûj½Ú«ßÅFTû7ÜL+%g{ÔMù€ÖR"{À{ªžt«Ãn{Âdß Y¡Ž•Í Òº•6Ñ ­± ˆz½ §f½:‰êcÚW>0ÀÏâÜH›ü(μáGvnAÄ~­†‘j@I Ò @žfÒ‚|Œ„ߨB©50!¦ b7ø¯¢·¨ƒgãõU3ý•X¥Ö濊6ÔæañƒóŸD]áð+;çdÈj/د¼á BÃP+Œw,¾ó&Ðd»1š4j6Ƹ>²š\ub]j@É+Ý “ Ÿ¿ñv#ɸéÏ”Y%ªö1ûñ7*Þ„ZgÕp×Ç¿‹&ÐÞŸ|hòN¯ÞðÙC«ø%¯×S³ÆgUIæ>ª~§#—J;ªJ’<­?ªó+•/Cin"s”=TF¿ŠË›0 ©s¦†å¢ŸÕU‡b€gCz«r6Äq~ÎÚ¥*¶~wx„“7­`jç=ªtÙOêf†òŠÿ>üò2ƒµ¤Š´©çÄAE ÈA=;Ï[$®‰@÷+~ÊKã;fá¾Ê(&ç—f Ÿh¾›Ü=Bß(Ò ¤Ø JhkA· Ö ÉÖ0™É—8ñ3Ù^Ÿ·#5€ï½134~ç-ueYðï&)Ëßoë¯+r°¤ØëÈÄKDrbÌ+îGö£ |é ?SnÔ‹¤\¿QÎG¾%Ô{B£‚êÙll‰—ĨÁ”¡‡üÊ9*ä‰s'¿ –ËXð#¿Ôc2ùq/ç…ûB—@$ ^ôw1‹^ˆÛàÓPvþ+›!£®šž¸¼^„g-¯e1€_»VÃüW6¼¤£í8|9~ã’¤§Z–—Câ!\q9tñº¡v{Š,*±ò‰‡,îÄGK!ï¢V $×ÙìÙ¿ñ_ѸN%ÊYÃA· ¾‡ˆR0ü¨ãËv¡†¨ÑÂ|fªt³øy)Z–ƒÃ—†ªËñf¨gÞ Å|åµ[F¹ßL‘-”ö÷7a Pµ7±|‘t¢ùq¿Ú‰ü)ã•ÌÈÇê¡÷_ å«X¬Ž/¯9§\)"ÍüïÊÎ%hòÝІˆ˜r\ráRŸïdäÌÒˆ!WÕ·Qñ½Ø-Ž[(h Õ[ù·•øOkxà¾7dRT–#¢\äE e­o%ݳ,|¡JR«Áår@ò†@(ïMÃûíuS$coá•›…ÄZAàÓgþ^oâÍ­Ä6,ÀÁ$Œé,•5éK>Λ˜OÔÙ(8Æ‘¨# ü«|-Ø[‘”Ó4Çb-d{f\±æÅ-‹·å‘¨ŸŽ~ Bm¶?H»½ÕE¡ˆ=œòWl B¾ÆÛõ±J'P&a–Kì~û¥8Î!اr-4Û"% ¶Vo V]qÂgeu’£‘ub­1©äÀ7ç—57ßš+tw8¤•ëlp[pŸ` ±x–·b#†%¶óIÚ |óÄ¡±Kk–`M‡Â=Íë5)UâTsš‚Ÿ‘™*$k®¬RSFÀ”ý<òllȾŸm‘ùc}ãQûÆfBPþ ÿü?Æé¢?ì/úôwøðî1.ûw)ùûÏ·Iê÷“›î w‡7·a?JÃ~˜ÜzDºìí¸ûgÖÙlxß©?ñÿŸÃæ‹øŒ½cÓT’ðíäĸžáŸ‰8Òû—Nü/^ð'?øŸaçvÃÿRú\fTñ_Ÿ fÏn ©{;hÆóô)<Žs1ã›Ç|ù—ÇtþyIf¾ø<•„Wñªº¨Él>M51àrП ÒÑr0ÏFé"E­ù¢?_¤C4C‰À¿57‡¬|µ¨™ÎÃÃéUÎoðÒªfˆÝóô#÷åf,Á·ï*pn”÷—·ÓyšÊ™?’ÿÎÓÁt~é8æCÎèâx®NÃò•ÎSrè>ê–j˜/gäöüÛþãh'¤€ÓÉ2ý·t°ÀãÔ Ùd‘Îoûƒ/™†1OÇÓ§Ô`sb°Àóv L¥?ŸgOÙäm$ýÍ’  Ã%,IcG!ÆøËc–æƒt²0ÏZ¾ÌSõn5«x;ÂKÒ ˆ¼RÛUà†óÂ+]t¼Z%Ll¼­^…K¾kJ½÷ ¤ o†À%?™¯Ø7°±o_ϯ”¢¨¡Ã€çgá…¡Õàšy5(÷HMBæ°x&C®ÜKC<ÃÕu;êßåËÀ¿Éó”¬öœîïFËFÓÉè3šœ_޲›yþ­3é/²§tI¶tþy6ÍØÎFnÜ|1ŸNî&ýqšgw:²Ä¹˜÷ÃôæñŽK‰‘Œ-Ü9¡AJ_Khl9J'w‹{­µ9<2ï§ÃeNˆr™û£ÑrÜÿm æÙ¿ÓSÑí¢žÒyNX=Aú·é\[4¶|òMð¢3Jïú³ ãa8lk´%— (d »e"Àè§äЦäP2 ²ñnçÓñòq2îOÈZµ]«Á!Bç’åNà \˜Ü;•-žJ×µ'py‚^’OçƒôâÞpWiÓ¤|‡™¾Ø3Eóh`.NÏ+ÔáÈć{C8Öã~Cņ »íÜ3Í™zi† -CExcF[çÄ›œw;U‡Çw¡\¹;n–ÔÈಆ2sª')=7D ¾bƒ…Äégªe’ߦstdÎ}2ÁI= —dZ–æ9³YùlžÞ±3Ýu€òtN¥òØ‚å©à¡ ö8ÏŸaî`mA¤¡ž²ô“!M.ãåhÚ.oûÙè2[^©E<È;À„ùô D•á~ûëh&“#NñmCÚ$¿"ówÊE%ðAE=èɾ*|ý,￳’ô)Íë?‹±&êwk"¾‚Áà ÿ5R¿²èãÕm þJ–ÌO AY â Ø0اꈰa?wѯäÐI²×Õ ”AýJú4‘(ÀkhÔ8Ã}õòék¹«Ð3H*¿ïÏáŒå³i~Ah‚Íg¼6ÿº:òâIéõî\édb"²U„è»é6†Ý ÎÈmv÷8ïSA…ÇéÅQ˜ƒÅö±:üGÙ3{nÝ)t)…2yPü,™Y4įÒ(AÔ¹ÃW¹w"uTñ° ^ýœêO1¤»*ÕXarZ›cùªääWBɆ€¶f¸­¾é¢¦C¹¹‚T^2þ™8}Ãrýˆcº 88P1ý)Dòès1HÿJZIVä‡]±Ó?ìHÝgKk»k@OêíJàqûº:¾×" ²þ{&~ÔïvcbP{<;þU7|uiƒž2dB˜o£#_W˜åÏ„?î7dH"_slä""gÑ•x—Ñ7O¶GMŽÊ2*~_¬…þEˆ :ÉoÖj&bxdäN_B±¾ŸÈñÔ{Ñ f²£ÖÄzv¤JOÀq…0[Õd%“ýq4SÕ/™ Á†Ë÷;¦Áÿî™¶pþ»ošïùïiš—¶lnè:F:OGM¬šÞ©º³SPq?àKª}-¿ƒ¶¡@bÌ,âðæ\a`WRx˰‘ 8š}9æõ˜ScËt‘Ýfƒ¦²î¨kìîðüz௶C¼¤èj©ÄJqX2»-æ—ÃúƒYƤzÉìd4y¿k€Æ#ñ‘ ™ÍÀàÝ_ð/åm+à‹éàþACxó8Ÿ¤“;ìéÀApŸŽïæ¢áØûÃlÊ ‘ 3…˜_ÝÊöÌî@LšMf œ@1HO2G¡r‰š°§”¾©òÍQÎûùýðqÌ»4vH–5ÏùÒ ó§±YÆoçwÙ­ÜÊŽ Í%ÈØ"Ïò2Öf8îÇÙ„¯µÄk%&TîQlB¨*È÷#-èçÉâžs†`&Z`:Šï½ÐX¿tÌÏóŒŽÉWÓ[fæŸF&ÂS6ŸNÄç&ô·[Ií¡1°Û~¾ÐÀXÞÛÁl:ç°ÈííoJdlÜ/ð ÇêðÑt6ûÌ)¨gÂòü„±#j:QÇÅ*fÃùâ‘#Œ­¹}¤Ï¬Kó«§ôi:+gŒç¾?ÊúQȉ±¬÷i&¾3Öà~Æ™+š%П‰5õŒ5͆©8Z± !‹ÚÄÞ5[½B¬%îYPp_aãñ-%MAÓ±ž¤‹OÓ9ï8éXðœìJŸ5~šÏÂx"ÓC3ÎZ6î ÞÞ5›&'t’Ýô'Cþ©±úÙz–ÄÐ1'÷k4fõp3dïl[;ô>ãzÆxòt00óŒƒ÷ŒñÙhÈ×716|”÷9›f3žŠ3YÂè±û$Ø´±©ãÁ½8D]cÕÆãìÐ L˜¾ÙÞô¯—gAÕzõ,ØdnDcŠã™ YÏd=ã|˜‹ñÆqž¶/Z46P«¤¨À˜ûdqË? LÀTÝ£&W™< 073gOtBÞ|± ÆY¤1’Y:¿e7b¹­%C§Bðm˜XÎÀ ¦Ù<½MDáð(0áÙd‘ϦӑÀ虓™OäHM70ÈïSIüÆ”æéðf:}0¬¯8¦ãLß¼æ9¹2rÔÆfÏ£Å=a1C8?EJÞ—r‡I*ùÍÌWw˜gÊ‚ù`0ÊÒ‰¸þŠïû ¶ á{j>°1pç4S×9¶& ˜õùtƒž¾ (22¡‹GNÊV‡âF6é^ˆÑ‰¹â ™G.WÜ ¡œ*’î»fG‚°ÌmÈgÙ@Èëž5ßÅt®/t¯cc(hâøžŸ¼«mèS.€Ö&? î៭§¹:¿ñ5èm$X‚1ÓÑefgä€ñ-7&HNÇ8Ÿs~™½Ñã1+ÉÒ”+3ÁJMŸÜíÔyƒOР˜Åo·b]Œ=oå½etöx?àL”5'Ùx:¬ÍóØ qXBšÎD̳ô4Ìoú|@½®~žˆ¸» Y0ys÷ ö¸Èø íõ, ³ Ì„há’ýü‚ JR84Õ=$F™šåSN§¨”!ß‚óƒgìȧÀ_dcN«‘ñÕ'¹ÜÈ„žf HŸˆP,@f_ãl0ó¾ÂÄÊ ÑTÈ?M? \Ä/(X><Ð'CuþcƒVËûO’õiÏD´%ýííe Uzzc%Ö¨_Ø Û2'4ß §uÙŒ¡CiôH‡|'š²T…æx©ïýÕéíî¼Ý0ÛÝ}”¸ì˜@22Ða–@lM‹2;–ß·á€IK[êýil4A ”Z³¶ïr: ²³à¿XަuC¤Áùéfµþv>ŒÊê¤wE tm9ÄÇšƒ‹*6ÀÐ;Yƒ¢£©ß#ÈE¤1ÓÛømΨ9®ñUNæ&”»Y³Í£ÈFج~h.²*YmLŠŠÖ7RéÎ}}XK*iiq ï×îAz³YYîPâX)8›°’€A\Y¹›~‡"ÍdüºèxT¾5¶4⢖—ÀÛÖΘ“®l¨³gåÉv õîk–hjš‰ù¸ñ%̲,dN—K0’‡AÔ¡½k8;ª·°s€ô4$æHEt<_®(Ô@ŸatDi–Ñ+óÕ±‹Ðn ˜%‡Áå髬Tc4ƒÐT"Y§c Yå*c‚xµjzó4”êP2Ng á1¥+ˆ7ŒFÛRw} x¸P§f0¾fvåᆠ#(wa,r„P²Í¥uŽ5Ì Ã  ónW~Yí?j°»x²"›†Ž¢e Æ— 1-OûDÜû­y~Â@C„ ì\Ý@òk ãÏ*x :q¿ cN¸{{Ñ= Ïrfml¥Äxz‚f,A2,*mÃÑÚ‡Y}8:ø{1 rÏÉ,^àAÛÜ¡g@ Væá¥ãïâ´v ÞGhc‰ J»ËPë“riˆ¥r b‚œœ_Wk º˜XÞÐlc¬3îžI p`€i¢x'4p HøÔÎÜ Fk‡—MÝTDmvb1³\ãÛàlD¢Þ‡±H] qo-´×Ñ«cUP·£C¼Tùó¶äΡfnkËJñŒ5OŠôµ<žÛGEN8ø{Ûu`Øç¶«èt,VÆAóñJB–a‡¯ >lÔ›œÀFÅþåôÕÀìYòÄôâ|–ôñ)¿üú{[¦?NôÝ—ò'FÒ÷,©£…ã©ñm*@YY}¡¬P‹ããÀé8%s"ŒL l¾Æåïï¯;²´hÕ Ó’ÐÊðZÞæ E5HO·•”3ê7VÖ®®¿]n+;u 깡ë9àm÷cNØQýå[V_ŠÝ…+½rrsOŸ¸›Y%Ž=@ƒ³“Eã.hW?L6kÉ ÀÜŸv™ž ´+Øv”¥ÂùkZ¥/TËÛi['VWz˜‘¹+jmß÷çÃOàO9€÷ô’Ù ©Íë§¹´nú”ØìðûµX–<¡ïò £å¾<-¿œ«w´}:U|—¥TQ¢ Xg¥˜Ä.´õ‘èÉKúSyPîWžs|à ø¾\—4g„N@Þó±(Àµ¶Òqåå¯!¿H¦ã‹|¶«ãË™g[é¹ðv´–·5>Ï9ÀWž@œÎh[ã ]Ÿœ÷ßö,Bع4gpŒY®ž 5ÐéãC£!~g™ø^kýjŠ£Œ-½äØÅ’Øôƒ&ëÒ|†C„< ‡ŒÎg,ëE…,£I¢ŸeÞ‘¿ä}þ“§;]jc唿ÿ€âÖûb‡hgrfíÈØÌïKzåƃŒw&ã–'3Þ{Wý’É!…¦C/JÐ'épq>~Aãß“Àè›ê ï·¹Ù]cÀyšSQõ‚šèÝÌìò¬¤˜e`Paa£ ÇÛj ‘À†_l¦{íü`d=U‡ïÄáÐ\ñ% |uëÌnÝsÂd%¨-òü/MD|ü[Ý®+ˆ±í  ö÷úNFY¾ƒõüR¢Uõ«ÿEÄèùÒŸÁó<&ÒÍÃ峄´g ( ¬äÑo¼¿M t. 0É‘¢9æ±½/+ÑNxÁ F_:ß!äÛòøR’N™Ñ'¶²ý°<¡°Ûs5òŒãQ)eüر.Óói]¾iaõÈ+"ÍX옹ªIÏú . ˆÝŒœ8² élcÁy]Ç’ˆ’«t'Ɖ´ó@ïðùãl±„Wl7åŽ A…­0 ogÓQÿ¡IÖáòƒWå·°ÖÓö뢧ku±%š¯6-’«®Lù„Š¿¢£([£ð= 2^¿Téßα97Õ¨¯KŠD$+v ,-´Î«uÝsaNþ®¢Ph0…/ú„2܃׉•´è«ÙuðïúÝÿ‡êwÿÞU¿ø÷Hýâßcõ»6žDýáß{êw`B+RÉß#ígƒÐÖK$-ƆMè%Áu Y§¸»ÙÅ趉ýÝ.[db–Hg{€jHüwí]Ù¤Œ3ap*ÁŸämv-€Ö¨æPð@d{‚ÎÒu\|A0*?*f[‹!ryéGžº?0™x9}\ ¦ãº?8ËV·j`Á´Û΂êÌ>tÀ7PGæ•k^íH/­ Êý¦F¹ kCMÂ@<‘®ޝãØÇlÏW÷kè€êWžç]Ba÷MâFMµ`#‚k÷™×Ñ6ãS?[,iî—K{•ÊèÓ–åà¡ »<˜¡ ¼y?¬ª •5¶Îö+Ñt`pžöóz]o·zת Ãã±€˜£BW3áae¡W•þ: ¸™Æ!ÊrçÌQÁë#j4éPTA¦ŸŽP7 9­hn\y_Èáq!9OµÅ›ùŽC?oWՉܙ´®L Ñ¢%òÇ»óêHf+ÑÕØmŒ?é5û|5¼ÑaÍk~ã{‰ÿ~ â˜§Æ':“ogŸŽrƒôŸ¦gM.!?šû&/e#ó{=p®ç£Ÿõ+DŠt®¾ŽXI_-É_ÎDÚ8¿òDÝô{Asöxjæ@*ÿù½ÊJpBß8™Š'O&ååuƒáÞ²W1)¿)"zÄ1)ÙÅ¢…ÿU}l®r ‘ëy»ã!Â멹ýÄ&Äê£ka0šCë%ìáei¼Ž¼òÃaöšÔ XGuˆ\`wm 7 gi펀k­r“õ-Ò0\ƒÑ"S¿Xäaë곉  ›îãr/!ZÔ8OÓñŒeŸœgãÆÎ™,©Ýàü7¢5JÎêZ!…&¹Y ¯ 6ÞZó#Þ˜UM@÷î‘ÿ¤-÷d®þÃÇÁ¥[oyz6çõi´ÚWû æ6–ÃÓÓ¿Ò ȧ-ûD똻$µôt&“âþ*ûçÒÌÎÄ}”hÕ ðEq;á0,ÛËËÓà¹ËÁ·«¡Pï&§ó‚î0>sm'ÕÚé—áù°ÛÒ’/t^Z/ٞȟۓ„ëDtÉÕäágù¶³Á'š­öbÀ.ä _¿6 ©!L”g! l™çPÔ À:£yQ„SŒ5®[æ¼ÖxSÍž•#¼ôbBé]kõ5z¼›úŸyTÇ€(:wÓyžš,Š ÏwÆU]q ÎPŒ'Mã0=oJÿH>\í°«)mƒ‡Á‹üZO¨BWt'¿mà~]ð|32椣a‘cy(ާw½›ž^0! @¢Îàlw~¡?ÈÞ¾p-Òs$«Ñ›OÅ©¿ioûyÍSÕpÓ ÏæYãÆ²+VG9rǽâ¬t¤Yz,À0õ³ŒVYíø¸ÑŠR¿j+£OWúbI–ñ¡yQºÙµˆýT÷®dïPI|Áƒz6|®uà© ZCÕC¸&î!’BMÔSÙ‰˜)>&ª<‚qÔí9ÔZ9žô´[êEB´Œv¤«dÕ#ê7Â?3 œOeFˆ¿£%Ór¢xÔxá   ¹/™)XàÅÝ[máјZl64ã2÷´Lüd~¸XÙV —%ožû ù`°#Â/«á×`²òʼn ¥Ü )1”Øžƒä²*²Õn¯Çäã¢h MŽcƒ ƵÙÀC7 T:ðV왳ì5êÖ`òÏ(Ï ŒòóƱïÂ:Ò—I¥H‘x¹+tc¡…Œƒ”²:}*iyË8îºqø#T- Mû­¾UQÏSV ê#Å@l\KûœôÌãô”.¦—.]@!ü\ëȈ’x±Èvðæ²YÍ„¡21ÑöÕùùy»Þ‚Y›Wî]À™o_¾ž4{ˆÀb9œÿqƒe?NDùá¶UŠ«S’Û Œéù÷.¯=Ñ500­cÙ„ƒ‰„¼)ߪþç£5€ _óJÛ*Vîrÿ,cR!Ϩ¼»‰H‚ר|Ñ<¿]8ZíÂÈ…8,N´^^Àù­5<Ìŧ#Í´± [ŒÍ9~&m[ö_ ‡Ua—Ú‡ì<úKñXYPR­¹OÊý‰|Yü =Ô€pµÂH8Šô×Xú+•¬hü¦f(®CÉ3Gûs (iÀG¨®¦isPE³ï×` ¶\ÓA`½Ë™ê|Ý u/ÁQÛ±‰‡`ÆöK¹²o5&M„BC¸ÖR/TÌÆ6TA#«•Ùr2£@FÓéC?‡¤C“Çñ M”îrD*Ëo+0c©+› c ƒzF‚ÒjX %Ƥûìx0ŒÎÍܳÀ›aÀT b³=¿ª¦­áOä“…aW•ùúo¢Rb"-Þ¶;¸#8\W@dÖ#öêpÁ…HŠk¾>þ t¯ãymXØCБYµ³Ëå=égþ”AÇ 0÷„OŽY•Gqúnè‘ùv¦Y®^R€hêê5©øì\ªÙF«Ö$¡´ž¤åÔ…R()Ê N=˜>5ÓƒL¡ÙHwÇò|è“û}Ï턾ÃL‚rÉ6…‘";t ½®XÌ.–c °UœJ‚™½Á‹úÔÊݲµbR…ì¡Ù#˜c™u.páp·lnøJl”ü´aKÁg¡d…³(¾¨úžŽUX”ß ÍB_+æFÕ:ƒ°²Ûtº|H?_®Nßñ¡x—ž"jªù·í²mð;üÈê—:lDùR¸[]’U+¡)p¯ mþÊÃꇶ¿âw¸%x\ß ´®' ñŸC9«xm <_ E1‹‹ ×ß½­Þ+iÔ†AÆ,wÞ±¬\ºÆßjË7OïX@Üçãë¼x™œ˜g³L¤¯¬&,zŒ'€WKñãæ–ýù€Ci)2*p¤?¢P©¬2X× CGüÄVCˆÚò¸S0èdì®3jÙPZ]ÒM8;ÿºë†¢ÁyVÆôüN-^ kœ4ǯ*e­Uð­‘ÂË2ÿ<0a Äðá×ÁRÍ;GB©òχì×Eý,ŠéHcn‡W tbb k¬,ԜϤgCiÍ>#\ÁS>[“ÉWßÌ™žj÷Ÿ8°ŒÅè9P0-Yc|Ü£mÔ·øXhtÞ©²Œ ðåJ.R ®;§S°9¼¦c|,ÐÄͱ!ò­±I'o\»¹p”Ûsá!¸9 Lµ¡Ã4Ûµ ˜d=Š(60A‚uà Ø˜Z ¨F«Ú¼êÖ½Õ‚^\ÍÚ¥lœ°1ýÒ¤OC¾á¹• "´è¨ûF™Ã7ƒ`$í]z¾-ïÒI:Ï´FkŸzJ@ðhÍeÍS2¤;k!wüç;z싯++X^«ÊÆD'ɧö(;JŸÒQM ¾¬ãD¨ /YÌÀ‹B†  5¯Du©JU?À9(é HV¡îå›Y•‰øšÅÇï>N }¹pʦÚìWœîÚ`•ð/¶¨àtä€B±h"hZE2t°U+C[%3˜ ±æ,¦é¥ T›°6y«áÙxy3.h…Úéì3§÷ ¿8¼Âƒ[ ®Ô´rj77Üú‡hNGœ”äïÛò¼Ç†+EUû pòÕtMñ~1SOê—C,]˜ËlòÔiiªh£é'l ÛÐè·l6/_­Ü‘OÙr˜ö‡Ô}¾…YäéyX¬6ÐwzTщՂEê¡ûjõŒM+ 'ÛÓõcïçÈ+<²0E?žÒÿB´‚R¯ÄªPPË] È=ƒ8Õ÷,øãþ\iƒÓÜfiRãt>ŸÎiíêtA .™óZMØÔ×bTͪޫTY±άO‰&©Ü žŒ³YyÄV{µÒ~¸Ý/¨CùMO¡bí—^å·ÙíxÐ7o´ny ©¯ëîAhŒ°á¼ø>(GõnAoI‡ØØ¦ H _Y1xMçB4y¤¦@1vMãc,6K3`0E ]'<›Ðºò‘8»åývjá´oÏ«ƒ³ê9ÁÜœí8¡5ƒˆŒIa¡æƒLM:©ÙšÆ=Ñ×.²V,/‚9Çήˆï„óÓºòhhìjæ@PNž^z“W6bCuploœê-Ó݃ á_À™ñœ‘¼Å×ç ÉÚiµÙ!vð­Ñ"©<9mv»À¿YU…z£ðœ8ééí€ÃÏÕÃDljþã@ó 0§ÍYyÑý=‡'#¿_ùÕíê¼Ór´üÒ7½jõ%ñ‡[0 ôkà©IÝTaq×ðƒz|™í[ûÀ¹Â£Íñ¾<͉ÕáÄÇZÜŸvÐ6Û*ì KLÃ<0Jf¡Ï9ˆ_³ä¡˜#•oQȾŠOYÖ5ê(Ly%·ÿ‹“ÜŸÿG¾˜?ªŒþÏ{°ûlþ%ô¢à_ɯ%Cú»J5ΆùW2£¿þù¼g®cÚ•DÇ%hÿõÿr‡sÔN*û@ë6nèö—öÖóþ•7üwÞÔþEÔž•íÝlO·åùgŽõ§?ûÍòË=àþéÏ'êÃK~1º§P5V¢U,}^«æ}Ñ3ÿ$6È%˜ îàlž=e£ô.ýU—gܺ>¨Qèâqv<Ùž5fËPã--qe³i”R—Üþ/écJŸh?ëKÈÞØíÒïúÇãê]eÍO»ƒŸ«q_¢A'™ý—1 fãáöùY¾p {zܾl÷«Ý-Î ùW&»¼”¨¾†¥±’}aÆ2µ+´DiÇúkÐØkÊ ~6ñ§.ç³’Ñ~€¶²?èCPÌïåCÜ J¡íVï®Cgâ⡉؆`Ny‰øÕoZA­nX%˜ú¤‚B/ƾKtÆd/4/œBLÚn:i‡e0%,ç7‹L¨™K†1ýÕKj‡\·h=cÑ®˜“ÎäüFÎ1éÓár–ÍÒå€Pà"]ÎúsòÛ"ç—䮿øg]Ý8øãVwÜÏFùhºøßfmÙq÷¥dzó~*¦ÏÏ“+ÙÄ.ÝלM5íƒâ!WšV“Ø<[¬LÖ†>R·ãHÈÎ-|çùÌp(=Ò Î¯Ë= 6©-i_›. DÔTk#ABeæ ŸŸg“;³©¯`âb™ºdÈø˜Ëã︉)¢×mIòGìÈOÌüû›ï‚§ø+ØÓþjÈ‹úÝΊóI=«‘v™¯¤ÌÓ̾\ÂÀ?tµuY޹Êr-6Nrfê¢=§? ¢‘c©ÑÞÔmvl‰Aíy™X8܇´Föµš®q¹üÒ£Ù3ž­>ÜRÏ:äÕO*÷{Ÿëžy®eµ9îùÕ¼ÙþpÕ­å8š8êô|r|ÕDܠ̨¿ëùBÝ2ÄÿIà7Ð;k¿)'|hS Híu{ÿϵ½ŽyÙ·Ÿ»ŒÐ2§]{žz“8]ù?ÄÕc˸¯*m¶Õ¸ Æ}S=¾´"ï§ÙMÓnzžn¦ÍíšÎy&Âd°1ïBO&lOËùv#î»–7ü]ºXþåqºèkÎIæf³f¯°>°\UÛÍÕäU·&Æõ( I–·§’y:BÅ.®³š¡ø]‹»ñŠ}í–]Ö&´5y;9ËU´ænà6Í:‚Í”z÷˜ íÿÏÂfX­ú ¼`ð:Wª¾=¿§Ÿ­Áê°ú²ÝmOÛ¢Õ»ØÞAÖ¿ÉF,SkÃ6†3TV:R¿‰ÃÔÆ@ Ìá°góŠzåÔÄÚ8“¢ÔEôÖ|Å15…Š ¨Ÿ¾n×_EJê«ù|Àù¼òÊ¢nåF;Ê@/4¼»²Í•œàæ1sýüó2þ °Xx’ÂâÇéÊqÚ›R«I¹õЍ“›‹âDÝàMŸl¥˜/nˆËÖvá1#¸ðXëz¿ÑžÛÛ3ôÇòwÛuŒ?¶©]éMK?Ôú®qDC~p8†ã$Žù’~‰-ñ1€ô1ANMÖƒƒ´›ÃøIó°nyYÒvä,W™k7úêýÝ|º6·—Dæ¿-·ÒüÔ±_ÒÆk) ר•èêcTõÜO¹|“§|lE ƒ±º¢´[I<÷ZÍÒÈÆ/ªÒ,‰×vP3±Ø«½ö>$ñ°Ï…ÄÒx¡t%¸ÞG®ÙÙ±ü¾ÝGÆ‚m*lÁ‡­ç”>¯Óí}ô½Q4àtV¢ •0{©…ð—)ұɗXÂ×£*°0ÝÒKQÇ«í®Ú•'×'qàüd¶=¸{èý«i¦Iž]"«!â:>“FWW=ó°á*þW÷U×þêT]‰] ÌåQíRw±? à©Ü±ø«ýމÏ2)É\˜®>Ïø†d;‡oí¦ÈgaZ¤â¾^ûXûâ/*¿4΋m}èõê?\à»È0ß\Z¦ØÙMºr.©s.<µ—¸°ç3Dt.V’­Ãáœë_Îåiå\N':ÊÆbsLµDJmè†Ø»Ú8—¼ë@äÅ•öÏÛç 3¿É×ÕÖ9OsÔyqªÙÍžY»—]WSÇ µÍÄ­Ûç .nJ`ã_±%z"uûx›£y¬ qa©å_±‰×üê©8ît;ûD+m¾dî%}û´úæf4æ\E† ôWswò·„X±Xç¢اµ2q.iÕ;.s;æ…Ž»©¼Ð Wª¹ûþ|ø øÌL Ë)¼ñ˜ HlãfÂÖŽIOãþÚ¿4KhJ¨;•f›³ùt1å<&ÀòÙê>ŸÞ.ìæç/·gkÈ7y*”$¬hl_!áëÁü`‘S¢OŒg>Èé.¤5ÉìÆ )êßí–¥fsc3+ ’¹M“¿–£iHôL*Â4¹ŠB„ÜB²»ëÐ7ìð¢†F³ô@3‚[ïâ»íþ[kú@92¦oûvÎÓËÃAÅ|T·oé(fÏ{¤Éf“»QZ{žÅÖÿLÇŸ*ùø~ ìœaq½¹jåiÞYz^xX`ø”.Ÿf޳¼§z CÍ ¹ØYNZã‚ÏòvÔ¿Ëm­9œÜÝq×r( {<^˜À6ÆÊ;€EFÖÖáùôËñ-ºu†©ÞGº8Ð'ÛGá·Vch ¯kê F~³me’Ÿœ_¿Çé3J¿ò´-ÞZåÈYúütþÒÊ*=ΖٸOñ¸÷<½MçÚ{ˆ.¦C޲lç}2#)~Ù-ý›QZÏwši¡ó¡àGKN##d~dÐùe_¹RnÔ$óÙÁy·w•þ[ÓNdÜí7²Tܹ2ô“š[ûØVŸšÂ…ȸ{6¾À•\Œzµ±ØéXcy5Ç~MçÁÕ½ÎîƒËý'ÂMë‡s(~ …íšv{ˆ‡ÖúmxŒX;ß¹vþåµë1‚ïʃ3ÞìP;ÑóR¨¼š×tïHQÇ ¤ÏJx=#5ÃN/M4ê„:‘<Åá¶<ß‘Z|¥nsMÀSÀ¬Æõ5ïïƒ15'ÈbÚW8UPlå )®;ƒžáÓÛ_7úLJƒ˜ˆ:ø£¦){ÍkjhXX_‹õ7‘óó„Š“ÌwÏA±ÛµY ÀÓ÷èâƒt:ÑÔ”¶o\Ûød‡×=‡ÖÍÝ ós÷ük&ßìgØ<ûFÿð¶ÞovWu“ïYÒù¾ý~Þßd–k*‘íeN©ó^ëÆÝÀv«…qø:¾‡µmZÖ®qÛÑXéÚwål{üîTž‘ï«]UÕI^Û©µS§vÝËœk´„dÝÓk‹V…'pƒŸ(Y ㌧â-ýL¨¦×žé3,)Æ·u ?¬ù”:y³;½­c!~ ºœ' /ŽÛÕŽis­¼= ûâÅEˆ<žº*”Y#nŽÅêm>Uèåðæîa¸¼™§ý‡Ù¼«3ù÷§íþ\˜_ÀcV6yLÝØ~ºoyW¨ÌÛÚdéG"û»öÉ]q²œÐØ'àïô=»ƒ'¨˜°£‹p Äüšz—Oú#´Qhµ•§›³È_nµ9ZÁO–rtóSîè_pÔ—Oé<'‡Êì‘/q.óÅu­{Ôg©Í!¿gåþ4Ÿ¥HÑéþsû-ÞÝ+<ÇðNͱÊü¬t~õiž-R"(_ø.ýq"ü Ù]ß/ɧ“a:¬mh\/´0Îç–g.¼QgÄþ8_L‰<¬(Ã<Í«ãú«{Áò´?Ü;÷)¯¥æ¼Žšó6Ôœ·£fp2PDâjSˆõõÛö´¦ÙH·Úý&>ÿ”-È´gýùÂñ”Jw©~½Ù>Õœm²s¹ùëZÃ%¹åŸ›KþÁ,/ðëøVà_à[æg 2»UÙ\öp.Wwâ\µ ýÎÕ†(¯ã\æ×W2ççÍÌçÂg6m^Áµ|ÓÂÈ^KÚ¿F;TgD´»ûÀ3º×³#t>’¡®'ÔËyÓ7ñª]?ž=žUc÷g]†¿ÈE¦®}ËbU}$ü—´”\©1%Ûk¸Ö‘±…'£„6¾vl'/Φgê+Òã./tc­d7 §%#'{©û€¹Ûîú†Š²»ì8%‹ò´Ú¡xÀVÞ"¤³øêd"»·çX¹®ÙK‘ ôìÙÙAp¿n†8Ø®ÅÔ#€ðß‹c)² 7NÎwN®×09žüÐS‘‚K¦‚Ó¹äÚØ:žâtûŸ[äfpñ òÚ,®^e­ùß'-¾«KåÕÄ+zü\¶­‹ºÍMôÍ­y"´)Ý'¥!)`Ô£)¤‘ߥ´õÞ.þ€²u“5Ø‚{Íâ¸aÍÌÇÀ+¦õ³3Hâ63Hšø£Ym¡>•sÂFVUñǸ-ëâq¯ymþR.RçÇ€ÒêýîÖë¶Ù°Þå„·QäFK7·cùNOÆkÝ?ˆ^³gB7•ÿ>·Íå® ;nïn÷‘ çV¦Þmµf½·ìÕí:ym¯ïd×·k+Ôå"™:ͼkÍÒ=øø¨$‚Ú‹ÝÅþã_âet¿Ú|¤sç²{Ý«;¯>Ò¹»ÖƵ¤&eª–”v-³¡äÄÛurYÏ¿¾»EÙºOw~þkŤ¤1AÓ½¨kßܳÓÛ8¾²ßyq:÷ÂÔjF«¾{®¾“+ûÖÔ•«/Ïk‰bÌ€A´ÛU§ãaïÚ.¡XÙGŽ¥[DùÉë<2Õf=™ÇµŠ,½Ö/Þû¼N•º÷Ámn÷GÞü™¬i÷Gòb …W¥ ö‡ìº²ÓŸ è½õñŠ~…lJ»mÝ¥5›ZmÞÿH®¸. XÁ•øk®®ËŒ‰”ÏÝ!ÿv ùißKÒü‘’Ï£tåjÿšËž™ õ8îßÿfY€ÜÁÇmñ½­ðô“2[³Ž~éåÐ /_±™Ä0{=Ǫܯڪ+¿DŸßËo¿Zj­™±ïµÐ¦cï²5ö»‰í߯Ÿ1ôhÔV £µzq܈ò¶Ô¡¡-$Ê„tþqZìGÿMö–.µ÷3KÝùÉ¥¶2ƒë ê½üÀ\ªåd¡(ÛB]Ÿ=3’d™Ï创þä!Ê2ÓøáÒà.7È<hªÛ†Å Lf Éoùš¨ü-i×òå~õ8šNîÚÜ?Dµî¼4î¿W?úù»Ë×8×äËG?wd7¯¼õÓç­Ëz™ÞfËÛl>¦9Mp*e=Øg½:9?Ÿ ú‹Kß»‡™Ä®0[qDÙÒxͧկ éˆãظé'-³3B|¢æ‡ÚÚ{€ôi$”­ªV}že°€1˽¦„³-Ê´iÅr'Ó‚_Œõ¬g»M-nÐÐ/JCñG;²<¯E»È‰ö„Ml_ϯ(:½¹\Áx»7¾I®ó牓NÇœÞó3iõô>+wÛõ{«ÖwÇò|hH`­Ïò‰æbk³€|Šêƒ¦uœ·åQ?‹jÿ–ÍÿõG§ìÜÒçA¡Å†×ê,UM ÍæS™t žÄ×jðuµß»+ }q%gHxh¢ #ÔXÌR·¸+’NT[ï¡Å©¹9W*"i^! ¿1Œ gmö¯]ÌÄXLA›í*±ž½k†é_ŸÔ:N¼N‡ ;íy\Øù'ærÜ—Ð5ÅäŠ)&ÿÌS 릈Rx4Nù¦þNÑ¼Šµ£lÜ씫˜®÷ÏÛ¡‡Õ‘gªT;Sæ2^©ñênÙÿWÓ©~_·k—8Ò3MÝ”ŽçÃÉÙ²é‚iø%_j˜¡¢SkprâDöȈ’ *5rÇO—Ç[C ¦T™ïWfŸMH£ÀÿNoÌÔ"ñÊÕOš~’8¶ÎúÏ}ñõ¼ÿ†Ô™§ÛåŽÙbÙ„WtúÛl:_,÷“CÅѵ!cÑ/î ÷ó•'/”M»;o‘„–K12Í¿~qm´Ý¥&GyÜo×å¦ÈOÇ-cBlÝvB@ðVŠ»‘ùz±‰l£f÷Ó=ôÜ=ü²zž³`ŸCrUpòÑy}Ân}?§ÐŠ2zJQs9œÿlÝú>8ªøR.%ô¸Â+E§ž¡”Š­y*N%2*Òþ‘}‚f®-Ø4›Ì–OébúñÊ ±¨C‡Âöwåú[±aUÙkO³»5QÎMIÁ4wͯ;!¢Z[`)-þGSø|¤õÀ梽‚‡6ÖSàéÓO'2ûFNId'²ùlñü+µ»^Ǫ—„÷õrdHlgÕœ«SùÚø™çÎû/êišøVšílOîÎÝ®.culçÏÎößW»í&6ŒÍNoN÷¢qF5 ðé6viåÙ?–Ï[¶©SÇw‡âxzmÿ¥ñsk˜åâ¢ÆVBoÂÓšyÙ£<Åä׿zq¤ßÿ°XÁ×Av>æ{}ÈÕý¿"&cRË×Õvß_SŽõ+^OÜ¡W¼$׺ý6G‚Ľ$ªI9Ö*«¡L=h›ðU~ÁÆÌqDå cÍEGa1>MI:5‹¡ ë«»[GßÒöÚ˜ yT|wÙ% ­³uó‰Ù|šMÉÌçI•"ÿ§eÊCóÕ›ÍþØôíó;ÍMÅØý‹ýòÒ©Š&ÛXv Å:¼ÆÎ˜\¹0^ý¡¹Æ²zÝ»f|]‡9[ºúg±À’aÆÎedÆ™ßûð—z«Ûä÷íÖ÷œÝ2ƒÑïØ­•‹¬ÞzÈ(ûgÍô ³&­ÕQ·‘ñ‚vVDv—µµ"b6Ô`Et4\oEdTÝÒŠÈh±¥‘Që.¸<Í^+Ó#žd%^u³¯ïD«›™Å/%Je¹ÈYQÍþßÁ¹õ¬T*µ`}jÂß/ijâ…É?a&\$6'“K¼®‘‚9Ûì ¨1Óμ´Çè׊]cù†ÛꛋXâžßŒá½Æ[êz+üîKиþR?çD]ÏÌñý#oö¤¡àB‰÷öít½¤¡ôÀ2OsÈö´ÌgýAú‹+$Q`8޸߾Pi2h0îx»ÙìŠ6¦:DOVbnÂômõ¢©àv…Aýl>Hqþµ±–ŽUi¥Ý·ß-žÁøfÛÎ2á»ãÚ¯=ºÃÃîgb®°¹#*Üy·j ì»YàµÝ޶¯ÛSkzñMí8¾ã²mâ7^û–:#"¾Àÿ€˜;V=£Ý$Ñ~ç÷Š^u*%?wÕD±ù„(K°}$1ºåyúSydt.ïú{œuÊö°¯i*1žš~©ï¹žzW9Ÿç÷Óù¢•Éê÷u?wŽï*AÇ»Úû¼E:â$î/´N4Ùî4ÙJvOgó逈ÎÀŸAùJ¸åkñáÚtdŒfÕÍí±‚úG‡bó_o<¸+³€CÝ¡£°ú;Ø©½a¥ÍsãmU›ôô6/^È¡:¶¯ ÷ßË%†Ìü¢ðj,‘ž¶îk¹ûˆ¼œ˜<¤3ok[$<ÔNóվ¸²@.¾’“µÑsA^_‚/üP >a·®i~±Ú¶ûÂäC¢s"ëFò˧Õî\´.,äŠád;yq«C3žJ–Gûå‡xºß½/Žïý5­tÿXý±Ñµ4’}3=Ÿ¦ÏÓã¦8þq¹²DízÃüÊs×&ýøïéuóá0¥ÉªŒÄ®—®ÝrnK ´NÃ'Kk’C–ä¿Àˆº~§ÏÓ|ú8õäþô_™´qG;GÙ,Iè½Öwg–ó™ñ:º*'icÝ”÷ýúZÿ­Û’ä.Ò¹”òÏ“Áǽ¹È»dj¼—>d½Ä²bã *)ªy6~°=¾¾­ŽÅÜø_Í¿óë|±;”kèõüæQW§ð6Qi»µ"òczèŠÒål:‹÷Û/ÅQ®f×opÉ è3v!Æ~SØ9Åf/8QØføôÍFXEš†.¥›W+K0“Oób÷ܪ~ñ¤¬9¤ñKØ ùAÒì´&V·¥Ø›b(…•Øol†!çÜŠ”è\¾h ¸›iT\’^'dÙ¡¦Ëû솰»Ö-‡mÂ)¹¼.‰ÕOZ8z«ïÔV$É/Ñ05ATA#•"’:pMC©Ä[]7ø`V—Ú°þJ;%ÒÚp”BùÜTÊm(Jöµ<d¿ÖÎ,Jö‘'±ñE·á ùy馸¶0ì‡\åV‚ƒk9Ô%®Ìi’ûùúëuh0œ–µ´Lí÷®vgLíƒv źæãð}[m]EÌêÄz58”æšø rÏïoþø¤©ÝFîf›AE)|C|#N[³É@lVl„v¶Û½=œNã•b ÇoNÆBÖ¨â^$šJ¿¯vg1ö&Ñ8?ÓmߢwrnÝ¢ ׳ÅçeþHËÃCÌ"ýmáæ#Ãû¹¨1X8Þ!ûë]½Rë8¯k¥Ý˜a$ÿòŸ­¢ žo 3uz­<1¶ÎØÑàÁð}£~Á·ÇÕk;?H(¥^×òòü}jYOsò3ܲžtrñ²¤÷ƒ²ü¶-lW\¿EJˆ5w· üvwÉ(»›¤Ãeÿö6›0šûóÏÆ­28œsä²|øéoÆÆ ŽÖ¢#˜ È’ÇÀóØ3i„jßné»ÛëëyÏÝ5EÎ‚Æ ˜õª¾]fµ'd¶£µûƒªâ⤠êÿ~µ‡¸x!áñ£è÷ýÉp”.ý›Qj²¯ãwxlv,ErýHœ[1¥šääuÕ«¨¾¥.ß°éNßîÁo¹ ŸÜlO¯«ƒzi»’/³Ïià(º‹ûƒ³w¿åÊIà·úFΩÓêMaûà#¤ Ë^Ðte 1ÉóüúÉaú­žåàndÏ…áG¸R¢J¾7 × H3îÖ(:ésyŸö‡¶Û¾8ÍÉG\Ÿác±`I+w†ñf×Ê9m9ŽÜu/U`3C«‹dúÛ³îGÎÍ¢<©L,í‰JäA ; ¢ecþ¸ƒöEÒ vñ¤žƒ5?‹5²<Æ”7¥ß¹Š™4¿Ôó‰ZOZ ‹¶ùZºßŒW/,R¶"¨š3Xív_¤øÑ|+À7"YѦ„s©fݨõácܨŒÊ[àê6ö1+ÉÌeÞ½F/V7Z~4¾±Ó$_r;Zñniÿ*¨ól3ÏßkNÒ¢èÒ¨dïV—\@ŽÎçŸFS"_ôãÀ*ÌÙtþµM›3"²§‹åh:}èçÙ0ÕsC1Å@]¼M»«ŠP?ï¾ U+2açg.Ônt—Tã"ñ{ÙÔqŽEóí4›ÜÉ´î>4ÑŠTgÕ£ zÁou¦-¬aA>nëC¿˜œw;E Vƒ¦sqYò•ÓLÃ0mChj\k7ÝRºtV¬|bëoE;Å"›.ÇDÉs´þ˜#áÌ^£a–Ïú‹Á½´qpúþ»­ I¦Ö5UJ‡\ ª+%l,ð¥\+èBÔË÷@G<&"8~ZFöã‰Y NÛdi® üŸlˆ¹›·“zÓÅýœÈbNqåIm4Xýì½énãH¶.úÿ>Æþ‰šhà¢Y¢mmk* ™U}p Ðmó¤$ªI)3]…ýî7æ’A®EZéÊêS®œ11†5¯o©`D¬¹ÈP¥Õ‹SŒ¿©€Ü™RÖSoo¢æ¶€Ä©ÏÊ¡q",jy¿mæëåÃÆ`Ìæ SW nâ¶nú«Õbt»^ñ×Ä›aæ\%<ãÐ )Z}ºK»úšþ5›f²‘„‚Ö¨¡Ÿ•ý…ñŠJ#jÕQØM=®VÚkJ)«å¡ÒJ™û¾·1ˆ@m)À,¡;ƒ> 1¸6…”ª‡iJoÕùj9¦ -$Þƒþx|K-Å3f­ÏITŠ}°c ,lÈ6`a4;Աц¥ÕÈ-ó²pã]²°´Ð´šµì>%B6[R²QÛ½¶l”—ék½ôáåpxc9%FþCé;ð>‘+“£÷´xPêž5»åž†\'ó®Ú{$£Ä‹™øáQ¯©Õ-]“j¬×ÒÓ3Ä7ü+: ަ˜`“Cˆ869¡lèè8¥;`¶77¡‹¹OóM‘¡É°Éªs} ÚYËtHǰh0EŸ)Ñ LÓ¹é¢ûèûç÷oüì [z“þüa¶ð ±q"n5,È?¤ö—p+ݻڒªýºƒñˆ|^Æ­›®Ùñ+ÊÒuß)«Ë•«{õf4½Rßf·œ—©Æ&mLKÜÔê¦Ëkw»N§Ø”½ßŸ bb.'j‘ضËêþ•Çœ úSšjoï9¢ýZIA²×’û«É¥4V•Ù÷Ò;Ø¥~ ƒojFœO„ÁÖßåâ[¸+,ÔÃèºÈhŽ_#­,è—öëº?¦¿Ïî6„e4ðŠo§ß¦!BGŒ¥¬Z%ĆfAíè©þz!›­\þ¸ï¦[lÒCüÜô'Ãn{3¼½²•/fcò¥«tþÈ€yϼ¶¤w,ª˜f)ÍžªàDuS‡qÏ®¾YÚ®bË2è|"b'EoT¦ÄWùzô²dEzût¨¡6fk“óžLqôSvg0MÖè” 8²±ò딬æS^dågiŒ’â+ -Š!ão¼ìÇ "ãI§¸Ã.®­H/ñ¥Æ“+Šûé‚¶ª­E—–ȺPÈ6ïóÕ÷4&$ÓŠá.) dÙŠY°<ù[#£•…o½©XUmÒ¡xð•Ífy©ËÁb4_Í…‡;«³nyaq¬P_pœ_$#)<òk[Î%ÛuÃãK‚}að±”¹O`ƒŠ=Œ»˜fÖ%(<0¦í«‚àN(uoJ·3ìss«¿Ñ”pŠé@DQ»®%—Æ"s: "”_!z“¿Jçϼ`a˜V|Áù`ä£ÚK–P›¨xÖEzïY-ez4.Š‹++–vÊG§êJI„\6±sû…‘í—Ì#è¶òÊ#86ÝŸ~Í—„ËÆ±¾¥$‘ƒÏg6¢û³ G)ÿ8³ÿ_€/–]h*s VDÉ÷sp”Ñÿ­FOÓ]xÜ-/á™Ê«Lzåüùg?óûàLƒ}õU5ÖÞøÉ×>:†çÐߪʭâÖÝŸfáeú{ z"*ÜÛ˜VÂNfÆ›é»ò©¸õ<**! ZOy͆ÞN„NyH\œSß0[ =šàÅùt&}‹÷” =ÀB¾qî{×éýì‚uåI«¿Ñøq+.S4­7¾îó]$ªc.ϱ(ÆC˜${¼ëc¸¥¥3ø?¨ÏÛKõ´™KªÎLà’ã ï74i–ÛúÂ-½xÆ 2³Û«Š 4’$¤FŽ´lë¾O¶ÇÁ‰{í´xïüì’X\[@ÒýìkN“ÆÏÎ78¯²Ãrßa±iERm­‡ ÚªƒT+6Þä̛ݟ~#.xfÖÝûÙmËm‹€•r‘†I‘ƒöó°’BPá*`yÔ&Å(‰HmþìG“‡ß?óšcÿ˜øl :t\킦1Øè8£Y7;‹£hA`9ž˜|”¾×Nãç‘JG(q}wç‚ã“Ûfˆ•­~&ƒ µ£¯FýñÜ»ÿ]RJÈ¢E¥Âe á‘Áñ__„c“C²QVʦsŽM¹©å=Å ðYÿ”9ø{!ñÛ|ÄÂlQìï“‹²þ~8Üçí'‰á‹…¬1t)eAÖ©’øˆªvû&¤Æ®TÔ¬Jí­ Q‹ó×·$ÜRLŒáü}vsʉ´T ©EîÒõŽ~]ÓBE¢œîÃ)~óÞP„*Í·\WX̽`Oö)Øe"OÜ+¹ù—ûèlÜCˆâ¦ÚJ}¶RëËDG 4JgטF’Üņ[i¡vf|ÔVÚ°Hv“J…Žt ޲›û,‡Ìa)WË+¯•쪨™5C)_)횥m4U›®ñ¬¤®ÚGE_×dKrN¥™Æ`m­B!†#7ДÔÝë 9:ŽÙV>r{àJ9¸€¥\3B±´^*žF¾‰»8:ಇª‰ æøÚ IG?ðvÿ³1¹aIÙ©Zë¹’~Ê*•”M™q'ö0å¦IBÈ{¿ ,]¶f·JÅŒ‘é¥ëÕÿnûKo®ƒËuºAv³´"-ÃÓU,g·.l×Q  Ó¨<å‚È7„jO â# Ðr0¾þM"†û«¾2GJ$ê¤Y~-‚f±M3øƒ´O¬"…ã‰(i@”U;âcï',xç}'[lì}zŵ³”i¸ø§“ðåñ¾÷¦DTl&ýù<‡1*$E¶Ï?ù‚Bšßìë®…šB„AúX¯Ö©¡FSåÜˈå|1ú4{÷#VY½c(³BjŒ™†__¥ Bê†ð+rTÜ÷™¦1·´®†H"â|©@Ѩz`K©p6 ãó›*øÓB•ÏR}PÏ–‚C¥{¸ ØÓñ šÝŽg·ñ•å¤+ÃV¢AÇm '‹ÖaâhÉâô¡¼‹Òiº(™P, ³z \®N„Í<_%×鸿m&··¤±[â€*W\¢Åa`p –v»¯ŸÑÊ—™ú2À1HÎqô–ú´Ÿ±àª2ÒÏM¦×Ž»à;*©‰¦Å­x†¢²˜q»±Æ0vñÄX¥ÖÉE£µ+˜dn×Kò„WÞt™ÂHíÕšR• Î:¥ÇÌÅ¢ OD}”šAðàÉûa4â-H¶sñ÷Û'ÔWýçÑû]Iû·ŒÚåpð÷— %ÖâŽ@|Ï#GhÎü‹|J§ÓL1›–CÅIÊoJÙbÌß5pˆÍf§ÉFveÑÇ›ªdºj’DÛYEþ„À­JQ4À’>Çÿ-ðýÒÄ5@ë’i|0v~ËîMúÓþ=«ŸÅ±[2Ƭþ–ùÔï¢xìÿñö™ ¨¬Ñ¿€`ë•’·¹ë¿Š›ô3:å„mI•Z8R»êþÔKMmëO%X®õzJ‘ÖGýñè_Þ†‡›¤îu:*ZF¤äðçQºQáŒë7}"õ*Ÿ©Æë§ å$­ƒ8A´µ®Ä0ü·ÚH[ça~#h¹Gj/šR› 0Ž4úœüäUÁ—ÆÝ¶-pŸÅéË´¦ 3½f¬Y®S§¶_ô7_¬ÝRâ†[YÚ‚ÎB'@UxQ-Û¬á¿/åS ¢š ¢ëc¢©UfʵۗY†¿›YRÅMÊVoGÌXDn¼ÜŒ—ÓÔ&D ˆ3çû»ÉÔ¹ì÷³tkä´“‘°Þj¤ †e€–8TÉŠ=‰ÒV\jxì÷´͉?Nˆ‘‹Ù{ZP˜!»X<8,x%ÌF3Übb€¦ Ýùážuæ£jªÙÂ]¸§Qd…`:~3´,ÑFò³cÒͧE)ç¾HÄï  ¬²RH´“^Ùl—–íZJWtíù, ÝwÍ x7E„ÐÁ(£JCêuárRº(ÍM®Ü{I^5Ïm€€o¬3É}"ŸÈͰͮ¥IÜ>iéô~ V1ŒTq§n»™r*Gt€7³O˜Þd½ò~Ë㑱8±PµÙ­/ƒÉ|3»»[z«M±èÿ k8¾Û¨Í vð‡÷ÐÏxŸXC»Â´Á“ŽÇ<´wôGÀ£ÞÜT¹ñ>޾µn@u8îß&G_tn,1ûUkX›F£s ÔVµ­bå>uºï¸;t¤E5Urám¬Óå¸Å{›GaÔ-ÖÓáìó”ÿ»LÌÛŽHæRcï€ÁtÛ'f±VBb³Óq&…3¬b»˜[ñÃXEûEǯÇÔ ~äãã1bi‰ùŽR"5Æ,_ãðø…n¸fÜ Ú u…ñǧßl¯éÀÑS²›~³Ýrø»itŸßô½uðB?N¶÷T¥Së8Çüç€øDº›þh}q°ü]°K½FQ$£¶‘¼a4t\Ðs‡²Š×¥ÏVÁ, ÖÖtQÁt‘Ñ‘)ÃvË_ÝRÃÐõ塺 lÌÕy.]I{”£‡ºJ–Û(È¡“5¿ê€`äñ%9ö¾™¼yL®ôF2»†–Â]ÐQ^9¤ËLÞ±d”¨EhÇ :Dx7m1:‘óÓ@\½Ï³ÅãhåMþ˺9àC´ßɺ"ºÂì›­æbˆ‚2ª¡l:XÙ\šÏ›ÓWvQªE³ãÖU-èXëcf˜OLæA,%"Ѓ‘ÅÔ¢i h‚GF[%bõ½6½äL( Óm(pšaa*Õd¹#æS¼¦Jò|ˆˆåùS©ÈÊCØ@V¹sÓ¥š-»ßÙ¦H››4% ‘LùúÙ~'›âÀ'ÉÜwë±=²OÎý™Ï‘¨œøÐø‘yDÚ 8"ÙÐE)ìQËöÍ`G¿y ë°ÚàGÙ–—¯VâhÇV¹¢Ö/¹@mýbT½LÖ:mž½rÀøãàv³ž}. 7š¥˜BÞ .Ò±¶Ž>qhðîwd ¸dŒ\GKÔ[å’%mžªtÌožvæ€bŽ£ýí^ Ù¾Š‹› œÿ©¿FʽY…#ƒ¦ÌDIi yJWù$2(sÜK’ébÈëÕï 4½ ðÙž_É#¿ú:–ç(ö_ÉææøÁ=, ¯ å*PìÕk˜|ŠödØ}@/¬ürHÐ4B qhÂä»W‹þtY³X!knõ]é2س"äH•1!ÔPª—À C– D3}zngÃß3RÏ6­=0æÉdHvv·áù. ö;ó®ì6O,ƹÙŲ»LUiì-ݓИøºÓ’ý¼voPŒx1½½¹=Ø%­.MXGßPAÆäàiÊsßÅ ÚH?Œ5ù3bŠ6ÎCXЧ®še¸½«6hz‘‹ixHsi@D#+H"„\xÇ=iO+µè“ì9õâWõXš„ÀÁ¬Þ”®ob©QfÕÖzM:¨V¤, ·ÊÖÿǯ^%„Q-ÁE,)}E±ð*¶¦$CÞ³/ãÓÈû¼™Ý1¬´.q˃jqÍ 1I*6NÈŒuè9U+Ð.p4fº|94¯%!]t€$xÉ”»p†€Õo 2? p±jXÓÙóWé¶) ­JÉ!Y¥6mq'(£.5¨ñ"ºœ‰Ðó“#ÞÍ&sÂJ—ÞåÇòéz¯—ã—åkøÌýíˆ\q².Õ¾ Úš¤eŠÏCîbŨ‚Âç û{ÅÿÜ?î¼ã‹8Ðrgt_óú4ñ…g¬ÎžÙ‡ñGMeZì;EÃgÎoz7º_/xÝ zš³©,4€¹žŸC²ò7…AßÀø¿«¤Îf–1î/—ØôÇèø¾\øðiðƒ¶ s㡨år7îß/sX:—“åË-GÀšªdkT;9äÌsˆ$-¥ÁTz,c\Ø…†"J¦2 ãšH‹D»Ö¨g¨íM¬yÕ~çU‚ÏI‹àLšecZèIt$G¥3WxHEÑcÌ*Ãé _¿ƒŠh\óó–áÓ^Ö«ï^eàìé13 ;ðTðÕ‚3)}¥nÀ§Ë‹0¼ríæeUÆ ¼ b7 ¤kc§ ‘ÔÚ¸…·‡q·Hζ¶îÅbZZ{jËA;ÎÝþ¼ô¹Ä,#¹[ö?’ËÊöd²\ˆÖ&¢;ÝjÁ›IÓqû¶Äí[¢Gl_¢pxF/ÔvëΫHwm`»zß·Á‰>ØÔÔN»rcö&êèÇÁ‹¿}3’” ¶ÑÅnãäû ‰u|I™É·ù4ŒéÜ‘ÍQ'2oÉæ¸˜·e{ܶÏ;²} õæ]Ù¾úÜE³a$0Á­›¼µ‹kí±Ùpë—UÚ¸Öm#þnÝ1’»ÀÖ®‘¸6¾1éÁÆþ÷ 6îÅÓI€áZó±Û¸eo¿6J°õ.´e‚¶þnd ­9%qÚ¸•$¡‘Ç·> ÔETMÖàeXBEmî±àeÈ›ºˆ¦^b‰Û´7½ãMDÓûÄb+·7]ò¦]ØûDá\SâîðŽ‹à%L„yB€Ô±Ë.–Ðÿv80 ÕöÞ(59iÂÈ’@ü-j†‘emØ8‘¬¨ÃÓ-kÓâ§Ø.kÓæÇ×(kÃÈ–D˳·qx4mÙrØjÚݲմ¹´Z¶¶ ·joÂä;‰ioÒãL»l¹ŒüvÚe˽áÏ4¿\›Þr6ë9å=¡ þi6 pMdܘˆuè/¼¾¢ Zø'料ôõ g,ŸGBâ‚ò¨Vj0êÕÓ\ —ƒe6ÚÑqG/Ôè£=k ˜,<Ø©znBV/xõ“hGõü‹ËWs€XiRÒVá/°ÈÎóçcºBNÝ—³T¦‡À‰rîca„°ïÒ»·9a˜«ƒh·wq*ÔÂP”±0Hëg?dƒG1u¥«ÀÅNF4\†«Ðäu°?ÜÓg—YýEóXÒißô²°þ†ªÛu7ö@‘ÙzÊë÷‡¢2»XÓ…ÉÀŒBQ u’, /ûWEò{è/†Ÿ QßV½ÀÑ|­máºN½‚`ôžP[æqIÒº=!"£A׋áh‘‰Ë ½Ý€q·•ç´ZA˜Ô*xâþô÷lbÇ(zõá_¨H›þa×m[ºlú“a·m)Œœ©ó|°öµ–TNÛxûöiéÏ¡¾óÓÖÖu>@=s»¶žäÇ…=-gpKžõã|Fó¼Ò9·„Ù~a‡‹Žt’¥¥uQ‹v†I[@W9š®Ó"D~¤~$'Sfìø–Þ'ÎáíWøž¢ –ñËïœeùw£ñx3ñ&³lX¿á&E1rÁçþ)?XWÒ?“W~4b†Û8k<ÿ¸{oeZvÛº"ÎÅu^~Òt4†Æ:íÌ«ý8é+|¢W¸t ó…¯PÅ9ÓI噆lÐy“ÿ‡Ñ•CzŽÉ9¾0q [?ñ˜íú}«ÍÍÔ~ÿiðâGú"O£ìHšN%_å3éÖ8“võ3ÏÑ~&nÅ3¡EUhÉSU¾aà%SψY'+ZWW®Ü¦CcàÜÒ}tÖk¨ºŸ¼-ùÊ郑ù§näçðüj”br0¾¥— fþèT'æn‚Æ"¦|:)ìe~duŒè~ò·_ht9›—  ‡8>Ò8aÌ»y é$t2Uw&Û×ð¨ [á\“‰ÿ¢®­ŸXªƒƒÉf‘›…sû}ÿm£½1 \û#3 7²S—½®ä" ¼Ê¥‘)^ݪ¼VÜxNƒõ·^\§’PC–Ñ Äè¸óã7c·:@4Œy qJ_æ^¹×¿Vþ÷‰ O—½ ì‚BzH99²à¬.{îÁÂ$¯þñ…w’A*ßvðîæç°_]œgèŽÉ  ("LK€Íº "ü›KÍñ¬?Ü,ŸÜÎÆK!$¶Í ‰ÙóWÂ`ðgÉÓÀ‡LuêtžÄh% íCŠi,Üìytð_pQ‡RrùvxŠö61¤(„,¿…Yª’ÚB”}ÇÜGD™ïwí#ŽšdvÓq«îfË©°›“þt4_û+jc!¿òKÙÑ:ë)ÔÒòky¾{A xkU’¼ ‡ž/ñQËGù-ý*”U±ÛìvÁï¿Yào¼ÝÌ>tnJöá×µ·øÝPþ5yªª+‰öË“¿ 2s±Q/¢B Zó —so@“ûh}æ¥Åi4{^ž‚mèï•ÊWÅ,@-Ôbùƒj:éÚ³·oç Y–ÑÍÈaŒÑPÚVÁzÀž2'ízëÏV¶¬$q€ù ·êW|^ŒÈ›Ͳç@O™P€©TÄ@r0§5ŠŒl×]nvÛÍåºU– Nj½ª¯)µè÷ÛÊ›½aV´ÉÑ§Š¢ùÞZG š\…¦v•Í,¦xèÌš®~ÖlôFâws²\ä_>[ùCøòZé=yRhgHâê ƒÖ‡ñ £eŠ'iˆvzU~éõƒ+[¿#”uW•,çmð0.œo_«ÎÃ{•ùÀ·[û³AÜÕ6³Äæÿ>“?lÉǯ'ËAê[½a[vÁªL!K˜<åj éªÎþ›#óuÑ#CíÈ[aè4¾!µl.q¶ÚmÊGå´¨ü¶Ì+ÞUh¿cMÖ3¯scl+s+¯  iPÒ™#fþ|2´ù %B´ñ ?§=!ÂÈÀ›¯”ÛÂÕØÃ2Y`l£xg‹„± f *fBÝâäL-Û BA®Ìjä¦6*/‡ô,[N³ƒ‹`RTÉ…'Ž:ÐÅÎv±°9ƒ©Y?IœàÔÎÒÒ@·X„ú©œl§¼ 3«‚ŒC¦2k*g2Ó5ô XBw4ö63†Ó”G¡ÚtÛ¥ËÑæs!í¨:~£FA;Š-e¤Fƒ©÷Yj´H'ôçýÛј0-o)/AÎtʺͱOÈOäo†ŽÙ¬áÕ2ZƒaªÃàk¸ †M\í„Ê¥¬Øà®fÇuªsÑ5…-Ó,á7×±¤H¥c ËîW:ÀPÜùì³·à–MÙÝ^˜Cáëþì1"°±x^ Ívm¿ð9Qgc-£Ô©ZfŒ’Ÿååt"4YéÊ hܪ\º1Þ}ã l´Ž ²ÆVÇz«Â²Ó(ðjŸ|•ª(ÓˆÆìý·Ñq=úÈRrÓè8|#×3ÜV,&—šµêÍZøßøež=¢¦½¹FU°Epˆ¾ÊzÕà”k”¦2-òukéÝÔœ³ù‘¥é–D\9žiD”o8j+—þêUžö$zï%>Åað;°G^»¦H¾ê,ß’spP¬‹È°ü}¹ò&5XÅz¤M› î´>†ÿ¾¼®*¸ÖJL•aõ+DFÐM£ÛÃè¢ÍÊxúrV䲿ÛfÝYqÒWÓÊwšNÝY[¸Y­ ¾Ùªù’  `a‹çÏAûÍnqrC—æRh‡“•Zß±/ŠE­20ý—?·~L¨`+¨ï† Tª§ät?Àì+,ô¿ap"Y‚zÑöËèøñ;˜Éû½¹iþb!S1p\çøÍ(. Nu9íÃ-yuó!KŽmuäM¶›—ÕÛi_)í:B ›Gd!ÞÖíAÈL³$äM¦Á¶á<Øüïº?òÎS˜(EàBÁ%äCF‘·žH•°EwO…I‚¤d‰ç ñ$Ûm¸K¤_ƒîÖ€»Ñ:›¨³úËi}‘À€OýŠÀuÀ™Ñ—HsG;ûvÜÎ/öö\ËÊæâ߸=Kû8Ü:¿¢å dëÖ¼´p­uV7Y™É%ŠH!\.¯9ÂT¬EÀƒý¼¥lEsoJaDõ­ÙtiÎbY"™gŸp©G‹ynˆ×·„У½°*—Wë}di‘EMü£ÿ" !Ù†Ü?²×Üϕ͜Çd Ñ%Ñç×龇ÍËñÔ±9–ͧs:ò”7¼ígG„÷øBÒ ~Ë‘00›u³QŽÏÎþ.ð–Á¿/DRN8³ vœõñ«ÜûrIS%Rµºï1Í!Óòk«Ý¾Öàâ›)T ç¬]P¯ÍôÐ ï×5Ñ(zÊÒ:Ï2ˆé[“ªÆR/5 EïxÆChÿà‡À¦z §$4,ÇªÍ Ï¢Û¸žg±pÁHÇ¢¹pÿŒáDT3ÝÖM9ÞMª°j«šÊ(è®|W*‚‡jЯqàëŠ÷XÕ¤¿'ÿBï»qõÙó|fEµo-zÙÇ€Kº’#· Êß?¸Ä”c6تÃùú½ïçà(­ã5£Uè8„KÔ§—1&‡3ÜÔ¼â²;Hv‡cÓ4Vû*£Áö®ìQìü¯koíY5.!ªƒºûð´5À;ÉÀóMEªA3\Œ>y HÉQiæ²¾‹hùÏ>­Ú@~ŒJLmßä £ò ¶]Û6]’Be«xÅ–Ìn%]o­†‘<ÍÔç­UØ%ÅÖëlò –4‘» Ž†¥Ú[xP ¾¼M¼\e´²ƒ Žò„+‹²ù4¿-µÜ Ã!÷"ê÷š®ÁrIÞÐuähcuÙ0¡SÔ·An㤣Ý^U±‡Cÿ8UÕJO÷‡Ùdtw²úµhl&Ú8ñ_ȵiSCüÑ»ÂMæ§ ˜Ù\Î8Ž+RæDÙ¥e>Èý2ï h^bîÏ<%C0ÝfÇýÅá’ºù Œõ)Ú_øZºmDÝ#ñùJÎÔ‚Æ^ ~ëU©\þËr›‹c+Ó€Wü3%•­"\u¦ÒgÄ-©„(¼ÐÂx;a¬µ*Ée Á;? :Õ‘LsD;ž'…6C‚‡2°£o†ÀRày} wÚl~ƒ+Då Øm|E†ÕÚ.«ˆvÚô†±E¢¤J· É|asV1óõï§³åj4ØÜ®ïî¼E¦4©¿ßq AR©^ï-±h˜éˆ^!y‘Ñ L'\é 6µ»ëžHä‘­)ÀµLT]ç"ðóëZHàsf Yù/(ÿpqh±¶¬¯‚‘qgÔMIÝ…Æ¿ ×¢jâÀPyóÅlà-—–H rhŠn´«6™x´œ÷Wƒ²a^èeVûOþqÌ þ÷Ÿ"ˆxõ÷„ÎØÂ¸e¸è©bm×}ù{B d$IóêÁ+öI/ôbûòJ+¢sõȩ̈Ëê5ŽÎgèä\}?ß¶û Ú‡]eKL¿*˜¢~ÃÓߨ;n‰èDD7B–¸#{/ÊÏÖ émUü4ïû)Œ…yâê1Ķ i|¦ º@µaËÆQùŒüæÊl3žã µ²"g½Ê­} ‚«¾(«“}¶Ðls>ä†Ëj—é={°$ÿäï•Í À4È[íÍÓ)yvißb-ΆÀ¬ÁŒ06¶l§&¦Ó$L¶Z#‚zXV- x‡d‡_¸c>„0‘9—T‰¾ì?’4ÐfÑncéà¶ó”5 cÂck‹øÇf‹Ú¬ú¶¼QU65$$‘»R.”¡w0Ñʉ…úº64u1a¨†ó¢ñ>çErîÏ}WÀ|s·¤YÅTÅ h·ýÁã²À‘LÔméKñqV_²íÊXˆW¶¾XŽë *vp±AGÇð¬c›~Ö[Í×ZÁÛÏ;ˆ:1õmh|é&rPw^U!qÚõ§äF m°úÀƒ±P¡ƒá‘-FÉ¡ŸõÝù ÙV‰]+ŒÃj4Ú(õïBÇ*HUR°öŸ1l¡Ë\ól)MŠ8¬öT×**Ýæ¾ßÆž=Á‚ågß9}Šâóq&D¡‘4MÆ×ý13µjƒÖ]·¡7l–[Œi[‘ø f\8–§ÍÝÂóØå÷sÁ‰tðåå …¶n²îÝ_üg¬Ä#ÝŠÌápø/*þJ„RãýÖËþ½Èµ ønW®¥é æ< å3õ¶'d_l6f>_â 8¾Þ݈²‹ +Jë}.&}‰Nj€ù†ñꎅÅelUÁ’$ØQƒPK]EB ϘÂX zM†Ð9°E)°¢‹÷.ÈDá!–5œwýÓh±"zÛŒÅzJN7KoAÏYp¢ÿ=»Uùo2rŸzóu†Èa7dŒM@Ýú"œÐêÊaãð Ø `öå‰`iÑçg"ƒžy®‡( þØ¿»£”æ÷÷[6&Uæ'‹P¡z‘Ðz*¤àbç­ãðH×ÿŽž¸@¹wÚ¸Ð︛=“ÎÔýÑW¶Œ(½*Êâ$2ª~¾`iȤM…Ô,,’žL`Ê5䛢nHjv…t$Q­§ Õ²áµ{ª «LgøÅ_… 3)ƒ .òˆ|ÔS`Ô6iãt ¶ÌDnÌG÷~ÛÌסÍx6xÌ£*X&.Úfv~%zôI0E[Ý;²Ûê¡®õ<ð¿äŸDÃÅö$Û‡äÄdjšE•&^ÒžU" °H:q¾·D(é‡M•ìýD•t¡lcI`µÏ®] ›Úý¬Ü62Îng¹-lÞ.º8Ð{î %·XmN ô*,Éw²¼\Fìê5Lx¹QNkÞ{•° €)JŽ/Ó_ÞC,ím™³ë¢z͉Œxç_öºtóÆÁ1M±Ùæ ªí*ˆá‘&¾f˜tÓ;µ)°d½µý‡¼Îª>zp2¦*ZnjuÍYoËU­PjA=2%Û(V²e¶r‘ï¢ýNÄ6ÜÁÛÍe‚9By¢fZ'—IAá"Õ…–ùL.L|ðc^0Ó-–B~è*i¡ÕXžY †*‘¡¿'؈Ça×ýûßi}¾iÔñ³J ³£¤TÒ½‡9þë ȃE ”¢êÚaÍ4ù%°Á­•n4º)æîºnÕ¾T„b]oº¸® Âð!JÎFdx×E®9úÊ‘XîÉ8]~½F¢¬îm8KrNîÙ|½ùu=[õ7·Œdd7›’™`h4JÔe©z+Ø,’ûµ`î7ˆ#BɸÃ;c—æØ;•ñÙŸ./R»m×2»ƒg*™P¾Ç‘E˜¡ GCñþ£H ÇØ-hYɘӫ¼l~*beVP”Ü©¼‚Ÿ˜ð±Oað-AßÏ뀢ó€,áÊîÖr±yço¬Œ8aÃÔºKª– ½’t@F^k±ˆÔP:¶|/Ø=;–¾9›*×i „Qï{(‰j†B} ?ß0b6¸´h_§&n æâ}§PtáٴݡT%Æw!ͼâÞêj¿äÓƒJ–9æ•5Žâ/Žó°¯ˆO§©B:;0 ·z UmÁ6«àé!ä‚n¯Ö“¤ƒ¬‰9N-{*‡Œ]Q‘wq9î¢oGìÕº *½ U[Åá‹€ëàl~’+e‰!ó×Q¨–Ftmª ›ÎæF- –ÈI݇2ð´×*‹™)-!aMaa‰¢ éˆúOÑb‘=§¤*Gf³Ó¤Xrb<.({| ¨QaGáÖ9ì~*C¶[Ó¹J³£ã‰¬‡IWhÙÀ±‚å;UõÜÿŽžÀ‚Ìé”ï­Œ½Ž¹ ¦>Øßïßt:J «ZÆOΜÑr)vž« ™ÓɹÙ$Ív]§ ƒiì_ŽÛWêÎÔFо×ÑòÇ»3ÕÕãƒR³»µ«¨'ØQ);‘~å^­˜…É!kÞj6:åq¨“h>‡|vmAmÀHªA°K8·©Èh®ÂÀ§Á·šbᵊQíP6ôµ»†“Åö)E“€ë”áˆÝ³gã²2öŽsIÊÞDüJ˜Uwœë…⬤%¯ã´=ô§ |' \îÙs; ŸÂîÕs]К1»œ“oþ‰#Ñtê*5ÄÔ'ü´W%zp-©î:¾è-SÅæçÀPxÈýX YèÌ|•q»Ï·OFd€ôd¤›ìn\¦T°Û±ª¤NU”š'EØŒti·»8\’à‰óÓ6 …|[WüÉß)ë. <™lúŸÆöw(7yP"ERD*x¿ñô™…w—sÓ¤†Uô%8aòÍu®T¾-ç¥îuš8/5‡ðÇ^•«/ÄÌT˜’™ÍÛá5¤”ï‚‹~ùï¬s”^à  ¨uv§æìÒo'"FJüv¢3îKçƒpÁǒÖ8s[i„•ü€y–Áþ¹Ú­oYE•V£Þþ"²mã•ì…#W»D1¥,B ±¡Ì{×QLÉÜgÂôTúÓ¯SÎ-ã£j£1’ʼTöà· J^ÖÀ·Û†û=3¾”Ù>¨p"Wj”Oò(¤eÌ®T½“Î/9>Ó «­âJÕÆþ} rºňß_”CÛã0umd̼0V}™Wh¹âmÁ|”®/ÖÓáìó4/°,ƒþe§\2¢Cyø¹³Yz›þz8Zéв±N»sÂtšõe˜*»µ²ÆÅX:Í¡[«Ð˜D9–ÎÒÞM-|c-)ô·þYHÍ\gÛýÂ+×)D™_];šgZ‰v«*Ñfy¶ä±YŸè¨fÓìÕƒ¶¦ Ô Dwÿ`/Ä,€"»×ѹõÑ (íõÊígE'%)eúñ¶OÃn:mÆE~ÕÂÌ9¢Å%£W±feBîÑn]0 ÒbÏo¹uˆ‘¡W6o5¥=¦óFv‡þ~}« Ü[9£S•5f5ïÊþõ‰¦¹§0™,×óùl±Ê6uÞ°Ÿt«û§Ã*: µ×ý 'ôçðØrÌ€©F­ÔN: ù…ðfê0P$ê0*0ÊQÇA鎟%@HNš÷ï½»þz¼Ú<"aÁ>ø}ë¶M°Ñz;DGYžöáYY]1§|9’ÍýÉgÆ¿öýš±^Eˆ.ƒvÛ`x†=Úí9¨Žê >õv©tܵJ$’PfmšLT ò oGkï„vÚAkG± Ùcê|º`Y*EGñ-á˜LCSð”¸HOïûvIÈwR¼7‘" ?V‘"fñáÉ©`9@á±ÍæËÊÎËW"fíÌžë}öíĪ˜’¸ùDS¡_y¡„µV^nŨ êÑ­Ul%û±pu¡Ç¥7éÏf‹|ý­S¨âèqQ½Ë7¢yTÉ^é˜m @¥ÉäÀ^¦B”÷r ¥Òl\½9Ÿ%“ÓlB0¼Ûè@ÈeSZª”Æ~¸½Z$NPÉØÁo€’™nê˜q¡m4TBH˜àøÍzÆ(\nÚ€i ¦'r@¾ &t÷ér–ÂZÙs®io [©^y³ m˜èµ þ‰ª€¿ áñÒo(]ý¦ ¯¾W± hU QÕÒÉÕä/¶ÙÑx`.ö ä—OÔž—ÙÂÌ7S@XYns)û,½ÁzAs±­ ,]B¨\Xšp•×68HXLó±5eÞÝr4½{…wh¸nv¤8>Ø»pÉN&Bôy-´ff óåÜH„èÏå 1KPàçf„ÇÞàªr¯"æñUזּ$Œ%:’H´ŒŸðù‘EAÀççoº3¹Ñåœzcí«–œqà)u¢Á˜Øq•ÈšLЗ&ËC½*Á]óã5 ‰†¨©FfQåà^‘G’ôã m!ƒ_ÞUl´tXô“¬/Œ˜ü*>åQtE‰)ՀȣX!µ[Tnm¥øÐlâýƒ·`Çð$FÇu`oìUÔk67}+ƒW?<¦.dÁGª•x¿ê¥Ò7njE§óòö9òâÖ šœÅ;z+<ÌÍ&‹ÁƒZ'~ùû*WwrPËU‘E©$,²R[”ú/ºG÷ƒÌàDL¸ÃOàÐzã+ÍUì\çC@Ù­Káª!vW¤§ë¾ýC¸å—¨Ú*Sߢ5P>½›GÑ^ßìÁt¯]ë¥`ÞÔt?¤Ž[ 7ˆšq…•¯æ\Lµ‹qÉÉXIñµ¸~Âz)©-¹~CÑ:„Cø[r5Ò‘[Jµ[RçjrSß±W#\ÖåT»Wc(|-ós¼ƒŠ^íåÚVS¶^ååΉlÍ¢¶¶!PôR†ïj=³ó!O[ÆàRäè˜RT{€ü· ¢bÿ´5DFXì]Cq¢QhB-70–Á¦À?Q£&)€eîÂØ%aŒ'ºèòíÈ®¿¨cëÖ1xŠp(š»‹N¯Y™Ä’yšå‘XþA`ò   6MMIwœû %fgsÿ¬@£°7î*ùË/áIÆ› ¬UÌ!]mnÃP\aú«$‡©h$ S©ÊZÙàM,ev¯Á²XYÃÓZÈetüêïC4㽊¸¼¼œNLH~;-³$"šz·U+°h¬ê·.‰ì½»Ïñn2€‚§uU 0Á…JÚÖŰbC)ÌI¶"¥'sµŠ5kÔΖµœ¢µNû·_/Á%Àe¤ð;1ÿ¾ùuí­= ÎÂþm¹çY¯¥ÅCÛ×PMóâO¾8vºl ®]æ#ÅåüS—ÚR¬³[ «-v.>PÁ\Kr‚Ì&],Ì×Ì …òÉS~%vZBAe ¥¶¤H.Ÿ^´²Cœ<¾ü}¹ò&TžLÓ¿!¯1>aÒnöü9¾äKZZ?D—¸\±S…¸öû0 ˆüÇsÊ›m¸Çñ"QƒÀ¶„"¾¢lpK¶­:•µý=ð-FºR­õódÄ- Ÿg‹Ge_5¯£*@â)p2M1„‚XVöƒ´S€ÃexÃÎME…ÿnI^•%Ú—¢ [na˨ýVÁ‚I_¼­Üƒ2;_·j3”¡G¿W°Èëq|C…‰ÿ]¨üŠ8¸*|ôØÕ½cÈÃ2'«| ð*}Uâ„ðC*föWýÍÐ[£ùj¶HÓ«ù9¶Ÿ·5DFW¶÷Ln”‹ck|¥‹¤AÉG~‹!uÐv}-4ç1xû&ð?P7F¿"`þÙi+α´\ ÁdF=Y¤xn1‹§86r“FÇäì·Á¿OT×%Á›lÞ¨2:Z•†(5"þÕ÷ö·7^ú‘†Œ«Ê• /q \oª”‡ªû›äâ25Ÿ ZI¯âŸé‰MÏ¨ Ä‹(îd;t gÕ# ^*Õƒ8åU*œhá1¤ æ~LاL¸/fô¥g×rÒʯõðìv~ØAqÂP÷ °g¢<¤ ˜X”A·~@¸Œÿ܃ƒ-Ǿ Ñi³¹©™+Mตò~´$ E–(*ªÎÂ1æõß]Ž[áÉ(3ˆ¿þ¯üXZ¿è«i²âyÄTX¸*ñ–ün0þÀwîOa3k‘£ÊpS¡‚«Ü_•wÙ¨P„Õ ,3?•#ø£Û¬³ØÉeO{#êÇرoÏqÝC¬°Þn»Ndè{ŽV?),ï“oGÒò¿`'­•.[ieÜâÍ ?xð6}ŠÛ¯b¾ôÖŽ¿ÞÑr®aD5ŸU†~¯üs´ÀÆÂ úgÚÀÞqŠJÜ$g¤©¹`¾âŠðâœÇÁ×0º q´ƒ²·¨¬ªí‚¸ ¨\ÓÂrÌÝÏvzh&‡˜1dAÕ 1Ù•P¡¶–»j%"؇þfÜ¥¶ÌH,2>šÍBÔí|,3·‰HôJï×\Ö2è‚.¹øËèd†'§–]·r·Ô¬¢{£=Œ½(8êrÞ_ ”ÍR†ïþûƬ>Û]OÏ÷E !£pì®,MÝÆi`—ÉH.>Š[f•5Ìx?ûŠ'ÑŽÁ#®ô¿xÉ ´šñùBßJÃpGÑà5Ø~=Ï£$ E@¦ûwþØ‚×Yf™*Úšapö·¯IAT~äÎX`”ÀóäËè(4Ã:NËöWTÀJÎöýjß>™žÐþÛ?‚Ô1“Pr*¥ÛLØcüvë'áVÊ Äø3_S>Úm90ñe1aª=òα͘çoDr èt™ô‚¿õžL½gsoZwkbßÍïÇh1¯ò4®öÁ˳ÜùñN^„vão–«þtØ_ klÉB¦Àvÿ‘KÔ† ¢KO–Áòÿô½ù1ì~}¤1–"T¢Ûþ[lbžã>ñöí1xC…bþ߉ý_¾ /¢k÷™î7JéÅNûЬw$K’ÝHr5’<Ùí¯wþ/Ú½òí ×JU¥lý=HØd8Æž¶ü¼ÌëéýG}¨¢ê ;ΠE1û¥™3uÛÿß< ±$?GŒ·ÿ¯'^‹`øI‰ßâ¦ûózäâÓ~‹æßbŦßÂiü=ÔB] úN•:{–î09ÉÚU T¸óµMÖ+ï7©ü™)넊x…’¼•×iç¼2Èy¿ÅÿÞkS3T 6ù˜TL½ÝF)ìK:LüE••pU%8dœ{hä}¨Ê1IyÖ–SÐßRO¬ªcÍB»ðªh¢‡;‚’"ÙÝ{+Qx#³OŽÚ'–ÀÒu¤6˜rê@¾Í2›cBþu_xn.µÜܘºà"–VîaÝ-°Ä¿ ÞqGžr¸Lì”*7|8~sé“ÜBfS%¢ÐLX˜ÜÄ¢WUâ,, ÓðÁl2{,ž° ~p‰cB—nßξ´Â¥Y¶#¼È'ßFKØE>+ƒw˜LjÂêµÀÔg©cÝwÕ—QäWá|Y诙ÆC(6ëéh0RSõb4½Ï7çëó¾V¡ujAÜ…G¯3:•*Ø ÄѸKŒûR«´¶Á© þ`/ª gk—¸(4'ú4U—ZeÏto·ðb°Ê² §%à'{çqø•ȶ¢r× å=¶Gåú;ã™AiRDä£úfârÊs"ZA}u9*LnIF£¤‡«óz¬!«œ>ðÊëÀ7ò UÜÕ\‰¿=/@e"]½4+³¥•žpðŸæ·ù UU)² ¦—°O2îF•hÅoÞý„æ²ycþž $L…ü£‚ ñp{Åñ„ÅþÀT†]^fiàX•ÁyòkÆä®GBù1%P”ePÊ2;æn´˜Ð˜ask6ãÍAÔ1¹’ð.ŒßȽ§—Õ{¯(_Qƒ‹©¾ dîEíñÿw9R«ÝÿÛk9î/Ö[x  ÷3ˆ^TGÜû:­¹HÇßbW!uÛàÃZÒûÃOýéÀnî·Fº¨ë_fX ¦Zî„ȺßqHV†r›Ç” {§¨Ö„ŒÄ «rn˜úÿDz¼¡0Å I©P¬(Hå*À‰qò™Ã–\è„ÛÌðH(+yí*eCÜ…¶£6•©fƒŒñiM-êöçÅ}‘ˆ5i›Š1Ü%y•‚.DPêl>üÞ{r… €¯Ô¹µ¿ç…†§Hr†þ r #i¹W …ý­j!sÊýñø¶?x\fjŸÓ²&Ö°éHÌ-•¡ ¤Íz 8ý9“h>‡ g"Mü—¨þ€/¢3+WGÇð?mMü;~Õ þá12?àsì×ðæ?à Š¯á‡‡×^çëâÀN 6’Y¿ýÚõœ¿á§ß3÷oó5VòÖéþ ×_ÀVÿŽGQ|±œößãsL‰¹xš=ß%BÓ ™IíÓ¾ÈTÒîu­ëi{#¬‡”ØSfVHg³¡Zß?ï/ú ˜Â˜?Y‹¡ê‰+J¹X!†ÐHÙô@Dsï{°Å\\…y–ps½† ¿_ÌÖóMÿîn4­~Ï|a]N¸šH½:†})€a ±à‹°Ÿ-À©rö›˜=¤ T9Ú²…,3röÛ)Æ­ÀKFòz„™8€aðty‘øpE<9«è1ôn×÷Öê²Þ÷sìÓQYy«² 7waœœÃQÅÜ@ä;BìñAuÚM¦`_I@Šì) Ø`g"í—×Ï„¢Å?þ¢=¾`gU±ºZÛŠÖB‘‘Ð-,„«7YW†l`ÏÛ¨diÎäÃNƒ€ÆCÊú@7Ð1þz!ÄܨSåÖ-Sµ<zv¾ñª´üR\³ ,ÛéTôDºÖÇðß—@|ÛhW—¿ðùê2jF!šÅ·þö «U­Ê„Áe‚îcŸ¬Ç™ÙAMäÂõ)ž£•,Ä\ãÖY© ½zôV³ÓåNËŒÎOéìžØþ=Øu ª‹>?U“ý²£µ‹ØiÙ°œvßš7IçåíCB!¢#›ÁxDú³yd﬽¹<ËË CÛwßO\+*EDdU‡"˜)lÅÏFgÖ@ Yû(aYì>ÓõTþC5"nÓ½x¦ÛKõAÌ”÷!›žâðIó“¢s´”©·_É"¸²hõùÊK'l5æ.ŒPn‹±¬U;¥á Ã$EÔʦî\ }ÞfG%ÀÃQø ÛÔ7u¦†¢ð8iÏ6g·Îœ÷ûèÉߣ&½±MêÖ™tLÛRé5¯5t·WgÞidh~5÷»µJ¨ìï³×!çÁ·à9,¸¢ÖÛܬ7£³™}UúŽšÖ™uf^FÏgšMóY Qði[7¾ãÔ¬¯þÀbxâtÅr ,ú5Ž./¯\^#¦ŠnGíßÜ|ÏÌM²ÎÜnÔ/DñpÛ_z:]¬ÝÐ^Û(bÅÕ¾ÊìNP#¤=¤<Ön€:7ƒ_^ÌtÑ€e¬K"M«T m—–ÌlW.*DÂ&¼Vý eU§¥E—ä}i\o‚µ²Y,åDG&Zš¥téÄÿ?QŒ²àN£hÙFVl0wEf±NÍDCfÄë4Ëô×­êŒXÄvñq-Ûµ }p‹p ²-ƒ_‚ã6h¢B=Ec£v¤® hzõ¿©›Ðnôо¶“;ÐnˆT:{³•j&2©,ÍÂC@œÃIÏËò­äˆÍvÑMUú®òØÃíhšÍƒÝÀÕ.±sE—W¥ÃK¼Êvc çZ1ÆiàÀKÞx,wâÏÔÊ TÑ‹ÚdžKþg ߤޱ±·\æ’˜uŒò­Ù-ü3J±¥ù[áKl‚ù›“Éh¦K8tºp˜qÈ5)´d¾ o/‰Õa¼ÈŒûh$]øÚùëqÚˆŠ“Œ6^lý-Äw/÷ÑÙèáÀ=>Y'…±Ðå2'?©R:µ”³ÓÁôbÁ‡vŽNòrAßµ|#‚ËAº«ŠIe(⋤pÆb»Û0"WåL«§Y¬¡Eˆä¥Íyy®F ãA$‹ÊBþyAèŸ8¯6®sÛìÝ-¸‚ý­ŸÆ‘×P¹¥pÏZokÕˆD‡Cx&O¶^ø¨Ý¿0Ï˘\‹f/œB^KÂN˜ýó>…{Bµœ J”Ìš)2Zˆ^ÐÍ`¶žæ35†ßzê9`'I«Š‘›²ßUÀ’ƒ¨x„ô 7¨ëïirú¥òÝ4A¡˜õ¨#Rgkñú)—H£´sÁf"SJ½3zœBå s ÊÍ60ÚwaFÔÙÉO¹]>sGGòE»‡€Ã$µzu|æ(*Ä…;ëE»P#¾2´·\¥ÒXœ fvŠòÞT‰¶ÊKO¥U=’{ƒ11&碭iQa®ã d4 ˜Š­S]@0QµäÒ=ÿD$+i”ouQ_±±ÕZqUD•*Dô_ù/ŠS8-ðPŸfÿ«îé'¤û‚¼m‡Á.¤ÑT;†{¦Î½¾/ "¤6:Øë#'…gžt… †³t^PH\ž8OQfÂfI±uâÞxz¿º;zgáXÒy\v9zKCêØê¢îÖ|é­‡³Íªo¿³f˜Ó (© ±¾Dr]ä|ç èGhE?EµAÎ,:È ç¦WÇh®¨ÓÆt{hŠß’1šU±—ˆZ8åqÆ}qpµø¢(YC"T0Êêr¤a9©¼ÖŽÀãä3®§£é}ajëz°0dÝ:3AÝa˜):PÒ4sk€Kó)ŒÏFºã’9×’˜n“àÅoiá­ƒƒOK‹˜Rè1úÇ=­Ù G…TJH?¹` ª¾­Ð!„=£ÓE5?‹µ ¢ñ”`Òe\UZÑ)Ø‘ƒÄUÏ•¢´\œ°åß!¿|‡©€<ùxnP$otdWÊr6.X{˜õ$«%Ë ÏÊçV˜–w>T‰gŸGû}°“³ Ø]ñ”nâÙÞHÀc¶'û}HÁ­ŒBÝPä6nŠå£“jÎÌ1O.WÁ.ïœÃDõ —àÀ{ý1ˆR=§|>­ Ĉ…#ÝSRžÅ]WÁ2 Uxìf§³<9PUcÊLà1Âç ³Åõ!rj—û¹Nu C…QK¯üg ¥â1òßÙ ¸åEÅLCPåù®¸K§òŠR¬J¯ž%*µÿ/L“Ýè‡N7Qs¤¡c¹¾– ¥M[\QtwÚ’£ tÀ–’7îŠì½ÖE3ŒIuàøÜ ö?øò}‹`Š« X¥eU––âYT ÿ…‚…ÇÜ=Îr;øF—„}·ÊNªT|¹r<ÅHÁ[–c-•Q¹yÿ»(ÎÃ%W®å «Â½±ûmºãˆ‚¦]¢ ¹ÆÖÇ õ3¼‰pkðíµ£dÿ ˆÑÆûmµègHR±ÖŒP¼Ïgß,\²qÓxþ¯ ŽFÇ-;4áõä7ˆá+’­]ÛÿìÿX’-Ìçf¥‘"ãù?ÔýêþSwM¼4‰WñÌ©—#îàñšŸÜ¨°ö†(²Åzž)„Dc|°A7Ô'­× z½GÑžv‹ôqkµ¦kžƒJ¤ •c ´™šiæ 8¬I”²®:N(´pÐm_5A(7qN-dÎÇÑqkö‘Õ·4~kv!O˜9=è†uËÕS·òÎɬ¡4Ø]·usóKÉ(êX7[£ 2‡é…ç6¼+ŹU„ü¨€EaÇ€Ãa­ø­*áú˜?K!kr.­¼”J­T“·k‡/–/T¥ÉXç¯ôá±ïóË_×Íþ·rÿeþÕZ~ÒŠŽÏjþK¼sÍò”V³ùf6¥>%qÑ{Ù?îŠ%(»AùÇËfrÁŸúãµ·L›Á¹N“€:ðP`ÛWæÆä¨›1΄ËóÙ ñ˜dd¿çýÄTN»l*ËÞ®o Òjìëósx ÏoFD& ô_„ÍÁû¾}}1ÔSVÙ 9„ˆÿj =¤jß^IÖÎ>!Û:àK/3´ÛäE@Q†sþ^â² ƒ˜úcU‡Í˜ %DPÄYJ{"G`¥Ï¾ÇÇÚ9æ¢>r½ôz\ŠMö¤´t…àvU¥“bX #ˆ^Q°±PBX&­e g@ëcHãM)Z ™ïð^ªáN»d3s!"iΗUÅò5|F+&‚î<²Ýëˆz„·m†Þr°ÍW³E†,e©pÕzžæKh`ø²j ÛÈB£êçfÞAÊŽkа=Çh:ÿá_PÞ °u°\z#&í¯=¾‚e>„_„§6´ú5GþN¢LvÖT ¯·á‘;½‡ù_駸˜þð5ÏÉYBù`Û×ă¦twvÜs¬·½ž©æ¡Yhχ2÷®Ùý/^5 Â•êU9ä†åD6C">ç‘þØ€¼±rBË0êæ–@™¤U²¦Ì,E©¼ÄÚ¹î•ú¤îìb}|i¤a%ÞÑwŒ“7ƒ‰>Îì®6wÙø|ýÁáqûÄðíJ†bÀœÆ»vì.<†Ék°SP½B>|ô>Qõ-MrÒßå Hꄹ)w(ŒÖVa1 ðÛ:Á Et‘€Ç°îÀ’B3©ÏHñ¶i©½„0±a¨”Þ…Í z@hŸÃãÜ[,9`gI·(„`ÏqÖnîú£ñzÁtÈVG© ¼‰°&#«Hù¬;½Në Ö“zKÜma´oßµoÀ`‘Q(RµÌæÖõs¢³;F‚¦Ù©iëÄB¤T:T/×)[O~4¬ÆÚÞ~A—5¥Ã×9ÝjäÆú[Ý_ò̘€Éˆ-‘½mžv'WÏõ ñ–Ú:›ªNé)‡wªþ5üÐG3#ØìRn1¡£…7XÍ8wrLÀŸR'f ±6ÿ¡¨6œöûñpùj8|FhÈ/Ú(JÞ­aSE¯¹¥¢Ëmpøßp@“ͧ‘÷™h@¬h.;8(ëWo[KâÿS#äBgÕ±Rš{jÝóQËíæŒÒ¦öèHßRŸòº1„Â݉Ð*a â 3™BHJI¿ÛÞ oÁŒ|ðŒz§VÒ!ñ§Š¯ ”l*ñŽßOÑÞ;î –õdÜÏîœ)ÿ”졨Û0ßûÛà!Úï Sxw&ý{•ÑÍ…,2Vw8¥o«d Ã:µ'ë8¡qjß$ù†ñXˆD@S@cB&Cœ«Á2?œ$EQM%†¸âd™Ÿ‚+œ,›ƒÆ\ЉFk\´6²> öAñ›- ¯vO›íÓþ„Š© MO¨ò%´¡¿îbÔ©Öñ~‹ªvBšrO8f­ Çøl"ž,wÔÚrÿì9oé`ϱ6âƒÄVü—p‹J&¡m¿ûÊ"؆ì¥,øpû(8p|ßV×X„´{}=F¸(†`›Ñ…|²®ßcëhÅ´PVª>prÂy×IK[îBaHº¬H¹~»ÌÓÌ&"S”1qÔ“1t¢”w‚"ª㛸laEgy§UqΔÔò¼d¯³thªk9‘© À]òzÒŽ¦§Ô¦¡×ÁÕðü1¦k…ä–ï˜ýfsš‘Ý‹¾dÆp¬–È›.G¡Ø8ó0³Bñ3j›=Ël0ã×xÌ] ºfJë)WÓlU@ì"T6||¿·<®ø`èé§Í@³ÙˆÐÿ€n>üøƒØHãjƒ‚–Å0‘Š-É“ÚmT·qxü˜âäÒe½f'†p|áx•æ´¸Õ./OI®+NÌ}hÕ-÷¡()ëUò¡jZÛ‡vÐ$|ñÕïÄG‚óç šŸ¾ÍŠË·”…› Ê¢zœ4“E÷4`Ÿp¸*¼+»,¨°uÑþžCOþ¼“ªŽ›1Pýyn¿FÖÕø> *ï»>†ùƒŒ[]J ¼å6~-GÜ_•õÙ©¢Ç,f“,çÊ$ѽ‹mÝ&¸¡™oŽÖ §X‚{¶º5e`kQœbÓU[½çº ¦:§¨Evë£Ú¯¶âó±Üì%Eȵ6.u»LÒ%‹I˜lÕú•©Ùm:nÆnžrÁ½·„h†íC£µrŸ$Ònͯ‚½iއq,• ‘™|ÊVOÝ)½N¤qȘ $LyK]Õkµ^ŒV¿3kª÷Û*e-¤éT~ò* ÁõËGµêVr¢Ó5+§µo/ÿ6 ’‹½~`"9ÛÄ?îü”ãåcŠñ<ø.·U§%­÷<" z¾}"j/»†+©Kh~Ì‹¾‚È­qø•(V/TèØr 7ãõh¸éOÉ«Õbt»^yË<²ƒ?]â~`4Ûè®?ðÒ~.þQ7Žžc<3L­8x&ÿ·?(dúJ°gt­ s¥Ñ„ZiªbH)KŠ­t©¤3“¼ªTlÿE&²)«rAš_(d‹¼)Qý ÖR\ ¨‚Ql6çÖ­Ùí!†æxÓ¥€ÔITw‘÷]ç·‚ÁA´õœ°Ø·SÀÐ+RnžÐû¡U_ï¢QDhEDYÀChFÚ(‡&1¾6G.\ñM"äpÆxñÈ…åd×Z\1m4û´¹›-Þp3÷¦CšVÅ꟪JT|‹G1Ûc´˜—×-åè:?¶¸. 7Â÷^=,ˆ¸\´g²qêB^qQ·˜–y¹—P¨H¼){ê¶ÂGaYeáçÌ&ó±Ç´CšÓ$"‘ê,œ¢©,„e×7$ìÞ[läLVž¹DÍyÅ ^û!¥›WÅR  M\âS(Õ¸;3à°6ÿUÆ!lƒïÇ46œ¹úmª³3¹BÙ½›™É<àyðè­XÊž4¥ƒRw %Uú´5ä‘Z‰ŒFÿnº£ˆÐ–óÅÀI±˜ÁEš¼L Ú ¹|‘\{cµj_THÖœENhep¦×O>ôüè\àÆ@âÿIÐEòyÍÁdýrM|4oÔ:*Š/Vc‹†êhÎç"s¦á‚…”ù˜#ce ÍÂ[ÎÖ VáÝÌ(6ŠJÙ´‚p—`ii-ù]ä'´¢ø)JÂ3ÒœÆêõ5Q&4ÚÒAÅf¨» yÉÛ¤zn³û ´©Œd§bR[ƒÁß“mR¤Á mõæ Ž6áù5„‡¼’D'1±ð~]ÍL^ª}1Á Ù8’G÷U?‚ Úfµ@¦^¨}ªî.ö±Ky³ú}î!Ÿº {n9ï88ǧcé‚™_*·ªVäL•+ÄšöfV»ž£±Ø¶´l 婨|”M0 50—+"¸å±ÔÆÏ‡D™,ï.û=Í Èx ·®ý¡Ìz~]÷Çô÷ÙùÙâÓhàJY䉞NAOV9ý”b½îƒ RýGóõ¡G×/4é (õZ¥+-–÷>IΰÙAœÃ”óqd–/OVƒ÷Ù0GÖ›CÅ'äÐü!7•Ù¡ ×s5ô‰4Slßô:EL‘>ÓõÒ葟QâsÖø_Õ¯„û¬l_¶ì–“²”eå~0á;çj4ñ2À.ïÕ‡®|µi$Z,œ"å“6’Œ°¼kjP°¶Q°’$%ˆœÖ=ÈϳÅãhåMÒáËÆYÖBdEÎÑŠÑlÔbu~æR¬(+¹ª qøÏQüEbÿru™žáÄÞÚÛ°c²âb®²ŸR¶ ²'Š*÷š°EÃ;~ ãH…%õ ÂÜO’hR›‰0:éd²¶ÛÊ:Åþqì-Q-ŒxÖtÿ›7¿A57À?õ UÀ1[Ež»=4Æ<ÿh‡8aË2¸4Ýí+˜h7“a.·|ö5ˆ÷þ›Žÿ2®A.riáÜEp¾ÄG‘ÊÚþ} ¢mNDèI µê"6Lè½](yå‡{ªÃøÐNö¾s»‡ ½¯ÏQn¨ïòü,Aê°Z:†Îéù¬Èw¶ 2Š’'€mööY5‰ÇþÝõqÿN6fMŒ~Ö&ohbÝ¥Òãþö_öwXÌOôa\ÀñRëH]nÃóc »ïL³jÂÞw °,éÌ}ìçƒÍC:ó ñ´|=¼œö¬Vn'?!´›áz> ¨WDøH­š6Ú9Ê…–”õ´ð/›5¿Ïü†Žšä<)õú{察÷øõ\é:Uå [Á|¶È=Q>šô³‡†‹gþõ}qXK÷eCˆ¢Ø¸âÞ|1£¶Å‚â6:‚¿œ/ÒoZxÔ¼çå£òL²Qäa\ÒÙb[ 0ªDHÝÇi‡¦Pw¤KSç×èÚÝŽÝRxOSñïœ<Ò;ó^Ÿ(0F©£?øÇÝ^Õ]‚©tžÿZž±¦Z´DZš¸ˆƒ[–²8ÛÆ/Ø;ƒÿ$rE»[¯(Qù“¹vnW)Ý2Ě΅+ÃkÄ›µq8ñHM~MÏ©ñ5ÆX cQæ6Þ3Ø á •™µ1·‹¾$+3ˆ'#‡âP}éÇšµ_:P=óà§7MzÒ p·ãöJH¤¿)… ¿= ¬!þe-Fj?VÞ= ²?A@ °šœ0€ áIKÍYS‚)Ôé,{,oOÊ3•Ù‚f÷Ý{ Ó,^ПS_Û®/Âòq®#CÈçŒ|'â9ëY‹1ŠQ´å¸–Û¤ ˆÁkíÝ”¼Ö4³J3\JïC^5|#ë·’™š”ošG6JÈ…,¤1‘Þu§S÷Ói¿ç~ñθ ð{+º ü܄̮®ç4KŽ1.!çJÔrRÈ×ÎvH?nlïVyóïÛÓ+½y1ˆdŠ»åŒœ“Š*|\ˆN6Ñ‘É"úñtºïxÿ¸ÇÜç–-˜xÀ†^f-—?¿ÁÀÁnç¦Sp烴°Ù?mSëJ[æÒjî"A,ÀE£B~ Ñ‘èœ"rÖ…ÜÿA|Lùi>Ø¿Ç7ïàËDàM_ºâ’^åë.ö5–,èô¿Õ_þçÿÉüámGj ÿ9Ʀ4bao(|µèŸfŒ#ÿ#ÜÈ‹Ëq}3è>Ö?ýv€œ0T¼,­>ÜÀõ¨ÖøÛ1¡÷ ”3ƒY~ûñË…ú¾›µ©zz§6N|…TG» ,åEñé± ×IºVç2©J© È‹ s&@†‰àñ’–Â@æAú 2놃U‘ ä#jÖÏÌëàööv}?xð›>QA?yÆ>ëZF/ ®‰Is¸4dkòsUÜ 9¯ŠgÅç\£¡ÿ‰XG½ i'dÙí:ÖåÉÕ…®»tFvGJà(·VÊ‹@˜ýÈsøUµÐ yÙc¡(,n(ãh¾$o{YQ¤©ùüËããdÖ¸:ÒkZ·¯ÄÇšMµ[^]•u¤8]IòFy^ê´4³ŽuÐGÔSL,'³$ËŽÈ„¥Ç!WGºÆ Ÿƒ8vïåãü…q–ìã®,¸ O[é©%Ì3Ú^ùKNäH}‰¿N’€Ã¤òbR-»‰ELªeZQÈ!«ŒvFæ,Íä´™µ¤¨Jx5SOéNý›oüpDXÆjðà-Ò á™~x usGaFøÆê+ *ôöá¶"»ë¸’É÷A”j?»œO—³ up‡Ë»Lw“æÍ‡è€?Û¹#›ãr([²9n‡çmÙ÷ÑóþÍ,šŽ!è­[¼µ‹kÝ6dn¸5_vgþx: nýÝ`Œ`ë]h¨°!†¦ûÉc¶IhfƒZÞwº‹êªM¦±ôùíph6Ì’‚“¦ãöómšFÝÕ¢6ŽQ¼¨MËàÊEmÚ†|XÔ¦cÚmº†jcoÑ3Dp{ ×°·¸Ñ‘Æ©Yzê Ö+Ya)ì²ÜZBƒU¼ïÛ€¡ ^ý¢X‡»4ï.3ÚõlÅnEp]±ÕëåøÅ;\öøé+£‚Ú¦÷¾[¢‰U¼mµ|Š“Þ¾zGôLªþ†’é+L[ãµdZ3 h  ô5v©k[n§ârçQÐŽÁ{Ü%­ŠS2o)j:×6];]š(Ü ?Ø{…µûáŠ)ݼÔJÓ(3lÔX@1m*¦Ž£o(c(m»>pÈ>dK5B• ïæJ™R·µe+[#• Èb±0>ü%9ßÿ â¨Îãýº¿zÃÍ„îß2éÑá)$û§­A°ÚÐ>0ÿÀ1ú]ÚÜôZÀô….) ûðewçViƒ“þ׺^÷å)Ø?=]ðþŒ®v}‡'û\Ê6¬Ô¼ÙªZ¡k”è´Ù6šGbGçÙáË+æ…ñÖØ÷À[OÂŒá}µq,ZéöZÙ@³Su¤ß²šÕ­ÊJçlâÊ”{V3 E0Siµ¥û×Bú‡Q®p†¶XÏWJòNÙM„ƒ ÓÁäY³„Tîu½Ð ¤ta¢. ƒ¹ò‚+KÖä:È•ª›èÑ¥}*ÛG¼&“/2Û`)ùäør:Wqs dpŠGfkRV@åhæY¸ þÊPU}y¯ì‘–ÑÀ"†c‡UkÙLfC´Vy—o K#ÂašfÍ€«0í}…Úp«ë|6îÓœ ä÷¦ð [uœ ‹ä«¤¾8k)¿¥ïElRèGÿìóøðP Ëó(ŠI¥x®Ÿ³j6U°cl±§ð(™ÎV¶|;n_ãèHV¤ c]…&. XÁØ4€ cäú™ 7?L!­Ê­t]œ2Á*9ð'žm”Výè^ªl|á#YÎGÓî—áö;¹Í..Dx™ÓuÍžüã.DmÎ0 “ «Ïj·¸L³@¡Ùñ@¦±èha„ë° ÙÿqJ »4,æqvdÉb¶žo$”MEdûì GQbN}òíCr°.”bÇfô½½¸T7X$¬¾³Ïìï¹²šœ5ÚÕ‚—ayo<ó¡¸Pè÷ðp9ˆ8d — ݵÉaù>ŸiPØ…N W7à†áª`¤=a»LÁ¸ÅxcΛ@Z4ŽK|7¢ýÒŒ™ªŠò»Y²Ë/Þ‹®Ëp…n4ßÌ¢°uC§< ïõ<Þ>¡ãá·ØØ=»4.ÄÀîwç”ï·t*×KVß§$«›ªå‰K5œ‘^$ ¶dÚk²ã~&Ì=îR¹Bqºõ¯X.¹3¥ÅÝKmEÖ|,wÉrì¬ÖA¡ ö\e`³X uz^…Oš LW›Õè6 ó•Dûàl¾kH‡œocfk.à"fRUÁVÑfLöä² öÑq7¾{Æa%òføUÖiÓ§2#Hù¶é‹÷ÏHPJqò1^ûýrëïƒ;¿Hú¶H²I‚ÍÁ "Ír™‹º¦_÷ꜟÝÐ<öJ˜õ|Ü&,¯´~h¡(¾ §( GÉ· 7}u,ÊÝFÞ±Zª+MÍZ$'D”H†?ÒgƸIOC8ô·§0]” QgMýÝÿ¹$çáiK…sB¥ö|0· ÊpýS¸UA¢]ð¥ô¿úáž¹­C¡÷¹pôí%ÜïTe‘Î x:¸Û_’WE2º °Ò2%1‚¼´Ëˆ¥…!q-¡¤$\Köî ¸I¬‡¿Õî’Žnµµ!¬ÀLÒuÆéòP»µ#·.¤5ÓÔ‰Êî SPXrÓxÔH[Ò4–t³í :½QܧiD±Ö¸üÞÇl·I(¬Õmø»TW5_>«T'9[ÓmAò–dîj ;uº¨Ns‰ÜAºtáÞùÉy²Û§÷’tEìHªëy%I¨ŽŽROõWAÙÆu« `®ÜEuÌÞ·]¡[êkÉÍsÐ}-_ÚÅ/ØX.ÜiìÿñÆ`>¢óòå|í6¾ë(R½*LhÞÁ¼7ãˆð—`ï¿ÇMm ¼Ð‰¢—>uua_|º›qnÛ՘ϩÔÉœ ñ}–§ÙêVëfÌxƒîjÌ×nTé¤gÃÈyx${s vt{ FØrÚ˜¾¹½qÜjÝÌÓ@w5Ï©ÒÉ< ¸#íÕ%¿¨GˆàST ç™ðûˆ/²×i€õ h¯Ç 8Å»9i¯"teÚxí÷ƒ·í^5k€œ7maI‚Ùëé|³›6|S¢XKLË@¬¡ g¦“yÏ_ß’è~j !o‚[{ºŒ†"ɨ ·¥Î̽hÞ‚›/ÏÁI´ƒDó“À|Èu±N %k0ùš´þwjg  Â~÷~€v y> ž.//ALû»Ñâ×±è ºÓTb7Yö[ T@PŸÍr4½{ÅÉ´" ¨zÙ!š½n©Žßª†Mb$k»^·"æ‰Î2Î+ÃÕˆ”Þp‹"ÖhÖ0\Yw» @Jºˆâ Y˜® Jº“$zd&·Ú×ZCˆŒ/jB7Ƕ¯ƒ»5ä)i ©¤C†RƧn·VºÐÎ ¿0&î½+èºhCôCƒím¢¹Á×áüLÑG%M‘>MÄøL_Ô.zÑsõ:œË”6—ʦÛIyeÓhMø@íäè8:+´%ÆI¼ÜX:‰ûümy9$r¼{㸵àïûÛõÂû¾%z#¹䯗06~ ü à#„G`8zÈvå!Ïçàp:É lœË @”0¹,1¨UçÆ 2™ì ja²7‹¿Øm®Û¨5 ÿ›£ýŽ1²GãVü®ô¹ôº•zçå¦Ú„Æ_è ÃÖ Ô¨æ¦Ãfƒ CfÎ6†”:’V£ñžÁr'«¯¥ãOV¼Ó#Ñ®wQ ¶ã^eØÔi·œ+Ž™=îÖ;÷!}ÞNû]£å¼ý¾Ío7*¥|·Q”œÕ¼*¥Ì‹ Ö¬3Ÿ–õ”KFp‰a@]ªÒRg‚ ® eæ4Ÿ+â®Ô”§Q1kd3Ÿî3{ì/GCîšÎÅîϧ,)7›Ó,u[}Ò÷ÞÔ[ôÇÆ”óÙlœŸÒ>cÇ)e°ï™Ñß~!SZÂA¼Xª®}&Õjû%8ßúqŠL‹V‘¬O¿Ê¼;=8aœ†BLe&»‹ffŽ9À¥§„iùù¶›:z)wv†ÛÛÐO¤p½ÙÇ”(AYz} bmHQJƒ(_2[“üÿÙ{ÓÞÆ‘lMø¯ î÷´KÈmkR[‰’]ÙƒS¢mÞ”D]’ÊLwaþû;#È Ï!-»ºçÐÕU•¥Xˉ³>Ï“³R©šõ&²ü  H[Ð:AVòÐn_³>_ôÜÄ×Q‹&¶ï¦Ísf®;ŸnC¨Äƒk׎ÈZ"¤M‚è¤ßô°ËbTᔪ Rö]ƒ†LY(Cqè×Û•AKt^.èÞ3ý¶L‡B®èMS\¿ò·¥FEí\|où1löê­æ ÿÖ›òR£fÍS.Ÿ )¡zª¶MÊ'‹dúýâ’ËÑ9í…&¡è0‹%õÐö»`ЀZ,Ô ÙM£&žº·Óò›èÐ`©/÷œÆa·´€Ìrn [Qz‘MÄ7hWñYÖÛá@†Wd‚Á‘ra^t¤Ìæ ƒÞååˆdñØ‹¯*rpæ…ÔåE¤F÷ÞÙ6ÏÍ;ÈæôïFCpÎÇŠe\J¥ ƒEÂNˆvìâ¥`ÖnnnÞUå&Q ´¦¨ž¬YǺëµÀFä– ÑåSÄÌA¯9‰T+ÍèÁŽPgUêÓ þ3Ô:²”2ç×9àÎYU,Õí ò×X ï/&=ì÷)™ºðDŠÄ5Á«l©›˜GDÂCgosÞ“åqÉf1/ï@žbZ©»¡qx62= ÂL¾i—‹¨ª–þИÈ0ŽÓR-æša¦wæÖBb?ô»]TtîéÕ÷(s†Ì4¬ôbd‹N9½ U¤»ZÕ)5ÏYø0Î0„T†=®ZuÌÇ6ÁI$ÿI±a§ãÂô[Ð/IhÀY"¾­‰Ü¢ÏÖ’ØO ä _02ß‘‚xL^Z½þÆ®xµ§R±Ôä·ca àúèpB•Bˆ°¶ ¨ÊJZMÉm‘Aû~&Òdï{‡ûCø1í­Ðî–w‚µJߨiíØQOOq1æ2édõéd̸ œF1åp%š·¢5¨£Ã’~(F’ñTŽ0¸@Z y¡˜² ÁÀ ζâA­±ï¢à,C¥i Á¿dÛ±k—rS´;:?c«W„óÃ?Ä@Ý`·2c? žƒƒÁ¨ #î0Uée"¤ÇçjcD†~ÑÒ\È®SuòÙ>’ˆ‰m¤„{- õ&w6Yî÷§w6™îqõB\­Ô—¢S'ÊHŒ¥æàšª°G« í¡¿å5ø&ÆÄÜ)b¬)Váœ³Ç ¹tHbä¬+€!×êã¼jQ1zˆÛ"‹3¦CÞ^ù/{ÆŠ 3š §Äp¾'[ï¬\ëdUnJj*jíÔa…Ó÷è­p¿«Âò@m:}̵.A[hÐeJ1æ×¯A_|Eœš§0úîGþ¨ ´ûN\Þì˜ÄyÔ…“b2ŽV3C$Š»ðœÂãùàÓ¿ }¹0}rc‘û5[NF~u;™‰˜Í–rò×[¸|DÈx»™OF‹1¥7_嚤 wÕêÍÒ©®S¿ü1K[ÄžVž1²Lô£ šLQJSQßR¬—¢ÅzyÓ«B{©¥¸82R3Ì‘Óä”r†ây(˜¢Ö"Mï‘ÇÉÕª7Я+a»6^p–7±Æ½­ñó"¤Æ¼D[úìzMñ¼òÿKܲJºD#MÂ]x0Ú@ºŸ î•Æ~žÿV¹äZhäì¬4©BÙ¸>r‚@±SUgg•ÊX›Ü3ˆ…ìº?=Ó‘î;Ý.ÎW®_<ûôRVÆöê;«\²8ˇÅÊ1u€Šz‹ªJè¬óŠš”D’Õº¦BE-4Éà(jãGQ¿s£h aÌ¢ÀôØι}¿O"¦í‹œ–ñ‰$‘þ ýŽ»#Æ|±qÕ ²Iï“MZø,Ù¤ÏMzx3]6é§žM¨ M£½¼Óîõ. «à¬IU|Ûu([¶Ø–*+Y¸ÛªÜ<»ƒZ¤©8KÍ&œˆG#ÿÒnpfÚÌIÄ*ÁLƒh~þ¥ÜB òª±»Åj6\[è…51k!d–ÄÏÖµÓÏN, ¢æëú ¶f*ÎHã@v&¤!X˜M@ìCeîcÛ>ðT,vФrŒº2¶uèä'—Âoød;›“S¬^Ä$*“jc&Ѫ8‰Î5´´» Š“aôr‘¢©S+^F;Ÿ?½š‘IÓ°}ÄMÕ#ÿ%"}¯q‡y¢ÖùÑ„„¦I]ð ßï†øŠ¸þçïûK !À'©2s¶áFòŒ!©ºp©8Ç,HžF픫 ·¸4º0Oñˆ¬ ¤¼·ÀÌÖéAØ)íV}[¨ú/¡Äí×é˜ñN…´ «~לt'K°Å"‡2µæ3¯XÝwþ¥´ÜvÒ•ŠÐ!Ò‚_ïs>D£¤Í’™ãY<°LœüüG^bÉ™Úm€lAzB"¸ãò×c_³N; H²ˆè"¸ "¢–8¤‚yýÏyœÓrYð‰s‚¸±M«fÔ¨7ºÊ®êuÚ`µ k±–ý#½ãiŒ´WðZq¸e«‡ü¨@I^—ú¤Qv-ìà'iЦ É[Z,Û¿«(¶:ZRÝ”µf»æ iÊk·æÐ7ÕGfà[ÊLïuÀ\ÀËé$r=úÐÉfô‰¬V_Ë*íßÔy}Ò®Ôêƒà.-jPUDÝ8_Š?®ûPº)¸À‰b4ž”rtïÊ®÷ìE~ƒ§´Â•Hä·MnƒÔm<·-«MuŠ˜‰©®!£'½Zõ¥¬ ¶­Ç'¾û?ɽÄgr_†¼*§×IÝaE¿Sü“½NݲKë4áÚï Ðy×mx€ÞûFèÀ#ô[ï¡ 0¨¹ )±6HÓ Z¸þÑ;¿ €¡¾HÉѲ$JÛ< ©Ó/…ök ª~L.AZ‚ñ•'HóT|°¨b>_ÅA˜Â[¥¨]°síÓB¯EiÌAl¦áÏGf_Õ«¾çf?;="ÓxÐÁÒpðÀ!Ím±všU,ÊrzÕ†÷{ Df{µb…„ÿ¦UÁÏ~Tåä4­fC³ªÝ`ðÜwú­wðÜo8õjæ¶ÝÌ\ÞÞÒPu®«cÌËÄü=÷B§e°ˆ•±+¨Uµb2‡¥=‡Ñ‘h~"í©§^% G+ .Þ¡Š‡pPU𨄠-V0b¯"õ±,öJÛØd˜Â¦ =y‡ïUNÿU<€zYFtÀÐj×,Ç4^ÕØ~yNÖöÓ®zVjÐ}Õ-5èÂÜ´Þ3@ Ùi¼g„>b„Þà=# # j `´º°¼-?6’&½Ý…\\²¼;§Û”UwK7]»{ƒè^æ(õ?'D‡”|ßý‚Q›r[úH“RzMÌgÊÂ(½\›íµ•7®Ê¹Í·¤†Ü%Ör‹jäÉoU¾¨È=§v+ŸôZµªÿ wSôFÛÈvÐÝv«¤ÍÌš¥>Î Öƒ1Ë© bKsÐ rÙ²ê ]µV'Sû¦G³aÂLÌ–Øc¸€vZù =|^´§¸½ºæ‹D7ÿ)Ú¤¥*(|b‘¶tÅhZ¾åITŒmÐΈu_:+–89V¶¶ôŽ‘0ãóFnq®-å„ua*P4’lUÿ%“§°Ý”€~T ¦ ] ßÊÔ•zT³T­…)@ÔQSœÊŸ” é.à×BhzEÖt×vžôþí€)`ÌTãhó TÏnâ祴&0?i£(C-qy¡4Ѹ9БËLrÆK Òª/ö§1©Dõéhên§î<#½(ýê™®¯ˆ6}QÚ´¡¥ “Ä?jAÓíÓb%Ò‰·“µ3Ë¥ƒD`ÑŒ¤†,иÊðtò UÑœ4ÞÞ )®ŽüöÀ• ÙÊ÷Ü«#…eã~µ^¿–ÿ–*ÿ+,Ö!Oàmx )ÒáÁO%3X0ž–¥b«òs’A¼óT+H ¸Þý%Økxy=qŸ^ŸXoB…«ÛÙ”˜w¶û¹6 ÑWëévø85€ñ uà÷Ö(ÉÕÖÄRg_fÎàv8¥À˜õl‡Y¯†sw8¢UÁ*vó§¦ðŒ€4rÝ*K°¯GË(øÁ²í©V5ë5뤼Y»KA’z wÐÚÚO:¶ïgBì}U˜ü2Ñ(wi,÷PçVì]ˆ “8äð§iè&B’mŒ†A56¡¨µÊôèô¡Ns…åo»Úñ² _\’]xôµ0 @»>ÛÅf=Z̰o‹Oi^Åâ—´ä(`Ÿ?f0>¶^8††/©"Ñ”‚3yO„¯æ'ˆ|ò?šR6oðcúÀ&=ùh yö^”Hª)'úJÏ^ ÈS“ Ö¿\ÿð¬½ìµÊ]Do‘öÂk¸1PˆP zk¯ìTkBJ…ój9—B9¤Ÿu_@¸èP”q¿‘€Å°`ÕʦîÔv«Q“*Dõ%ã¿’ûÌÿ•?Öõæ6FoÖ [uDI%Õ½œ©{+J÷@Ãý,]¡,ZŒé /‰bSæ2à°&Ýf«¬Éú˜{ž6+ê}Ò®Âùþ_ËrzI[*­¹da·Yn°T‚•ëÈ÷×ÜμçºnOºVŸ7GªCÅØ>Û£ &’·C(Ö@ø]í×oçT†O¿3ß̶ÝÞÝ]:ô¹y˼¦77RåU”ç± »·E†«0ßù¼+ÀdÑLZ¸Ä;Ò¡±È‘²v£´pA 4‚Eæ#-”‰€iáPLœ  ¦ªŽ¢0©(êK HšÍæÂkÈ#Â'ˆ,›eŒ”® `Àj³eóAXi¨å^¶äÏqý*h3ã >Ò‹šÂR€i“#‘“4‰Õùåï.tËg•6v>›¬9/o¦P·Lst­Ñ4üiqúÙÚHÜUL×Dç-n ëEnpž /{Úyñ Õ‚RѦÞéåÞ?e‹unÚ- €å¿'Êĵ¯0?é+òºÒx=åŽM÷$sšy¿Rä@ßÙ•ùîå|¦-<;Á ñ/Ï“™÷ŸaôèG±L óH›à”irQ¯ýe—Èd¯‰ ÀÏ×Ûåj1ÞŒÖU´”¹Ü„0Ô¬†Í)Ø…{_°Ìª2w­Õkdûabñ¼|}‹ƒw ç!Ö 0%+w>£Î@¤ƒk¢bh«:‰™€×ÒúJùú47FL3\åÔáýšÐFm\Ö“üy‡kæ T“¿ïò;ß«bE«‹»øáGïMC²ªËbÍñž)4«*íw ÊT—ü‰¿Wê¡öŽA ?䋱Ï^ëãî…)’{ Š•˜ƒ—Åп_8‚5· I}PyWŠÎœ™kBݲòG¡úx f:©´y[v\"Üɼýâ”!ÞT•_5€ç|íÓrž„3ÓîR$6d‘—ö.Š{U6–ü9ÑNȳùJ…‰äeËÙåĸfØfÒ*,­ø«j¨Þ¿ˆîèÒ8÷À½gýFQùbwJUKfÚ–¬2oÀíë.˜ö±Žw¿ŸwJ“CÆFX#6Ú Éùïu­7©k¨Ù^R>†2·W$(à]»¯Ás‚œü ªÝQ2,•ýÒUƒº²}]‹Bß4žèNSø•UJj°ËÓ\ˆpìuø“˜©luõuF²ÝÖ?Tæèv‰JûÑb~7¹ß¬†,#ÐR¼/NÔÍà*Î@ÓçªÁ]WÔ¾ÒòP5c0¥ŠBQ€-í÷ m¤u—µ°Øy†<Ÿ¨-鹎‰€O”$is pø©gH’UùŠïqôc|«­Z Q¬ uš _Žç„³]s$ï3jâ­wu#'&ÜÈçÐþÜ”o ýÙfDÊ• CæÒ’†©ãºæËšù˜IHS‡;*ªDšOI"cŦä乯—„ºIc_%[R}!ßïïÑ^y¶u,ÃÆ={§“¿Ççû‹¶œƒÀ;í|uaŠ:)%h^®¨ŒˆÄb°; ù†ÂzÄ8\+Â`Q— „æ~ò3Œ¾gÎ=\3wÖ +¥ìØÏ/GeßãXg¸nÔ1¹igÓpç‚äj¼õ=Uff¿ÝE”öý´{«P)Júxª7g—«CÍZj%:@§^"M ö·ËÑW™gM0(ïÎnƒ0v–núÀUQ¤Ñdá _¦¨óÊú„$³ÎG*/¨7/<¿Ñé@l½œmo .Ç˯̓ºrÜÍ4‹Þä«é£¦v­{ötÜóT9ØÎ1º±*UYqa8!œÓÞȉEÔ E*‹¶BuÞt±ø2t'cÉ·ô‡|*ù4¦©“ïÞ™;«áTk±\,¦Ö>—£åvFžÄá½#µŽ Ö3…ù~æ§)}]5Õ®VÕÔʧ©=ûu¨Ñ#ƒ§Þ)€£¢EPÉðX.Vkµ(V™ÐÀèû.>«;@E¯KN!ݤùb¾$óóÙq O¨òÖÛ}×\Œp`ŸuËz³£!Ld ;Y~žz‡~F‘-;%ªÈë蛼§¬=UcïÉ9<16%¹Kƒ÷.šè‘¹{µpỺ$Ÿ)ñh$*ã„z°²&H  £yóœ,ú6^½à„E¾$íèÝ{3A^bʈƑ¥ùß‚s9œ2á™÷+]c:ÿÔ¬oµÀaÒzFæ@^½Xü0‹_R†]aœ¨]ãw±LÆÕÂ9$åB³~cÍ&rÑf5Y%£§ôï‹;òg«ÇIH˜ ˆô¹Êšó¾27·_“õ3 vòÓô8˜ú0q¸eH/—m£€[2ÃQF,HJ^¦dsrEÉ9`W_m.î²ÚdqîUÙùÁé5D-\PŸJaû{A ‘d;œ“¿ÖëÕäv³v\é-ûSz|¢àÛ%áš,(.Á^Ó6R÷Š1(‡0´/YõTÆÇ#Šœ*èZ³ádêN‰Ú:"ÏÆZ³\©kü)äIpˆ!9@!·A%?´ÀH!Ulú#yàTB@8Hþ[Æêûø{ AQv9YKr²™}ä:÷ šÒÌ8$÷¯«ÕRàâ×ÍBÆfB–üðF[üd¤;V°ìópïOâɉ&Ú³Í*`Ô¦¿£y¤V±Qð;6áuÈØ8p’£B$ƒ{XßòãìœeæñO3â-ñ•W ,‚¤¿Ö ?: ¥ôº¼x…3ìÖrYÏö-;¨hS„þŠ'ºvÇ.q¹PñÒCKvö(á«Ð®ïå˜9³Åêëv8%†GžÇŽ;ZM–ëÅ*kcÆêdàÄN…Tjî!•ÉÔ|ÑE£´R”jÁü+5£ô#ÔÀ͵š·hºXmo‡®cj"£ðF²Ì…b¿ž‹Û㟱Ÿkæ=:_Ä,¦È~ y WÃíd6¼7R í‘?8Ü¿ctœLÒ™L†OC+çÎY9sÎN’ª\ã7²õÁ.­”‹1J³Ý‹ôìGþi—ž„f@±4X4›ŽŸåÌ”M£%û}Ôf`zYó‘P—S´á¢KÒ jECP~™eù%ºá$:ë‰îPÙ8”"Í„?òi(º{Óû-ûJ9Õ#ãÁ”dkÚŒ:ìUsZ§Þ9F±ººçà$ïdo±ÒƒÃ•}i³v ÙÏÍŸ¦7+C²vD…ÉÑq7Kêã+”¡Îjr7¡!BzGRÈL¥<=úK¢÷ÏÔƒË~œðK’g³áx¼bÉ,¹[éœö^]­èÒÌ×0õ{ƒ–5ë,Å|1ΤVìóx>áŸð©ÿœŒ^ƒÃåÍ žÕî‚—×´3Ø+ïYZéçà´ ÛRv»ƒFÁRÞç_ȽÏ©6R侫²rðr²_ËܼâÇkÿx>È"âŠåË–ôêïWá…¬NRß]N;aè•Q‹ý?Öo*354Öc5GòŽhh?h,Xæ]&>ò˜Z–ç½p¡õsoˆ˜I§¢†9~ºW4cØ _hqRˆÕ™”µ®ÞÆÙl1u‘Ô±¢×}4tòzÍ ¿zed™g '–pÓN z\Ðçf3#žìv²ZæÚÆqJã>Adu1uúMêîÊ)´Z®MMèƒÿQà©!bWnQsÛ†÷“ù=Û«\g¼¡ø(Øâ×c†mê¯4 %¾¤B8}zÖo¶·¢ÓÈþ®SðXè_)Ýã‘°'*GB¾QÔÞ“¼iÅâHµg8óBÓ¬­½H….ÑäEäVN|U¯ `ý^¥¸•B³Zò|Ó…){ÑŒÓk~öçËùì7 à—ØøLoþ’r0åX„ ÛlSú)^Õ¢a`?N̘ †]gx~D¥05`æ÷Ý÷¢jÇ‚Ÿ/~žD¢>\Ø\¬$BÇÅå&6Ÿdz,Ñ­•¯‘´Bi³jÂŒÈËYù.}ïû&6"S`<¶ŠÊÂiÈÙ7+ÃXX¿‰ÙÄJê^Õ$ë˜ëðÖgÂÃ×Ê·‹£ƒÙ—çnnÆû†?ý¼²×n%šˆ»SàG‘ÕÚB§•Þ¸¼K‰ü@ËBÀØw5œt"ˆpwcsóšs®&Q Ê™À€Ï£'C[ ÜÅcàÿLÂâÀÿkûw;­fVWi)¤ÿ¬ýY;•ßúïÙßulªO§Ýû­ð¦Ê" ž:•sTø¦*”Ñ„yŽĸÀpúH£Lýoócw2ñ•ÏCn¢+;Õð0ñXXèhпyWJÒcMÍkÍ›P¼ÿ)Ÿr8Vþ1üáD2½ˆ‰| –Ø*<¢» `³þ*®ïûÎË>éïÕÒ2$„NWVˆ¸'¦p(T#dRÆlFgé"³1¦!*.P5Ÿ“=þºcÞ‚ÔÕmwû¿¶Þ> WcŠÑ`tÃëD‘B±Ÿ†h„¾vã –uÜ!V°žß'•€Žœ2}ëCßÔš¥ì} Jaù˜Íj}ïæØâA=Ô 7¶Ak‘ã)„A ,wrê ܸv&³^-Ìoe”7>¤°»ÈŸé3¯ÔT†_ëb7kï†Ï ­¼Ja˜à5·~~·Öø€)›Mëg7ê «×eFÓõ\÷v)QÔõk^x DãC(†¬CG:«üúX?º3¨OBÇŸd© ©ç˜fK™aö겤]ë\/N>~àë½DMüÚ@²?ÆÝº#‡‰pi|ê]^Gù þ›¯xã>XŒ<”<¬Q_£kÕw“í0Ÿ"ËM^®ë…ÌôR×¹êéî]o§ÙñÖüi5…‰ ~þ_ðJQ·Áâtxûd•“+ú g³þ¨Í϶^>JvXn“»¸[çLÕɉŠq”]á­¯ñÒ¨`€ÔR®ù,ËÁõÐÊRõï—¹"¿ú;ž’VûßL%(ŠÁw¬u=«î3eËæVËP¬ýTÿ¿pÜÝË·˜ó'+ UÞÍî_ónöþõ•nËá¦îz8[g›»ã—ºþÔGlv‰“[ÿ~~œéñ÷CùoöPÖ{(þЇÒvÏVù;É="aXã¿£/øoçÑçjŠx×·ýõè þ­]ß×ózþŽïŒ“E¯Ñ…— × 7íïhUÊ{Vòq‘ÑÜp~pza¸tÈQ¯NÌFû;j­–—èû0_îyÈýô÷w‡Küú‘ΙüÀ´¬·v“¥]yÄŠ©õ„o.„ÏŽÌâ4:„1r`«‹³9¨80-“ðãt™¢þ‰ßÛF)¦óË—°Ð²jÍ›ŠC‹ºg†ƒÛS»âÔ¯5.õ•/)$bc5‰–U‰i5*ޝ`U>&Û(—œÁ!Ç‘±Vd Ÿ2z¥ ^¸UíÔr"æÇ”Ù­T:<#üc´Šœ*, P«åzúp^ §Yû…kÙûïqÙöª£œSë÷­íZöNA–èÅ{ò€©¢2—qk„ä¥=Ó'ènáVÕGÕ•à´G’«¾<”V•àÖºu„‚Ó[‹v´¬’±UU4>yq]±À!Ú­EÎÌÍʱXóðƒ ²w…Ž?îÛuÅVíåu%uÒ``‚^ê¨'O‘á‘°ZFÊþ©…‡`f³© 0i2Ídý[¿…oGËdJ¶À}71c †N\S_ŽG“é]Wõ¸?ç©pƒUËr‡LhÐÖÕÍ@kQ^V¡m]ýöÚk*«ù¯S€H¡ÄÃÈ9íÓBúV=Ú©Uo‰°²vgOÇðOî4Û­w<½Ê£§ÊJ^©úãp„wÜŽ¢G)¾¼yØ!C–í­šò=óMD›ðCTj`æAÂ`ÿZJ\ú7ƒžx"P1hv¥0ˤ¬çÇk¾Ô®=î’‹wxŠ5ÜÇ´ÈÃ-â5Ÿ’²²QÑPÕØ'†(UðÌIAËîü Ö±üõæ«’Sô7Uþ,VÝ þàEû;ïrH4*nHK Èë(8¦ÄÍÍ‚;ƒb <…Ñwv 4U¡@!È·ì @Ƴ_ Çê=„‘­L½";³ EÈOÁz¾Dç0Öd[0žx€©M¤ô¨>jËK+öp|©äd=¹yŒÕ“óëì1BdÔ*çzI›*HBÐ>m²Œ‚”M\ê¬Ðòçw TsÍ&‹~ô*I'±øæU4"?—‰üZت©jƒ¨Y"L¯®¯Ú¾ £OEÈÇD¬èYD%ßç•8sÕ\¯Þn¡·;DVP¢¿ð*•é³pÿ“:"ÉÖû õÍšÐvß;Œñz¥øÊUë;§|§ˆÌÈûëã0šG w}l®Ó@G<úÕüýj X#Ò6êã‘*ZÂUß¾º±l­þW÷rM]© 0@TM-ÄݾÚéÈ¡dmÕ/.þàGoë$(ÍV]æV”ú'À ~±A u{7¿ay{=+ÐQ¯“Eðíf×M}ÚïúE Éd·Rõq`â¬r›'½k%O=¦BêG×®;uëUúWˆìÚk†»5SŒ™aQ!ÄzM˜ª.Vkt·[ ½?±×ø÷j&ìïÑd·{l¢ëÕ2̳ªéG”ÞUcXœŸŽš…è䜶5 ݺ©‘ž“zØ+äR`sQN¯~„”#më©nWÍY h}2éКŽÒªš2»’à|ð 6ß±•D‰Å©Ú¨× l“!«åà\' BÆ‚Õøkõk{•¸hϱÂÃa‰®Øœ vûzu?T'v)¢Q‹½ÚÙbωº©÷tUMª÷L©äq„O.CÇŸ¼ë¡±1[ïɺêÔ¶ýž ¶zõ¹þ·ÏÂí²\îéb~ŸIÿÛÚýÛ8ýïbœ¶µÀT nÝ´­8¼ \ÿáÍÌ]÷A{O$ú÷=ëW>+UwŒ¦N ߯•Á»»  ,˜R›¹Ì'{°ø5½–uˆqm· ’ÖsOZ¡NCµ<œÝÈqóPEuD,9D¤Š+_ÄÆÒÔƒÿ´ ø¶ô(‘¥×'1e9€1.¾ ˜ÇäAt²˜|ö{ÊM!Á¥É—l¦ìöcU²ÃhÖ}Èóòq~ ?â A»×@'0ªCaßvŒ^‘Cb6“\.=Lú‰Ä'§€Zd –ŒSð`äÛ‘wþ–;(ºàÏßœ@„nš¶´õèÅy¨:3…ÈmÎZÑ„öÌí’ŒÀ`bO¦‹µA( æ³Ðt›!å[r!'À´?ùåçá‰SÊ?À6¡„á'}¾˜'+¢þYϼÌê+•Ÿð•õb EØÞÚW*ëÀ‡Ÿ³YʨŽ(oF­¡KZò,e°µ­4…’´½äsHµ_Þ“÷_^šlÜ'©Òsý‘åÆ×ˆHÜ\ e£‚ïj`ŒðD4q•ÞÖ 0 P­wª‡Îönå8Ûüuú !úêѧüEþ ¼ÄèÁÛW8]¶Åg/r21¶É…¶§Ë ãT=B/§(ªÄ¿–™Ìvø8Ý®‡·\¼§†û­wðN;Êî&:í·A kLf쟓×ÅóZlPŸ˜T-¾¼÷é/`·N:íD=¡u”¹¸÷O~ì8*àÁ?JM Sóf Þ‡8Ó©çÚî¾çJlǫɣ³JI²ÇÃõ0Cä:Üý×…<»’UZ1$/× ycZ¤È¢•ÔR‰‡D»:ž%IMß0ͱµ±\«±¾QÖŸ—JV™°{Ùí|χn5j4tÏþŽØO”…¼ÀUØÇS¼Îõ÷b¡9³t^"Ý*,øxX³üÆDý§ëžN\ëU; º(lÚ·þÿ€1õ§¡·±Ö ›Îí[RXábi¶8ÓYóˆlŒ«2È ƒr´Ñ"ˆÜ m¼¬@[Ëb÷1æÀ7=츅ƒB‡Lê V2@6¾½ì¾ûŠ IP‚–’e®¼ ö'Ñq‚ÞΡI£¿1®˜Å};í^£ðüÓçÌ*rAÀ[G^1ÊÇ¢f: 6ä <²R{)ƒºp‹ƒ¼X ó†ú;Ô\@÷Ó#y™Ÿßf"¤Ý¥!Íûåýë‹Óìb+F¶Ëá½3Þ.‹iJ¯ÞHËFø±å¿ZÜùçAÉÄ¿ #£5ÆMb‰%fŠvÊê¾-·nÆ9ˆùÎêDÃö†i"N ª†R=4ªlÀv8¢<µÊ6²¤IÁj¢BOª¾¹l•zb;X y©%¡UN0‹3‹9\WÉ/˜¹nƉkZd°›¥ò‰–¶ßö¿!7gûà ÇÎJcè`hs’ÙÇ\'4Â"Í&P:D5|ã );ÏÕNÎIÄRÒ˜N£J,£8 av:xw§Ô‡­€J¯9Û©`!äWÈ%ÏäÔ) ²1’U98¦š:å‹ÀWñÝ¢k2§F¾(J)0ž šº&¶ŒúL½;¸22wOöhtÉX\âǬx+[w9q_r#u7ðj´´Ä6¾XYƒ-lCQjm Ý×h%6Ár¾ü~ ïö   ð¦m—îv´Ülß,ÖÃí-Ë5È: ‰ôô#®÷ð ºæï.§Øý?mÉÿÓïá¿ÿÿ!þõÿäû2ç(,öÅíÿvFëÿ?ûEþ!;_;çu¹OË û7 H=µ`­úb«ŠTÕFjý>¨ì1À4÷Ü…&º¦C¬3©ƒ òÖè~è!¿}' c¯ë K,Uq€ÜJ¥(zFöB·e/dñ÷þ¢†¿s®{`’j±–LCã=e c?’гÔÎåîŽñš<øR;Îe`½+ ^ú¿þ "O´¸âŠ% W쮤7;('€íøçÑ**±æ„šµæG€±C³‚¨ÿ!8  :¬¦Ly‚¥S–è ¿ÒK ƒÃ¶¦BÒ.€t>œQÈdélGäNRêðáŠüÙÚY¹&¬@ݧqIé]’þ3Ťޱð’èh‡Å¾±Éé1LöÌŒÊ'ú“‘uDràó4½`¿ ξ«QÒ`qIÌy>BŠã. Œ9ðb%Ͱ>eÛ¿Ûß7ÎÆpÑNX%ž˜**xF >è›9åÄ´9Sgý´X}ÙN4i›ð-Ñ \ ­üóámIó”h+ųv;õO/É+JäŒFKÞ~ÈgÜxÏlŒÞÒY P¡÷ùÔeYéêµÒ°i<"ŽùLÄÖ×qã,(ž‘ÙMÕis v¤›‘Lq’}U36¿ž»k•#›é*KH L¤ç1ïø¶­èz»žÜší0"SäEo¬ì'ßïÔYNç×ÎgùfR§u$瑳dïÕʹ'_¸Š-Vã¼N`¹¶µj3]ÿðŒRåZåÐÝwìChí`ˆÜ•Z`×äEæ>ªuð­v‘Ù£Iïj—ŠÄ„CЧG°èø€O†ý¨”VPj›籉ž±£¨«ÝÀª“±QàK­mJñZ6¥×©r§¡ç±3Ðöà òÍËþ:wõP-2w a¹\P«ê·‰GÉ·Ãõz5¹Ý¬׬˜&˜ÞQ‡8}ZAÝŽùýTÆ)hFerQsÌXabEë…?vŠŠ<öã]œ…aRS¼ó®~¿xò·Å3U>‚_ýA³m–°hðt5J‘k¢mZ™ÏͲn#¸Õ¶6`6 ¿ù*eµW¤kÿ‹ojÚ•öép´Oœˆ0F‚-#Çš¬¿nß §ôï‹;òg«ÇÉÈ©tÚxT§¬·b©À ¸¼ ¯eŒ}Ú½HxiÃýc‡´¥©0E,mpi‘)ÏSOuA±m‰r¤ó+Ë1Ò&]adÙ³ˆd ±%ÐsŠÑX¨È‹)”–²÷ŽÀ/5·›•¤}ö› “†êàdä5–mmÙ*™{÷è.>JgÒBâï•ãÍl)ýŸf âØO¼à€RŸ’È÷ŽïKQÓyÎÇS‡LhC&jSÞ]'³üô kk0Fùg[ ª¡—Xçgî$ø9ê(¥k¬Í ,Sn‘^;|÷51èJòc•ÓcK–1óž+ì>òHÿûU°ƒ:H-À:!•»®EœÂ½–Mß‘qA9Ű,}ØmÇ¢@¡¥¹3/æ²R¤n‚2Øÿ•¬CYi]G­à"ŠçóËü 8R¬¿åbĬ“|*“e‰Ò$^ÁôtE§¶†æŒùé‰è;G=Â*Ó(£z9a³Ê×t±R…1m³è"ŒniUÑ8&Ñts þëâëP{uÜ%:OGæ([†¦+bؽÛrG¯¹šD)”ÈÔF–f,ö™·¿_Ùcœ^´ò >ûâü-±ì«aTÖSrÁ8a‰"*s‰†ü ¡dêV¼–­q~í—8øá¿ë}±¶rEÉ\y–~åíc ƒçhW‡®Yb£aM´´­Yñ'ºXWu’µg>=ò6Š ­Ó•s§ö( ²ŠZFeºXŠTÂ4VÌ«Åm7P2 ¼Ðq-ø1¹dï{šiV‚–(‡‘m\é±ùÉÕ o[Ã|OtGÜõpôŬL*Ú<í§Â9›AI—÷rdO¯†~­×]@7P@& ªhô›Ö+Q¥E‰ØR²yBö»í8VµßÓ£‘ë¶Ùº_g·‹édDÞ×ù‹æ@ËÖýb–ÄÑÇaÌ]#¬ªHѰ¸M‰µ½–3/{‚lÀò™÷-Å9õ‡oÌç,òíoZ¥)="g µ»k©4)ï‰èÑLPáÊFŒ*”Ï5æ“ÁUÎ%©çM‘gØ PM±Yª¬É#q°|3˜Èc4Ծ̅áê2—I¢¦G; älNÖ“átòìùD(•ú/å»×/´§ŠÎ£1‰•"ÏfLæûäërIÞM²l{F‡0æjÔþá¨Ö¯\ƒhêe|‘€6šÀ*©Vä7µ@ëàrƒlM`S–m¯¯)˜vÝ5Å­Ïåx6& Øÿ‚IŠÔVš¿'JDaKž OÑl¸\æÄÌäôƒ‚šnAÍ€œ•™|ù+ãi} ý¢\—P­OaDår—Ž;B&Ž¥-Rðì,¾{oë0/–`ðç¹´8û'ã˺W/ú¶Õ#ç*’·ÛÅÒ¡y;C—Uçå¿'uéÊÏ·l¸*–•,Xš¥ev,ôûH™Tq¿á…ˆ ¼³®Ev„eéhõ©Hmc‹ÒYa1¿AùOýèª{ÆÝôþâ=ªu(‹ü Ð]Ñ`Ø)0€iÑÒWbžëÁ_¼f(¡BáDPˆ,¿/•ÁÈŠÒYÂFqå †)Ø[¹Uö+,l­ÏቾœÏD͈E°D¥1jW![ßðD|aZ-NãùUx–7±Ÿ3«[ŸÂjϰ¢ù]V¡3¬gÉw7w°"ÎH¢ U॥UøûÂo*Ls‹&MÓîç{$ j– åf›²yd ¸kåäW»Å¶Sf܉T£„1qio·›»»| ˈ®ÜAá€Âiª 4Ç_ÉîÙìrH‚óÁVð“E߳׵ɇ aj9¥šxþ ŠÜ27U8jÊŸ÷:ÈßGÞ‰[2¨6F-9L¿…ü½9 JdÔVß@þÞIË!Ð#ž·ô†#ŸwJíè"~¼ð· /ù­ün\ëdŸ“Úœ‰.g…n‹+LUÍp.ž/ÄdòÕÀÞ‰Îý¶¤¦XK¼ô£Ù½™÷ËÜ@°XyâR‹tÃ1ú ´~î®5ÿYqœK«BIщoº”îtyOØ¢XCƒb rE4¯I­rñN¤ðèÐ… büÛhѵÊRÀë×"k5ØHýØaP bøÏ”Œ±°R)Háe“ŽÖ“GÖb~*®ädfɆ>Òáósp"† |Cmå„6ˆz øI³Wgÿ‡çÀõ%‚:ìÛ°wq¦`I^¢DF_dÕlJ|«f+*Bø³ÙÀ·Tð¬í:žòarX¿^Nß¶Ï2‰j#Wg;â0Ùò­OúØÿvyyÑbƒ%:2¢éAô?w¬]‰Œ_–L9Š‚Äõw4M˜ÌË9Q‹ðƒÏ1áé‚ÇÙDî¯ÀÑRY´Å‡b…q,.•:‡°3—"Ûûßd¾%LºA©ˆ[OˆÐÞ ËÝb²VG~¥µ°YTäÿù—´[Wo&Ýë/ê {צ®ùNYº¤‰Ä)¿(˜ƒKZÐ #A räû}0)ǧÊTC¤i¥&(û.XLA4ûédæaÜóq˜W‰¿ŽuBhd=ÎcŸS‹Ð:IVC[Äö?ˆP-JcÔ;bùδ7³# íÈõ_(hʹÕÂáâkmEIoÜÀ6®%ŽªJž‡0!ÏÉî5ëêïÔ¹»“;g!’ÝkE£Xý-Ôºj…‚YG¼‘¡Ùh ݉j3óþ3Œtd›F£Zûà”ißÁ´'Ê@<¥Ÿ¦hÚ×ÎSŸœ^}òÜø{±ÈîÙ³•åX¢d1›¢À"'Bômå þ=ÔD¯’Þ3‰§þ‹·{ÓííOIp™Ä‚ûÝßWû*i=Üj–ï–’²µø¦{¬oϹÝNÇ+«"O‰[ýHáÀà¬åAà{ª¢"¹©çËF[²Z¯TN÷q4!³Kâ’ºió„CSÅ‹§]`‘tµïk!›ˆƒ'0{áz¢…{{ û”‹¯5ö ×ÔŸ[7p,ÀÍJ˨~’6 ÙB|Îòà%ôânÚÖ ˜Q”G¸”•)ių_í<8‰TtbµÒcÇþñÛáÍMˆÌS2zÓÜ]×™ÝN¿2Œ{J#g:cгV]ëC¸> /¾FÙ¤9øäô¿Ão©]sM HÛVFS ªcŸÃì!F7“6Ú(yºqµÒ~ ËÙ>C¿ö£ÿp² Û«61Y¦»õn¥ÞGé`ùq„ù*ü'ÆÈrä«°gPhiUTO)©µ”™&˜Lâíiê 7Ðfþ1ŒÞ$ôF³]LDô˜;aÇ¡•Xí¶>O(Hˆê"h ·£u ÿ¬³)}ÎKj]‘ƒCÝ|íÖ]ýô¢½¼çŸRæFüÈ—Þ”öÕ% ‡ö«òã >)G¡˜Ê³Y+:À»(xœAZ;Ôã,fÉö‹ÝïýÞ•Üï|<ßä¦W ²­tÝ׺ó¯^Þá:ëüyE,˜Õg¨ØÓ©vki„ù¾äœ»ý²Um¿gÒZî÷/u ƒ¦I!’{¿ÎsA%|¨sI„jÙ¬O4±î%ˆ©T`õµ4˜':«àLov$ƒƒZÑsæ¦j9½ÎìçÐ1´t„¯RÛs&ߥ„^¿U¿Èƒ˜þ<’ÓÕŠŠäS|KÃ~MЈ³EüÀ£l÷ÀTŒ|¯Ó¯Çë jÄñ:ð*XbvíªÄ®¶þuÂs]ËÃrd~¸Àœ±e`®Y/0ש˜k!‚IÚ[úÊrñµn§ñqñµ.˜A“žu»½jѳ._¡4x–=DöðYÇ>k–*LíΕÂgM0‚‡Êš p€£dÍf¹œ6eÁéYö°B\),º5µXpÊD»•‚LÜ ÜxW` ö"—¶`‡÷ß­¿[Õ[p!b&§j‚i¶E!¨&øjÛCP]P¢¥Ñ'.iõîüg€2© ÒÔhT45û­ª‘¦f¿S=ÒÔìu*Gšš½AÅH“0€«Eš@•¾8¨ÔïÒàQ·1À5—q!˜x%‚k]³›Îgn:aàL!. Æ4»È ×/¿,ðÒùË/ïÀ (GÊb, ¦–‹‹tþЏH¯ÇE´¸Âzù ¸\ SéÂ,„¨ðFTâòa‹Îà£Â 6‘‹Pô>>@ÑÕ¶â`D»Ô»s­`¨Xgc]PÅ"ÀµÎÄ{ý +sûïVI-IIéÔ´¼VѺ¨8jZP 6+.›Zêð{:¶XZAˆMÄ'”VìE:PjÕ†LNJdû° OÇ,Ü_Ê¥Ø)Gý™œ¨iii'ØA‹ÛñÇÝÒ²ÝZŠ‹(+ QÑüYâë%Ù‡?Oæºö¡¨lƱ­'{™µ–/®Éí‘94óñd~¿]9SVkçê )ÃJÏ—ò*ô[¦~9_nÇÎãdäl®è5GÄI»M¡áaÐ.ѧžRV¼7×{ö´´w“í¹åaÕCJQMÆ}Î0d¼`ZkguGyš³LŒ¼%:£Àƒ¶“U®šr¼¼&~œ¸ß?3Ï4 A,â~u×Îl»\<9+Áhƒ£¡<Ê0·­tñó χ|  ¼ÅÌ\+òÈQIBä·ÏÄ|½z§êÿVÜ ;57¤8£º*,>[ˆG&d;—iŒ6â÷³q¶²vѽº£(lÛûÕb³¤PÖ&])Ç×÷«9؇fDã’»]x M ïf]…Ϧ“+½ ¦üóˆ òKIæ â™}À÷Vïî» ¿}šMÄj f"‹¢l Y—ÅK×.ÚuYˆ‡Z #·ýâ¬æÎt{?]ܧ®”i2ÿÚü<´7|1£]Ȉ´ç¹A±zÄáè…­Ìk·u™¨‡°°ÑÌû…ª:ÓÛ¬üçt?œ?¶«Í|¼x¢ü¦wÙЪTˆA{z矼(—‘ÿì³:%çØi|Ü„¼ùG—ƒ7û©——ËÏB½îá«Ë ¦fÎl±úšá8H…„r:˘Î.Z­.§sÈïêÈ‚ÜWõ/H–¼ÔÁC¿}JéMâ¤B=ÙÞn\rXÖÎÜ•ì )ÿ: œ-ÉÅ£ìÓ"öÉk£­Pxe¥t˜$ÞîÕßs U‡^®:Ý^âôL‚Ò‘í³·—h’S§P]÷æzu ëÁñH”\¹^ æEézÑgÌ?E¶èƒliåW ‚9à+y›eø“XRaÉYMlPuM‰-0ÕF wy²ßÚÙi¼ëì̉‘ìÂ$=@]\läÎcŒa¶|}‹i¸Ù˜4¬S—Nšú~å©À˜QåNFöîg÷½ñašzVT­w±Y‘o®n'kƒ©J“Y,cq} ’ôí”Ûìâ׆]#-ÊYÚF·Ä¬…§çà%ÝÉÂ9Яü˜ÑQf®cù=Ì|jÑd.ØëÛØÃ5§¤Çy4'c²ò‘åÏwd´[xƒ˜™”ت”{Jƒ-§™ò#õXÁj|Ñcõ>–*éQ~«–Y÷X=úI( ¨àXÄ@•„ò}/)¢Êv4/·õÂd!³“ý_è-â+¨hlÛJUa{þûÅ¿ø³K"ÊLø“2Û¬‡Y­ ˶p ±‘_î7ÃÕØoIŸÎE—¸ÜÛI¾E™²Ú#ÑK/䥛ÓÊ$i-aŸi”Š~·|˜ª‡B¸*R?Åû|+ËS=¢Ê›%5J\Ê £WOæVè0¦CÑ*ðh–î±-Š&û¥*^ù´c$AÝdažžÉÊ™‘sëZ‡Id·àåa<›Œ¿¼àSµ?Õ<õ‹Å”Ë=ü0ûiLp#ÓÛb$P2E~H3–Ð餿Ÿ,/‹áš/–V›ûpmô¬¯0•FÅUËìÀko™  ß§7Y¼—atK«†"oç§…¦P¥+§”ž(8ïßšŠÞìUÍE×o\Õг :¨1æšWu07Ð{‘y}M°Ü&wek$W¯$ ÊGx‰Ñ{7¨W0pd¡)ô:‚Ö#©M»oVðÌ1i¶bWq{;¹ß.‡÷Žk¦¬ˆSli—¸ºR}CÁ<ÛG£–dè韻ÞN“Ú^|ja,ßÚT@wÊXq)d3õvˆÿÌ$`l6c.Ȳc"-$.Èb)݀ļ¿Ï&?Ýz Ù2MV>öA»Ûü-#./Ižì¿mÿVVÑyª½ö<„¸\L'£¯Ò®¨ðö?y*ÊN¬Øöi8)Tl•iê~u…_N"¬ˆ÷鑘ïwIx§/eQ¿ e•éQ ’£¶vœ‚øÕê´-ý–ÔŸ›ÅEð“¹ÿÓŒª€ù“—Ú‰"QqÚïvP-æa2¡ŽWjÖÈ„b‰“èÌ*B15ã,m[óÍ-©t=¹ûº]¬rÆŒPÊu ™bO¢·3VŽÝ¯¼îçF™&©)ÀmŠªg”O»óÑù»\ÛÆù£¿¬VÔæÌv‰ýýLSéj ẇ O?yßåÞu[¸H3“[òZ4’UžZ¬¿Ÿí8Ïøl<Íå„a"kÛ_DG0ó›­§Yu¿¢±wå¾Á×µF1")€Chº˜¿¢H :b{ë=™*Ö~¥¢Ø.dsZÙtµmµž¨?–ÍA8ÌèED~ÍvßêsõŒƒxG "E-©2EÌŽ2ÔÝNÖ”öÈ ¥½ÉB›©:êåxfàš  ô%ÚÌ–TŒ¾¨Ë’{Ž¢ãO/ò‰ž{¬ÅÔ©¯s¢.(.–Ìmúë¥H8é5 LhöóÇ*…·“0µÞµ šxiÌÔæI ­Úæ4àÒFʬ:’fæï¢ðŸ>S+{`Rû¯ôv/.Éù’¤R4ù™g¥k8‚$òŒ‹$ÝÉŒØ`¹™³þDÍê ôÑôA&™pÄÕa”8IoÄVJ}´ù/.IAö«­…±{E4Oú´ÇÒSÝÔ–KÑÉ g¹{06µ(Í¥ö_xL„h$N©jÖD4K0Å4#êèëön=’F­›T(ƒðe©fÖ,ôKúÇsyÑ›‚ ¯ ! Ÿf×µa¥K8CR¯ËöG7RLŒ‚ýDA‰¸t-ºh­‹k—ÜVÚEš.*RªŸ¢/dú¶³ò‡«ÈÄ´R£Áqb«kMQùHŸc¯§ƒªwt®8Dác‰ÀÙEo|ô¢“ÓIVØß¼³÷-8I žoþðýކËáíd:YO·Àu>×ìJhâ~UòvH>FÙ½`r›ªß”K<øèf‰øæ¶¶{=(Ó‰¼ã‘7ë‘*}ÃÏ¢óZÉßÞ^^F"ݪƒòS¹›5«öºÝÜoGÎèKÎè§¶jæ ¬Ùïc^KýB¹Ú^ß»9ï½Ä–k5åýʼnì«E/²ÿZ.#Ní’-"‰ «òÛñdx?_¸ëɈìèݱ$òϱð?´nС唉'òÌ!œ×³ªYÅy-Ú´ð1ªM»Ú˜lÓÁíJ 0œCÉJ,ËüQ)`A£v“ý;èFók3óXJ·—×w„÷@SgÄ©ùáS\ž ù¬“° 1ô'ÔÉ!@tûÐÃáʼn„ÜáŽ7y«`““4]Ü™€;G´Eg™œÎ\žã4üI^5ý³ ÂJä©üD±æzÇóA\ü6ô6›ËkÉnÍ71ªºËB6dv †Z?8«ÙpºýÇbî(h{½n‹xK˜%¼¡4$è I©+ìV5 Š @þW>ü‘oÃÎ {E䢴[`±»€Â>ƪXô\k G¦Æ.ÁÑÇ `äÅÌO¢€Ç0ƒEnë¶3g½šŒ2:ëLæ‡CÇrAD ua’ˆ`–ðÃØ"•ÉÇäŒÏ;ÊõËx9²þ޽¹dÏ—õdVƒÉž>HáÍÔ'C°+ìÚú+à ¬z\•œ\ÇôÕÆÞ?µ‰Ò©ßÃÔ_ÓDó‚·“ReÕ–ð&ðvÚ^iŽ…²†ôàóÑü¥|̾´¥Ïl ßkq+dŽdz™ûh=‚Ú:à=ç3rƒÓΧSU>(á³Î/¿ÇzÄÚxûUºQ\!E9•êû­NQZiðò¢ß>È€ÉÜûÍfµ&ÇÖu©+ÖH‘U “=ªŒqtÈRhŠÖv4дòle$ÿácàÿTÅŠ(Q;ç!U8Ö¯A¬(4ØHûðBQ­3‡+Ž™Ž…Ò½/i&‘ʾèu[ýLöÅ¥¥”ígí¦½hR[YN'’懘k ¦g—¬mŽ'<·º`ïïXXPåû˜…eÍÆŸ©.ý)ÀM9Lʸ‰Bc“¿naRjÔ¯Û¥Úœm®2%‹¦Þ¤ÆG=d|Ÿ0ÉØÈÔí‰wñ5àGÄù…ÉÂ*8êLûÎ ì€åȲ¨Ž—óôM ¤¶÷¾\!^Þ'ç6h¼kn8µ•%àLýþÁbõ[8¶1™º¼Ò”ØŸ~Äv(òO8Gö{>HŒxP×l-Òd­NMœ›Ò-rèö¦.šùâïÑ)Nj…KÁolðH cÛ)Q?¦y¯VtdÐvË}(¿á ¹nu}n'Ã{‘Œ°rFdöfö¹Êkø`H€’ 6U‚M2QŠg¢©²¬ÔQxøÁÀ¹ÐdTžª°RZÉ0oª .#—&“¨› 2:ïSç’É¢| 2G¨°$â–ø±lù§ Q“õÕïÑè`²,…ï(˜µ£aÚ„‹¼>äèÏ*Ì8ç²çq²ZngÃùP¤(§õa\0N¢3+ïÔ FXŽI`q}é-š½¢&¶i(˜ƒôž‹0®ððÔñï¯éÁ@Áö’§EœŠ]²šò8|õó‚òøÍm  è/iø A³³y¯úû¡ìt€)\޶ãÛû/c÷\-¦D-_›9£§‹ù~Õ?~ Îiñšm˜Á_º1™é϶wwÛõÃj±^Oóbš—…S£M×á'ù®LéÂqOz§2H–Vã{yô/çgA|ôtÔIüBÑÀGjÉÜôŒR6d ÜŽ„q éG;¡ÖÀËz ÉÜqÓaš^@Á¿ æ á²ÞÝMæ“õלÃúáGŠ4†{¯ihcôêëQ”-$:AOù‘þ‚)N‰‰zÚ½¡Gf 4òTgOt'Í&ê˜50hià`éÏeöÏM JRlШqw]•W«´‹wHã ›û–™ ¿)ÆX»yó[6óçáms:Shå=*Pµ8ì‹Üù%Ž.ª ÏšR/Yf?4ÉÚ„Ì.–)¼‘™ØƒÚAjQh~¤†.}£ðPAÓ÷w‘Osju6@qÓX§ÚyÎç.âž²7Ì9™œ2ó¹ãDìBƒ€wY |î'ΦaÕàAêõý䪴‰K11öÞU¡½?%øîÛpÿŸ7F_ayTJB¢™÷ý=ukkO \QqÝ7Æ’'ÍW°™òQ*ÀL 6h º vï'D”qCM˜þºoÏ,ÀÿWwhlqk€ÊáXªoC+3ï—qU¿§òxù> NFì†ýt¤UÀ?Nu\d’?k¦ÝƒÁÕBÑjõexvoR2µopùÿ{TNR6¿½âû«½{Ù÷WßF˜¸*»¶ªÂvº@ ÿÊ´)%2U£X)ÑWLy Q©P"ÿ’¬ÂïPžƒ‘yÒ¶ÓÅâËÐŒt,ÅB9qî¹³NÓžrŽ!”G©¸sÊ«É#õ Œ†£gK ‘ÌHÖ­ÿžöÔ§~Þ&Î|7µt¯Oq#êMcJà2ÝM¦ÅÅ礧ççØOšzðš5héá—’º|~·wÓá½›…†Ø3sH¦Í²¦6x”ˆú4¥9”KýeÃWòæ¢k(t%ß¡§<_Ý•ÇÚPÌ»§ð%Ö½uˆ™U€YÍ6ÕQ0oê¤éò¸8uwÑ>SÏÈ Hÿf (¿ˆâ é±õá/8HžóºÐ9U©(ÇäeÙÄ~Eð!l}MêÒ ú`L¥¦SiPƒe—îöÆ}\ÿ*pNjhîzÝãÆ¶¿¦3ªÆqEŽ‘žäê ŸvËftÃcÁ"7_üÑÌít3o‡sò×z½šÜn¨˜+¢ýÃV]æëd%á|3»ðdòûî£ðr.gŒ2°*îK @ ¦˜É¢ii¹÷ÏÏÁ‰Ü Ík‰Ùä!ˆYð Šsî<ƕ겉sÅu¼˜ 'óÜË›±e6µ ³(‹J˜jòNF?‚˜—•¡ëðØô¾’ >NÒRR\u wìÌÊŒùj9˜m8-6óµ3×ðœ«ÜeÕÐgk¿i®¯¢ô¼¬Ô2Ô£_ê°Wꑿ瑯b3ß´¦,¦šöá,Ž0Ú'ÅñÓìƒAcžfgla<›ÙV³×âëEÃÌImvà5ËU0§ êµ–¸u¯óo¶.ˆE÷[ÿê¡hd)51ƒE ®WKeãÑ0_ö^6`D<™bæe..ˆM&‚ÝzÐ@_dqŒv¨g‚…Ê _Zz;h”Yç´ÒpqVf¦× D\-ÈZ§)þÁgƒükÄñëüqÑ×  ÿŒ8ó-³Í”<‡Ýà""!)‘ÅFü”:m Ôæñâ{šR•ªT˜\oµf³&ÖÉÍb´Ëáj8s(Í”¢ËÕÊ$2Àg=È-?wß'cŒùCœ^Lé²®u×E ú±ëGwHƒ ­˜áûBø:Üåv´Ül݇ኆ—ëÍÊoŸœÉýÃz;®‡bÔJ&šÌx¾¸dGü'Ÿb­¡jDK¦˜§Í:0îñ7ª¡Iò:%7‹UXWVw»Îh³¢¯†n­¾DÁñÉ| 8Òi tÖqíLŽgòÀ…\4¾ t~ë-UÊ'Ï|÷,×áw^qõN —´ß7‹õP¿¥Ý´Ø…A[ ÝõÞ?É@ &—ÝÞTÆôQ‹+(?r_„‚¸(fg狦ªW"ñ" µ¤Pˆj±x´~ø4Ìãæ“aFo;C3“ùó—FP cŒÈÚ ¾X5Ї;å @[˼¥¤w¸#ÏžíL ÀÌëË™˜ª,Bx¾$3OµÀHxÅp{ªÌYï2ìæå‘x¶öŒªßàrPx™"{§‹ª‰ãgÛAÐv`ÖŽP&‚Ÿó¹B/;D+ŸFžE°µc}>4ç'} $ ¢¤Þ%¯*gr†6ß\µµ#É…Ì*ç‘·{õ‡Iß.zvUÙæwê+iN‘«ö{‰ÕÞoÕb((ö®ZkgÞù,v^¯ÊWŸ´VE ppÜ”¯r½>lö[àðÓœ:ðÆ.…úŽ‹$ºg/Bžs»«JÑÆâdœï ‰2/âæTÃ,7$Àï›áØPG­ B"!ý‡ëâàtã•3åà‚2mXƒTÂÆèè|˜yñ ðæ|õˆ¾Ú$ˆâD)Ä—TZ¿¦¾{/Ë}mÓ6 R| -€?Ê£Dgº¨±À}6Ì¿XŠÃSÔ TÔ‚f´óëÆþž¶b 6iS0ç.…l‡~ÉüvAÍè7+$F0ÍþÍY‘z&šÐ^â =#CŒ^¨öpÆýÊ™-ÖGR{œ8Oæ/Z2 ›bàÿ”¼µˆu<µ>F)ÃgÃÉôvñ‡©PÎEP£o‡ÙK.Ïâ¿.´$Ë£lm/¾ÈvË! g9¼i#÷rr±-üE`éŽzÍ«Ãò¹™“—Äü…l÷p Z¸’q7þ<«–ÂÚ­³”µ©ùjÒtá[þHEÀ˜I©&0Š‚„ý×W¸â) Òh5YOFCг"éRlÌ´é§(l«äÀÃkY2ÑI‡{Îi" _>ó”’þ<êm§œ[×À<–Ixı#§ äc‡'¯¦ ÍF(<˜ÖmÕ6Åx"7§`î}—>¾J¼Ïƒ|Ëš–ÖéC×삉…Ï~DA*µ8 ò­¥Ÿò8Õ®ŠÔ(Äú*¼$ÁÉÿ˜œ‰ÒxrfzP,ùÖ;P_Ë~†:/ãN‡ó‘3ÞRÅÆÍíQú»ô+?9j^ô•¶ITGVû_ËeìÁàUçäuñ¼Ž|…%ÓOÈà_ù„pQɼyÁމ>‡3ÙÆ¨LhÜèï5<ÅZ`D'¦¯½`ㆠ¥,'8—iE>%W®^•—ì5ؽŠOËR¡¾×2IÃ^—Óâ ³cùωˆ¼yRðØÆû;3B¡Ý ¢]âä±q­®h\C}vó=Ç"¿3œHÑ0çS’ØwÑR ‰(A"ØñÇ%§Ö7cÿÛåEI¡ö-ÛßvìÜnr¹Ý4¸f&¨ÛÊhvß ’èZ\­‹ŸÔƒ__Ù.,v—(f:»ñ¶Û¼’Á© ‘¦Ò^ˆµ3Rk™€9%ú\à\@òñIÝ;uy»T%ÝÖ–äŽXDµµ¹]¡®zˆ²ûÁÌK<ðOŠ'ƒL|¡G/–¨–P ‡*.÷a±âIÐ`†ˆûhàµÃñŠú„¦Îšf©Œ6«ñdeªïã0^z\Qå&„Í TPðm™bªö‚'„&›»Yм ÅÎøë|8›Œˆ™ã>¤Š¯&x‚ˆœQßUë¬>3­jÃèŒÌÓs<'oš©&aGs~ƒ1sös^M*áÍÀàIð#Lp‰>¯Á3*†)4ž7üÖñiØàÕ N2ZÚ¨ÏLýÔlô´Jïz=–5Psùl‹­M´Ü3vý¹lfΊXÌ+ó¢eªo`²}×Zï }¦Ö~&âYºŒŸjøI2/åñHÑž]Œ›p¶Oûä©Á¥u‹ÓángÞ/©Ùj½wWë=8^ŽÒU¥Ð¨P}Zš”T5¤ÊÔVÍ –ú!““m{á:``¥JWzŸÕÃ?Ä(¼æ|ãÚ“d‘óZ ïO'º·@¨¨£¹#½ñi\;’ywÕt|ûrª8·­tÀ 3jC ˆ¥êx.W6r_⮞d²ä €"ã=ù.öd‘Ë! ÎDq y‚¸q¬yHí:ƒ‹ZôZéøùö:uòI¬V â ÷nè0èWÏü±Î1%çýŒDçÜ!ÞÌ\]l¶;,Rò[Üõ¹½_-6Ë­¬ýÉ頻6nÚÉÞm?“iÀÍÜ‹yLRЦf NO²B'õ«¢`ù§·ÕåD‹“ëž5—b4ÄMÅIhDï½*=¢öÉ][ùÿ…^û™Šdh åUaèZÂÉ2ôïï”\ŽF¾JîÞ?:ùÎüš=ËW—ý|°¯´ÏÔSÖ­c³þÐÌï§NIô/ŸbƒÑt Aç7Æ®B¯sµÊ 1ƒÍ1ÖP»‰RYu˜ïW¡Ó5Û‚k'N_ÊYÑ4pX…©æY°ë½:räœL©‘ÎÞ¨ W_ÞØ&PýÏ¥ ¾ øQMˆWæŸIk=@÷*y´?…\^ÛÅÿ&juxèýèH îñŸiÅQ¬ £H ý¦·ºµÒ߃—F\ó=Ût+~AVȶ[hÃcãR*6Ž"˜Xr ý†ž9|<ë}*âÖ’ô¸,—‘B/„‡4 ¬ÕA`5„’{¥vˆ-Șñ¸Òï´ÁW\Í7kð5ýö+®†^TÏH‡ºôƒ•Áµ-\a"»PæpZt]6ȫ˚ˆ‡A&¾'áYF$%]Ù*4Òíœ~Qx’qw˜GÀvX´N¤û¼Ùh œ+ZÓGŸ…ykÐ]p85@0dBÊ—¡5¿yò*³ªnàÄ㢬lkZ=õMâ‹Wóè«RKQkY6÷Õ?äÑ`¢@ƒðçSpÚ‡?5‡Ní´÷¢½E!Žê©ÀùÅza凵c`²—Å%ÝÔ«\¡чþÀAÏÈŸÅÇäV¸ƒj°!Ïû%Ñx™dX}2ÞsT×Õl(“´zCŠqé^X>$xȶ<\âÉTƒstÆ«êȶD1îÜ£žÆIˆ¼Æ8ÜÍÎXY³9ª¼Žˆ^úz;Z 'Á.ÆEÈïÏÊNOK¶QÀäÞ’èU^pŠ%è=ˆÞÉZßNÞ‘&6ÞV¾–w/eG†mOØ('€ÜP¹à-äDÙÏii$3¿ܧUv”Ø>bçúQ:SaÇÛ½ í±&‹GÆ8ɸ‡5¿Z١ש¸î寜yÿFš2п3mœÌ¦=tSEI¦ÈÅãX,:ŠùìGZ½o‡‰"Þ U\‚‚|D­š0vŸ-/Ьóf“µB^iŽd½45#y±žÆà¿˜9§ež)×¹ŸQ´;ˉT½÷˜[¶].(·%µ(¢Š,³”£¥Î‘b¢/×S­íà%V˜?Ó(¯ê.‚¤á5Z@$¥HæÞM…·RÏÐMûи¸´]/¾8sI8œyë™Á7ÜÑô¹@N *žà­o¼}æ;ÀTe—¦gÉÛï¡Æy£Vì÷ÍpJÿ¾¸#¶¢•ª9¤¤~4¡p¡à1롤ÔcÇ­&Ë\n¾€ n”·;àR†£\‘½b¨µå*L?¨•û#b$hßgáX¾ÑýöÏ&Ü˲7ª¸¶Q½I`X_md-ªµ‡૯3œ XoM-7*G<îÿJhÆ0Ï„n ÐçÄÆ ¨¦Ú ­:H2õ9“Ù’¼'‹¹(¼gÔó8N„»Â¾‚î†?fšo‰ñz¯˜meŸ·2"Úõ¾·Hdc/û ™ÔЪ2kÏ”é”1±¿×”Ðv=Ð&A†‘Òtäû¹®œaÎuø+!v„tRÁÁlFŽ3[d¦Ÿ²á)ÂJŒ·zÈú'aB ¥Ž(T>ež.Rè”/¯Ò-Tt¢…ŒW‹"rçírã>lYJS&Y–æjº+çý•~™†6TÇÀú¥ ¡P®ºìz.ÍÔzMëßûlýû¥•šúúïú¿ÙE¾º:]Æmp"7³ÝÂeÙ•A¢„›…¹ûqÛ#ïíÊi1d@÷íø-<ÄÌ·€Ì|³ŽÞ¬>ú³w9PRÐÄ78vàÏo½O-'‘Çí§ð'1Õc>· Í«DÓïáùü6ó÷÷™™ÁW‘вjœV!aÕe\¬Áω¹N)N*Ÿ'Æ0Dß!\ÿVqÕ¬*®žˆ5éKüXÜÀÖÔˆf§ÿaƯb'¢áû¼f}V2ÊáE§ †z|A ­£p°¤…yX³~ þ¢e³ŽÔ™é®ê&½nnK;¦Õ^L'#ÚSâãRrêÌð›Šf¤ëMMû}:HæÜ-·ÃÍxBlÓÉè«ÜL‘l»ç6 'ñH-Ü)d´3µHö{×OR„éVipR¾ê{²5®ãºt‹Vγræ#Ç5õxAŒ(CÓ8¶;¼$¯,oN¶éÁäÛË~ÿ6 _L¤SÆZ„6¹Uoƒ‚ÎÐhU¥Ë•sÛdÑJ`ViËÕŠ!Ÿ9V›p„Â2G`ÊÑ‚ù¹'O±Åf\½2õ‚ýþöMhmUì$?öOU‘£\G^‘'5"â•ǧкz*à'+x„³|>œ™nûZR`ê±I±Þ¹I1 vßµÐô—Âf¹¢Û/÷›ájLzŸmÖY Ž”üîp‰y½q£ g—¢ÄR¶˜I+¿h>¼§ KÃéôv8Ê£I°*wßù¡H|`~çÑÉÓRŽƒ(y£'MÛŒ_C £³ª]\DÛ‘9©r¦í¶œãÓ) «¿# Lî»–³C,é»!ÙB"òŒŠ_É<œ ÇöwNã“S§s^§ÕCÁ ˆÒéG8ům÷ЊLN%côvß4¤À«Ð¹¸ÙãPÒìäI}È®oNGï|ë¿'Û^$Ë—}ÇÔûç›ÐUÚi«– Oõ´ôâ8}kÀ´ò.¦›­Z/éâ…¦­Ë}¤±Æ}R\]𓭉ĹRÝñ6Oq4÷þí[¢î»6ònò;a—i'‚ßQ¨O6UÃOŽ×![n-; H§$›Zˆ²ÍÜØ«J9 ÓGÁÖR¾ 2ý®hY©'W%ÒÊo®¥¹t©J,ï*‡³Yr;¸ÚQª‡1ÛôØ´{Pq¦PmE¢¯­b9àÒÌE ðìRå@ÔÒùd=N'ÿp¶ÖLJ Uà#èž‹=¦JDXa×”I”êïCÁ{ Š"ÕDË%åðcx¸cÝQó¶‹éf¦øœ+"H'^Ú§Ñquêé ì–rÑüFß¿ø­ú½ø=ë2žœÈe{‘þÎ .i?«ò“>Ú¬ÜEj_Û\p—04®,ÑJ‰x)èÑsàGÊpSò•þz;“Î&w¢ç 7ë‡Å*W÷Y)‚zùfŒSA¨ºIûNÏÎ &:œ“¿ÖÄ:½% µk¢‰™Uÿ t öïÌÌÉM‡Áv(õÿOôB¾·kÕÔ‘/ ŸŒ‚}±¬]¾7]=·ÖƒÇ¶ÿ´”x|›˜?[*©[xÇA®ÜhÜék‡Õ†×®á?mpÂìÎpÌÙR´‹r “;¢lviø41µÙS T®ÓíÞüfûñÀúÛŽõ·ô:¶_÷Z¿e…Ø‹¤†ô40´f‘Ónݤ³s‘ËàÝpè`ü÷ÔY¢®v»”Ρ×” I>D>{PL ”¿½+RÂ_B bF¯ã(0lB”p§?@0ˆ›ð&¾úÑš1§/ÈÙTš=¿íƒüôÁòîÏš!¿C…+ ׳*à“&Z`àì1Øûá889>x2ç:a¬‘8ßhÔDœ·"ÀÑ€½öOÁ‰¥ ¤¥ûH‹;wøôüóN&{oXG‚nŽùÀËŸ9œãظJžŸ*¨:~Aú]Õd±ÉË)Œü‡€¨7<ß^ÂMÀ `ͯlUÍ‘[Æþe²’Ê Ñ¯}õÓVUg¦¼MÔ ƒš½·Þ“ÝXu?×ìg•Së]ÀO¶‹ÊšzŸê¹)+DÁÄœK#ÿRVýBx±èJ-”–ògƒüŠKG°žf±6.=Q "²±Àj'^ؼ‰%Q$¾5Ùc|éíI-ôc­RI°vnÙcË¢ DrÌc¦Ñâô›­ê´rÜW˜½<èuÉT¹M#3æÝ;š8£ËÕy—†ùkG³~ˆ Á·©{#"Ÿ÷¹4º[—¢M‰Š)ì‡zµ>@Pc_–¹ÙñˆñqÒÜzM^VzUà1«ë”ÿ‹gZZ¸Ï0pÎ=3* ãxíSr†L&ûˆ#Q¹–‚Ö5k­1W'&{ß;ˆÎÝ6Ý$%2æ«í|3»ÍÞ[Ñ~’ïöµ(;¬Á°7Ôc+•Ë^£V4vüíŠ܈þM«š®\Õ‹­%8åÈ<Î$G]Zì&ðO«S wƤ‡ê¨•¥CTqI ò“uõä¾c¯Ke¬EëuÑ ·4éY ­ÏI~²S'Q©º7õðÃ’Ÿ,ÐvÓ®5›_;ÿÌžeÔ/B½;Är,"ÛëLùîì†ÏÉOb¾ñT§ŠÅR¶@̬û}pëé ä¦·à6,µ`/DÄÿßÞµ5'Ždé÷ýû @’¿tæb3C °«v•‘]š’#Auy:ö¿o^¥L)¥s$ÀU3Û/ÝÑmå…Ì“'OžË÷)ébͤšvÈôׂ'X-3®òÒ&¸ Q¬ìײ-á¿ss;œ°+ó¦¿Ü[0ÊD+Ã/ktÜnÑq_à9Ñ\5ž©x :Ôî$¨™¬ç¾êÉ—ŒéÃ(•.Ä©® ‘d<ÕÄžÝ?ñáè…oš‹7xï°]k”†üåU5ÜŽÕ(.bÁŽY¢ÚbÆ%ÙªõL”5%ƒ'‡øH•®'߬W½Ê‘vû¢7ä$QŠæ¹ß£Ó]m4Ë–Š Y¹…iõdsÖéÁ•" e^N¹æÔÚ‹Ø™z»×£Ì.ï4³ÉfÇ€1v¦›ÕiÐl¤†C D ¤J “´„’ŒÒä6z8¬‚/Y0‹Xç«ÉM¡fãÅ'FßV_Öõ @Š%qŠTL°¿ÍbTH#v½|Úî´V¨ úk<˜.Qdê+ÇÈ¥e;Šä=ÇMÝžÓŒ“Uv5…þìvNëháÇ/â‚ëÐÓÂÛ¶Œ ÝD6i‹&]|K4éÁM¢cüì»þ!Õ"8kÝøaj*öfT¡¯ƒÚ¼ælïÅ_}=î¾Ñ ôØõGyós¯ZÏ£û"0öSwàÕõu#tµoÁž_·|±¿´6´¢ùç }Áê©q›k»*÷…eRS±kU…?,§IÌG:$˜Ÿô7àÜ÷è C !PFê4 ´Ï¢*-q‰# tÁ³`®W2®„o¢´·:íbZ]Ö¡hÇìšóòøEÜJ+ïUøj_ƒÇ5hµ¯AC½Tu¬TuZ0etUµÕª@µO  ¶» :ÍKI“^Í`i»‹‰¯ªÁRG`ShÁÒ¼¶4‡KÉ``d¶$4j7Ú½^«fhs¾.uZ`8ר^†Fíú¡QÌ](4Šú‚¡Q"OUfu]žfC¬Ó¾o†b¬Ô1†P§ÝB€ÿ(¡N§ÊII¨Ó8 aMûúÚjÖtàÄ5¬é´@n aæu9ˆé´@õ]°k0‹ÁIÌá¸Lp²Ý•îeƳ)./5DÉÓe¢†|–D m‘È|¶¨¡-”AQ/´¯aîPCl³Ø—‹ ¶œš±Áê⢪h%*DölØOoŒâ‘v=¸]z³{üNÒ°Jcov§²B²S{ÑôhšÓiM#f¤…lUˆœ9-tü.%sZ¦tHät.#6"f^Zœ®{à1ÅÀ8S>Ð…¨5µÈ5k5 jaTÐÅ‚Zín%[{§6»A1ž…á\VCWö5(ÖZ˜Ê†q¹” ŸWCø©-ÔZðSåZåJÖuuòÓuãî¹Q?#µ¸‘ +¦BŒÈ†w•x ë/-öC^¶ª}5ºápMMj¡„µ’zE\3CM"ªá EˆPÿUU‡dÿª;4ׂËúk‚´ê§WÂQîê‚ApŠU‚`ã_º$¤‘(©D´3ýíN©òƒ:ÿËú 9ÿ:u|yÕ\]Éþ®¿J÷þ*Ýû÷)݃¯ ÿgyÐùÿÉ%x À£)`•×€ÕUw>Úê2;¨ƒ_»®.¿XU•uà/--¥«Ñ2_;‡mú/U,þ¨¿ªãšVÇue•ÃýU÷K—Ã¥¸â¸B8Prþõ+ß`³ Qг—U°-«JÖ ÅfYÄ+/'V›!òŒEdàO‡ªÆÐ””‰Aín]fvVM¦¬ò l÷W©WóR/pq͵]P3c1¢‘©z nv–r­:R^…¯¡ì Ý(_g7,VAMŒ•T8~„ä¦ÆÛ¦ÈÌÜ‘ï*ŠÎþÉLjëû߃蘠¨4J±C+® fqÀ gÈ¢…’_¹#OnzîlòÐêîª!ÉU¡›<ôÕ–ˆWTÜÝ‘!úS&ZXjJTÖ_ÅÁžõŸe*•yûêXçPR¿w½Œ2js³±…[>õŒy‡cŒCí¥ ¶ùu°-\¢µà·Á™¡äI¶ÉE½ðÉÃz‹ãfÿêÇo½KÈ5»;´1ˆÏ¹6æX´!Ϧ·=žêÍ a›Ñ§ôr-•²nç#¤¬k5‘20øe–²N«”uœR¶¹ïÇ”4öó&Ï»¾t2°xm 6ÌéYMðÑþ«Ë¦;ê7‹‘Ëdóa0Ú û«>Wr½Üå¹ü# ÖŽ]sðþÌ kÊÚÁ|M®(wC‡,ÀëÐ ´2ÁôãA$[þ¡¶é85Éò ÓÊÇãÒî3Z)´Þã¼O {uF…$jk„×û-%®®Gs¥à®ƒ‰úô±äú^íÈëFñg]®&Ä"OFÓaŽ£uÈyGœÆï»è úPãßgA‰ÿí¶I¶ÆwÇCf̘¾ BýµŠ¥|Ɇá!´’Ož|ÿÛV0©”ý¤Ï¾IÎõ›ß˜áÁ"âN8nƒCÆÅÅG›åh±é¯‡“•‘š†rëR®`ž|2QîÏÍ´5ô_¼cxzÏ!Ï´ìÀùEB/Þ Í{"Ïä­ÿƒ¯F ÇêÕÿîaš¿/¢Õ€Ñ”ñ½ÑfáÅ•z5ßÊ}Àƒ9íVA¥ !§þwŸ/wÍB5¬)±îf2#šz91çWÃ1(MÈ}¥a 6|ºOpm5ãÚ\мÌ5L$t:¿%3\]GgêŽÆ#wDn—e‘lGTY¿grnëY´¥dØ‚œB$«Å{¯ž~E»¬j·Dßü†Oaø2Þ¼øý6ŽŽ{.X­Fà©Á÷ ô¥GÎIÏ8Óä˜B¬½8 ×KÆUÛ† jDyc Ó{b0©ŠÕyè»à}ØÓÿû¦OO}ªê)V]fÛ"Í(`Ñ-iHç óÿ§*¶2fÛmDÆÎç ˜yu:V“MÒ+9KºjŽœÊØjþ$;BIއágˆ¿k–+ïj²¥¿„Ì0®úü[éN«Zí^³Å^Ì67ó9ÍÍŸ7Ó!}¿,×Ó•|Óÿ)Ryq´—Õʘ’Óª¬+4ÐàK]—@DF ±,e¼k-‡/̆"»âù&ÉÀ<'.{fnM ù4Zlýéô†’Ò'.±m}Û • ™YЪP¤ b“2i%sÊ 6›9±KæTO!túÞî¸Wl%ÐóK›ŽúëÅæÖ¯U=(½o¨Æ]A ”ñq÷,~kìžøÏÿ)öU†É'ÏjoLlÑ0ø'ßVµH²÷¡sÕ¶qò°\Q¯8yš€‹^,È4Ÿ1ýŸý!OßjÄ<&]# 3°”]®„oœ¿R¾q§}mÿVrl‡w4ÈE2ÔlýJûhšK¡½øEÐæËÛ×øáøæ=¨ŠvE.67¿on×}w¨ó=ÒÔÿmššR ‚̾UüÀK7–ÿA«þò^ ™./ .üÅ»H÷¹`Þ6Ù™›ßåÆ4cÁìlª5’ÛŘÓöÙ,¹ß¬¸Ñbeü_öÜ•¡õnOÖÂßbtèùçËä°tŠúò3ºÑÑCÿfªÅ”{™IIßFì X%r ÌÀ!m€álMÝcO£×W?VÞQÃo“¡¸NÃß§|~¼~ÅœŠŸ¼$Nõò€FùúÑW©®§ùRm´÷cnZ‚+‘ð6[Ìu.ƒScÀîÍê‡á½ÿþGo­áî]iØ®UbÀ3þ‘éþVmúô°YôiR kÝLçƒ{]ij(%J©îüËßýçúÙætN wb׺W]ÕCô´I Xáý!?…¤ì÷£·-ÿ¶ÌŠlåŒÈŽÙˆ\Ï–ÒE¢ìË••Zßö¡Ï¢Ar ïëw”ѽœ<Ü’#©E…ât­ãïþ™ u?z$–&>ñ†)Ê|㙣Œìü~ô~ú‹…CºÌÊ[’3<ûKÿGŸ<ý²(+è oú×`÷Ú}¯1éòÊÿ²ôCr„Åå€Eúë·¤O ´çÀ#&û¥¨‡Ðæþ÷õh]ðû{['²è½Óèá}S2hź«i*ùŸDÖ›Â׊ü½Ò£d‰:vÉ?ßilZ?T²$ã(~öÙv¬üø-ÈJá]i0š8aC? ¾û±¿U6¯v QÉ$r¢,å5/ûì3M£Á¾¬r]F:$'Pqå×¥5!íy……Þ›ÚµÝ%+F+ne¡˜ÈTºí¯rkö™Nƒæy±÷ÖœqCv£ŸW˜³ôÄê—ÙÃèÓb4X†ì~vÝõ"çùÛÛ~þò’ø<Šb¾)è7û¢¥V´„Çäëä¯ôìäŸÎ ‰Pæ~Ý/ûJc,÷»5’0ígUYè$cÆ mæýÞŽoŠgZ=ö7RÕ ¯3õ•Ü¥ÏÐ6}×í.Ñ¿7^â÷·[Zò…¹'Lœz}dK‰A0':0‰8ºC¯cõZ¿ål²±DaÒZV‘ÚXw}—Èù ?¸mfý…ùDWDj±ú M§ÚûÛ4z#ÑÏÉÎÒ‚‘€º¨DµGïù Ûöt:¸¼AöKYþI–Û¡Yç.­t§¶YÚ§©’Ô'6L¨}šoÑGoúá;Z.7nÿáv”¸o›'¯gæaŒ2jA::ÛÇéfE_Ë©ÞýSÛ#éGƒù¹ÒÞÜÑhó@#YEÓ´Ú‚»H©Ï&P²œ¢KéZÿ3…v¨Ø7:ëTqeÚÄõv¯¾ôããžÊ´Ù*Ç¾ßøÙI×$ÁYÛÚ†ûyˆP<8ÇvV%*¢^ïªý° |g5©ÖV Uv³¯­lóÓ¹mîd5ôéñ¾¥ñDæúÑ¥„áð0Цtj%ÞöîPH¢^"#žï\úÃiä*û©Ì¼Wãi×X­ýÓ×ÕªÌg¶?heaG´´Ëõ’‹›¡;y¹â×ÒD¨¹ S&Äu_ÅÇŠ Ñjϲê“ÜCeÊo-ä-8&ʽ­6ýéTÚÄ(ž»«ÍênýÀcYÚ<&¯Ð¡¿'Ï wàfÈèÇžh ß"Á­4Y¾ÉxBÖÐ0à¶æqzçÆNh‰›îë#Q›*’6ðØ?P˜ ê4žE»è@4äsYÕ~u²žE>®q°/¤±LoÇÎWTB¤gnôä}ó{d&}–,¿¼}r }ò/ïK‡ ŽÈzóMÁŽZhtч“Ó$,³åì!¿W—ŸC èhî°ñ \!ý2¿8“V£óÝ@ ÜåÒfH¬š ³¹ÎoúSv~l[u¾Ý 64Þ@3÷‚-ÚêYøW+}´‹G¸»ð›ík’åÛ±ãöD~\üæÅßä¼J¼âìúgÜwM’Lt:Ë’(´;¢¸ÈcB ˆ¶B¯’·ˆ'ÒPh‹&ÐÌûA}&ÉÒ÷b‰îJú‚):i#×}/ñ·ó#¥¾ˆ·éäAW„aÌ.ÈÁÊ­âàXi7lÜ]ÿÕ—ÛÚ«ß:cŒ¶ºà#„§Í_hzXðì½]ºÏ H¶@bÉdKðN:šhR qaŸ!µ];•Y°©àviÁ#­¶Èd_J‚,”ÕÈ =Å¢™¦*½± ïbX°XÍÅÆ¢n¾/^âãì‹ò”|5can˜(‰$Ò:ÂøaÉk ׌ÇuÀgJ1½Žî,Ž¥/¿¯íŽS‘ßlkù`úÆ:­’‹ô„‰ÀJ®Ná›Õ"¨%Ÿ eZeŸF'×Gùë¸ô‚•ÑEæ¿ø³xÕe¨Såw"µ±•Ò×óš†l _¥ßsÔœ[Á¨›ò]éA´v%b[ï¢A4©-äÂ+AµCf¤c¢ "`|¡xU‰H£É…t[?mÑø1L¥§ãÔYŒ\$Róôtsžžkçú7èØ¤‹Ë0=:ueœâU ¾zÁ) ”–C¨’L­Ÿ·'t>Beóéý¼ƒ¥¥¡œo®Æ ~ Ûœ]]dÍ6jêÚÌ+žZgÿªó“Ï>ÓBÄÁ³/QO°•î¦Ó‚@)Õ!b^z-( Î_ý8Íëœzÿ‰^idX+Ó<¥Ï‚ªd©Î·ú1†"_µdHœ5Š2,îKd‡õ°&†×('*18¸Ê=…›qŸÂO¤iEÌ>ƒª÷¯‘A5áTirOælNá‘D^†úåfò°^æR3¨ßRæý“Z–ÛóYü­8ø¢;Òcjå¿FÌ1ç@©qu¢š–^%Œzhðü Ü“Sw žS0¬ž–åD·Ž.û©[§E*Ñ— ›]9Wù3Y8l3qŸêz[‰XAìzJü |èá$0 “{àtê2üåaÌÏU#IÈúV²5iæØd¹\çŽå‰çq’$G_3à” ž.hëâNT€ýë¿z>]S˜÷´A“É¡O "ñ%ºä¾§ÁªÍüæo)ˆÊAÞ’&¯J#Ä(×/ÕvØ© €•e¿ïÓïÊPXÙDYÙv ƒä[Iü©€7‡®©xŒBb3ÊŠ‘4ó´, Kß·Å K]b«J€ Œÿ^ÈÇÆš•æE™óÌ.J¥`#¤¦¼x7 JñNÜèxvþOô2 ?U)MK¨ƒ‘&Ñ%’R:A½~hõ¨^(Ï-Ú{1]V~[®Šžˆ¹¶¹îÜ%ÖÛà~´ÚŒ§ýÛ¥ÐâöLÖÓ9/ky•Éù‹¿ÄdaŒ³i“‹×Ñ.BïðÅoäšò)íüå%rÒ:;iÕ/=.1ÇFk Ê8¶à’Á¯y»¾ÿ)(i}¢€sÒjæg«ëf[oÇÐ;(à3—+™Žá£%ýí¶"\ X‰@zJìáç*΄–l8Ü,Ú‘­\Œ@?ÏŠÂA8?&åKÿ»/Ñ*­Výß¶Ñ÷¬’)à^Q–ŠÒB%V¯Á<ñŽFuàÓ¹Á¶×+sáEe·I´IJœq^Þåo…·EÔõä+/ØÉzîBÉiÀB–Q·Q¼5𝢅‡¨Ä¥æ*+íŽsŽÈŠDayÎÁUøÞ˜9.X݆~ò{ fS lPë†Á–Äd¢5£ÃÑràN«¹ êA}šzíå öiŽ“ÀórJä"“Nž¡PÚ{µ”Âäðš˜ò©ILiÖNw-òþ ßQY  yIeYˆ½ìP¾ò¼¤õõqMo-ì© 8ˆë?G±€Ô¾®…Q¦€ñ—‰„U3¯Ù%æ‹&þü‡ºÄ‚¥\FÍ]€d¬Í÷5v×ÀµE¾X‰WÐUUZ¨U—¸ Â’-¼ÉlÐoIÉ3»÷zÈ{/³K@_)o¸-\õºtz—¿.ù¨ú‹Å°õúMÖÂïRÍ[­tŸª1úp÷‚Ý›OëbêÔý¸knJn„Ý·žÇÆaUýÙ õJ9>¿€dŠyThDxãI¤‘[bA‡ÛÑgßßþTGæDsä¿ôLîú.à/½hNPã=’]Pç?âæ·SÑ«+¡åPfªÂ_õW륆õ–O+©\ân£I£üÖq½·«Ñî6WÂÅÀƒ^í5”»SF"TH^ó¶ð²êlMvÄI›È2«ÝdhŠùFà6kq«ÉÀ.­–I>ò'·#·š\'^Ó;e\|¦c¼#,»áÈûh·Å.kËxâ®›§Ý0Õ7ÍæîçÔäew{ÍØxÙŽˆö Õ åôåìãÌÊ ‚?Å3<4UagÈ‹5Uñ§™ èSËéž^ÞwB¹îIægÑVÛàzȬfd±^|}O(u½rAáòs g^ò­F}ŸTªëápåb>ÙâKô]®æp!VLìU:˜I©>À”÷—é$ ]@3Õš' <ëÝ&¿QÇäŽ$|S•w»‘ò–§û2&‰Ý$ÕüKúôº‘Õ”*œf–k÷\VÓ)OÔÿƒ°ðÆl7ÚÉLm^æµoTCX<ûKÑìe(*òËøT0£ËÛà2.‚jÛû5ÿøö)¦ß –_ûê$Ëû£ëÝn¶àÈÄõÙžLê ÿTó27:[Å›‡ÜbOk~î7-÷š@[4îløR4^W¬€aô¦Îc{eÜù«F[¯sJÃCU¹ÓÈúÈñLTjóÖù<7gÐ)WŒb¸þ¤šaèݘwx{z,–wsw…d÷ø{«¡#(Ì4 vzƒªL1—V ã ›(\×þ·þ%}D†Jö·ÙöÞOf»Ñ]qc¤Iâœï‘}FkÉ3zöfÑ«/zçSS‹ØÜ¡µŒöµå\\O™#PV#Ûgé?Ó'¹œCï³ïtÛôNÐŒ³Éæf=\%ß/_#¹Q¯@ßÿ^Ö AZþµ|¬]Á.µ0 ªLÍÇæºo´z’?B’d™`¿³x<”þzF_¼0­ë¸ªø¦5¶×LmR\ó¼Û<¨’m)©X „몎Ã;nƒøµK&øÊ´WF‰ÏÛ¨ò,3G¾\ާž˜âK Â($ œ;o¬ŠLOåð¾³¹µa½,§{jª`"Y§H8š/NæwÜH)QÎõ&csÒé"-e¾“,Ç4˜%4ßÞ*g—жB®ðìïþŒ(Ua1¼Wއˆó 3-Ös>$Õã†rû[®$¾ ‚×T¢ QÕ¶zLW^2ÇŠrºl(—Ÿ$¯êð‰oFŸ6 bpoŠç&k'i4”vÐCU\;…³ÔÍÔÊ[AÀÜÚ׉–b•I¢øø)Ÿcƒê´ ;SÖ¾Ò®g×á’B#‡wåZìÆÞåh°¦ù`DOMˆb(¹C²Öi Ç…¡HoÛU©N2„*Q…ÞÂP{d—¨8>T^Æ}Ò†([CD‹õ-ò¬7ò¼ËLM#âV׃ÐW€d­žc^­4 ÆÃ‡ä\‰ê䫎,9] _¥ÔÒNWPÂréâ—iöQ‡© Q÷ó#RæHÚBêîéËÕ-iÀwÄ–')?0bkÏ’þuëû#; õjœóý0ÛQÞwö]}›l0´½e\7“…•(@ S˜øÛcÀ÷©SVÈrïÇ;?LIKx–üC JÇvZÞ†e„(‚/”Ê›ÿ0˜CþU¨Øô,‚õÚ¤ =ŽœÀÅ0e$Aå½HøvÁ‹QMŽÆ›,Q”ÊdfÑ©û±‚Ö‚Kž7f  Ó¢Úz}êu6ÛÛû!óL»Äò_rimçaÙ—ïo_¢P u€\9Z#¦0oðaÜÅĘWMÞm8júOËþãhÓ'Ú‚9-º"VЕpxgŸß-SÿÕ{~O#z-¥MŠV1¼ãï¤AK¡­ƒESNÔmž’ ý¹4ªE†DÄ·(}£ÃLúùÒ§á ~QZ¸b|^ÿ|ÿ,¼i\­2£6¨‹Çaä4 ËÊ´Cd3k[½~ÁöcàbÙ—›´L§WÛë ÄmPJßÚ”]þ¹Í]*ØÏå}\²nךÕÂÜi)%Q$ô*¿…î¶OooÚ~ ó2ˆ¨¸ã¹ÓH3¨‚On×n_VÛ]e˜`ÜŶû,™_«6¨\ìŽÁ’ú«µ[ ɘïÉÓ‹˜%[êïÈNÎ9-{з[²Ž2ÇAI}­Ü$Ƹ{c« Øèºh×@”Ïm¬šýZQ¥ݶ’.®Žä>õ¿s¼êÜÝab ð¿£HÔ±JÑû{ ùQ>1Ó@INšœô–à%…áI ì ›Wˆ95õ#{—ôþÅÇ8(ÃRœ˜qðãRÈ¥£¢·7š&r!¬-3tÅ[ôoÒnSD_Ž/2øÆ%jƒ&ü¬œý†tœÿÌ ”‹ÇCÛ‰ñm«ì›ÝAãzÌýùE8k¬ÒB•öÅðÁþcTBõ=¼í_DxŽX#ö娣ßûï“Ý–Gkùsb0ÛÜ(ÇÎpô)ŸVð®½bñÀ¤•)éV+c”3`äWù H—Vák™ìTlÁÙä÷ç@»8»G/<§÷ØŸ®G…Bí£¯!’Ðo&· ÊYS»ÿÁÅÿûlïCóÝgrr-3.1.0.2/grr/config/grr-response-test/test_data/profiles/v1.0/nt/eprocess_index.gz000066400000000000000000000300741273104013200303600ustar00rootroot00000000000000‹N>Teprocess_indexì]K]7rÞϯhÙ%=S¬wW| ŒŽ‘™Ù dGN ØcCòf0˜ÿòZr² UÉ=ººƒÈ Aîî¯?é|§ž,’ýÍÓ«¿ûâËÚþíÕå鯿yzzõçŸ÷ûù¢þÀ£ÔPÉá’[V¢¬I¡SoˆïO¯æ·ÿI߯'^Y(yõOWÐW5÷ï¾ó¿Áàoú÷¯ŽýñÛ+ß¿~÷n‚¿üùÃWþøÝoÞýüú‡Ÿæ§<;÷ŒðñÂ|ù{¿~ýæ¿ütå~ÿã>|ú_ß¼}÷Ý_ÁùÝ üþ ¯ß~óŸóû¿ è?|óß~ûîÍÏï><‡§Wj_ýó?•ö‡?üö‹^ÿÇ›ùïûòõ“‡üûô?¿é«o¾_‚_¿ð¾P¿{û曟|û—?¾þúû7ùõ»ù#¯ßö·ùûß®˜ÿ–ÊôRµ×ñN9fðÒ „¢®o¤2P´’ÊbºU*ÀgçŸ^pHE•Jü]¥ªµäQ[fŸ›Ž§Y¼2¤FÙUr©>ŽÂ¥TÓmRÑ3¸gO– ã©¥ê‹O±F®-g§qx(ÒÚΪ>ŽZ[•Át›Tø <|à“ã …‹ð‰¥""!rª)çÀ¡i!G()n¤2PK©,¦›¤‚pu€Ãªüð~:fUÿY¼;, Ã^î9©ß;s+E}ËE[ò.ÔXs µ,ŠW²XL·ÉBÓ‚ŸphÂÃß=Ô‚ÞÓ‚D}çT¤{o?Kbž(v‡´± µ´ ‹ép 1>çObAž–R¡•Δ%V|L®øÀRµld1PKY,¦›“ðñ‘f âpwâx$Æ2žU@ö4^mÍJ1Qb·Éì Ô2³³˜n“ŠŸ‡¿#xBw!¹8ø\ä Â=M(Æi ½Œg#ZJÌ)×£#Þèb –ºXL·¡ô ñdšswæŒ;v®e¸åLœ±’¶È€=aˆ°ñvjéí,¦›Ó8šù‚£ËøÀp’ ¤T]É¡{–ìrHÝ{_¸D±å¨¥YL7׬ô¾f¼à™ƒÔ¨yÐÊžUK'Ò˜[$ŸòÆ‚ ÔÒ‚,¦ƒížîhzÙReì¾S©µŽÇ7¢EͳX¡Þ GÝHe –RYL3î—àâÎ\•$ø(‘»äDµíFÆÜ°ðF*µ”Êb:’Bð,Ž8^ø±ýÕûJÕDs$ouæá’ ^GeC)(õ¸ë¨¥TÓ­R;]|ré‚þmÚÝWªž²ïRÑÌãÇÜÇcƒ‚–P·ýUµìYL7[Õµ¿ Ãú >61§{JåÀy)¡i#Ç%t™¥fõ%xÎÕÉ:´P« Ðdº-V¹Ù†ÀQCÉE`”·çM+¤®¥Gˆ<Òæñg_]r,!ç ›e[ µ²*“éSX=6Y¿¯U¡cŸ@•rc¨T¤–ŽÁö¾×Tj«L¦›¥¢ksoUr´Ü}ÙVÅP4çâF°§¦!÷ˆ9…XrOuã ÔÒZL7'ëüŒav&†añc못¦# “œó>ËH¡Sê5„èšÿAΛ• µ´*‹éæX†a=»\ žZ*u‘477ÜRo¹´^J ‰1´ûƪ ÔÒª,¦˶Ÿ ]ffqâdÝ…¹¨š\lÌ”4×–rE©ç2þ ;©>ŽZKe0Ý«F]åŸFN1Kà3[U¤‚)—À¹:Ž-‰4ì™xI~#•ZJe1ìVüÒElx_©F"FX[pŠLÅé(S‹OTRÌ’Ê.V¨e¬²˜;@ዜ٪t>+,¹©ãž!*5  ÒKÖÍàž…ZZ•Åt›TqZ•ãk¬Š:qÐe¬PûtD3¾ÏQ'%Ë F´+ ÔÒª,¦ƒP.svïÌiEOÊ—QîŒØžül}³WÙùÈžpcUjiUÓmRLÝ?#Í¥E ;zÙRÕ9tÒ±j–X¢`†¤Ý;(@7R¨¥TÓáQ¤9¼œNÜ­¨u¼ê㉡fÖÚ´wDÒÀâE@v ZKe0Ý<¹ŸÑ]׫ңà¥êÂB-ÅtxÿôˆKòظt_g§G=¥6b×\"p Õ×püÚÌ[¨¥YL¥’”.p’Ã"ðº]–ÒH®;ù–¨ t•Ôjß•¶jYÚZLGº×U[¡£‡½œæV烃TcfPÑá~Š«4·æÃfDÅB­­Å`:<ù*騵¼lÇV(uGØ 8"DHDçÁBÜkNh#•ZfqÓ}º#5¸sÁÏv†G »:¶"5Dh.²Ë£ö¯½„›fJwuZ¦Ó'Ù>}æ’u¼î)t)µŒÈÐZ†È­´ÖF'¿;óÐB-ÅtdÈ‹žÌ:èÁã(÷•ªDC¯ãoÌF!œKNÔUï©oVh-ÔÒª,¦ã[Òx„¦KÕ]FÌ™úxÕk„Ì#€€Ë|—ͱjiUÓñ‡‘ÙÙªzqNr¬Ø*§:ÞHˆ«—žÔoÓ Ô2…°˜7‚8]ä±ðû6‚zǬÚœ¿‡"2BoªÆ°Q±PKh1\_º:À3ïÉ%ÈÒ39«§ZT³Ud×çøÏZ* µ’Êdº9­àkZ/äíïZC‘ê˜Jé5pÔ)¸æ9aĨ‰7íU µŠU&ÓA« #S¿À‰Ð!çæ¨Dãõ†”²:AÖÇÇx„›d µ´*‹é`ˆq#_?³U5iÎcgÍ#Ø×籬®ÎîÜëfÂB­z{&ÓÁÞÏîøƒwºßule<ÀØpŽ úΔBÆ8b|¤ÞC‚°•꣨µ4˜ns€<3@‡3V\܉7Ïrá=´8OuèeÔ¤ªTž/|ö›U[ µ”Êb:¸Óýzfï™Çü “G¢Ð¡{öc¦$$eø¦ mê* µ–Ê`ºyŸ]çö`vÑé±ð¾VEZÑ×|Ž\rL>'檩Ó¦‹n¡–RYL·Iå¯àuŸÓø­§(­âxŠ#qˆq”§rˆÝ§Íž\ µÌ-¦ã—iࣥº¯”2¢z¥2"ŠRÕyäjTBO9m¬Ê@-­Êb:¼KÃ¥£Ã`/fÑü<æ½I CTçKõTz«¥¦°Ëö ÔR‹éàáØr!êëh(äi¼Ö"+ÇÔƒ4É¥–ñ'È»lÏ@-k(‹éæ…x=Ùr®v\ø³Ž}ßùŠ#`çáVÀ<· ÊŠG‡ÝØŠ…ZuÌM¦ƒ×¤¥yÜÔç»8㾋î«Ï=5‡œ±dÊŠP´¡,e³’k¡–ŽÍbú{šä$÷™Ìµ¸‘Ýúäµsé!‰-„–yV–ÛžZflÓÍÞøk{ÕÍNøƒïou›òBwÌZ"c™ƒÛÌ…óf¢ÕB­¥2˜ŽIÒ<òÁðûÖA}ó\Åõ̽“vߨ%bÈwɵZ:;‹éঘtÝxæ,.Ï {ôÈ%ĘFø€$)äìÊ6á6PK©,¦ã7ÕáÑE‹——r èœSÏ#’·_T¤ŒT«¨¸Í”«…ZËb0>ÝKâ£ï͸¯³+T]YP»˜cš'WŽÃÉN*µ”Êbº9³Ã9¢23;<÷E‘L2/q\rÍ¥”Æ0âF•ÐtW¨µTÓáÁ/„ œxFê¨#SiM[áä(Íó;Ó(8½JÎÞm¤2PK©,¦ƒ‰9^OM>s+µUî¹H¡Ø¸»œ*¥X$’bŒ›ã:,Ô²d19›ˆß;@9VC½œFPGr(b“ëÍE‚wÇgúøÂ®?g – ‹éfg7dI×%¾ðèCî::IÝsT×:Jñ¢E¨ÇëÖ~M´[5PKgg1ówî‚'vv s ›Fp baŽÈu¼ý­Ÿz›Í3jÕ…0™ŽožGßÞy×lH¹6Ÿ†õÈš»ãZŽÿÛ•¶jeU&Ó‘ÙqžÙ¥ žx ™ºZ“pà>œR˵vŒPBã7×™X¨¥TÓÁ.„ÌÓüÏ<åÊH„€kŽŒ-dÅ ¹—è5r ›lÏB-¥²˜[•ÄGŸøu_HÀºê<ŒFYR„œæô÷ˆ!sÌqcUj«,¦ÃC^4]Ï,Uñ\–PCKJJ=ôê½"vÙ,Z¨U²n2Ü*=dž-Õ]“ufðm<3, xNŽäÚkëI„qs\‡…ZJe1ÞÕŽî3®äÞwÄÚ¨peˆ¤ÀCŽ3ƒÆR7˃jéì,¦ÃÛÏ®YĉSæä]Ÿû÷ü(A5«¦N¾¦8×â¦3a¡Öd0èLürh(|ÎÙ»;[”®$X‚ÎåIGýâëõªîy—Òæ®v µ”Åb:Ø0r×AãÏÖÇ»³,Þgv^šŽ´W{ŒSõ.´‘§‘imd1PË„ÛbºyŒÌof‡ÞÍpOÇæ³Jñ©Ì}yÈ5%m±‡x‚²•ê㨵TÓáÛcN½«‚}í¹a¥Æ‘ƒB‚9WêRv`³h¡ÖRLÇïdz¸UÝWª Á võN™RÖ–Üõ^—Øc·Ù­n¡–™ÅtìªÇ™+Ì‹9Ï,•Š–ˆIYƒæî¸ÍÅ…”ˆBØ•±jiUÓÁƒÒé¯%æyØåž(Ï{»§œc÷ìˆd›í¨e¶g1ݺ[ý}¬ºvn~9Ù^LqÞµMˆÊ>°&Ÿs­÷êcæÍ4‘…ZZÅtpÊ•¯{hÏܳK!&(%T™}ÇÄÜŠ¤’ЉovûY¨e\²˜^AüKb~â{m9Uô$¡p.\’é² ‡"óŠÌRvpµ–Ê`:Þ ÷¾>ë¾R©‡šKt0{¯£ÌÁP°_4(»öªZ:@‹éð˜ÿ<óæÌV¥¾¶æ\Ðymi¤ª bhK…²ó·P©>Îtк«à̱JµÑHÀªÔÊ!º(#Ò(gHµl³=µ–Ê`:8¶2O²¾Ð‰'_y$a.y_ÕÍhÊì>^{ß%lb•ZÆ*‹éÿ÷9RÀÒçõ˜®#3:?‚ TŠ]·³jiUÓá+µæÜÞI6ur£Q¸‘„ݼ…¢P“ž½+ Z•¨¥YL¸Þ }æó]¹IéóòEH#@GÇÉM§”ÅaJ»Á/µ–Ê`ú$ã”'Þ<##Yâ)W?ï^„ì¹TZѺ‘ÊB­¤2™ŽÄæ®—Òñѹ‡—-jt>ùže6r4CvÿÅÞµåH–âЭôFÂ`ƒ˜Çþ—4&f>!-%©«–ZÝÕG§¾àcã‡bŽR&ì‡Ì„‡ÚšÊcúq9ez]€ñË\Ó“+_)ÎDAjmI°¥iQï³EÔ5/hΓ©¾GíMå0ý‘¥t®'§õÒ0Öú±P1”Y[“ν¢ŠŒ‡Alj§ö\¦ËAly)ãƒß¡–ã)3Zš™ypH1Úi÷Ó¡ÂÈCíZÒ\¦Yñ*eÁë$Ò¯iI#´¨eµG”pÔ¢£a,¡¶>ÚûèþÖ¦N‹`ϵ?C uX¬Ó £Å8ù¤öÔöTyL—"¾ZÒþZ5ì{_rif<‡ÚM„`Ÿø\uù}Εϙã”ruP[¹à1ý‰=Mðà=MëÕÛtGbÂ@²ý¸)÷8ÌY¤zXªê¡¶—Çt_O·ý·¿¦žÜÎ'b•¤¦W~ºp¥Ô†Ô&mæCŸ“‡Ú]l.ÓÝSà¿&Â?W.dàP©[<Í•«r’lÑKêÚÍ?¤ÃUµá.Óµ·Ë.<¸"ÇDƒ1±\òJ`¼ Ec˜õðjë¡¶¦ò˜®ý|~MÉ›MUD!W®¹cËd¿cHL¹„ N¤=Ôöô˜n¦S«œRž}ª0'S_<'œ5÷:b)Uymàn‡Så ¶§ÊcºÜÉ¿RùtOî{}uIö;¥öÙEƒ)åRÌ£Œ¬pxÈðP;µç2ÝÏ+¢O¿9½5´Íeö‘bA×N„<[%9I(&){¨íè1]^€¸ž/«aMh›{ÅXSh )L6ÇžH± ¢žÌâ ¶'ÈcºÜÓÄ_ˆ_á³)×÷ž ɵ/WŽmBóñ£vŒ-͆§ÊAmOÇt_ ?…x¯„ öEÜ) é/‰»p¦™8Q;d!<ÔÞTÓ]-Äï¾àÁO¹–ÖæžjÿYµ+µbž>Ø·é÷P[SyL×Â<¥G—þçÆ4T{Ñžgå"a€¹µÄôPaä¡¶ÂÜcºÞF㣋ÁrS^Ÿ·¤D(9tÎk™gpÚí¡¶§ÊcºÞçùÑ{3rë¸*ñ×êY$$-“`èú svÁLõ=jª¦ËjØWÆürõÖ¯>U%š"T‘+Î5jmH…"š Ž{Sy¨©\¦ë¡×¦×Ÿ<‚ªÖ9Ç‘L—ÙWþz„°_uXlšò¡ùÓCíMå0]v3SÁ§3o6Um5fÍëŠyt´Zk_Ä%Mõ=jo*‡é¾V=ê£@ì3a´PÛ®¤:  wÒì-j?d+<ÔNV¸L?®À5„ô%–ž®ü^SE474hhO¶-îpP€jW3á2ý8®*ÿ‰ùµöäonô„À×Ãa¿Iø­B,î£}ÜæÙ©‚A«™‡Â=µ½í<¦ëÛnµi<8Þ-IÇ0—Z3$íDbþ]5õÚá0‚ÅCíMå0]*sZS ÒƒËaËú¼GMÄѼDµ«^Ô¼G –‚(µ5•Çt™›}ÝvŽwß{ª;挵۟f–ª˜ph¬­~j«!<¦ËY°RO^Vr, &Ã$Óa¦”©+©hlsÍØšÊAmMå1]d‘"¯„ßšBúdS•œ«9ãDš…‹LöÍ“}þõp:¨íè1ý‰±,éÉñ.¤¢3ÍÔQ뺕 ¦>-åÒÞTj«Ì=¦Ÿ™*½‚¨¸úÖ>®'g‘X³öµÕ,™ƒ]ƒæ1rÑØ¹ ü<ÔöTyL—ýðZòôàI¥æÍ_È¡'s iˆ‚)žÆ²x¨­¯ò˜.àÿöq!ÜvÙü¢xWS­OSb«{¬¶Á2°IK)ñ)eä ¶vñ˜~,÷Ðâ¨bü²÷²šïÙ¥¥–£²ýRUJ…©C›@cnzÔvjkéR†¯äÐcZJÃ:ínY=1­$U#f•ÊñP¹â¡öfq˜.ͯ-'nÔ(ÝÜ@!Ñ~?]¦‘˜!CÄ“8pP[qà1]n9±Ð>=_ô½:®$5™;XÓÓ’‰-¡º&l¤š“œV z¨­äö˜~½^C^NžünÑGmUš²*¨Ü¹'È)HäLíPdä¡ö§Êaº¬‹_H_ôÙœÃ{/ÀT © MŒ8®¥ÜæÛGåaBø`*µ5•ÇôGÊ!žü”1ìÇšÍ{m¹%ê¼ú”r¨§Êµ7•ÃôãrˆW£„•týð>¡÷žªI°”;2÷Ñz™8›´’¾ÊAm Çtݨòé¦Â·šŠ-D ˆ1ûÍѯV¿ËÐ)hªìsðP;S¹L7ýŸòOX_ð׿‹¾9¶åP¹@4–*bÔµ(Åtè ôP{»8L{ž"­¾Üøñê7!ÍÐ'6ûá0Î!< ôB¡æÃÈ)µsL.Ó¿5厩0A¦>)›ƒB¹á°tŽØr<Ä»jk*éOìÓÀ/bhÍdr ÊêíSÒY¤cm1Îc{=Ôöô˜næÈª\Y¯LwOL¿&¹Ç "Q‹dÂÔÊìŒyä¦qœ¤‡ÚšÅcºœ¿–ŒYÚ°¿–¶ ¹Ð°Ÿ¦¨ä:$ôÃÛ¹‡Ú^lÓI9|¶ù½[ìmæRDzvªˆæ MÎ'Åí v‰<—éZÙQºPù{NP8ל&¡é_5o`qe³[MpÌâ ¶›Çt]ÔJÏÞËXp…ù–ȲÀ¥ä6¹ànñd<¤Â=ÔÖTÓuM—™êòÝïw›Š4hDZFJcék¢N¥IæŠÃ)6rP[¿ä1ýXÅÅ•^€5¯ãÓãxßkªÂe-«°¿r©]¦v’¹o‚#Z{¨­_ò˜n”½6ÍäÛŪ¿f 5KKµ R¶˜?ƒAj!†jŠ«;ooUvfñ˜~üîG«_)†¥ìâgCÖ÷ž –[È™bÈqŠpäªyHLÒè0]ÅCmý’ÇtŸöæG¿ûñ„Ñ…‘jè¥k¤2BÈ0”V%ðÁTjk*ézÑ£kT$ÄÙSƒãÀƵ2"+×(™»{ á¡vÂeºžûºZcm*™#+‡l‘ ®Ý<)h­Ó"›F-ºÍ<ÔÞTÓÓ«væõD›žCIP•܇ýˆ Ë4zï4°êaÔž‡Ú]€.ÓåˆÞטø'/V¨eHàªXÔÙ~A xF(ÒÁTjk*éòT•×ûÒƒ§«HŒ­æÓ BÃ-"Ör×ý4\ÀCmMå1]_€ñã3Êßk*L9d,]z–ƒJ1Um¾~U9–z2•ƒÚM­t™.Äz ÿ_ú{Åãïò/(MíלLs…ªu­=%-ׄ§CnÏCmOÇtùì·lr;¡ò×dÇ…Z§ˆŒñ5hfjÉæÌiÀÌ2ïKj«ì<¦›‡´D8ÆGO£”œû,<ˆxâ*å@Ð`¡ç¤*ý0‹ÈCmMå1]fÇW‘ä§w¾×å1Æ+í–Q§]H3ÆÐ$æÖ,–9T{¨½©¦ëW[*ŸN½ÙTSMÏd¡ Æ¡¬0b˜2;HV<45y¨­_ò˜.ý®ìøeäï¾KÌŒ9r5Lj”jÀØP›”:ÂÉTߢvÏ.ÏÅê…_‚MÚ=ãCLòj a(ÍMÔ4»}ç$B£ÊI×9¨­Y<¦GF¯¿ˆóº$b_/–8FÍkür³²Î<£…—³8¨mä1ý‰ÅŽáÁ‹EEJ0ÉëD W$Ù?•£ý©¨=ˆµ ÓYªõà§ti)§8Eã«¶Ô9q@šµkd–C«’‡ÚšÊcºž1¹ÆL>øÍVºy‹®TÖÂú c+Y) #œ[µ5•Çt×U¶¶ š©>Ûý^]7^-*R™Á||%ÅT±‰bJ|Òuj+!<¦‹½œð:Uˆq<Ê{%DêT쇡`)P cPE{¡Ãû¬‡Ú —é²/¾bþtûË[OPM©u(–´´^¡·¹C‡â}µ b]¦ËYPiõe~¸…ö­~ÉbJhÇìeÕnk©œKHkiÜìx2Õ÷¨½©¦Ë> øzÍn}²©$…"Òú,XS« ÜÚĵL´6®{¨½©¦ërd_øàª‡JÊ@­·ÆÍT˜ØoH I „–C.S9¨­©<¦û×¥üéÜø{}•@«9­ŸŽ1L¬(È”Pû€Ð*jk*é®ìkU޼«öͦª#Œ€æ,̃ð5™]ZÍÜóà=ÔVzL÷Ûné Ÿì«*Œí{¯S¬©ÈLæû{[­É‡Òj{ª<¦‹æ³_Ígå+>¸u¦Ö{SÈE»d©(©Ãš›ÑØ.¨Ã©rPÛSå1]ofÇøéÇÁ÷^€5KimÐÔŠÜ-$•–rIÑœ=R³jo*‡é2®Š¯'÷¿ãÖÚÊ b䋉f*æJÎdîädªïQ{S9L÷§Ê|Õ“`)5ûÍa¡R2·)-Äþ*áß›ê{ÔîmÊeúq¼Äz\!ðåÄÃ_S¡g?VíÞ6¥ŒöIW‹GG3Æ‚Ôà0u×CíÒ°.ÓKÁ^f ù+¤¯ô×*ôÞœ†ÕLš1Ïš&r-«¸­2D±ŸìÐ{á¡¶›Çt-ÂM.¨ ĤÀÍ´rÁÚ[AS\9É)9ä ¶'ÈcºœãEëÕöÉ»¡k³ÏX-J ”±×¬ zŸÑþPNrÁAíMå0]ïÊJ¯old·ÏLKD-­–¬Yh.oW$„ƒÚJé:9”²¬'›ª ç¡tBûì+G !…!™æ¡ÂCmO•Çt¿coÍ~M›Líªœ„Ì´ú’ísFv)­b¶æt‚¾GíOÃôï¸çb²¸Ô¦°6,fQhÀ&»j®Ý¼ýá9¨í ò˜®'¿'¾ c·„]F/QLj˜[5MV‰‹J •×ÎÙƒ©¾GmO•Çtiª°.»Ë’þßmªÙ ÏHX©¹shuÖÆ-¤r˜¢ç¡¶§Êcºµ _ñÁå”jAÍuš„y˜cj8™J©±µÃè¡v¡­Ët9ï+­Õ—¯¶¿&´ÕÕ÷(Äi.ÍQ¨„¸R8\Ìç“Ìâ ¶fñ˜®ûÒá:÷{Ì’BFs8!˜g`ZícfÑ Äà CµóA.Óuÿ_¸Þ5÷»/6ê&Ž[jÁ¿ÆQK)W»q i?õÿ}Ú=O¸<7m2ñ•oÀÛF³[C¥wJp V˜-ªl²bʱ–’vJ™Çªèp:Sj{¦<¦?2TàÉgŠÙþZ¬kÝ%U‰£ÙÒf®`ÿ{H¸z¨®s™îv\@X㢞¼'K…FkrŸ a’öÁ+):)H1¹u0•ƒÚšÊcºì|õc<ÚTšLsd„+׉%§>aÐrl=Ôöô˜.£%»ýò£‡°©Î:…{N-b,]FNuÀ°ïøÐ(í¡¶§ÊcºyLÿ€|ѳçåiç‰3B8új;W ”Cx¤Ã©rP[SyL—›Ré5jàÁKmu"¤¼6$`è‘¡˜ŠæBÿmïÚu-Ëqk>_aNЃ’È›‘¢8p6`Oêd'þwS§+© _ÕéSؘ¤ ]…Uë–¸)R|F3(q„ƒ¨Ôöô˜~Fåø‡õ7‹Êe ¹ÐJ1$ÅFµÏRr“”Q ij—ð˜¾'*xÙ*ø1VêÏ›«òæ¸Äd.3„sYspQç„9bŸ2g¯‡á j{ÙyL÷‰À|;r÷—IöÐb Då5D:š§œFâ‘g6[qè ôP;mq™®kW×Åömé±)vŒ$#C–N\£hM ¦p£ƒ¶x¨¶¸L—Úòj*ûp«æ[½¸¾†™ µŠ~…l¨61Ds¹f(rˆƒ{¨­¨<¦ë¯µCøÁ«{îReuOŽ -F©¼Є! ÇŒ‡±j+*ézï¬Ù±AæçjÉŒšÌp‚>ª ¬µõC™‡ÚŠÅcú)ï ÷úuÈÜfTÍ¡ÉUíî‰Ó<¹ j/*‡érI~-NxpÝP·c Ck]§Ik>¾¹^˜Ô~9ˆÊAmEå1]>YókÚË$×m!¶< 1ÊÔJEí 2Â!fç¡¶N¸Çtáí­N%S)øÊŸõöÞ:ܰW¬bŽ ‘M®©½sÓxºÔVTÓ·µ*ÿ–ãKTåO¬g}ó{©U¤:¸)Ñ. ž˜FÁf>t*y¨íeç1]«žõÉËçzkªÊ£&¨f5FŒœs‚R'M9ŒaóP»PªËôÏ"IGT¸S*ÍÖ°Iv¦Ín‡dº‡Új•ÇtW÷`ZUŸØAûæ÷’@mUkT²ïZQrÑR“ÝO rP[ ò˜./»º&‡¸-ó½—]Ç’[™Í>bH±pÃc*)†\ð *µ•Çt™ý½xÿÁ³QzW­k"{Ã<¢Ä¼6QÌGàÑëH<Ô^TÓOéKpâ¼këy-ÍFPÌkmÚ£&„ÙG]K€÷¢rP[»ä1ÝÏœ¤G÷ÿuíTÖ¦âÔPZ jï_•­rP[­ò˜.íkíë~pédöys)eR…µÈe5ë%®Ãî¥ýäí9¨­VyLw¥“VâÑ£Udª sMj Õ^ Âiïœ|˜8ä¡¶¢ò˜.‹üËW‚Û^õ_Ç1ŸM1öfŸÈ«âg{ÙÀ1‘á ¶—Çt?`·|zjë›5ˆS­fÇ›½q¤g™Ýn ¬E“† 'ÇÜAíEå0ÝOÂËÏÎÚš¯aÍ2ka/*‘µäÈYÆ©WÝCíEå0]Š*~¥h¦é¹¢Ò)¡šcŒiõú3U3è¥c c«=Ô®§ÉeºÌ‘ÊQ áÁ£4‚fîV4‡.Tf9Œ»ñP;Âeº^ýcÞÞ“»/ìs&±û'gDèAeÔH\g¢&ÜÊ¡øØCí.@—éŸo(GTVÙÏÌ,( yd3œŠ­)´ÊAíÒƒ.Ó}&7ºSð­™\ ¥ÅUjOУ°ÙþÉgj‘»¢èj«UÓõàÓ%–。·Ðæ(‚=vÊ\5Ý­¬&–vÈîz¨­­ò˜îKY®‡HýÚ¢ª«DaÙ·N©c¡4¤TŠÖÃh6µÕ*é¦û¢®Z¾ˆ·ÎúÿC,1`¸•Ë„&ÓÌöM3äÀ¨›D…”kJR¡ µ•‹ÇtÜËùÑÓ Í‚CN%M̳¡}Î#ÒÌ+vÀ‡Éïj/*‡é¦ V•r ŸüfQ1Hœz*Ðgàªc­¹Ê ­Bj/*‡énêîŠ"}|–õ{EE!6Ê¡(½ÙqΨ5“Yø`/*µõÌ=¦ï™ÿ2_¡‰ü^}¡-U ¡ I(TaùErP[wÏcºLï¦ðû°­zï{—AÓ (4è$¶ËˆZÕ6ż³ƒ¨ÔVTÓEÆ#¶y]>z¾µ2+1ÊÚDe`ɑãITŒÚ‹Êaº¬k¯œáƒ«Æ´S]ûg‡ÙxÐÖhp©š #Ç:áÞõP[[å1Ý”ÈÒêþŒ×›Š™"sÕZJë\ía+×»–Ûê¡@ÂCm5Ècºìô„5[ê)å°#”Øj™±–a?ž}Ã…»½e*Ä”×°»­X<ÔN,.Óe•²yvÏžx3R{o¶Á)BÖžmŽ4¦˜‰8ˆÊAíòƒ.Ó·ßKí·T_³¬é¶÷:<~½¦éE½EóµÒË)®U§ÚÝ3â0}htòP[­ò˜¾§Uõ•ɨ?ÆŽ‡‡Ìë‰N‘•ìÅ’(;É:Ó [9´ z¨½X¦o»&™ør ®L¿N|uäl÷L %uûˆ{@ÉÄþ½„Èažn6µ•‹Çt1!/¥WŠâºòá×Q—Ü!·Ùl6Pž…0µ¨eLz¨rðP{±8L×{.VÿŃtxÖ3¬=bJöŸ‰¥RÁTå0ÔCí=.Ó·o6ü-½t¿à³nÜ[Sç£POÍ ÃX‹Í§½ð hØ$’|jöv™¾ë˜Vý>4j5A?xpá(›…P;œ)ÄYt¹Æeš?vÐ*µ½=¦ûõ«wyÉXËéyfÍ}ØWŽ1aÌ-‹•Cõø£¶×ŸÇs9òÐ\õv;v÷×Ö)“4 šDx؋Ǽ38Ò!—ןÇôíôÒ«v<†¯”Ÿm©Q‚I™ùG@ÎJæ™qOQÇ©yÆCmEå1]Š*.WýÃãàß+ªW)êä9„,$MzàÁ:…Õ”j{zL—à²úœÊƒ›gì1¶åiº=QÛPlqÍÀ«ö§Ü†ƒÚj•Çt?ž·|º%í­¢š‰*ÅåGÙGŸGg졆 ZYJ™‡Rµ•ËtÙ‘ñªQNZ…Ê{Ó3 A.!¤+È3SÄ9ÚDé)zš<Ôî²s™þùØu4hŸPJÖ„¢3š±(¹Àj;ˆÊAmEå1ݹ?2\µ2¡7­-¦Ú 4TÒœÌ-Aóàíy¨íeç1]¯Ô2Q•wµOû¤K/5¬!Ÿ³A³Íh ñ—ðP[QyL÷!¤òéá¢o}îÎS®Y%c‡”»,…T¥³ù׳.@µ½=¦Ëa9¯=MåÁ ³’ÚO[W‹%PØfŠ‚æ†|HÍ{¨]jÞeºLͯnŒÇ, šBçÔ〞jДBœí°ÎÄCm/;éÚ ÿ|û{íŽÄ(¥“40Wl40 =CÍ‘":,cðP[ ò˜¾ííµU£œò„?±-úÍD=NÄÄefÐ9„Q†ý?÷^Æi^‘‡ÚjÇt¿”¿âƒãxæbÑ´/¸š3 ‰ìõúPóÍÆeµñDõǨ½¨¦KQ¥5‹ü)–“Ë*H- V'r°÷$6‚n'ÅY æèy¨­ç1]¸^mµŸ­/z¯­ @¡ÒCÈ$W‚ZͨkZZ rP[ ò˜¾Ý'¯>Z €~‰Ìm2kÑkæ‘s)õfÇx¨ÚóP»ôºËô3ÒëŽã½5½¾j~rd\¸ §L]Ú³Rf ÇàƒÚk•Ãt™_Z+î>›½¤ŠSLµs ²–2êÈ8!ÇSpÈAmEå1Ýç—ê£ç LÍÖöó¡Jj"”’ô¾ZÊíwµ°jëVxLß¾é5®hmð¾Žÿ:mNS›¤R»& =H.kVÒ¬dæ”`rP{¹8L?eŒÔ“ƒv:í퉱BBy²ÙôQUNÚÞvÓå©•²øŠ®¦œÃ. ©%æ°1ƒ§¥æPú¡ðÕCmEå1ÝW~Á³Ã£{¡jŒPF¥j®XQ’ž:æÃè ö¢r˜®'\'üôįŸ,ª¿ü׿þÛŒ¿²ò_ùÇOñç3ì7þóoÿû¿ÿ÷ýí~ÿÉÿáÿ—×ßø¿ÿ[µêYýgrr-3.1.0.2/grr/config/grr-response-test/test_data/profiles/v1.0/nt/index.gz000066400000000000000000000510121273104013200264500ustar00rootroot00000000000000‹ÔΆTÿindexí½]$KrøÎ_A ô(@îææîæûæŸ >hw•€=Pä €K-–Z@¡ÿ¾Çª+³:,*?¢¢nu÷ååÌåôÍÎÊʰð0;öuοüÕ_ÿéßüÍÿ6æÿõ§ÿå¯ÿå¯þú¯ÿôOÿíßý¯ÿñoÆ¿s.Qy„”#÷6[åB«¥ºÖ$Âüíß’ â“û·ý·âÿœb¦ôçÓßÇ]ò)¤ø§ÿôŸð—!9OŽ_ÞV"EÿÂÿÀމ>FŽx¥àÆŸøß¿Dý7‰üí(†"ß~w.º×þâÿÿà5þüƒ¿½¿ÍIÒ÷wù„X(n^ò!—DÛ79‡ŸÜ¾”Š޼䒋ñûWRp”6ïñø2R®¯à¥qñ…Wu v\š4|¢‹³»œ]¬~}3.§+ègÄ¿Ë9úÕ¹p•Sú ¬ýÉgN%ý%ý™þ÷ï/'_²:aq—·Ë~ÎâTJ yc|5òqûR‘í=¥øÍMÐ+ÂרX§¶w*qøîìì+ÿÅp‰m q5²k°Hè3Ï‹}#‰óéÑáMÑ—ôí[Ì”‘Ëë¡zΔ% ß_,ãÝÙûíù–í›(ÉæXât”Í+9§¶·Ä%<×wNê½ ¡:§6+ŽmO•]™¡ùü‹%=Lé>xPŒõúhȺìòëÍyʸ1•­ÀÍæ¼1SÑ ØžI¢BÇàÙÅR6ïŠüÖÞan®~玽IOE†ð˜­ùЧ8Ô%ÎÍד’¸ÜGÂ1ø¸Áñd‘;`qfÕðù¦)ƒ—èv¾A¥µÌyÖœs׋|3¥'|–Þ ùâ."¬Á™ÕÞÆ= }Sz5cîêU<ÞˆK‰„¿N/·N· OÑ_ð»ÿœ/¶'&>‚2¼ß*_"lb`)©l^!@…;˜W+ÕÇ´pHgï5ÍÖë,°ÐÑrøfÔ$ø'¼`L¯‹ø$sþ=ì^îDŒþ |Nå%>ë]û þä#þIùÕìÎóû…ì‹cƒm]/ÎE4ÔYpWDÌSÀ€$n}º”Û'7Ö´¸ô8àve­"0Q|©Y–GdýfdW„ôäë=qrŽà+(yþ亂tÄòØÒo=p(,x<ÎacUÊø«·ñ?;³xßZçʰnZx·Õì]£¸ú–DäÄòDd”N%B“ˆ\l;a“ˆ˜li—DDŸl!›ƒž€K(î’ˆpÓ¸IÔûp³/-ÊH^À÷„£5j¿$ô­?”D„ÎXÜe:t,i¼}J´µœ÷×þ]áwIDÈb’» zÀóäÅà<‘ïü·5yfdmÖÍ„ì ž¢¶‘€Caÿ 㘅W¿v7¯È.Àª'\6¢œlƒ‹þµy ¾!<ô^üöd{\‚ TIA}0–Gl¿u‰dɡ޼:lk^“V$û%>ð'ä ð•™Îä ‡>“Å›À‰aWŠóæè9¶§þ^¶y~ŠÌ-ðxØoG(Y<g‹•[àF#Ô‰˜B«ñº+¶Â•8Be÷z½°ÕåmG°Utå ó-ÛpËÃÅØÊ&¸†pûy®axq±å…ÓÞ|Ëeá::wAV9Û'œX‚;9wbÝŠ-´-°hRºÍ£J0¥´ëkxe›Dá`NlðÛ‚ƒŽ¯p;dU¸ˆfruHÕÚW€©Ò¦Àñ·Kv+ü-¤~$d%$9•Ý^jBÏf·È¥¶`Pj ¸Ù)R›ÐƒŒÓ‹©Là<›ì6ZoãÕ87-Þh¥ú@RËÈ"êhš7„å¹_²[¤mšW°ZÄU¿Æ²g‰Ž$¾x*SÞXP´N·=Øg¶˜hˆCÌ&ô!õÙúëļyOÖ2ÙM÷–c ×%¼b+aô\Wøé“:¿Ú¸ø+Fÿ`†¦‰œ³1pÉ'œ%SÁE~oê¼E†ñ É™Ó$Δp£$vÛû—év*1cm‚ûY©1<LªÀÈZjX"Ÿgä$gÓàãFS5ÄGm³`Jšô#㊠ˆ‹ÁÉ9ÝŽ‡«´´V(½6 ÒLërεçq©>ú çkjì3…F ãÈG<¶ÌE "nmœ­ÕQÌm„¬ D“Õñ[hÁ¸\*Û6Ð÷o1¶õ+±çYgðÜ ²´VSGîÛÂæÏPI×OWÒý®’ÄVÒ·eFõb~L+é!ØJº·•td\»Jº·í]Ví'žÃŸÓ€{ÀSÝpÜ¥ö@,É=>ËÈ´2€xÙê±1¤G¾`|q)™ÌIŽ3}H¿…v#„mW( ±µ¥ßۮؓÇtµ†6Ϋ†G_”fZãZx–×½§˜qÊöt'6§»mšÊÅm•ù7sºéÎéÖ6\ñ2µÍJmc–Vì%îìø'³ò!â„‚·Vlm6esؘì€JЦî¤ó6¦Uèv±ç¸Si=ó"ø•ùÀ¤Õ4Â!ùZ¹|ÌÊùŒ•Þ™}%ÝW$€=•Ћ´Xz¸ˆ4q:U ò¯ÙÂ+ÁZHüà ™ö²V5§~¯BÄåž‘Öz›ÕójNj˜.4—ãÞjø•2ò´hÝ2@j´•`Ýrö('óPàÚr²nYnV/|£áÆR¡Þ[¢>öâ|›i]r.§æŸbÉ—Q‹/<ÊÉ:8C±'9[ëôæMLHòÏœäc¦üŒHW’–=ñuýÐÊ$úÉNò‘iv8Ñ:eÓÀØæÜê”ì†3ã(¸äm·¯H¹]QöCÛÌ‹Fí:Ð%",u%ïºÓ¦ïOЗ:V+ò1›:\2Ó%%ÓM"%ìúR¼õêøVd*CZÑ+»l¼}ªÇÀ¡†©6®cÖµˆB}i€Â6é3:×:œqªÒ¡Îõkéõ»Îµ=ËE›6¦s ß½ }´}WDÂ$v¾°ìÊý9¥Ûz,F†‚`(…qi•K„H<ëh“è­™ýZ‹ÿØ `üV±{ÐÌ—Zö¡f¶Äô£›ÙßÍ{™~…àuøj­¨c„EkÏqv¿¦4|ƒO8×A+2_w®‰^'ÅÞüH!ó`ØmÕȧ‚sd:ƒ‚üb;‘‘¢E2ˆ©f*™ ü&˜Æc^#¿†¯¼¤txñ@p ­ÆYåm$ë›óüUG²b1%·wG²’Y·É:€%ÇG²¸|ï]¬É=-W½pôpÝ®ÿ¯' kG>ï[±4ÑÃ2?n†“#YZ }Þ¼ ?mF,3ɶP”€iŒ÷€ÿñÛ1ãðò6˜c?®cÛ+:®\n7Ç5]<©ÃÎI§âá4¥‡]÷”Ò‡G HéLcåsö”Ün°EÌ’Håõ¹ûî`"¨È¡=¥o#†H?nŸgB^)#ì&îÎU–Ù8æÉ#öËÀé=Ѷ›ˆÏ´­$ÁÐø3/P¢–)g¿ kx“õ}~;·¶ÏEÖYé­W/ÏO4¬;þ:À=¯4Ð .bÔ±€%[rÔÃú„óýsìá¹ìŸØÃËö|ãêèÌ…Qr…‡“¹˜{‘ÔS) ¾:­8ý1¢üé#ÊÖLHkNpšApz-4¥p¢¯#÷ìóãæ!\•wòµ{»¶•ñdGîoÀQ ÁLá#<™)ü÷övƒ³N‘n—§ =õ¶p¹Ä¾RKÓã,—9#îågä奜Y”>:áLšuY<ÍÎài[GM:ãèwxš²ÁÓ®Øõ_Ža‡§Ýmü‘bçÅa‰ð,³-‡d¿Ô{§QçµÚ„lLN5k]8;Y÷ºé®Ú¤‡âQÝ4±é‚iÝÔ ?\Û¶Op·nJ¹‡È×Ó¹ä.…ª~•ÚÈKï×yƒ OLÊஇ3@¿ñˆ!ß7àôxÞÀe·Åx”‹qÈ"Æeàð°xwÞ€J\´¨!FnÑ·¹¨.Ø"­–´/û)¥ŽËÙ{4·í¸þb¥ŽQ[d7çvãÖF•˜qXb\q¾4` ò¹ñ‚.K ö $¯ÇìI|Qv3õD’³Yã7Y àíÔ‘w„çb[…V»-âÂo[¹VAâú˜@ Ï¿ó“j h~ÎÑõ¯3ÍŽîåm¿üÑ}ÙŠ xa2ÎnI³„ݪ±Ì±.ëæÎÑÃ]ŒsOÍík½âÈtÒ¤­=çÎ TÄ#If½ßÇ´ý¹sÙnI¼Ô4¶ïAöj™¦ÛcGTž;ïÊÆ®Æ ?Ñýh®¶9ñ0ÞxÎŽ¿xì(xÓäðÅÌëøk3ûݸþø8ã²’däÞ'œ‹Ç*i¯1á,.„ @v¯qü.až_wjЮèŽÔ™¢AÐ#S \(»£ðc¶(S4«þÊõ±ý <];‡áÈÓíáOê±SÍâ¦ÇO6¤Îcõ:üñœÍ Ï>çDä éÂsÅÈí>NÅ$å‚»~d‰Â®0[:¬@ÎT-€ Dv% SôÜ–(¬}'Àå5ð ñU‘\d}ºbõ#¥°ÊOÑZ=º\Þi­–GKÁ”ŒquWrßZuùÎRðkk5Þ©/"߈Z Çyˆk ‡í|ƒã]Ñ]Kš¯U³S²ç#{=CÎÙá|­”™HWìp~(¶ —9‡h‡ó³aŠÃ·3!S÷nOÐê¸MM͈P+Ì 7R\¥¦K×OKn—JîoL•— +¹EƒÖbrf£/ ÌïJn†¼EKn’w,Ûh›¨ˆ#[ró·ÑÆBò\ëÌ:ê$‹ŒÖŒI_þœö—¯MÙ•‘paÆßY›rvñ0‘7ñÐíHø6Ø®ÅÕ‚¯Ú^ª½ÖVstµû¥£—<šÃ)Ú¤nîÒ9“Gyð»ÛÀnëKs6óšâ95å'Û:&+3÷‹nwQu+pQé} ÀÁ:áÐý„©HHjaþý@ ÚM˜½J…ÅN¤âùPdg_œÎ&5\¤ð­*ßY‚ÿÂÂr=ÅùÔ¨ŠN8^¶U¾®”B±§·>˜Sl«A9‡`ªAH¦·n§˜ŠA-dÉ!qwn·OƒŸqý,® oˆ(%™:¥ØÖxmŸâ±C´N¿ùŠeÖ¶Ø‘rþÅ4AÏä6{(8»ËlŠÄb 4‚NµeSo†¿6Íjï¶`Ép¸sÌ‘’Îo¥…{—[dBfã%¬• à×cNžOsŽÂgGo}¹ìE>;à c¤m.íüvb4EËEà ?†žr‹fr° [:|zÓÌÄQ)·n·®Ž\…óˆƒõd·Ô¯%ôqίæ(É¥8C˜MYBñœñèÊQbjÙ½ÃÀ½å(!³„…çòû%¬Å5V‡¼ÜJ+"-”‘ËÙÍ µƒp¹\õçöåZsûª¹}Ñ™òíÙ‹Þ’"ëD¡ySQÔa’ÅÍVÊ{ƒû7q4‚ã 4rIM¸7à…¬\•„õ¡K"~–¾H+ý}þ‘žHÃiÍAC³Kt"Zˆ¤kYѯ8£o§Þ’à †™êÔBRÙÏès¶…¤˜v…$ËŸ4Þ†±WŒÐ•îA†+£âyà =¯ÒÊ…A&ó¥Èîq÷Oƒm\ëŠ%©2ÅÅ ÎÒ¢‘q”•ô{K‰ªÌŽÛ÷}O f- ø^°'åúÂVŸ'ÒIígWÁHW¶úà³îè{<³ÙÕ$‡ØêÍZÉ7z^³•Ó¶.ÁʳÂ5~¹œ=™ "‡“}{<$å@]]?K–êS)ô5G%çßO¦½Ÿ7|§˜ÿN¦m|÷Áb~ÈuÖ‚›ëuûg´÷Õ“KmÀè9÷k€ 1<ÁL‚ps&SÑ6ºO‡ m€ãøápag†‡ðÈÆÇ. =?\rë*P<#RVŽ3¶>:þäZ¿Nxyf2 åK‘ýË&ÌðDÖÓ`& åO˜ À!Ý9¦®†V'`¥[2ñ‹q¿´R¢׺Dò_T—8òÄ¿_—àíæÌ{u 1+·k VÐ\¸_—¸_„¤ Ñßé^NÊmæZ¹RT î:¾’Äñce)—Sã+B!Œ'më­ìA ux6!‹Û‚š*˜Y‹ìy^·k$¸‘|[ë#ÈHm5¦'nÔ,¹^'ÕN½_· ‘tó‡ç«ð¼½6úîÎW©*ÈáÑÀkzZ.ÁòÉ#þȶáiÇ%H™¶.CÛí{’Zþ¶‹óÈra—º¸¯ŒÛ-3çÙXK<õ3¶©£œb:<ÚBÂÜ1ï ÙÌÁʧ(gy²U`5ÓBJ{^êäî7¬ª»`y„Ô.LMUP#4þÅù´Büíø´²šO+TI3ñˆ~5^+Ô•f˜¥Â ¹¥ü±Xúé‹¥¡¶ªã¦£n®kºâ‘¥Å–c.ÒÞt8§'tt¶ÿT¤Ói¿t$-3j>Èp|M/I+Û17!1cnÅŠ D€{ËÝÂ!Þi€6Ý0X´à[¸g‘‚È$Vrk¾_Ò²?té…62~¯:Õ¡L5Æ`Ö«²5}bA·Ð/èæüDA—ò® k:lÇ º= ¿r‹T {i²±Ö œnüLËpÒœ'v$)=ž'N¦!­4†Á˜'~ÝW ïôÎî±…¨R˜À±Ö{ŸìøF̳֫ ^¡ïžWÁ á˜NÀ.…ËlËÎvΔÛÂL© žauRfxÃB bå#oG»®ô9ëì\t–.Â!×K5¶–ü`¤+3|À cÃsĵI`ì6ý“7®%3^Ý ¿t»Ç9q‚±:óÒ72‡QýjnÃ]ÐDzf-F rª¸sTe_Ü ZR•¿íƒÅ· ˜ƒeûs€ –kZˆ³Í›Yn3{‡9xµ{ÉË·’©†"V©$¯…² ~È Í¾PfØ<ã=\¡IÙ ;[B‡“wTì »M„‚ 4ã M}GØñ®á•…¿x+ñòå¢ãïgô0í`ð»=Ìd2ùäæÂ­~.Š‘m #{Nô²?^K¸ðá|¤Ç5ñ§ê¾€”ùÅU]ˆ,Ë&›4¹((×Hc¶^6\6‡ßî‹7«J3ßö ìtö= ¥:`ë%8ÎsôTÖÊómðT‹ì…ë0Ÿžgõ‡Ú“‘Í|N°{K9ߪ“€BÉNšéø #Flkî ƒ“»ÞØ!Wæ1SyÊmµ9ZžGŸ„{k¼…׺ÕÚ:8Rý!äcVû&Ã.scë ìˆ‚öD*Ñ ½"/‘ÝÖA¹=»ÍÈ2§«£ ‡åO2ÛPíh×óÒ¼Ùók/áÇpDII4À™ÂN„wÝ&%؃™ÄVÒ”#’¶aP ‚½s.ߌ‚¬àù†ÔæV©¹¶º¤*S¿¦Z¯‰l ™üCµ^2"ôì ‚™§ YßUëe­*ù¥[‹ i^mµ–ÒP•Ìî¤_Ï©0ÿœçÔNI êìÏ){NMgþÙsú=ÉŠ5eì«"Åì¹êy©H*ÒxQ5UQv5eŠÏTÎòd~¼r–Ô}‹¥e®LÑfÑh"våbÄCÄŠ´™A©—ÂÙí<Ÿ X'Î [—È 2ðøNÀZ%¿lâ×´ÓyŽÏ9Ëé-»|$·öA‚¡ðG0±Z’ø…æ¶¹TÌ4•êà–RÆßüXær[ZˆS«±§Òu—‘x”R§¬ÜrqÀÚ]>±«w‰':NG˜Ž}Úoñ+ž©º›h[/ìö4d×ÖÛî) k»ÝÖã4V›4ÂTvvÕ§Ó–¾4ÜxW?SK6u딌œÍ;Z²ZWxJKÖóÇ{¿5EZ5ùÊ¡´:‹ÑU%ÝyÿûÓ¼yÌÝhål¾iÞÄš7œk¬½d “Ê5×¶r”?®y“l·÷„æ +=Ph«LWY•±V ­ÉJÚŒo$%yÌïÝœyuÎhé<„v±E_1orº|þ¨w—,Ç«ãœï 9)¢Ú›ø U9 kI­­<diük3´íe¼ßchÛËx6C—,ÅõÞ€ñ8-*̳ÇÒÏ£ª!¾ÑzÈIBW¾žÁô<•ÖÃL¿GˆÀäw„.ìh=ÂB„•%ܼέs/ P-âþvÝ#½_j•pçÖ–áXŸ&'æ#“Úøì¸›“@ðß’*Ó¼á€N†~I°ß>쬼E3¾mäšÜh]µ×+¯pLYK”©W<à}~Vy¯žrÛÚOTÔ2Ø)·d°ÈíÖ–“ø‡X·i<`ãhN ñª:nFNòôÔ‡ëå31m³ã] a°ÀûÂln©‹yÔ븋!jbÄ18‹×ì’ª x¨Êè Á‰øã¬§•&òEûæÙù*.ViB·5Œß°sš!ì´à2ûbF𦯠–"2ÝÞcà ýØQ½2¥t×\£û…ž‚î% 2ó¹(¨©í—GA“I<MÞüÉÒ™a¤ûQ°Ï°TUÌ+ËApÕë2NèTƒ¬z픞å7*øÍóïƒ$šUºCySËꬕºÕ‘ÊŬÒqŽï†°.Oìo-âq„¯Q‡° ¥bDV»ñ03üÂIb‡°Ò"ìw"·éfxä~9 ~¹r3®–|ŸnŽøKŠkš†NH~$®™‚)ëà„I𢘪³×Ü7ö¥jaN×ä[•ÙIÝpÓµ¨2®ë`'™ùsx6õ.!2f¤s–™?[sXËÙu0]sµë`TŒbGJV±#šmº½c“q‘¡¤’a®%îC'«›½Ž‹áU¢WÎ$Ö1•pvUr>Ò“ÖÏö6!ÚÚ9+¯æö0§bFß .ÐrUxSÃi½}º£×Ø3àh»Š°Ýð°/Î~ªmßü2¹¯ðËrˆdí}¿ÌüØ/›éMõËq›a’s{ã—i7×}Ç/Gªp %­µT›k¾—¼ðƒ#|Â@Ûy¦×Cm8‘ #¿Ë–ùÜN)Ó«Ñ8U¦Wo˜Ï©X¿ ÛúÛÆ]!ºRkG,ïaÁ±:qS~Ÿµ®`Ø¿/~X1åÚiþ:0¼+ Q€‹)À0’01|‚@ ÛjEÐuh†o“¬E-ÂOÕúq‡eÕÞËQ¹MdAü‰$kåtIèxus›ìI¦Ý‘¬f*¬*˜V+Òvð½¼Û„ýŠÙd•\Ô¬CdŠ pb[Ã_\°q‚wxL²öS¾ªw FðÕrDdiftè]Á×`T’Ëœ’ogsz@œŽo«¶ærÜr›)»ÚÇì«ý!øú邯‘ …±Fë¸â4[ #ÔÐ¥ŒÔxÌùi;¦0Ä—W8mGÄg†)ßïˆpØí˜Ó£§™$䔿¯FíìÞföÃ/mÛ!œ¶¦5îãqŸÃ òÕÄòvB+® 7,±]vÐuJæ1ÎH°¬?ƒ3Ø_‹ûÏE=*¦ZÎù¢©_hUn{8%ÞžÅHdÞ”õn“ïâïäu©öåeºà7Ù- ãÞtžEÚhŸH¢ðª°ó•§ÕR‹k­Zì´•­^ À½C¢P õ°Y#oq îÒÉ›vϱªd£î¬ñˆMm¦•½¥Jº‘d˜Ÿ‘`«l¥"–gd'´¢=çzr•nQfÃCÒâ.yôË:.â2$ñ›¯¡©Ò«ŒÔ–n™»Õ@ze˜ðTÂy‹pG šÖÅ[àcÛ—Àêö&/P‚²<ײ¾ÁÀŠ3è°Ÿè˜Á[¥í‰©ïÏ Ò>^isv Ìþ€]w.ÙhQLÉ%yXis´[C¿ƒ*ncîkJÏðøÔTÛµôѦ†¦ÿ)¨´ã!B¼X¬Æ %S*ø¥fÁ6o~ì]*íäí¸þŽ1Ri oæÝÄ5ó “C¨­â$Oe6dÓ¥»ßIesŸjì+›¦óÿ •Í GŽ./–.u¸‚O¡î/ŽYÿc7¬3r¦ œAåÐzH0›6x¶ %¦‚ ã` p­èn# $bg3S¦;–lÁ‰î‚&NxJSqæÜñÿfJ÷ÍçêŒþ3:ðAÜ€Àéu%LÝéxj2•áWróïÙ½•/@Ì1,ïÉRA&œ²íhÕ;UžáÖÔ[Û”í%ùšg¯¹»ó߯Jo[¡É?Ï”ˆÉÚ ÍÇl-O¸+Ìn·ºíÉá›%³—¡[¡†ÝX·BMGß'±²)!ÞIÕfì²TXW‡²+¾Î6s÷‰b{#Ò Ž?:ƒ"åuLèþ Š—+±Ò!"ÝC£ñÞÙ6‘®5êJ2e͆؅¯ méÇXKkÂk^{9óÞ@亵P"C`ÁÖÙ‘¨“3\ä “°×oº QˆõÖg;Áº;k9ȶӜ)ø;•÷Õ’2‰’^³Ž†¦Ñtc”& B¨W‚°@éñÚxŒAOñ©-¼cô4%‰­|ábvŒ¦½”ŸÆ™u91å|cÓ‡ÃNd7éž0|ÒiÍ€ŠÝF(”v”°†ÑJÅlãóµø”ûä|_ž¸kåB °t]ßz¸ï C¾ 0üÅg C»Ý{…¡,»ÂÙÒGB–.¬‹ï†R^c‚M[aÕII«§™Ã\ – ÿY–¯¢+¿{ Ë;ÇXxT¦\ïø>K€žCl<”À—›¿ãÌùkŽq “ÇXv"‹ûc¬«n;JA³i®ÇØÔ7IEüc]Rš¡T‚à9ZÆEÏZCì…bÿÎGÈ3…ùó”‚14‘“+øµ’›v”‚…-›é]¾F•šû‘ö>Ð 2‘YS«s}K?‚ãsé‡û•óéG|&ý0;Òš~Dþ@úñÝ ÜÙ½8ø…™Ü!R>xGgkÁÍÄîÞF?,iõSŒ¿CýΨñ;”Ñd¢Ÿ5þ~ÑÔš¼Â©«ˆXÅÿøUÛh±gi‡£Gò‰“X¥Ž/”³IûI,ÃߟÜë<äfËî'Då5þÀ¨ñwMDk÷.q¶6ryUAÂ3•Qªç%¿2–B”«q°¥%6 •ìnX²Û Ê`–óînŸîÞD4þÈùŠ’T ®{ú0®¢A‰?L±À’ÎŒYø—&Á!Ñ ° %ç½€«7ëÏHR¬u’õlêG f&ŽR¹cÞÁº:¦¢Ú:­ØòŠ~6µp ®öçªz,»úh–‡B¸¿z4µQ½ôm¡Ç×úh¼Sí˜Éõ™˜ÂDŠ£.ÄJiA8~å±@VžpÉZ18µð¤{$†7‰¨Ø§YÇ·½>•J1cî ˆ½mX)‰¯™ÒÎÅíHv9.$…•¥"ýZJ–9KõSEs0ü¿ÊΓtû-:OÙI#ä4‹3<ÁKCwc"åVy‹ß¿cöãwÌ'ø³ë¾õJ©%âª9J›½Ö:TÏá/,• C ¡&êè-tð4tÈnDêTUKLé€^Ä‹õvâJרotݸlùw“vâlNlÇo+‘ýº›dDÆ8[E1¥©²J@°O¼I‘=E³€ÃוcF^Öèt]óÒÕës4ÑQ©Ô¿å 3šÜøV–•pËöª­"wЃäYƒjªKuøù0ábÓÿâE#…¢E†hõ¿ö§šË3CXí©.ùÀVæÕ²J$.<ï2©áæ ÞLR;_9ÎóÛÎ?†ãœòŽãÜrdŠ¡Î}á87„wÏrœßVyÕu[%¹©Z©Ô¦íºæ¦4ö=÷7ñ@wŽÈá^|í@[LvaNÅí±¦äöâd uÉê ¾ƒÃN<äfG)#…m©±[ÚJG–G‹­4êÞ¯µ>Q;ŧ¯^4÷†Ç8£7¡ìK$;é”Wt,^±/Ý©G¤Õ'!Oæ2Y Ž•Ø&S…ÕëÕO\ŒTú|ª©™²;ñÑê˜Se ZÒ6~àê¡Â{:æéva7ç”*ðÄ"ZW'¥¬2á/"\Gý<ù(g9Ùt~åüŽÕ‡‘aHl0…D#X’¥ÛUâmÐ|yÏM#‹Ö†Ú +tnU}1îÜX³Wƒy52ËEŽñƒFÆL§Yúý!^Ìh¹&4Æ'C|WÌ*#¬a%‹^¥î´¤?q» !-µ¡Ú­ˆûÎæZš3åF£±Ôõ;Ñy¬%’ÕŒžOi æƒÀǦŠKJ¾éÁã—ã¥yÔñËg&ŠñË䞿丿äHŸ;~™+Bó)¦â0&™ÖmVö Óã –1ÉŒÁ¿Ï˜ŒxŠ¿=§“{艚ÀˆŽ[ÉÕ¯6[/¾‹ôv²'9õ£{bl5è¨*ÿ’œú߸—€:îØ™ë³¯R¤uŸkRj¥ÂË]GÐ^»1?fó!Q÷Žv¶!#+óþš!j¥€¬ÜŽ Yx‘˜øv0p·nº0nWlMÿ§†Öä‰×OV¶ÖDùŒ %ÚÁÕ!S{ô’Ìþ€ƒÕÝÖM­)Ieü¶ …Žìît Ë=SÆì{œ^L×Ò%U@ŒYeô^Éàs:©ŒÄr^é[¶£;ßÛç:çl77³§Ye$Sž`œ3ˤÁG¨”Õm„<á+¸*¸GFê[O=Ä!ºýœ\¥_‘sØ)a¥¦5 á1QØ™}Ç÷ˆÀM{Kv{¿6¯ˆD#wß\áh´/n„XyP­·;€¦)ÆÖHI»o†Ú#Úf4ž+º]hWH x8tø™Œƒ|™q´ÜàÑû'ð/â)Ãí†C]ü pƒjÙ–Â ©xj80+’$F…4ƻքþÎ1mÉÅFeZ³ÈÌ>–‘ã`_Ó…LN÷•2òÃÊ2ä«eƒ·Š_$9˜É‹p6r°Ê21\<úF~3ÛïYItÇ‚*rè˜:OX}Mê‰Öï9”ÇÈÁLó)rØRzEâ{ ÖoœuY¹Å¶r\;Ѫn¾­‰óGwuMüuÀî7YwùXã(&3\‰ƒm³8]6x¼&n>HYµïxbò3ÎKCòáV«.¯!œfêæ£©¥_Ë?\ÈwOYúZ¤ö!8LÀÿtôdÃ$éÍf*»ÔÄYÆÇ Y¼Ê4Þfe“0‘aHMaEä&³ÁE#Åëð# Èñ‰ŠjBñÇë¿›‰Êwõßý®xÁºØüqýw{ÖTy(K`JΩ/©ÓË@ºAý3Uëò–“Á¯ 9<¡Z·››R>º«ÖIl® ž*¼Áy(Ù/)-®ètÞè­ävIæ>\r;=›v\ŒÜÖߑťé/ÂOíÄÈ)îºÒ¥Ü#ÿVrÃÕÝ>ÜYUSÃwÎu”ÕF,«g|iž/rŽQÈæS$¯/*G[òK¶ô;¹@ÇvW&Fãxß• Üö«ÒAÞÉÞi Jé¡ö›èûôIò¡;rÝÕ@ºú‰lÄ¿ÊÛv”êô›ôÔ‚7áq£UŠÔ–f¡Pz¼py—ù¯~ÿ <ïårƒŸå5ðÛ8`3}AŒ µKùÑ´ü½*ü%‹ K´¼ÑjáhÜ)k.?G=«Le4Šy"ÄúÙ¢h^™$>^Iö‘ò¦]XœŽÔ:•Ib[ìU¬&™$²MV’Ö•ŒÅ‰Ì+yW{‚#¥Ûr?ÅÑÁÍ)4¹K­7Û¤.‚æü …ä +t:©nÊN ?·1ÃZ9s¶¼áÍD[·“/å|»¼Ð¶fjâÒÔåæ¿áZ­ ºÇNù_³ÚϺ*>¶*íÌ…§WÅŠkH®Ç„¥ç˜áÆqrÚ¨Ž×öû_e˜Ð+¥Ý権 Ý&2Eºw‡‰¢a¸ –#ÃDEeTŠC0isð l®ëÈ}øÌäðËå¶ßYøØ'‡ï,|t¬ [šŸc …¨W8ø ‰‹›¾! èµä—AŒë>ÿ/ª5jO÷»Z£ÄÒµFþž3Ì9¸Ük¥Öýb+iÉeËØ>¾_親¦¥S}TTh¿ÐŸÃ ýFº‘’Ò‰Å왾ØC~w¡¿¼´Zt—¸'×J¤´Ða¸\¯ÂÔ]~bpè¼² šñ.ÊFc”U(™ø,h8tWn{ÞUV‰l”U8[ÂG”n"rõsÂF@j®¶ªÊñ±åHÊ v))êÇ{'¸–ôDE^#ñáºç…#ÿÙŠ~b›l‡Ðšîg˜Þ‰•# .š9.ÊÚ»¸‘cÚCbz!ÿY-û%qú•ʬ¿“ IÞo²|òð€ÎXY&®f±và}sHþV¬eül`¾ Õ—ªõiPVU‡Y’ ä÷ßÁÜò˜9÷'¹†!©dã‰ÙE½'˜Â\ÇÎümB…êã@\q<î`› LìZ™¸ú6rœ¿ ­ ç²£U Û­-O^¦"™ì®¨¡fPu¯l+>™nžÜœtq¥ÖÙ8×rÕ>H†¯3]‰Šœq¦Úн”~Qq‘´ënÚÝ#œ|3»âÀËN3ø‡º?ñŽ‘©ÇØÇlÖ ‹ÃhUÒŠËûuÕ.puø{áâ•ðè£î>iûLÂäÁní»l‰ÉƒÖíx< ½É‡Oá“ 7ÈÎ8Áë.óYG†½´ ÃàÛ¨œåü¦<•N]urž¿ú¾«ùrý€/|òã®fËy÷䓵;žsË[¬ùŸñöÂR n¼Þ¥wØ~=• ÕͧëÔ}tÑã¦ÖòE åÙŠ£™5ÓÉõh§Ö$í4;ìX¼’/>ÌäeWqd#&–•¼÷¶Åóô8Ð ¡,ðPλ¥u^à±(£Çï.¬?ABð–û€xG¨‚#g ’?ˆHÛÕÓxm“_eÞ½mÊâ‘‘=¶ÂnqÅõ»²Š«czÕŠxå¡W¾¾^€‚3EÝø:4ϪêçÅò‚ÑnÄÕ®Q“³³ãj•e A.=Mx}@ n¿C¤ÇòŠb»Ê:méOh$ÕÚó@ïey†ó¤o ðnJ/YÖ/ÉwvReÛ/.!“;}ý>ßï¤R9ÀwUë ¡ÃÄÓžETž-I_¥;SæÓ¶ãg4©~ ¦mÉO0m›îpTÑ÷b˜¶mD ¯Ò³»Æ‹(9 ãØV$³pHáØý+¡fðþ*Ð÷›W) Xj<Úf¢ÓÍ&Ú‰™ŠÔÀb¼’=»øÆý àÛc µ¥Ø§Uæšu¸ë<s=/‚(q'ˆ"Ö ˆYT/Àå¡ Šqñ·±D뤻1~.@mÂk6—h ¯"M>#Ž'ÁÞÒèmú€4ÚˆviC“,ŠŽvÊÑÇ­§A=×ɾ‰´¶HB® -ÑUø¾—~B'«kÆ}úbt*ß%ôÎR?G*˜îät½x®Œé€:7`Æ:zf †¤ýO1;/¿|xÄl/¿l\ñûòËÅBa_h7bf4a‡ÛSìµã`6[‡«5µàÇX¤Eõ/°>Q»ýRŠÿBív[´”¼—ús,;íö`÷0T»ó>N€·Úí”o‹‡Šþél#ò–{Í©¥—Æ>Ö¥•×ç’OM/èÖjΧE:ޱ £š¶šÏ’ )…sVëN qˆÛøÈˆáVÈãûõ¥‘k‘TùGdœóЬ§à{7KŠË]Ïq*JúèAɯ;ä÷ ÏHå(“Žžà‰‚© Ö,á¹RÁ²! Ø^¶úªðÂSq­âxJñ³Ã5ø_q»“üž¯ÑJ¨í·;ɶ蔯1Ë×èïmw^øo2\gk}¸†$ºÑ¬™fHŽÀ÷6.ûYš”ùÇG7¨ñΤ¡ÄpL1)ØÁUX䵩÷¯¨7e56ü2¢+ßÛéí"æ¹`}6'3\µ(à·NÂLál „)닆9ÛØ3NÆF½‹qÈÊžb˜î´Ö³Åå! kåå<œ’.!˜¯ðB]¤¹TʘܾÛV|:ƶ¢Og·c¡ÇÛŠÑàd<©¼ÝrÔmÅmBƒ@j¨™töøN¡g±ÒÝ&tc7 e¤&ÇÔ᧻S†Ç §aÆq¢h6Ù)áp~Hí¢Øñ`†ÙœºI-÷…}øø;†GRœžGáNCrI}Eœ×†‡½ñµÂ†ùÄ(nÏ)¬ àúh &eÐ.?ÙQE¦Âfi&¸83À Þ - Å{¢Ö¸œë ù!®Åkú¾ÚZ=…7N0þ¸Ê‡>Ö/Æß]&7Žp‚]¥g9ÁŒ¥Õ)G ¤ò&PædZ!øº¦Nªœ`|»ŠÑ]V±Ó_s=rš¡•:ÃÒ‘üöÆm÷„|yÔ éTîr˜Û.íhëðEmâŒL¦¶¥l×ø “]Tþ˜b¸í”éÇrÛ¹ÛÃWÝç!]|i±¬õR“o ¯V ®=WVÖÄš” _ÖUäMl¯³½6$þfˆHY“d×µ ;g÷Ñ”5éöÆs÷kº¾B‹Ôö–Òòq´ ¿Ñÿ<%(Ø•F¥¡µWð[§w y¹ØÊC±|¸E‡àÎPºލÐ(Å“©&her·PM}(°ófêSãuÃPœŠ™Bâïyª¬}CGìl]œ$–¶„ê˜q¥:?­övxcH_qxϳ¸²uï°¸ªþ¶­TCçõ.‹«Íö¸-5ÝÇ›¸OÞ·T•ÎÇÍF2—¿¬ëS¼lþ~Sè¢ÖcžÑðFfq`D(:9Vá·M&-ù[r3"ôbS3"d9ÃH»ô·i:’ŽC•GTâ>S›‚ëãÒËO¶LC|d™&G+T“’iß¿ì(›ešP,%.®Ê›!2MuLw¬j^®ÉAOZ›ÊŸ”²;+­ö¶úÏΓ_)V¿rõßÔl\*vÀóÝÕÿèvÅä'VÐw«ÿñ{%okw¤Ñäæh‚“3ô&e‹tøŸ7»_ˆ–>l÷ÓRWŸB¹ðŒÝƒ©Ã)åBäP.”»vãe^r®Ž£,ÉèÜÚto4ƒá"¯x¿dÜ™šò Íà‘.Ô{4ƒlôÀÞ¥4?—à)Ò æ¸-X“s".<Ï<Ø“¤"ÁWö…ʪøÔæÝš‡oÿº÷l]¡ì6­Bv,iÖ>¢ºÀaT »Æ3JÒâç'6W%ýÊÍÕ"o®öœÇ5ˆÄ þyz_á €^VYíS˜®R>Ó)9:­©²–éÊRÀ—h”ÍლÄ3.ZÑ÷vtNv$/òýÜ’µ·èöH*+wǵµáˆ‡gŽ2ãç i÷ÊÅöM_…™~54mÚgl$? ñB+­ øÏZàF~Jèé %tÃçtZ ½wA€Š+ãœ2œ{ÍÚ“¬8¤¤ü®â)^ŒÞº ;ñGA¦ ïèvlm´µ-\…m¹ÀUX¾ •Û»Ó½‘”n;#=®Ó7”Ã9?]=þ’ƒ‰Á’/%géc,»ÁDÓÿû&$½L´{Ù‘íS¡BÒ·]óÈ=¨6¬T|iàœ×PUØ…<\u5?oÑ/¸¯Æ¶êʶ¸AýÒNpÉb„ ¢‡’Çvq-ÁŒ|Ûî™ôTjTæ·†gqê½ø—)Ü_‚ØÍöw!ˆ™{ñ…ž€ )œƒ G»Æ—¶…Ý*ºŽF5M8–Èý‡ùBùƒ…Åâ3ÂbÖ„JYtWëè ‰&®É~BæÒ*)ߪ󓪦—†Á}œ÷Öü5«¦t{z¿¯Ür©Ò'nÏRõt+—å06_«¦ùžø£Ðã'È{jn—-Ó?Ó¸Þ)¯¨³-†›O3x´#4Ãw¾cåJ ñYKãÖC[#Œ8h¸ÀòK*`‰‚cÇw$ôs-3­(Jrú¼V¾xù˜ <;Q«Œˆ·>C^ŒJqüu¸€ìÂ$ˆa-KÑŒ‚–d†á|нa»0¹“ nwxUn€oBºw]KB‹HÃ'á/l¨ñh>D(éOIÓ“.ÿ!x V½Ñ»Ì°²\š¥U¤-fhnÑQ¶Ín1ÍØ˜¿ŸÐÝÙ—…[¡öÂS¨Ìàz+qÅõy`"ý mŠtÀJaÇŽá,˜ØñÆPv`bš“¿mä\\A"ÜÝh3ùRÓ¢’‘F÷ ®T“h¥Ú—ß~¥z°ÓŽ÷ µÊœXäd Q±Q¿›³•ÇM“äŽø‹çlÍœ ° ?¡ RÈ6M¢äôxΖÂóª ƒ•sÞ§—Ëí¾UD¿U‹_”}ííZ¬SÅôsÚL>¹¯.Ö%²R„aƒ^oÌÙ²ì&2¼13ãb—H·×þ÷ìòRzN;Ç¥³ 9êX~–O+fZ„¯f-2µ6-fØ™-Üz÷k‘ß3¶LO3è&kÑHÚìÓ7 V¨Kž]Ô4áH|Õ]`÷X O% Ê©þ’?3Õ©m=fÄÛYdÍæ²õ™dò7m©šæ¨ŽMÜ9•B+t1o•ks¥g ~0!M&dl¿¸<˜åÈ::øPŒh'CêÍš’bz^ a w!Ò’ÐxÅR'oú²‚&nuýþ¬Ìñ±•cÙ[9Ÿ²r­“©R§È}¹šÆT-‹0`´œëû"¿Ñ¾È(Îç6GuZÍê·aù‘BAˆs¾1¿Ãé8Ô™oU‰ç‰áŽ@7|v4•cij槬+–W(93—vƒˆšÉÃñmO]Q©9—'ò;BrÇ:’=Z-m¬¯B áã¼YøáÌF°Š·YäS7­R,&•ö—IÔÝlU½M3 r2Ëmiw®3¹­9*šÅ·2Uªjvå4²ªFS\Mþ åÿо8¦}1j¥JSE.¥×6¥÷ ðWõտ鎹S‰NÆå~¨úPòå±úir()2 }\}ht`I~"ò@º¦9йˆÃ4r¥*{’æ 98¿`çÀ*LÊVbF«m·I|fèŒèÈa øµÕ‹Pö#ÎÕæXìÆý6»q“ëJÄË©ö iUNÜTVâÑúÛú²ÐíÆóDkñ¥þ»ëËÉãæàMoÑelÓ† »¾ŒWž__ž±tDÉš&f»\Hû#øÚÿdkµG:aŒÓ2SÁ)8«Qg–òÕŸ¥]µÀä½ZsV£îvÇ|Æá\…°s &Åù‡b´¸zûÌÙiÏ?| DK©éñˆIô݃;0rI)7Ûx¬ •VƒßÎØ"!íhºáÌÒkü×D¶ÿ“!S›ðÐÔE‰y[sÊ@ìKãÕkòoMŸkô£M¾4N4}^E’ŸnúD·kú”m«=#IÙ5}’ ‘x`x[õåPØ›¦O»¦¸Û)ÉË2¢ŒÔê@^µO­+ÆXƒ›ðOqÐIšõÎX(•‡C’bJ9/C’[®C’v5ØÞº¿Ýÿ™‡§Ã‡5¥¬‰K»‹°yÅqCþr-–Çt*lâ —Bð×aÁTløËVìX0Ù! oÖ”u‡`Á‘ë Ž|˜Ï7jJ£*:ú[Ý•a÷¥ªò˜t)øËPÝÇîEb9t‚•`ÉÔbœç–¤´ämð$•¸6¡²àú¶óOHƒÉ‘kïT¶og¸‘}ùÛ@P¥Hë #ô‰‹¦ |½IÈA™ƒÞø³'9çºéìÚËq×mU‘àº%š~½-k´¸Ç®;§ƒºïºÇZe„&®,¦ÖêVž]õå*Ps¥üH-”£œ²ð‰²çÙx·…8­…æ'j¡yOK_¬ Q"-S ·'æ2çUB­/9¤Ô0 `Iíä•ëÚ6~Î?¨m|hóåSÛÆeëµµmåù¶ñ\*(¢ŒÒ“ØM©­´Üº«³ŽÕ>E~ûä±µ·¨¥|ˉ;Ò›<‡d¯œ*I§1¯­9!¼ûåÜø˜‡Ü^üŽû1ØÖ Eë.žã~t·'²qÀ?AõcÁ¿öJÝOžÜ|ÃqåÝ(.5Y9]éå/£¾Çý°ÎÖœ©Š~€^¾„ÝA¶ºÅAŠ­‹ë´g+@0„Y€Èy,wô®–LªÒb/-3à…ŽT–åE%jË›f{JZÙMO ñ‡h^÷ò%Zµ$u‚FZAú³á m¡FL– Vu¯îм®Òý¡Wàá}unƉ¯½Çyeèø=еb*Œ2£²~vKÓö¤X[r÷,>W]!(ß97‘Œ—\/kÅJô½=®÷|‚Œ˜ÈÁ’„Ø’D4JºZ’H¶$‘’ìè ¢)\(± 7% »Ó¯ÙýmÏPð§kJ·RRm®Ï!éÛŒºTwMäzã ”^ÏãƒÙÄX¼j}¤¶¢e ÒÙD£o®³‰[l@ºø]îÌ&¾¼‡6søÖÒ5ê ¨@f‡t^”;Ì\CÕÿ’ÊÆ¦úEË¡FBS¬„& K±šf®ßÊ¢œI>p–ÊíÕ™¥‰4.¹Ã10ž¯RÁ;é×gòqûÓ”G’jM>ìfè»|Üv7÷I±ã-Õ®§ßvm8 yº‚hØS¨S| Îõ S‡/WG§rÄ7ÔÑÃcuôl¨/ßUGwbЇŽ~žQGס¢à«(Å2W”ÞT/ˆ¹Å•Ü[ CèãͦÓà#—x¬ÙdN ê`F³ÞPÄÌêºMÞ@¶7-»†áÐZÓ=¸×„d Ç‹yèIS9¡1ƒ,Æaùý,– ¼÷ËÙíËå#‹ååöÞÉ©ö ™£«Qk…¨õ®‹Ðx5^9i<=±w‚ಳøÁM=gIm™€¬Ê\¿YÅ•‚ý%¨AJÚ°%]Ñ=ñ;ÆÉ @°ž[w-Då8²Rñß訂œ#U ޝ§£b;ÄßÓ|Þ¢£òyGãaj;JGe€É=:ª5š„V_ª< 5G¢Vqp=ðq¸®8\ëY÷W`[:µâO+´Yþ÷Ú€ŠUhÚ&Ìï­8À äçWÖX8ÃH˜Eý‰keøº*б£]™ÛN,½Püj®/¿S¢9T¶íM²T_~GÁÈJoþ€Ïù{}kã ÚRôA«=À~57&\ÍTåÁrå}í”ý ÑC`MíxD7PQÙñˆšl;k÷›-h1¢ÝùŽžîšáÝ^r*l ÞÚ(­S—ð+6ê(Ó®QgHàYŠ­ÜD+v SÒ¶QgÅ%Ôk¿¦ýŸjà?ý›?ÿCõ?TØï_ÔàíïþùÏÿçÿø¿ÿóýG¼òOÿß?þã·ûðïÿî¿ÿïùË?ÿù¿áÕoËøþõ/þË?½ýÅ‹ú‰¾úü¿ÿõ/ÿåÿÜÿñïþùŸñú›ú‡?ÿ÷?}û»ÿð?þŸ?ëk¯ïù“~—¿úëÿùÿ¸»Wòðgrr-3.1.0.2/grr/config/grr-response-test/test_data/profiles/v1.0/pe.gz000066400000000000000000000261551273104013200253360ustar00rootroot00000000000000‹sÄVÿí}[oã8ÒèûþŠFã{ܰeÇqpd%Ú·cÙÉô,Y’mË’W—¤Óƒùï‡W‰”h‘’“ž™Å¼4ÒY,‹ÅbÝøÛ?>|üc±[úðÛ?>|øh¬’ ÊVI|ò“ìuózòÉ—ûà¯_ÙOV>þóþÞ«5¸É÷{?¡ ´Úw3Êý<} éçaúkæÓ¯Wµ¯›àX|Õ¾Nýçyì ®ës›ÒoãÚ·EœûÀu² ŽÖþ)|¥M?56]žà¿éGÐôwÔáãjùh¬í‰¾1—‹‚ΈŒ«øÅO&.ì°ˆ£Ï~åÛÚOýäÙ÷83ß­Ð÷O™÷ÁÎO"§$â°Úû)ϼø%âˆ,ø±È8Z -÷{ŽÚL“G'9ÿöÝŒ!m}±6ÆÜÆ$²6“! õšfþq¥'ßt. ѯ4yŒ“¯ ¯j•ψNà{¿N+¾V§ß`P'nP£ö¨ ¡BíëÊ÷¹ó-8æG–F›•­Of³›‰þÙ^­ÍåÚÜ|á©$jaß›w÷¡„­Ëõ|2ã(&l7[>rT62“™9eÏœl¦/<ʺnßN¬ üÈ! ~×§†Îc~\M,½Äs@~OtþÃ|°6SôrUtD;|±ØŸ¯é«Gqù;?ð§£_øéßnúgs1å§µÌõf;áç>¬¶k£òQ+>.-ùoƒâÜA¦Îý>5­Õd£ßó¨åZ~68äøwöä†'¿¯ÖË•±Þ|¹36ÜH•ϫ톣ZýóÚ¸å‹P'øÑ~4ýG'òky°hôWÀaHKpÆpc Œú`ø“ K~렟׆¾\Où½‚>Ì—ÓíÌà÷ú`.6Æúv¢¡ð·bMXÅŸô¥>›XÇ£ø Ø^‹cRüûv–ܳ*;>LÖõYƒm°(æðÏ¢D¶O¿ñl¥ÑŸÁ®¶6ܬᯯýýñæÆf2l&TÇç>}=tÒ‰@ƒü‚á}$J m÷±dmÖ[}S¨2ÿ'"çè{ÿ æö3øñ×ñ?ÉÌ&ž—øiºÜOÌ_zÿüðëÇú‘gï¨;BH>ü¥‚üÊ¡Ȱ]&^9¡JÓ•Ÿ¤8ä¢L g✤³nY=½¦@1 3(a™ÏðWAq ÄQk‡ãCd¹ZÁw_¿0ó)[®b Ê#õû·³ƒºONR4ñ÷nœã•Kàp.)ÉmÀŸ~*ÿ 6ðÿ¦?󸿔ÈU‘OŸâ$« ÿ¢ß×Zà…†òñf²Òù ë«åzc.îlx œÑ“ãÙkqÃÂÜ%N”‡NBšŸ]GýÁÖã0?F6ÝíxØx¿Ç¿‘?h,Ln좃• ÷-Û…D¾q“öü0sàïdô¡tô…Û`Ønìî@&âaØmï Z ˆL3Ê٤öX™ÔÏTbzcRF(~Úª?÷Æ7×?ỡ'h• =ðú÷@xƒM¶C¹Ok}~ú‰kDZSÑ”‘›Òmö^eò^Ä[Ñ¡8Œ‡ª=JJÈä™mü¢+x§*õ"?‚[OÃþHaõd4&TÄ«tt‹‡R¡Ì©½Ü¡[´‚ ¬Èió”Ä/f´•(•Úeûº5ÀΩñ&ø ÊŽTôÁJ\áϯGaóÍS}­~¸ÝpÂjŸÙ)8Sœ3DPöÈ’Ü-7¥}kÎŒ97êKzgÕ6ä=Õ“m›Úy”§¾W³ÈýgãK—~æ4HONæ>U±1‚nmîjßVÓ#Iâ¤ö³'eî“åÿ'28I–øÎ±Þ ‹çà ~6‡š¼OÂB à‡Y°«ý¾¾FÐtRù}fZpeÛ¬¿ 4Ž5n€pÿª"CniC]7RÉPo¬Â† ƒžt Ó öqw*â#pŸ–y†®RÒŒ9µ¾ƒU;:XèkJ^<ñômÁ£=¯É0ö“Æ5è± ý2½*Û€½Qûi>­Èhì:ÑΤҔ~?sO{¦ßÇçw6k¶WË™©ᑘð×<¸ßýÙšYý$?ÚPñFwfÖà\×VJŠñ v<=£Çª÷d•%Y­æ¶9ظ Ò—ÛT¶€b«Þ:€3½ РÓÛ϶­é…Èp“»_ý,¥‹þëÇI’8¯%qèM¡­ê†àó(ɘՌž0ð0FfäùßT(º‰3'D® ñÞlK[ à ú•¢IH_é¦x 5x0P¸‚åÍVÿll †Rb;[*ÛæÎ78©-Ã0M­ƒˆiÝk³’½Ž Y’ˆôzqám5Cé*s3TfÕmÚzŠs“™&gÑc ƒ~Ë”ˆ<õqæ¯üÄ%wÅþ€ëÌ5F¾GYˆÏé¢ÏÀE4r_•ÌEÐw£"­VI\E[“ ]8þ`ã+ÅÆ}4CÙ:¢»v!É¥…š›ì¯ý¡Èú“ï~mä(w¬ŒõmÉ£!ËIžY;!‹¸@Mý™ÿì£nýžgÚ£A WŽÁ)Êj\rdÅöÊ‘ òŸdìUp×ä–XÈ„ÜÆ’A”cÄ¡jk*òÅ¥] Ëá׫‘JÈ¿9s€ÉÚ¬Þ?G–{×Kݰ¬åI7,ÃÍÅí’»ŒÔ„–lÕå…LX''AXš” H`'æ¶²Êõˆ -ypÂÜç/I~%ìDU©Ĭ(©¶Ïl-¯aW5Y£ö?«ÌëLOvÑO¤ýMïZãPý•V±«Ÿ^3æQçÚ‡æ4ÜoÊvø²[´ûp¾qÅ+Ö`^ÚF .¤Cݾô6”bÄÝÝä{%siׯį`né“õÔÞôl}9ŸO¿n_ŒÄN•UÚ™DO—µ[õëNQ3´Ôi³A£xbgÉ‹¸ eí’wE×9^!Åd ëËzò9ƒšG¾¢» ªwÌ ý¨ÙR6<×ì¤áðežfƃ1ã•ü'œöZýRówäìB¥=Ô|‚”÷¦¦(zEQZJ²© «8  CdîŸbý¦›¦â)ÆR¾n{?ÝûŽG.½v5wgÅ98›•®=qò¢Æ×—xëÜzHJEþZ&ùñÞ’ã0në} ¾¨Ü)ÓÄuãã©p4$sH¿/gâ¶ã&i‰m CcÁ8à„ÁªÑ¨b=cÜ—NFõÛg? Í  .9@ÎÉûãL¦ðZGn 2Qã½Ìâ¶C¯ ¥–yqùù!»Lûô~»L“]È¢àVÕÒËÝ¿•ÌQ§§d¿ »\Nƒ·Øå§çÑ»Åá+Ö9-ñ™»:x•ÓžÞQLp&w“;šìÜE@<þ}´ü7-‚[´ð2Ós„^Ôͪæ†jï;h¾¡ïì•"ޤú13'œ‹‘ºIpʰ3º8†žœôIeK]ô×q癥T¯ìx¥C:ëÃé­úr±1~Ù@]XÿÌïpè­{öoߦ‹õfv²}»žÌÊ<ÔÃT!³ ÍtÇ}bd‰]z°ù ÿ[¦Çñ×ÀÇ1®_†§¨°®­ÏLÖ6§Üƒ k¼ËF`¶ùÆæ ì ï’5$ä… ®K›q>(SvšôT¦iÒW‘QÓDSôÓd ¤QL“‘š%¹VR&Œòø$ÃÑp°îZ†¤±;a!+Û¯žM— -ÅÑ °CEŠ£G†–­ ÉHqLñÐ#é¬qØ@ÿ“Ço8X}oí`huBÜ”Mnð«~Kðm;™å<û¥–dßΖ3;y0ìÉÚ˜TnñþA'ǨÔ妸é•&ojà¦C¨·¤éPÞôŽ4íÉ›Z„Ä*·&ÒpµDÉ ^ŒOº(“k…;gYBêu ‚£OÚ@ä‹£î¯% Ã’£C#j°<³Qà.m/òg Eåß=©®#]FÆ1.c¿"ç„'Œ þMiJø•ü÷×:,…Éã9Hº\¤ÔšÛ5íáÿ ýñ{eeH´B«}V_Á¦+‚QÿsH®#7¨VqÅ?²b¦ =é-Nß “s¿'Õ†ÀfYÄÌË•ÐÜòCß% ¹6ãaˤZjÏŽ Õ¿èQ<Êjybž‘1ã^»³;²Ùã¢)ZÇ9<²’H¶úwSÓÞ7ö JàCä)côHžÿ™KXatÕ†-ÅæýTW™Ë²U"…}·Å×Rˇ¬ÒWRïACMÉ[š}ULË¡Œvãö^ ÛœOî ¦VÚS•Írý…“4¯LF_bFRÉ”ŒoÜlïx´z&æÚy¡É˜Ò­ƒù:.ØF`/®Òµlîü;N`’!>ÜDzE™ס/õöA¿‰Ù©HõK°eªT~@y å6ØêÇ“Ò.§Á*Z‹[Zö½1™kÞ{áÛî.<)Y€@Ó“Ò. äÉK”´NBWiS¦XWÁ5Ź*}ðuNëÉ[†{'ò_²gœÙ¨ ™¦@*”¤äy†m¿9a»‚Å·‡™º´½üØ?ØÒ>RkL’ 4ŽŸ#œÈ :ñSùAÚ ;E)¤ªVÆã3ôöZÃ%Ww…y‘+ÓPņJö­ñ LVå%méS+$-UÔS¥`Т4~“„îT°î’žçâëø.7Nªæûsž G1Æ_ݪKÑSìUÐSzº¨un‚W æ(­ØÚËçÜqŸ‚ÈW^tž–ÏG¹Óëq‡jÑíʼn;mh¸ÌXéÐÆÕœœ° ‘ïëKÄœ£í}óÅ^Læ¼oç>ˆ25ÒÕÞ 4â,†SÃÒ׿ ˆ )ãHýA’fEª§<îšVßC‘ÊR*oÙe ìã1ê½ã\lÈö³ð^/¢‚Ð/™AìYû¯jl¿%2BLf¾À\,¿¥Þ_âãCµR“|÷ ªqo0‡*aB9¬©F”%¯Hš(±)<æ–{jÑ”Ê}Ü\ùJB²-¬ÑJ=#ê4Hâ}5^ઔøšÉk>Ó0ìþk©¼‚Œ2 ÁgZúAªu˜@Iö©!Õnf1ä¦ÂT,õGÌ•5p¤n db8TêsU}Võ…ï¢^Ë ÕŒ8”“V [+ߥµ®jjRm¢#¥nµ‰äªÕ”†MôJY-Y?;“ȃ:â™OrÇRcx6Ö”T *"Ô¬X4¦åS¥Ç fr¸È‹ò0'§E}> ½‡œIʶXgüíQɧ¦–£ÖýZNêz¤Þ‹™ÕµÚm£ Ž§T—(ø-•t‡=Ñ@#¬ZdÍ\iO1r ®†ï{Ž]v0õûÚÓɤ”ªX9žú½áßçÓßçS»óIîVûËPŸÔò9…§ÔX½ëuT{ê8*œWñCkmXËíZ7x{&˜÷ç4’Mhzð, |™W`ÚãzjïiQª“˜„~rÉÉ€AÌ”;ŠPý=ÓkeÓê)˜zÌ´’úþ³@vsÞ?­V/Q <½‰§lx·ÔUÚ·[PU¬êLf8Ÿ¯´  ›,‚R5j¤n±y…cTÓ›`ŸxæB{e ÏpÕÈ9èÊ{íà ¨…Å{ );œ+CJ­BOuO¹§¢‹›Jz¯¨‡´q_«0k<ïPXµ,o¹ÍývñÝH_é¯ ?4­Î"ïÿ¬4„¨;jûBØï[ßZ¥btÓŒGCîìj"êhبâ~-«‹w¥lkò¶¥ñ9B&yÞ4ø° úƒ±‡}.ðP\¶\£mÆçê–ËëŠsm-˜q~?YS›”ÿu\ê‡8ÙFR*}¬J\˽Ýa†Þè='‰ûdàŒ$^ƒk|ùVH‰ŸÌ6Æz1Ù˜(JR¿77@"m×€‰`N–Rv<¸¬Â<]%ŸÜE®¥£ž¼ž²ØøvŠ#ZFjÅšéwE¢kéÅï6ö¬)±ºMá3²Úí›éøBÍ4aÂã)ÉOÇh<çr>{S—~‚+%‘ß™Á…[üÀí½Ç)-µ‚Μ4Ãö€5àXSqÀË¥ûP~yù†.} 1ùSÿ”=á+ªÔÙU¯=#y¤AV½ùŒ¤ÇüVcñr7£!g#|h+l˜Å>ý1Ýê›[dAÉÇYi :—×"ŠÕiÊʤJUàzcËàP¡˜Ìf‹“[¹±½£1@i4l§k2”6ÓXè|Ô¦ÜHê¹à2·¯Æõ3Çí®-\®‘4•Éröþ Xè9±7]e ÙV„÷ÜI¿âM-57!^Ò0Ä¢­iµ²GDÆéà½0%Qï×4ñr²†‹qWsÀ£®Tªá©4ˆ5N®Œ{ÊÍaJ€·B€™§Ü@zÎó0 Na V®èösœ°9î)$Vˆã/¯{*‘ÿœ„7Ã\§é€;`UáJê7BrxDY»V3nñëÌåÚ¨¼í¢üö $.×ö UóRCæP«)¹?Ë&#èñÓã†/“•Ï×önÊ¿aTÓÙÜí@°Î9´ªÝL,SGuÿÖó yë ‚隺‡:Tï/€Ó!#Õ¶Æ ¼ê½·Ý°Ì`R! ³_âˆÞšåç"3h¤å®)?º±1o*Kì‚,q’×m ËRa s꘳ìß.¬Ð¿b›RÚ¡gùá¾$VZ„Pµ,#÷ë|ŠúÏêóè ßÑq×5­”µé+¥L®Œ¬nóÅœšŠ2uéš\õ¤„u@7ØÊŽ8AÔ= ÇR‚MNЇvrÊ"C|1´· Zß n ¬e÷Ô{/8|ê°D7>8XÉÍSq2ëÖ”uµb¾~§/§°®ôV–¯Ü˜ƒ *÷Ä 5€—¢ê˵2#z’9L·'H*õ"¾Æ7ßÍ3Ÿ>[8Æ”^m%uqY7yzeù¬jU"i{iñÊMÿz(ïRÛBÒ˜KЧºm¤æå¥µ N1=µòNKÿXÕj»è‡«8ÍíaÖhn$Ál -YøÌjwY$ïÒÔ?îÂWò˜Ùœ(<=©5±,c~3û”Íåz ç“•xÈgJw0ñ›‚`‹ý5‡ -ª9#“0È[G^C°WX¼•<€žÜô“{?<‘=rÕCÖ@·B§ŒÕ…:7£p÷¥–rÇ[F€>2÷qòJ/½×£n¸TáQ&÷.€—+¨kAý 0 Œ?X`­`á$\pD*+PùîBõ×~È ÊxÌ?3Py%c•%ËÏRZÊÔѸÁÇå´‚ œcòíª ÆŽþÞÉÃì¼%D®È¨YBˆ§yò¨ÑÛ×ò-· {¯uÈ›êµvÔµ;ãÛ >~G%šƒ.ÌUE4ßõ pFf,Å¥AßÄ#«Ã÷Š ]è&{²ž‚b [ÙÍ*†?ö*Íú”Ë|5^Ç¥5xªØz?J‰RwLhû?Ðk_1£"šíè%ŒHšÇ^–‰¥ÂŒà DÐORaÖŒð©(±'éYD³«<ž4ó£C¦TXØJ±!¢íš]±õF·'3°î{±œV^¶CWe‡ˆ—¯¤”ö™(*ÚD+5³z£Cî$^¿á•Ô@“A Hƒˆì“¡\Oäiu†œ{¨}z~üyÌ)),°g¦šP¬¤ÊØ<È<0ÐLèg. Îñ¼¤‰H±úss…óïÂp;¿ öX {L¾zõ F×rœ˜„“éÏÖ±æ ü|ëaO®SÀÊq¸!,\!®On¹á†= ü(3=Æá_ÖæMÿU–ûå  pÅ *¥þèi‚G+ Oº`œ'‰c/Àø¾ZY_Ò=ˆê ŒY¢uñ†Mw+eµ«ÁøZk§Á¼Ù•bê;…#»`ÏÁU €ñаÝñT¡jgv÷m˜:G¯‹î~{²â}ö®¸œ#­)),̸ Õ–ÑÆO`M/<øt%{¤áÎ nà3ò…}4¹S•÷¨U¢`Åþuㄇ¶ÕŠ”h”Çì]6´Ë@ë¿C“en®•—µh££J›ýë.:Ö=85PéPÍ6K­ã÷NÊ9þÁÒÈ"à yfR >fKiB¨éMXØ5ÉpÒ‡F'?IcÌq¥<|’{ " €Ð{~d¨‘ôMÓ4Kr¸¯Kö7†'Š,ßLd™)3w f=RF\ ÉÆ#©Pôô¤—ªôŠ’WÀâ÷ºØÓI¨ÖÃIXˆ(蕹ÅóWRç ®¨™·Bö0ï_cãÜqN¯Û8Yd@À,1w1¬–”ƒ/„³ò“=4ìhRþ=% Ûkæ§ä…ÝÎoÞŸ©/¸äŽ^:½FeáJkù 7L™ 8}(èà E}ùƒš(ÆàÍ$sd+£ˆ ‡—Yp¬0&Æ›ORëÆÛ͆-D_ñ¸c,©Ï^ÌAãÉQ¯±–æÕ{®Œ^h¬†Ûh¡CþÂ6ö.Ÿ{½qGh-‹`?xG"Ï:pÌãò‘Ÿy¿‹³íÑ àѶŒxïòà“4ÃÕ ¢¼ÐššËª[ZÑx«Ñ!:Q*ˆ,0¯RÃêuòøm<*o„€>x‡”?ã VÞÚ’ë8sWTJß ×:¢u2 ÒTŠËÈ"ZÎ,Õ'Q*Ä›íÚCÈ òOÍÆ¨¶Ñb%xì­é :žX 0ˆ.2½A™€éuS¬0¾Ô`Þëu}G«fêá¬c «Ûμp£ü6×*ñŸƒ8W3ÿ³X5M•}C¬,×ÙêQ6Z™`ØÅ<Èá¶²õÉlvߊ3æz¹°ú¼ý¹fTò8 ¬„5;œïDùé.‰ó“ÚJdgÆd±]ÙwëåvÕOw"· ·R —zÛ§iÚ½/#-æfcw ;-í¿¸Ã2Œ¹°6“…n¼åöµ1_›þbïq…Ó¶ þû0vª: ‚ôG]à‰t$ ¯~‚ÃàpíÑ.à>œ…9î²)†Í»Q²QíÄ€»‘´i7`¸Ýh+-ʆ¿‘ùmQ)F þ¯²'ÆŠ[@SØcÅ ¡uÂMDUŒY±37:ÔlüÆU¸!мYš¹‚íDŸFÞ†PBÉîÀ¨ý›QŒcÖg×vhIô§ŸžPæ-÷SâŸ|'ƒ.æ¢v9dk&óÄõm'Šb½Y~åàŽY¸>¿®¤Ï$‡~qLyqÝßÁ@&FÔ"ºÄÝJ`$~öŒë)c««hœŒUÔÎØ‚x—ïùÚ;’s|I¶ˆ À¦Á÷Á:gÙ°ý\h»íFMÅûì}úMYGöž–cÐÎ48eI+åI4×ìxÚÓEÕÆ—:ÑC/x¶3NŒÿ'›rŒ\ï¤)3',¡–*S 쇳°Ç¢&ì©­Ã(¸W‹Êxþn|ze¦êž‚J¸-ëÛMýÔM‚SW×ë”Ä@Bd¯f†O $åkçX5{ RË:®O_4¼0ŸÊé…å*{Qqà/Ë=תŒ"©Èáî‘Pµ…yB¢:MB%µÁ%~)bï †+…² åOb ɼ…´­ð)}‹Æ©H»s,yÜGÛè%ˆ<¾¬á¨/Éù‰>Z_0Bä¿IÒFÑ3ç`°ôûÔ¸ÙÞÁºŸ$€­Ø„;¢ïçN¡x·D¶ž‘½@ä¡*ÐàZŠšÃÕ¦]´ñuÖeª’ °®'õ<¾o’À÷6O~ê+9»ÛîDÁ$*H¤ßo„¾er~Ÿ)V±l†2½‹“J¿/wÿVò6C¡œèØ€?êµ×WC7Žžié¢)=Ú. u_í=ç®”’Ù¨õ˜žïG'´OôQÌáøBˆ #”Áòjt!Ì#P£k˜Ž†o5{ŠóÔ‰¼ÔNýS8ÔÈ? ÷5lØL©œŽ â)N¢v!ÄÚ¬¯.‚(`Ì‹öXm©/ј÷‰ãÚ^p •@†2«éÆÑœœKÄ`\$!¼ê\d¶bá¾Ñ.¡&„ÈRH_¬ÆŠÚ%WÕÈvSÖø‡õϪÔIÁqíà]Zqx%ï>Ám‰+ñÊòŽkapÉæ8Õ¦(+|ªOq ïÂMQ–±ZQƒKX½Æ—‹‡(]j»6̬uù/øJaÙÖȤG UØzç2е<ÒÆ ÔíÉz=ù25,î`¢gOƒcªôÔgrØÄc^›S7¯Aurk n–ÛEµd{‹„!¾½#‚ð¥„píú>Þ˜‹éj³æîáiuZoDºÎáv»ÐÑ<6á)s㣒›Ê„W6x-«`*Ÿ(`ò0Y³ˆTæ:[Þpüæî¤ëÑmuÆ;îåË 6DÅÚ¬/Aç QÑ'70Œ‘C²Úm½h)ÄSWjX›õ»cÐöjVO.®f"üëËùs`Yç .ú»#¡ÄTúÌ\å½3IбÎâbáŠ}·5§gQøòCñåÜø€<Æ»cp&Q#p3ûCÇ¿5g}Sò}Ù é&³ÍJ‰û÷'å{ó=sÞŸÏ6áÑWÆ#¯ÁYŸÀã_üÐ^­—+ /š“ÅæGÈfv¸3Y:)Üø‡±åöæÏ¡=l€Ú*I©­ùã(Ò(¯¶³‡H‹0j]_ëpsÑ฽\b²ÊaÙ¦Óí1“8Á±VÄg]4¾ ¨2 €qCØ?úÔÐyè}P¼È.ÉøÀíÆÒvEü—<²gxª´lJ «É¬Z…¥I¡Ý 3É [JF)ÙÒÚ´V¨ä¿Å“Ü—¢Œ–.¬ŠàÑÖR%/HOÇõj# 8Ï೺ãü!bÌŒ9µN•ó¼)c‹¬BætÆ…èî„ï-T["‚ÖÛfœYFfgBRÿtv´K³„†l0™PhªèÁÁ·¨CPjç—³P™Êª6Aò^ RLδôÉÓ>šú{?Is34£? Õ–[µF?ùé™Ý¬]Š‘¦. vÐΔ›~ÑÙheÁ¡) Žò]ÌÓÚNfúje£ »ˆ©(Ì£ô-÷UïJÖaÓœC-kƒZÉ;[çQ}TÄñÍdVƳüŒ«séP^eï…K*‘$4¾1}Y…À{™ùÏ~¸öÿ“‰Ú‹Ô§] °›ÚR šï®(çžØÁ:—7ù¡Aóñ^HÿòÁ¨NT¸È· %I–'ÑeoÊèTæ†sð•üàBþ†«SlNsö^Šy™nö .=7UÑÓït ÷.gËÂÁC"ˆV…žgJË£I I›å {¼GçšYö¸~cï\',Âqð#¯‚M3}¹xP« ⃻TlàQZºOYÅŠœ;’0À¾¦Œ¤çgs1UÃ)ˆž‹1FÊc˜‹‡ågC}”ð>’Ù£ESÙ|,aêàŠS½ƒJ|ôL^¿ã‡=óHˆH€KX>D Z„ °-ù¦ì†«´/›²5¶§WÚåîÙÖø&¯k[£V^!×¶F¯¼B°mbyxUγªåæÝ×Ên¬rÇs¢|0Àn,aŸîfjÊ6K^Ï©2¤-fÆ= E+œOʵxb¿7={H¤ql‹ºL›?ŸH¡t±iÒ¶ÕB¶PÈŠPÓ RÆË÷Ô!Á#©Ò«Ô¡I3  Šp²*â‰Òx›«^ª¾Ú¢¿úÉö†ŽB:ºû$¨2íBY 0¯ŠÈpQ ´7'%ZÞ¥+¤moßUGŠjÿ =)0iQñ*ŒŠPj9ƒà®©vW SxA_u)ÐvçÔ¤Fmã´Yµ¶£ó«\:¾¾×ÈÛè+,["˜W?Z.ÊeºXÔäA[(BžÍÕ™¶3ª`¶@D”Q_NnyX¬ž¥¾W˜#D]| "< ƒ¤ò 7ÝÐx”.ä•«mƒvÅóJ“± ÊM•FCņÏY;WN¿ËXS3™ÐæbwQ26”¢75Ðøé¤\ø¦‰š3z#7ü(KU ¾û[ßÉrRøLJ«Ó3 ÂèòŽ#‘Êb(m’oÄp†Ð¸M-ö…ÒEfÚ g¦Ía"Öf²±6w4¯&¯“[yåó̼ˆ‘ï<7Læeq,vøtLòVªxÌC²Gœdå§X^ò$±ŒK@/úà°'o‹ Ë€)âä 51â§7UõM4IäöÊRj[CBîjÜÌÌ›ÉÇ7–Ñ ‡œ1I .tOɽŸ¾¦Ô¢ß“a}±ÔÍù/³`WXR5©”™;ÿŽp±\äÇ’õš{×CU‚Â8JÛë2DšëE™‚"jOaYC:9pIRAúœ¨én‚´–Ç•&ï·>|(V|WªÝ»ÿÅ•ôÀཚt×J˜”ÄQßû¨1 H™£‘ýÏrŸü££”uØ´±‘ëG#œ†‡CÎÕBm§>×ôŒv„–Àê:i™°_[bäÝ¢Cõ- µØ£•Mw5j»é®ä.t!®†-6iÍÙó”øûL³Q0„Ó"o¯Ìª¬¥¶€R ÍyÎÚx“h !ÙÉ¿qnálî7{…+›á’б\Ar_Õ6(¼€H½©P€)iîNB·Å@Ýß j±+‘UN®Ú²]à†ûqN¶W°‡:š¢”}n§ÔðÞ6þ°ö]Å´öÝ¢j•ìÜ2Aã8ÁÏ?þmvÿ›Ýÿ¶—ÿm/oÕ·Mç[Üÿâ÷ÿJ[yØ Ì;ÙÝŸñIÙUŒ´²¼‹•^©¹üµWVK–¸õ6™?Xö­ù‹1…æ@šNqÅF@¡?'î̘sDqдNó’ÚíWçm}@\VtÓ”p/£æð°mΟ«Õ?^ÙKùÇzý'} ±|‡a}­fçZé§¶ÍúË×Õi»:¬+ý¹LÓì›íyþcu\¬žw•nr™P—nëãÝ·ÃæÓj¿_ N§Õ»ž¢4O‡˜žêïÛMuºÛ6ÇÕyý¦G4·5 fv>ø¬ÿÜ^§u½3­ïwRYÌïOÕ_ª‚²ßÏÌhÜ®v»úrþR½7ºÜ¬G3u»Þßî¶Õá,+îf4&ðØlgzžåÄ©öó¸>o_ÞM³“ÔOÛÁAò¾#¬7—]5Úi’ØO4(·o+è÷¹:Á„nצy§“H×Hì·ÈÔˆ^ü³ã „°1¢£[E}8TkdÅ›гù±}?Ç VŠí1/e4o1l¶ÆÃ[F`ÕÇG,‰ÜMæÓåýdöm0»cUØaûˆÂÖ‘µ÷‚À£ñÍä 8kñ |pµeå?NKõæIö!-ü&^±Ý†ü#Ķænû4PkGãÑb4X —ð˧ÙÕœ§ÿ8±­¹(?$ϧ“ã›n‘ü#dT[·÷q?ÍØ ÷ no‡SV«Ýÿcä–¯’äWÉ?¥¿\¥­'ËÚëq,Ô~úÑÙú’òèüŽåůÙšz±ÎAþN¦‹Ñd<_žŸ­ÔxübÖV™F…ãGÔTw•# –·ŸGãáï4ß^­ÝNúÑÙúúÅt-ÝìfÙ?FhWGTzƒÊÞM„Ò ‚^¼&GU–::0ßǨkËùè‰ïf“)­¦èlFÉ‹¹^å„b>ŸÌéÂ]VÇÍ–y¨Ü· –iÆd-Y‹ ¬Å®¬»lCdVÙùxGÞ@á~#ϺÎ,RPîT鮸Öê¢p­.¢­î%¹+*Úê®K»â¼@S½žÖ§ó ìÍo§-”  ˜*%Ä%>nqÚ¾¾V'Ù+z y9ªB&‡ÝûÝû¦rMEZQÀ+ãjõ5®ÌuÂF-:Yi9jw»«V‡‹°øaX{Vûì>íêçÕî±ÚlWÆåÄ7Õ¥¨h Í®OÐ~½i:Qq¬‡Ñ=F?ít¬Q°‹í0œ—î~÷mµ={í-Ý$`ïÿx:ìêÕfø½²{ܾëÒ1tåÖƒŸgè>ªëÊz¨€ª¨O?V§Íèð?Úý6…m uÝr‘tí^ñóöõ ¤(òýîR-¶ûŠ\©T(b«}}z·mz«ÅñóªZ½Â^X‚ƒ2šLÅ´"?×ç)ú^n./ÆÕ [²”>·üüe¸þ7HÎ9(#“~›Ì­š£íÍ:(Áj=nœ/òsÝœ‘/?¯š7î ²¾ø€âÛöTE)hJGÓåàîäóÿÞÑþ¡Sßï†Ã…C¸:-72Ãåx2žÎ†÷ÃÙÌ‚óNØGÚñäîÔ ±écšËjÇã¾öRùõ ôé|~ÿô@Zºp[°é 7a  ?ÆŸhe·l:ƒIš|õÐbæÓéðN–YE ÀñpôéóÍd*q ›ªÑzI9èiìì«`3`ØÄ BÎêÒßå´Yß®ý®û¿ð€ôh½?×oõ —Xz @¶XNè÷ì®Ú_~*î/KëÌTŸ ÷©p‹sôº? Ú à‡+N W-à>×Ç›wøkrtÇG©cr@ÄJ°¼v¨Î÷ͳUðǶ>w¾Ó ïÑnG!šõ³vk¡¿ ϰe]FŒ «ŽjÛsϪ¦:}WÀO§Õ›-´]{ ¡m£±i~«çÏ2ØF9+xºõ*hÝñ½¢ƒG'FäN¡zÖÊÙéd×q<^ÎÕO[>-€Ã÷Õn»™ÞêäÖpÕëó.<‰KºÖovUÁ"µåÑÑœê@›V»§Ã£Q4ûAf]bÑÆ­Î"uò稧IÏcÇzWè÷¸Ð.äÁ´„Ñq¼‹Ÿvì®ltœ+à‚ê|2V\§cÝ)£ãÓF´ ?Úu~<¼F-™¾+ „¸¾Ñ i«A±ÈäE+v:~³‡Ü -M,,w…š9,:°¿©nØõ„¢¤ ¤¼ØYH3³w«óÊ6« ps ¸TÉÌ!^&íX69›)åŬ…·z·[ôÓš†¹WÎ`ØÂðëèn8Ó¼Ò±†rnÉ«…?4jÞWQ*ê)Ów°e&//hžUç¨ÐVj4ª|“;G Œl¤ëãv}ª›úå¼ü¶=ü£YŽ«óZ@ËN§j§XÖÎ*þ1r™Ð·ÿEjÿÒæ­C+Š›œ®Þq l+Ê_(‹–öÈ’­WóÊz h<î6ÑMµ=Ú@dOm7Î:&âT?WF«I ëxý®v¼i!ɬñt´¼½}dN–Ññ* /bè<\{Ö,Æn óy±˜.¿ ò`˜2†{œ/‡è›{œÜ== mYÖe`0÷Yéc’2ñ1>Æš“³êÊ|LÔe‡ÛaºȾu˜°®žÄŒ0þAbËGS˜R¶G…&øíéÉ1£IРT4…©š D¶h6øLF.+Ãã/Ò•}º ! › hï·ÉìKÀf]VÓøa9O—ïxÚ4P~H†äƒ4žLm P°ê cœÏûîŸt¹’ìÜ{ûÚûئ€<þ\ï.¸õŸÕ¤‡ÀÝü¯½ À´K” ì¬Ú¨}ò-ÿ½.£Ãö¼]í`kæB¹¨ØËnÇLM$nbÅÌø²÷µD𨽱Ñ$°O²¡ØE'·ã7ÙíïN5lØÌ ŸÌž[}M‚¯ ¯¶ûËž4Ë Á7à…r,ZˆÝ:|³ ¬rñt©ÝÆÈ©ñÓÕé¼Õñ…ä£5XÞWÚi¨™÷‘Ei»c'>Üœì¹ÿlõnÉù*[˜8k p·§ F I«„y<5?œ?¬k¥ƒ°Fõ­ôbßm5†Ò(­H¸rbàÞ±>·LÙeÅEmó¼Ó±ÛÀüo¨aM6^P ÁÀV6&$”ãXiã]4FٺǂG†imÀÇ-XUqo·Çë ý»0#¬¾ÅÕí^'È"Xï®C-xÇ¿QÄJ4cæa­ù>«VMSíŸwïÂyLJÂ}v÷ò,$&WJ,;µÕºÚ~¯@ ±¥›[ïí¬i”SõêSQ¶þ­w)3vÏ­§†•eF€»Y5•‘ëôìw+nßWÛ¶û±þ^q±eC‘8Adé>Tß+ºbáf™Ç«óå´ÚùͰgkˆ¥o7—æéƒžõæpožõ’p@cLbQÕäm_è `N}ke(HSéã:0pŒa¾Zù¥NÅÚðtÄ `ÓÊ\z a[HSÔü·Gœa,!ÍŠ!²œ#š ÿ7Ì1 |dž¸D±êìþa2ùò4õëÈ N÷ÛÓh6\âà™ñ²€ÿ6|™ ï®àõ«À½á.UÐÆp|+ʵBTá‹ÁíçåàÞŒ,Ÿt ¯œ,žÆ¸W¿~™€Š´/&Òat`Ârvûuyótó£¿Q ‚ ]òˆ†&žŠíƫ֡%K ¼„s•Ú½lœîf0¾û6º[|^ÿŒU D)F. œ->+7Ÿ—wÀi·‹åýÓÃê.ÌÔè.‡Ž`ù@g§Ø$ú<š³õí!C§PAÈ¢9.Z:-ÛÐôùð«¡ÃÛÿû t'¬c+}Šù´Äü¶÷Úx”Ò¦–X^0¥Š3tâ}pï‹u1]šñ¯o®ù!c“ZdWﻄ ®n…5sºÿ YÌrE™¡ù„šŠüÚžpb-á_wƒÅ@©hÜ>=:mín‘µ ïž¦]dWÑÃ[’ôE¿¸Šœ; ¨ò0>ÍF“§¹7ý½Îõ~JtÑ ÐÇÁïjà`n´x¤Lý}<>è+(׆VXþ×F•ïLZ4ç‹B‚ÌV†€íí V'É>Æ¢8u“Õim+Žó®jI{élúsί¿4óEÒ:°˜qýó ƒ4£‹Lf6…Ü·³°­Ì„eaªnÜìÙýhÖsIÀ{ÚEt…àwßžæŸÉú)c°]G·,’ZȆÂ=óØ4ª’/ º…j±€9nóû‘«1(oÅ¥«óD·ºbR$ÆéÛ`´HåÏ&‹…ˆ].l…Î%ÃÇåvñÚYñD¦²>ÝíÀŽ» ©°ä|QºŒ‰Š.×>Êí;íbî¦eùKÕßí&¿V•3†:DÉ•å/Q¦Dɘ¥T›}Æ¥.ÊÀÎ/@$\0X’§±»Õqé 3Aƒ|x;Qb”{ zb¾$Ìù zœK$ Wˆ,±H®cY±\Ê?Ì'4ٜקÓåxŠ‘ƒ‡'¾"„’F”òÔ.‡ÓÑ|rG>aypÐä–<§BukÈdêSfQ +…!l×.Zo¯Í×½ô6)\&:qŇ;b„cì0g)— wˆéM.i¡nºb`šLæsÐ%w—–âûôaà¹GÑlÕ+ò„¤C°PÂvô0Žow®,òñyR9F‹ß#{U C‘w÷g‘,nÞ7õ}:™3Sˆëcõ™,W†á" •ð_}Ÿž:iˆ˜O<_ÀóÏO ôZ¡‚&.ZЧz €U€›µåàë4íYÚãf“µvшp^Aîƒ.¹aÓ‚w–u)çêØvžJèuâ®/ÊYЈë ÷B–Ç8b;?ÿ6w£ÀûÖM¸Ê—0Û¥n¹Ô7)G.Å ä' 3n9(U;ñA'‚rºý÷ *4¾f„á³ÁmQÐüÞx g‘ðú1$ž/H¤pÜ(oJà£MÅ©‡Æ€,à …€S«H¬z¿.UÄ’%õq9@òmæì†zf"MËÄ#^›e£¿#t6›ÌËç+‚ï'3~`‘­™Î&÷#}Ä´¤ôJ`Ä^1ßtR£ÙÏÄ`ùÍèhf à̘æ˜O·õvãDu“ò0[.vÚÖσguÁRÝ“µg¿iÇÙ$ëgÊ%t·mÖ­8+D×Çu°ý:[^+›82sŸ[C¸:îê+â~Ü\0Ìka'ݹS ÃSxsn1•ênÇ£ºMûŒ‘vrVì’ÑaSý¤^u NRã¥ÅÝäx^4‰A8'¢è"eÕ®ŸYÀWî.{à7²¡uຩÅø«êP<¨ sP˜\‰JÝÅID©`ºÁ†F à- 0fAÅ$ÜUÇóѤå/Ñ7Éx‡ÔåÏü˜´±µ%¿D‚qu¢gɯµÒÄ”XQUfÿ©¬õ×Z;?n]–á”y»¯“ùóíQ”·»ss‚·q¦sn²1ÆîwÕnõ΋q›1ó±ÚÀ?ÛïÕéýq³s!-.ø/ŽŸ%U·_©Ì+´ðJW†¾¯Á ¹a‡c^f ®‡Ùð}*ÊÒs#¼9¯Î Þ3åÐÙ´ëãýöPÍΜ¾Çª CMÓNɨ[BMÓ2áe/¼ü.“å#(“Ãà= yuÚ®vãËþ™.ÇÀŒ:(Þ]âWÜ7&ˆ‰â=( NïZʸ±·øÔݼF¼a(6FeÂø9`¸`ÐÝe0€?íÍv§Ë×ÇXl·ënÒ0ˆÇÙYÆÔZ{ mž°>™r/ÍsÎ×ð¼Ù˜º­‘ÅùJ c|KÙˆIXÇÕ§S}¬Ng™µ3M9' ˜H)W×^¦‡@T0¨šŠãk“-|’A‹ˆéõË–b"ŽéÉÙúûÍ7Ç&¾};ltN_¹jy:‰¢xø-S&Æ6˜§²Ã&}¾âüqà CÇÕY_OÑ×);g÷p㕱ò˜Á3wØ-Óã²/!<‡ç¼aavÚáFÐâí~·zµ¤Œ]ð®#¦ˆ²9#&Cʘ5†§S¦Bœ§nS¦)¬+° :5KÕâ Òîc‹ïƒÐóŒO,Ãj‘é‰*¾ÛÂÔ3ní|¦žq]àÀzõùå2‰´¨«ãn{þ;¦♿a¶Ùzà¨/Ùé\½=ža3Ѻؙ½÷5Ã`ÞÆÜòá<õµ_|k6*u-U&è·aj ´Ö8¡Í!l¶Çùo"q'ã&4|ך\4@GìÑÂtÙ‚;¼¶e]KØTܦäxî’²ä6YÖ·]k± <®o³.c¡ÈÒï¸KøèÞSŸUØzïÉF P˽'ëàè½'—Ưõ³„Ùw£9f¦cnÌ®»^äa‡ãÚ‹VЧ9Î%žFñ2Çôxºü¤¥>æA;ªoÓ©ºK?¿PÖPh1;|¤óló å·²•L±ô3ßЧIÀO‹·ms·=-oúM%¼ÄLê…1¾ÕD÷Y©Üåv\ÖëêhÙŒiŸn'±ñb©K!´Eû¾Fo@¾š–¹BßÜžÞçÛ]ÝTöI©û{HÉ ”ˆCõO¥–eº«ÖøÓ-"ˆFò•c½š!ÊÊÃ. ¢²4lìǷͯ«ó©:èdM„!u+1Õ º?ßïUš!Ö²,·›/Baë°]”µ !IXÐäXZ'©ÇmTlùL¡îª]½ˆóT—ÍðüƒžÖÐ9zrìàûÓáä!ÄLÂ&ã…ÖöÅ£_P‚ƒáOÃÙ÷+–ý® }Ü`a íëËi]™;êß«[}™ŠèGP8¾ˆ¶dvÁ¤x—쬽 Ê(üê!µNr‚Á*µrРCi==%j8|öæ·K}^-V¯¦vÇÝwÈn’}„œž¶ÈfïÔÁ7ßzùÓ‰æ4•Åjö²ï4¡…`G¥ŒbÇ*} 0eÞXh<ÍŸ)É·?ïOÕ/ µ\=š*·^éq,ìÛËé¤O±+¢&oI/ñÚ¢lNêKŠZœô$Êe>hºNÑ‚¿6|e Ml½¹ÑÙ´¼ÉN½ QF“:@˜³zS¯­3–×áÊâ±  ô¨ÁoÂõï­0‹õ,/¢È_YÆžyºl7zØå'‹Û¡ûú”mê :kà ý‹‘1ô,˜cÄ\¥¬ïeqz_ÔßVò!1(¸ðäÂQYÒ輬6÷P$Ÿ°¢ôJåài}T·Å'WðPvH ˜ë¾²Ã¡^¢Tß—­¿ß¡6Å,\ãÕ¾bÛ§C³z1Yø“®Pþ@CŒÒ…°M”ÌÐ-q ¥P'Šõ¯P¾‘e­!Ñêæ™D¬a–\Öç¾0£½ÙÈLÖÙÉü^áiôQäGgêɉÚòCÆ\¹úŸ_ô˜Þ¯Ö”- Ö_WŒÔç3HŒÍhŠù?Õɘ1Û©r©€J[²gzœ–àšgp³EP=_€eAL0MGËÙq _¥V–öÌ 4ÿ9=çç¿Ê’Kâ8¹Ý·^!YMòjx:Õ§‡úÕæ®#&Ìa7;²òZJãyÏÐrOeA7—ín£åÛ¨6^6Ãw´ÇBÈP¨Œ?««>“åjÑ“o¡[D ó÷ý3&9{Øh£Ó÷€F•ð²äf– ±²¼þ¢èá­N‚¯Á€IH°¥%ŽŸŠMq[7Kæ–±°5TùºD"mÜNzÓ;jºéóÖkƒ·pj¥zýþxƒûíq¤µÝiÅÞº¦NÉ¥…`å5²ç^ˆñZ¦Q–#´>ï¾¼lT<¦’ï+æèû oÀw‰ ~Ù¨3É 1nPÎé¸Â%±æÝÖûý6Ö¾^¬T͆¢‰eÖŠ­LbýUÊF)_T1ì´(Ö\•¹Êfqê²Ì|ö‚¶ŠÖiXzˆzÔ®.¤Kú Éà*¿µ>xÙðp ‘[¼ë$þ.¬××׊—¦v€Ÿ­¶Mµ¨M®~,?•ø›Ë«zš| eü3y'zÒ”ýRi›ÎfýGwA&‹Pñwß  TôÖÛÉjŽRz¾`Ê1ÜKm1õî—§u›Bðòçì–/ÕéPíÔ°b ¢6Gûª4Ê¡‡ÆÃºÎ¼’#®6Îf‡@½?Õ{Æå=éxûÂ\Snbü‘w.u2oøŠù©zeÖVÖ¼Ú¯Žoµs|µ¶ŒMi!¥p€²#“¸¦:éX?ÛÑ¢_Èá5†9¯n4¤ˆûR=T«ïUœ3º©d‡ÊÜWI_©m¥ö¸5ÃYeÌ]°ÅêôÊ$ÄšÛ´^Š-”ß(%ê0kà›4úÞÈ,ð94oð¼<Á>J»«ÂÒJOʳɵhìµÆ®ç$žÃzæOà“H0Yv¤¯îwõ½RüÑãž W$Nú8*2¤ó<†w¨&}Ov(´v!RY+Îô‘g„LîÞ¶ÖËé3$ø^‚̾H4( Gèé°½Öá,l•¶ïhÿlªqo^¡ÙÕó:®”¼>ù¿y?®ˆúy´=#ðÛ#LH¢¤ð¹BQÇg\U›jô¦Sô©Ý(a´ o¨t*Iê-4TOÕ‹Þ óÃj˜ Ÿ©_Ê^Õþgy‚Õ—d .{§R}nÈÄ\ýI¿ð[ †‡*e ,t”~H³¨ÀŽu–°tb0*5!|<ûþ\S¯3§4¢‚Ll9/+Xê£Fëdc¤úÃ9jTÛ†ûãÙNŽ_#`šÚÔ9­aaý˜‡¥¡b¿»Qta›Yúè¯Ùè`ýnxÈÛ"Î ~r9·xêO×*(³½o g³cߢEý ¢ZO³š¥{2Üæ÷°$6[bî±jîªu½©´Ÿ“»#ɱ”xx#;騨“H?Çã^9_7;¯üm³›ÒÇ=°¤Œ5aoâžtk=ª×ç D”ÂèbŸËãz¡W÷«ãƒ>rÄ´åócµVÖvãÛ“ý¸×Œ6¦–ʾ4Ò•­À|Û“ë¢qôÌw ¼•%È"ö¢qTØð}üò‰‚7ÛÆFª˜Ç­­)ÑI:YÞüÏ¥9[ç¶ÙAQw:I*¸HS¨!K¢Æcɳ4Ho5õóu“í†ïÓ¡IBà8xp¢±~‹thÚfu<[ ¬“$I3~(uz˜2±ßÒ±N;à±|½®¹Úô±¥wÒPD`p–@-”"Ñ#c+Η¥ÓÇ ¬‰žZKg’Áó|ä!I«ÂäÔÆ!„™Æ =F”È€Ä/jFa„JÛÀ²qŒ0œi¡ÚÖÛ÷»ÆCV"¼Ÿ&Qü¹2J†úßMœz25DSf¾ãD{ÝšÀYÙ 6Ç,ÔÐ2kEš[FTf¿ø9«Î—“Ú²½ ¸Þ– øºç’Š<ô×`À}j£l*un?èsî—7»ºþ:!ÜDôD&¾[`<˜=·‹°Hñ8ŒqyÔó‹o]œ£>]íø@µÒý¹ZT§=¾œçsa°þ´Åí¡2‰Â¨l 2пk¼@Ú¯ì±4˜$‡Êê…,D:¡é®€ T²“‚ªX¯À2@ø £ Ht¶KÄ'Dp(À$“*Ø,Ú®ÜÖ¾–cñFe+zQãûÇú©"KiÔyá÷ok¼@2Gîííuf¨.¹Jè®íçÙ´H²ÿôäÌèË“Þö`¢¢”Ò8n-€Ž™c½ð,—¶",éÀ[‚Ô’¢ü‡Ša-ø_#µÿƒ @6x;)¥?¸µ´¯«õ*> W °Æh?IZÛìñg_zãЖ.1‹^ºØã¥c!ƒ>"µµvor\¾âo…@Y!?jöÀoõý5L3~¦¡ôì3$ ©0>H¶í8®×J×ʬŒ¾Ÿ…Ë? ÷i<§hÔ>ÎôŒº­ú|XÂNW–J9m|¨òõq‘Ï«Y/ ç*–Éý!Yr¢Žôô&Ø_†ü'ÎëËHC…ýo;ž\…µ ³üzé *•âÐÖZš]-!NÔ)bD.Îø°ETcЫOú8Â<.µ6 ‹çãݸߞø¦Xx;!s·$;%]P×è¶Ï§•A’nzN\"Ä‘K#ó<ØyGÙæ¢!`O½¼l×ÊéJK/ƒ×´fÙW˜`ó÷ÃÚ<Æ®=]Æø¥¡ ׃!²W<-²Œ iã yKaGZÒtBn Ä*꘿]γ Èdó¿önº¨þPùÌÚ÷„ ×, üx–²gÄ->bŒûIØÔ§Ã¯1d¨Ñž¿2ê¡0Ö;•öEÓ÷äÖÞØíö$ÍÝoKJy`±öœÌäV`;‰¤”=@ÝÃ$¥ôe œßŠ®‡tÑãØ]ªßŠŽ×òY´ ’kÊoAêáÌÁ ‡í ×¨ ™k¡”ÂÍ–²Ÿ*~LVÊ«e…*9À£EIÞ¦ ªQ¨äÇf •B¦«Ój­<Ù·nˆ³ 2®a솨ïwÊ@#Դ׊â(©#R"Õ‡]O|ŠÚ]RI3ðöæÙ†Üõs æÑq(ƒq@'D¬Á¹_ý<0Ê;yV¾X~úÕ“'ë“gf ÆßEg¼XD“ç‡úµ [Èe?yFG”îÎÍ»ˆb,¥[gòlgà¢Ýr«ÈÐí­.%»ômPOú&Ï/llä|&Çðe…Éɘ6¬¸ÑþPôsðô3N0Íô´Ý¯ðÊC²†¶èRixGp# B–|ÊüÙéI+’CŒ›Ù"¥/nêÜÈ^ëz²Ï£F;ñ·žT=ÓföñPzµÏ®¤ì6Æ·èk[º¥:šÁœƒ¹ >Ù&CÂddÏÔá³°Ö¾Œ¬™ÒÕyQˆä‰3žNO¾³ü,ˆ‘=›Ó  iæþ\­Ï6`„]¥0tKŠ/ƒj¼!&ŠúD¡ðà{þVŸ`•Id /ûq½±2úszÖv39én˜¢øå]\*2„PÀˆLÈÀËšwxk3o² ¬+:âPëj“[š-æÿX€‘¶E_/þÇ®=¿§êf{Ö7¨öÄÃPÖQŒwúöVÙkˆ’7c@6–¥¼­ÅÐ,m‰íô}ǦÚÛú‘ÊO7[²Ò²å»- ã›>rªô‹ª$†ó4 2#;?ŸX|7‚½œ«nÏu­Ÿµ€"£‡uÃpÂ’B [˜E¿aížçÛåÑÒp*êã»6ȵóeÈȃÏò~_)U‡9·¤Œû÷0˜PèduZ,u»pKR:÷Yؤ?]Ûóø =6/ µž<.¶°6]_ÊShÀA»SÑŸæJ„ªàfÕl׃ïÔžÜFM´ÇçÇ;Øn®WM”×ä•l*T©Òw$‚²}p¾J-!Mi' ðߪ՟Wªèæ‰ÆjUäÃ¥O…ÃùH>lÿ¬ú Ý®É¢(ÚHQÄ…O/¨î¯Ëjg™ªLüe©¾G׎Ï]Úar—7é÷ÛÃÆA"t —R>—â^(Ú®Òk—ÑŒñÑ÷uñ’›¶rì0RWää¶:ÔݸM|è ¿@ô74Äm½@Ý™ c•W ÍÅh}œ¾¤@oÆíøløèòêF€-_>8× ÌçãêH*¸W´á8ë[ùÑë¤I“ŠÁ¢ðÿ¥Þ.?Æ Õ]ü/EŠ~kOcJ¿ z Ì±åk'Œ2~Lì¹Â‡áãz2œªï`Ñ)yÚ’¾Œ aP/£ {~Žß3ᵨuýßßHØùfLýš›GJÖEmh¾‘À øåø½¸ÒŠòC´mE¶¸hkE0jc¨ù¥ý¦"ùà‡êðz~Ã0”>l-ø#¬NÚ\€éq.Ç«Ý_v;¶}5tQNó¹r »ìíÏ(›ùbIm%ÌÇ÷¯«Ý…˜§—û‚[ǨÇ[–>¶%ˆyÞ¨púÒ"Í}+E«+’mþ eVô|9¢öSë]»Íåwa~y\ÎoµÞc]g¦Â}˱Ž9cÙ°Y0,ÁâÇ‹lá3°¨ñïûmµÛØØO'8`Qd×aí/7ž”¨R.ü~ÅÐ5¶RoN@ùn_Þ Æh@ÚFølˆ o÷~ÝŽ“»ìy¥·©ìžb!u鼺]Ϙ–äbâüÔFÙÝÌ8ÇÛƒ°³·“WÛƒNQf¼GûÕ«Jåcmäü§¬ÕÖ)Ο8¸l¶çÁnuÚëpæÉ3÷¾•RÌõ¥0_ÉÜ?¥ÜnÌí…¨HƒJéVD¬Î,aÒ‰âQ†*í-tÿ՚ƥ´óçxKIuÁóá–ÒúžW:d9Ú¹-¿½É”ñ°UpÙbgÜâ&†PøÒ¡a”ÅPVkó:»ÖwÚœ\š¦tÜÑ¿Ö`䌧:Å“•òW)èîµKÌÌW•{Ùñ?®ZU§æÄºýN ÷O=”¶Ô=”4ëŲÍž1°ôpÞ½?5Õ†…NH_’"³vk‚à@Ÿw¸DÔ‘1O™D1ÆQ9zy:\²úr»ÀÐA2{©§ü˜`îòôøCkàŸ,¢ô‡Ug[Y¬^•Nò®„öS¿þYõVЛ7R¥?Róõê;ž]›¹»B"®Öó·íÞÆ•ŒNkÄaþ ¡¢‚)„½î¦€7`èØe6Qg_Rï–x!ÖïWà2u9lÛȨ[¡yá uÞwÏÇ®´þw›Ä~¤"Íû.`ÿù¥âáAº¶ÌFb®õ•D“Ï<µ;—µM¹¨éÔ¤RÙibími±àZÞ CíUõ¼ïÞÏÝh½N–™9o¨ZK› /Öh3¯´BËû.ž£ì*½p7Ô÷"×+)5½q©§GÂ=°¸Wp"ûFJâ¤"ôžÙ„yæn¡0Dl­«ƒp±Ñ.Ýe¬J%s¤6è¼]GÕét¨ÍèÛóëê²ÍÊåó©^mÖ+##‹n‡˜åï¬c™}ßë¢a¯:ß"n&ž,Ñb3‡ÅÏYŽ”K2‹0ÎÎx‡’í ¶+Eȯ ½OÛâ‚e¼z¥X!7Ø¥KŸøz·]½jL±ãVh¾^‡›×jtßÂÒ¤*_GSè«~ºÆ=É +’ žÌ½³ALÝI³£tP& Ug µî£ËÙôÈHâ^êÖ€O»úyµsϺôÝ]v ½lží•å"I­ 7ŸÏõ~ôr÷L_IÏé¯ãéHë§‹ÞçŽ=ûó ÔYhBOŽ×x·ã[<áeËcFn+Ø•ìô›_ö*#œ»ûE ®¤>— >ŒD V˜]‡‰¶Å+>Áæ ½Í:ù­N€³ÙR²/.Kçr–¶ÍEâT­CyBÝ)7 ‰ŠõqZuÁµ Æa· ‰e³´ qiìʳ?9ÜU{`"sþ¶Þ[©Ë…4ÀgøÈàºÒcç¯ ­RØœ®­ÂÄiÕ->@Û²7G³‚µxw<ãÞÙ‹‚Çä™ãf ÄÏÄ#î½GP `Uùn+Ž.+×§Z¨|¸Ü“±|àZébú d´Öxí®÷½ð¾ç¬—W§Á)àÉ1ÒÜ+í·ºÁ ž@)E—| ÿ¢ pL”9ŸmþÝ•Q؉á Q^Áðöôdߦ«5%ôö»˜÷?†Šž²žP¬ÿ7¦¯”yA±kgLT—²œ)]ä¥b£êŽré«­ž3óü}IDÙfA±3ëµ7Ê…u‰¢Y€g «ÃÊN€”°ïl1Ø@‹Wm•mžnÜØârãÄoj“I¼Ža«;U:8H™¢"²5©UcÌ(}¸c¥1C¯åîQÁœæ¯øØÝó+l-@™A޶¸vÙªm•ß’/íâX\`nテ-nƒ:^Ñkz4‡¢ñ ð‚’jø÷ÌÞ‰i'ÉX ¢ñVG/&¡`É#ýïnìÜñëR‡°Ñ–µÀ<üöÛçê§}mŒ6æÖñŸÏç£>údgžÝŽ›µ±|vÑe´Ã¬€MXVêöX!Ä+Ì.¼å¨™Óã]÷Þv½?NìóöõíÛJE”žþÔ¾‘¬$‘B ‡úG€¡%´=d+˜Ö%è¤íëþø½{Õ¤‚ˆw”ú¶ªôT=T â¥eîðNŸ ¯¢`ÓL¼N€]]íMüžÊï{L0‡Õ`ÌÑ¡P°â\gÑuÔ™ýnó=õ(u=/ÚÇÇ^j QzQPÝ4@Eë´¬@8;Š60–>!^|ÙÉ.v¼š¼±´2‰¾ÇÇÒ: Ö`âè-{ìU Mæ5þ¬žé4ÎeÛÜË'íé1"Y°?±³¬wƒ³Þ„ûžíWÇcµ‘¥‘"ÛW{ _€_ws÷ôÂÉ3ÏÍ•ÙÍýá²×>{:MP -ð­y1q« ¯§¾fqçˆY ,¢ÀÌzhˆ{úg -ÅظVïtš÷ør`ªéÌwk~× ß$n×`ùšúžØïߎGl‡ßI™èï:)>pè;qJ¶¦†*;E-ª#òæ»V<“ÄïG­Fñ¡Q1˜v“ÆÂp x¾F&°_ 6F7èG$àI°Lt†I@Bî2¥Yƒ>qú3³a=ͺ>VÛÍòr0g ÕÆ—ËÍÛvW=_¬íA nÀUùvÁµºÝ QuiÉ@MaÒœ5Ê“9UógR{;SCÕ”µ ieêdz”ØŒö†ê>ŸþCý.s'Ðø»¹{?=<üË>qÙ-Ý]Lüø¯ÍòPÚ}VÑ?ðÕê$ó&ù织±–bþ 3þ³ØQ‚/ƒá¼ÿéqp«¾å.5³úö¹o}ZË=ˆÖ%ÈŸes9â/Lßr—£H”—ªoYÓàcÉ®0›MµYên–çÚi…å+&<ÖýµW”ÉNeÕF8ð¨³Ú‹4íº„†‹†xÄ›*Yt‘êxÓxÌx¨®ËÎo°G{‰é'§‘EC’AOw…µ1nhʾWºÛ=Dj°¡Eý?ªÁºÌ®Gî|DsöD´NMu9¿Âê}¾½7˜±ÚØÖfdºbõåÍÙNÍ«O0¿oÕi¹¡3U6}Vµ0{vo£HŽ òvy7¿.ÑŒD‹•wæÌŸÆF:eÂ\ %‡3ÁÞ`®‡æ³®¤‰¾ßš»'†?ßš÷Ä„O®æ.ƒ£x/®æîàÚa䃫¹»°" ñ÷Vóž`¢øs«¹Khï@âµÕÜÝýqˆöÇVsXèàþ[«¹;ƒW —jp:­Þ¿š\sZŒ¦ ™€Q~·ÑF¢:öÔ‡£ÔѸ,eqßà_¿F.)nWd——ía³NZjÕ¾ü‚qÿnx®Ç…W ±<–/†&áì¢òÀ¿ÛW/óRôœ¿½±¢›³$‡|º}$HÂ[Í–œuÓ ÉA‹AÙsJ>4|)¶d0{·Û#Š…˜ôÏÄ``¸.~Ü‹®Ëúe©Ô¬‰è;ÈP×òá§à*y×=_*i–ñn©’)®PÚ™´tûƒné²á'Ý$6K®a}ywÙ_*p1Ÿ†‚÷œ í»ÁÝòeµÝ©1„ê >„ôñÍY®±$ÏÕ¡>¼ïëK³4$Üä¸{ æãn°&‰Yí`É.ÿíþA‘ô…vT’Ú†O ÇÄù}‚^üX™mc*Ö¼D<*ÉE8>xê) ø³ ¾/¡±ÇºÞ-ÿmq;ý_zò„.(D’¥6 º¥WI%ÇÛÅÿèïg•¡DÅE­N•¨Ø\½îºhxÝ6ê<Y²ÆcaÍEÎùë®V+áÒTËñÃÀ(¸œ¯—á|úKÖXæÓ|dŽñ¶"AÔË$h‰Á+ÿ¾¬»÷¥¶-YÙ†F¨^}$ò¹ºœØC8y&+WïÄ—€|>5ÐðÙQ/!#ŸG G½€r.´ ‰áu\|õ\o¶A—[Dó¢IzWKÿ;Áí¹Ú/_TC5IÞ jq«U×ñKÊjj鵓ÒŘZEÐ0³I4õ˜[žÀÚÒµD—‘é€Tý9ïò9ºOî&7÷šR°âýüFK~\E`bUËÙb±„yÛZo úãyû‰©uùc‹¯N/Ï—ÃV“ˆ QŒä´|+üÇvs~[šZø(ÞÃ^~¹R|¤û¢r¹¸½ÑÝšä^im”NF<ÀIݳÇ_½™þ,<¡á†A7 ]×Ç÷åjùé·z¾„ û±|îYU“ps4h -ñ¦µ²]a‡¹<ؽUž‹n|ð²±c3®ñ£Oç¥`ÜØKÆYGHÊ«ç…dEÀ^kª)_,ßëÏ w].£Ø]˜h29v>x R›[º½wkú!|-WÞ Í:BÂ|ôð©YáF¡]§¹wÂï‰äEÆMA<£å»ñû£#¨{}Ð[´—ÚôWÌ›¡‰ ß ·GíW·˜!E_p4œ%†²À|™áMŠíúl½B ¦ü…"íñyƒÔŇ—íëEǚ؃ÎK¾Pïª`®ùjQ?¬NßѯB¬åEÊ{¡0Y '"¡±¹Ù²gbç¢>6;=ðE"ö¼!4Þˆ"è)=Ç„~ÓÓ–"l1SU„‹v9ÕÂW2óRl„­ CFQ‰=\¬—0á?.\])3n_ì¦5þ M=ž…ùÚ ‘œÚÜï˜ö–¢·‰`1Ϫ#ìt¾)mF3Ÿ ÓÙQÀë­Þh1S‹/xΰ@6'¤yRDD“Git›¦usƯ۔ èc½ö'¥¿$”K`¾òF0¬Þ¤æsõözEÙ±õBN²^X,ñÓ^r±?wרÅE¾–¼ÙÕϦlaÙX¤rNá)tJ®mÈOX$ÁbÑêM ‚º7P6i©ñábI^ò,ÂH g–ªöó ¹±Œ:Ên<æe( Lx‘wždjéà¸z­ñI ó°­mF¯ÓÒCäâtBî‚ä£H¡-%S7‰·ÜJ?zúÃ:æs¹g4–Ó4k˜Ÿrw­5„Ò øû®ªŽÈ=Ì•Óß aú½ZÕ'Ƨ«­øÝ8 Á2Œ€Œd¾RÙÅÄP¡ØññRÎ`ìmÔ!EQ!!JßUÃçö¼3™êîS…ïëF;™àñz¶À ]'M~…F7ÛÐ$YÙN£Ÿ`¨O{S•~¡Êi£™˜7Æò¤Žf]5æŸn>2§Dš¦›r,Ns±/OäÝN/VÞæó+©M®¨'ÒŸ€FUÖ'Õ“ã&^‰ç xoæ´,4I£oðÊÝæT t5‚ w7'NãS`'™ûZs묅zbM¯CQiôOG™Ïv|ÁŠ7–¸iˆSS§1„§”ÓÈ;ì5¼<íõ-?úJ‡3A±чQìµ]파„ϧ#3Ö¡­FȧÃö¯Kˆ/Ƙ·ý¼§1$6‚Õ·?”ãD$žÏ»y?†óèöqª<>1 o3`(Ð*Þ^G©ÐIòË̦>dØKÈDf‚ò¬…Fp€æ:b„¬¸Nócƒñ#üzi.T9΋¡W3†aŸ¡ #ó@0ár›X›>äèÍ‚5¥`Ì2ëÄêxûvü öt±¡Ý\ÿ‰ïפe»1‚-Qè)"¢J:Whô»18W×ðxòYÏ«“Ý¡ç½P$°¼ã;œR•˜ÁL#skó^­æçúTñ6å¡yÊßÒ†U†ùê•;ï©!á㛢Ê]áâõ¸g5c4Ší8¼¸VÅÓ/´rxç4—ú_]N¢€Ú vâ4ÊfÅÌLoÕa\ƒšÁKède U|šØàÓ¤¯ú,ÁY|ºaÎÈÞµ†c/ÍÃÖc‰ÑÁ7æËH9€R©A|ò½zØA¬Éê·›wg{vuQ@CBÀàÕ`D‘C¥jÔÓ»3ÑôÓ¡Ð;¡QŽ[hÅwú®!ã\åW±J° ·M2¥ M¸s‰ÐV'š°ý;c’݆©ÔË!¯§Õž¼g‘9VOBj¸î…ƒGëýQé3B‡ÝVf‹¾gŽB¡•âIïQGò]WX¦A.n§Ow¶–Þc$ÖRÎTl÷Ô¨©ÈFi”¾"Uص–Æíí¨"²¿:é¯ÑL)‚ÚŒ’a3ÇsÐG“Äqkæ °kp£Ô©x£fÂ}GÌÀãïçi(N<n˜þ„fÄtuiÈ×59x6k? ê@÷ÄäîS!4Ý ¢5Ü7†E£Ñ¶-ny&‡ù“M÷úi”fØ##£5‹Ò趨g$¨3·¤Mò,Í¢4•õܹFY­@ËB$±—êniÀŠ<°læÛ×ÃjGÞRíK–Kè&Ð4ÖÓÃÉÈ?N;0+?„Nöë;#Ò~”âaû¢ÒZêÁHu¸µZÁ˜F‹mFEá·‹=2Íèà¯$T²´Î¨Ø2ÔÃIæ°A;Õ0ï„WêìNh¯à+ä§æ ´'üwx»œŒìéNsUÍ[òS“þt8Jt_ïyŒÛˆ4˜–m¦wáÁ§™¯\’jÚ3Ã! ˜ª|üúêŠÏ¡GÈÃYßv(ÿ}¤uq‡¡-çGÑNuäý~dÌ7œ5lï:]÷’ì#¨í_ Üã¼ÔÂØn™é‘l- ^Ƈÿ,+†;&‚éuLçwi p-î°®÷èÒÂ_jíÆúmM?h]`í¯•á°4\ÎD3Å+a*†îŒòý`]æi¸¬‰Æ\ ¨œnkh­JSii–¸_ZÚwóÄãºåØ]£ÁÏž a©¯Ð.õõ!s½'‘‹ÁÆè-Ù-q¬Iöb9·ayª"¹¸›jMGRQÁ‡ÁZåoQdž³êvÕFÙäž«°‡å°))¶åJ½PLV€g#1t3𓽞7>¾ òÖwCkLP>í’sO΃š^žau®ßÓȹgW}«QõºAǪ&ò/çï?«-<ó+€}V1ÎtÔØ‰ƒ§úÇ®Eî÷RNè£r2Ý’'f^I÷Ò(Úßä(A5¤þQ¿ØZ/`|JÙ=´OÑã‹ñT´ìøýÓ¾vÅ£cË…Ù“”Aë5Á| ;†È _ Cÿy¾$HÓÑ h-_CgbeÐÄïqåY/˜ur¥ÍW6‹dÞï·ÀÆÕyõ× CÄHCܦ-5Ö*ˆ‹Z°”ãVÈ j/ÏM“"+‚Sƒü cG‘ZåŒsyô’`<óõ’4k/ÖGZp½+e>mlÕIÐïúxAà öS&Êž­ã$,V_Z3f!M@‘tbÀK¥¢ñÔ"æ/8'½™69éÀ.?Õ-¨@,bTY}Òc¥ îë“7ωO£,jÓ~Œ”¯X¤|ßó©ªM¯¯;õNü'¼i[Óë­ÑÆ5šbîë9é\*il„ ÍVÀ¥¤Q X Xý¢(öˆæ”¨N(ì¦'àd ûtYÁXŸ«ÊܲmtO»©<Ó,Þ`fÎ$#:‰lê÷libÿ„/ÒTöpúé«36ÓÃzÆ/`‡ë·š.2z`S|ÿ°d®@Èi„uøKUÈ“kÁzŽ–âTôb< ÜoÞØZj{qiÅÐ &~‘ÓÃÑoZá÷a¦îW{Ó‘û£Ff™?a'›£n ¿»¬ÏêjÔ¿¦ãOæþµWuÑ ^LàZy¡ë9{…<…`Ÿ¼ @´ñB¿ô;Ó ž`È eЋ/x'#ºÂ Þštlž=Ÿ üyöd$ ðRÒ–’üºû…ýâ:n¹=,¿vè‚TPjŒ{4óèÛg.ÛþUÎp}¹ãÛñ>óûou39€¶JÑ‘çË"µ›AHªEè-¿Ù¶ižù¨Â ¤Ù(kª•‡o4»­ŽÜÛR½¯_ry° /h`c®¿›ôfø\½Þ]ÙÆÞà´á©Ù¹ßíG>¯øëŸEÒ÷Æ’"ÉTÂ*ƒéyE Uv•æ²;7ÓKóæ,’ÂsÚi¨­Ó¤^Xé;Ð|”»Ñ˃IœŠ}îÊÆëAo”*û=;áéêÉ¥x[ŸŽ­4BQlŽfqÚÆ‹ÁˆcMӆ͑ñK\E ¨ ò¡`$Ê‚ûi M½ ÚÑ-®ÁeCÊäÖo‰t8[¸ÎµŽùéÄèÅÛasá™ôE"•JÒgö¨Àî´Ê=ö°˜É ìU”Z‡UÞ?0UÈÛ"ŠÙþ<ßê£Zf‰/¶€Ä‰¢DjGõu^±qÖ1D&háôfU†4¤ :geöôŒáxùHè `%g »Ðu¤ÁžiJ=Nœÿ¹Õa|ûj³U¶Ï›“]øY¢Ü–Ãw±‘{=Àþî¤H+ZÝ»[nÌcºw+ô™â>µÖF¢LuD'è"y2Â>c:¿Ówwµ®/ùAÝŠ\®mÎ;Ô£xqì»Êv û’I3ÛМ̓^x±òR-ÏïGs…©'·ä5¹¦äDÚÙõm¥bH]œ•¼€“‡È:rÕ„;L=P®qçt„â›-™4Qè­"ÇÐ/À§•=-’Bâ¨îÆDÏ•2éêÓHvœF(Á å]²‘a Eq+­;—N 7 PZ(b ôKž’¦,ã0Ù³\\›#œ'Ö šú5tzŒÕW M|–Ý& ^Lvi±¨äÚÍü¶Î«³÷ 6§>taN±µÁ!š4eGz~äи:ã-s•™€;í )g” ¥¬²ø{,yG:¥U˜Îé!RþH+âˈîšËyâ"|FëB•e®CŠŒAð_8ÇÏ·«õ[eóÛw»¥8ÌÐ@ÜYðxæLÜgÖãU%y(ЉÐõªÛ ”‡‰:Á§Fef[â×]ýÚ™ã}Ú£K‰Û-et8¾Æ¶[ަ&3†0wè,°‹™Ìj¥‘Sм‡¯|vGw˜@Âæ »T¢VÿSŸlús‰{­“Ô¾ÈÝX©øQïë£@ ñ¸Õ×ñ¡©Ûú>aΪåqzLí«*‘ò{”­ê³W…þ¸ÙÙd¦YÇÃcF:–Mz®OûióÙ~Ä;þ Õ–Õa½:6è–Ä“&›ô‚T//<òÜ)&Ë¿›×=±FìÙøUnˆå_è£dM2!Ǽ&*ùÉÓÂKd¡!Œ\cܬÅeCõtŠ@lëlÛ×[µùš£àÀKÇcã‘#+/<<íÔæÌ²Þ$…ú¤ÝÛ8a´ç(c~m2EXÐâÚÆU뎬§®ø¢²§€l±V äxÖqZ5n¶*žgg_ lÈÇÊ•ÔØ¦BPÙ`«‡¹Å–¥J0yĨɳ{Kñæ}Šg.fØ3é ÕqY ³mË­9C2)„ׂ2¹Y“1š9†O¶V9Ë·”Ú~{^n›%ÌÊ¿/q'`\͸fy%0Fç­ U×Ã)åÈLQ˜åÜ9©Å0ݕ棣÷óÆn<,ÿuóïÿºÁ6ˆõ–Éks(—ÿz1†©h¾“ Ÿúö+WGWø0ö³—¦±â”k>¸ýÒ×ëÙË´–‹ýíüó Í ºÚÄeðü÷qq{ã“gÂĸöNp&cêÚ^ðíöDp£ö[ºÇË0Ÿ‘h1,Ùó#äó…¡ ÅΨ P#V?·*ýÓ®nLó£Ó‰3qhaü5h¥^À‡AñãGŽÜÁ÷öx´Û6Á\ç;W#dlÝ—²>Ö¸ò2¡mâItÓÀgclt1¶—çCeßÂs!Q¹2± g ‹Z!^:×hÄb£·JûwŒÔ–,ò„¹åfO¦^2?ÁŠHÀÌjãÓåÁ@Á-Öæ`€—-M6)nt ÉZ=ÇÜ÷­ïná·¯¨ö•m„L⹪…_w”öAßZO4rj´RÑ®Lõ¡ /I±x‡”\:õ)åg¾5‡ÏËÅèqØÿ6-–±)P0fƒõŸ÷'}IvóÂé»j(|x½!_ƒ€Xb¢L¯ceŸ‹Dµ#† ødp<â’Yê§7•½5.BÊ„õÍÖ’6‘—‘Äåª k2;`±ˆ,JôŠÆÆyµ=¸¶a.XíÒÜbÂz¹S~ƒþÒx}³LŽ! ˜"”P°¥m…q7 †F8@ y¤`§LÓ·-¦74â~ÒX_…¤TuÉ?@ã,¬ÈДþ”RdÆr†Â šôªVî dÉÊÌ©\/1š¿W§Ú²€È4Âͨ™‰5S#¬ÈV3;†F¸1¬šŠÿÍ)–Ó&¶\½4 iãN3½ ?oÛ×7µÉ‡]që@ Õ“o›ažw¤QO^,/´µ‚î7*»ïyùƒØ&¤ùAÕÈy9, K˜ôhü¦ÑüôýþÄÑ8§äþ‘÷š}šÚTxB-·¤¤áyÏ_¢œÆmC#…œf+—h^øãv¤˜àÑ] M–õDi”¡Ó”Ôƒ3ñè©•G…9ˆ4ZBm00Úp>F°TéZŒ¤xTÓ€]qå‚áƒ`ýO.¾–Êî ¥‘ölêÊìÿÕÛ ê¹cPxõ8øiÅÏWöì?“g±®){±I'Þ•LòAÒ]qܲx?V“y Œ8¾ˆžj|TéðŠŽHŠŽâ D‰aÅ õ ô\›Î׸µû-a«ûØ·º9ÛǾéÞj&¯_ú4Ç&¦Òù¢{:üy0OvàÖDô¢©þ üF>Á”f|ÄÜèvæ£äyµ÷—Fù´èøi¦^Þþv?]g³Él9žŒ‡ÆØDˆP¾õ»áíän¸¼ÃJ„â|{9â£Ê:€û6|OÛl)DL· ¡Èk² 4çFxMG­4SóØõ=ëˆÄ®Oñ>‰8ý$6BTˆ­ÿU‚{“W2“†Æið»‚Ñ•¦Ü²ü;Ý^lÆ(áŠÎ¿B Ð-Zæ&7å’¿‚œÓ±.ÀšoWGŒíW¯ì;+÷j… ˆhò-ÓïIµ-3Sªk¢Ý[ÑVžœÍÍ;‹öÈ’Èd |ب4àHq2ˆwOÂ&èí žsWžÞcIBÖ@G‡}h¨ÖwBh¥Y «avøÙŽyWf«oÃ.j]ÑDæ‰hh@µzä¼ò^„¡Ññ8‘5ªÒÄÇáª\üõk}0€²Dœžk¼ k£c°4hö)I¼¼|T÷mÜ©t·ž(M/ªƒZDýj§Ü64èeˆ%‘¥R“Ó+•ÆaSvÂ%d²kF Ñ2¸†©“ìE ¼ìíÝjh8´ÃŸx ‡÷l•ƒÅÉq¢‰¬cCƒÓ‡,‚SÂŽ£»ý4ÌúåM7FWUvHÄ šæSu~|y²1‚yÑ ¥1lqö“ëQÜZ±æQûw•æÒ¼ $°±P÷`§ ¤Ìq–©±zŠ_ žÉcÞ•¯ h¤;Ñ#Ái2é¾ÒkM!ó9˜(qs'½†µÓÉžxêG”‚#!žÑÝY¬(^¡H>¦iˆ¿“+}V! r±u¯õ?gB.ºWz€ÜàÞÁ2Uˆ]]Œ‚yÑ“þµöµb›EùÄCŽhXìÞ{ÍðDæKv…†¥¸©Ó-#kžÑ _¿\Lòrt"‹†åµÂ…Æ{Yî< ïÅu/Ò¼q1!k²!cÓ4Q+/éçmð6#/‹-8¤AÓP–qt›EØiiO‹l £®0­‘ ¤sã k-´hðœ]5¥å°=T˜*eH•‘É[ÔF‘Òz8PŸp_°lBëÚ£0¹>¶Uó›¡éôZi•diºm4˜t™Ì-m2OH'…ƒ*RÜh´¹1Mv8Ï´qt ¥Éuè¬ÂüÑмL“pQªÒt>ÍŒdCY8úÁN¬À^ˆÎä)›U+›eÑæ×£ ’p`¢pÔò·#ÊFc¢‰”6ŵz\ܾ3kºò©+¢áÉȼK"íÁßÁÄmzy·B£½ÇLõ«q^õù¨ž²Un qd®Ì }Rw—};…l”Ðבڴlæ«Ñ†ì±4ÔÇè–Næ~ð‘b ûýgtr¢%¥B#šnñ+4Sg •¡¢ˆQÌVÆ›Dæß`Á7ï÷«ýv÷N\yel`=îÁn¾Ô—Æ>3—¹7fc$|㠭ɯtØî|³$²c;FsÛƒñÖ@a?uó~v9Ô»e„c̉FûTa·‘Ç`æmZc͸ºçŠðË]{‚íw¼´Áϔˈ6>ê6n§I7\GŒ6g°7¶Í[µqÖ M`¤íZ]¶û¤òÐ&74-E;¾Õ¢èµ5«ÍHµ²~””ì:3F‘Má±UøGF^«ð¥qMc4ê¸Ï•­^p{0"œ> C|T•ê&3=õ"}'ˆ…4!#E @§¡ äû®^Ç_˜2=ì‡û>÷.ÕÔ&ª¨OŠ–v7‡Kß¼T*ïóSPô‹Ï3èλ³»IØ•O¦H8ÚdD+€Î:mL^ Ñ-îku¦ˆŒÌ¯Ò:AÔé‰TŒk/ˆ]¿2òy燞Ñc{ûÒ°Ý‹½c”åö@&–¿‡£¤¡úqébóö†.m?¬3¾ÿ¶èêÐ8£©çq¹7È¢¢øiçìaÍÃ>Îö_Ô‹j¬O«Óû€žöñ8üÎ*jÛÅ g}¿‹jø“pEÇé]¡<6ý [ãˆñ§Ñ rÙN3£Éô?¾»Ý\§0¼`¬7[÷ð´ïÿ5-8OÈ®JлrÞ8[Üoè¹}ô€ž mÿ©:?×MÝ;¡yâ›è€Ã=›}µ8éä@™ ~ÞJoÈf•~tNÆé€ÞûŠóVï猌]lÞ¢TŸÍ-:Bôw¦.#MxÙ¸‡E]½¨Ÿ ë93æçú(ÊòVåü½QŸõÛô¨¾Ëû*¹L½$O£ñ¢›²>zÍÓßýNŠBTÊÉfI’×åt·:£î¦Q a¿Õ[²Ój]y*=L%VÁسaìË+ÿÛë¤f[ŒTØ—ûœÃ³Úgò•ç¿ý¸a(Fì?h<ÿøCèxúõBL¥"tÎ#ÒùÏ+siÒ$ðE¢RéýÛ¨tƒw“ù”ÞTâRÈÁ¾`.¨;]’pv;È·û)Ýô—º«iXulÿX$¿$  Tø™žÏæ‚…×Dì(>¯ö¨2„‘ͨ_VL»‘¸A¹r«‰Ä‘B”ÈQÔÒ(³~DõѺZ‰ PŒH´Î Y#­3‘È>‘þ?A[‚¶ýãùä~ñm0þñ‡:é4žU‘š0N÷û|1|N¼œNZ:žÉãÒ™:&äd¸¢E§Ã£ˆ?þøW³ÊºÞ„¸–þÈ€ÈåäÙ:‡È]ǽ©ñ+4¶ûô&¬ÿ´p)¯^_OÕ+Ælú÷¡,LZb –±»V Øbm¹AÝ ¤Ëç‹ ,>ÖæÅÞLL„9·j{©üHwmº)$êfáGït†ãm[ÿñÇïOýñÇ™bYàGM'nð±lË ÏÅpnì‘[kÓ…ÅWRú* IÜrë«'i4ås]•ñöç"áå²Û‰‡V5· 6Áð•ùÿ¹Px;ŸÿaØPHZüÐÐ1aâÛTø”¶ø„ž‰öÛ,޶Ms¡‡pÅ>WÝÃÁÀ‡ˆ—$u9³Õ]Úö^»ã'¦v§6'Àùjì£-Í„‘º×²âfºâÓO0fCâõötéM÷[x_öZ·÷·&ý=òqØ?¾¢Ø¥·šbÕÅ#º"AÆXU‡úòú¦u9 µGàËÂÜ€k¹Ì "hÚÂá2‹2ݬ»›Þ.W§Óê#»‘,ùrö&Al}Õüò›²Bs‹fÀïüvåÅ%{+‘—".°ëƾÍ,ŽîþR6½º*©^öé»EÂ`©ŽüÁ}fŶ Á;ºòrYfçÝ›ˆÓùì.÷–ÝXá=o@Îô g6ýñœ)Å¥4I![Dfá•>IK?勞ÍÛV¿ ï§)c}• ú9EÑF!%›#¦‹Ur9¼œV¯¦ÑNR´‘a°‚I“_óqDˆ¢·ªÚ -&Ø›I*)â˜>à»ÃV¼‰n§¥r{4˜ÚCoêÕÆ¾»…Í#§ðcÞw—ÄθqÀƒŒÃå(î"ã{šS 2a/*ÏEQlOøÚ°ÞŒ¹Ð ò6l4(Ëi}Ï̽ HQ™uƒ}/®¡H#þ0‡¢êò.Þy¬¡âút[_äÙV»ïÄâ­·D] ™bŽxL ‚HŒö' ó÷¿ÿ}9höxù^åV]Þ€Ùˆ›±¬(lz“¤SH/Kðÿ"ìŸÿåþi|»MÆøýÿA:œ¶[«¢c|®ySçÊ7[™«Ú¶ƒ@9Ç==àG±°a¶«šS¨ûÌ&ñ†@Û´&\jtß(WØ€N³Ì]fÍSj°zÖÇë¾ßï.ÍùÔR !H|ˆÉ*”ÂŽ¼”?ÂŒ¤/[tŒÕ”K¤Ïîì8¤99Àª6¶Ñyǃ;(å^¯N”eÖ» Àó“Ófzµ3-mF/.. s×m<óp,ó·Ëy£q˜ê¨ÓŠCg‹Å³Å»©ˆg î÷]z3’€ó‰þæ™»îÜqI×£–K¶_º+”k¼¬È¬)RÂx†Ú¤t¹’^§¾5cz‡Û¹ZJ–¤Ë(žUÖ)²2úUÖšZã`zeÐy¬[1ÈÒwçÿ ’,jµw@²¨V'3Ýi’÷XÑÝ`SaÛs‘’ù%ÔÁ÷®j®¬éNš &ÕøøŠîtJ—O² '†¼²Å†ÊªsQcœ©ôÍš]Xò:­Lº=¾°$•åˆ(aÉðhÈ#f¹ØV›¶ û]çX‰]©(íi‘>PÝÃÞ§"(€XQÏœœuŽo”/ ¯‹,~¾´êHÖá ß ¨Xò¬1Ûw/6ëƒT°ê÷v‚²p™ŽÉðÖ1*{|}øjyFD¿Ëî"ˆ® ié’ëÇiÚê*;|*´”•j&-\H—ô ÷ R9Ð[‹ÉDfa‘ePmDaÜÃâÀWÅLÙLUïOÕõ¢‹¾%¸2Ž@ÃÕ:æ[³:Ï¢ø5 Íäì&"9cŸuxËõË@T}ÅRHv˜cÏžY›ûÜÓ·÷%Ø&`¾ûø²s Y:JÛrYÌúTÚøÏT0ÎÀ&˜èô k•j,÷æ*£À+˜‚%šXÉi¡ze–»E⣯OqÎD<eeßïV¯ÚÊëž‹a«ójC¢´èu=|¬%WŠÁ½r.³€Ä†ÇïêÄåG5Äଆ’å¿5³J§1ó÷Q\–ÍU°£®%‚H*Ò¬ä …=#dA[úTft¨ˆµ¬t»~$ìnÔ‹c8•}ç—e¡FW ³Ú!ŠGñ&9ÿlrêo9é*ú¦ô £-ËÈwsb™æ6ºO6)éõÒè'‚$ë¶yc%“Ý ?ªú lUpÑëø_Õ[Ùó÷ý^å÷4-Hú©_Ì™=,—wÜñ¶þŽõ“5Ñq ú#©E‡Š)EGçA5Ĉ7/Õ½b”²[µ²ã¢à»yÆCØ 6B¨ó:dy@ß`*¼Ï6` ¶~ó+Ü ëžDÔÍe»S é(HÖãKÀÄ!·:;_Å ¤â+¦ë¾û†ù™×'Š´/{î1a:ŸA3Ú3kP*Ö“ƒŸý¥¿3›¥ç•æ0ºšuzVÃߪŒ 'R‘⬦ÑP¯Q.¯ú|ñzžº„ûø}¸>`{ÞJ8-€Å¨îß.«Íü¯“™„7âÓj¿_-T~ˆ›÷áÞä×ÃÚr»U¸ê¬< €Ã«ºæ¬z«ØÊ´ÖbÙ½1T,raf»a"vR§¾ñ£>¿Þî14E=’Òïº4n˜Uëú´ÑÞÁaC¹ÄÖ¸•ÝU{é¢ë|›z*Rµ<ÿv½¿«ìx‘üq#¼oƒ*uÖy÷¥³”*'‹s¢ß'±…ÛJÏ“å.‹ƒ"0ücKD!m¹&ÌÐð9(IÁr½Á“½õìÙ»´÷RGÒOèZfWðé^Ëtê>«ÎUfS•¥°ß°ËDïÅîªÖØ9cØú€;Š:j´Ÿ¾Y _¿WøÔpµÛ,j4¿çÖ:{UE•¾˜5Xä®KîçÐBd¯ˆ!)4v3hÖþtÙÒÜ„fɼNX z÷Ü"{î1"ø Jü¤q,GQgŸS‡îÚE¡‘ÊÊæNÙä„éúÃhqÆ,Rç *¤=“™V3 õ¿g&/F~¸Îß§”y¡ÌÜNRÛ<ö>=Û döü‡ÂãÖ» Åôõ;ÖEÜY¨ê`¶m̆>ÝM=8܆»$C:–WÞg¯Py_oÞm°NÒqweŒL—a”y¿µ[Ÿ2ìo’2†³7“®{ÇNB m¬«â¤Î5pYª±œŸëÈ QTX÷üŒÆæo«S¥{€ŽÝÉ’ŠÒbã‡Ò<˜¿ü´ÕÜ™»Ä< §Õn¡1É óB¥™už3œnŸ~Ï\1sZÚÓ·¦: Y§ÅøG½Gt®FF"zÓÇ«.I€1s솺Hr12ꥦŠx$趦xø¤Ûé$!–ø…c¡ö”ó­QÀÀ꯸¬pÑàÔ¨½vžvd Žï.á1ÞÊÝ luhÉʧ…}×!EI‚ç1ˤŽá³¯y–¹l53±àG>µ.±žªË*nÊÌpõÒÒ‰¥‰ø~bµYP×+„ƒ\ï±¶µ„T_tͪî6‡¹†õíŽ/ÄéËb´ª«Ããæeµý°yÞ0­YvÅŸeÑ™t¯Ù¨² €ôݸñôÞ'ø²„œ”é—íçÕ‘ÄÎåp¢Ì¦¦-@îl…+Gø×ÓžÕ6i¼ºº™š ‘B±œ¢þ½yH™)–ì3‘`ÿªÅ™)µçI=!þÍŒ½ßïO,˜Áw8x›ßÁ<¤ßFë¿ÊŒ@Ý[¶¼íd&yuÔnµ@Ò Æ³ÈØ ÔpÌaÊý»Ÿð8](X®šyÎ%Ù&K¶±54lD±qÞÐ ¨w³±5¢¤H²áQJó®|Òt«î YØ—Mâ|¹ðÍÅE"«‰™¨-_‚4÷€–)£\X7“]Äì±ÙïldÊ»ßn_u;í.£ÝEë[±N"ëfðxüûöžéQ;YºB51ƒi¦ïýòáÎÖ—Ym‘.)®( T„©™ÎñW«N}ØGTÝF™dS0ÂöN[Çv7 ê§„Á‘z $¬,°¢ÎíÓÓ8ðÞhÊéœ%{zYtJÀ}NȤJ†v–«˜m®¸R³ÁXf›Gìxƒ¬± Æü*ËΚYuEùR,ÙEâÓø*̈&"ySNGæ¦N ñ‘@±.?Q‚“)PR‹À;¨†¥87kC´eLE»êyžRõÓâ[DÕ°£n ‹1Bµ‘|ÙQÏüˆœhÈ…LpªYzAq%aˆZÏÿ™+!$n‰M²L}(¥ÍéªH¤^ÒoŠ49†ùWôßEòT„$Y’ÿ1ŽÄ0CÚ¥0#—åÜš /z¥Ì`Ê%{š¦káÞÄTFt ÇÃøhnnwK6IÕšù5;)ÒY’KéÕœ7)®]Ý)r¹üï §Ç0,Q…“F§ >« Òâ‹õ׈fJ83OwÂó/÷¢c ޹‚‘R”OO. ®'3¦î¤?¾¦Ÿê2Ï@Ö§ªZ·ü²;ªçu¯?Ϫðgʨ ¼ƃ‘x‡¥w6zæ¼d„3WF¶ª(ç$`†\à ·®æâ«ä‹Ÿ‘i¡ñSVwJl[*\1ZMHÂü¢ûŠ¡K½Úh§ý!Ñ¥þ ŒîˆZdó4êGQéu"„î©éÕ.x8n^ÂÙpQ%fÏ+r¦.%¾UiŽEåôV!o ‹îµXkA£XÊ«ŸÁ ¹)qÚ9¥‹#’áaã&J·]f“W’gÉr¡´ÍZ¨dXD?üD5™ZwÝ[UNŠÔVmMŒ#\ø¥â×ÂŽ¾Þ?;!Ù iÙ½¾Xï2ü¨ó=4¼ 7£²;p0—œ>pœó—3œrXÓÏË_ÿ9m¬wðIdm­¾™YLb,£óÄ3YŸ„Ë_˜s(©ˆôÀžÔý"-ðÃ~.§QÈN)i}}¢ŠÅ‘²ND,÷‹µxølhõNgWÎÒ%qâ»ïÚ™dCþ­«ÍÖ9ì†éñéâÉ> =8¸8ؤD BqowI‘ ý«Z™E)fšˆkºSWÛÓ:Œ“"ydyˆ¼˜éÄB¥ÞÌVº píPxF†³ Q[ò´&YH|4ýrl«b¦²<"zôyu¿‡¦÷ {zx·;„dMYé}í3—É4«Ínö—Pä u3lž¿# ©q6£óú¢ÚK~ˆkxÑ êê{m‰=Ë-¡p"4Rœc‚}vEÄÔ”zFÏÂ$O ÿâh=” o ¶ šŠ¨O%Lë þô$ÌL^x¾•ÈÌúYf¦ëƒc£ùùíè)²Âøü²yà†y;©xZg¸'µ »>Èô0Ú„^mbŸÍmÂ_»7ÿ)ÌI8üægØ-üL+|³ßÑeï„6l˜&>maÝšè´ÕÁúH£êg3íU3((,gƒÇ¢‡ŸÃ@a…›¹­ >i5»µ ýÀïAîÁ°ðM´aÃ4g÷`¯8¿kŽÞƒmû¤Á-H¡ë<™Û€ Ì3lÀ>(âø›GÖÅ»dÐÏg6`öog|”ʦu^x£”yÂŽð6I.ÁxoõnJ(Ã-j§Æ¢Úe¾íCc×—pD hùúmׄ y„é½ DÞŒ|»›l¯ëÕïÓ¦šÂ޵Dc îºaëµ][oÎ ½: ò}K{«ŽÂ3¸zŠp/²±äDwæT£¥"Ì­x¥SSlÎHpÍsÀùå(à –j#^ ë}RÁÔõ¤¸ 1(3ÍB,•jf¹æ¾Ôvð%í¨a>îa¼Wà{Ö‡qOLN@á´‡JÂÞÙ÷Uh¡æ2ä ¸Ú^ž’Ẻ/Z9}@z~y2Ô YîÁØ’„;&_æ}K®¶‹ O…ᮀ^í?Wǵ}fY?žúG[3žUIªr|W„Xó»Rט§Ò9ÝTÌùLãv¸-¸ìLÝ“`›`¶ø¹†…¨¤TÔ0¸˜>º¤YÃÚrz$9X®ðæÛÖjcx6à÷!)˜‡©„l†pºŒ!}XÜY¤P† 7¦t$UÜ<ÿŒY?ŽÎý~8½wê]~Ši•<—1³xP˜qÿG7RÞÏ48wµáæ»ÿ£Û¨Ç1ÆWI©Î‹º“ép3ñ°`WT„ x6Krc¢ðéÙ<íÕ‰@eÛ¶ÑíT–8 âËsd– R}õ%Ag ·´,‡‰_ð¸±ë§_‘åE—|ÃþÄ)â-I=ªF5QëhÈíÉcÁôû+d…)âš"žŽÃà]Ã̃eI¹Ð A$¦Ûb®B)s !u™«I®tæ}š@]  yÎ:é?Ót@ex}ÄÓYõÌ•v ¹8I^>( †åž¾¸»4L¿6‡Míõßê~ÝV Ðä¹ „ˆ—~Ò¹&w ‰Æ ÄïËî›’KLŸBˆy|H_¥À¤M!ºïÀßlAlÚ*PÍ91-'Æ*LÒAÍ 3аŢš‘FPÈHJ\uNÑ;ò'’ÕVK°ZñpFè1K w@Bèᘞ8ëó’‘¡G9°S[púÕïl›BõPO9Ї£¸•±}Ø)–$-J,Ψ­iH˜‡’Hæz¿?ùSõßô0C(OÊ*Gòùö€&’™O°²:/€ân)Œ„^»cŽ`Uð¡M¨ײVpa8Â5d%1ë¢?­À%•ÄÝ §OÃjM„Þq3 \Øåar3‡©)€ÊæRÓÂE8soP “ÇÃò÷N„X.AH§¬Áƒ".qÏå¯ãæèY«ÇËÂfTi†è4åe>ì“°è$  kâNbFPÀ\¼ß¯¶Ãø8xãr`c’ðƒ›¢›õfL2µÅÉWHÔ1{²¯c·aP€• pÊCœJC4š.z¾Ž’U0¤)+ªv‚ãõ Ó!+SU1ò.Nà ÇV‡}ZgY®92Úô×("²0 ˜Kü¤¸ƒ¼ƒ‚Js@ýŽAèÈa(ÌÒ‡ÍH¶Ø¿Vv{0ƚǪðibAè0Öçá|“ ŒgÀúBKÞÀ,^îTwi/Ó¤¿_Vß6Û͉·-•%ã¾$…+÷3¤Dzó\B…¹˜3ɰ?‚cS£pyI¼Î¡RG}ÙHª]6… ùÐlH8¾—§dΞ©È+ÌÀk\DJ¼²žë¡ž»KX0Ã:ã{è-J® ‘ãñSõ® LˆÍk5wþán:¸t/áÈ]Yß]§$¦1p1¿›Ó„ÄÊ­’Ïå—qYNÏ@Ç ˆIÀF„ÌØ"K˜+jÐz°¦§#-ju¡‹9ƒxšÙɨ\QÅ•kÁ®#…§ 1pXœýî÷ƒ¹ß™44Á†D«æi<’8¢íJù*µna7 ÖH4«X;‹×¬ÒÅaÃqVjXødŸáõÏ&£ª°]ÒŠªF}J¼WÛ‹'NH†Ý•ª]a=x¬¬š "ÆÁ&Æ®ýP!+kÑxáLÌ76†swY'ÏPÙTHJî‡õ«¹—O¯¢ü†ÍIòþmj¡eÀôÂËðõãpJsm  ´î\ ãCûÀ•Gsª.KJ¶÷ºÅ[ÖlÐ`Â…®8+¾YØk¦8Ï¢Ý1`¸ƒ&´µœPæáu^à«ÑÀ@ƒÔîQHžÚ€„–F!Õ-›|¶ÏYƒ²)ÏôìµT÷ó=§,ØÅÜG(?—!²­|£¢Â}ˆü—ÚMjúqS‡Œ‹Eih×¶ ùëvò‘ļ™ýѵ¸?œe–v%1&46Z5ÔÈ,:1µâv<Ü|z ºc;µ®'¦·VsdE•xŸË+"@(yš‰ˆû——.ß ®¥äjš\[ðûæe7üNÁÍ‹[ý⨿m§ö²Y”ýS€x¹¬GŽMtÂ)¡ AÿðeœÀ·Üqþ³^ñˆŽ„ÎЛ¯Wz¸#ƒ‰Œ;0ßÈORº î ò 'ɦ€÷ÁiN tòÎOTÍñðûƒó®3o½ù¶ý4l|, *‹iuNC™ô¸ñ –´òqôež·ð*ñüK´lXÌÓŒw‚¹€ÂU{š:'„ #6=*«•xéf£û`žÞ|óáj”4¦ tÆJN Ã*ò&0«ã7(4Qvyïg;<¹8}8<^?lzR³¶ß$Gá×9è]Ço"ÄÁC¿ëÆoÔC¶ÃÏÃË»'®¸|ý6>7ßÞL#Q%s&Ø™>ã×ù(AlhV.jêÐ|†ë&[o÷Ø~ÿ˜X%÷ÔO,=¥]ëCúí,ðÚ1LæÂá<­qW›ÀÄþ–YmkשŽ#x1:(I’,®]«>€¾ï¥+]Û¤q|jlî%…‡Õ2ø©IÙÑžòMÞÖÙG:Õ¹á`ÄØ2½ú°÷›šôª}˜þƒËÊaVûýi›YWÔÖÇ&¶÷®øÊÆ{PdÏNPø(¶^Å¢c¶Ù½ÒXðl˜sê=´U?y'–·40SÇW›«-Œÿ≅a®ò°£Ê®†ãÖfÖ•“uF¿Ôa ”)àƒƒ…]f‡„éY >/Šg’šµÁÞÈÅÅöCàÜ!ʰ û—žYXgI DçqÍ‹ëFŠóbPdÈ{t%»‰¶¹>´ˆs©¥Ss×ÂÂaݽ®Ë7òºúþY:¹tqŠõ®NŠ@t°Kc &] }t!gvÇÿ/$s`œþ{WÌe÷–«ãê™TËöt£ÃIñíUÆ>QFNRíd‹À»)†ÍŸ€†MѺ»˜Qžè<›^ß>~³WacèiˆûZ¬mR›Õ5ØæÙ¹OD¦ Ú#Ùã“o˜Ï`l*‹_Ÿ”òz!)¹Àº&˜DŒ§²íõýÿ‘r"<®Ÿs†ÕËÊðM70;CN‰öÃmêfXæQb ö_õI}èI1pñ ä’£¤ o©Ç"H4k^Åä`“%è»YÈtlÀv6€°Hs]+âðè’Û*˜I—â<ôCÂ9)« G›û$­õ~Pmð—2ÐI •°øÁó?ÛÀp8,â¿_˜²³ ©n îZ˜\®N¤b¿Ãï4w Àäp&ƒ“izSÁ^&ñDòoá^†u#ÄíëŸf¡\Ä’¸¢ŸæÎŠV-ƒcø°²éÙð5uè§Í¥!É´! „{bi)e,¿úé§î½î•ª³³—9!r6¸n¤¢09ækåúA;æòåÛ°^C±: V0B7gÑ]Ór5N2:’ýŠJEnÞâ0R—›jøød*mP(Jƒh߇ԀŸV£ÏQu!üþ=ªhÅZx/Äz:ƒŠ^߳⟞Äð°z<±!Ð̧ÏÒðéInLýØõaqS]|øpÿŸÅòòß_.®¥f‰;(áé—›åÝåûÅÕâòƒÕÐVÔ`þcAîE×{s=\,ùyóp[]^/>.Þ]_Úsí#ñõîþöâÃû‹å—söwb®7ÿº¾}o¿fîÐ2ñšëÛÛ»wïÿÅ1FÉþ|~oþü¼¸qoÊۛᖋ‡Ë˼Ÿš‚}¹~X¸Ž7!bî¯Þç}Þ‰>¨K ¢ynC¾uA}¹¹0sxsùaúU3PÈÒèóoÀsëùåæýÅÍíùêõâ.ÿ³|{wùŸ…­Ë\³Ç⦙l¬pÕ‡§ºK†{òw¼Ã,/–·ïÿE·ˆà7ˆ¯Õç‹»;û2zm–D£ÉB=ÄÝÉyº«¦š>¾¸¾¾¹ýp¹¼½¡ÍÇÇöo H°K¿ñþöËÃå½~gªo7ÿ×m¬¬I¸rùeÑTœÚºOuëãõí;>/e›ìÎbyñpa‹g·!øxèê</Q8u}³ÁÓDãoÙ‰©ÃT…0,Ä࡬ó3 0·×‹÷÷Á/F`rîË»›Ë‡ÿÜ_./ï¿Òð3ÞçU–eó-ì"ÞÜ7©qÔå›Þ  ¶oèƒ@²~j¿Vïo?ß]ØãÞç]•¥ þ(PmzÜÍw÷—W‹ÿÏŸ²°ál˜s$ûÀœçË›êÌ=kÛZèË<(²7°0Óû×üïr¹tnúEô„á%ÂÍ#ïnïmÅù,8zùgðå¾ ®;á¹ùóæÿÚªM•x¨ÈJ¦¾>¤â O£«Bè‚Ťn4ê&cæ¾òNãºùŸëË›Ÿ˜«)J|ÍéÎàv¼[’î“,‹Óþeñd`pÑAË+Š;¯6G¥L!1í¾Yd<×SH,G:”°¯`îáú÷õlBm8ÿ´ Í9¨îC"ô’hèDìU ]» øåŠÂâV^–ù]Yx/~8®žž6U¿}= ž!ÄeŠø´[oY©qàSXêÃ!{ã¿K ©ß¤ÇØ…„xS û„ =ô­“ëFÃÀEæ ±Ž{ ¯Y®ÒGs(°ó›]™ár€Ô$ÁÊÞuU´½c¬µiò^¯ceìñÛ†R³ï\Ð?¯~WèÉ:™ À,ï!—?C^×›“·õ”ASaŸ:Í=«ë±ðLS6j[Ú\ê=‰Ã‡åFƒ_OÁµ5¬0Æî©¹ ´hŸ¼rqÇ:H›6}|}y7<¹U’‘¿ëBò×ØÆ¤a²Û® ŠHåÁ1¹î]z¿Úù‘uóQ|àk΀,>äï½Þ†àÌs†JØÂK×Ë[lbºî43-Tê`Ó}^0¼oÎÀT“&¦CÞ6šlÒ¤šdŠîJ}KønwÁÖìâZo 4„„t‡íê7×É‘å0,K7A³È͆LΔëkE݆ã U=DKã_ak4Pª¡°HË¢¬'CˆX½>úëp´%>¥baûV;»±±Qׇ޹V¾Ð;ðœÜƒ¦{¾_ƒŸ‘Œ«lÒŒU.Xp±;¼r$»Å-I´0Z5Éšªš|äfmíÎVG-µ“nwzÆÛ²h&«Ì»jÓ’…wCHîãÔ®)B ¯€[®H¿¨£Dd3Ño25,lYr²Ü|¸±rNz8=/Œ@eÛö¤F¿Ý-/(ɤ˜È̆ “ØÂ-š=ÞÏ¢±Rïw·aï³ø<‰¶†®?>Œ†zš«Û~õ4<­WïÀeN #Ú×EŒ÷±¼g?UFR ËдØ,$ 1ÌexAúN·šº|úkô øóö´×4äÍö<ÏüuÜFSñ‡­iͼä“)üƒÁGf©ð}§YÞ·_ ¿ý‡ßÆ_ëÍÁ‘ šÛV„É…Â.¾Š¼©93÷øÞ°¿ûôØ@'añ4õÖÐåÝ‚Q…¦rõe·ùïëÛUúã'Q!K à*äº €‘ΰCMa¿/WÄARÑûÁ¾—„ÂQxu}·ÚôlÃ}EP ª+.Óæò Áæ‡M™pZ‘ÕÊé&/“BÃ:Òuôí¤›Éd†×QÜy·Êîc¿SrWƒàï.Ï´êÊ¦ËØ=úw=\O_iùºì%¶Cˆyê³jÒƒÅûÏw¶&j &ãš}—~3©ÑµÝ­‡-.‘,ÝöRìEd¦Ñ/ðÌ»Kõ`vä´sR…ŠWɶåjÚÉ›ý85 p<ù‹Ç—Ãì°ë*>oÖnn6å¿O){m£7-”>ùv(”ú¾Šzôyõ efÛ­w׎LÑëo–þʰº«ýx"½F¸Cš*hzÜæ/³áâ6Eö"!ä$†—W&ÌvÛÄKs÷÷©¶.Ô1Ik² =‰4Ì6)“Ôæj e5a (ËÂ:­šŽ8’S(³`u_É×wQ›åE˜ßh—“³È`Y&Îû&¾ §Ãi§kó @÷‘™ñÃF¿¯j«ø-W ±³<€ìÉròN^?œµ”æ“J…(OÖ'ÝŽ.`ÓІƒ¥³iÊÉü̵Ö1EI7tr¾½˜)>ûÇmY´Í#;°’ÉßžQŒ¦š¶cÐ}V×ÉŽ¿-Ñ·Ú»êè1ôa× ®©Äl¤ÎjmŽ•&ÖGl‰·;Ã~ [VDÕ·ÉJvé=ßL Ê‘œKúÙ‹í6”13ë Iâ¼!Ê\›³é!‘r±Û´“–.þ2hÓÓÖ¯<©-gª¿ùhïší3Õ~þîœ&síÀðûݳG X;ABý›ï7‡ïÃqòzm¿š¤àÛÌ”j_ÀZQz9¥#™ròI· 9¼»ü,Ü34èó<:'>¥θúDí?ׂl[»Õ³•‡Õx³ÙËÓþ8`wz­²ìŒ Q^õEúí'E}¡+Ò3Ä';^tyzò¿W[üE0›û§§&×:1gý0›9‚}v7{#¯‡Ñ™§Ë.>ÆÜÂSdn*`ë$ÔŽ3àŠ¼L½rt[ÌiÞ]j ç{ÓVì²n¢Y³uá/;³µï螯œ(Å—¯É莱ÕÒweYEs5/D‰:Á‰ ©··wv”º?‹§Z‰†mõo6Ý ÚùÓ*¶x1’&RPí¿/wD5Hëá ­^ÎѪ¬Ü3MNÆ«Íq â®s½E§û¦ÑÕ\mLkº^(åÙêçœÊv-¶l°—+t³ˆ Ïôx±ÄùY²I LSÅHÖ;ˆ 0ý?†¯åuDèFï¤åvq,É»`ß-$½©uËÉ&@mRï'#Åâæi8™âèšR»ZùøŠ–¤šÌùc¿[©—QôÁ¿|¸»\Þɉd ÿXØæ&×rõus<½Úä%vc„îO^õ?û—o›Á9!G-=PÙö})sr½Ñw÷ø×Õ)9©ˆ8í»8•èŒnµÄÎS*ÒíZ !-¢€‡qÇØZ/86 aS©Š,1j#\8éW“º|s=îG ›ª¨ U0ïÁáë1øz¨žC ÷–k!ß 5ÿ…ªûã6î;Z‹9ê*×çÖy¢‚è‚%lZ?Í&Z0‘šN|H«(d0ÕÊE™ +xäñ˜hÆ`‡’LÇÝ$š…jžæÕ‘@ãÊ9}%ƒù³DõyÓGc¢š¡ ˜µÚEd{³æI&P6:ÝìCf!uy‰ºh¦øÇ7ÓÊ^vÉà¢8!жj£É·¬'8ëX`ˆƒ ‹$?†IÙ µ:[·ô!—‡Õq3Nšê£ÉMÿ².mo}TÓ'Ýòj:hšrÈÙŽZjµ²C=¼¿£;àò脌Â;²m½jiáÑ[¿Ô‡;ÝÈ1™AËñ¡çš©­Ög™æ«}Ë`ÊNu3×ÌÛL«¸ŸtófÙŸ¶‹;šÿIG[7ºŽ6Ñ’Ú[a‹š –Íh[>ìiŸC¦ÃÙæR“‡=5.DëRå²".½5ò,E«õu‚67süy ººçé$¬½¯¨ÐÕ†áM+„\ô«“h'„•sžÛ¹–3ïöÊ+ÐîÑ0Í)Ò›DÆh³tÚÈD¨„E®Gj–æÀê:©¢; ±âV,“çÛÒ¦ÈfÚ@½Jï)Ðv}^üÜ+vÛÔ8ð–;7ßFŽÖ„ß·7Û9o% ^‰ïE¦ýNm Y.aLgˆxWØEÙûaupDzÓl÷ý`ÞAiÁõI,v¶»Mª¯ÒrêcŠa¤t¶ÑÃIi§Vé~Ç×TÚŽÂB)W¬#‡ëqždš»ß/ß(R‹êSzwUÑhNåþL”%GÔ#ø{øG›äõ¢=lû<ò±×~ò ›’^%>êËJ;ß($>j²)†8.¿oÓ`ñªÒzTi‘N•”UóÈIª¤s¯Å˜ÂºL}&URª ³©’âm¥Ñç;AEd¼ã @ÍÅÚDCã‚4²Ôìc¹µ,¤¨²ªæÍq6&syçÅù&qf¤"Šç&a¦ÚÖ¶‹Î5òZ%èP¤ÚçkЧÊ' ”';Yäpå±Z£QEÎ}öú’fQšÈ˜HI0ˆ#£?+-–­vZ^×»9á´lµï6ÂÝUEûO¾äƒQµ…Öµ:?¨HÓòV#Ÿ @spo6ã.R‘¢L5uãÜüUQRÛà쀪h./Àçqö3‘"à­F³3.ÍÎö°hûúµò“§…³åê“‘©œíázó²9}â@\s‰êXr %­#!7n$Ã,É5Òyi®viø·Çï–Š¹Su»£:¥â¤«×ËpäAmø=íGa^1^DûO•§”7Zô çËÍz ˜—(67”,¤õfqnB>#KÀÒIû(  ‰^ 4”R¤(¦a‰ŽõKÊÍÝ`™4—K\¸`¬Á ‰$êHžÎQE夫eãH|rDå˜9裩?‘ùж¸¹~‡þüW«ÍöÕ*Rº˜±X‚›hb6šhê¼æÌÜ—íT¹’<Ï„5ó\HÑ‘Å.zk¡³{üëáâ;Äa{Ó7d>ŠÌ'ÜÈpå«¿{”HYäeƒ8˜Û¾àLb¦©)µäaah¤ï´°Ï9e†û9ú_åÚ¨x'µäú6GD#ßÔöG‹Õ%fì&¯àÅ +«ÎV›ø¦T+ZÚ"¹¤‰+§æök­ïy&#Ê£”Lî©ãþµÉñ\¤¶ÞêÞžD%@>SDŠƒÊ£Db&õ¶‹7&GV©.¢XM+t[ 'šmªfæË.åee ú²»ó©\œÚGÝœ\°cš¸-‹Òq|Ù½¬Žãwsiš^¾ÿËÅf˜YW·¦Y£ƒj¿ì`CÈz%Mž:ÝY¦'/î{3y>aOä;û¶ ¿rœWÛG×Â[ªzÓÂu^CÂ/ICé¶udäe´&Õ}Ä„F9}tOÄ(M#=£)³ÈÓ1 „„Þ¥¾g.×”ÏÊZ&ºÈ{'ÜŒÎsJoÛ Üâ^åW©.Gú&ÞSäf³Ö6‘ ÌMg›6Jžöh/òs¨Õ®ÖQ ®$ë…Ëv»ó©»Úh9,ú3§/6Akï=Fœòì,à]<¯6»ñ4•ŽŠÈ¥Í—ª½fá(¶)eräbÇ¢\”ÿà2ÿQJ÷‚»Â©ëÉJËó/’~hÝ…{ÜOC-åÀ6ú|üöJ1üŻߒ]¤l@í4ª¬ñ”@È›_t"[ØíÔæhGù\eH”ÔK¤IªpÙÍÀGÆ?:çßÔó å+È7zëÅèR,ˆœwç‰Öo^_|0ñ»Í‰< ¥²eë›*Õh¹¢Hpz½0MÇýº6NXuäN°SÓ*«…ñ¼À;2;¶8âÄF"šÊH[djÖ%»¯ÝG/àzÔ§àò0<’Ï« R“°œ‘—ƒØ £ÔJa–‹8^Fƒ†NâÊûœ°JÉù9—ÜÒ*Â=ìï^¿m7.¯@W¥ñŒzØ«÷÷(ê;üîjókX³ËîÞÇþî }Ø–ß³sgÍüöÇãÊ…¾G(-¸OwªM×AhóèrÛ^ý„tÉ”—:›…@aé¾ï|¼û[e?&×û¿È’†9Èît6²ä}«—܃—«Ñ›Xµ‘ƒÌï}7m„¯—„ÃM×Lqá.vf°¯›qs׬¨|›ëa5Jš£àg$›B!Ÿ]òýµ&)"‡ ÿõÅ,u„û(ÉXõŠaŠo‡¸=Ч¯ƒÓþ·¯à€q £O÷y±µ¡%«cx»õ¿Ë¦PÿZ—#[Nw‘%Àñ¦hM€æËµ¢ 4ùyåjxgÆÕ`(a÷î»|ÒF¯í/rM:)s£{¥™>»xϦ{¸¸s¬HGŒ²Î9O)?ÝéX*jr4üõ{X›wû*Ë]…éºG—ΑÝï8±¬¦Ï]L¢Ü±vìñI°ÀØm~*x«ö)ÇÌ-º0è¢öéGø]úR—¬}NÁù œ›£axÕõyµ}¿»óáÆ4ªo”a-:…Ú@ ÓÉw;Ì/.!í2õÕäw›Ç¿·Ãú³!¹BaJ”Õ•äQÚ ´™”îÒeøÊ¹á­"ì䥌’€!!-|S€ñføIŠI³×óÜLM®™‡VÙk{Ln2r´õzÃWªNR‚Þ}ã$s˜â‡ôA¬™*¶NTäv'þyÂæÔêrŽ0ÍÒ ©‘!Ó C_bݬN§¿l9*W½5h'ÍE¨)OªÉ¾)Û&šˆÀLÚ© Q—‹ò£u<¾ÀÕFnsÍ;Y‘ù&—®é´x²±ˆ,Í —û§^‰§ŠlY~ŸÄk±³ÿÆÅ'åÑìGœ±eF¦ùºSc›–,ãÛ­¬üRÊâBŸ/Q\°9µeU¦ù—âàïÓ;ƒ2K¶xºÙcàŸ¹æ4¡“eøñi>u¥†Z]¶.B;¬®ÃøW1çPÝë9*“ÆDÀ²Óß~7{ÝÅժ˕„Içh†›» gÌϵM3åE*}cLÅUÀ`ÄÖ/F®-mã¡®÷?½É²‰z6uÙ¶¬×‡ÚÆ­šúhöËóÃþÝàH‚ëJ[ú"\ ÇÑP$úœ=6è¥7mÔÆ{Õ¨†ÞÐè%9í_Œ¤ë’9^˜²(P¢eltQYê¬vÑQº¹–‘Ì8sîøáõåå÷$(ÔsZ<‘ÒûQ" )±bœ”cÙ¾”œSE{Â5ø<Ÿ=¯I¾õä¼6h‡ZÝ‘|¡}›÷ÛýŽÓS7úÞŒ1êô¢7b«l<%¦¼M€ƒXfƒ[ô{#1ÂÀõV+ÓÏÉ}AX„¦êæ1«Ñj €¹Š‹ræ{_Ö’©ætØ)þ»í3=m:6„N‰£<æ6Ñ”Çzº:,™!O…º×-ƒ9çÞÅï{'_Ö­¨Éñ wØE—»ÎižØõ4’q ®¢ý1Pt!ßz¿P[u¾wu ëS´5s°jn…so*ˆíZ.æKÿÞ·VB—ÐLyH¾>¤#ã2ð{˜b˜¦fœÒc¼Ò ƒt þ)&¿ï2H…#ä  ¥÷Ô#´h 4[]” .VŒ2â 9YyŽ»÷¸Z ä}Õ73ÀýÁãÚ¾ZŸõaF³ÒgPšÞ ¬ Û¬™›GCYsç&â'ç±2-ßÎaµ6"k;qPuGJqÒnëDM¦^e Á“€ F˜„v0}3ÐF =lT ¿[u«AHñ¢Åþñ$ª‡,$¶2Ï÷ÃHr#kMí—ø-U0$D¨¯!*»ƒƒgXÐÁRò÷‡Áp®Ì5›e |Ûú@O)Nb{ïH}tÛÎÁâÙ7 ª[&¥=̾Íà„Ðsoë\m:õTiGªR`xBçPnNnX›âœæõF»Håb^,·­–¦GãÐÚeIa©Ðêtl ëYi{¨2û§-eÏW¸_ ãfdž¢¨éu{ÙA‚0GÃÊñfob¢'*t“…û¼ÚxÃ~_4¸RôH“¡ QÈ‘u<¼9#MõÏZºi€º8)/2^š1î) h‹Ãœ9gŒZ$@¿]ýy3'¶R«%ØÊ ÞbŸH|4a ³Ç0#̪â~Œ„ÔøÛõÕ¬‚½0ÓŒ:¹¥NÆí —Ô ç}4Ñ dóùå ¬Øn ÂÂ~6<Ôæq5ž\ÊßFRÚi‘4âæ©Åbœ¢eŽøA âÌ1–³ÚíétÈÍG&¿ùh¿¼8ÌH¬›¹ð†¬*dÚ»çyV‚ 5Üìe -²éƒzR_‡Ó^Õ…-´óŰ®Æow{[¼£ë y~Üñ•9xê§t~IÕwüá•}x ŽàòFÀà%g¯À‹Ýãf»]Ó_H•ê ùQ šÐïÿÞ/‰Îޤ TÓ`Þ Ï›ñ¶X˜ ¨¨¡üm$óRæjZœ™ÍuÐAåð̧èk ÃsÓÛw³F»ç`O4(¤å Ð%íèýv{³Ù½‰!…;rçF* 5$*Z{( `Ö gÏ’¼‘ êbòȽ#=ëä1ô §ØE5,5,¡êìÈ8où~‰CàG!ƒ™³ ;òÏ¡fõ ýî£+ðb?Pf&©Ÿû¯¹ÚD±Þ'[)œÞVP²¬& µ†Iñüg¬ ÂNb!ÌÆBë¾éã͸ ‹Q€T©aÞ1–g¤ÔoK.5­—†GŽö¡Ùö=~Í?7Ç;ÚcìÈ2r£·“zi¼+M'ø€éÈ%ðî÷´Ü‹« 20ÛV®æ&,za½çAñ²>NÑÅ?]Û^æ+ÛE sUg.NNá-yìºoÅ.g›"Ä7;ÿ )·­\¸u‡ÆŠPj! Râ…ÕúH {CètËN_EÉ–ªÜ+Ý-ÞÛ"ÙÓš«3óч#=¬È SvpÂϹ`äýcÅáî¶6X–ã ÐOÕCµêF†¦óöpZ²Î¹„LO; fþn™ÓÜŽ, ÿôŽKSseÙ24)ï6§—ñmWâµÀf@2;(è`3(#" ÄGF®…!æÌr›>8dx¾þß×ñôùôj3ŽA@p€Ð%ˆ%&{0̔܄,À›pöúXÙ—Š¾ h~¼(zÅŠ84ñÖrÄšÏFÞ mÐæê‚0)Ú~–vù{< /îꆸ¼å€mÝ…¢MI v˜qPŒoŠ#¿¸HЭ쾞˜{ÈÑåE9}‹åæÌE‚¡„~é £0®ˆŒFijÝ6óÈÈÔ®É0d+0ÜGQÌÿÝjnÇã¦;͈ôurÐÓ%ÉÚZñ—j=TÛR‘mºU£m›˜›eä41³a‰¾Ybj3_øŒÜyêÖ€~xü&“Í´HOËHõ#›Ý–¿²Ñ´Ä®ÿ3Mä>)ô¼þwTrrõcðO5·Ë*:O0ÙU©S@Z1—™â >¯d#GªKö°ç`3f<+DÞH8 "À(ªX‰ˆK4mêSË®³aÑ«;$†×s±7ÀŒw· ^I.gz·ã®©ï Éâ”è`až¯5w£ò²Î›nv3lž¿ÛïÓ¬þÍRYzŸI3·¥#PáÈAiÑ)ü¨8=bº:ˆ=q°™ûÖpr=€YÞ’jÏW)à„©¬ ™'ÒBžë/Û iZM^Ð)žFb½!ì ò iäøî÷¿†ßÜ-%ž¸ÌmÃêo?”ЇZÏÉa»â§ªZu«˜=óÑýö‡ž·ÝÚñÁ{KR ãnW¼‚Œ›¡­«l€ÄUê"ô(Å–eú]òa ½ÐÏ‹¼îQÓnW–y‘AE#u¢J×Tgñ4m¥}yN"“´‚¾%Ð UfºiúÄš´È[}øéû»Oä‘´ÁcVT¥"Ôi¸Ÿ›5q§Ã©¢N+ØíëÉáÔ–œÎ¯4ðœUuüå9Ö»,Õ9YªÒ£e_*FwIºCjöG’̶wšI·žr#‡¤+æÊîê”J“5,Ð?6TB±%ö©Ïã¯ô P—ÂòÈ"í¬ˆ¦/ ‡0¬$‹…îhÎ{òXaOËIì4âë•ôÃÙP¶®‹Ñp2ý¹ýa:ÇY4(žbÅ™û­¨=LM01Jjj‚ DóõQl>ÍÀþæ7~{<½U4!zvi_VÑ@Ò“KCQŠÖ‡m’•±Cƃø°ýG,ÌÃ6ɹØ×ââ>bËŠëäE„¹W ž3jÌ ï´+ðýΓrz—+ñŽÍ $l£¹*tðs µ"=Uz·Ý³å„|ïô9 »3¡b¶!Ìj .×cÇl¥Eð’6‡ X^Šq0ÔÖPÀçs~Dó²¸YßÈ“u±…îzH݈P„ÄyŒ´¨í÷@³d¿Ydn½S1¹a……`¼ËÌGì (—œŸb2Çÿëi}aO>‰«GÕyßyæÊÁÖë÷f— òØï—ðØe\­« ´‘§ïH3Ç4«šjº<ê%EÝDÝ \uCTãГ¶H!|g¬*F#,GkÃq”¹˜ }ÔqÚ¡'çªd½—ï|˜1Ûr^C´{ªë>‡h›ƒò«mBzªÁeËáKŠøçîK3ÃúŽñÞ}”Ü"} R´Ët»’eC»«­ë•—άî €FÅrâä ¯VÞ¾)UÈ•î` Ðþ t±Lº¢16 ­îLgzõ~Ú*a'°AŽ‘ Ôfë ´‡{®7[ë(áÚ‰Íf€“: ãb÷›æUvËÀªiðÊQ`¿  6÷@j È>¯ÑØ;ðP´Ì9#Bw ò¥ æzÜÇYØ%+†FiRjˆóÒ&Vs)ûo),zó¢ßk½?qn¼ñá”þ¨é40Q/¾@ÚãP6XÎtør÷¸:ŒRà‰Œ ☑¾M‚Õ£d]­šÓÅH<å5”KY©×n±‚>ð_Ãp¸Ø²kšY€b¶Ã9û•æÅy ýùfuz`8¨’-œA!ýÒÝjsVgjŠÁÞM—oŽ9%®’½Ú&G…¯¬z˜`jÃÇ *xËgÑCµ]‹ y)ô‘!îàíQÂ̲Ûx¬™LSŒåc“9ä6ï`ñ¸ÏY 3ì_6ããëþuŒ–´FýïW³©ž6²F†ÓõEVã­ChW¬4ˆXì¡|`[!hã >…¯oÄjòدЊø‚ù&Y›ø9§Ÿ(ÕÁª^ÚvËýëñÑyr<ì/·›gbVµ}ÄpÏYª™ià÷™U5Z –i(ú’cC –qjÁ¼”KWâ¯ýV'ÃPCI¸ƒó…Ìõì}½"¡°* /²ÇPÍ@Ÿ ª¬¡Î…‡Øb;v%nD'a„$¦êœèZ ¡R£µ^U “C(„ÃЦ >W°Ê˜î÷\cWåÓ3ÔÌ µö…ô8Ùô혅‘ªÞ¤ ÊÎ ùÄ—D¤gÖ˜dg63ªµ4ÉõHÖhÔSØ’v»ëœ§yežè€ÅZíˆÃUY›˜“©M¸@ÚîŠaæÞ0gªCº -Ôæ/JЩ(l¬Z]AïW;?Zv‡±ñܸDÿïϤ-!Æ/4{3AÚD& FaÐ{âo¬föqlNÛ BÕ1€Næóêp`V96pWoŠäm‘·ø #º‡lõÿ~ݳ˜oîÿà¨wHY7 ô µ1™Ô78p20¥#ÀíÓ„.’~G$ñÕLB¸t ]ï ã< N`€ÕÃíî±6,Åú>ÂkÛjúZÐL©×ªßû"=Æpý3T./Šé@CØCøÐùwQ k¥6;‰ÛÌÈ)íòü0×Y×OÞòù‰S¸(úçž… d”S³œL£;löó(Å\ÔÄ8àÃX‡D,þ%9ŠüE/¾?‰ ¸ÙfgœŽÕig_m)³úMÕ¥@Q·òÜ¿§wGJ}!Ám¹ògò0`ã‚—rSâ=BˆNûGÜΆ‡ÄëQp³¢u¥Î ßæ¸.v‰›°¬ªdµˆíô wƒ°&±ÖSW ºR Éy Œ´“¯[:®Î}?í¢Sx;Ê0=®†ÃB®²¹0ä(ê_k7\ §‡GqA*q{X/NáS™'$lŽ+ì¡–†kü¶~¡@"m’jƒ'À3¢n­÷\ªÁ9%B‰r¶F é+ ®@·1ôjâs‚¢-b×vÙ)às’>x*äJ¼\W”«§›ízñck¯@ÈÆá!ä"£w©vKTgá准 >ÍŽ¼À#æ½UdH¸ ⾩Vˆe¦är§lU7z×°#›ÅýH2K”¯‡Ý³ x"Þ^¬ŽýcN1éÒ–}¨~[2+þ+D«^¯°Ç Ü{E_ª›GáVÇg³¼TÃåieœ_µÜ曌š_æ,vm¯¨âþðÛlDn£â6jÑ¿=ƒZd}÷ªyfëz»û­Bûƒ$2RÒ Þ° L~ø¦;( *â7¿;šÙÝ}4ì:ЃËõBéìýXòLÊBYüªÔö·oºì,þ~õ“— Ç©d/rêW<Å,B’s3¯"j*‰ÝáÀU9Ýó)+¥V-`(‘çþ¸:þp^Ôê4ó]˃ÙAîpeJ̧­bþ«éûÉr™Gœ´N„¦Ÿ~gîÁ(ý³X=:HáÚèý×Núx{¤„(J—â‚ ÊJ³œµ¯ÞÌ¢²ø€âª$ÒÞt¾×(=Yö&òò—8ÝMwóÒÈFÓÛ>ëº*žö©ÜNûÜM6í¥èÆá4¢,ôAù¾ÖÈyƉrSg=»Þû„°T#¸Â‡'CavÎqP*ÿô¹RÉ Õä` ›zާ¶™`lì˜çÑzÊü¥0Ã1éÔÊ’Ô¨è€)¼Fó(ƒƒlÃå°õf0r­U?ìÍ÷¦šZ‰ÔÜèñ,!¸Õá•'¢è*ÀkÊ£È3¦aÊ'P†,)ê h|ÞB47à˜iS·?ÓòŠVú¹ô£h›¾ÃŒ¶+7K×™ZS)1(ÞühÝ…ô«·³zŠQ”¡Î¢-c ¼OîàœQÛ4€câ#YU•:d&>ŠÊáaï$5Ž/šàèè+PÙ¢K›ƒ¡Cÿ¤‰O{µÚÿ¥,Jña Š@ŽœIµÎÐTwë»ãëNm ¶ëԄ̸­æmž©m²ó¨üô¤éÌ“OÆç´ˆ0ë [¢«Å9GØ6"{I ×Ü}Ú0ó]æmºIïzË@AÉ–·[(ýn×mr ^a\ÚׯX™C¸¹AíË4hJg¸Ì¾I‚'ºýNÒ¹‡Fï¦â©erß²ÛÎì,‹0'ãË(r”ÓUÀ˜´hUápÜ=±g±[é€ÄëiÞÔS©õãÚ£13T+D§cëú.FÞLƒ I)¦I[ 8Q°Pá*µSN†¸|4#ù¹úIFú†[$ù'׆³àœw^žSЩ"/‚%’=Áè‚xDLDþ©–š*|Õ¢?M@Ú…‚°(#Ú¢9óv€¡(GwŒ¶#/”WJ«ƒ‹JÝ<’ŠÏX›¾W}ÖZB'ÐÐ9¯î¯rt ãR°Ó»Çíëz°<Ç…ãËíÎjÔíuÜ[g_À•ÔG°Œè¸) óíjý”x0iÊa;{]‰«Ó~*®"Ç¥â-uœ#¸ZXH‚àÚðd°õ/ßBoh–¶s–h«®tA ËK$—?VÛW3´OZY)~è„¥a"Å ‘ˆ —|ÿ2>sPê ,§ ÃÝAOûƒåÛÃKÐzcͯÞßÖCÐëBAœÃt›#WAøöºßó9ÆÑi¤º^9EhCñe§¶0 u†»‹,Y„·Æo·6S‹b7 䄎H²®²¸“·ÇÍó†*ÏJáŒhBó¼BÚ­:{¡Ã¾©óïиìy›tm…§8+FhÁÛÆ£~²~¯‰Þ ¼øÃVA)`®èej¨:ê¬öãnדÅP?-‹ª4fS즬ÏÚä -{ þÏEß"SfÓ»:=F B#QðžAj«<†èö®ã|´MÕÁX Qt©(]»ÔÜšmóŽßX(+ü2NýæËÕË1&ìà«iæ5¶“>§l÷Ù´¨XkVt¨<ß@9—µ…¦"»õ;Cséj|oNæ†C”yíë¬Ô$‘±Jí-æ€ã ½û-îJ‘éÙìЙ€Ð¢zñ6,ïÿp-ͶÖÓ`_­×pÒw¤Ž&"–Ìò3k@=X¼+³¾Ò@ßµwJeZ—e´èˆ†aŒOŒÒêÉI¸¯e„áÛ)ze§ôzj«Õ¹&5»µg€5y’¨ƒh–&a™JsêA¸p|]WöU´ûE ÌŠ&>HæÉ»WÇÆ´Y¼™„è´Ç7÷ÌÉ2¤í…é–tkv¹ÎÛ¹VaªéôæF!*«Û¢,’µÊªÐ þ:ÑÉf·H§D!=S1BñØUÞ×ÅY”c©|À*ˆ‚"£²Y„—жœ 6ó“-p{œW„Õy9ƒ6gW5íÛÀHURÄ›M·Qîä¬È®ÚúÌWbe¬TȈI5ñü?Ò¡R™çÞlÔjeιo6ÔtªT>›“Æ ÕQßdU÷ç-ðs]Sž┢α6©h&'5(³•&КðÄygrÅž/Þ@AÇÎNú1 ÏmxŸí÷ò°Ù9΋r(F_GNj0×ç=›L»iGchúj'—` ŸmÌb ë˜ä2ò2žyÝÄq¥òºˆqÐïÄW §WGôob"Ì»h Bu¹Èc^TíÝN©f¯¶¾²Ó~ðe‘+>ÃåÛK¾MÈjÇ¢ÎúuüN|µW7-¦&a€¶=UUÚ:‹ 30ŠS›" ôÕYu®Œb"ñ[o-&2q@x‰ÈêùÝ~„ܪÜ/å]¤,€ÊvTIÕôÔpB'ª¬ÂÀòÙ±jõF"nFôÞl%¾UZj¢Œ2}£pê|ù4QM§;9Ì9¬S¼q¯?­<ŒšLñ†æ1XQÑ›É?šz(èŠúquü¶z6ãÛ’ÙwªÜcÞ²C±X7 ÛªU.‡ê²Øt=°ƒ¼ `åHÚ1, -U/'#T#×@dæÌüËÓþÈ™H ïv[ejãLBžÒeHÕJK¸$¡†L(,ÜD‰’Ô¶úø†_Q`|£ú‘»`[gѧ)ïüý`VVéöŽÉCØ1£ kq¢%0¤9j÷zÚNG® [­~mì¶DJµ¼—¿VfÏMlÝ|P‘}ˆ6rá8Ái0PH{¯éjsDÏHYú[öùÔݪ;RLyu'>JâJ`«¼H`P,%G;ˆž‚¦Jt,šÐ®lÐðPÓ Å«Ñá"³`Ù”èhàPÖ¹UœÐÇá4ï+,êV­ÙªÕ½Œ-¿Äí!DrG»Õ7q”<3¬—>0ŸÍqÙŒÃã~·f¿äÍzgfH<}¢ýöùôªƒÇ ×[éA'¥ö!bå÷ZÓ·$‰N²~ ”Òæ™¡³è/ÃîÙܶ¥Ïå\ÆÃ<‹æË3*´Ù6RêÄqËEW£~ZR?j+—ûçQ–Ÿ&O¼C§*«,:±B¥ª0QœCDG©Ìª9„ÖgšiÈÛÉÛ¦©U—MA“C§ô)ØDÉ«x$iá3§(HÉÓXH‰‹…ÄǼ(ËæHwˬS9“©@MY_ËÌñ¦Á7vUÌ1ØY‰ÕƒM9öw€äbDˆ² Âù+m]©§J‚êcBkQNGIá4/WÊ+ÅYÿ,SË%Ù¬Æs`ëR[¨|½©…­žÅÜÞm¸‚`Þ Ç‘e«»Ì GÛ)Žƒ!F^ÎZå™Ü§á´y‚8¯•™Ñ^£«!]œ([ÇæÇàJìUЏqS¯ÜXÿŽ'Clå¤]…Ú Fúb'µ@OÙO«‘ÛEÚ¾pr¬=ÈC3ØJÆóJEÐ,vGªÇŽˆÌœve‡*rK_~_‡5•Gg,ÌK I ,µÏÒ®TôRÔÏæe·¢ŸUhG}pIß)úH@-v?k~›‘{ªh@Œcze£âJ 3¾uÄä—YjDÊiZž)Ɖ»H!Š–Ø}L]íA#û¬ ‰h“}÷+ÌbbÓ4ÉΑÉn+ñTåtNÃåËáô;ræ•xÔl²&n¿’‹°˜Œz‚ÄHWåä–Èp¨r”f˜°õ Õ ”a«Ï”Ÿï\ Ú0£½âÑlÍϵ{ÓÔjþ,Bî®J™2øÞ8Ιё¶|];ß÷Q0j¯äpW‘ñu³]‡PJ Ž1“º"£¨*uª;bÐAÐ71[Æçð[ì¸B6¦Õ£àÙ¦n›3hÈW@â|]L°¾Þ8ø|Õ‰¾Z–ÃJn ‰sæ LÈFàIëdÕb˜žÃ2Ã?¬'Þߤi,ºY|ð/2À~:mî} N}Û}3óÔÊMÓ6ÿºÁ®h˜ŠRÃ@wm2}gŠT6Eb¥ö°…—ÕÓ¹„„£FtDÛ ìe¬÷\QôèŃÀŠY!«çq¤irö³«íêYâÕôí¦R;úúñ:?r¡ k¨‘iHƒó>Rû¿«[o¶…þX“OOÎlSWE>:]ÄÙ–!îÐ|2qXçÒŒæ¼È&ŸYþ½9Hîj+™ª„‰˜=ÚV–ŠçÜ¥ÏW„Nzûâè.§-Ö*g—€¶æÓë¹€J%!ì—7Xîаhš‘‡á至×u©fÓÉÕ^åÝ®Ò[©” ‹³@’8ŠÇ."ö¨6w‚õCÕ(æÅÎ0_gÅV á24(%$ÍJi Œæ…ºk¯÷ÏŸ‡õfenÏqÁ}ÊùÉ` «­ñiU‚šËÕJœ2W‰mœP&þÛ²7šn°Uª8@°È•åÙȨšaFRùyuü;2:“™Ü’E) “MèÛã—ÝË´4"¯( ‡ŸÉ—~¢…*+äÛùÌФߺ˜yœOÔ‘>ì6†c´ÜF‡A Ÿ÷ëÍÓïi^0¥ÓI”å·PãÕèØªGî–±öY* ²0|Þß'.ŠŽLOlIÃK¢:eŠýJùïô.®{Ô%' ANUÓgÊÌ25¹ç5RYýØú¶šMƒ„Å#â8—Zi"ðvpË\+gwÜÃèª +CR*Ïd妪m0P÷ÆšÀlî-®¿®:-Ì*—¯~Ø'"Ђi$äƒö“J%åQÛeÓáÊ'0^#f“¤bÈ«fä\ä­bµü#?M”^Î &ÅEQÓ6oÃ{›­4 r޳ °Œ3‚áHó:óµ{·\lS\·H+­¢/d¢úÛæù< p¸™â–æ¶`xY^Ô“mÁÔàÀƒvPÆÃ ÄfûòD½¯R‚8Û·V[ö9yØW›a»¾Ý]ý¤ÄÃâË ƒçkÜÈÁXT Ô:±)Æ"fp­’„ߊƒº[ÇAqêWtÂ-˶ӥÔrEXlC~µAíïÌôû­®O#!_zç£Á8 µÁ’%ÙÂûŒœ‰ƒRNk°ÊMê7G×£êš9§î zg°$æý߆Ù"aê†wùé×à*[dXAÄCb1(WvAY¥rx•VðÚrÙíÙ3^äwV=Àfs8v§Gg1G ‚¡ß¶`ܺڸ»›¶Á’K¬"¸ÕgÈÖ ÄòŒàXž7Eb ¦÷­c} ï<žö¯Ù!ÛÁ1 †¡i§+w†&ÿ Բζ]í9Ñ‚ü&_¢-n:i€e:\²•Äø¤ˆªM§b†¤Íýê§ *Ủ…“òþVEŽ|E¢îMŽV¸Ùª7E¯rÿ{>s€X‡ªNƒS{àqdI-C,6Ù‘é]À[•Yàž|‰)*‘yÅÃãU‚™âòqg‰=UƒYƒ¾Ñpõ¨o zx²ì°ù“ª½%!á²fõ·dâ@»dϺó5ʲ²nJÒû‹ï’K‚}è£ñçÃQTÊ?Ø=ŸOÓÝL¿Çµ (ÃûôM¶Z†ë …(©9ˆ÷ ,Ñ­GžËMJ’—%¯Uâ3¢ñóš)#ÅgÓŽ²dþVœ\”ÞŸ¶ªM2~[ʪC€I˜·a@³n Iyççm‘@Fî½Ò ßþ(Þ‡l¯éõ4žI~aŽ›ž‚iʨfüÍl *) Á›±} ä’ª¿R‹dÁÙÂaÙ(‹—¼@'~̲n÷ó%b~âòuµ}eE‘ ñ7©Óf¹e[²ÚœÅÍ/½z™Z½syù^V›¹L` ´[r1ð\}T²Ìäx×>åÚ¸ËMb[¥rÇ`È$¼'©@“Û0™v¨®ÛÉ0QÁ÷¶*(`χ¾ÔXOšM-®Ó£7×ÍÒ9z·m5™68”¢£Ž4Ÿ$_Ù‹|&O~¯³ýº|÷:?Q3y£Û÷}®Ä!ɪ'œ]´ÇÊ"êx¸:kôaùô£­ …âfÁ£¼«ú|ò8ÎFßF—ø¨]~m%þSqqŒTI¹´7ƒRXô$}·™ÍLq8){â?𩎻Ð`®üˆæàõh…áÂ¥c MÙÔ78S÷†*d+Ö µÍF²•±–E§D–GgõÎv³nò>sH}¦ô¬ˆøÑÝ›uó4*6«®ô¡‡s‹3}!Ø‚¶2çæÑ¹Ú«ßl'R{Ý:¨iºB‡y @d“a\?ÞCê ëi©Y×  ªy¯’1øèŠQ+uÛ3”GôÌL1ÞJK2½néÄ‘´¾8 /6p{¿œ¨§+•©}92f™sÖm ™Ÿ,ñŪ3•Ë3®#4JуÔ5.âHiq³.ýØ×†*{U·À‚,[ÄÁyRHÏBÎå è9þ¯UÛ^=¾bó±Ò‘¶-ê=>'îÈÀ0 Á}úÒŠˆ‡J ~έ¯«ã·9ÖP6š)lÅ´ÝȯÑØ¯ÖF7 ‰†1%z±ÏuÔ^[Ë? ê0ƒì'ߘæl ®^E×è½5_ç)4Ê ¥/ƒÐ>µv®|( ÂRY«dµè’ä¥mðûãáö00‘\m=’ê@éݼ°?Ÿ^CÄp¡µQoMx©¼]Ë·z:èÕçoÖ›Ñ95™qö9ÌIœëÅðŽ^iÊhL ¢¸µ˶Ôù'€2k€$Î Y« Üқ©/ª7_´ß̪Ç.‘sœn±Ž -ô B]œ¼ð*ô@…¾˜&1[Ô·J|`„v%7ìU4t {LŠ/Ö`S»õMŒ›ÖùÈ ¬=ϸ·¸¯J)T¹I(âaÈ(²^˘5kô>²C¾¨ëxü âm]PêPÞW8ÑÚAÅõ6 ÿÒĹ7I \Çï~]»ê~ñ&I–Ë YÝÜWË \èÈoaQ- Jµï·ÈׄoŽxÁ'å.úVEÜXPT•‚ô×E¼¼X”¢×^þ”T™·.¹ê©nîjÁÈ$j˜Þ¹*É7ÁÞÜX½Ó¶PuaêLÊý!½¡(ë…º ’÷ ©óz=2Ù)¶ÁÚ'~£ÔQ§’µRÐeË%¨Ž6ëõF²À1‡?åÐE#†(kÕÅ!¼Uý±?7§Çï{JUÄ_ØôVg5%rP¾ øŒ~ßThóòð$êÒsY†_G 8UŽ\{á«DV4yØ‹¨"QF%>’›Ê’ôeçØT”®òP¹jžíÿ¼ÞJ¦TŸ_v›¹ø8ÂÎG°b¼ ½ˆ)Ââ –L99#2Æ’©Ä,,™:MˆA©J`DA˜J®ü2=°Ü‡£eÛÌEªdJ£‚Àh5KC'+D’«Ê()3U*ˆ½ -~ÈSáu7ÁEùh+¬­>k©0I\’Å AO³Ô ƒ×Oz1ÉFÇQxÈ*0PGšÖа1âj«s?4*¦Îa0ñ‡µz¡òA\yèþgT{­ T®•ÒÂFu59ÔìK´‘FMt"ª¢ë§#FyMQ•Zñuù+ºçxåêç˜Í­Ät7É*ÂÒ”Í8%ì6“‰JÕVá§(Sã a5M╎¦¯|ƒm|Zýé.`­VJÿPÕÁÌ·ðDÓÓsôVC¾"ÁIà$ “²YcŠt3˜¦^ “"*½v[LÏXÊëÞ&Tè²ydð3hUÙ4zkˆòdpâ׳9}GÆîÂyqëܸådOÄ&ºLù”L1h,tÉ)X}<ï''7–žÍÍ>™aÁèäÐ]‚´è@ƼVyß 41¢V†5EÞ×5HS6•ÝA¡JT]#ôw/±“›=.Êé+ÄrÈöD ‰#½ *„Iô>ò]À|^•HÛÜó7êБB¡©fZ¥*Ñ)FFÃg+Ù׉~Ï6 Ðlô·¿u¶Œ*ätûs…ìP¯[MJÙ‘]¬žC'ŠÙUjƒ4|¾œ¡óhº…fÖâv»ó öPõmó'Xp"Dí¢-Iït/èÏK‚ID65= Š\pûDô­ªÇ™s6ºám›áevø¼ú{€´@E›C„˜}.ãÃ^2ðÐÔ« ôP©µ ÈÆ?à—ú¾GrsY0hVªeWêÀ,E¯Hc„ $‘ºÁà°ÐÀ¯$dS«1󉥘Üz ¿GòùÅê"doT\Ÿ¶Q#Nƒz°€Š‰+ä(¾„< —¿w”ŸÍ9Áë“§1âËvV‘Ga‘‹;¦â«J]ïmx†””Š[“±nþ¸9(~‰Ùï¥Ú†ñKÒÍÈzz®çæïÌ*“ø`S$&éfkööô3m¡?3qš_÷•î”6cÀ>CÂÑñ$æóÌY.ñ9ï¥Ò©Ä~*Eƒ.ë˜Mï`N‹^kóä;Øå Åš;Âæ²TS,•¿äºöIär)ÊɇW}àoê}K6£ø“5zU _BÞÙê3SÛ…¨"!‰1Á&z±¾VܯCÄ×pŸå©7¥âäŒ0 î'Ð}ÚÞý6ÿªIAœ›Å¼»D–Ï·ð,EéÅ”¢ÿ¨ MÉãIWø0›ÎÕö´̳-G ¯lb®½Gm¡,²]Añ¥"Ú³šM5Rþp1ƒØ¨Kül í9ª•,®©si!7“Ô[¤Ÿ©¦¬½1CmÕä%Ô;•>6N½3Á2B4å5sº Cì4=dœ*†@Ò¢¾ÕÎ)Œr%ü©02Ð"JJadx=½³ £>Ëô†zCad8þ î×—†ÌSj›¸J²_î)Þñâñq8¸Z Ã#­®=l • 2YA» ¦ñÑUsúïëjûµá¦ 6^\›œÇhX¿ûýaódãÐ)ÖˆòÑÚÚAzÂýdˆêpü‹hkp¾ì1„ptZ**7³5'êÓ~+ÂNÄxµÝÿ[…š›Í1 9ïrP{‹÷Ÿï|Øe—é{¤Ü-ö W5¼Ü­†?䌤àOlÎö·ýënmóC—þ>^šÕ0-ÁÙóà<¯ óçç#Å5ìžï] ¸2 |ñÈ…^~V\“ë§ýˆ¹Ü«ËÅÁ¼†‡Ô'c¢*&mòÃÒ°[]!…~àB?‡ ‘ÛM;¤¡¶¶!Ôß7»á~Û¶lÉx³–œ9M0GŽ7ÃÏËõó°¸â :ؾwäŸ:ÑÞ¹Xÿ¯™Õì›[3C7{»±ÌDÂ^ª‚Ýx·§¸¦Ë_FÆv‰=Tƒ´Ïíø j„¼)÷™Ñâ®^·ÛßÄè­ÌðÖ¼rA-<Ãå]ªÙE¼Ã¢,#ÅŽ“cû…ÙAÏ;Ç€ô¿;r|«Ë}$¿¤°Ë¤L½U´}­øŽ#‹~Îgޝ99NW×Õ=¬ }n]5-ˆ”'W?LŠ”u–ÉÏÇ=忤kfÇɘ ÷ƒx´Ñ¦CYìî}"ÆÞ§Qþ×Àµbø>¾y}ù6ØT.{[›‰–Áýëi}afK2`N1ýÃ8S>i13à93fï•)¤ B( ö‡q,®Ææv+yˆUEÌ\/ûBƒ9'Êþ§xRÁç ÝM ˜ ©Ö3Å—£#oòêÿ›õ-¾ûu½9ùðö¾¬=ãæºŒ½9©gÜ-lÚ]¾’˜vq,`ÞÇÝÚæËŽ †m®š. •m屆~5Y¥±š*›–2ìÞ5Ñu‡+ÍM&¯Í½÷'aä\´‡qت®hhHü@í Ã9{,­f™þýj»•@HÚzߌ:ˆ†ïO[vÍ`8RºŸU¥/êæžîÌk¹ys2±‡†¶4¦yÌ;D6Hž›sg[2Ÿ@gŽÐÃËa+ÉÇóßoÆÍ®Y9of qÙ@HÕÃ]”³´/»PáÕ˜kùa§Kì¶Öllð˜|>Ãæ×ãÞUiÚ›54§ÈÒHs5äŸFÖF}íkµØùûÿÊÜ~þË}ëYAÞ¾žÒPóq !Ú̼´ÈË*SÀ¹wÁ¸i÷on8xíÃþùÙ#»Dv¶C{_;Fƒ…³Õ¨M]ª8zÄá°XË3'ɸg6–ýópú¾_Ï´^ý•ì¡"ð³LÞPfà{öÅú¹ÆPÅØ°×ä½°<îê…’¨ùö|¹êÃjK´Æï>ÀB±Vl¿ûjgºQ 3ò@à²ÔÁ«t¿@Î̸CÍÊN‚Slb |c , Èžàj»9"o/äÿ^÷Ô¹Ô¯óŸšû^œèõÝ2¨A×§ó‘öí ×ǧÿÈÌd¿êÃÄv'IÃ}WãV Œ0wûà'àX¯,˜ê#ìÓ!EUëMí½;.Åé(‹Š…6Ý*¶©r樃sä/ñ.‹|/¼§u¬û~±¨N©}rÏ‹b£|æ`œ7t~ØÇŠpß®ð•H5J JÛ§¸»ý{ª?=ÛIeKÕuAîG<»; ûÑÉNÂWGmÊ>øfÇ]BÒ¼´9–~<à¿ÑóŠ„”V¿X®ïþð?ÔnËΘ·£{&ä%ùÕ‹z«FüXcê¢øEßÐÇåŒÖÊÊü}ÿ»øN5»¨ý^§ð?– ^`²Çó ¿þÄ-–‹ô½]½®*Óé,TÿÌŽŒið¢²Zm[û¢uûhâå¨úzý«ýÕz”Ý0dOÉëOÈv¹>,žÏë¡!bNÅId'Û¾„:†ÿØÏAâòñË–˜vµ?¼U²•-)Ùì(ZÊd:LîBß±êkSõ¯õThûiŒB»›ž^gÞ«£œ4 ¬à8¹ã¡Ìîï`ýôLÛvj{±ã+ÔKáÏ Ÿ‡…XL8­6ÔZ׈¦à”ð,U–.mkÚ™¡evS5e ă„?C«Õ=cÈP 1™BæZ.kž½zDLULõÍ‹>‚¿zšš^ï è\ejg³eù—BíÇJ.„,Ô*ÞÔN—*Ò{3L¥!~¯ Á=ê¶Ñßs¢ÇûÍ—ãÂÎÆ©ª³= þÒ§Å5–×/eE%T5~´ªT"¸’²© ý^ãüù‰Ëo5M§î#ç­£æOºT§"²VÈéݾvò{tõäþŸøÔsRY‰Ö¶Åzè"ŒãÓH1gI‚"úb¾»,¨t}iô œ€T&ç°ç â7ÿz>Aá@ùÍàp¨sèò±ùïOO"@ÈÏCíŠ.ÚöÏÇÍ)kš^? $ù~¼àp¶Ô]öi÷[[X=äÓî7Q-ºO\‘=T.¥€ŸÓV¤òï†*¸c~Üz}! 9ÜY¢}?®§[½|o¾\߸¤%¤X)kå½`b´óõò“ ûÎ}Ü:3=¾ôPuÌå=1r˜b”Y6‚;'0E1Ç!ù|pßtÇc²¢6Ä%7`­2ˆè™ c| >ÕÇC«gV<ÃÛÜÃZq{ô<×¾¯^A=2xJsžg¾Kø/,uH+Kõ—`D™g‡¸è“%8ìÁüqÜÄ~2oQ K9nÄÔrD Äüp‡Œ¸0å@aþãÆ‡hßö5ˆÐL!C›mE¯*Ê‚è>ÑsT`8Kþ€EªIÜ]¸u¡Ñ™CoÇ1P |JX\ z»ØávÃþÁuš ªŒ¤"#\:Ctf°[³t.× ©·{ª DÏÁ¼Ž‡TCä{£=ͨç: ‹O45—Õ²MáAѺÁ[±rB\ «…Ý Aÿ«ZUˆdw§Šð°&@X3Ö~ ⵬ §¢ÜqïêàÄE ¡ÐP`,îêÉe±…ŒƒÎÕåãÞU-¦Xò[ K†zÛùÒÞÁ»Gç…¦]Ðì+e•íÞã÷zóB&…ÁpíDáûrG»¼: ܳƒb1éˇÅÏ <£o±(¬ƒH°x©Uå¤MØêýÙu¥j)ÁêˆÝ?Û-Î¥÷Àõvé§b—¤•³fÞðˆ»!déëzùEÉuLõkX¥­šÅÁ/ Z`ÆäHÈÚÅpˆÚÉ·Ëï·àT#/ûâHSaÆ/¨i¯ÊFnxÑH_‘,•A{«AT_ Wµ*“–ßvûVxT…É‹žCÌ»R¥òš¡Ä!jÛÖˆu' #â‘–B£PÉÏ P JÅÙ0Ç𨫈( ‡¡ °*èªF ŸH§¬N–›ˆï`jÎ[šAê‘LëÝö<~E¦0mÌ¥03}pŽqN0Pw’éú ,™˜*`ù‰¡Šß„€*KhâÀùŒ ¬ñcçë§Ð©Cç›wè[Æn#é ûöÉ©™¿X¦áÉŸûqk“œ )X¢iâs£1l`‹ZÕ‡¨™×0X[±9à$TÉZ}:>z'þš ¾Úf{ilö¶³%=7ö_À¿à“¥Ç>äÐÃR<©™ «Z­¿Ï‘BNù‹QTZúVŠÅðè(3–¥”­8ùNkÒšRì6Ihåü|ð5½íÖŸËH…Så <>¯\ÇöS¸>dɰtw£/M7ûÌ”¶k?"Cîýsyá%`Ü ŒW†nÓÊxë§.K'wªg6Ëàá÷¥óm© Ri¢‘AJØï–‡‰„bEúÆs‹^™kYuޏéXÉ©äð,¾ ÇÏ{ °=”h™=È1¤Õ Xp×2¦‰ß¨Ì"»ãLÕmwØ­r¯Îu}²g"ʫ٠M¼Míû0wË7Wñ^˲ÀÙÙ#ïûW»Ü9Ö o·&é¡¶PÍÁÏ9'|yçCZݤӒµhûOõSµLÛT½îåvË-Ä8æ+ðƒ}!'&v覢îEù*ì+ZíPùãÝb³=)+f%éÍmFÈpd;JŽ4õå§:ÅôÞæ¤¦ë{9êf7žÜM¢lçu!/Þ€’ǬnåËRI;%C¢©ä¹y6C=5„“¿i†c–{‹aÙ ‰¹õ°uzQËÄC£)ªFÊ%9° ô(Œ~ãqt¸aöû£|ÕÊ.?ž»½NÎÅÇe3CU7Gx™†Ã”±Fo¿é¶:úIöƒž i4§óq±dø¡Ëaƒ¼l8f϶s(Ò³\Ù6¥®GR=zyËtÓíðmÕ·§wâ‰l‰Ü/¤›N^d9¸ºkÚF~•9d ž–† 9ËÓ/ˆ! )/rõVwH®ÜDËzÑÃVï:ÁˆÚ'¾ýºyÚ­_P“æÌN¾‚ø¨w'õ¹]%%Ò\šìÁˆ…ÈÝäÚ*Þ‡ ç¥Ý[ç-"6˜"Ø>Z) Ü^(ê*îk_'“´-•8ß;Å,)qÅ~?¨SB†û™Òp- Ïí|®¡¬+É´Tjy¸Ø†úPMÁ©Qof7ó«·÷—·³¿®nïç÷èæ„‚m`] u{5¿¹þxi·Wÿøt5¿»Ÿß̸‡KÐA[[!ž1nVÞ“mhº°·-Âxû—ÕWëcQ¾,é…ßwþ ¨KŽ›` h{%¨åìÏD{×»uæ±¥íàì²YX`x}M÷÷WÀ3üÝÞ×çSè>°Kœï| Eoü.ô¸(0 ýŽEÃ1`Ôåã¥Äw²ùâÙ`ñÔÂ;(Ò§Ç®¹¸ž/ˆN1¶Š⣋cº{{ƒiƒfö†ÒØøKlºáœPƒœí­Háè͉öµìè•›8j\_}km‰XX´“¥¢ÞYÇp@‡ûýêçbyò‘8Ы/DkHpØT²ÓûýîÑŽÂnÐnd7ÐHοÚŃ >„±»6‡9?A®w­eNù mîa *Î3|Öz‘Æ¥^ÅßÿµºÀ×|LñÜé’vgSD2ÓlžÐ¶wõýÜ"6ÛõÝÞþ*ê™Äõu¿|™vôs¶cÑ7ðñ½½ƒŒ„bÙ-w=Æî @ðÆsq8X ¢²vBX±XwŠpH âoo”Ðbê®ï|»>@øªZšoÞã ›eö­“W$´~ƒ JŽ—7þݯw86µÚ•ø|ží;k¶;œi¿†++ªbÄKGÊöÛÅoÙSÛ$°™lÑ4cZ͇Ööy³~Üì>XŠ­Œ0HÔƒ© pÑvgž2jô;Z<ˇFXš\®‹™>Ã’ÕU%&JGΩ҇šõ?Ü ý2ËœhváùNȯ;1ñô,—•ð$pˆý¨h]U› ë„v{@6»óÚ• ‰Uô€lZq¬0Hfת î0pRT:ú‰¯Ò=Ñ!| ‹ ™{v5«„Xµm2þkß‹u N…déê°«³hs˜çƒŽT;Öž¬PØr¨[I\±8, +«_rúHšA:ç0ÌÐÈ›VÔOu[€ó½øF “óׇ¯Kê|Æ$(Ø$<ˆ6”œ‰¤HTqÔî¨ÕïÑš8ÂW¶ ’¬‰¥m·'L²"E¯ÚÕ‚z ñzÀ‚ÚŒ0Éz8P¥JÖ£fÇ‚èå¨Õù¼ ‰|37<çbWHu=6&ÉÑí¶Ä]ÇX&Y5g†PRþ GRM=>¦)5ç]õÒ;äžÜYÖ-³Ý?5—V‚pØ Ád±ZQÓ@YÙôàbiûZA߆LOÄ·¾Tð p¬ i$9  ää?÷ãÉÛ§½O4¸åh¸_t'qÊ µHhä¡“YpÚ €ô õÜÁt5ådæ“£¼#‚ˆúÔïkH—Äëø¨³žo¿zMÝŸöa 5¶¸ÚöÔ£çVÓ‡ÀæÛ¯ «Ž,…È  lëØt»ŸxK¯¨ÞnøÌÊeÝþ˜±Ž¼6µA0½=m)‹Èíz±òvÃE2S€²ùÕÍæJáyuJ¨0 ¸[ùÜjà ´i z~5p!—´‹óŒ÷Õ*:» ±JnÙa½Jç pÃó„ãþ—º“—Xï•ëä8%g<(ƒ?¤ë"éØ~8Ž?‚WPØä`ˆ5Ë¡Âû.n5 ?s››mæ<µr¦NËü˽Vʵûn7D(soå{rz¯ “€°b:cJ¹JÙoFY»úª“¯# ®8ú3¿™¶ 9,ŒXu€¾W,ºÏÌ“^` ¹l 6›s/I|›ªªyŽÑx–úÊóp»íÇS›ˆ”‘Ȫn 02zÃVæh‘45½P8›o¿¸ ÑϘW¼´M¶Æô`…I›ÑW›úU:¾e‡v§tœêšÛ!$ÈzQ£øeÕ²Xž¼ŸïØ\Û´—L%–ÔµˆÖš=Be+dÁ'‡cÙlïCø ‡g–ð´¥k_‚xÚAøk=2)%HŽÀ‰ÕàâÉ’(âÎ*ص}~ýöï——·÷óÙ_9–ƒ« ÌÎäähfO–«ÿ¸x"«XP8Íט/Å+ÚœO.Øíçç/om÷Ç=Qþ¡®Bkdc2,ž@I bjßï­|„yŒö×"Å»À9ùÃyKˆ†G²çu šüp œMÞ6~8`h†ÑP´­¿Ðç_7à¼ÿîÇ Óh›ï‹íì÷ß+Köʬ'ý¤bEé±ip2{i÷´àÀ5#=t ÷ÊìpáUÅN¬v Ñ\"¬Ê°¯ˆnm1»©~ÄJ”8] {-©6ñ>PÓÙh e ˜í0Wa‚Z1h Qê1¼@ˆíuÓô™æëó _°Jµ¤¢½uí&І@˜´Ø]2zfèÆP05½[~¹\ï^dtÓ†D_¶ÃZ¸½ï؃¼7Àg½«’Ã+E‹Œ°÷W‘"„ê¹j[…pIöÞaZSÑÈ5¡*ؽGû÷ 'QZ¢BŒæ2Q„›…Ü.¿vަæÒU‡I\‚>ÎKGü³ÚrÁÈw'F—ˆõW„ù^­žõC»õ‹ò†v}øpؾÌ_v¡V ý7-EÑ1×–CÞQXWh" œûíòI&ï±—ˆXSˆL¿¼]¯Îxr¿×ãW+ᣴ°[™é ¬¬/-Å™O<",ûÝyç© (Âôœ¢Z#K[ÍwOÔš±›Õ¬Ç‹ÀÓ¶¶ÚŠõÉoj&×€þáö½‹ sN"WãiÃê øÓ› Úû”h¸=ʦVƒÓÖ{s‚®þM Ò7ƒMlË7` Z÷;Hyu{:Ñ×8V'—À³•½€p<áŠYùÈÙ.÷²T!˾% WV úo—¤;7nSv…Ü<Ÿ}øŽôºƒÞ,v«›•íM-ê‚+œ v ¿R7ëf½…Úšù¨', ® š‚Fse¬%\‘Ø1·üÝ® ŸS§êÙ;Û(('€Ñ°Á_•),‘öƒÃ˜8ÿS:˜H™Ã:Œ”ü¹5焌œø<œ_  &O•áä˘?8à ©‡øÏ¼Üø:¦OQWGlì%­s)EÑÊ2LÍŽ:L`‡v$?C`;b{¶$%²P¬94:»/(kÚa߬1å+îÎp‹}B‚¹/(6¥jEéb7>¹‡ú ­^’K ⦪h†Zµ Ä<Áõ-k§4e=È’ÓNi¢Ë’}XåÞ=<Ê¢¯%·×‘Ó¥,Ÿ¼«¨¥ð• j¶EX}¬f})ÂpÛú”¦ëå5ãô­oþü@ަ•©å×Ǭ»À&l߆ÀBÓ6’^;Œ½dEˆ’i¹Ð€@Ø oõ~ó´¡K½—ÌÃÀ¥ˆÇýƒ!={3.ÏÉŽÎ!e­=ƒrwS³¼„W7†àtaLçV³WIª-½Gì{p~nÓÜ„ m˜œ‹ 7_>-<¶§®l“çKSßÉ-dnhSU]:kPùxg]ŽbÑû’ÌùãÎ)è~1®Ä ÷.2‹å+í™ùUe'7â?Ž› ÑI¿F„ ¶Ò™¡N—Ž9ƪR÷ ×)»FÈY”m»ɱÞîà!§Eä–¼d÷xU”yÌ‘X×’cz@›ígU´šÕWP‡ZÅJÔ…¼;]kx¨"—Ô’F¦jÁGò ¾ÅùЪ“ÔÜ盓, T¢š†@»dBñõm™ÐZ¾Sœ\Ët ZJ+«¶(3£‰{£m¥°òDÖ\î¦,LœÎ‹FÃbòf°Âyš ¬(ÔzÅ öž1>¹Src°³ œnÚ‚MÑ—¯a$±h:)¯ÅŸž¨qÝ«-›‚Q‰Mìök«×»¸äÅ‚J7Ý ·C¾‡Š »<æÁAƈpѵ)Ôýû«®]Ó¶Í«#ܺªRö(Ó5"3¾”Æ”¿ÙY>²T|Ò+½2÷œ$uw¥Ýýeøv¿Ýn|ý—¢kÔ-œvËi "Â{£šŠ’ö,¿T¨CŽU|³B6°d+øöTRö]Ÿ¼Ó+ìÔ‚1ñÒñ- ÙÔŠx8ÍY˜¦ª{“PIjËZ àt~³fÂñïM©dR‡¹>úÐ z)¦GÊCZ¸xi‹®ROÆkÕ|ØNq=„ñ“ïû²gIøþÞí ¹Ø»ôn³“{¥ÖUŒñ4Ï2*R©E­|S4E!µŠ—kG1…ˆWuŠÄ3`ŽiM]©§‡f¯ä¼®=¸ßIa0좬AZZèM‘éÝm$™g£¿]À;Û)B¶k¶·àÄç'óÜ(Á™²õźZ©$»†¸Â%^qÊ :•Þ±²Yeú1jù%,sÀ«Š“AÅp¡]ú^q"¢‡ä§ÚA!ûá½ò´Z;ŒöŒþ¼ ºÙqñ¶3ËH¶ß¢i(ÇU»p¾θ>žBºñ’é}ÙÈãÐ2 NwôÝAñ11Uc2—0°(”>Qôìïdg§öÄÓ‚•)¹¬¿…éb|JKýiPA)> ˆñƒ‚Ø·¼<,/Š>E.„*}3³S!WJÓöÐ;2ã,g­ÑÓbž_ÛZoÒ!âK2y祳+-%ÛÅ:EÙyzu¼Žûqµà¡`.‰ȳ‹›HÞw¦Èc%žVò_¹4 Ú‚#÷(xO%ö›Ê˜ª‘cÄôßp_ÕNä¿Rüœh&òß•òµu»JB%‰VWõªÓ)ÜXvßá}ÝH­"'.ßn#ùd¼®ÄAM>_ýõ3Îw§жÏvø<®(0SoÆH]@èá<‹ôd@oPä¦Ã0*}T)ÅT7úøÝäoC_ÁÌLAÀÜœÎOÿ«Ÿ›*Y/ÏëÓÞòJvó 6»*kI®"¤«}»?pÐ Ô£—ÑpyU””Ѩ¿|e9BA !ÏŒÌÀÕ4Òf ­!½hb{ÙÔ)©’]››-«%²ö¡=ºŒ*1¤•w«//ÛL#/”ÎFà¢~m\’&‹FÞúPHüRõƒd̨beìÓ+©/ ´¿G}j–Ù%ב¯Á®×FSÃ0â,È÷º«å.gŸ–<…ÄÁqmŠbž”J²yYÙ(¢§$î Ò¼çÇ-äîô­žÂ)ÍEh ú3yb€˜ò<0•4Ü!à•ö ˜ÕwVYwòK<WÔå{¦ê ¶Lq†ò]]5 ¤ä*滽ƒr«§Sü<© Ëw¼þ2Ú–<±0¿z"„“nRrÊwË>¬ûÕ‚ÂW…–>Pl‰®N¶L{þriÐÕcL¿F==]§¢K{´ñ,qÒ¼PYÈS7 *ÂŒst¿š|¨§Äbªo5E2gy3ëŒÓ¹ïýýâKY*J x4Ï®ÕóÜ­‚g«dÞÀâÆRGm€Ó¤]™,Ì}4‰ºMÿPé¼íŽY¯Ö ?¥¾=íQ«*š”4`ÐKw´K;éøo(«Kn™eW4 R5”…ªJéÅqB‚45´Tÿ»c·\!Ý×['Ž´˜NŸFÂH5¤¢È‚¼î Һ蹛8³î=¤ËTÐ<®.8½ŽÇôëõ¡!| ç]‹S5"½1ß_]vßHâ+!¾à{¯”dX6Üå/;FI›`ð ¥*Xz[Eqß®ZˆD^üV€œívhj©Íy¦µùÖ2-Šº*`+á ôVf— GQƒC˜háeä­Ä(Úò:ß²‘!˜Šr¨ÛõÔ¬Ÿí?OvI°zJ=œÈÄ3-kÕhº<X<ª|óÇÃ!”0Õ ª¢Çð£ÌÝiÇSë}8P¾}:`àúˆ+!%p€…×´O r=XÄZ3‰KW¸*:½Â —Õhœ·Š„cvå秈/ýÒ”„Y:ÔAYýJ” ùËß7Û­Y’Õ©bFá?7_-«9_À%OÊ îýþG 3êãæJ×€N­I²}U°Ž|S5ž³Ë!º›¶-ÒöлÒSTÕÇ*Îå­P§9$PM|‹­žô„ qÇ¥Šç ˜©”&j"ÃŽ1R™N°#Òà \¶v…á’+š­31t™f3ìX¾J²®ë\YÁ³ÿ9°âÇtIE–_Màc7Ef&r¾Acj×V(Š=4[BB8 n™ö›ÊSÊ='“µ§)zI4#äÍqíí#*—øy·é+‡ýž_ÐÜîËf#*2+Àt`ð´Ük6y‘–R<$gÈÓ‹ F¢ŒÖ:Jבo~iv¯31Ž-©Ò¡¯( yÞ}x°=‚p~Á?eP*ÕIYµé˜ú›˜,âðâ÷ eè[å‡NH~9ÉJ9—MAuRå#'Ï®8vÓIu.¡X÷ì EºÝŸb ¡ªÐcy‡j Ême‘Òï8ˆŒ‡Ï^¥½$]ÒG[iå„<nÑH­y§¿é oð,¼YûçW-·ràp&e÷‹{CP÷‡ÍnC £ì^:矿3h”º>‡¬Ý!Òe$3 ¼1<|{Ò/1‘&ygáØà²-¥–‚´Ã„’f(žDiV ”Œî3ËYéÌ“€r~: Å*il|¹¿·!CršIKácµ%1 ø aËŽ/å¤D.èûÚ䆛.Ð+]4wpFGïûAò«Žc,ع¢Ûþ`+#¥®€}%.Ý …ÔéøÊ@ cmå£ï´ÖûýÖ±¸òNyÄ¡Â‘ØØª‹×cKx'ý<:è.$²QƒԠ#S”rÀ¦êò‚•XZÅ;ÉÄIô9îÚ³*‹Ž-H™Å¡tå-¡¬òÇÊÛ­œ«E›,8+ µ—Ü 9®ßƒp”ø4öjÏ ÆG ÑF­–v𼬤ÁS7§:ˆªÝJ2¹+ÝPðLÜò ¢C4<¦•¥‘NƧ]mK$”®5‡\ £mÕ±SX ,Kõõé¡C)‹“‘êV«@­›œ¡Ù¾òhUWåΫJÉ0dqYgãJ…e©~Z XI7Ç,.?¾²¨~Á;²“wj ɪ¼TQÈgx%rºÚfÛ]HƇ/LB=èà®wr+uteCØ|ÿpr¤WTU©PBK.!êÝ>Ìé}S‡PˆIS+wÀÛ—|\Õ. úuE!ইš¤.4F}h‚Á}ôÇq>$CS8f%e0LËçƒL«–çào:°¸TG#EÓÊp.ÃãÐä-—8ƒ4ùÇ‹){ØIôjÍUÌ(3RqLyx)Ó Šÿ’¤–ÚÅSG¶4Rz¢xÀ*cdêvoÉÑ›dçÏOŽÇñvfÞæp!l·/äÆýöûZOÜíA8…”!ÀY}_éaogÄ×6B°ìÌÃ&ì®ìsÀ̽ܫ]é¥,¸ƒÝ\öWÈó¸cÓš²U'ÅAõí¡÷dtÔÑÇƒŠØÄñ¼„e¹×š²(¢qbTà é¾â&±š¶A©@S&0¸ç©UäZ>º[*Ô"Ø2š^ú<»RN*¬Í”’ Ëeꪃ„˜òÓž¾xÍy—¹ºèÔJx¤Ôq¨˜=0uäê¤;¼–äDÀ¹½G¤EÊ_;YS)3=Ò³ƒ1VÒFÍrƒœªÑ!ÑLx³Êë|n©öªjAšµõ»ÅíÒFÔÕv¨Ý*—ººnUøØüßòðêäÑ™ÿ®‡—i%ñŸÿ^¿1Õ¬‡—i%·<ÿ]/Óöå¯Þ/û°êW¯7ááeZyøæÿ†‡—i%sï é>ÖI¿¶Ÿî4¤i¯&^˜œ—¼¸æ“ÿ«ZY鿝xjÁ }²^qÕêdDÀüUW-IåçYW-xzcL•ñȰÑCfÝu”=vÎ%"F^ÒÔ j‚/õºÎ7‰§SÓëïûBU­R%f3Å×ؼ‚™L_ŠòȪ§¼ÜЦ®úW0Ó‰èKéh3¼¯ŒQbá|Ú£J%*›g<ªLUJ ŸýB{µjÛÀsÍÊ9;4ÆÙ ¤žz¾yÜ-¶W?ífƒ¿¿ûzÒM%%aºY<®]m `2†øíÌyZøv…09ûÝâ0~݃÷áäZ:o\1_àªÂ5"rÉúuÅÛí{…sæú^…!hù„Zl‘­B%ru쉤˜‡˜Óò è+¨81HN¹Þ7âK¢”³¢ž`Yè6zó\ %ü8ÝòY¦ŠQ•(K+ŸÄïíøWõZ)dÜ©7*â§ø#¨Š6´ñ·²nâÕMkØc¯é}ä •ÒMAÛ'¹¼*H K;$N Â+Ù™ Ã(Çí¿aHvû®M='9IÒ?Ò(74ÐâÛ»µw>†¦TâƒE¤m…2 ”#g]4PJÍzQ¯Úƒb¦Œá"iY/RS»&e}L‚ö‡„ MDíöIÆ fZ-|®h‰QjHÀÄ$Ì.›>aQ]`¦Ôeí’~Ù‡ôÑD$õ‚j^½~@B»ì«ê &‹§ôÊ“{¢xJ£©ÛþÓ-0A–ú’jY™¸Žž’£Y ’Ðï’+ÒÒÄ&O²j Š(–ý0U´ 3ôªï4‹–©c©Uí#M¬D¦_ßžÒ*Ó&MªâiDäRHF/,›‡F%´rÍRe•ÀŽr·IÿƒùÍiùU»Ë+±ëÇ(\E‹^…1Û7pIV¿‘¿Ñ¢A½©{KåJÝKWêH Tuê<¾Øsð$2óÚ—«ÅwbpØêm(D,ÖÑå9B¾i‰©j©3 åR Èͦq È‚§¾¢R„Ì©36×­ŠW‡ôbËÝÛýjŠ›*íÞmXãO¹Ic#i« ³cHYëâï ý2 ½BO´Zi',b;åztjwZ¥NÕ9SAÛ¥a+A:¬VIlnS5ÕIM••ÜÁ¢˜k#w™w4­ü1dzº¥êÉNï}Æ‹óirCbêgRVzw—h¶v”ƒ^z¿î¸ÞžŸÎ[WÏX¾’ë¶ÝyEë"ÔÓ>•Êê‹ß„”ËWi´´Ni¬/äÁÒŸ¼‚%ϤNyîgñV[ßu’øfÑ!KV¥Üú3QZîÁ®Ž“Î:eëM±ÿ8ïi¶¥>wGYêÅAC—#úŸ[ù@ú6* ÃpVð4)Š<ÔÕ·õ)¸J£‘ èª0ñ$›î—8¦£¼B¬øJƒr+JqrA1š ŽÑ*I6•¹#Ó.Òî²¶ˆÕÉZNAo)Á]I¥é«©Íu»Þ$“L=ù‘Ñ^(Pc^EÊq;ó KzÑ똜¦ž‚C‘İ#•¥V]¤vc™2j;Ø«G]µ•ч)$P)©!§ƒ·—y£g€uÔ-Yé{NjâìÇu43ÜI6ðF_5wöÜoÕ“!…©Ü}^#<•°FÁ< ƒe¡òL L0Gj¬UÓF: Ev8d‚;J™âßá&½/”ÆÐAo×#yòa޹0Žé3K%Ï„RGèÐCœÉ…Ä/ÆoüšoXÛ«ËðëÝåúÉÎÂp¬T¨kA(÷“ü§¥ò)š„¼íËÊä¬}=Ñ‘‡N)ßò¸Ìè*pEöʯ£´®l抑‘!íÞÆ¦\lbD:K{¦”É2[©C­|$žT…½N&T×Jo¢÷â U*z‘q¹ùˆ2d §}¡`µóB‰O—i’Âõë§-5CÙä jIKý5“úŸ$K¡QøT!R-ů*BHÙᨒ€ÑíËv3~ l«rÇ»;¾Üí]¡Š RZ5Ò˜áiö$£•ÄêÝVãBM¥¾ @]f#™Æ¼PÇ N6°KIÉÛÇÃy,X)¡ñ~‡ ÉQ • ®|4•˜W.^[z{"gÇàì”NøW÷TUK³›]ïÁdœ¸œ>í¾Ø¹ÿ—MÊQŸ,/™ëí *Éêt!ËBùUSn0v`”¢y{ªÊÃJ1+:jÝÔª@À¨ü·ƒÔî"äÃfy´ôÃë•÷Ÿ6­Rš¨È¼TUuk_õFÚ7ò¡Úkù¡S $·MPey‚Žû§oÞ£®Ú é#dVg¨~ ˆ\ˆ,#ìgTîLì 3œ«\6\mŠäƒS+ø9ïc/Ì«=vÈDÆHéËû'š{þä:{œ£T¢E¥Ü<*³Õú^UwòH‘¼ë$gë\VœÔÂ|W»Åöå_k—*Ú{_[fU à #ã;{#u_hoœœí£^Ô–Ý‘ } ¤ÂOQr=¥­·(•¿-—‹ œ¹ÕL)Þߥi̧› NDj¨CòúÒIÂb2þHv ¹ÜŠƒf£ãXò‡w½ôlD& 9§Á(Ÿ L>J¡rºYì‡Å@w{ú‡(7 >vö–kÿ޲+õûz-’àÖNç2­þ( ôn½8RbuSöÑJПÇv²iÿR¼H¦ åŠg»fÝÁÀÄ}ô€Ëî©:Ú«Ç1ûA¤˜Î ¬{J¡˜ –ñ¿ ÑïÔ[d3OZ˜¼Ð%,óL@ë—¹Qa‹¾¡tËÖO{Èœ„½WRëº9\~ÄùâÈ~$³†l”ÿ½ÄÀ_jô6èGž\)"-™â¤fbCæÅ#ňÚ-Õ4„Ö^™Q7ØÂô5rëR¥Ìà\]2šÖÁ¢üyw{+š^zðïUjä#h™WÁ¢Dê¨>÷i'£—.ÞÇÂA¾·×æ6\mk{£ÙO}@ck9Sa1êÌb@Çg2þ·}¦•vfÓäºÊÍÝ6ÙÑ=)({“m¥©“y%·ŸÑ»È½íw¼‚z“NÊa÷ƒLM?id“Y<8³-Ü5/ë¢r‹øÄeÍÁSðó94÷)•Â#& k[²ðРźˆ-qÉ>Ù«sš²g+L @M %õ5 p`}460XØËˆóKÊL ån÷ËÍx€üC„­ÛßÀj­çYÙB^nœ&ý|úº?ç,•cV@g–Ç…†Ü™áÓî¿­w·Vêui¡˜0I^ å¤x+éðQw·üþøôá²q5ƒ ANT³ÂçÜ×ßé"Qö/!&JÖ[;½ÛQãîÊ»×Hzx¢:ñŽ­À‡ÂUèÄñw®ko„™äÄÞW®Ñödú} þ®¥ä­lªÍããú†uŽ«ädeŸ.oBHÐÊN|y’œ]Uqá‹´ àÏøXŠûëÙ…GV?¯¸ÎpRܼ®ë—«l^±ÇɧU¨C,°;•gP.6 ù¯DÁ ÛÉ)UÎÎ%ì›é@°Óé»`𜮌[¸µfª6 '+㺌#ù>¹ºvVd)y)e%AË !›²EE³ó§‹êáq³rÀ/9Ã~ŠÈÕÐ)‡B=Q+Ýms/›õ®ÅHJ#›± ×ÚVÑ@(p1}ÞOb¬Ž8hæbRÉV,+àÆ‹_c±!—‰¢- ±¡’ÚA–¥â¶úuí ÚÞTbáE}šÜ§á;XÁD¥CéºB ìÓrGÁ^^rH%Ÿ‡÷×,MJ¬\õZ­äd†cIYV©f…W ÅDiOíÖ—ïÿzÖS û¿+$ÊY~ì~m)˜ÈƳét\À\>®<2“Žë5àï=>›.«näwüU.+E&^Ideω)&‘“‰¬ò½²Y©r/¨ÒLÁ¶wÄïd©š&8qÆ]2™C:vºè\æ{ ‚ÜGÐ_$À¨*6lÛ¯ä@P7á¿‘=l¿ì÷v:­U‡QšäQÙÏS²?7õÊ„¥±6&‹y%pŒÍƒÐ3JdÉ®ZÞ©ðµ?2‘9ò¸ÆîÊìÍåc·ó¡î$+1ÁÂN¥”soÕ‚å¢Nì{Ë»"/2´U'¹À…¦Rïœ ¨ÙÉ0jáìcºJ·Ëe ªjË9ëe*a²Nô’ÞM9Ñ·’-Í9¿ÛåzýÂzÍê^náóÂ[Z‹Å` #ÅkÈ•(ë†RÖ’†1˜ï=Hî^䯛ò€ ˆ«’;$’«:Oâï «aÆîÒ»xuc…¼õ œ¿g»/Þ¥¹ä4>¼\//VêöÚr_IŒ˜Ñ’Fî›ãf$;CYbzÜÐsþí×Åõ(¦ ­è‘™âžÈÀuf ýÝz½º@ ßõlÅòºÎ¡­ŠÛÐx±[½;.¼×'¸S1óJ89ÎÅéZ7?Ïö>OÉ›´ò=ÁÑU”|ëzNÞ Í®Þí-wÂtÃqTЦR9@'¦1íÎ×¶dÒá~Ÿ/Ö4«¾á’ÊÜøç~ôÓ¶½ëàî­`!–– hÚ@õ²ìó Ýøé€é’¡Å¨;þ¦öq^íL>¾>8fŒ´G¹Gn f23ÃÒñ–¶€ùé¸  ÒJ€FO} »=d0öKPŠ•÷Ö#†6P`Z<›êyÅÅÓÝF«6l²`ô  sª¸ìÉ_ë#ä-]‚Aînõs¹=û¶óGŸ«oÎà%™mÞ„ŸßÝxŽ þÅÎ_†j#„7ÍZq\Öç››ûù»{?$ã¢_/ñçÀúŸÝïu^ÂïØ¡ jsnÀ.|ˉ×Ö“kSÜ ¬îÀê¦Ë"išÍ‚ :jõíÍ¿¨mƦpcɦбÊtœá”Ê Ûm+T¤€ø¾iàËÄqá K¡á§Ó;VlZó-nö£réîg7™{ÔV–U¶Ñ-¸a¡]·Š8!Tâ&]³ÛžÆlÝè#[[š_a²8¿&ù®Ø*(²/è!8¿>¸Li ͯ·îjâ¬Äº°u_µÒ¬8—•o}þ .© [<úø&Þmã%6N(4È©$›t”™=P¢f÷šÂ!#nàÀµ„¬Ù}RµÓjp^©¨'È%£fš`Óç{Ëçk6ù &Ÿk\M-íOl(£gø x±Z`K|¦gHclKÐÛQËÜé-˜ö?ã\«øÈÍ/]‡†«ˆùú=žÓœÚ˜ÍÅ—o‹ªÏ·Ò_ˆJ'/>NË «¢Vú QUÝJs\|.£E¿ó–«Ë˜Þ%¤)¡úA7Y]Mr¹!jÌÁl”ÇÄwef­š!>KØúŒ99ö¼+6f«6FÔ¦Ìö KõÓ S´&ƒQß ü ‹ È¿G|×ßϯßþýâòòöþù’(\¼Z«<ñJ?jLWÔxµÂ—æ(œÐð'6_ÒÐ0ƘZ­ÞÓXU%¾@ïuºÍ;Nþà tÏE£ðÑEä9Ù2fˆ‘M¨»äcneLn‡6ž‰d3ÛxÑÇDZhci¸À2æ¬FZâ˜ÎŒD›ê6fiÆ‘.X–vËç󿏯òØ ç9ïviìÊ bo¾Ú,jµÂHbåzª&ª–Á^€€ß®ià·Çõj½åØŽ"pVTÈS=„Òtè&/9 MŠ1pGîÕ&½è‡h¹îf Á²r¶•½ÐMŸƒâbht=°ÃBÏ!‰|¿Æ èü–’AËæw°°î7ש^Ǿz!@Š€õJ­µ•êÓ#€-i vŸõéf¿Ý,]ÖBˆeþãÝæ8žn¾>íÖ»åñåpZ¯®wÊok¨9[u<¯6àñDíd$ÚCz¾¢å„K¾üÃP½êŠ(4ñÞÒ8Þ4ñºFþf.ò¡RÇ!Ét°ÆÔ#Š8ÉbjÀ›=yª›.ÚDa¿ðf\ž÷çÑ–m[L¬ÊíÅgôRjó£‰^#®d òaå¥àÓâͦÏÀ*H2ÄUõDôrô[ \7;”eÏw¾×<Ïžëw›íšt½u)˜L ô–Ïèôôl!Õp—¹‡Ž±¿,ë>ÿw¶PÑšœÐïœö˜­ 9È›—@Æjpç›-zrÌ*„Ý.ìððBUï‹^7îÇ5Ðó“$¤òˆr²1êA»ûú°>.8:¹‰¨ó[,pw¶`ÈÈò_»rƒèë)9Û´EI÷AÿÂóN^„ÔãLÞwû›óK­Ü^ìãµ´@ ów‹ããÚÛì’G¤%…A¨/ÞKÓÄŸÜ÷ð_énï–cv3®—!ÑLQ³ ÷“„º%¿Y‘ðÕ}|© ãWzYÁÖ4Õ'×U˜ ú~ÿ¸§ YpHB/×”ÂNn×.U}[GWƒËuõÓÎ7x~qb¦Yóþznv‚ͱ„Ÿu ¡RXPÄêÃ*J·M¬]©¾ïÕÏÓÑÎ?Îi#”pØo@tápÙ»ùD‚={‹#¤ç–霣½ŸPø! #ˆ=ÛŒY¥!ÉŒ^@€Å‡{ôSqyÐL$ ¼sþå5ªLÑx€1y !ÀöÝ£ì!Pa½¤;üýâ…RëôCÄÄË@~gVÑ Á·`J³{¨ÓàÉõX•\q†a™÷f >Ã2\Kíô?Öb_°8W±kPÀ¹¼üÂV´¯5Ù±˜àÌú}oK ûðòi\ߟ7˜SO¨{ü šWû}‡hTàÿ@þ™>‰z·H2#"À_„,ç­fÒ¹ÃìÆnŸ+¯áC°iÍ+`”Fèâˆ6Âxe9²ï›-DWŒè@YÙ£gÏÞ~¸±›õáÁ‰ôPß)"²î8Džr2 ê{æî¶·íñe2þÕ†ü8ÙªŠžB÷ §êµ ˆÞ¿ßï¿·äï·ö0ÑC`f‰” »pÐpÂ?±Š7ãœ,„„:p/.›óÅiÿäÖzõLP.-}Móú€óµÏ)¨OàõþKP‹[9èIëÅ£=r}°´Πƽy¹¨™"®Ø‡Ï×™^]t@› [e[F{ J§âÊ¿?žÝñCe²»Ý8:²¡ -ò}0 6­HT³ýò´¥ÂtÑ FhªÛ´YRæL^ÁWW$0îcb5õ×e¯PD}gžªÊ¦/r¤úEöºhúì›»¦Rõѱ“¨üD—ht†Ý š=Açúè39Üo?H?(F;ä›—‰ ï<©nD¨Æ+H`Á¤ ×Å´]ô"â®Sµ±òKt¸>ŸÒCéGÈÀv·XôzE2–^èÛ_«³ªn¢Kz.ÜTYpV“•<ÒcA½‹hsR(ÅÅø²[²dáDE¹öà×Pdú½Æƒ”ñì§{5?ðƒ1™ž©Ìeç« "¬°lfÇÌò;m›]£ìUcFÝçFŽM›NÕï_‡Œ[8OCìB£i0JŽ Uwuw‹äT\”]bŒl¢Þ˜e³ð™@©Y ¹)1èc[M¶ì ôŽ];;ÿ0„4?¬¬G)+ÿµØžQñR1šTø‡Ã‡Ï±’"Zèùqqà-e/Ú"™òõÑ]ïSz»#ÑŸÂס‚ Ÿ¹½Jc+¿/ÍæD·¡.âsãäi8¤Eô ì´õ RÐ £áôih¯¤Š®±^æn‚éBUS·Ñ™rkCáÖ¹øÊR¤‘=Hé›ëŠq}‡ÄcY-_$Ý}Úm~_Ñ¡» U‡•kô•ˆ¼Ã3=ªÐcôÍY‹0ÑdÀÀfŸWEë®v®ÏH‚Î42V عGœ•D'Ka:ó*œ_²ªÉÕ›Ò!Ýk³ÑZû„ˆHð¤aÝÓnJÌ·‹iATÊù)§ð¨…ÀâÅl5R5<}³R¨>ØÞ{Î’;@…ôQS³ùÛùÌ|ãå‹ÚDü¥G~ÞlWûÂEÏ…pþmÄi`°ÕÌíR`»­üºØ’%2Xœ’S¤¼ÌŠ¢Œî0ï–}g"{ÅK :®þyQ­0_]4ŠI{xHg,3 ^‡¼çL¸}ûH-uŽ1|{¬œ³‡¬·Íñô‡ wÖ G×xÒ¯ë¸[ÙÉ‘§ŽÆWEìVã'žÒMõ‚›–Œ<Á3¨"›ƒ““P9pUÏiðíâÞÅ&R2”ÓÑ›—zh E7µ\$g¼.‘9W£s«"+Xäúhb€½éоÄE$Yd¬bhꢎ,“2Ù"—ÛS ëÄ® •Lä–`)+dp³x ìþÛbܬ־žf]hY éú„qUÜÍRvM1-óæaíªm–öÝ´+­‚ð—ö•Bdh.t»rºg v7q6Xåh‹:uêä¯õÉ)pm(ƒv¤2b6’ƒÂªœÀ£Oú/»Ê(NËéøËë%"EŽmN´®Ä*T Üèõn¶|:\.«sS(³€ƒ»‘¯¿]ïhß} |ÕÎW[Ü‘ôͱ¢ÓåaNŸBú†9 ùÇ/Û‡íÂ¥ÿ´L°|J;o÷–kߺ4[ÝíÿðN†œÓ°NÔpQzŸ½ý¦S¬ "Ô^™oàHRø Prû˜€é-6ôƒ£-¤–…ÂóÇÆ¾~ b-Ûûçþðöä­`ƒÜ“ôu˜=|XÐ)L±m& èÀznïŸÓXÇŸ‡Ånô<Þ Éy££¹@yÛ##ïMçm¿ôÍ×—ÑrT[? ™F´W;ãW=TòÇ^ñ;W@–@ŸŽ2—GW¨r*ˆ#ì¶ÿÝþ#$?G$D­àœ¯~nNÛEÖ‰]çJfBT¦ Ÿí>]»,nö$tâ'vEªÇŠlàÎë¢ìl¤é¤91x¹'ŸRióŽØÞ7Ö—zª*#…ç]¼~:ì‹ã‹p€§°T©DGdÞzšbKQ¡¯$(Ê&/£?ÖBÍ+Ì4òÐO—=Œ*^,hÓNw¸{ïÂ…öGRC]ï,&Ö¡o— =6PÍúLu½‡.j£Ó4wv烬àÈ,æþóq]m+ïü«0 h‰ï ‚ÑõÓl(1(¿[ðj$‹ƒ OALH¥".¸løƒÌ‹! D,ÔH}x@À®Ãí µ¶¡Ù}r²³@©™.ó2ó„Ù K†÷©dG" š´tìO<;@ N" ‘Õ%{»`~þ´[mIݬʢ.Ôü="°š®hw‘¼r>½LyÀÄÀàÂM9-p¶ãè’Ñ †`PvµÙ ¤Šò¶2µ°!ä¨WF:ð˜ä››“§6Êe™ý*á3Ò`IŽ)2°÷k³¿´K²…ð„‘KY›Êd:D¼JY4ý V'(r|ð[WòÉîŠÓ šCú¿Î˜ß¶¨¡.¤ôJhËy#a@žARÍ௙w½ä·βrƃ>…‘¶Ûöj×KÑrvønøÊŸ\6Jy;ÎÂg*Ý[Ù†œš{u@fc ôr¡Ç”ýp¦GTK§À›Õ/×K2j½4ƒÃ½¸‚d¤¿¨J¥Ô´Ì)Ü Nô@C@-¾#µi™=|ÚGr‡°¼¬IpXç¤iïüi·£qŠÎŸŽ€ H×6’ÚÜ./N'{Ó Yj›Š’‹,ˆ˜ô²Þ±M©•Ý‚-ó—ŽXKŸYï2 —8°¨æ–±½’<=> oð~*b·áÞ¿[<ºWR;ø(baàcºïõq¿sLŠ«³]w‚}¬Æ¹ñßLªÅžå—|@pM%Ò¨¦ªãД*p$(F06Ížf y”3·Ñ†¼ûÇq–@÷$9âЃ)8ø’E5VÔ½G]®Ï§×ú”Jïçm·kä¸ÿŒxô®‘æÎÛõƒ¥!_%½´tZŠÛ5úd¿v]W§B³QNË_;5H§ŽæmNL꺡‘sØ8¯»³e)·L=Á3¶{öî=‰Öå/Æ»{O~¬R±DJ´\BµDèõ÷d©¦„lPÈE€osq@Áäb”‚‰=¤M!½ø^ëkV4:>œ¶ Ó@Äüe¤ý åÔ]m¡¡Ráª1P̨jM_“ÈÏ›ŸÞP)ù[ ¢ç%$g|–{ ¥±›/ßá¢yírD\Ïð• ïÓá$„+!€‚?ŸRBˆÅåÙâø&!ifmk¹´pu{V‡x&Öþ@> y ÏÕðo­Œs® Ê9m[Šñ.ä)Ÿo7Kа¿Þ®Ö¨ŠW£HÚ¨ÌýØ:^¬þ¹X£(¹Wjg?{6ºU¤Ò—qÛ;dKœ†¨#N×®&Ï–ñNXi`±„EÄ"f•8å˜×ßé@œI®à…Ñê’q›¥¢ï×îßXµ¡”Ó‡4øñ#ZÝÎOP‹Žº ûÔU¹BmgÝÇXâæT4xQ°EÈ®€R/§P ®O­Lî —Ê\I-ðöš©¶­=TòÁ/XoM2{µ’=.v⤥Ï7#«O KÝ¥Ÿ‡ÆxW$Žê쌡ÀK«9IùÁõ)‹–‚‹Gû’·PÅNp:ܼG=™‘Žwv«3AiJå0èú¥©?àÐôäTEð/+cq;©oV¥wA·ágl¶$Ü«e*£©®ä³çJÙ…«PWÉÌ®€Aõu€WkÕ@ª"0+g¤Q'©Œåýiöñ®®¬‚Ù@¬86I²ZuòxKïÊ×hÌÌiªªÆÈ³‚@¡¸ó‚¸XÇ+„lg”q' '?¹0¼¥¤óeûÁ2ì+tæéµå`ÙhËÓ¬ßn÷¨»ìZiHÐ b…áÏU:ÉPÏ)<ìp@CÖ2ˆ|æ m~ìàM¢âl98)Ý74½èôÞŠŠ°Ó6»Çùùp b׋ô¬ÜŠò°Ûу³ÒýÛû‘4t÷_Ã1kê*”ý¼ÿcNçÏIĸÂ+F­ÁOÓbBÊûûå×oãéë9‡û£ãŽîLJP¶Ý’ä é¼É&g»Û‘ï—ûý· ¦[ÂMÀ ØÅŒ±3lB´ìÃvür~ÀI~aì?¯Uøõp>ýXÞïö[dF»2p˜ëÓýáhï¹û+„Ý[ÂdÑ4€¿“7»ï Œß|u9l¯ý(O_NûK7rçÙ¢§õÓòé@²?ð£³pg™g(ì#м ³úÏ#¥{³çÞÿv\·Rᢷ?Ü[¿1’ÓòðsvÔþ±’ ¼ôÿúÿùÿK+ ÿo|grr-3.1.0.2/grr/config/grr-response-test/test_data/profiles/v1.0/tcpip/index.gz000066400000000000000000000041051273104013200271470ustar00rootroot00000000000000‹¯GjSÿindexÕZM‹œÇ¾ûW,‹wuWuUåÖ]ÝtHÈA€0A8œXD>8ÿ÷<¯vw´Úˆ‹™H°³ûÎL½ÕÕUÏGÏüúÕÍí×/þ¼ößnÿpóëW77·?ÿî‡wßþñ¯/Ö·…¼¸ìåË'+þªA±³.·ÒêÔŠ÷¼zÕÌK×on^Ýz¹ýî;üÒ”Üåt—ž–MŽHisp¡˜{³æ&cÎqwoMû‡]Š´.½1ãç÷]ìýM¯ý­ ™ñˆ«§¿ñz’Ò©;ý—4“Åê*£ÊPcÁŽkáÄÏÕÛC 9´z¹,rõ$,ÚƒØ(¼‹X“»!Nó»,œ{/|±$ˆ«î™!N‰P}–U{•5=‹H¡‡ÆÖè§;í­>·Ó„v+ÙÐü-Yw8“kZ³ïœ§3U»Üò¦î†\½æb_1öc¡Ý,uÎä‡å‘=šê»åѳsNÛ–™î½²a(Ö(Ö}&üP7Œƒø'Òzï™ÀÕ¯# º º%hµ±×uš ÈÙä³Àœë*ÍÔë`êmRÁª"«Yu?íž”z¹ælcÑÞ6*%Æ íy`„mu`Õý°{Ô»Rd$hí¹"7 Y13‘îà=›—9‚ÚÖ] KýXÔpÁÕ8-dm»âÁL­•é;yÒU'‹‘*Xûjg¢Š!=ªÍR’[ ëâø_ƒÑ¡;ìÑ*ÎÖ)Ç*D;Ÿð¸xçÙ£ÔuPÏTE÷ä½82YNýîT/ÇK˜´,R_mñH ^Ëa„ ­Ž#ÔV.™UV¸b&bhúؽîÖs36ùÄýþdèô†g†IrÎÉèôûÜEñ¦Ò§c˜Û©ÆTì‚ËsNÀJJ3 þ’Qg¢‡{’™1¯”Åðneqí8 j1G¼;ŠÓæ£ZÔ *©Øà‘Ú æƒ&¡ÆšŽ¶/ò‘kêÕ˜èÂ)®+ö¦aì–¬ìYØ7ô:³'žÑB ÉŠqL‡"œa³†fËx„crNá.`ªó¡±¬6Xv Ȉ sÃÀ†±as°Û_,ç@2ih8¾†–»c×±†‡ô$¤¨ÑTàG·ú\`ÀB+2€Õ ±lè€ K£Ï~-ÞE(Õ¨®A­ÀõXz4,™šÈ½mCñÉ>õƒ­÷èõI„ÙÚ÷“+4#éjÁ͇ô{9‡%é'Lie,ÂP!/{¨Áà¡Û’B%Ö©·é¼J{Fýl½­Ulq[(Uct¡/kNÀ*U)»“_â Š6kEÛh èÒ}ˆÇ¤œprÜì#}X± ¶«F“­Ö­Ö -˜³$`n¿ÒÐh@3gd[Ãü¦ÉäbpERu`¯A¦µ­ªžñ¬C&rÕOa¬‚ 5t/m3J_úh\Î üÖù|«€+’c ¿ËíZHJÝ õzÀgP9W¿œmÔ= Ôp¬À-æp—1t€OÿN§_*õœµlmp¶Z‚‘¤7a ©Ž)Ö;Á‡æê^ýtHeJ—›.ëœ[ =Æv[%ö HJ{ýâ38ÑÑŠm^`:ö\:uzbÑ÷”d¤(êãÀGé9Wí4«ÆF ¼p¢¿cBÊñV­¹gï_œñaD`ú‘ñè°gªf×:‡Àñ•Îë\¸PŽõX±˜vÞY–<­O%nðìòtMi¨Øá™gJ‡þÝcx¢†qà¡CT| \‚\I°bP[}tî$v9zõµSÉ’Û TªÓ:Ei <Á–ëÀ˜ïÜ^óp@°hƒ5àL*ödò852úÍ„/W‹1ø]ûÚŒÁ@d¡sDвêkÊ^@¹%WÙÐæ¥ãsŽÒÁóöjãýƒët_>ÊuFwÍˆãø¼Í=¯›»jΪÑ¢ð"ÁKÖâÀü ±0äö¡%@‹äÙß§sÊ «‚-í9»xþsZ®„,Ø}µXaWB› PKêôqqK;>:öR*Ü6mz­PhØ‚ã+Ë6~‚ù*–ü|j”ð ¶bKFçlÍ 8a ANÛ­y¸I¸äê ò*ÐW?&ò‚ìšsëÃGÞµ“S?¾ ÁÄáØÜá*yj'ŽÖ&¿ë“äËd¥¦ÞÛè°Ico;Ÿ_a¿ýëêîÛ¿þ5(Þ1t§ÌÓ賟¶ÉîÛ·®ÛðVû¬ämO—ì¿D‡]l C5Çä°+½âîÀ¨â«»É·?\¾Mýìg§Ãqýûö­ñKÉÝz£P¿ëÞñX âmtJò°ôW½årþí›7›µ5 ¾_”ññÛ¤7›  5´4;- ]DÇS“ì°Œžql³žA׺݀*6“¨|äVØdòi³v¾ °Ó¸v'ô:ZÇ÷Ñ>Öâ¶Í†½Se;ìð|^g‡c¯,3ª×6ïau=½_®ÃëÞÃxÙ[,¦}‹vÈãŠè‰X&ûøÛìz9½ú¾·\{ó›ájt¿Þ yÛݧôfµˆÞâY\l³bÖñâCT“u‰-ö†¦Á Ñ’…æñxî £Š-8Ä©.ö›-Öl~Yì:IãéóŸð]ú<WЃaùí›­§Ñ®¨ç1ÙÄÙV´mSž¢ãúe“ínã4‹R±Ûãlõ4ºow«§Þ²;˜Þ¬n‡c˜»zÐf¼Ym¡e¦æê–Ø9 í7¶ƒìS9È‹€VØq,â«,;ªIûÖ¸0[Zƒy »qm&Ùæ”ƽ4ÍÖc˜.Õüñh±\ ï—óßy¦C§¹—ÊŽ³õ«·ÛŘõv:®Vî¸Ô§Û(ݳCüåZjñLÁB:ÆÅ1þ8.?s\ š=zÈ 4¡{„ÞOʸ€vþ¿´®Þö+Ð}ýÑá¢÷§4Eèmm.ÀëíZHKv–|Ä€?Ä(*š¢û».çY~}:¬å0Íڽߠ7wµÚÝ·3W±|±#[o¯ZnÍõZƒŒ@µ= –¨xóë).>]™2_ŽW¿> 翯æÃè&üaÙ»y\:užÁE²;à·*DÙe†ë~–^ìõÃÕx9º¿†=“ú„v0¥—À/kþòKíøçîþò¸x˜_÷úC§º&LUwŒŠc…,gn^Ñ¡<ÿÒïµöåæ6Ú¬m\ýòÍj£Æ_ZÒ›4{ŽÒ«âT¾<’¿Nñ·«ùÃâÆòŽ9™«füâTla31%¾5îhÌac5بWÑçt»øëÓ­Ävod`ïýÑ,JÍóxÓS¨åjÖ¯ÆÓûš{XM,¯±-øËø€⿬ÚÊ‘h±.’üXŽìÃÒ^®ýùh¶´»T—Ù=Z_% üëÕð ©X‹,7¢—ìùÛÓh0œ ïÕÆWÃ:o§WWvíÖ[,—£D-ÜäC}Üè!A«Åb9JféEûѰCë–Övש-@4˜cÛ°D± j÷-·›'9ú>ò›*†´Â.OÙŸ7Ñ~õ—«zÍÅ4êÖ3L]bºíð 0\íÓÐÎ1Bæ5]ÖÁéÕhÖêýjKL+¨hsG`ZÎXL(1ÎdZLW`Úµöy›9ÎíVç¼ÍçŽÝŒçŽÝ† ftx;Ÿ2w˜7kF»&'®4ÃJ˜7wvuÛ¼é :A%Ì›ÁNXÝoƒnu¼yt¤œ€ySi5$ógÓæM¨ÕX%Ì›ÓЊִ—æ/‘+O j’¼ãA,—æQÚ¸šÍ´<Ê¡ØêŽ–wÏ€¨fÆ…R4QƒÍÊù†3ÇíÇmöüüY?ßâfS°®G¿Ù]ÎY¤\0ø‚µÐ™=*Øø‘/6œñ£‚Í*Ø>ÿbëG 6ƒó/¶¤ ³IÒ~´~‰Ñ:„‰¦)H`ƒäøÍç<Ÿz²„·2¬F6Bç«ãxk5Ò;bë ÈDRA_µr¨§ô-õ£¬¡ë~dñ’lU(+›ŸU÷ÁÛ?K`¤Íãmi­ÔvÐ`m°‹øxÚe¡ñ|¢4ýDO¥Éß±ïÛp á3ëó¬8âq# â·díÕºõ}=Ïaå|.³ü—[+c0:Æ›o n{ã1ºRj<óm–¬ëë"Ž/€˜ó6ë4~‹SûÉÇA<|Ž­«ÊÊ´që µ‘BÔ²_Î{÷‹qo9ÄMÊðJÝNãæ}Z$ñá¨l¼A²Ýºæ YA§ËšÀ–Ç=8'œ 3ëú–¢Eìö ©:ÙÓÐKp;5óÚ9ÝnËØ(ìÄP-«¡ïÎ ›¡»Úïõo‡ƒÉôq¨Öäp¾XB¿­´ë¶äVó+3áB¬¨æ¾Ï³2¾Áð៓j܈EÙ²>Í^¼“èX$õ6ük'ÕñiØô¼€°‘¨„ãßÛ Š·Ažô6žJd@»tê§Z‚å;Îv»x3= CC–©q™ÝëÇ mDí1ýíæÎø°Ô0ië˜c[LË‹ížÙÞþ™FšۻÅ1[¿j}BÉ,ëTo‡õ@¢Ðíà]ÛÔÅ'0ݾw(g@oÈTã½À§ñ¾×¶–¯ö‰”ßæ8™Úý+®«^ïÛ?þѿң†‡õýì&³Á"^ŸŠäø9Fá 5?5+~e'•]«|ð΃†SdÿJnBôÞ<æ_OÏèú!Ä`þx}O•7ºvoÚE°@.#CënÛE÷ñ;†™z›M—eL%î‡O³ù´ß æÃû’ƒvË2j"g‘ÎÛ!AÕ¶N÷]ô¼O[£ñ¯®&Ú1EÀ[˜»h=‹ÒáäSìÉë†îhS¼mÊcZÕ/ÀÚE®±³èpH»Jt­iY$Úþ9ߦ¹ðJ6j–#£mz›÷¨ˆçÙé DsÍÑ—xhuœ†½(îÖ¾ÿ²ÛöœËºÕ<ì²ÚZÿD/äÕi»5ºÜ½‰)9=Au,Ïë8A39˜~a³v•f‘Þ$œJí¾‹Rt…ÍâB¹ ¥ «î°bz¹tÛN5ý>ÞIˆ³¹D)È®r“õ *_´[z«ëñ´·´ZK«\(3ÈŽ—‹µkµËž.YoW•üªˆ³e¡•x›Éß ˜£Ôó-³OfÈPdº>F^ lX½ñèvUÞ)nU3U|Ë1—Æôb9ÍTA»œÕ_°B£ßp}NøÙÖ×ßlú o?G:Fòß­Úz¹ ê|ƒ> ú´Fg×V‡êŽ 1`ØWýE5¾æ´»Ì{)hàðÅñÓ¬ b߆+CNéMœÁ´óÝñd:²ÄX¬ÃÐçØsx£º  ­åân1 z$nÛíüÉ:lîØ?ãpòûÚ%ê7°è~óþêÌÓsïð9N¯¨)Ž¥kôÔíè<_E¥‘ ÓΊgPv㢈7£ÃXS˜˜Á)J“ø]”°‚…KL‹Ýd¿QÄuš£9»Ç3hO(ÙÆ›Í6ÈþÆm-¨¤Í*à"‡?^ÆQ1ÈÞ²€­ÌÍæ1ÞÞ<ŒpLnÁ-ǹ-G=ßl’Ûý®Í`ý*‡ìW²ãúá²’ãYí°0ñ“¤Ü#—ô³4+ÜjÝ‘ºÏn³ìõjŸÔÀZŒS¡ÆÌãM"«qZ·x‰ÓT%€ùä³¢“Ãé­d¹áÇ#Mh;?Ëì´~ƒä ]]N,æ!ÇQ1Y,rPìWŸ›ìùO uM›¶•-k”@*aάлm®¯#´ì& ‡ê܇҆Ç:uØ­Ç`ø§÷ ƒëeÚ茜ûÓþYmó´&-»ÙúE“âxºX²Ù± k]Ù®v«n7½õ6 ÆÎŠ‘õ¶¦í$^ìÖÚ±EµtV¦Þv†Í/óqkYgËyÙ¯®ec¶;‚‡õKüów|ž”èÿ…7þf%( ‰³]œ„"0ÀúÓñtÞüò°XN†÷VCh9¶ñz[bnÏ"æTœ;»vuN¶ÖÙºTú¦Zï‹Ç!.å¦eý'ÉcR‚}gÅÛô)“Íc‘l*¤æÊnNvœ_óûìø¢Íý‡Õõ`u7œßîof½‘ÍL šVn§Ñ"Ùç)èõEöªÒÙÆ=+\»07Yƒí³ÉnYfƒäùþ®7ë;{}½mòþc´‰Çäø¹/³kÌÜxœôÀƱц3å>®D[A³¾¥lWí¸ZK®Óƒg» ç&‡Ç&£Ù)4øáa÷u ËxÐŒíˆnî¥ã¯ÎìZG ›è‚ÐÝ«Q2=R{-Ï$™.ûƒ‰•uG£Ì¥£ÕÙo¾t›ÚìΪÆÑÖbEh®T7°(ÖgžßïUœ×”Õü·úTwÄç¥j~°c`oÚŽÍ®—nWÀÚvs\›eV$oìõ¡ç!ôôœ&ëj¤Ýlsê˜,I¸á½+Ô›ß\ý–ò§‡ÖkMÞ\Y1—מÃÉZ¡üoN§UËM=ÿÍù´âñb=?<¡Ý¶W×$A å¿Ñ;G4T*Vpµ§3Ë}®Õt?w;°—™0lÛI‡Ùå“ð]\  ªHŒ¬w©z®Š:#Ê 9¢,²åäzP)«\¸‚Z™r†t¦‘Ëâcvü´Ã ù6žDy;GdØÛj—¬Ó½cúï¸È”§¢æc}u¥ð135-ç½þŠÖÙï;ûò{ù÷u´OÒOó}ò<*§ï +ëÖáúWjè‡Õ¯£þÝx:½{°iN'–ùWº\j_Ôp+Šu:ÜçÇOAʈíZè„V6‰>ÎAAصâï¸ÏÁ@…]6Ú©$\"V ˜¬¡Ìƒ¹³y0Rg 4ÜrT‚SªŒ× Ò°ò[iÜ"ѡֲ)"/N “#ˆ`Ñ X¤ñl4 •ðÔx±1ÃØP·†Gi|ä8ê­Yî gÇyq²/¢yT^ŠÝA°îÃíüæ^Xz67°ë Ù*Œ1Ç=”hƒ¤Ò>YóÌÎÉa|ûWý_ÿºi=×[Po}TÓ<Ù½ñ [W÷Ãɦýsñå‹Ó3ï±6wÛÚðhý‹ô²Ž5:ÒlgFb¦vÝ•.?žÞ°âOÏÁd:Ý—æ6õ"??0ì†ÖIãÛü¡Ósé [í ZI™k“žsØ ÆYöÚ+“ «R=“ty3¬p÷£ÁP©±ëÔÆ>òMòLŒÁ':™–†¶O*ú¥:võZ]—Nh«m×9 {Opž |f?mŒTLï»\9/K¢ Ê:÷×Ã#žÇ™º µM"»,ñ@âݲž³beXÙòtUEf;]W’©'ß^õ&C”’è8.f×:¶6²± ®P…)0…Ã"K]gj½naБ‹Os föp5õW|ÎѺ_Y'9¥÷É3h Ë 8ïY±ñÒ2y›²Ð°j·ÔSªuõﶃeÅ)UÊËHIÇ)c-¥“+3÷Ä5GfÙN)‹jFÃëì ©Ó'ß8Ѽ 2•-`u 6ôÙ"0¹È( G%üý.þ|Î"#ü: ºÚUezýÙè;åx·‚róÁL| þ^UÆæü`'Ü“k¿a¤<«Ö¶þ“4S=FBÂÄ1®ÅéBW7óV«5Ú|è$›ó~{Â8ÛaŒÃ¬y•C¨›Uckô6¿uœ¼@Ü*ú/Qr0D^jWÉqz}m6u>o‡¿ÞÓ´h¯²ã1Û« :ö±þŠÇË9eµ‡Y*§õ'¿Ã(^ÒcÐd1 ¤v»íZ@律™XÔkõš®±ÁšÑ‚z`hœßG´æG½ih¼Í Ó( ó& -øL²X£.)Í]_;lyeÚT[Û+~„D!¾é—E/OfYبÕm çÅqs»œEzn;MކÒðž!°nJ›F–&›Ág\ŽÛŒ0­¶À`b'¦qv:½¨Ú—¯Ç,GmßP;aÀkæìÿÃÃf‰¬Ã¨Ä¥dÆY¤“„4¹Öóø/¥´vy =ÅÙé8Ëø(p\YyT™ïj­ÒœKa.žrz÷‹â.Žû1zÛÀ§‘ÁÄ gõዯ\?Îà$¨‡f̵» 2iÌÇÃUÒ4xê‡OP}ö¾ÐYÛg@Ö™®g«ÚªÆ{–éÞu¶>•îð²—DQÀì(²5l¨þ|Á‘»y V½þö¤éÓp¾ZLæý¡®Îž‰S(å%2›.啺¡mq…4> }h"p›düÍœJ¼êÍç£ÇÞØ´Œi5sfp#8ëîΦ°ÿ¾z]sººšnn—÷`ìPÿkÍ*8M* ÓâãÂܼþ`>PãjaƒÑb6îý¾ê z3øÍ\ŽÁ©µçnGSk§Ù¼ºþ~5íÍ É%Α“éýh9Ó׃ËÀ‡óLè~Z´í›õæ eAAGSá«a:ÝßÀ4ö¿8%x2Œz>[ˆ±ad‡ŽèÈ]\â3~fAa&I¹ŽÓ4:€L+ƒ3Þc-°gPщI¦.ÁÈöù®ë6ñ~yÖ¼–ÛÏÅï‹åp²ê=õ~ŸL< ³Ä‹"–4Ât–OXÐÐ5Ëp \õ{÷ýáx<$Öaô‹"ÓÉ ÌþHè«]<ËÑd8}X§D8(µêÓ§{ÛqGJ%®á¾|6 Ìj›dñY‚m°Ì^cR±ìp‚Xo/³z‡÷%øv1rKPyj[’Û¹yVu£-¨¢(‡3 Ñ«¸éT ºéÓÔ¬évƒë·Km[Q 8ÿv¹@ó|6œã„®´,‚Fšõ8_£;ãNÞ®' ²„WÃc|ØÄ€(i›£õ2‰ÇEë+>švßGrR–Q?+T.VtŒ DÔ€§|5ù ,CàÆþK¼~õ—c—µAYu¿2L’u‘•Ùö¸ÒÚp¹Zü:YÁ q^˜šÚ—ÑúPš>tH®W’€“=&yÁÌ£édNÙè¡lq0{²_è‹¥ÎF›ŠD…T¢ŽŠ\Ñ|Š8Ùã ÑϱøLƒ….È2স(W÷ãÅÝÕ@d—÷DK¼[áet£¥ˆí+úœï$?v™ª’h¯ÓhWšõÂxt1âQwäf2ªiLAX¨ îO{’¸˜‚CE‘ìô2ã¨#‘¤ä2Ç+¶öÉ3K­hGÆ mÝ@wއ™e§'PçÙ>:¸5Ó>´ÅóºÀÝv7í‡ÃĄ́¼`–‚¦ø´è¥ÚÛvEön<Àô§ÄÔ^kó&9-Ì‘âó8¬K°ÕRŠÃ³ìÝ$°g ˜ƒºlÚ+¢±«Å~J¬7+â·´Ísï׆€mAï-6ïyVþ’=;f,{’g¥Ùm]—ÔšY¹|Žm«•Åã¯*ÐŒ®þ¨LÌ^WïpâίgÚ¼Aï㓜(í°% ®³‰ïò’ç‡b5w$Ö:ÎyHéìjñàÅd![û35J¦Þ`°œö‡óÞ i¬w…v)Ôj<¼éõA;Cf2Ÿ>‘•NüE°3@ÓùÚð`VŽ´›?Cö,’G÷}е‡xçŸÛ’¶SÃb¸]Oz¿I±—EŒî‚í$ƒÅ›N@XÍ—~#i^ê0-Þ¿W6דt–·ž%ùZüµ7[AQÒ7§dc.lä¸å¢XûÞ¤&[êX§q´í›QšžöÉ!:—ñ¦¡—Èð Ã¶Fãó`ì ]Ę“q,Ik¡Ù_¾$‡'Ð~TÔC3Pó¢õj~$Â/æ”E2ª~óînBÎsêè2Ë=æå£g£Ù¨Ÿ&¹R ÜO„"à© y½>F©@Ѐ+„_œºˆDµ* .R'åN¸­ºNÓôF+ŠÒ¤ioÜe‡;1µbuæI'^ÓþMÑš\¥&`@Wª“´bù˜í£9G×&4>Þôê®j²ƒ(Àb.‰åÚãÌq“ø7J²R†?Mâc\qÉv¾ÒDX‚>5‚ }D Ùš…P Ör" ¼2 úfé‰Z†ÇwcNŠÑ0Ò=h> È.Z(j€a2'¤ªpÏÀŸ¢äØ?ef Ñ£j/@Œq‚Ú¤¾ìõ¤zpg–$WX·­Ì{Åî´‡nà ÛíVh›–/âBçùí“#‘›gd.Ýêr\Ç~_Ø\90Q±ŠWá«göÐ*1Èf#4I`Ò :FÃA™íg{P®6‹ƒ¯ëØhÌð„qò 5[ ˆ¨9¤u ”â—äiºYf÷ñ»JáÔ ·>Aå¸ëÉ!Ívx.b?ŒÄ:¬²xÉÞ%„Ý£«5^ß’¢Ñ§‡U²ÏWƒÉ®• ÃO9ˆÚµ¿ÕbÅKÞw³Âì@ä © ? ™C†D~¿î7 $Jê[G‚² âC½<¹‰°²iÆ B¾JOap¡a_…¿¡É©ò„¡ïÑwH(ýáPHDSt¹ã ­ÄcÛÏã2;kk×¹H‹…HuípñͰ¯·@s#6J“ãÑ~ÙÛ_š²ˆ¹Üg–eéSr|ùõ”#¶M95çp‹ ý¦Ÿ#E2¼‚,¯ÍñQ™>V;1+Æ ?g¨ 8 ¥ĆdÍOÜ3ÓúÐ@ÜOu²C³šÔ˜^ƒ žœ@ð?ÊhKU´kÿUœ1 œ7%?T‰ãrjÙ`²[ö6£áOÇU"›Ñö:òuÐÏ 0U ™„†´QM–ÜÆ^ƒyÁýÁ ]ä4¯N@ë†W@›²b{[ÖeÆl‡ŠT2ç¥ú/,r{{=•(©Z3› ÉÓhx ÷¼”/|~×Õíǃ8?¾,Ä2”¨y””P'êI–F¶åûÍ\( Gà†IRB·w‡=mY0©ÞBPx¼ïD@¤Vzs©@Ú‹NÕxý0>Uo/c0ÆäB#±Wªªà!üª,+ø_—•+‹:V6ý’ü÷E¢Áa$ e#í‹ ¹/~hËS–™r€ãiãöæ WÈuVœµÀuTÃZr¼~0šoÐ[Ã’”žy¶gy£âã]!Ôªy»ôÖ´´Ì)A^ŸËì)ze87A69W÷~Á÷Š9͹òïˆUâU,ðPõyÁq£Õ<_Ã0ÀâÓ÷ü³ŠÒ’‹JAœÑ”w¡Àœg§cr ñë½ç{a% Êhÿ6§wªÅ:2Ê®NIºé•æ€dv*¯KÐõ@‘¦îµäeJè“:£ÌXW¢D³Ó­(±¸ü‰f(v¨U¹uð‹D©×G Áè¹Âò£ß Ø×ñ3‚Yêú ¤êø¯![>ÞðZÌÑs챯…ÕHÝ“dOí›Õ`XÌ9XÏŸ\iÍÇÁÒÁ°š[7qKpVÇj”WÒ0ue‡œ«?Ìèí‚ð]¹²i¼Ð}ñ ö55Û› [è+á(3;‚AIT÷ª;µÑöÁ§ØØÀEN|í1Y³ô´›¥‘ˆœŸz Æ»T­¼ÓÙUÙj¶<°]ßÍVÃ[@ÖØùªqg=MŒ ï -øÌ ¾ÎBèfÍGãð_¥,8›¡·¢¢F}v&†vu\Ÿ÷u´¾ªnÑ¢t—z3ÜüݵF‘nts‚©ˆ7J[   í!7½z® %fÄâl ËLÏ1EËüïq/_—æÚd/¥Ä‡qì˜o…^»®N;$K<ðÓÇñV;>½B6öKÇÙ{Cttó#^ŸÔëNÇ­®­h²÷½ {‡],•;|~ ˜Qg*)qÛÎ<ìv´¡{ß·ê5Œ/)YÝöÌ€0­º7Aã L .ªŠƒZ—>뢤òê¢ñ>Ê_²‚‹?+éLn³ÑýElÒ»âð\—’yvä:59*•`ûÒ€AÎNié]£ë±¥ ÎcJÊ&c¥§ÛiŸ£±£Ãºˆ­ Ñèxó†w«¸‡óíVP =Ò«æÌcUƒt!ÒÃo¶º_Ó>{‹/‹šß‘@ õ5%`!Éþ:²³l0  !iŸ­38Ù'Rn5Ú>Îe¶–7MzVH­º×ú%¨qçR²éÍÓî˜\QQ¡×ô°«{¤„§±Ùñh¬uÓXN:ÕÙ¨ëËÕ†‚®X<ãMÓu &Ù|Ä*BVŸÃÜwõ^pßw3aeÔb“–¯D…X‚=šÇyú)°á÷±ìç•&ûdÛâc\¨ôåËé@y‡­¶ØÊ&{ô¶ƒ¢òêhãt­ôô…kûR$üHz‹ŽJj¡ÐZÒöžì¡UؤÑÁ´RY¤‡Í*ìt+ÚØîßÉ]H°ÛÁ4K³¤%aZAÒ¢µi_Ëëðwsu,îTÄæ1}Œ6¹†WãwR{ L]bwyhºA5ÚœîYµåå–6=ìwRŒì~S´›Ê*í§x!<ʲˆEÏ¿“ÖC˜/swôE†ûiÆ~“®˜ùés†sw [›I_ <}Vú^zòµ÷ÐBg2ès\SFh‡Í²‘\tß5¼šœOÒÇÄòŸ>kŸ|?ÊñݳÖ!øêK¡€£ðÓŸ¹**îzßûRÓý±iÕ8gAȉœ>ëf¹ŸkÊÐÎô­ ¸ú´öNC.- FwÐñFW-i¬ÉŽFCz8ŒÍ]Â-Ë öЇŜIf«@;Ö[­û¬èR£é µQtª§¥)'ôÝL|¦4yõ‰ÙÐÌ%1u‘IžvКÒO6}ޠ͢Ýd÷4å¬oçÕ0¡ÂÏ2³Û-^NG™uÒjJÉ w#¤)±Û'>;ËT¦™©LëÞÖ/+Õ%Ï`8!Ç@Ædf%9>MþÐl¡|+™cÆ7¤dŸ•fÕ~_WÅ’±‹YéŒæh¯{fýV%Ÿ@m§v© (û]¨ZLج¬+‘]Ö’–x![R¾¨ ¾±óXÔ˱+Ñz* ¼µÅU ƒv½ý5nľ€Vð5ÒlvT !M«ŠªÝ²9ï}ä){o7½.µÑ-ãfd @‘¼|¤ìGÇ¿ty©ˆÓ’V³ùCè3x£ý%~?Ó_¾Dª¡t97ø^Ë½Ãæ²AÊ UÏ/Ù³uýr‹!ÀÃhމÒhÊ~ñtÉíZáéø¡Z…h0ýz‚Áb «\,¢ÜVŽvÞ[óApVõEîö”›Ë‡`ž¯µ¥­¢ Ž¥-×ÃL¸Zà  uW»fNK Rc>4žæ€ÿcH­‚ÔDôѨ}ú‰PAõ·Pô$lVBtú5ÄÒ˜SØEzú’™†Š Ö§Y‡Ë¤‰Ô߯&…4Á³o¡ã%*–™I”ƿẰµ Êp×$mÈ= ä`ot™‰"Òò÷‹œk¸ˆ¡“Ú}—7Et°F”‰|ø¬ÞŒSå9 7¤iŒ8Œ‰A®8ºÝ *1Ðèú“ Þ”(b׳Õì6›• ªq¯µÏ°ùç"¡‘©†\QOÐ9û¦bøÞ:ef¬U|Nôù@Ã,6Ãn%â<2ß:+rùz®jaÃÇŸJh]Æ{OÓä7Rû¨°/¨{ú}’‰* ¦*Êt@m];ZÒçøUÞɺº¿(—UËc”ž8WªyU§w½v7dJŽÅ9BA†“2<œöqÃ\Ñ-i7_Û.ÉLXÄÿuŠRfÎVÃ_¦Š^Åå¡ßLôzk«TÌÙZÎ÷!ê]Wc$¢_Ø_ "7·/PÀ[QHýh´ÏQÎ 7|Ù…ôŠn6e+U^޾I8[Aó‰ 1;}‡"aó uoÞás°È¯8½¹£ÃnZšºqÅ_—ÊÌã@•ÊÉXf|¨°Õ’)‰Tàþ¨¯/£¾û’ ·y¨M¿ßˆ².xË«/ X%øÚaEZ½ÞšØIl6/áª$@Pû´]+gœæù­4¯ÕŠnë/Q­ùƒAt6½š¯–™£4}Ä 3ƤÎw‚¯qb.B3LJÝñý¯*;™¢Ñ +ÎHù¢J¸6F‡3ù~öY¾<¬Ínû ¸òÝ›;`-ƒÄ'¬IÐù;“ C_}ckžm2çP)lvüÏß?¬Ô¬t’©ƒ³Ýn–ªÇ-ð‘*ZqaŒýe¦°0boÊq¤Q£V !CýᚃE@â¯Õö§ lWóW4Ñ:½¬`´Îë»)²S~¹„ß(1}‡I¿\ÂSŒ(|Ù(Ÿy§çÞéø¢lHgÅøòE§zãÿ^'qºáMÔ1žïKäæ™Dö ˜OæKyÖöIYcí"’ùœWBó»P±<Ñõ¯Á¯G­¶/垢ôõºˆö±=: ­ßR­©PÜšr“]¡Ò-?SJ_EGéMB©@,å‘Þl™à&cF‹¸*bÜ”ÊÖ‚²—ø*‹ÇâO*RæxE{«áaí°Ö/èp Lºï§#ñ²¹Aè}~G•½û,”"þeoˆ†yVpR²Ìä_8ž$Ó8òÀ6¥½ˆÕéÊ!iÊáÆ—C’46wÁÈ«A&6Ú€ ”FÅžðmÙ[-oa±ãÅ´:gw´Þ¬zû¼FNQë•^²† e.lÒÚéx“IøÊÑèÈvè|©ª1iÔ½UMT'•Td…m|) Îqv=~8¤çJH„§ 9OèmÎ'¼Ók“ñX± \%³‰*[R“yÚ ’h‡­Øæ9Y‹´AxY×Î@6&ˆ` 'Ò2Ý€¾äæÖ´d êI]³p*í•KƒJ(vrœívVˆJÏÍ^Q "è-ª!húôûø]Y iÈn3€á)ZD«K¤ÊYªJÅY^‰ eë§T•ß÷ïwb£Šä¥@ºÐÿý®}¤úÔm+‚Íbs„É?@ÓçZÈi3R&¬ÈånWÕæ4¥Sù9ç …u¢Kž’Έ¿kI휳‘I†puM.N Ùš2=§«Ž¯TÍm3ðØ‘. u‚3²ãÐlžFÆŸºAx ¡Ä-o‹2j¢‹ÏýsãŽ×Ñ‹Fwêç­2¡¯RÙ>uד³yñYX 3x”×Dd䳬µËÀ‡z:N6Ó¯íq›¿s:£,5¥s¨SŸÍ¿Ø’ƒn£¢f—í*:4†EF¾«vVŽ˜’F§âC—'°ê»:2y6=Miª°·~ÚµŠ1yÌÒ“Î;òVÓ“X˜ÒïÊ+oétWu®àˆžˆ]°»Ícœðìœmêg5ºébÐoØñB½•+^”ø¼y.?¹±âÐ[Nf˜áÚy•ç÷l¬þìzcBéØ[Þq)I¸ÕòVÅïh¿òÑ#2KÅú]­ú+Ø·×x´mõ¢¢†|vVH£h™`îsv]ºú«dÞiH3‹9¥Ä~Y¾çxÊvÅ6¶cvÂW¨¨¨ÐèÞJ¯¨´cÞ×%lkL”Çà‘˜2Q²ËœGT Dɶ÷M· “´»’¯•9ÁŒÑ­x}mí çí6–®³ÃÛjMÅxèßKŒ\¯WO« LåÞ\Ý 0n¾;œt(YÝÉT‰ñ*by @N56À—*—ßѺ¸ÚVÑÚGåë·o÷ñî:Í¢ã7up½kÕþy‹`4üáCü¾NéÞŸVÇzæ‘pdó¦m‡ '[†8°Ù¥½ò°f/P]HH¿ÕÌ?ºyŽwKQÑ´ÔnM–m¨+J‰Zdž¦n<ª¬9ŽðŸgª™e¹¦nåwJj(©qÍý‡P²gMÚ𨭰ªŽŽè!¦Ê‹Ñ %U¶²!Ê>{=daQQ¼Zo%1ÍZpÿ‡tÒ ¡ü¡÷ŠÉ7MŒ´w$yNR¨ e°¾&ÏS¤Uk•€"®ù¥Ó¶Ýn] xC[è.ÁVÃ^±1wHétY2ižeæA.GŠ¢»!¶l:œ˜ ™K¢I¶¹J¨Gú#cÊÚ»L[uvëñTâŽd÷b(J %Â+g‡4ݦ½ƒ)w×.‰¿÷øzÚçzg[k@Xfèeön²%þ±ôÇ;ºÀ–¿3r¨¥S×¶øÏùÍÕ2{ŠñªÆ 4—ÚcO‚N\«$d£?Ç"ëÛµ)+Li\Õé>ø —cVµ´†¹2E6ÓZT§MOŽöy¢î{ä JXg…:ÊíBuY*¾»¦Þøæ„§ÐÞŸ÷[uŒ™Ï̓œd9¢¨ø,_HݱÇѽðÙ^Ÿ„³¬|m9žâÀ»t«ÝzÓ"ƒáhÏMÁ7R_¹”SïàiâTÈî[EJʼ·ÝâÖÿÉt§ÚÑ>ÇoqÊŸt3Ž>•n¤ 5Køuºàf8??,†óF@_ ÊÓaSÁUQûN© ós®j =èòv´‹ÕöÌ£¯FW“Z@Kš‡æ”.^’íñ2Ô6’ âs§"tfQ«ë\ªhYÎ$ç2ÀèTŽ®G“§%&ýêEË‘ù OhÉûN7èzäGÒê;vcHÂY´v“°f†{7˦I Š?H”Ö-(ÞDZ@4¤÷òoôòÖMXÕ~Æk3ïÚ9ŠKEI7ÄM,1w‚Â,QK×/QBLKÖ¶}'cB9ØwL !Ù$*r­?f]óýT³zøå¸Yƒ-âÝÍ{ïjVÄ““V)›5–þ›wóZÅ­~X¢Ýfc >ì’CìÜ~¨¼©1.ŠCF,Ac¸½OË»ç °Ý6Ù ¶ØÔÓ-ƒ¡Nqã· S,Ò>`¿Ó:F §'ó°W›W®—¦jÿ¹ÍÿdŽ·w\:>„™¨6àõF|T•õˆF;2yå ~…ÃÜ»+ØÚ×ñ£–>u{¦u§ž R;‘ ºk+mÕ®vºi éÄE»þb9‹ŠhO<Ôä‚xK«. Õ­|ƒ]f)Þ·ÉÞ1ñ;[g© I4P‘k7«x%ò;^'˜8GÈñ^dE¯r9ó@ ð ¨gôù÷Eç;Ñ¥úZRcÚ¡¾ÐÃkqܬÆÖ,Ц#ècù±5-`G>þþiçÔƒnè0W ‘ùa»Ó´Eó¤·ù—Û\«+^vñfz0QuEoÀµÑ»Y½ô=ú¤K|m?ÅUMÀ»ab»ë»áð‹tk Û5B qGMj2é>þPÉÕ”¥è´÷›÷9 ¸ùpÛN’%‘Ɔt–Ç»›M2:¨³á¨U”ü‚<ÍæÄ™‘LJ³`æKƒnÙÓ•Ûd‰Ým²1wi°ì:4sÞ‘Ò7°,{øwx¦^mfQÉ‚€Ü%Á²ÙSÿœ6&ûµzˆÍèêvJã J5ó˻١¢ ÖF{{½6›=üa¾Î§DCû”7cøø<ÇýÑ`'ƲÅKœ¦¦á¼ìÐá·¶4ÚUËêç ¾àNkyVmR¯¼I¡«3 _JŽ%¯En¨€‚`ä÷nr7ˆÓcô17Ò~'m1@ VŽvDŒvÃíÖ ½tj¶sNöBÈõ¸.ÇÊ;ââNlG–MâMéTWÛ&Zº³QÔíºŸÄ‡“3ºVIß)E_ M#Ï"WÑÔ2VØÆiʲîR Åø*'êâ±üt¤ëñjî¶@ªêí×\`'pÀeerLÞH+®Ût½3Àu´6‘÷.Þ£,ay¬ŒEU EBçoùRgbpN øÛ¢0ÇIZ2­vN[f·ü:…͈ӈ‡Ã__ŒAïcóúP Ý®x…ûwŸn`¶A÷™èÜœ±Žt»Ž(íWÈã+ç1˜ÆûÅ´îÔÒxV§‡xèÍ`^fP|—„¶F‡Ï`¡t ‘FŸ |Þ|ž¯ÙÒ­ŽÃº;÷a[IÍÞÑ£FÔ: Á* à–µŒ®Hj&ꬩ‹ - –zuG:…§¬¨ib‰hX_wTÝÍOŽr¦ìð4ëGžu" ‰^X÷€fд[ÉUÛ:K!Sïñ(ŸÙ+ÿ4žmÖ0ò ©ÚÂÐê£`J2·øÍQƒÝbò43ãÊQùÞ¥és¬u¡¹„°“n­Š¥‚a£7‰é;1¹sÏ0ªf²ZÄÇq û÷:ŇÈuÛ,uÏ©ÙöW8qk·È¶Çw jéiG %¡Åœð2|£W«ŸG|ñ×~TNó#VOyÑÞµ¯HÌ£ 0¡^?]¹Ëº™%á³ÌÆŠæl†íúP=üQä*U«?ÃLæE|$VgÎÒôëïÛ4rË‹zbÛB*•AþöòN¼k‡Ë‹‚Â3šš÷’­E„?ßO-¹q Â1a·E`s q.¼f °î.ç:ìÔí]·QùbÀš}ÈS“‰÷:VûaÍÇê\u>f©4ÏVá[f§õ Œ¼²»ÌZvLOu¯OV£>ÉA6Ê.sùϹœRmç®UšNö±÷^h¥^¦§æ!¹`ÛÇX M몾4â­Ñ¬®ïGƒc6êéáb§Ø5Å/OîÎkh’h½5pÄg4MãI”˜ˆü`ŠÌË3X–"ÚoÛÃÕäz@ŽfûMEZ.™dÕWMzd’½âwÅÛ^±>Fƫӱj:R>’²w k¦æ,KCìgôfM­ÃÞ%$.ªÐn†ÑVЕæÃú7ªÃÑZCî¬lçÑ»WOͶíå˜cw™èÏy–7̰s g‡Žvz‡‘<íN3té‹5lkâ¬X§Íñ@•&K‹Â)zríšÝ0,iU¯ÕÉ+ÌkÌ!‡M¢†…­§³ÑøÃÅîÙ¢wgx'ÊÏr}"[Á®`ü=Y“ÁkõPtŽ^'Eyœ%‡) nàÒÑlõÈC¶§i5‡¦ÝPLj;$%ø)ž¥½ò\«r®ƒõ4^6ë ˆÞ¯NÇcv€ÄÁËÐÑz£wDÏ™ Ûƒ@†•>HwNÙ–;$jƒdRR˜Íž´qé`u­LÛù¾‘t²-; ïÃMr”í³Î‰èýæv;IvXî}´=¢]•ï¨S>gÞØ8¥Ñx–Tg½kké**<ˆ3øÚë-é–™ž{éñ¦0+Z½Åcû¬6V\gÊ€V·—’Ùáîë»éì•áÝo!gbGÀ„9]IªÓÜr÷b-¥;ŸP¦ˆ¶þàϘžçzÛÑú²­K§Œ¹'hGnè!,‰×Ûóિpm¢`«6L2V×ÿ³Ãm4×>«—GYi:Ôµþ0ûút:uÁV4D•uãëqd»ØF`øÓÉvüZÍFvÏJ.˜.‚J2Èdµ5YRkº=RO‘ U?h8µaC³Q 3ó–ñ5YÚ!Ôâš­C].£ßMÔÏ{q³y<_ŸÒTC8äÁ_¹Œ¦R»ìÇoFê¹+ãhµ&Õ³q@èì4lSnŠè 5Zö*“¡f 4†%ɉËâdøb²°TÝWžåÞT°ŽùõÖ®cµÑdzêÇÄ7ŒpŠÏGKÌŒüd“ž?üK~è†×ÉÇ,1ùë* ÄEµ›/¶Íû-ß ×š0ƒ~~Ž×qàB†Çw óØe1 KÍÑê°|yžÜ©­vâšI¶(’´ô/µî~â½Å9û¿:|¿+<»@…Ñ¡f“¬ˆ•ŹEN‹†Y¬®ìX¤qœ+¡ENÞá‚wSCK®³ÃÑ&nèH…­è0CÓBgã¨h]¢ 4]º!<Ù0‘ê*dª»4š ¤á::0©Á$åÚð×#—T ?À÷(é¨17ݲ?š 0̃Ò=P“„׺b+6WOtòXV¥{ÆÉŽž“S«‰Ë¢yñ•øúbk³H/-s(D] är âmET6ÔUÆ SãÐ^¬èvÇ@+9¦¤Ÿ9C¨ÞábqÂÎÖ‘ÈI9|ŸéhL«Ü he“úmAK¼ª6×ðó/Æw¤ªbf\ƒÐ¼Ýï´ê×îØ]j}›uä^ysùÛk•æŒn mŸ?5‹û·mÆ$úpj¯ó ¯¿¨ X¡³ž‚>—Rœ®æøb׋w”Cv'Òop±dg.Y/>Kw§ÃޤƒU6×Ë⤞ÁT+‘6\KVÆcIÎ^‚kõ p4Oeà(q>Ín½/qŠéRsÅq, ×ègš=MIþðbX(és›½Q){ÃðnýYA¤qÚìKQñ=.¹É“nÛ±[+üª]W´«r36ÇÁsÚO_9tÀEŽ“ûA‘åÖú²7(!ñ¬}<[<­4CöhtšOÛƒwaÖá$r°¾yWç§hFxBš]Õ±–GݶBâ)Ñ&:1ªÝ66ï·À{½<ÇÉ1p±u[úösSD· »OÝ–&CmÕ¨ ²ùšEþlº(u~Æ¥vªßɇ.îÍÅ)ê†vŠc{‡d™˜l­º=g‡TØœi‰„]Û;XâóØ&74@ ]¢yW˜NSƒrÎÏÍ#@o W§’œO‡¾Û`Emΰ™]§4~Vê”_‚pøa|L–ZÝžƒ$ Âï–ú”Ã{èR­b[ÅìaÀi–*?ÓŽœö­Y*>k©°ãCa°–Gx!„ Ö ž‹§xjl¶it¼ÓÖóã̪ÊS& Π\{®A,#XËI X.Ôkj›Ø¬$›W„›`ÝYEæAîÃÆÕ!êöt @´N›+’ 8AÈýYø¾Õqê6󷽋‘kÀP0mo2kšè=Š‹¥M]J§ôk²+mûé‚}UžòCµáÆ •ŒÂLÂýô7\6ly xÜ>Þèš’™ƒ†xRî¿N¼¸OÍÆ‚·Ñ†3[XNlKØP Œ(W 탶%ƒî?=¤Ÿ°Élz¿cd¶wž-™f‹/z &;®EÎ.ܽ@ÍFED,Þך,ïC us©®À ÀÄ„¥ªVó”HZšÙD¢uÚ‚„²‚ñR™+æ¡kÕ Vª¥_1C­åÅBxòºJÂŽŽ’æš•\UØ„×㋺ ‹ÕÆÐj&/wÏ›åsz•TµŽ÷m¹œ¸5 äÂHÛ6jXÅÛ”&ƒ¹0¶,{ ¬bPmnÊ m,ô¢¤Råmz°(£¹nSÉ^tdÇ}îÒ™Žç½Í²oÀáïFs%’áçâ*åtmûB!0ÕÔ†bpfÚΧ £æP•vÒž‹§—„"ö”Ýîe³žúiÏ_šŸMŽIÓùÄvoOFƒ5a“9_ŠÝáfЧv"á÷Ñá­FŸÄá³Ìž(×ñ<Ú$ÖÈåU”l´ßñq´øþñ]ò; Hö‚s&Ìâ蕉5KSN2þòïûl£žÓÇ´8ÉðàiúÄ™„4›IV>ëãxЇ²Žyý Ýéë$ÄjL{Ms2B¹­ð>µÌÙ]PÍë‘ðV¬¤†#ЯªE΂'\]¬XxQl£.¤s âg}³ UÁl—V”æÕ—®“ »˜ÔLÛŠ“Ûá {åSúÈëöÄÝA+îÖ÷i×ûª-–¦È¹¥m›ðŸÏ…2Ð7x´K—”a hr6õŽæøôk/ægvÌêÚf—Ó§ÀŽäêØm §×Ÿ·÷ noÎ:´Åú죿»\5l8Fc±æd¡S: Ð1ƒÔiy'×RšxÉ/OÌ}¹ñb²“ ßl`“xÅŸN†Ø0 Ò´ùájØ¡UrŽ@eØ«#l,LrXü¼öÍ)Ùp¦;* ú+º6çŠTç©Ðƒ*û¼Ð.ícKæÛ€5ˆ¿ôKö\ºÅmGïÆte4éû´»’$’e@moÒ© û;îú¼f~#ûèîÖí1!…1Ñ@}xŒ–˜í¨º ð%ÃëÆÒˆíÞò Þkž2ªáL5Ç×U(‚y2ôÈ”†¤°]‹nË’˜,:r—kž²äž¼°êTnU;VÑ:µ+s­ÛéäJ'§Ý¦=äÖ°—‚…·¿³dñÔ%ñ=æïrO1%eµÊ90µÛTѼR¬°”ÌŸn–éA°ØU­¼xuÏŒ‘xæ-2§…’¶<ÎJ½åH®Í{¦³ué–’•[®|ÄQ&ˤã$¥äqÞ_ÌtúÛiAœ#P+²¶¦7öæ|›¸ åÙÁD {½ªñ§·‡w>o¥åË«›-þH§ÞDºÏµG¿f©0ä›o8bÓFD²ñÏGKç@bÓjÎùëÖ²JÝêùëQyò¡ •±K2ËO9¦…™¹²ÝyžXÿè4å3Fv*€÷ŒPª>ÐæW ëõ-±¢]\Án×)üŽÂôú‰‹8_´fIA&Bd:Yí@:g;ZGµ ´ÖOÔŽóѹ=¶meÝ1¡¢£§`×ùèämÊcÞqö¯cª¯%êb²¡ýu_€ˆ>:Ù.éi@‰/v{×E¨ƒwÜ€7­7ªëQÉCn{m¨6,Øhcþ¦÷hõ~„8pöÄ·äl{ẽç)z¸çñ¦ˆØ§h%Å{;ÀÚÙ&;6‹ˆš/ŸLV3fìqßÞ‰[Ìâ_Yi²‰h@¸ÍÅÚºƒÞ!)O]©ÀÓX¬]ïE ÔÞò»+vœz E[öp\‘?bZÿ>_?Sã…ìYí½åø·Š\Ëg…Z…©P[þhjû¥x‘š¦Ûý­^·vµ¦Í1ûÔšÁ¡ÓÄwÁÂÛ-'*•ª´OQ†'I@?¥›«Ø[dä±/óWGŸ™ çò–ùûaC±BaÖe4UyHco š+Nì­®.í¾OÛK7p©žô‚šm—®¬³C”š[Ù äô @¾ø°¯iºZ£ê9Ò-e#t¼O´$¤zˆq$øSÇGØlâ3µÀîåßýÞl9šÞ/§Óñr4£µoçüïks9ÉÙ.îd´U¢´COm÷¶ƒßÇô†(ÿžô~3¿Ú ¿Žîé׎ýÖ|¸LŸˆÖåj·‹¶ü{ÑOCú,¯³£Îg)ÌÞ嬶‡B@Ô’™Lr¸íÐ’MÕ-vIhÈ!c¹õ}r§ó¼Ýk4¬Ø²Qª4ŠÎðóvûne#t~8}þ½ü{ø¥ö½n·cã@µwƬ¶Ð…7§5´ IMö}h噥ÓÛÇ@¶*錸9n33ÙÞ?©ÈÂE‚§à¬Â Éæ2íÐ9Þ‹hUdIÛf:>‘ X1hü{ë£5”@ßDÊI%e1Å”Iб6Á›OâÍ2*v&~‚׬™6$›5ǽ\2Ù|žÑˆ›“c‘¯æ(®K­:è±0­JO ?N®$’Èûx¿Ï”£öLÖNóðj6û®¹Ä ºŸ«´YZÈùtíÍ‹è¼3½~øb°¦@”k ïtV4 ëDX1|ç'bÄèR¬¹)jÆ7Ý(C:±wÇj`ÀÏ8>ý¦úÍ‘ÍnOÉæøB¾'Vÿœ;j²s…!ÏŒq„•¥ÓíÖy{•Ÿ óeÙQ4Ï@4:°{¦tઠ/#­Ë§coÅÒ8|nä|(™]¢t{:Ð a’ZèésÂþuFçùûírÑ}öSårýLA)®»L¬[OŸ¼8÷õÜÞ+Œ×į'ÿSÝP )Iuüí§Åï‹åp2ŸN—?élÜE/W?}ð¿ÑæY!ÞË?þø)ÝüônOvX³g²ñwÿ´ÑMè°äd„I&íÖ>~úèþôñs@»ã¶å?ñÜÿ¥)]æO¤üïÿÌUæžàü£?Nþ—þPÈSä£f.Š#ŠˆêÝ/FÿY«iZÝžzW´åäzðó`<6W!3ÿ*"hRi¬o«û™nÀÄÞ²=¯P g=Ÿôk*]ûj…"åúa nݯ2E.Ìù`¼²µãŒ‹ºÏÜuaV(6\tJ¹o6×¢°¯ZgãñnŠžÈùÍ`wÂ=Ìï„ižc–™…)LMblÂ;NiÃ劊ûqÀäW@ÁÇ9hI¤étëY Aæ$ç»õÐÓ«ùÃâvzõËêDj?K³‚/ÄÒ­¶§ ñÀQ¡m)µ¬º²®rE©R0-bÙ:/±u­dU|t–®I k6⢉ôD“¶¯È%f­ò£)ûçì*3jZ[p«¢b­&ˆ9,'ÝQuã-²ïkÕR j÷Çîß ZöYûRÔ“y0…3~ {‡90«YtˆÓ?þpÖkǹãH#OE+·£eσ(2ið ?Û#c0çm1OÚÇ«áÕå¼ZË«ª´Üp÷ý®à 1Y-Ô™q3šmw‚ƒád¬D'!5·! ±×"Äp±wŒ‡ízǯ`b^§Z+ðhô »hB«]r[a½ 5¼î=ŒÍò²o)Òä†.QMp— *bÎ# a[l¥ƒx‘9t‰Ïtë‚Ê®M˜šN‰®eù“~fq1£ÍÎ>¤Q…Öª²:D»Oë‹Ê¯“xú›ö)"¼|Q;³ ›Ç«€Ó§„7Z¬WŒ¸œÇ[¼[Ï`Ûb <ìo°ŽèD,`›‚å|,^{žœf|9Ô¿{U7¿hÆïgU·çávyÃ[ÿmŸ ŒiÛìxU8‚¾8äðÉl÷í¸°Ómœ£þøÃ\Сﴦ½QŽª++OÑçr]±`8±ŠÒT]0íÞäÚ„õZPQ êQ˜ÒÇú;ìº]ÁR7ÞlLë6º(L!H4X'KTTÝ•«Z£ íżmF¶ÓzËq•¶½b—»÷†¡꺌Až˜õ/D¹^¦8Þ†yj¡ ¾ù†oXkIò¾××GÅ%?Ùt¨‰qð1ؘë7E”¿›õ ¨ªU@Wë> ú?/—C£Ha4Œæ õ ÅŸ¦ÉwBñ—áámJtIš‚( ;ÚFn9À§o"…®;¬zÔLJæâ׉ÙëÁÆ\ï¡ÖŒ»²†‡]o­^Ïv_p†ºòC[ÄÀè/Ya­É'œ.Àî3 °Ð+À|*FÕ\«ýXÖß𺆷£\¥ñÁÔÙòFfwuÚ©ûd†¦×ö\è/Q‡×ŠÈM´ßÓ.#á€mþÐIÊ *‡¼ÿC{‚®l°Ñ´0ühïÄ'| N›Qûh—@Íã:S„×·8²Œz4+Êœ1A(‡U yÑÂvâŒçÂf*¡µ™€ÞP¯I­º7$é7¼U…zb~ñ¹{ Ÿ\i릆¦7¨ØX~s’0Þ "æ‰* ½)ëVR‰t 1Øly]B‡]b£ª&á@²mP3/¦40ÞÞF”¸vô—fÃ[JöŠªÑö×ê¨dúØiI×ëÁ—°«O³Ôð\1qmçb“ à¢2Þ´¡§OÎáðæ:±”Çsãüu„¡å4åfû‹ýæ.o7›>ÙeYo ‘j¼~:ýg¶%۫Χ~Êv6¼vbôk–%&ãÛÑôäÄ}rˆoŠ„zÑðdŸyÞ—<;NÚ®€:GzÂZ«UU›vùµµ<ŽÃìv¶’ЛfóZô™„ðFŸ}NPï¨Z¨„Wá˜x ÓÂ.ƒ½yvgÄyö¸ÈføÈVÒ¸„ZF;ª©ëaôs&Wéq>‘Ô÷dªò!呲ˆSj’0§¤±¾ÈꛩEƒðàòrP« Ÿq³_‹J1М&Ôèz#Š[9^*¥^ÿ¶j²‡‘Gò„¡©ú2µëƒnóCªs*©þå¤.ä¡4Ñ@=öåtízôÛpp=½ÿþ«¿ŽØ }ñûÂ8mwð|:ÿòŠÀ Ž0È»Ýìˆî¶–éª7p)¢ –}Shá\â½ü›&f™ ‚Û^SN뮈¹^àEÁö‚–NWº®ÆãE>Þ¯úÓûÅt<4^4a€_G){¼ÄÚņ±§)l M‰hODã‹&üj’I´_9‹ÂxÄ^kßBëÚk†F9¹ÿøƒÞžJ[ŸÃz]pVuc$;>raÊãïÖ(«·%Nưèv+h®Q—9AL°éôNcÝk÷$¢÷CÑÝãSgÑúÕèÂN×½f,NÏå19’S¸]lDYÙ+ ðûÂCÁw-¡I/X[ÅýirD«n£®*4“®~JËUBjq×åF(£ ^Š"}ýŠï‘+J˜Œ<‡yVßk:ÇÔp>\Yåˆ,kw'¹yá0ü,Ø«#†‰ ×КƒY¡sÎÅÜò]XK­1í%YÂ]Y„xu¸l‰ïʬ÷‚ñêíÎ@™:sr‚¦ã*§ê†Rr=Š>¨[Àœlw°F…«‚Lq—¥0·÷2ä?øŠ=ã¬"oè¸_ߣ̊tQ¨Û…bmï/=5ÆÑ?W»ì¸êveb¥pFÓ ²X1ÜJ¡„°Ö‹ìvé\šÄ¯\ ¹[Þírê>¦àa¡Š5Åèà}Ÿx?¦“Yóso娥`D„]î‚«*ÓIr'Œ!<è‡{Lðø˜ê]/UÁ}!ò1 tÄ FAúŠ+~ ‚-n³ã«yY.ì Ev4éÝ W‹eo9\aØh<Ô¾šNØËÔÅ-fÃþ¨7ý{¸šÃÞxµœR™º(uºaê‚»3Œ¦«Á’\fâ‹k}Yœ}î"PÙÉÎ;œáxU ¯«I||ÉŒ#]Ï`œ˜[ѓӑk¶tÂPhkL¤ç3ÜÖÓH?„wœõõWZÂsvv3(z]-o8ºÓœžìJs÷¼Q!DX·xŸLLa¸ÉíscŽ áD[qZ.B„Û•!6Ñ›<Áîh3ÌI6TŸsmÊC›Ef ץދ9Jt\›÷|ǰ…ófX™û§(*ïnþ‘(W’9dv`Ó³¢má"@©ãEìóõ]{a¡Ðµ¬¡ó"´&íf |¥]w—Ád0q©ÀÕÃ&ÃÁ輓ÂW0N¦óß»?(Ä]“é`¸0‚Yh¹“Å@çå«>»S1Y¬T6äjîh•tsðL’u‘•ðW K¢'Áp€ˆ~Ylu¿„’f­ÆqŠ=eï˜ÁzŸmdæk"2Ñv4…Èd¢ñzË0>bÿlJue¿/—Ò™2¦”çO¢7cj a3‰>´f#³ û í!`¶€õ{-ÇŠÛ$ÙŸö|xÓÄWœ÷1ÜàN a×LC·Ÿqw¤÷ɉ,äŽP:/”Q²ÄØÌ¡Øy/”–Ú{ô¡ŒHé¸\ævÎn]áxº\b™åcu ¿",øËeù+íÚõôŽ¿ãž™¢)3SF׌¸­% K.ƒëñ&;‚æõÏz·Û2D§rN;Ië—ÌŶÁìì¼b¡‰IpEÍaU/W °(W°$’-Ù;ö×8Ø;v§”쯰šVËè%ÛG««L'ã³÷•ìL@¯ÒóÆ–?[#Š¥LÕ¶±2”É*%½È„k9J:&×I‰vÝÛHÐ×a|_°"zpS|$ óÑù…à°ÝŸ.mýB%æSì¸w}‚IÇG¢ð‘Mʳ¹kIi†™éúíàhÿÏ0O¹*Õù”Õ!~c YnA˜í"T&1Ñ.Dásòþºtêàõ¢ŽÊèváž(`èD¬ã>>¾gÅ«ë1q›iÈÎIZ• (>{Ú¯þÑ7".ê’þ7¥9µ½25*QóuJs $T¢áDp MCê^‰j^‰6Uz­êP‰Ð+Áï`—®¤AÂ@§ IhHHr<2‰6i¬#Âgz§œnµ'”¼seïˆú#(WFªy-¯*ûöÕ§9ª¨7n*ÊèË.}§Õ ¾_ÆÿŽ0ʦÃÉ^_sZ«;®@Bç¢ë?uÉt<,ù® ØóoÑíÚ5† ¡yF=×|…Z1M7k¶%Kçꎰ+Ž!q5ÿ"ËE ¨Ð¹…lSKÆ”WÒnˆÀ¹(¬#,K¥@Bç–:‹PbG<. Ç®dÂXF÷=:'”âåÂä(>å6r¹ $Â݉ºü°. ¡E.—¤q §Û¼b.9ÐÁ9©®m圾èʳøÈÕ*9®~Úà¿?›þ 7‡ŸxQ¦½ÀAÉ—W‘´Ì*œªb“Ò(J›E¯ªxzœBÅJÜÅ&nCPßvw‰e–s¶}]Ä“è4,ÅÂÄTŸ°7­ŽÙj£“ÔWù >C C¸‰W™8¬,*ŠÞ.vÎïT’‘èbò|Œ>[gB¶ˆ+æ¼H»ì…'òa22bqÖëb¹?Ü/ç /(L"š¿ÎïqâÞÍlœØÖV<†­²õ›>®2¿"Œ‰Hõ« L:ï®{Ôe•?#‰È‡×ªð<ä —°],Û_âQƒL:éJ–f(2Pѱ¡Î΂.åD˜¡_îj|ø¨:õèné7=}bqtEYP2Oÿq4N)Dâ.šÇ]t&ÊDÜF‡ÙéÐ>†×]U_]HH‚Ξ§I¹Ó&8þ‡t.·WOÓ'ŒüÈ+˜•'ÖV õ*"±¥}šõ`ºÕ]¸±õ‰5ÄWRn4\ÈST Íý_«÷xµU­ââ^«Ô Ô‹ŒÃJ„Á¯ðÄ ÿvW’¾I¨F‡Í‚sÒŠž£ûÕQf‰„ê U‚`K’Ù0e¸ž‘þ¿ÕÙ(?Ë•9†&¥½×™ÔÜ¥¬DW®ü6î-‡_4veÿ£|;€q~6yW¨V¸LóÇxjcíe#i.X–1îóéXË:<þïvŸ‚ ?ûÚ×O‡kë¢íÐüãŸJ>Ã/Ë"ð.Xò@ÔšU‡Äø8ˆÝ]q0)ð5ᥰ ë¯'Lc¬ñ{2Ø9ÃcRq¾€Ç»hýI%D>«-1Q·×cz§1ñ(hÚª<“*Ú"ìƒj¨lŠÐNl5<7F^j†„ú åzU;@#x%Çg Z‡ª¦ázÃë$e%­@@mÑ—ÇÁk\¨FšÏ~¿ØÃÓÉm·dŸ'Ùá§Zøñs[çÛÑb9ÿ`½þíè~ŸŸ^/Ÿzó¡ÙéHQ–㔋Ö/É!6ͶAxâÙ†,7ë¯x =ìs¼{þã“ò#äìÎã]út¾AjJ·ý ”™MÓyaCV–«è<æ0ÉÅûe9eg]£Vû^‡´ÍlV¤ ´¿[J*#FY÷æýËr¶•ÝNí»Ã^5µõMSŽ{‡G'/µ–?þøYàn´åÈã“5£>çÍ4%sy“§u4݆~\P›’}Œã‰ïcñ>i¨êÖ–‹»ˆ'u¿S~¦ü}9v‚œÜânMîAÐ#P]ÚMZmOšëϳŒSÛÛa5Ý|†„TÇ›Q¨ÿÜhË jàûXÎH5…êRŠVŠŽûMñVü¼1Ǻê2]é‹bÛSÈ“<Õ…ð¦ÍâÍ–’OYªäR×÷Ë>ˆËáσ% ^¹òB kaûò–n a‡ù¹ü,©”äý@Ïù ô£sC×Ûât¡JdSnÞì`Ô0·XòZ š?VwµÖ–è7,zà”Ñb6îýn÷dɳ.¦NÎÞð"$ =GîÈ.äÑ~JNùÖ]¶Ž¥X¨ëHͯôYŸßý†Ç©2_áyšnVÿ¸ž®ð wãA‘÷}¬ñ -Ù+5A(^m^ª«9l iïâ¸Wü¤çh¡œ9w›ä?vEL]DDsC+xó±³L(=OçïáeO-á>+†é—®®xZ,tçy1TvÝq¹üÄX¨®Ðö¨žÕ霽ÛeMUÞÄq}Ö÷)2ôâÕü/8Ï‘a[Ÿ®Ÿ$BG7¾Ø¢“HF¬;-ù&ûÙ™šÿ4—ìÕÄÎE 3æÔ– °¬**s®¾68÷Šúê5aæÕ ëÔÎ1^»ä-oyf®h©ª.r9Ï4ÛT#E'\¤÷ùŽÈÞ̳åKRVw×]by±=»ÿLÕZ³·Íµ‹(ÞêM!¤ó2[äæ2 }ü韫!¦¥®ði•µI¶„$)¶ÙÏšê[ûÒ6£-ÒsðÿgîÍšÙ‘á÷ïWŒµõëŒÅNðÔD±™äyÁ¨$*‹)h–ÚÆæ¿îÚ¥PuΩSÓ×úv%r¹.Éåîòå°"ÿÄ<ÔDþÝl6ÿ‰õmÔN‡ü#-?â@ÊôX?ËTûaAv{?çV¿3¶”Y?Íoáx|9·®ª›ÚåB›=µ9¨ôöÕf•ÙÐæ@mÖ‚4‡J³öPG›#µYer'½9TÜêþ>M»­%±z.Éû87øü¯ÍËJTyÛéüá‹ëÅ :™bk¨QéËëêt¾|àF’Èhú~ú_…z ip¼U8Òi^_ iJ†*8¤=Ë“YVô²Áà)¥c íK1ã(WíþdœfËÉtÄ]ñ°Ok^,ßϳéó2O—³çIÆþÇ¿þ'êÿúŸÿ"¸ÿÇ¿ÐÒð¯Ö夤ÉSÞèª"<8=ñvOm—/˜ „¯Bð+9@Pã6V[æªÄÀB}œÝyµÙ•G@ƒ­ÿ—R)ÍÐÞ¹D.wûƒéPè`¡&ÿS¿ZB ã#6«E Ôq©‘F'ï.‹v2ä£l9ž¦Ù4u¯Oãzßå|Db”;y¦/É­~°ñ»Ó¬(òÇL[ª[ý€ÇdÓAÒÎÒå|2ɦ0ð íäÓb¦­çO ŒŸlh¼0¼Qg<…%>8å Íq«/ݦ۬]e3d„áp™æ Ω3^>æpu,[Ù,ñ–Ù´ÈÇ#¥C\×aÚv-àÍZðÙÐGÇž*8ðáÆrøÞì[p3 … $î¥_Q¿ÏHÉNZ§cª±¶—”6îN«í¥TŸÔv‚ÒØÛ|ÀRCçR;ÛjoVpL;Ô–vœÅ™E5@ã9HÃyZß2’3H%U±¤wâ’ W¨u¢ KçA­hÉN<³Þf;Þa€ºêTÓ@˜O,ýI' —}+i:‚ {.nNoX C§¤Ž‰xSjDµ÷ÇÞú̘ô Ük0™ÓUZ¶ÇS¾s—Ã|4žj„$­³¤5È–¾×Êg •Æ(P£ľ!pÊa2Jº’OÆW¡–Sàùh™L&ée+1­Èèׯ…!–KäIr"wü‹æ“@xØ\ï–³Þ|Ô_ù™Áé" ³Yoœ.‹¬=[Òè‡a²X¦É,Q»`2Sìƒm«q"ÅðåÄ&ŠtHǧ‚ÂÓ¬5ï"Fuùˆ4u{ãK°åh<Ê´¥RÚH-+u¥”¶áX^9¾Ñ6ŸŒç³qgšŒº™¶˜ L>Jò©¶¯ÍFu„ÈP¤a€µÇó‘yiX“.\0©z<œŒ‹Ùm2›MóÖUj>µØpiJq}cËØÑˆ]sÙ·ZªÑÔ„™ŒyûY#-‚ÀšèŒ z[•ª! 8$ì6ЊFí j…±•UU[¶æ³þP(-42“ GíAžª9 –ps­5"#½´QƒÊÛpÎ&˜[e„Uo8;È'~j|\“·‚(‡ßŸÂá…íoLÊDî%ØÄ0™AmÐz]´9(ÔÂJël‘+t} zÌt4„ÏÁ+YrÂíÁœN¸ÍØ|ýcž= PApâ ¸„½ ‚Ò3¹Ãå¶v#–´•éµÀ²²V½-ÁéqñÉ2O²¬/šµAmœ©»öj°—û2™¶{ù 8Ó|šÝ áŠØ­A!ñyóªKΣ¬ÝŒ¿Å‘¶3R‘›/úݲLý4MsøÔ!)öpE\¦€Ãœ«þHåBFó4îÆ­X´ºzkížÞ¾0Û}{ØZ¡h ŒÞ.´‡J{hŒn¶GF{0 ºA+í ct¿ë·<Ñ›ß&Zš•¯ÖzúÍƸ¾I5¯å:]×™ÂÁÓ®@uˆn*¦àû&avƒt]7šºbßø&á¼)™@K™€I;7j¹‘Ž&pÌINÄãeKhôÈ–ÊnRÚL‚AÏÈÀøÏE¿ÈÀ9ˆùØ!Qeb­·Aæ÷ñ“ÞnùÑæ’>‘Aæ'×}tݹ$rÔ0×áÉu]Giß–ºh~ ¹ #4‡1¾1õÅVlX¸©+¾¾á›¸ÃÂƧqê Š7Œ/ƒ¦B¥™DU{6*=²glœ"Pû6«}B\}URI½ÏØJ“W!^§BáØ¯ŒÜ‘U ¡IÎ ˆë˜û8›Î²‘8ˆñ!pqe ù1 ßZÚåvp]cˆ÷nôäFú¶u]c8òÙèÙ8‹Òî×3*0Y¯§4´êúžÞnò&Ðp|¯eì´ö7õ亮ÉÞ]ÙÔ¬åÏËÅ$¡DJ9&7›ä䚟€1,´¥3¹Û0iOÇ-Ü:˜A_ñòtž à¯N‚È¡¸¹33‚d-,0÷ªŽÙûy×D‚ÔáÍí RdÆÜÒu@c-@L,fÓ,êPÆZ Ç8â#ˆDãikŽ&Aué€nׂdm™Ì`ñ˜dƒSÐ$›RÞs®€I6ëš÷„'÷†ycèpò ™7‡çK¸à\ áÂkp¡„‹®ÁÉ3n^=:\CÂÅ×àäqŠ®-‡+×£qm=<¹këáÉõh\[O®GãÚzxr=×ÖC^EnãÚzxr=×ÖÓëѸ¶ž\Ƶõðäz4®­‡'×#¾¶¾\ز¨´ÓS‰ÆÚlš,a”LŸõããcläèp>˜å(L]©# (Ü:Neaf®¼€,ÈìU¾eæ) t¨2¶ÁóüY‚À0Qù•›‰í7H̰²éfR i Ýž* ¡rÁºÍ†ã›{ø¥ªXza³aQ–(ðK=¹ãhlÐsþüø,uµ Ä~;M¾XTÇe7ñ.›Üñòcö˜ðQšæ5^YLPîp¯=©˜@°+¼0úæS4;¶E7_º¶Ï¡¶"ÁϾ(1 E1ßþ4 VûZ¤Ýû4TÓçÆ;Ú‹5ø7!—D#÷ý›lv×&¨¬À7³¼èÕq€P⦩ýóɶ… ˜P)¾ß)Fú° p…wD&ôÕJ6ÊÚçhŠoÃMI¸ó]Ä›<&Ã;¨GÀÒ| º¦•r¤¼¤Ì&É ÃB„6ú°«ßBÜcäKÇ}FwÚsÚ1>ĆŸ=kÌg“9ÖîàÎî>Ë„€«ÈÇ3*-`ª6úµÉ |OÕ(ÍÆ‚N¤1ÉGV‚"Ì´c%"6µFmëÖöô1·î::§anÝdØ8x”¯W•¯O—ï&#íLûœ4×ß½´®Ô‹f2ž’Ó£Ñu¯B[Yš*{²B£9ˆeœ¾ÊÄT?bö˜ŽG]å+@Ö³bÜ8WãÔlAàp€ÚÌ-òÿܵÅd—;ΰÑAÝžÞ8e;ùWÑÉÜ€ój÷§ÈNH œè6¸z WÀ§ø¦ÌžË³úM¯wðIQ&ß§›Wz(gÔ½¶rÓΕà|`ewº×–ÍäV–-ª@ßÚ­\×ã×Þ]î¡;v%@i.Ú¯ÐÕðCÐ~œÙw ä­¡}ÓA[2™Ô\½Ø:š ŽÙ÷o~gßA¼9|û†¸.—­š}›ݚ ÂÚ»5‚5÷jø"kÎk"kNu׳ÙpLª4·u'µ½€½7T¾=¶È 4íÝÊ+»Ы<´ýÊK» àVÞÚ ˆAå¹Ýp+î"Ë“e¹•w ©¼¹›­Ê»»¶ýÊã»ÞìVßµöAåí]kÖñh¿Ê`&£%óÂ<³Þ’ƒÜ©x=N&÷(^¬;M&½¼]Øù BÐ X5Ÿ£ñLº<ßý9“gðÑw]˜îVl`Àáì¾o¸ÑXŽQ÷üÁì1'ÉTܼÛÍ즈jRLq>AÙ¬žHd.?O¥|ˆh“{mI0P~mr'&Óç:ªäxDñénú\G‡µ) $!‚ ÄûyB®\ Z`r ²ÌDmoXÚ'3 $®€ŒÛ³± Ѭ@Œ´v·J×T¯Ly©¨n€üO­?lÞû­0Êô¾ÕŸ.áHfuÆSA†ÎšNÝês|ç©Y~â5œ:åNäÓQ½â€0†xE¨pÛôÎ)î£]q“vŲ¡ ™¥u´ƒûo6Ífí^–ÖÑ$0üàÙןãSvXXt^ÌÆÊuST<šÖ¯FqÇj÷®F1žã±ŠßÍà§w±w„ºzs!ÚMªÓ›Ñ+ Æ|€á—Y6¤n´Él†ÿ\Ò–Û“a}:,µÙóBYÕ¹Z€ g~ïìps:öíýÛÛj·®n§Úgšàc]Ý^u]Êoç©´WÙ`5=&«×ÍîÕ˜Zt«WqØn௵ѯq«™›Ñ)¾ÕiZîÖåqÿfÚÙnUö_OÁáê3çyŽ«CM×@OŽ›=fŒµè(µS%Ùó±ûjw¾¼YÔ—[=e«‰ãæ†I¶ÇrµþÎÛv¯ý§¦+- ÛÂÚå­èúxÓËn§vu÷¸ÏÓyór®¾ÕkŒÈ‹°â<ß&×' ;ã)F1ó(Ü›G›”‚"qƒ|-IúÅ!PúM¡ìíƒýWÛI¯a,ÑÖvÐk:`VÛ!¯›? ²rhªét±án"q/ÙìNV?[Òš“ôŒ¶.?ÊÐQ·E™¥’“¦S°AùU(±³tH•|éÛ +†–gL~}ç~ƒ¿çÙÏ~>clõTHY:d+`•V0•÷| Ñ ¨S[Ô­Sl^w«­,Ò>Ãs­`*ÿçY­€*Ï)/å•e¢ÁÅ4àòŽBŒF¤SœïN‡ò…Ô­¨†]RÔ©\²·mÉZ¼j˜%kñ«–´…XˇM³ArŸòܺÀ-±e©íÔ"!—$ˆÔh•Ui"_…%¾¬¶•F¶:¾–g:¡}_§t[ÚfEƒÃHm¢ýñ,›-Ÿ?/HŒÝx†Oûw‚-/¦WÇ3‡³‡ákK¹¢LE?k:¢U>Ó·€¥—·©Š¥}Ìp¸dáY·g°W¥c ÐNS´|€¤ºÊz* PÈs¨6]ÙÛì(íé¢KlæW0çœ]îÞ.^¸½áÍN’_„]ù–æ©¿“àíÊW`‹ýE•Ì“>©S]6Röx7õ‡“lvs¶’¤)Æ2ë U Œˆ4@| $ÅÀÕi2…ÿ‘„i3jˆeh£m´% ”7ø¨”Wd×X´€$‡pkŽùM Ë Bg”vOêljíܧ‡†?"¶Dã- ZÒ;™€† d7äf€|YåQ”±R-êÑu~#pc/4¸È‡sLân®´è¡“¶v?]™RéNð8½ÅbŸ›Œi«` ðxЫL@¶Uð8eÛWíV›Aü¦¬,=[îùäÇá­c‡“ÞsWÁ`Ywö¨5$F·hO_ÖB‚°,PÁÐl0†£úlB…*”Ø/J#Ì¢Û§‰#Ú„’ÜP·iS׫ ^:Å£>ÌFé²3µéò褫í:.doø0­«½k‘¶—ƒqwÙIòÁ|j8ï]í%Ž)°îéÔ¤vm×vZØlÜîÅz,Ó–Îæ®Pt6ÍáZY¶fóÝî’šŸµ]ÞÛ)èÞXn*ƒ´¤Ü©®wWŸNGëäß9É ƒ{3;†÷tLóa¥ctOÇùÈÖõÆþh ˨|$ƒñl{µS{0.²~H¦ÝŒººW»ÆËl‘`J id5Þ|ïëoßso÷Wm»#ä¨ºÑØ»A؆Á¿aо‹Ó™ÒéÆÎš¥SãÁ¹4iOr&ª*†ñ]Ï6HÞš!HI(ksÇFÊ·8ÏèÑ&^.@&ËA÷nì2…O Bi’ØÝxñ¾Â”Zó|Öu÷{ˆ— ½ñQ_]ÀÿïÀºõ@šµ{ÆÛù½˜Úí×éA5²#çÄÍÓLörãèâ´!ß¿³¯åøø7v!ˆVL|6¢æëo=Üæ\†5âè¯tO*}ní¹.÷d< g¼SüADßæ­=šâÉâHÐJ3/Œ,µAfN€c:1r\™*³ç#ö`/…1º½1'ÀåÝÁ!ox& ‡ZÊÜØ>Ä¥'€ÇóOB²Äm1ÃCL'R®Û ø«8© ¥¢ ÿ$J$Vñ”+'8ˆ~Uñ ²&'>a´Uã'QMF¾êÇÅ %Ñò±+MÍŸD—Ì’ÒFMèü$4ðìgÌàÕÑçÝ?PXQAK ?‰jú˜X_>ïNç• ú+h×¾9¸%¬ÃyN&4u)‹50ÜR@—ÉùûµåÎ olsj@QT*ŽÆm'ÑÄP(&Ž2æ Dïs~]å©tˆoÍêq2·2à—˜3 uƒ,769¶qÙéO0åÂ7.çr¶zµŠ• õæ6;+X„|}‹Ñù±„½É=Åb<®àNWçՠܽž?Ù¨X“âÓþx®ÙéX’|/×Nhl<Ù ýF/'â J*qØÀ} Î羽}¹±\ÅÇÍž%ß·Á…*Üã~{±X,¬ÔQÃ\±X“ãž0ùõi~B—f; Ăћó£\×Q·iì¾É§ïp›­¶5ð¡#÷õü}»¶B¹z'Ê;X¹ ¨WÙà¤H˜ T¬×èò¶Ùù{˜÷o yÃPUœ!ù¼ÙÛ˜a¨p9â—WS_dÙ)P|¹Oléœj·‡”ZNƒÕ‡r{M^éœ Xèk‚JçTO| #¨M\éœX™ókòJç„ì¢fV±„ºÂ·›ÊÜIùÔÉÊÊK¤ éÙÙ®^OWE™ÎéÆ"’pñNÒ¾Ã/‡‹oÚâæ§•®ÉlädÙHo¬ãº+·ºååøÁl ž¡í¼uѽ%‡™ò!þè¢üÓ~Ãvž(¿¶•(‡?¥ÕpR¨=©¨Ç8ÑþXùr_¥q!U;SÏ×Ñ$×q†ìgõ7úuo/']b‹#`ñAt­4LZ›tò¬¬-æH"u%nü£¿lÏ”ǽ¶ÂôçQùJ2¤k‹M›¨ ûE÷ùÌÇjlÂõR0ä¯~Yè!1ÜPiÁÅs©7ú¶FÄA«ÑcÙfm:Ó÷÷éÄùñ¿üv´{Î*f؃Òd‰qPZI@ƒ:½a6OŸÉË3OD¬ŠuS%à ß:G¸Á¨ï8¹Fôå¿™ ¨Û·Ü¢ê }!ÖSô”I~×y̦¤lÈìyp}87§l•¸Þ“œÛ—#œ0mp¸YÏöÄ3q%èÈ~ž"o3a}¶Ø¬Ë¯›Si_ý&Z±0·¯[hQ3p‰õååü´Ùô­+š«Ýp¥´úZkÒ•>qk9ždwÇh…œ\ÿ[}ÇPÌÖ<Ú^[”,n>mÍwŸJئz[@Û` Öi¹:7 ±;Ýa¥ÛMV¯åí"zÜù«g‚AS!q…¥%·4ìY¬«òÉÀìOŽу%‚PÚ]CC¦¤]K@R[™ˆ_ù’‚*zºUÛ\!„ ZbÂ\ý"¸QK 2¾I(ÞCß5"råŽâ4¶ ïÛjñ+*÷)Ú04Ͼœ^šÎ³Ðw'ù}>-”O40û÷PŠQZæzP ¶¤YÑŸ'úFÄRT¯…?c¹w}«‘ŸñQšÐM“„°¥ßJõB8M9„fÝ—^Ì[Ås1ˆ….‘ÆV–M ùŽçE¦ Ftøì¹5V2å¹òÓ1”¬ÿ …!©ý@`™!ŒÚ3rH­»Bq·;Ð%Ifù0SâJФ„O6š)Ù"ºô` µ"?ž¤K’‘ÒVºÕŠ´Œ²ÙÓxÚ×Uô ÐV‰ê–´™W–Í -ô3uÃßpƒqWqâkT(‹YVuýÈö4ËFø #}©VèÌOnpZÔLg{|ÿ­uIë ¼Ž+D¬MpNÒ~Èúg¾¤ÖÌpð¢?¢gÁlÒÖÍ>lC¤yBS èö†Mx%1¶Q)û¨°œñST@eÁ‚P!ñCd<Ý‚ÃÎ.z£Nu³ =Ä5Q·ÏІyšyYuÎ’\•P˜‚ÅZŽæÃu…>OKÊ3Åͨ(€ÒòÃåÕ¢k( ³ýçrgD”&®›¯rˆ²sù!Y¯ÕˆúЀÈßà’´TBÔPg7Ê! €aù¶?~g¶9ù+ÔÐ"œµk@‘²öš`µ8¯©,¨NÈ5©JA |·„é÷—Cò”*5o€_™5 ©“2‰œ¯Aùºq‘H°ùÛiö ñ{Dù~òj[Žzèh…àFä-&Iédcäªw•î‰y’íöqµ½”æî,>oØN6ç«øL›ñu¦#ÓT1ºÁÄð×~ù½ZsIÒ°¤Ü‹ôžyŽJÐF„~`LrZþf~®4ó…Þ~]}?UZåDÅN²Lušu…«éÍ  å£Gy[žA£ûn˜,hkQž ­•v¯ÚÛñ ŠéL T(ú¨¨´†jk¶Ãº¤+mž‘ÀœJC…"MJc\i4»7+ÃËö¼9l+¹U©J©6+dÝŸÎÕv¬¨ ª¾ÖÙlÕ tƒ´·ûS©Ÿj¡ºè‘ÖnYv·aÁPŠM4ö¥w›\eñ=Gk·-¿çÚA*ÛÕÓàÌ-àùÕæ Š  S· <ÐöÕð"ë^ɾé2gu·(±e¿(ÍMÛŽ‘í¾¶[;ÛËé“z~uÚVšµ½:دÖj£NP³UÛ«óÙ¬S¯ÚÙŽs×ê~â7¬K^‹ 6eƒišÚHb¶WÛí‡ÕËg*áëGùíÜÞ–«Ýå  ­’ñÎû£º…Ï8¿®¾húf5[C}lRûYmŒ±+ÜFC`È«%ý Öíf£ T4*GO3f?¿~)uË–ŸÆäH³O+Ý ŒµuÉY8ªÍžÒœý÷²Újs)²öœdõɇèu‹~Ñ >ȳÁu[ [æd·ß}Û_tyƒ·‚µ“¯ÌÚ”ÈÛ¡<žö–ܹékõiIL} 3g>N·LÒ°E%ÖÓËqs8ÆarêaØ£²÷z 2ûä„b-@Ú7 YY´±\_ýâ<½Ÿ@Yk’²Ò:ÂJñ&€§´ÐjÌ ˜§˜d8N1ÝôÆ4 øÐ’—óÅx¬m0 Ö¬ El??—L†šä®&“¡ Oûãg3LjÒ\lËòí–Ä2:€%¿Œ`I3Cx CéR0|ºœ×û¯ú#¯ÒnËSƒŽ«EoŒq]Ù€Tä»^Ét‘Ó§ýv=„©K×¢iRêQï“Âú/ú[‚ÚÕhªðßDôjæ  Ò¨¯—0çmƒÕI÷ªMDÜØ}ïo¶Äö¤ÓÊ5BWÊN:Ü`ü¤SÏd©µ¾|êe ÇçéqO­Š§Oå ý„:DšÌ'ó ½ìúqÑÁ“ΰ­§¶Ñ¨ @/½®LÚyöí "‚*Ðh˜Oödz^yÝD³0_ä«Ôþ®W]׀ا×Z×?Èб‚páÝÜ<ˆ-;‹ò ôXÌY¡0…èÀ¨Û qi[{DwãI¶+jÁBÕÓ¦›íñ…$øjgÖ ÓÖö°m2kdÖ ÓÖ‘Q§Ao…,+[@6kU!0Š¡²ø²S’TV^6íÜ¢iB;®c…PHäºvˆ‰QIÁXúMxïZ‚VLS€~z=³{åèúDÍz²Îê -Íúi ¾ÈSÆ¡@4Ę ŒIFµU!Ø A’Æ` bô|b,ŽÚèGÆÊ`ó£¥³_mÕz²}˜,HäÝr ·ÈL7)ƒ¬3Óm }–#,PÄc§4ÀÆ@}ÌX‡¬X½©e¾è‘ª±×>"OŽÎëíÖ÷ëc¾Ûœ7Ä!röé²û¬ €*lƒž"ª]ÖWç—O†éÑÒ%9¼Tý`®SV{¶Ù÷öç ‚M÷—óf§³$ NqBŸW|o>d»3(hî¬.Û³¶µïí‰Moúvo×ÌÈÙ«õ›ž·H j‰.Î+yÝ6+°¢á0öA¬ÁÊuC½7õ¦Ïðüõ :Æïê.h­N¥ñZÁÎÞþkPP|ÒÇ/Ý”§öþ¢N•R&Ón>båÂnm[)“®Ž¯›Ýl°KôyP~<׍}ºyýT#S€Öþ|Þ¿ÕHÅBðýÿ}Û¿þÍû¸â÷¯ÿüçßÝòœ¦ù¸õîa¾lMçðåðχ‡ùp’’½Ï’d’%j#þé><üX<7v¢  ¤3°µù¤™hÓq¹AóâBo:\¢ÍÀå{Žf×ámÆ7Æ®}^ÅlZ‡Š7³r£ØŠiܱ—l4°9Žý˜µ¬›h4¾2hНtþóïöãA8eÊljâ\ —§ï-Ÿ0L:î><üÛýOµ½/–Ýyž><øsö Ÿ§ € Á1{xè 2%7ŽÜ0›ËIf³¤Ýß‚½'Л~'ö°´ ˆÓBÜjÓ.l‘bNæ¦?qBèû’N l6beä o£˜B¿ßëÐFà‡Ñ5HDßkå3|^><8=èÊ_éª·ÙÆ~t°0ˆ<Ù§\Îûáå\~SÓf?qàGq,; ÷p©î°1®,üöŽÎ0 \G!CÛ‹B5a$AÆ“!úä­Ô÷Ãå|e¤§€D “§“¡^X®È@$Ã\Íê„ÜØ<å{žRÌÛA"˜A­zfá·9ŽøGœrmŽ…bF°a—#ŠÉo4¼X­//_\ w «“¶ÅÒÛñ=;èÛCÇi†ò”!СY%•=MXF|½Ç‚C§ëFQÔð£ú.t&V7·-ŸFé-ô¡§Ðìi(}mˆMïù TÛ,)0©‚ ÅûÅoÊñ³Öx¡À2ÐׯßeVK¬ÐžŸç@ÑZ<ë,ƒF=°ä³êÀ¢kÑë V!ŽÖ),㺑ïj«w&ëkæ)Œ ë&ÿàDé÷‘EÂû y«ÍApêkŒn‚+Bl Œl~}—áh„ê¾D$s,^:Hž‹:Ži\㹀߄ʑéT˜¡¸º{IÑ#,€ÿZ)]:/×U–+ïàõ6HZó%üÄœÏ(ݧBPvE儊Dà  <Çä7<ÊÕ›˜[CÞÜpñI6U–†ïm\*I`Z  †‹Ó<¯^‘¢ƒqGÈéã‚¶ºý]à b… ‚ÅPؤØÎÕ‹3œf9¹MÔU•²Ý;ò÷#|ûƒ±àìy 7 bß$!ò+üÌñè¨\u»xðGÏrùzaØð”ËœŒTŒ§³Ö€ÔŸªCÑ ¿c׃×ô•B¤'9)º¥¡_W-»…“à5•Ën”eiwš)ßVaeÈ|…&?KމÎäjˆ‚:ÄL?Q ÆS£Xáé$—/ÈL×o‹F£á*‚Ÿ¥GÞp”KWMÙwÙ#n¼>—Þš¡rx«ðËÜfkb¿yÛ¯Kr2’®ç1&‡‡“_͈_0V-…{œõ‚KÍ ô/€C¹‚ü Òß®ÊZN:h9D¸)íŒÕAÉ£|IJ¯~þ;íMä_“ÎŒ±bàc#, ÕîóáƒÆÜÐIû1ÏžØ|A AGÇd@—( 3¹µÙPIkÌ“×aÃÑ‘)—ŽöyÓ¬c,›§!R¦ã)JÌ€–ŒPp»*©æ­AÞ^ÂPæ4fB8Ž|寰uX0q!Œ”ýEŠkwÚú–”×½ÂÁ ɆÉÌÃõdËé9q$y Í{µÏ²\z÷¢Pa5 P«âÐû•ûÅÏ÷®¡¢@t‰‘ëÚÁò2¥,µNí)˜D>èÍKoRÛd›NSÙ€¯I®fø·º §Ì¦ SÉ*< ê“Z.‘8Úÿ‰«ÃUÖ¢è ÓEñ”LÚ½$µ0­ä8mÇØ˜Qêd¯ŸàãQ¥ŸÁÆ«]u‚È uï¸c\è$,KcæËÜÃõ¤lÇŒËÓUIŒ­FÐPe¯',V'®7}u )Õ‰ùQŽ<åú[Èîµ¢xä+—‹Ù,/Ig·Tzxj´(h”zD$T‹u謟1u¡Ù%¯ @Ó Äš¹ÿùwM‘VuRëéÆªô¬ôäÁñLå¥þ_fç&çâk\0ð‰E¤l¬ *¾2BUQ_0Õ<–œÄ­¨æ ®ŽKyÁÕÔñ¹œC¡˜kè¦t8M2·¢n¢LÊ•.lwæx?%Š·Î¥›ê`TDYËPC˜VÎÖñ› Ϥë–|äHÑÉ\Sñá@êwš:ƒiDÊMçvPÓ¯|¨çFMÉ\êI¬° äᔯÞ"¬.„/¸ä)D¨‘”\ÖmÊóä^‘Xù§ú®Ô']8jUšþ¥°[·~èÈ“ö·^²lJ}ν"$ÆŽr‚MI†¾ÓP¼Vl êÉKM®éDÊ2Lu¥ŽíÅf(¯.·*2(؇2\ý­¬ê$®q²™7œ†²6pÍÞ‡5.˜R^qì˜;QSÞ$îõe÷{¤[¹ÓT¨N r-ø ¦\.Π4îâÇŠýÕ­¹ãØJh¨°æ"v‘"»uw€#-áî™—³.°Æ!5`/˜i v™#+lTÂ"+UdP€µ](F7öe úÔ\%•n±b•_fKü€‡ÿ´úÿùOzüR”g|:Ü®¾·÷»›×‡‡¦›Š„(0ôŠsL¼–  ÃÚ'šøOd Yö‡ÿñ~O¨Ð¹{ï‚tbAºbAºnAºyAºÏ‚tÿ–I^þ{Ù Ûú挤(hq¸d·n*_>“¸”‡‡çä)œH1ö®² ™Ö+ŒsZ>m^X*"Xi(¥îš¬×Ùúµœí»Ù aˆü›v©¾þè>8Ò6ÖɆ%ˆYäݦ´¿>ºª³ý Ÿ@°ÓV›þjÉCa-ïÈ‹H Œxo‚IáÝC×ìBsôz0eM?¼& ½|cßCññü#9Wß%ú9/pɪi÷rt"yžûÙˆ6 <ù@2ßabžÓp¿^m7çïl¹&XArËórT]¶ý¼0ð4<$so°-Dv±UÈOƒ;_êǼN€ßÙsHrbw¡y§ÛãQ'ïò¼ÚÌês}Æüø:^lN˜zX'ì8bÊÊaÙ>­Š—Õn°Ù•­m¹[c'´Õeê~ç¼Ó̿ƃ«ï+ŠQ@“Á¤—$­øXʼ/ÙÔ›êÄeçõË ÆÆBâx"sx†pÍ€æp†;B¦ç6Þåá ¡ÁôÃñrú„70[ù…a îó7P`[AI·<ßD!04„ìØÚž»ÏœvâQÖq¯P_ Ý*öQIÜÀ.`&ƒÀõåp‚Þ˜§Ïíýá»áèdª ÞЄKßÏØ9AS˜W×Û nõF{E]o߻ٻQ?óøæÄÃHïŒQš€Àå³¾ÓïsÛ(ÀKYƒjླྀÙàkÁ…NÃÁ_,,Ü`6õ¥W¿@@0gW_ ÃÓgÛ*8—äˆûŸëÄqÆ?ƒ0hú±SƒÐ¶Qî™bäÕa´mž;0¢¸cðç>ºÕM1þS3t¤Dëí¼0[É*Ï%ŽåéQwiáÉgcgÌèÀØzèK ¯µ9Ã—ØÆº°»8“†¡<dl¤ŒúK_ª ·R¬€t¨ô¸úJsÏþ}ƒõÛO Õª‰ã+\ŸŒßÙl·xå[F¯z_SÑÝÏäð‚°žé„©u‰ pÔº¯~¡zO¾²_O>‰À÷ôI ´0Ûß7¼ò ÿÑ^é9~ÐØuü#Àß=nþ†s2ÊGYwŠORÆ©Qd¸=δñ'Û×?}rΫW’š(IßÍ‹z`d5”uÊò@5äûîðó˧_<-6PN$Ïb" ªƒõWö½aì7ŽbûêÎEl0:­_3DÊäälO'Ò¬üv_ÎuSQ½(uOO»ó‰ÉxCû9|GgM´~9ɶR³qî?M’ö¾tc=—_Æ?žJE (ÙË’ïøÒÔÝ^m_.Ûæxùˆ^à"—Jÿãþ-[«g¿êÁ‡»aÛ«ÃÃCÆÔ·áˆç1‚µ«+9wã—ÎN×ñ{rîXxÚ{xø¹q¤Íýò™jM´9ÊÅ].ŸŽô›¼çË‘ÖÕçRîŸg»ó³Ã]7)®IÃËîµëúluyvØGùâÊtò=ŸZƒºŸ0ä¿;?XØ‘p æ—ƒ^>±ì[¾|†‰Ðˆðô²Ú>nʯ8•ÿ$èl9ÇÒ.ÙÓRu3=$éë;ñЀ.CâtA߂ㆰð“`úù8'Ð Møk} ͽ ó™R…{¡úÌqÛOCŠf,P_w`^0£“K[œ|9cè}"†°62p:‘ÓCÅ>¯R…°È`.s`,–ƒoÝ.Ý J§K„Ä\<ó´=Ø¿~ÄõÓß&èÙ'íÔ)ìÁò.ùÊv FØ_¦ ÍZÒ´ Þ®ª7-5›`ý0’ü+›e„!O²V&̪¾làƒ7å nL:TÑÎsúÇC=/a ‘ö‰·ë9®BâÃw (&[法nQK·šiä¡Ö½¹H–£[ÞÍ2¢‚%V%Û¼½Ýölý"¡žø÷{R| ݇󙣆rÃä¸O&åñ„‹wgF™SþqT–ër-wÎÕÕçfFß ¹$¯åó¦MÕ3(Z\HPÃdEõÅ$'Œ¾£ˆ´ò¡^¹RRÂ#*H úÀŸô|`7ŽÖ{±i¹a\š·ï”9¸®+Œ(aØ4N×//›ny®nÍÚÝø^ìFñ"_ïëñáõ̉|u£sÿ ÇïÃJÓY¿ß…6V¼âêÑò¼åw¢”áJõ(iý‹nïžQï4Çkøn7pÌ Î6o€aZöÇs=¸ZÛ˜¿ÓcO3ê'†b¿Ú‘ÞXì+¸cåîæ¸Û“ìP¸Zj¦‹bŠí%€Ò¢}Ô³L1âÀ¬¥µÎ†ùÚœ¯àÊW¼X£õ´|)7_Jn/÷+}£º¾–ô³8â¦th&ˆ‹rGª Ìög [Ä™ï_ÎÛŸBÚgX]‰Wz¤¥ ­•btnη Κ–˜|™ðCZŠÈŽUû¼°@H»÷ß*ï¼âeÐÕÇ!Àu½â„Âý˜®¼ôŠ~qSîÚÊͪßñB×#™èì»A` ÉD2ÖòóÏŽÉÕgG±ž 7rþÔÈW_“[¯ŽWÆ7/Y;O§¾anqM ILÞŽ\x—ªŠ&i¢†W ‹£Û¯µàYØG,î×u¸Ú­^K¬†ÀýÄ -¡##+Òã—d½fãàBUçwóå`.\±1èPzÚÓà æ¥ÅLN³= ZæÏà½{”å3tk­^>ƒž@(N ú'\O™Xë²Ù®)àÇÍýß»ÓdÒËÛt„ßr³!ost €£;?¼WëRú<3]¦é+ €©dÛ¯˜{ 4B¯Šk¼3\îCå s¢"Ò‘O{Œv¦¾+" ‚PúHC_ØKx:hq#4vwh&XªJ3T&6¶(kRG±º>9Ù¯ÂnÁQqÄ+u÷°^8Fû,ð±ÜI“YôôôñÈv˾+žs€ ¼]¶Ãé÷ý@]W¥–ñ¹Þ—<ûÊÊv×>’ÏÔñe¦@å—’|]õiY²üüi½^HŸËúæ’‚{1û~³©Ì ƒ› r®›eÄ®n5i'‰§p-J˜À˜ï·,UUK·À¬ÝИ6¥%]RiQzZL—$å·0qÙ‰ÚˆSt²Âº)X#F»vúš›@¯GwA:’1i‚‚-[ÇÓ üR}©}®AÚp!{[b­Ñéf]Þ(t  Yå¾2C‡êQ6A¹ö ”—);%¶ú•Eh4ôÎ\—¡—*î º—†ôòSâ—*Ñ—Y{¾›Ã†zVÄ^~TßQu´õËO f¿­vpý1FOy܉ñ›µz3¹Í¸©}gå(«ãw­¯­«ç8*Ÿì_µGÊ““g|Г<°0cupÌÃöwsÅ;Beª N}@;+³¸²KóÖæ·n²æÞCOãüÇgƒÊ BtZI»·Ú~<Ãå4Ymxœ_<‚òžÍ¸-µr'„gGùáKyS qÕ½J½_ö»‘#«$dA3vUr›Î¤Â#1ÔË8ýuSžÏšŒÊ­¨D²]»â®õÔ‹œ¼ÆÀYï®7Ôdr»„ãpä5¨„¢‹Éù¼zùÄvíöê3N¨ìbø»8,ßNSÆøˆA†ø(¾?>¥é®äÉ*+ú¾¢¡ò¾¯+¹úu3bá&±ú}OÇ ':ÀI1ñ1Y¾¯~„ 5qA“Ö®?Cªº¡¹béÁ•~¬×oLÆLÎ"•Õ ‘`<Þ }¹ûI¯ÉqóŒn°ùÌ *;‰][ ùVW×µJmË ]>2d®§RAc™¹7+è ² "F4ì@Idªo¨Æ@r¯ÅûÁ´<÷ >Lí| #ÇÒpò¾~Îv¯ "\ÞR?…»ù„o§ûËn­Ö6=ï-ÅÛžÉqñG.Îx ÜZÓ‚O:±|ò³u{Üœ¦¯;s¢³ ZÓ;?mv¾‡/f¸žH ú ïAïË0Þy½ž–ëͱµ9¿­@Ð<Îß-ãÛ Ð¨âûß—7›ó’nªdBär=⦉ât*gä›ÌÒ@ýCøÜƒ¼<£«ŒtmmÏ›U7͹öm:?<Ô}’÷½Ó³I”,HÜöÜðp–ðC/<ïá9g§):p{¿ÝÑGBÞ>’+ù®¼ž)¢´D+  PœZ óæé=Rñoå*&'S¢0œÍn§ph?Ÿ÷mUˆã­8t¦²#™6‡¡Cs3)·Â]!Õ/}¯®2ß³M§Up(ÛŽdnØ1÷|Á5Í킨^wüÙ4WIB¿þÀ¤°Êt<óüå t¾Q~€ÂÀnE„„MÚt«=¾¾áé+"ëÀahfœS Bs­°^ñš(ÿ˜ÿ¯m’W|‚ÇÕŽhÓiSùН¯Éüfd’ÕTv˜Áu\s¢Óò#c˜½ æ“ÿNû¥Ç-g~²·‚ØÄ ×ÔéÿŒçJ7….xÐûM©mRéÄ7¢Ž+ÿ_€Œ`Çx»þgæ¡ìŸ&†UÊÉ0_9魼Оhô·¾m]Ú½723bËçÁ%N †F«÷äIJU"o"úÏ“Ö=,C5`%ð•̵f9"ô3²N'๣z'ÉÝ ûCy uùiÔóø¨ggZðŽL|ƒ³ ƒwÛïfõã8M_²ÓËêPê¯RÆRih·òÊ;Ù&òƒq° ¾±!74ÛËhØRiŸR°°z%ˆGõµÔ#¹ œXzè |¼\ÿSôøb%¯SÎ0á+~I]+L«)~I³lQÿ,?–ìÈ<†›Ýçr­a@±±Ë]üšXœAìf§ïdTRb¾¯Ål©L™ÛC˜-qu·ßŸP›l/'ÃOŒ¦9ËúҀíl†{‹3!ºéзQ¿´‹Åõ^ûåw®x3¯F&º¡«MMiÌU÷Ïç›XÐqjr—q×ä8úÙ‘ïJ7!¯KfÿgΚõl½ÿɳåiG†æ˜œ•_¨9:\™: V»× —&êK—FÅIA„Ä>ï䦀]ÑŸlI:yŒïÈiÑCÇœIÔcWMÅ.ŠþôµgYÌ‹ šÊ‡MöÛï­òǦ6OW©¢ƒü”‘¹é4¥›7t> ÅЬ\‹X"ŒC3Ë}Ëú{£^п±ßMÎGîÿÖW3’ô-þožï5cõ@§$á8Òï“Ä]Zô„eŸŸ±Ýï)Ž^¨X_Žû¯ö\=#œ²/â)edÕ§åaœ’>ELËÿ^J%®ÕÝá)"”`LÚ¹8_^>Ó®¢šn]ç† ºí½½Šäªå˘¾0îÅ#ùBõ#hàiud_Ì<Øï?'§ ƒì«¢ö¥¨t9¿|>‰mYðF…z_wkÄw9¹#*_n퉖¿¬êÏ´¸m„:)q±§Y ÛO¼ÑcÉwZÏSo,9¾Íjƒ-®á²<ÔiVÕžH¤ãkPXÊŸò×<%›¼qþ‘Ÿ0%]Š\ Œ¾ÈȲAækÙ7a"ÃudíNÎ9uk»9©ÎÐw:ô:M¹¹sîx2t%d=ã!ëž,_ u¨ [Ïxøy côò‰³A¡¹È‡Â—hÑg;BY«…ì¼^Ý®/úJ×)Ö—%±Ž#¤`€U#F²«Ánq$^xñ_sxäLÌWB\ã$å!’tɤڃu”̃=ðjý{0ËÓ1u?/&ÈG©b¤$ð®L2…¸¸K“nZY’G*΄Å}µîóŠñ}é6…X©IUšÞþxR]ø7ÅQCºyámÆ G¶ÚÀª¿gdgŽãKÚ¼¦›Õk;-”pz[¢®{ŸJ >Ëþ»w¬ú*P9é.a$Ì †Ö‡¾L±È&ôž Ä‹]àëƒÇª­jðØ;bèÓÛgcRÇÝg¢z.9kð‚H¡,™Añ·Ì ×>pòñjÄóùR¬DvÙq±G»ßÑü+³A/-E|g$âÁêp`¬KÚª³ÉtLKŸ,+9ä¥Z¾Œ°à€Yy|ÛìVg†O¾Æ IDF7QÙZÄÇ[IXú ¼ÿ˜ ŒüHø§ma9¡§"ø5Z{)î‚0Î= ÎMý¸;5À0R*unçOå‘Ü(6‰XñL„I6|…“þÕ¿Wë‚m$‹ˆñFë’ÉZó€áŸ×LàøH÷˜^‘,—VœµfSêb6¬ ¼‚ÇÏÖ‰• T BP±ºcÀ ÜSÉùÿ‚À K,ŸÅœ~‹ÀF®LŒS‘÷; ye‘‡” Í Ô9ü)–,PoPš„æçÏe¬r—ã©äWá }‡={‡AÔôb­ƒX$² à›n‚®ÿsÞD½˜b鎵QÊÎê…ÕÈ ‰,0—(÷T.mè"žâY=ó…^„":±p‘lÖ½d””òóÜ׋gsädâ¬f [Á›@ÞbèÉtw?ù>ÓƒbiÒNJ…ØBT£†½¨þ†¯ìîCOøR+”¦~6å£î$ɧ*2íg†OäÏþÚOP©?±P‰& º\v¥&cYåêYC›„ÓE(­4ó©õçt¤9—™ Þ¿’Í‘ßÚø¼:L¦}‘3Á¤pr9óTéñ‹8 ,UF÷¤ûñ]­¦ñ·LGþÖÏ^òY¯Tà#GHÃùÎr¤õW3O;éûM!Šˆªï–}E‚ |Wº|‰^³J n?×¾Ný<× C\<¼„¾!W§ð®¯½ˆùøN †¬,Ìðd3PŽ[ð_Ô’3úâÎb:ŠLC§kq )†ù¨‡è"}” ËUHù O D¿¶F,¥õÔáþ¹±QSºP‘¡Y…؆#ÃÉHh°¨C¨¿¼Uóq#”Aé?Wu¶¡DL‘áeÑYÐþõÁ~CÍYÐützÿ½%g#G²)‚þŸ­8Û<}‹þö‚³ ßÑçoª75d¦acÓñäKU§î!1µX*b|j¿¿nä; ¯:«ßS7RüLÉd~K܆#íæt¿¢ n8Ê( V¾”fGfÁm]¯ Èc±xc#–ÒÀ©<ëÎòz¥PiMP|CÌw m¾”2=æBIÕÀ½×¼†Âø0K«šJ±ßóŒ>Ž×héÉÅÈE§F¨ä®b˜Šþ1爵ÈJÑPä.Çé*Â.þ§'D] T‚éyK‹Û/Ÿ&ð¿çÙ·'QJ†»çu‰8JªüÁ]¥£^‡ŽuŠ@ðžúXA³lgËìúS…ÈÔ!=¬Td<ó ³<þÌŽK_M޹[ž“õ—Õî¥|ڬϟNuˆû}y ßw$J%E2CY)ÍQ°B¡n4ÅÅHÃ-Xòâ ÖÏšLÇ‹gZùë6Bb²úY{>…s¶|?'çm9îÀoS¥®b[ÒøO8‘ dzÌhêOä(+Jc„©eQF†Òhaš‹–G «Ñ±®x{ò”ÜþXMGµX>uÑw¸1Ç¥nV`†•WÌ&Áíį?ÏÖªå)ÕN-¯7Â×ÝQfs¦9Äj{ªÑWâ ŠJª®ÐïÛæuç¥_~‡+³Àï„E“;œn&æ%ú<Á”;jf‘äA–?‚9¯÷_iê¹Ï&ÉH ð ѱ,¶txZmÎ×: # ~Ëj;Þ'×Úü âÑ+ “‹Ã¯Tñ܆«d,ÿXÓ†ZB£8ü"åÎÅt>Bµ.éš>Öv.Ûí‰xóÈmïÔ`JÉ)Ô ·é‡Ž²0éš»2Þ@'Ñš 8{ê|hmrõi¸†&’ÞR€æÔ-¤ðb_~béFͦ+OÐá×*ñ¥@J?ÅáïT)·)G÷Á@yº{Wyr—ãÌ‘òô0íiFÏ´AtË3.GAÝTø‡ov2âûÚmfˆ>|Ô@OœN” †ºO­^ Š%,ӆŸ@p>2(¬8üfÙÅ`b徇ZþŒ™¾œM{€p9ÏòÎ3‹ûXˆoó•­øçÜaJ _™ÒoÑÙ‘'‡ÖIü^…æå†Ê•ôÿ€¶·¤ã91¥ß¡ª/VLJߡ§»žïIñ tt¼ÚdâøòS¡=ÉzP»žl¾•¬xå’-w«ê9z75Çø‚½+.¤7ê[è)4iy ˜–”žYBgæÑ·èdS¦ ʇ`:$j9ûtÙ}Ö­/}M1 |%Ý63ûÊ„´…¤â¹k’HÉXCHö¥ûsk†ÂÞx€h³é*ŠaùÖB+YàÞUºÁ+›åyóV’ÈF²vKt“}ò½¾®tÓ¬ø@Iulžoƒ·†L¥‚3`ÚȺ%Å\Ùb®}Y>Ñ• îZ–•¢šcV¬LØôÔ` ð_ùÖ„L¢ÁüÇ^ƒÐõ5a îŸõŒ’I«@òk-`‚að±þz"–ùÆ*†W ¬Dªä0cƒ ê²@v;ø/”GxÞÕ‘q̰ D—η:ìUWQÌlPùÐûÜEaH©¹‰®÷ºŒQä½È{ÿõg µt}eh+Á„ÌH­ôR£úµ^ÿœ+ÌAÞÚ~ÆÅ‚eÒûÙ8z‚ÇÅ®ÉãîŒ ü¦4‚°®¿ð‰=À¢æp•¬õýŸ(4›±± 5±D0FGF08L%µz¸÷UÿšË®a÷Ï; [iš‹–¿¼Õ¥[Õ>©úô” éó!½‘ U§×µ©b €D]‡2çê8–/óuÌ¥ø[}%‚°šÅÔÖ˜v²öhè—[àVîÉj³;ÿì ­› ò<“Qþno Í5ÅâĦ=§Õ9¢kµîúúáM:´ô./.‡¾’ÕÕ8mÒzÀ8‰/æî˜°ôW¬së4½¥‹glÞüº³¢5òNEdCžW‡~ÆØ_­«¡ôf 6ªÚR«šû¼’]7»|€Qчý~KÛºwë¶¿©%Ša‘‰«–2ÑÀ˜“#.b·itÇÊÉêÕ–!EÜıIb1ßàެ›«b±KDt¯ý‘y©çƬCSü=nPAèUxîÿ3ŽPÆ(Uˆûû]¡‚È ìóú-ÎP ã¹&·þfÖ ŒCS@ø[­9'jh¼Kæ– n"bK¤ÍŠU_V-"½+äßÕS„]ĉ4Ám¹]cþÕÕZjLJªOäOùC‰vF× …Kî¶µ™÷zJƆTIX5EÞÂê#82,›¾‹ìãÌkØ«&Åö"ß— ´¯¨µ‚ýNR­n¢ï‚‰«‚©]§Ý‘á[Ö@g Ž–$bœ¿Ö= ee"<8דIkd‡ýþ³Ì%'H×}¤Ñü±n`>¤ÜGgµÙ^hÈ7ƒáhÐßÓ´Ý·åé ü§ËÛC]]•vò.{&{nækÊ A© šÚ*y©{¶áʸ—'ßûÜ^¯I&|bû#~Éшǟ8;ÌŽêù’H¬/³O`U¯ø&±-+³J;V2º¾Fk”·÷°S¨ž¿¯¤YljY×|÷Škð:â 1ެV'€7ç [ví)ù=•¨rn~5 ŠõКÓÏO£Ëv[+̈Žòêgÿ&­†üÜvš.³QwÙNŒÎ(”Á¥œÍ/þû–¬×³}œ¶\ú4ž¦4Ò§/:E~M'é˱è÷5êÈhcÙEÔµ²â•˜ùÇ6<lþq¸úfGÅ56;k‡†c¬îo¹pïZRi€Âò.ëýk{µc6V?¥¾•ZW) ?ŒÌRüä[…p|×]Á$ó‡sL©¿nGiâTPùéhÖKKæBñj±¬ùQEÈ ¶õSâ×ùl T„‚’v¡·Íggÿàl¡²#³–+èØÔÒt°¡Y<6>©t0†µ5É7-Ùqõ QmÐ%úäY¾SŒL¦ù0ŸåYáéÜt RLŠN„ ö˜ªÌ°›ÍRbÀ"ÎUÆ ¥/Œ‚Œ\•ø˜ «r!éõ_K/Ÿëc2Èg† 4Ÿf$ku FÓ«®üX-Å¥e¶ORÀ1KÚ½,µmϦ⓮à¤OGg Sk03¦Ó”ìMt½Õ«éÈ’N²—8«¶O¸~R›®åð4÷[ÝÂOp¡‚„Ga:gÀ,xh²™ZÀ8Ì Ø˜‘Ôa²~ÞÞ[æÄÓÉX&ÅΑmVM̃S‡Ë6-†ËNsiÞ–¸: +i:Àü~ÍêY&ýfûnšÛf8fcl´ÍCñÉSðVB±Ìã/ñM³Œäa6OŸ |že/¡ŸüZkqoH“|P‹·Ñ”Vy /–ÀØÀ§Ïÿ¼0ÎN3°ÎNM7e©L -Xú—†žgÅ„‹aŸ®„mN®ëX1/«Êt&žŽ3ÞîÆÎ-X¸“·è޹EÜêíº®–e&Ûš7#Ëîñ=¹’ÿ®s\½éÑʺùh8ÆR tV×ñ¹A-¾ÊmÏ?EfÜ*2½“‰§zÉ‹ãjÃä¹–kƒbÊvëê÷e£´þë" ϧ¸p?ƒddÛ…þ·5ït ŒnErS0vHmß“!-Î[t“µ[-øº—ͺ[wž§&®(ˆëqñ„d¶/Q6›Ž’m=\ß©[jJ®ž¿÷ólÊÖÖrc·ÕÑú±jȨïªufªà¶ Ü£¬µ@Sd3r›ö³gãLFÞX09Ȧ<™H2¸ŒóÌä*MË*"Žo/ÛË ¸öœÉ1-Úƒy ó9g ¬s¢™Ó¾ó+ã˜ç yžŒ‹¶9¾u޶›¹ÀÐ@Û­,+¢*8¾ï^Ôž¢çQÛv6š…"¦ÇͺÜc€•Éh‡‘H6ÛÍJÍ_ š,ÁXÛþ¦v)FnnÂŒQÚ Žgá¥â{„Ðh—+_{«øp—3ÉQCI0‘½n\¢ŽE”•è긽mb6QZ.\=¿·à , §Äe•Ò,X|‹'±RŒ»õW|é4YA†ïfOy:ëX-ª’†•ÅÚX*[…Ñ(k›_,í}v¬M¹][ñuòls´ ʶZ‰¢´ Jq8ñU¼ùîp©»ðæ|4™Ïè¥gL9ð‚«¨m‚AY•ÄàÔ]_xš¾òÚW³éÙØmm©‘^m© lj-+ÿ÷&õj*5$•A~>y0`ŠmL™†1[¨ŽûŽÓ°í¸ßžá Më–%ø{œ áœy6Î@ ¥K¿Æ‹¹¨ÏýF÷ëþ‰p…¶Uÿ“^à>ö6t?Ÿ?Úo‘m' *]r0vÄ;µü«˜–•ƒ#.ºµi®–* fÛK®Xýé ­³ý=yàš}6¿;œZ„NŸàïÏ × ,O.¿ÕÒÇiÛz~]¨&Z[ëåIOaÚŒš66ö³y¿gã8 Súµ—¯ì ¶ß´ij¿%^3ˆcËúÿŠ4x¨ VL¦øŒ‚ubø›£ÌHGÇ{.fÙkÒ-éë#)\‹ú ™Õ‹£6n`Á?Ñ ÍÕêÇ ñè\>%³v/w—2f@â«ä€#Z§†oQ™JE2#Õ ¬Ö”ŠÙ;V/gݱ~0ÜØ‰¤·ìrɳ½>DN§ûË™ºßq¥ÔSªŸúôžZ.1­"CpOW_0ÜÕz}@‘ìô‰ë4gŽÄFQ,záâ¹”}Mtþ!Y¯µ£C}©áMŸÉsÏF2P‚àù ¨[„WÛðMm™qöµ„®Êw.°‚¦§õÛŸI‘åV9Q"k©ï»6IÜZ§êÞ"‡9í*öm`oêüïË©µ:•ü]͈eqlu­@^ëX¨èl?Û†ûÓy|Xý÷RVßánÇ“Ÿ€`PhYLyÒO‘>§©| r\ØÊœàÚך±rP°Æ<£ç¨Q¬„PgQÄ`ŽXíõ•”Q§Y–ê‚íÜFØtƒúnz¬ RˆJE»ÉáPîÖÅ÷5ä1g.–¡ÕÍy%;q ÞZ›WŒ.yÊS¹}äƲHª±ç¢Ö`†§ÝßÅ‘a{ˆËNèÄBº»«OyÛlº®9b縣Ƌ¤Œ|¤\9ttðÙ¾~÷|é¹ø¡µ½Û—ãi¤ÉYk7Q³J©âCëí0\}.éI¹’Ù+t¥Ë|·Þß×MÙIh-Si£¼¥•1Ýc¯ƒ†ôNûÐ^m_¨mÃA&æ!4ªlòb?ž’x‡ ¦ÂË|‡v0Ë9Ö‹9JZ,Ò{Xž>eßÎ¥®_±%[r7”.UÓøˆlâwú$›jGÏ‹<™B–t¸ xšìˆ/ÿì¸Yí^·e Å•1%ü’Œº¼¾ú$JŽ÷ð›[#”±Šr¨§ÍéS»ÜnÅì1» vd0ìA:'.n™·’‡V}2|*»m¯ ˜Nž­ ®”üµX³éÉÅÂ08|àg† Vó³Îô _—¡’ùŠbÊ.ë¼.I™$ËÎ9Q«U*ß‚ý;«·Íöû}G¹Ŷ\«+‹½»±Œš¢ý†åù¸y9Y¯zørá>ì‹ÿ„iK„#Ê J; fTºBÅ 7ìû=AY©M~ éÖÒ¶.‚PÈØiF O¼H"RñHnWdu¢PIëÅ;Ñ<«$”„Ê|¶‚¯K*-è©€ƒ¨!Ùi{Kvu%aÚBäXs•eØîAÐ1®ÔD‘Xû0(~T—+!ÄX' Â}D™hD’BXÔ­±;MÒE÷u®)ø2õ‡t³zÝïˆ×Fqù@dÞélB\ͪ³`-ÇWuìã<·ŽÙª{žöX ”J hJ#3ÐÇ—ôeÿÐøè<ÖÀ"e£Óìøz£S¤h:ÖNFÐ>]en{t/Ï–´€ÊyeK¸Ê5= ýnùÎq¸®Y1›ÎE½PT-}eܯoªkë‰zÜ­• MÐy†ö}jÓ‹;7§©*~ŠM&ýk¹½Ó—¥{>dÛíæp*-–RòWk¼ý‚X™.IΦdà“0! ”Ïæ ¼f3ÕùZð7E™™ýMìÉ™¸¢®Ðâ-<5°n¥Ë+·šãKÍ ›pO™Ë¼´ðßÌf W4¦Ðô¸¥;P$2‚÷†©µjöˆ‘ÂfŽùˆ¼èf©zS˜eBHµcJâž #çµ=qoÕõ[ßq}GG½âæY·\Ô+)W††çÓÝ–çØ÷ÔÞ„ICêZ¹ôéEmCˆ!ާ”"¨H7bU7?[Ðü¦²Cÿ{ U§g`NW95Ìc+QtÁM(Ùíòí¥<œ‰wÅ–X·ªú n—©&CЕ­†h¦ÝÖ2ß-Õ[]¹G¸»›£”Fÿ};` íûúBŒ•ãBI%âê[‹ë)2Åg-RÙì"û(*±®IÙ‚–w#åÝ-Ïô\š‰e›ö#‚";N[Ce¹ä<¸™ËçàÒhXŽ+bï`ÏD¢>E}or²NøÎOåß]q©¼“™ŠÏ«Dn¾$/†6ÅôJOf ¨žŽ«úª\Ç(0(·a}èÐã…øÞýCPçNN+تòNp©M3mš;}쌘îI/þækݹϋn£=KR·F õÿÿy{Ó¶T’¤ø+Õ¾¼ú7 *®4àÑž7^¥Ö¤è\æÓ?¹EdUâ9ç¹{®žÉÈÈ¥r‰ŒåpÍ tÊjè%Ѥ}o·©òH2çYÌÄÞ“rµ—¹x8Xzl㉺lvJ`“²ÞÈvn ™Ý)Š}»Y¡xhÐ]u(Á¨ƒßto!ÿ˜Š~I`w«eü59%÷›~É÷I°‘YIÛÖq^ˆÃ"Ööí?¡´ggê ‹òæ|è§Æ•T¾8ÞhÝ®v&í »ÎOà|‡³ê¯Ó!‹ùzþ½­P*{.êKöÔá”×Ò‚÷1µí5*æ);c1îb€é7µR¶cØDÚ4•F±ÅIHÖ¸ Z£0I,òX ÂѶîà}Äö¸AD—¦ˆf'/)T•Þ‡gø¤ä¨ÚFîÑúo°-w‡6q¶¿™0å :ÕÛØØ£æÙ}aD­,啯·Ußò¶SےαÏwòM¡­A#Ò¡ýÝvqHâ”™‰TˆfèÿNKVSJß–%²ªšºÃ¼Ìôb×*s¦÷³½4Z®‰~†°™‹+a]Œ^¾×HûʆÆY“1 îù°ñ îìé1RäÁss¦…r¦Ö*îca)õ~(,1 fªN¾ ÃvXˆÁy ù&ÐçB¹åÚù  ×´L‡™OYD +)8Ì“ºî…pÖSnzp¾²]^Wï¶wݽv?¥@.A%ÄIËcdhyŒD¤`9«?Ñ^(È×$Pým[´å(ðyåêçÑëº_¿)Ëš‚ Œ¹ ÉEÖÇ.ê”åž~DK˜µŸ0S­àW%{òºøxúÜŒ™îCÔ…)²ÌÆí0ÏΠS€PÇg°×‹hqÏ&3C«•œV|"Fö˜FËg˜&e\žŠ¿¹ˆá;H‰—%$î^uù†F¢“)éÚà0Š˜0‡d“ÏͶxN÷ N‹°YlwW8Oß<þûæÜ36òs®zö}2G% Ó·!›RœÃèKËz'¼-Ä;°¼U[\[¬!dŒÇr»A#ôlS. ç™KB†F[ö|¦üið’êæ.6òè&>üø|˜ÈÓÁ©ÉìT3óÒ 1%Èáб™.e)Ÿ&Q‘kO~™ÜÌΛ®JüÙƑ߬ҰÙí1“'|ÚG”Z‘9! ož´êÜa[ éïÜ 29×êŠ$æþ y´ôX½¦ A¦™7Îpƒ®³mÙtY‘ññR²ðÿjùoÙÐæœ l;oðý‚—]±p_,¼IC˜ó>¡·w!ÕSÍerª®n$nFu…^¨‡VLc&D”‡›Iµƒ7ÚÑé¸×á<è'XG›‘†+åŠñmϱ$¤ñ¡ÏX];(åÁ9¾½Ö7^:jå5Þp¨ÂÑÑiÃô$üë?¨~þ%Ð2ˆóƒ•×ò:¹ö™ë…Ü+M¦=¡té€i?Õˆæ.t…)‹éÌ3R “ÍP‰Q˺ŽÞéL-vÉ’t²8½øf,EµØü%ßÅ­‘7û{™@+Yõ®‰c8Ÿ$¥T1AÂÅ™»·!»}¤i[{Û»m¼Œ,ý‘T =Ú3‡gzèQLo(ì‹ÜŸÜ ‡9Ö '#ù›V÷ òi»öu…W×Ìøá´\zÚi€Eª> ¤R—y“Ï„§³§g;¿ªªk¦9EßY5÷U‹cc&jÁ3æ¿õ®û—¬Ì¦ ÷*r Ìä;8Ñz¸šÍr[R:/x)Ž¥WΞ@’ÅSÒqöÓ˜NaÈÈqÙÎÙéôxaÄe½°n0ÈRºÑ!g³Y°üɽY¬Æ”{,\ÛÐ*G‡B*Ï=»ÿB‚t‰§¶Ì$óÐg¼Ö›b<8‘›Ç¡èT¦mJcµ†CÛAÌòfº‹#÷Á3Í;!Ș{+pœÖÏj „ޏӢK5´úâ®Ù®–E|äÛù‹TeH¿rë¡çÐ( DN˜áUQ?.û¡70ñ%ôâÔÆŽÅì2K–6aE>éG®Êçš0ÀOÖ$ÊaNÿ鮤Áz<ŸŽ@zŦ¨Z”OŸwU½\PFÁFÔ‘òù¼¤Ä±Qž²ÅZ½!NKCíí h´ðÄÒŒåá}¼Ú-·åzù¹×:êûeLq¯‹YíP‚7´hµ&s©þÐÆñÅk]?ÐS˜æÕ’h5Ք_óX¹RZº¢Äçƒ28NÚs¶‚)Û­V\¶ íXÊÐBožž6Åö«WNˆ`Y™]GDŸ*±ðo»gFÍê'!÷–¹Y.FÅêºz-ёÜàîH•^V$ËüW³†”¸Ç«¼2æAs³.V ˆX„X!ü1{ªÜì¶z›~ÓÉ—¡k}FÐuô¦Ö‚ŸŒ‚Ǧø}«…¢£Þd ëË‘°%òh~7邜%R;šÕåöóGY¡Ãêùžçýa æðTd‡$ÔC-F¯–Yùî¢Qo<ö.{ãcåpäp?êYšòóÓLJçѹöNŠÙ{]µó÷n¶€ƒlû;íYÍEº±ˆ¹ÌŠÆðJº/{E^ µ°z£ð+_[Ú_÷Ѱܭ£jùyTü¯,êïµæ¬%èuÁL¡ký+¶Qþû¬n!Ç w°CíÂŹ‰U I.WüÊÿ£Ælí9/`ºx·LŒ3:D|×ì¹›Y@2ðCl”=î‹¶K±’œSv,+{œGmÙîê`?‡=ázcç±ÚÕÇgt¦ñÒ¢ã¡Ç͇â_@œigè£Lo‘kŽÙƒl´Û¼(1©ž ÿ"uƒù>¡b> ü…³å® ƒ]<ö¥–âbðæÇ¹…g±<l8µ¦}¦™q!¶½ù|÷*ùtLLÿîjr< ®ñF9wxòϪèz“Ép2µúè$JOeNê‰=1–£†CCËØÒÿqg*qñõo;dôÌhÒù’œñ®åÒãº>XÁ [¡ŽÂHÏŽkd?– ù.‹Uc²övÍf Å'lòÕ_·×ý›»0ˆ7£!fzº˜X¢‚Ð=Uz©T¬¥vTÿ׈%ËÌæâD"h:ãkÕOæóê"yÂõ`Ðï÷‡öSÙሉaF„›ÿ8®Dº§½aâ{1o†¯+öxÀ“¯3¶a*’Ç÷p1U©"ó"ãf1~É]7î¹¹Ä3v¯NfOE¾øÞ ÷Äü½€¤¸U»H™ó¢ý‘‹Y =æÎ_›Mrfë&i=éȳª°Dlªå0cT+5m2Öl(e¿¹ðà?Òû`Â<_Žg(¹ª½Ê^ˆ-"Ìñà6ÅÝZãÃy3Ldz©>iJ û¸i­[Îâ<¾f…}ØÃ.N3›Ûô¥@†­ÉüÖ`z§Là=9é-—“5Â{Ø.§ç(žãDì7»8Uv"zÁ Fò•VϦ^‡;óz³bø11˜ÃÛÑZñÖÖ}ÀÖ=œ?,io8Ó‘Â!”²¹¨ÑÕOœoÀ¶oó)éÂÐô³ d#Úö‹§¼ýÕö±ƒx3 çN,b‘̾ؠÚãvÃvÃi ÍèlxYJX-²ØûˆMCÛäéu\¬«z ÏLxTŠÿÙL«þ;³%B7|‚f{”h'"¸MŸt£¿Ð:ñù4f€˜v>NJL: œ·oÁ‹¦<Úû¾ƒµ ¯Æ€°ÜU£yê÷šýàQèTÈÞ)…Ñúÿgß¾BjÅ fȬÿ¡|86YÜ­hÿkäŸ?ÞŸŸp*ž3>k…[Y_Üväîì9 \¨w©ŸúyÀÇS6}Y=cÆ•|ÏøÏDêÒÉ >à0 ‹µVLˆž²z…úà…)»Â±e‰,Þ/ëí'5(›Ðm:¹xБù¹²ƒ 9ʤ6cÄfÉq½¿úŠ"9ËÉíõ±|T«`H|âh¶_Ïžr ÿŠ¿6ƒâk·çó¢5§±Oš8Ö•«Ùægs¾ÝæéÚ˜™V?ðiëú ”å7'¤}Æò°¹ˆZ³1€@Ñ+}˜/óž3fC.˜¬UÖ1ž6¶ŒŒ N¬u±·‚üxY®ÇÏ«v-‚óäj‡†ö>m‡+ɧu0è¾Bk#LAïWï«®Þ:îN8Þª4š1€u«aOUBY†X~sq“»±Æ~Òm,«ac/_›ÏA;XKH^”¶ú¨ÄíÆag­3û¼çÈ+#Km¨USqèfxþÄî#Ý|FôouÕý.X¨°ášÜÖ­Á’æ$‰]«e÷ªc-w·áÎN]¸ÚN˜fÊn>úe X¦-¾w¬(›i˜äü`\–Û&”š¥Ï3INŒJO{ ¡#«ñ?‹Ø¯ž ¸ñå êû‰ázt9µÞô0¯lùY•:ëÀvÝu‚¨»!®Ö·*…Aw%Tà8+íiÈ:F”u(‹ÙEu²}SçÅ Õ®Ô]'ôw=Sç%±Ÿ8+í™:/e±¥V¥= EIGïöL]ÀEy™ â0åi–{l½î©ÙÒ{æS»š‡ÃMíz:´6¢ ÛÇ-ZFþ™S¹d\m^‹m9?È »÷Ö~ eYÈË'»Çm=›o[Ð-üñÎ ¶ß¾ªªÌg÷Á9ôº9d>s1óCË)À<~ó©ÕG êðõ¹š‹Ð&tÐoD7i×­”¶h2S(—mURlœ[G»r¾Î}'Ÿ=ê´_!6ô°ÍJ°ù¨LyÝOø†–¥Ë÷Ûo{Ÿ’žÚ’«Öÿ?î—Q9PþºGò3Æ×—J8°R:âÇéK9ÿù >&¡º»ÕÏohcŒjeŠÂ„ë.îæøÞ”fŠÿÆøÅœsLËç—­´{N+­›ítºc2¨X¬Æ³ª¡Ë ¢4f ØZÎøvEBlÛbä4.rG®iý‰’“Ô­¥ãî¨wýh¸¶ºÁ<µ¯@Î –·«Bõ¸ÁIVø"XyÞ®´O'!d)ƒ7 ×½”R?²:¶è½V$S67I;|}…¡ ðë†2vŠÊJÕ}Ÿ'ƒ5u¿ã#Ji¯DjN<†ñ†iQf‹Þry´ÛŽŠúu¶ÂzÒ/;¤ïqŽ7&+£³» ;hºÍÛ{¬È:tµ]õU`þÿ@>!&ƒ«Þèìf< ¸#ì xÈ¿‡ØÉbZ%7<â®›Š˜Ž“ZE§Ñ«Ù¶.?†°ÝWdбƒ€ütKU,!²ækô¢–{§éå(ÐmÌ!Œà±-ãü|Y,™Û¼–ÊTT„‰’Ž„Z‡–û!ù)Ï…e£.æßLJäÄÁMáF7Þâe½(ÞÆ×[¼×*+» ®’1š½Éäæx(¼ñ®Eèˆ#³0vÖôvñ²¡·ÙTóR„u 7Èx¸â> ,=¸•¶˜’µym±¾Þ¾–öÚ–[1H³†[gÌÒ½F`ÍØ ßO¥Á%\Š»Ùs¡-þ-ÁÎÏrÀ»ïhÂùŒì|qnb."ª*žŽ+¡¯þä©l@èüˆÁíO“rµ‡2ðˆRÜè—Åêyûò—È¥®^ÕR‘’Çyñ´Ù~jHÉX ‰OÐLOŒ.ì3—´Vç”þ³ªšyƒoBS1m®E£>w€•ðcI³Ôüå®iÙ>±‚dj†ËLÂp\«÷¿ZR%<–ÿúkÒ³ÃéÚ˜àI½\âår Öfø7Â:í?¨âãñ@ÜŽÇÂ|ʤZ†±QŽý÷WiRŠM‡Y_w¼ ¬BAJx~ÀSd>-Ÿ_QÒ6.Kÿ¯‡kÍ!¢—p°&·wÕ»œÊª|^ÝýÓ·žGH¨†¿Å >Šñ(i¬lëSÛGׯæ^HŽs¥H 3šm6Û—ºÚ=¿ _µbÃ÷ÚÈýgR¦ 4”dDi¤J™>¨ØÚþ§:b&ðR9íë#†«i©ÁÊá­€‘’€‚AœZ·ŒU?ˆÒ,罓 ¸’þ\E¿žë<a»Á†¦þœŒuÅ$ ]}‰!{§—ƒ­ÌuÕœN5ƒ¾žÁ€Ü…šU){/Ë šˆ¸!]c\,vóVpîy+Ÿ<[s í)'Å÷µÑw óÃà”ïa_1Å“ªàR•:«ú¤Ç.…wæú EéF <Šˆ„Í.‹ílü¼j)b³À3/âònµ€ÓBø/<Ë,^¦Ôib§ÕÑ阞Ü›Lòꓼª•TËÜÔ²T˜V*/mw-JýÆk%_ÔòBQÕ*·Oe±D%¸ù¿{9xî[®Þæ¯2ÇÖ½?ƧG÷2íÖ90 ®Ÿðv»š}ؼÊ!4Œiyÿ–ÁñˬÞHLåÁ ûO1³—&‘™Ö¼‹hZõ>\&&yxyj¼·ÅÓá /‹­fÙ eÊÿåuU¿ö´— ÞÎÄó“½@7rö¹Týú!!z-ñÙ­ ÁÎ-h0Õ2:(b!A,— láK!¹jùjücpÝ;ÒwAF;‚ q„|„»’–‡[ì=:åž%ñšL_c.@h Þ¾ÕÛ£Óvß2Ÿ€štus5j‹ü3J N)xÊTkÓº¦„Rn7“š YH]·iûž±=…CT/ûåOÿ§=ééƒGˆ—¢§|…+ù|·ÙW½ºž}ê G%‹˜Ü³¡†:ðHžYïÖ{¯ñÜÓ‰ÅXl‰ªáÖ‹8ÑA´~4ð(uÝ[ÌÖ0‘—»²‘&CNÈ-úáë¦ hj­S¬öàqbà®ú2 _}ý§Ôñ²Ô@Aš‘Û…›•B¿39ãTNTv׬%ÂĶÿô¨ä£iÕ/u-+§‰oò”ù‰€+«“SJ×Y§ë‹ÞèØ\é:§ô¬÷ûjФ¯fu†UüçêÝš”å4 UÒ( 2Ü…ü(ÁZÔpT"ÁãQ×5œígS¡j.…{“_…ž_(ã!˜Û9ðþP¡¦ð0ϪõèäeF”…{ÅdZcmR ʘÀ÷57÷+ÕpÛ‡e¸ë Ù1%X«èI‰ÝÁÃ+›Ñ•÷X‹ê×ýaåÛdZ¡´C;c0íÙžxrÀ^;#EäÓ³Ö/‚Q]lTˆ‰ÜëãÁd ù“À~b$)SGfÖó釫_M3¦5qS–šê‹ÕܵÐBôò*¢Ú'U=*ê0>~’儬Œ W˜7fÎÔë ¤ˆ+¯¤|;šœ%²è¸wÝR‚Ié± M•«­ÃeÚžXRN÷ßÜãßy\Ãß™ëSk_`\‡ö{yïj4£„Ó?ö¼6¿ƒ¥Ò„gà?·2ê[¶ÒÙ+©døêkšÓ½~¬Å­"¢…ÚŒgˆ`U:oRDñpëù‹NˆR´©}üWÇ€1¹„×BO—ŽšV@$0 3 ÈÖÏ–^¸ †+¥ ß'çúi…§ðå@ù!Šï´|/TœÚÔ•¯ˆbû^+zA¨Bô!q=&îÍ3†ud³{ì-Å͉°ób…xõz‰ ûí jõ“„DnQ[Ù%&»GwµN4@¹á×Ï2ã­0#ºLˆ8×ʘæ>Iiëç…z8TåÃõ^#è²õñ¼€®bŽa7È~ –m€ ð)^‹‘N/3è)1ÖÿuŠãM|ÁܨŸ°^Ï–BA\½Z‚…xÚHJ'—†‘ =€·^?À®'/L#¼ ÚnÞÈGòª¾°n•PG¬úA³%à}¿=Z­užö)‰èÑÞbÕ”þd’ñY^©+—Íáœ{ľ†c^4Èsò¹Ú¾Ž{m<1ÞÕ Ïà;Óì›5&•s¤¶²ýtïUF­”BI×ëZ[/׫ã60–8†ß·þwÙ>ê¬ÃJ¦ò˜¿Ú·FËg„Uþæú9- [-Ømq)‚Æéu®¡?'Ô0ÎúpÎUŸq–¾ë¿Ç:`˜•Œµôpÿ]ÖäyÈXGb>ØIOœ³?ñ )™qÔuUÿ.wô ì²{]+UÎWŒuÿRvWmd¶Irßñ¾ä¢œåׯx±ÑžL…äèKp}çÆþí´7, Û$P—FNQ8ëÍÄ•=çÝÛ_fåJ‰3ÃÎääª?¹ƒëYox}4¼î1 Ÿ¿†Ìjyv·ÞTä,LÌý>*^Áö¯V&AcµÎ)[ °é0 4B-±ÿâü\%M)R°‚0ì NÍpK-—Çä½´FW²¶c´F°æJ]HÖÜ>}œ ¿’ŠJû–‘]®kæ‘ÃããA‘ëíòh¶)s­·øïSw5B î{í % ò.°PNz?GzDØÛ3S°g‹+X\k½Sê ‡€K=­—g'Êê@#0?©µÐ£¢·­Ñ¥J‹ý… ã<ŒI³Þ¨y<íªK‘qRÊ>S†¬”@Äר|¬žÇ:SAþ¢à5üõò±ìZMŒ$DS¯^N¶5ž€]c÷pFA/õ Ž)1ü¡°îCV™g®&z×ý?Õ Èd„ú`5r3þƒ#a¾–¼‘èÏ5y^âúÑœ,ô9 «•?:[…òF²?9[iälâÏE€X­üÙÙ¢…¬&©þþlùäm5ñ‡g‹Ik¼•?;[ìú¡F‚?¹}B¶šø³³•úîüÙÙÊ]‡#“úÿøeªÞž,Â˲Zù£“•;ÏFûMð›­Øoƒº(Юíy¯}É]¤~~D-ƒð©‹'aäÐjÊw?‹RóªÙ-{«ò5þ*·²mhBÉ‘°FH¥Âd6 ŸÉÑr·Ô¾i5>=j12ðRd>Ú-—ŬFU™{–œ „Jêh8ÕΑLEÕÌ’¦,‚a·"‘+Qõ…1ÔØcÑúÝ”âé‘ë}¶Æ{YçÍN}JëçÅô¡D5!dÂ[e¸Z}¼ØDt/6Bo†_Ñ´®+Ê—*²ß6ÇÖý‰‚ÔÜœûÝÓ&¼DÇÝRÔ“_Ø=ÌÃM™ø¬ Î%',ì_‘ =‘|ôê`ˆE:qapŽ‰ìæ‘’¡r‡ Ç-/›&9Ìkè³Y‘ôÉ^zm:AÏ|ÚÝÉ’{òÙ{9\Ü#ŸìÝf{ŽŒTÊÀEÄIs÷‡FˆÎÈ‘mŽ¡" ¯AH%0—Fˆ|hD\<\¸’§”÷òP-$á!>°À¼:ëÙ 0N.ô™áw@rW•¿îGHŽo½Åb°ZÏÖv低ƒ Ɉ´çUÙˆ˜Ôq!qÈL"Hz]J%ɽŽï±!¬HlA?„}𦣇X_y Ñýž"Š Š)×0Ü3  §&¤Qo{f* 9÷iå„?½·áO5öyÂÖ%Ö>ö^»w$C*¾Ý+•â½Û;,eKhñöÏ^b–x ‰g«yÑL eõ–ˬJñÆ—Ô—åVÓÐÊ<|^Uu!p(a»êÈlZ­˜%¸")g<2ú˜€¯ž¡½E·òÊ“.¼„îƒ|“Ñü€|ôºV(¬mɽΗ’ÊäM€4ñTäDYætD‹ËìZGÕû_äOeLj0J£í%zÈ>2 3 6åŸåýˆ2ÊŸê¨;®Äp¯œªoîZµ³víìЖ“=u¿l9dÓ¬kÝ(ø™³ÚWí1}í›q'•d”«ð¾;ÑvœÈÓˆRÐ#Eþ¾åºÇ5"o¥·ct-¤?3mGg*IO¹2§yDW:2¨GÕæáÔo+g;ðJD°s­ z«·àÜÎ%CÍaÚ¿ðûüŒ7Ïþ9\Ý»„ ³³ïÎ9{Ì&í9<ûÎÚý8%³,1üæ$ž&Ô žÚ¤ë$¾Ñ¯?4³äìÁuqRÕÃã+î4rOϯî¿E?­Ë·r¶´êÜK‘$^Ï"J ×x·ZÁ£Mìù²öRóN}Ãgêj·Æ“n|lEM6r— ¼_ºWum™wY†¾™v²( Ù&–¤·W2ÈgYl6äu¯ƒaÔ”Ù¢J-“-LDÒfH[N@üŸ­ß&ÄÁ Ý°Û‚Õ¹Óê" ÃÈotÓ™ðÞøÿúöDÅ€Œy¶’KCz¿ßP¢Þ•a’1É^…å‚”\,O–³çM¯AO®‘­F×ÂÌĢͷŽZUQ²U%ëLvŒ'@y ?¨DÐÜ÷-ó`7½]Í«·¢.r("qtßk§7 ýœ½KŽ«Õf[ïæÛS çpïHâ%ä5ßU0àø7åmÚ[-ð¡…}§•¯÷À@$‡=ò“ߘ\ž»ù?(•ÉwY{Ѭ“_ay_ÍÊ/M6Åru±•Êóo°åfPÍTؼ§•ÄRüXBJ'ÚPƯõ§Ú=Ú==µŸ<®×¦Wžw.­¾Ú_2ÊA®â§cÄ7ùß§'}¿'ƒ¦Hà§iL¸Ps9û,0/ÔrV¾6QTî5ì™ö±F ©ß\ÅçQä5I-4ÓŒi`%s†¿wa‘d¦«pgJÓ߀€VÄ‘Øp £á·³¤þ¤ZŠ>aU\µjH1»‹Õõ–#ÿÐ9J­xIÛQã´7u@ΙÑ:³çc‹Á Þ¹W@Viš6Û•¢›%ÁIùcpØ€¥ÈVÕBxæ…mÈȯo//»äö$I¾b¶EýZ®0Áû¸gŠ·ú”©`mªÑÇR¨qUR~§Rdp~îT‹D$aôËs$H8b?aL¦cõ "`‰ÃíZt»jÅl1òZÙõ¬®•"È]5ËrwUcvWLB~””‘)Àùr"¹ÁûÈxË’ÁçjþR‹l¡¦e+Ý@€ÏXv–¶ª¹c±–÷U­ßÔœ§åkQoØ;±¥Un_ŠZX*#&Ã\´ßU¾†sÆÔ)™£~vh}/e§[õ.âyíÍKÊÁÁ5¨5ØU¶:´·"uÚùES;yûpÇýþÃàúôá¸wyyÔ95æ`0þŸ«Ù+f¨2âuñ®–QÿxÓZPßócv&Jf“÷–°rp«Åùø—‘¼’­½¡ À2ØúJýYð¹OÖÇ·Á+&«\Í?Ýõˆ]w*ÇÆW ?ÏÉ‹Y`í(åM ¤ð¾…Þ*Zˆ¡^Àuj_Ó• »ùõ5^šå¬sëÙjï!scnu·pÃQ¢9j¡@S¸¸ð,]stvvEûd¥ÇóLºGÙë¬e¯¸×6 JW+ÜXO1“ ÜøŽ—e£ó­»g]!iÎÞ6Oþš<œÅ’´Ø%ßg—x«Í2Aqq "åð­~¥QÒÅí—¿D’º§.ˆ”Á÷fŽr,XÜÂßÈßf%Y»_0¡@6xþÊ€cvaqnÑ·—ŠOþL§ìÛœ¼Ô¡~lo|mÃCÌ·6ˆxA»7.En˜PŠU£XL^j߃0`×oÃNÖ‘e[ %aÀe­‡yv×K¸÷”3Ø? …¨–eÂ4f¬ª²XÐR÷2³©Á—J«ŠHÈíº8,˜¨$ΙúEÔ+ž_±­}Uµ¤G™G¡îÇíZ„W‹ÕÈíË©BUõ¢4dSó±[S¶†uèŠ}Dæc—»3Æ•Þ{LË-¨e2ϦýôÐyà}¾«z޹®`NÆÏ+Y•]ÒœeãzChÁ¿„û1Uè&h]`ž´ÞÉpføì¢£e5‡eÛõVŽÙÇjÄþ-–“ÂÂp‘ÏKùä5©aœ·›¢¾š­×Ú¬dÕeJ)¬{S‹™Ë€ò1?ßEã#¿ƒàw‰5òVd·zƒúÓÈœ«»r±}1§ä¹Çãvüsãáê…1%vÁ“£e Ƶa|¹hZ_”Õ1&|¶7ØT<=•óR$i^Ée @7eä:ˆƒVŠ*Ì\/È¿SÎ>1]É;Òb$½?Ž1áDk[É0²ÁãÞhbä«ÐªŽHͶ¾Ààìs­9´¢#cóàVw§F¿3É} ·Õ¹6´²¸•à—§ðu W%LwsZÏ8x|-÷9üÐç*§ Îæ·Gæë`ÆI«ä{¬*ÝÉê[\"JaqÙ'ç99%9Sì68ýÒ¬{|QYüºÅN„ gqÚ+Û¹™7,†¡Ò¯[Ér:O­VV»×Ëê½Wî¸ÎmÜu±õA¤£ AØ`{i|—G^c¨kŒgåê±zï¬Á¼;±Æ_Gƒÿ ã$rëb,?Jøãá\;SfL=4‘7¶L¬oRû§ˆ›  Óón/¨^ xö\$?ƒÏ± “”»¡ÊV2 oBãÑx„-+‰O-1]aéø¼0aGÕ“X{=SÙnW;Õ‡LU-XŒPŸt5ºå>\mí"y¥ìËå×Ñçââ.¢–¸ö<͸>Bt »,vªýpå½M3æÉ$+ÛË¡¸ÂP]¤dw*Ÿ¨g±Âî‹û›Æ>‘Îघ×@`Í F± ™S—à,,ÿ–U‚0%´Z½?cÏ^÷BVÝ3PsL^³Ú¸x­ZèVŽÊðÚKíÅ6š=#D¡²÷®r—óCÚ½ /ùÞ–Æ©{ã158nkKÏm…ö©ùT¹`ÑâcO¨¬Œ™ž[.ÊžvüO"†¯úF€•-÷ƒ …,–xöÑ ÉñœYBÐoÇü C–ièáºu¨XŒÝ]ô0>¹|`› ³®D¬Í-ÉÍ·t“ÑF+ö.nQ•!’`ˆÈ—6ŽXÄ1lè\„Xcóð,̦gx u1è¡K¦üvÙ%ÛVÞ@dC0TRjºÁ¸‚­—Ò'†&ekÒö£· „²ªrsgWUöÆãUƒøëª1}:^5Œèpc¬•òšŒ4fx¬æ™æžÕ<`œ1%jx“¢êáß”°)­ª‡|SÊ!kU=`¨ o̪zÈ7Mí±†ÁÁc|{%验5"«ê!c sg‡kD‘º¢êáŸ5fšVó€‘&¾³æMBgÍCÖon×Ԋÿ,»ôÚ ù¾Ì’ÔfpÈWf ¢6ƒC¾5߈˜æÍ«Â^ÎtVÂٶǽ-?Mã¹L9³š ¿ÃîëÈ͆)<¾Õ/~@Z £ï°á¾ò6›ì[l®Þ·æo Œ½BlVÆÕø[=K³h/»ä{ì"¯›Ý7Ê¢àZ¬Âà`ViB¹#”OÊ¥Ì$«êŸ^¸³+©ŸWŒÎúAQ)OÉæzz|68¾˜Üj•y„oÖ‘ù϶i¨m‚VÌwÔr?W5R¸Ÿ{6ùõ`Ð?(s±Ëæ•gaܨ7ö±ŽÄVë=þìD\Ó)y8¡`7â›ØôcÖ凗úaƒ¾¨}{Ö?f¯°:¬¹7‹Å!ÝaJÇ›–KÖ¼Xr*Yi²Ý­Ëƒ r–ýämtrrü`¼ÿOžòP(=”ÊY³G3X9†ãìŽ]íËp|JñEô.s'QN×$¨ì;Î/ 3Ĺ•ÞÜg'ý£Þd8áFf(ðù·ÇëOtÔòX€J;²DÆ•pÛ.¯Êv:«2U©š²ÃœªvUS)QRæãÏ*О吝ªÕû¾žž›®&ÌÕÔTýºFѵ«Ò¢¤ÖäÀUðåä@ƒÁ2êZ‡ô“?±¡Ú=Þ_7R–`]ëÆbÏZl@¾Æ&žº‰$ìø¢ðÏùù¹RmãRJ¬®pž|çvòòLç˜Br´|¾C—2®bÐ(ØÞžp/›ÁCé ¯_cå1G>Í*ˆ~±[ì©¢yñð”ïðby° ¯_ì–Ï4«ì×XÌ@³RÐŽßg3ͬ\ó vVÜfw3þÅ®1ø§Q]Í‹ÍF"À˜T< !Ì6•úÍô|Û5òöè°(xb&¬É'xЫŒxçÛ,aгÑnó"§»ˆ •·iIRAh>¥Úx …@q¹&ƒ8̘À0.„áI |o·õÆŽf’‹A/c5<üŽ–[rÚ¸ Dû *Êì`J¡çå øf\<påÏ‹æTvÌjEÌx BÑlàé¤5‹ð\ËB:8i·W-æ1Å”¢ÿQn±ÌçÇ$ZWÛ¯ºÌvÌ·Cò@ƒqŘ]RÖ>›m^Üf±Øãßi1Nò ¿V?òÙ7i_Å5ihRgœO˜z&ÖÂ4×aXŽ˜ zJqÐÐ ‚y÷"GEAeܦ«'‡Ø[.õ‹Ûn¹Í$R¾þ“GµƒDbwÛK¯&ªUu!€ÿä6í!žˆŽ²³ï®&ÇãÁà•RW7ýáÉ?wB×5Évj{Ñä ·ß´Û¹|„Ã`Ó[¾Ï>71Ã9­ã8µ¾V `šoi¹cx¯EQƒ^aœèV…ã„X‘½ì¸ZafGL e»À™Eì›PUŸ=&ÇÕ:8Ù­„§¶gT«žF0…)`œØw“xʼn7qâ$Ä ƒGnâÈÙçØML¯'Nœ¸ˆsæ:ÉS7qâ$ΜÄ,‡çnâÈIÜsgNâ#'qàîÆ±›ØÝ¾›8uÎóÀIúNâ71 ˆ¼wù=¸Öw«Eõøß›7ll½¯!í³©{³—&Yf ¹î›hï%&¦Ïl¶ˆ+¸,׃§§Béš-8ç“¡°6וJ×Ìäçöh͵à3Ç"ÃC š Æ&1{ƒ˜ú­ð>`„°£·+ŒÎü‚……çó•uŒ) æÛ3xÀ›×üfÏg·ž˜5˜©ãuR·Á‡2*:ßÐ…ÔZÜÒVòu%¯¦+ŠzT~KÕfr2\ŸŽH鋆Öh ‡à3˜ÍØÒJµ{ ÜÔ ´QWŽþiªPò»F_))xðZ"‚D¼ºZÊöܸ%ÆÖ§ƒ-¢,°{ŒŒäN—èÇûÙèO„Öw>R¥†ð ›ÍW‹×g6¨_ÏÞ¥ðWÏ_s*ÆïZjR*ÆŽ©RŠÂ€Ã(ŠÚW³ÍÏiÕcqoˆ{5"x*1·-Yµ|®Mæv±ŠÌ¶rCÌœ`Ðð¸wiÅt˜?|Ý’—ð Z’oÙÐrS>–ËrûI.ðdQ³ùp­Œ½¹ÏL‚É*aé´Öî홬(¯uMë:]+웫jQt¬ÏDʳ€mLÁ¾(º>Ç™9S˜Ó3TÉqÿ‘槯 Œ·ÃÕ?{ÎЀ_)è;‚.%¢W‰F$n¼‹Ôö¼š­U(€-íK)yoœœb¾´0ÝžR2ÝÆ¹ÅÓÔgï@ha»Jâ‹«ûÌ$¾Ìù¥B¿%$¯K!±É“éæàã`Þ·í~ÿŽ˜dIJßi ˆÍŠùî*@³b¶¾Û¶YÒã/H1–-¬šÓê£îðC9çïVÝÄŸ<õYöuhÀ}‹s)C-QýX CæØ0ù·Þþ¥áL˜…-¹Z¡ž _,<®à\«? Y?㘯zŽ´ýÝë+-³£Ë);i˜U‰Ÿô™C£J·(x•áÎf&µ«ÆQè¬ÚY#‹øë“j0m@«‘œ…¼°*Ìm¡Q^d±sºÉ2?rÕȺ»åGŽ{':ôWËm5î¨GbšÕo«ËîÁ,b*í›c–Û“Õèœb#£v…=Ç®tÏ/ÚZ-ÑÞ æv¼Êžå˜µ—#Ô螪Øó‚öWU¾Ú.hh \­í[ɘ‡ÄQeßJŽ2Wÿö­ä¼uÊLÂ`ïL'a»¬²çûíï5öÎ4³ ²*Ó…¸9íU)j|ñm f–»æ`Ï<çÜtC5öÌ3‡NÑ5ö/èȱö¯g/NÚöí|î‰A5:ç8!ÓUaÏD¥Ü|G¾¼]0ß1ú=ì¥í­™íŸà8‹5öLpØL¶ÿúŠÚ›>Û{9n–lï 瞣¾‰r{PA’=7~âí©¼÷jÊýÀÚgÓz¶2Ÿéš‚ÃççžÀi$ØIš¥‹ð´‡:fœlk){z¼,íóÅ“FQ…¨»B޲=XBCSÁOöTÈ¢v—‚}]â{WW •Õ®p»¥®`946ë4$Êm-doÏïÀñàÙ¦÷z0" ¼Ÿ´øF¿Ë7#okg€q˜¶7á1¬Ý¨É8øSÇí9n ÑÿÒ·ƒË¼5mÐù_ésk½•ka4ì—³gt¯hLËp¤³j\ÉsÆàðpEGãó.êæúkWÅ»¯ZÌCҸܮ®fkçuþèœ×nW‹ê¯ÛëþÍ]LÏ0(Acñ4€S<–ïš* ƒ¨´ ÞüŒ/{#|ÖÚ9â˜EÅÜ®–åêgO‡¡ÙŽõ:3Ÿ-g™¥WbòFÅId~Àû¶ü¸(`"¿ªÐAt¯ýoX[UåK˜¡´Ù«/°ibkžDøÞãÁI&á’‰$U8«Ý6,³åíª.žtHŸ E&ób–Jw†g:SåeèÖÅப²XíìùöIpë˜igoW[‚¡qç¢ÌXhTõú[Õ³˜WŸü»ƒKå; ø9xWÂ%&âfNªú¤ž½èWâˆO4Q‘磸ëã…K+‹HLO¦W׳Og† ‘{YÝ/ ÑãÀf­CrÞ_Õâd‘8Üë‚ùi/Δí †Ë‡œ¯Oª†'‡“`Ÿ§Å³¼*ÌùÑr×ÌzDx9]ßÂh2@Ï8ö¯}:ÓÍ‘ÐëÍ–OÛjU•Û×ÙZä«™B±½Ç¬êٲߌªÍVø §˜±t-q2ž^L­™Wt€Å®.6˜tö*Ø$©qÚ‘T˜øòf·ÑÎHÜ[o±8:Ãu*äÑÉ 7¾ PŠ ÐŠèf&*Šúp¥Íà+à#ÙK͆’ÁrY®7¥Ti*e»”q¨„fäæéI:çzÕ˜’)…žq@Õò8š­8ç°Íûܦ@IMò6þ †àuVo‰Cê7»%lÂàÁÞåÓê²|+¦u9{.ú»W1?Q’{ŒÑL½À—ùÉäæHLÌ/P ªº¨—Ï»j'Ž®bµ‰6=JÄŠ 8àT5 ˆ †qí—圖I€Ð÷ý»£«>û”“bù cÚŠè(Ì*ã!0;S³1Cþ¬ä;¥ VÒý)`Ë·>f·ñl†Í’±årW®@´“]šmgÓŠu,¦‰úïnƒÉ½ûÅÛéìõu&wdÊBà…r,LåàCà{¯fK¹vÉ!J8w‰X%ù¥ãÉ R_5ïÉ-¥Æ"'~Öú.µ,ÐØ’Sü¢ Á<[Ó×µ„Ó>B¹‘—Á)œ¦°ÛñCˆ´Qqd.AQþ7æpúÄ{. ,Ù;l3Írõ' ä§•Mb Ütö,[6ï'IVíæ/ÃÜSºñ€]¥‚NfXCx¶ž•‹éå±é%¾z6¡ž ü^Ø|Ð8i¼©)ð¬þB °Wõ€7!¨óâb3WÅqÞàk6JútJÞ®Êyµ(Pc¹zß=49w5  •EÌgDÞáJ*žkŒîaÄÕLíÙ<É-Fïpo©\uÈnZ5ë—™H‹Gô‰X®IL»ŽËJô1öbð€?ÏË5:²ÒµbüÌX …âKâуX}‚Œ¹‹ô6Ÿ«¹ìpQç Êém·3µdpÌF}eCqt5¹mx$â =Ïœ®úIûð"’¥-«zª¥^™nü¨Aº~ó>~Äìb´ylNFF-yhhvKL3‡$¢iI—¯‘hº_ˆm`Ü×®ò£åvò¹9çK€~âêsÀï½Ç÷2/]œ›!Ëßÿ‘¿'&¥ünze™Á[„ßaât…„Œ P0œ‹¥]ŠÌ?cŽiÞXI£D·mÄ ,)"” Äa"ÖÊÍr1.ÂÍ‘ ÊífZ]ï$ÆÀ„å£×§Н"À ŦË•ˆáö¢Ö™Öˆb "`jcRû€Š%ÖˆTË‹uj| ¨TÕõ & Ë8:ñt r¦&V nÖÅ Ô>PsÁYÀ©Yöo(æÈò‹™Çù´©Ds8£î1tj`qæ9Ê0éŸÄYÍÃÄQ®O>kâu”‹æ"qRà|È$|¢Mùn!Uî±ÞߊääÖ„âD*P!d™˜É02™Žvå§ñ‹àýP6ãj·U’afÒRÜ4=}}ÄÛMXªRY3‚Ä&8+_ç(£Éc-§Y…`/ ã”ÀUEÙHaqQ,‹ZÜ0œ7ÑA/2'¬ ¼†Ç–nÂóbÚ?XˆÂši?»(ký ¡ãFne2-YXœÂÌ[3c7Œ‚RñašŽcÃ^½·ð”|^É£/5)tué#Bb*½€ÑŽèÂ9ŠÜæêä4(šb½®€?âñ¨Œ*þx2‰7DSŸRõyz4­îÿ‘ù<1§S ú ¥°ÿ¤ÈûHsºDež™Þ“”µ“07Ö¤bý`=Ù=®Ë%ö‡YÖ À§ŠEbZC2±y%À+ nE)=LÊÿB´IQI&G“íNJÇ~Di4YQ ÊH&Æù ðÛ7†ñv±¼5º0ÈlŠÆàÌA-ÊEÜŠœ<ßb- ¤ÎK¾@ÄOÛÝìgW‘”oŒB_Iq[° ²4æ_v‡ÐbKNñ—R¸ñ™7÷2Ÿ¼Z¸I6Yüc$Ê W›gzù^Âæ|%²Óò½ÙùOûeKÚS§EèS+H'¤%¡¼å·-ËGÕ;¢‰ü»+äÞ¼8¥¹Ð‘çêù—Âþ¤êk|ôV›²!S#|Ød x€˜ã[QÀMzuÓÜ y !ÝmòÆ(P$‰× Q"´£79}šþÂY‡‚´X2ɗǾ»njTilç/wÀh=[«O”P£¤3¯fõóŒà'ãœ$¸. ~7ÅÆWR1‰G"óWýãlá¼1' –‹V½ãÌòÉÄû‚NÊÚðaÌÕÊIñæ…ÙšO =Mi«¡6¨wdN/2/#Yd??¤ Pבd½'¸|ÜÀf4†KQ rûu—3f÷–ògh¢…%2†ÊGÕ‡¹a(Voâ±šÕ ©|R˜ñ&m– ‘ðç¶Zªe9ÿ”×Bl1±ä‰e ¯=£“©N–âÑš1 TYŠçõ´Zƒ ýü)µI^Æ<|-ΪíEñ)?4)Фæm5•Š/ØÏt¬`É3ÂcÊu …%¿©o2I#߈ÖNAEm*mŽ/ÅØþ®#Xh•…![ºPú÷®Ü’J!ƒ™Lø`¯ò!˜€´c O¾½»›Ž¥ÌªŒ7›¾ ¡ 5Q~wv‚ïyvb‡,+W›íÌày™Åa3Ÿû‘4 ÌgKýæLJÔãkäæ@SšÑ’{eæ©süs½Uè~‡5£ÓJ¤q@2Žéû/g›xZb8›Ìœ/‹ÙJÀ̳iSãx"ʯªU Í¡†Sön3YàþRI‰0%×A~»îŸ å¦eç–ìÖÀõ>ý¢U¼)žÆRDj?lÜíN¨ÝÀjw·>íc»˜Ö5± ø£%F¸uÌ#Q‘É‹r›áçCĶ¡LR,$QD²˜´šözGG#©áò ‚¨Æ•¦­5,Ió‚€;ž^lŠês[ÈÄò}é%¼Š`3‚‹r>[i[EžˆÛl³“ªL¾‘*Emßd rÃý‰ÔwB_|:$ªVÞÊâ]ðšÈ'‹—dö°Î¦ÇÅr)ç›^S²L)v—UÍ´ÿ(‚HÛ^Í`»~„¡¼™£¯Qdð6¿¼özêmžS7àj¯gåJÃÿ\F¹cÒ*Èübò|‚ ¤‰òéóR\¸AÊž0’Öe 1÷RU>­ÄMY½¢ÙDÂZè¨cOë"›|¾”‡OD«~ý)ö ÅØýˆ~ê×{­~¥)Yò×½4Z 4,& ž†“ªÞÊEøžÏ³&¾ð©¦ èèaq{½{ÅS—Ê ÃK)eQÎBA†(fð->…݇jxÏS­3j­ª6›Á‹=£ ”TRË+¶%ºdXåâê låNIU¶Æg‹®ìÃü˜#BÀ²šmKTØ “¥à&>mA@yîÈ!¡Ýu„žB/‡È®/ŽQµüÃ$ ì?‹Ø í£!ì9¼®· ËX0ô/óZTãç•”Òšu#HNf y®'‰Û%¨O«u5\•rÚŒ_$9]V³eo[½ê®ÆaÞ¢ù\¿ I X] 5]¤™Á „Æ+í £™<ò"Ïx H*nF®$°×ÉEQ¯Š¥_ÔÅc¯…«bµR“Hd`±sybבi±ä7ϣܚ&µ pxdˆ@µÝïQµÞ­UÛ D¾½2Tf”É®•X$&¸ÉЬÅ#"¡JØFm ‰³Äî餘ïjxÉ¡ ¨‰±F!òi²ín^5â(³¿èäe·…cbEs6¹"Y?Ê—ÈÆô‰‘ .í¥ëjb3|ˆÊR«F,^N‹úµ\ͤêJê“s{¨?àŶp†)û¡$\l”%’T¡xðÜ®J“K\¾_"ãp¼ýè—›õrö9¼9Þ.ÅÓ#§ãJѯ¢VÒ?42ÉÖ„bB¼mKüVÒb“›·bÿxpVn§…6õË‘%<ÊÕõÈm“¨L7âLÖ “(>Šƒ‰ íŽ&g½ñàa<8y8¾žŠ“Їn[]”™Ç@Ú‹ßá¿~ÄÊpJ,¯žëáF¬™ñNd¡’ ZJÚŸ> «Íùn›¨,äs“š)U4p@Ë’Ä<Ä¡ÄóÁÇ_½åj·ÕÅSù¡Tð(ʈÓ¿#›)œ ú“C+æéß3a™[ˆ)ß–~b¾$ÑöLxvšã‹`œF+“¡§ˆ.{|ÕòÂı›E¿ÿ¼üùº—aQ³ÒG†~17P«RœÌs³-¡Pdת8ž¼D_µýâ ú4U‡a@ÊC†$.Ìgt£û… Rd ·AÏŽÔ[/O3cFm™“ 2VPxIr¿6Ø…6¯ÒÍ Ÿ1£HðL¼~ø™Ónågõó ¥ y @–~©s0 ’Þ}P [dF¯ S‹ïÿ¥GðS²1ô X"™è¢`:r¸'#š@ Qém-HFðDÇŒMæԸñ ý\€žÕYl9dQ`|mé]#O#cûG¹R'/ ÈããšÎ"/¡ JÒÑZª4Sê©(’öÆ™’"%ê›Ep6ÛÜÁ RdýsªÜðŠ¢Ydh 7΄ØT왌1­ÃC-ó\…¸LK©fÁ¸„™Ñ8¡]GE“Wu AÜl\ëî³0I›¯èSžÆF3¬§§6|Á$·›÷*N½˜ô©°[Tšå²ÞlG²ß9f#sÁ•_­D•±ÉEª†4…®6æI§H.N”±ØèßtÁ¥,HòS%åÀS>öí‘‘ˆq7¾”%e¥)B½¯µB±•å~ƒH®û³r¡v‘òÿñS/sªK"Cå¼ç"(6Rº‹#LÙ¦T©Y}ãÆšš\ÝÄq™† ÞrçA'‰7ö1O\d® „÷ gæiU-·åšN³StÙ4WšVj’¥o¦ÞË´ÎÓ4sRlµÛX'Iä"N½µ«¼4§ó~+Ķâž@«MatûfMço“Hkí1ú,”ûã›+Z3ašÄFàÖmS±•e¨8AêÓ.F^–Ð*í$׉ùéKµÙêlj’xZÀ2µrðÆhˆº\(QÆ'Õ]¿|;é'Rõ‘š4AýÊý\üšåF=ׯà>÷Õ¯æ1¿ÂóAýš‡0–þì«`Út}c'éW(K©¥7Ú½®ÍqäÁ«BÏ:_‘cŠEeÄYxv.0„Yß!ïFx¨ÄB‘öÉÈ»•½Ým§4@´õÑ÷X<0‹u~‡6UÔb Kvf‹0§‹ž5ª™Ø‹ö'F\HU…KGÄŠ+x]Ö¤j‹ŒÛ8–j„qéí„å˜ÚXæú2ø3Ó¤ÓSÇ(¤p1HrNÆâS¥ ñ€á´®*iE{UÀJpT\Ѓ]eÜût¹²‡Ý(X¢žãF)ƒ?âA?ܯbª¯à—¾]©q•ÔDª Ä;’Å¡èf·]ª™BMWÈŠ0wßÑn»_!d,£Íqò…}}·œÕ2TO®À$åLùºàTD|î&ðäE”¤Ö˜¼—hÚ_Á½Tb)Š||HSášJ^%Qž¥|L_v¯ÊW&´ZU‡(ï­O+õáZœ1ÿ; äMZšÕ»SË¥âqn”H…ùËj>[žÖ³õ 2ä‹6„(¥ÎCº'‚Dï7‹F/ŸÄCPw6»«2æ|äúnWžŽð’¦#JåÑÇJ}Ö 5XâOå3t¸‚ÌÏÂŒd„ñ¤MœÓ«Æ˯)…!ñ­@ 5j$ãFaâNL0>Àû­z>®2Ñø6ŽTÆg ¶±aÊ7%Òã3„îiª?Ì-ÞXžÅÁ±Ï¢&7 ¢Í\`Ñ£åSv]²bÑ«@uRʈYMó²(Þ†+Ó¹8'‰³Fïdkb¥¿=nÕË(d ¨ÏÌ 'Ô*v´ö ž71eX:Ù=ƒïÛÆÊj&½MQè+ê8‡®Õ “Ð÷Â3XÈxgd‰ÏNÜ7y¥OàŠZaTiäù¬øüèØP¸–H¨uBT5¬–äGºË õ¤1ý£žù[ýañMA/y‹\v#¦§¤"Â-ìèFÌÊ|Â6*•+Š}LvS¼5{%ûÂÏ2$qN ÅŽJ"5G5⓬”Û t†¯}"³úœaˆSêÝJûÔàôû™ÅäHSUcc¦®¨U8¦Ýqís컣áô¤ªu·äÇR¢N¥™ðÝÍ;J%)§ãÌdîÖËR/íÔºKï¯"¤"2ÌJD‡ñÐtÂë"ãg‹27ø°6¥8Ê%IF× 'QÇ·¢¡£›Ó ¥ŒEÄ"~2VèÂät2]±"%–&½…=Œ§ƒÊÛÀU/˜WÕ˜íJF‡Œ“°9kjŒû9ÓÃ×®e±NšÃ¸õ ‰æšä󨙤jª9“Ê\“Ù½3Ô*œÃË›³u5ƒ%@ß7f*'FÁ?/<Çó¤M"®Rñ¬n¾èyæí«Ó$o-DE®l‹Ž|çÐLé`¦6)¶`ü(œä \ÕÅE4 >•UB“ŠDW‘7@oU¾¶6]nÌ»61º?VójiѶú"i¹œgÑçMÞ"YŸµçM#M¢tRÄ`¤q˜6×úȶñV]=£ÆDzV 9 ߆|«ÕΘGT{Ä©Ïâç-îÛ38Å'èÿ¾yjT—U-]QÝè¸Ð!j›20ñ³aõÎ÷P5W„öa3ÚHœÌ°9ùøÕ­¹ŒšGÏv ÚJ›ë›ãð+ºgÞ_ÅA†oæü™P.) À2¡6ÄSQ9‡øìàkDð©‹•1«}ŠŽµ¿MG±9E‘4a³ŽOmåë,Ó(HBe6ÝÉžX¨8—ÝÑ ädIùl‘ÒËѱŽÔDvÛQHsºg)Ed«'êi¹ÅPií ‚<ϦRV,!ÐH’ ot ·¾ÂcèÚýQ”v%µ¡Ì}S¯_dø.Óƒþ£·.¡£?@’P>Ï‘13ö?ú á¸[÷?´8!-Ff©| VϽåV@ÉÈC]øzxÍ’_DiI0ŒÞ*“Î ›åìtQJ’8£"‰²j£ûq x'¤Uƒ ã UØè`È[@I3·ÊÂз ñÙ‚¾ ÿŠ‚ÞaHŒc#†&è~Ô,–7 u0òš(§‰ØèñLP'žØdØíHl Úƒ.wš,c—"T³ÁxeVŸ‡xïÛ“ó¾ 7Ø™æ-è·o .¢ïžgÑãZœÔz=«5ôñ¾*?BŒ M«tþÓÌIøºˆkQ(„#8)ŠW=ˆŒ×F¥šˆÞF'š½«NØ´2]3k 7ϦP¦'Ö¡ÄêJ¢Cðz2¬1)Ðw>~«!I ¼2¦•µ°ãÀÚ:pŸIFâÖÜ›,^^f­b¾¶ã0h;—njíIkéy£Ÿj<¬)d•4k•µI$‘[*¢ìè’¨‘âIwÇþíTPŠ.³G'»ržQ4Á}r…†Ö"—fZªÖg•…lmDy»¸±\kl çˆ/1k_Þ®1PTõYhÚ $"# ÒËð1³Íò îAA'ê¦ÚÛ-%!6Kbø‚Rš»¿˜Acf³yNšýÓ¢”ÍÖeåZlÂÂP—¯%&Þ]ÜÞÖ½ù¿;`&DpÔâ(9ÐMl6ƒTCUõví×Ë©e§fçÊ“e¹>€ìT+Ó*‰FôŽà‡‘èV0ýZ/ÿu…“²X.$]–*çaô¿Az*XC›î¾¦”>×3Ÿ”Ï«Ùò«Î+µìa N>|øšêg(ñæî¢næ„íØB ü‚ï´^û±IÅ$ðŽö«Å×7>:TæE­Ë“gÍ.œ(ï1,šV§ýáþSåDľ6®nלœ '–óéËnõ³ƒ¬†ÞÛ¬\JÃŒ Zé EH—} F<­ö”™y§`ÐJ<ý‘@;ˆ>(RÂMñåF÷Keö‘+a·$ Þ/‡Ðíß®†ìtWî›.nÓA!W.R½.éÙ,ˆ†Õ\ø ±Ò³/nV-ŠÚEpŸî+5_}ÿ²VƤƒ®|iSS³÷Ûágïø½lÕi×¹†ÇæÏ%¹ÀI²ÁvS?¯º)v¯_ËðÈn,—Å›ðeé Ñ9W;› ¯ò|¹ÛÀ^Á3´›ÌzºI$\êçH)Õºw›5ÌÓצpqÞupº]ͯ ùÓ 0O…lºË\¢ò‚SÓÐA#\ýEP€ÐùÁò|.öRp ±+áð-¯Xì%<‘C®‰Ð·ªJq´œµýÁëcµ\Œ*íî¥Fƒ)‹Šoõ ¼&ã¾b“€q°BÈŠñå ’(»jaJ2™À-5ÊI¸CuŒ†ÄŒ ˜ ©¨bè9 3ðCÕZK)öžÌ6Û«<•¤ÓÙ‰^ã³õ‹ŒnG„*cüu\W8cš0í&”J\MHãí ´ø¤8¡|…,¯ë§>°KÚÏñÄ#DVM5‘⊡ðã°Ñ‚ÅÀ3&ÛF±z¥yžqáHÍÝ™qþÂ" ˆG[$ "6 ù&BêRã;…¿ïž…úÌ4²§¨¨— Iƒ5™ÄªiD¡ @Š˜}Y‰Øñ¨dÎ$ bÖqƒnbƒ’!1©PÆô*¤'(Œie>«àN1†#ÎSãý,ă‰)¥Ò(gËÞèË<#>ª„ZMx—Xx¡„¡G0¶F±ŽAHcŠø6…RéesÈ'}Ì<1`¢"\™¢©4Žü&6¯ädJ›Ö˜­ …/†ŸÊJå#/M³0i¢ŒM3yír#Û;&„ï+gfiÞœŽ;‰L’æ>ß»ýâqg¢mp}óy”º m6çˆ}diLrÂ&IRX“œ7™·&9o¶ `ì0¬×(zM! MÓļV¹ùÆ}Þ²ù›e“ÙSsN ’›¨^k|\!ú9[í*:F•0Oxç…3^Åt ³öËíKQhÉÌ ¬™“á_ ):Së«~´ GtFLñ%ˆ2ýF±LØ” þÝÍ–fÆ2¾5ˆÖ@~qÈð=6àÌw4–ßé %,c_Ê–úf^èû¼ÚJrPÚ[,jí …è(žE¦SdßÉ͋ѭlþRèØ?KB>Ϻü»TÊ…8j׿¬ªŸ·"N9ò3>xÔu†pž‘]P¡å_rÍüÌ®å¾P›¨uŸòà ×)[Ÿtu ‡LmK½„Fæ¥j<j9âåøù¤r=ÐÕGl þŒP² îTàã¾:VÂÀé ’Rê˜Y]çVQ»ëªBƒ…QÔA€ýc#Œ²ÌEh°I]ÉXçs]ÙKŸWÒI·OœD2c¯J(ØSNËùO­(šN­¦§ŸëÂÇÈDîÓì]=[Œ˜RªæájHÙ*:›*¹'ôò­OÊsSq[‹¯ý¡ êu–ûÈB±±®<¾P1äUUFëàBßl5I†`¬ÁÀjHɶ£ [©¨…˜JÿgŒ·¢9´ŒÆ0 ;¾°Œoä”/Tˆ/sÈQȹw<â|àd6]ã¾5tÚM"QÆo£ËõÏ!u-—rz3ÌM¬¯fk.d²é+8Cœb«ÙõÍŠíOVzÒW£öXo­rÁ‹,¶š·ŽÉ‰ P6!ý'œ~üyƒwT¶#D§u óý¬ÑwÙ¾¤ù1QReN™=æX»¥ÄA|ÿ¾-MfZ)”ÄkÕÁÈ®­©Ô‰8Õ5¬ÉÓº”ïê˜Â¡H‚ÙМ°kÏÄŠæð+;lFËgm©L¬ N°G\¤cãVá…lkHý–K¸;’¸‚™ðð¦Ë€ü©5%µQZ_S\Ôèψ€™âÜÓî>?—›”pÙý»+VfP<,ÙdÚÉçf[¼ZG˜n¶œÙ]ü<^,Ä‚4‹¢ˆ§H(E¬w[Úca±aÂRÀË„–®¥ `;N‘´„Kvb*¼“e5Cï}±Dµž†[б`ö榢 ¨¢EÁ„…”—m­Á²›tb_Ó åóïÞrÿÀ!¼.ô&Š…LIм:'_]åôEbWKÆßõmÊÉb¾÷æ¨Ü º7y޲ñÍH¢/Yš(¯~"Б-œÆÛ.’Æâãƒ5¾{ÜÖ3~fìë£êíF†á± %, ät²ß ͱyT'Í´2çŠ9tØq T­Ì49ƒeãšã;{®¯©6eóaØ¢hœº!ïä«}~£ÝH±5¯­;ÉâkãV‚Û†¿¤Ž´©]€ÕCë@¥t•“ñhI'e >ÔÙÑç;[ B(èdïáD6 Ûcs¸n]M>SfJT)›ÈŒ4^žùÔôîGûËgá «z£<ÍzÙ¾kØ-Kæ!!¥RŸ‘!lµŽ(ÿ’3¯'G²A‡7DÅÒ)mCEzRÍwÎ-Ê›­uLƒuYaØŸ&NK&56{VS [IóxCÆY“• ©U(¶DØ­”6¥dl25Åíp44ŸË䥯sLx-”£êy·™ÜIÌÁ0cÕ>à"ß2õèC¾•n1¦/ý±[ÇóñNæqÄü8+‘(Ç*ñ&H ­b(=E Sèû°(T(*°R«c6cÎ0‚Å‚k^=‡ï$â‰1kŠ(º»ÁÉñÍÕèf2œúýã9æ…ž¢g®aÿÇÇ*ÌløÜ¤I¦Pül2cй·Äri#²¯„9eÈ=Dy…˜lž¢Qà˜V}x Ogõ³ÊÚ–н è{àÂàÏŸ‚UO@l•_6H1œ, Ÿ'ÿ ÝGˆÞ(ý,„êj¶Ú–ÀQ‰$1ñkä(ˆc³ÁeÑýÌä5Ñž¢ÈÂaË,† ¨^ÚøPØJvÒyÅVH´NÙE”ÒèhT‘zÅÙ€´*È`!‘^üÎr‡Áöâm`¼¡:ÚgÅZ½ÅBÍœ±Gë"åÿ„e/3:é€$ŠH|ä“«‰D¦Nù4k ØÈ3ŒâgñÎÃ#ŸQÌçñAw&iñ…>’P›ðßít¦Æ„*ÊбÇÇÿ£,ÞÅlRâüYž§ÇæûÇqî*×–/(7æl*'”5LáfLȧ×ÓLÌ;­Öê¬B|ý1O¥ÐÚà$ÒõÉ28;1W©e†‚¿DÏÊÐÿÇ3år^y±o¬¸P,TR§ý¡Jw/£…¯ÇFáÉÍÙi±:¾ú2˜«[af%F[#¦Cî'v^àµhz¤¨înÆ} í‡F-dŠ[ØJ©Ñ¾kš‡³éäø).æ Ç׈x³ŸI\C<ê€*©ÎP¥RﻌxËlám —‹È&ªcJpuÁb™ùP´^KôqñÒÄÝ…>#À˜t(NÆŒ7L}ïQ:ä’x¦òác\Ä7Áä›Äñx$…hô¦á7!iX™Ï qQ¨Ñbb9ÜS}Øg«Â5†Qš(`?œWÇ;¥©|ÞQ 3'ä8 òfÕ‘ÎJš,JPVUr)¼| Â,“Ê)NOéuD¤ú ž›óB€òµnª IYß”§Jû“u1.¤7(eD«Mµ´¯“À¸ÝI<~ÏŠåZ0@eÄYÁû›P£És/äÓË­Àª†ËšŠ›$ÞT5}ª(ÎRÖWál" VÀ~3/2ÐüöGC…T¨¾xÄÙŒ†“¢fA¸"ØÇ^Zx[] <ïÂ?t8l`¾¢ˆ¢Üg§¯½§'”à abg]*@(%À›~,ÜlNLº ”<©m!Ú‘ÌHáß Kºà`umì/GÙH9H›¯8HX/ùølêOo‡¤ìS€¯): è™A¾ ¢“zqÖ7Ø[y„tðmÏ^«…ÐZ W e¼#ýê ®Ã(™1;û*2[ÚaÈVÉ9LÌ fÈ¢LÞ”K(.ƒ¡Ê’’숂’ËÙêYz¦Ë4X);ÙàÐÃ!ip`xðv)?ùâÔ ˜LnzØ™k—«»8dø½ŒÕ8ä>æ«û=\\!j†Ž€Oâç¬hc„«úªb€î ¼¼Ø•ƒàˆúnN«~Ìw +Ùqä9ŸI±òQâ¾g‘Þ7÷‚€—ItM•H: ùžeQëjAf­wõVçÜr>ŽRÏ>z°¤åp=v˜Ê>žu¢Yß:˜D!̺Öx'~jœ#t±± mÔSÖ cq}̕ϢìÐGÉI¬P:9QÉÁN£ëåFª÷HÞ䟼•~šÄ=¶¸nj…Ý$2äag‡O×ÕvT¥ZA06+ÑÞøK Y”JŒ†qL©#²ŒS*X/féçðra_^Q]îJ™†1ä×…fKBhŠÉȉ…˜Ds\Àû–ßåêC‹»õkǼ1¶Œ†²~%CÆ:þ¾Îj$=è•£ŽgÌ ’N€˜‹ñì½>Þ¬H#§pð¢0´ølàV:x@"}6súIãÌg_õñgU¨PT[ÐÔ²Ìa0E…ö˃÷7_À1ȬÏ4N=öu&Ÿ1RÎ5[šñÓf B¶¾ÒÀÀ¤ÊìêbºÓùyiü{„ v )0j|e„€ä ¿~µÌ›f» Ž@qBZ¼¹Ü­ÎH;I2f·O-"Ó ˜^°íb¶Pé® ñ¤ —ñ…‰Ï"ùhÅ›¶~¥Å%ì“ìÊ᪺äLV†Ž„9 ("/ôøÊ"µ‡ÔÝžg9—iBàtæÒ¢,ËNl1áÒÄ]ÌW$.í AÆ@™Œº"÷ù"×tM 5#%¿¡²Ž\KâžýÌk\“8_D*„ÎPªtí¡éI‡i‰íIGméÐQiß.uX£ ž‘ÿ_*+‡ ÜAFè "·1‹£! 1S‹n¾,}X¸}3ŽA1­d\¨êˆ\¥§2CiÄë·­˜áæ)Û&™EÆ*Ö(—–LF¸Ë­VŒ†©¶Z5ºE¬yʱ”$dԖ“o]¬L<³Œ—cÆx>""g¹Bšð)˜ü,­Ö3ƒšuZ*ììõ¹n†‘$ô)ŠŽ µ˜¾EÑ[(ÝE?ì ,Guzäèúq2|\¡RJ> ¤’%‰Áê!2MsÇD£„¤3Ai>N+Ñ ¯FÆó•Is|ä(«M³TO€ðáHR¯ÉÄœ€¼9̈ÙãÌ…þø¾O0¾Da²5e(Ï4;t‡/âEõ¬ Ãþ-dü³¤[Îø´,ŠÚµ€Î10bš3òæ$2ÖOÊ&Ó(npòE™³ÏÎ)¥ pM¯8̾Ô[sô‰ßäFÑs!»¨Xj&3=ˆÉYÂ[À´}…pö1¯@T·“r¾Ö:HR©äNÊË­8=©qb¶­4b¿03K¥\ƒ£‚´,@ˆ- ½ NCv7ãù²Œ­lL2 Q‚d6Œ$²j"xÿœ—§i`UV1ÓÛ@±À_eºAa…5âñ¯+P0[!oëýõlöÿ1ö¥Ý‰$9»)÷å£ ^xË cp¹{¾ø`À6ShÀµÌ¯¿Z"Rdâ¹}útU£'##cQH -‡Éöõøk¶W)¼Û,©ì;uÀ}‹‰3CåT¡ŽX*‰aø;z¸Âas‹G>‘²$-Ôîê@ïL5ê3.6‹«ÅJ jبÉÔ áÊ Ù~`æº3ìÁGJ–A“Ë[8Æ0W,DÈR9)­1x=ѽ¦ª¶2O£}…6ùÔ”e«69ù£Rë:Üå3ÄÝλþgij ÀsÜÊ~œ'jþOµ­DçÑut—Y¢Ì u?_ÆùÛS¬Ñ£x /G® ,‹a!µ$ ܽ´ãôP¡VCA×F;<Pÿd?vëoKuX]ù˜’'¥ütg oêPüQCäú‡‚*i«.ȵó¦—'’½D'¹ý&=SlªˆŽ§•+†/hõÉíé÷{öû«K-kÑÍÖf³Ý îŒ'EÝj~ê.·ÎÎd" J޶‰,†L\a¦­ËÑY\©’&¸CF'¦‡T>›Ã$ŠòüÄ»+)[û.YE¦v hŒXpê7ŒGÕØÉ`¨èT ’ˆ&‰LÚ,³/is»;™¾*+ÍT«Hmt{Nì ¸"_$Ó Fo`XŒ­‰£^‡ƒj'vøÛ+{Y›Ûe ’"0uDEžG[·º‹ayÀ­ÌÁÜmRÛÉ%·T”ÐæK·|ªh‰ÂUCÒœ%SnžŒ¼FoOVí’Ìn!taÍjärWåY^›÷`mäEÚ¹â°Xív³1^eØe|»¢4ü+è“7¶ñ»% Øáèw"hN™fÜÌ$ìÖp™´=8Ÿt·DåÎôÑ ”2kšë¹ÌH•W’;7T€,j#P ¸ÝÙ~ø3å Óª0«ÿjSHââÍË5¦Œ·¯ðÁÔ^šæƒ¨ a·Ó¬ÓY‹Î uÜΈäXEf§•ýi:‘Q…¾ì$òñà#ùó-8ô”<‰«¤7–Õ»,ṵ̈àÌÜϯJ«¢w¿eÜ<©ÝˆæBfÖ!sqà‹ß´·@î±›4 Øø–– ýc2èé6:zlçÑãÆQT­]9pŠ;+Jf h¹ÜÌ|Ìi¡µ‰N|cìë›ð% 3$uD,âmn>Opž/8L«ÔŠkàèë%0xZö$Òo~Ö Ç:RÌËÓÇ碓XÓC”p&©ïmæÿúÜgþî 9¾Z#ƒ¯NXnz1  3^$­óT}àè Eã,iÍØâ(ýûý¡÷M©ÚåxvOàÛÎÔÜ „äÅn²V³' €—í_%ðOaˆbpÂ]¨mJ¨ÓeµeQœ„Üï%7CWjÍÝÎ~8cÓ*Mœã Ùs­¶DiD©´BB È¥[TwL0 7ÈmuÅûv–yÅþiÓ(kxcE^¿î㌙YQé>üp™$’¢.Õ³Šmš+n‹´)Y4•2º/Åù}Þ]m1Ç´ôQ °PcËä+A}V‹EøóBT"ªt¯L¥\Ä!BÛµ>ß8èÞ(E©º°Xê |,Ë«BÇÞgÚÌ…¬óåW.#Bš¢¨:W“‹dŸ§ýÛ,°E÷ά֪“²›ñ>N4ÇTT£›µI^uQ.z ȹ^»šl[É5ãCˆÖÓ$ÄË;òÚçå€/l ÅS±Šð)ž,ºtsYR@kP«dŒÑøAGÆ%a‰j¶­ŠM>Þ^ÇsE/>d–ÎG@%5À¼M 3ÁÅ›sÝÁ”Jµ(˜û2uÕ–Ma¨3¼¤à‘-ŠB·» Z7ȇ4x—¡áòu=@µš)}2ÛLÉr,%™ºÛ[ú`©¾»ž6”D2H¹îá£ZÝ[#ꀊ“±'‰V]b®_ž„Š‚LŠS—RèºÚk˜+Á=šÑï¶P‚1a¨'˜rÒ‡ep`pÙB+ž®Ö†¿ Èj}™ÄDÇY1`çÁ°|Ê$T¼ ä¥c‰U¦õù‹àÉ]åq+r>‚È^WI/5䬿ÁÚ?j”›“.9²m„Rèä ®1t<—Äyb8/Ñ|šØ*ÍÌ×u mÜ7kØ(’¦Kõ}* m)›ˆó¬;ÚZ3°É [AˆbÙ Øf£UÞP3…­Ë©ÑF&][lÀF/û‰7ðp‡´?š¦w`r;¬Œ™n}G0:€`–I¯U!m³æ Œ±*dYn»þëÃŒEF•̈΄\&¦#¸—|9%Ÿî·Èmg}©)·hP¸ˆZA3@W-È;¾¢çÃ+2m¯ÂRœ³·Õœ&ÈéˆUbfÇPÙõÞ«g¶ Bk/©Mn”¢NÛv‡3ø%Žrh´Îô%Ûq8 ¿³©‚Þ&…}4)÷ƒ~o¶×!ÑŠš€Ê6Ò£AÃ÷‡–ŒÒ*4–Äk;Ô^:)«ÎkǪ S1Fe‡• öü½…¹©”Љ\æK>wñ<Ôªº%B^?ëåæÓߊ]¯ð$ãRmy£Ý¹=,½7^W¼ò4ú,\o­N, éô·¬È2Û{‚¯®2 ø}¶õ7][á&7°Ö)é‰nÉÎÜN4‚Ð^â1èêåâ_ê&µŸô£ÇãÖÚ2qΧ¨›âg‰íj ˆñy—lÓUÿDu´§áªn¾x@™aG¯\d 8Í t øb&SsZ'ð›n,7îÍ­Ö Š#Ú·š´ñ`ÞÔv‚2áN€ÍW¶yÞºx*z2+ˆ0}£Ž)›ôcP缪ŠÄÀBr%ä|>4¬ÆÜÆj‰ô¤yÏ‹J³G¶E-÷|áHÕÏØü"éбZdÑÁ+œ˜îaÆZw[»`®4Gò—b£ˆ63Œ6‹h•ÕTW0Ïo¿ÉZN:1¶}•UM[¬UÞOVjsÓ–Úx¥Qò¦ %¡ÐRTJÅœp`…„êQ4.F^8âõð/)÷Ρì¼ëo7Ç-;ႆ\Šºs}Kaƒ¸ !\@;`Å£,çŠK€B%&EM–ôþè=ëåú–/+éh¿«Z^9nâ>”ØÍJ´7ȋܖÒN³!ŒîúÖ†–¢+‹Û«ýö_x¹±À,ÁÒ2š],F´–ë[4 qÛa_“ƒª¼âîs½¾T%“©s¡_j@./@ª®O‘ï¶”„ºhIüЋ¹ÛrŒZц¸Ý.SÝQ(K*öËëé³Ë™þpun3¶—èØ˜ÊAî¡|²2·AzŒ¸•I*²»s³˜í1}ÀÖyG16·_ÀWoÎÇcvYQ6ÔXU“†V9 Ý@Ò/‰"À’ày2¾Í6KOÙyÚŸÚ<”,ž¹Wü Œ7˜­Ö<º:qÞõìàâGs_ÿµ7ŒYë¯%Q¡ãŽÿ®ÕB½¸`7µ8¤pÊÞ†N"eò“D‚c0]üB-if2òáâh³ž¾¯ao¦¢z‴´0¤ÄÙDãV`˳O8R?7Á݃ք€bqà4X­nÐÈMÖ‡&×¢Ùá(9.ÐW‡ÏíÜ Àj “´:rb³ÏJ“þâ9v#U(]}àÉ|¿]¯Ï9)ÄåìúãÍ'É®1ñUaÆY™£|Ët1s+:³ Á´’0R‡0$…_‡Ë¹É¬ì¯6šDmÛ7VߤU©^K‰|—@-’ËG3ÝÁ|0âé€Ñ¦ÿÍÐgq8bØž<È*"eY¥Ÿ°¶*Ý(e„3%Ï$¬¨x”ж.!D’·ª%4 }b°%ò$äFa‘B¸ ¶P€i>ø‘62ˆÇî\_Ýï¥ÍîŸ{…‹Ï¹¼mÅp#\%@$ 1‡CSzì•×02¨ÎîÙÜð?ÛV÷\f/xà#!äc’)wêR%B–ǹðÿ!©†e¥ÛgÖ—pƒ=ç§J“o Hdp0I¶„°ËÏ  à€2!‡sžœ4Wc¦uu@»$d G2¦ g$IG”do$ï õö4”z@ÀÝòö!Ÿ‰×.Ñ\V¨‘ïaÀ±NŸ|ô~¤YðK$ЯÉ9G)×ú-ÿ"ëIÌ«…“¼3!$¾r?ÒÔºù*?mB|–È%$”ÈÆAšâÓ‰dê2]u¸Wë¶©ä%%siæÝr{xSªB&òP%àò‘‹¥Awj½™zµw6ýÄÁäa2áMu§éÛåb5Ð6Ó½fÄxû ¯«hGúõS¹˜¶PŽÒµ¾ò&i,ƒC:˜ïúÂhóè¤ÙZ3)ˆåÓíÙYV¸\”ê@."r#>:Dn"r›Žä³³óËáÙôÌ@šJ¿ÿlÇ|8N¡[ÓmzžÅ/ÈšE鹜I©Ž€¡³.~S´io®¡ZÚÃå«ç°2O5“ù ÞæaJÃg0Æ•^n>ÉVP¨i`æ[˜‹—zįqîh&ù &~ ¬ƒq£ÍO§BfÄ[Ê,n) rBTeŒ¸Egüœ­ñ!ˆguÑÃòE;0h8óhA±³]ç+½UŽ0œ“NÝ’J#!ÿœÚdpÄѸ³ ¦ÑyÞ…œóÅêÝ‘Â+Ä_VÈ*YŒ÷ÞKZ½纂É_ên+!õ]p¼õäï?0[Å|¶qƒXUm¥»‰·CY5Ü+W%°¨«ˆüp1˜Þ¸4&¥y=Q½5¥L:4 Ú¦$ì–žÄ2VÀppÁ ¥s=qì­ÃaB=Æ$¶SÂláÕ‡<¥ñ¢6!F~t8Ûüqî€Ã Æ4Hò¦ç D³í‘uuÌÂ#Òöè@Öó…ÈA¢\;€º\„ *N’ÁñöŸ}è‹…/Yrß…$ÏE‚WGr7\,1éáäŸPa§¨J1O—GLLéÂpæBW/?×kò—K þÞB.¬FNË££ —Èß÷ÞK‚Æ]AÅŽr‚Ü"èêXoM:i¤aó3üèà°pâ(²8fêûœpBYˆ—‹³9꣛ó?Qúƒ &„'~Íþ¢ç­Ä‘V›Z­—oôêX`˜"Ü ´\œ>ÄÏz[ìWsa‹*$d&g€P}½É‘ËE-Ü4a„&”?y '¹!hÉUƒ;9®Ö.ýÁ€PnqtàÕŠãÌm§uh½©Â’ú:Ðûv¾Ål¾&W"Íáûħ]Í›Pl ~ÇíÍwA²’‹àÀYAO9oŸºÖ»Tˈ#…ˆû…;*‰PN›tRnWäz_¹äy¨2:…½Hãw®àpu¥™‹¶•èfÌŸƒo˜­6T^çŸï$.ûÿ¶/.ëÝÙbìh¥Ê^ëÒ…ÔÖIÈÀ÷íeq·> N€ºÔ;± [ú³€áçÇÇŸ¨ú‰EÜáÀ¯]+b¶ø¶\înaÏÁW>îœ`$Wøèâ¿\Ÿ5+¾¼Yĵl½~âL»å¯ßBî?tV©ë¬c'Œ‡ï¯ÅDpóôì‚cW.HÄ/e ÄÚNªÒ1b´TÈz‚ß"<4£€?–I~8äï& ™*áY ôtàä?º›ñɎ°‹c‚$÷ÒÑ3›3²¡¬ÂUÚSU‰œ{yÇù¥DéÝ‹@•äû§<“3©A'ª&`n/oŸ.Ç*%š‚Ô+œÉO®gÈÈÔ&áã1ÇÐî3ô¡‘ȹ˜ŠÕ¹ÌߊTiªaO˜†Z¨1üH(.©Z™‡>ÑEêt;~ÿsÀ¿‰e­Œ¡ÉíKLR¼ÝÁp³OˆrGê§ËSfª¿ˆÛ]/ß}~ìf.IT!"ÛÍîÙŒûÒØúɾ=Ý> &,‹Á‘*—ÿ·ßÎ?Çí†Ç¼å:ªØ¾ƒi¼hä´¼ý†yÔ"zV§"ÂßÞ¹ œ¤:ä0¿½#3¿|ªœ\{RÁ´Ê XžuiÇE¼¹½ãøböÙ¢To¼SÐvßÈ{ðâøl¿wÇy^HÂ&],\ļ”\¦ Dr7p4™I¦]¯Ö+ÿQ…Lc ½uØ>Oi- Àʇ €PvMoxÈ‹"|7•ë<*/c7|Yø,Êœ li´lן¬ 7yÞD)°—¿ùòC’©5¹ˆêÁÍrLÑ®b^Ç}”ºü<è$ú XrÏdav1 )ÈO‚òW‡¹ÀÎw ãjé8ήñ)ÈàˆƒŒ¿º‹zDê0s\ãÓ=X%áùöÎW•~î÷HÛ¼’ï!j¶žÃ¡Ïæ –ýË\µî•P¾?[‘>V|ï„¥}¸’'¯|Ÿ†³ŽÉ®˜\Mþu ®²ð&XEÀÎìÍ%'êä­MÑ-D†yö¦*¶Âï"(õDÐ]C6`k1Yvò56Ôóìn¸œ³¼¥2$FÌ™ˆyXþÜþà<ÌìBËÀáòð•?È.ðpÜòÍ~Yˆ! i|ì²ÇÀ¡/1²Ì¬€#Tr)øLÚÓ­Ï®írjv0Û±…ánù‰uζüãW²±%Š)zàtˉKP„¶Âà€r!*_ È•C‰3ž»\/£`ék $xnÉèïø¶s /µƒ]õùÕÃ¥3㉼;Çäļ`|™¨ï_gŠ~M *_äM ÛÌxÜì D.o— +º\ÒÇ­I¯‚h „•ß–‘­–·¨>Â( íDCªZò8 uª —ï!G{w…êd¦JhŸ3ÀG€R/7M·+8»p@¹á*dˆq­QG—û¸y˜‘¾ûZ`u—R|e’qC‘uj´\|qÑÍàˆÁÚS)QŠðéÓGò€cOý\Êë2Åáw4¸I(\9“9P¶ËáEÒ€Èê寧Ø!ðWÌPá²\bR‘Ì`¨T2±2ŒÄuü.³ aÀíáMª]@+"Ï `BÂ4®’¸¹¦•ÚÌŒÆã3p; üâíx_ј–©bÈýç1þ ÑØn?×b¬*Ò`‹‹^+ 0.ñú(*ø×îI¡îŽ>½”ÏY^ˆOú-hÇä‰ t¡nÝÝôéÙ¥÷œ:Sa#kùn±¯ Ê Í<wº¿ðóRßÝr¹8\lkxÃaÅ{øD"ô_œ&ê §<+×h@¶›ZÔI¹\œÄ¢¨Sef‚n‹– :àÙzÊzƒ¯æèl,Õîêà. 0±½·ÄL·ooÎÔT__DA|þ"´•‰ƒ3¡6?ï÷w[d‹?&0!5µçƒà}bú¦¼ß_lêM"e#}µŸ½Í6³èÃÄ! !Ûåýž>OuEîñ  Ö«è¥úèoîo–ˆ@ÇÙnO¤B^êRf¹Ÿøë@,µÓ$‡Y>G·qj¼?®«`xc‘©¹¿™íÒ]\hè£æHÚp@Tšì‡ä©zïÃöc¶éŒF®“—ù¯Pª–öýòï?º}@%ü&"-‹V5²6ËREWhµQŽí]ÎÒ{·å[³ClÊ`kÉ—¦äþâ–Âx.i¦•–+MåWïE8>p¬Åêìí!SUˆ@ô *Ñ-,…¨‹ÅÅÇ F}L·$c˜xhé EË’ªn웢ă”p°,c '»Õ¯lªàÒfQ··T~{C© ]÷ÊÀu ‹<ê|½ä±­²P³É:!øf†ø‡“äHˆ_Y‰µŽû¹ ›+ªÒôôüáqr•ÏXó}x‘œu0 æËùîÓ è°}À_%‹ßý$O0Ýt*j[ Å›9 aÚ?פ5–û ã­£NÙÄCXÚÕA(µ¼ û+GÛÔEj¦)&ÀµŠ0A7£1vö’\ 3¹1G¹.:˜¤Í4°ÝnK©8\gëD´†á:[»´‹UÈGÆÄNZJÀS›Ã Å$3JóZ·ƒ‡ cLX ެ$FUHœ£.°6ã„Q-—«7w#…‘â–ŽS<Øî÷&’ª!™)1)/ñ5Ñðt³^fIê zºS‘ÀÁvù 'ÐÊ»gºmW@Ç¢ñ­˜ÜAèÛ¹:ÎM™›Í&I53¬$çY&–ÃlL'¢D˜EsšÞI… ß݇fÑ 3c¢8}k •÷Ú¹†Ò¼Ën ²[?/£A<~3­òì ¤KbÙ$föfÔLíñàèÓT!‰”ÅPwL¥F¨$ËWsàY¶MOçûòVEOç®1¯a7ñ%fàî‚ýñIT›h%¨»ìxÏ6E–v;ê:¨Óé¢9¹éžÈÑ ƒÞÓ ƒ §êiLÕh/«¼g™< 5R¡j•æBÁz3Væ=Ãl²oÖeÈòC˜a¾p6)q=F_óÄÈ#¤ÂU}‰:c‹2›ˆ6Z̺¿B[(BXšE0°€!‰\~[•ÆÌÙ>#vjŸ½ ùxµ<ˆÛY–ªIÿ~³Ü¼¹3¥ \æ¡)ô}ƒ¾¸[wFµ!?Œ~Œ/—â]íefÉ ãꤪ± ¸Î:mNzÚ,ìD,@Þ‚3†k/éõ!èÖYØ:ºñ,²¨j$j¢´MÀp»EžE™Ü]S¹]A yI•Ô¶8¦'ʇR7ÇՇ䑯¤ˆi@oœ4Vöγ#Wê(øVêR-àƒµ‹ý‰Uzœt>ÓE Q»ë Ãê×$팆ËLÖ¨[Æ“O\/ænˆ³î8!¶Ë™êªg˜10Žî§¤ _±¥îŠ£'0/brÝ/ýHõ,xU± ×l÷Œ!?÷íî:Ǩ»(¼ËJ-–›ùÏÅËþ¦uB? Ý å´Xhèptµq¡4^¸d]fwêö­(¾lâ“×=ØÓ6XùÐ=Ã&ËcÛÒP–ÅÀÿG˺,xb8•çRÝ¥pèKŠg+]¯‡ k¸:“¾æu¶ b—½_úÿÇNz%†µð9vhöââ©ñÇxWt1<™@|I3vO]óØãæÄƒY—r‚/ÁîÆ—äÄžºë’s.D"Kwc>ÍV… |3«ºr‡}ÙÃâÔSßÑ©i>[Ÿ¯g›á`É’C'Ûô Å$‹Ç› Nô‰ÿñX9ù&VÃb¡€a§Tøómuþ­²“G;÷c‚;ZfÄŽQ¤ñÏGkIÓí,"óš˜A`–ûŸ³Õš·­ ¡Åº­6Ô8EHÛ¸kޤ*ºoâ—+L~c¬ÑÆ ÔâêDOª&bþ˜W>ßtµ(;¯’çЭ:뾑1¸P4®:cöwð°âìêsµPÖ9'‰ŒŠÃ…H!0«y—ëÚO´»ù^.^Ð!G1.ë¨7t@žØe4²„åÔ3PÇGá8ëËãfõÏçr#:lQE3úÝDÇ‘]¨êNg¯¬ÅªéxÄÚMÍ9%„ÞíÙ, ÄʯOñç‚>‘w¢oË1 íšÎa˜„à¨qÛûúWFõ¸™õ±ê:F­Ãâ©Û>bX>±Þ=@ ¿¦Å{¨$b×ñíD¤0&¾ˆN–Šn'*{¤+(ívœ?³Ìª¿L2†è¬Ïžºþ©íŠg´wúv–!gMXÉö|æs|¥‰¢†.€·vÿéŠBk ¡‰$ÚîœI¬#¡$umùØÏX()Dx̶aÚêdÇHYGF\Àô7ÕD07Œ1®L"žP®–GÁàÿ€1.¾»ÚKê0¨ª/à—«åÚ'¶)¿FçV]6_ ÉÈ6Uò>œ&uõÕPð*Ž>5NJÕ®âN;†Ü·¨âÑ`öÏ\–ç0‡2¨ÇÚOûývGË~5Ÿ¾z.TZÁ˜ÝÖxÇ ?»Þ®zÔ')år§Ö’Êu¥ŒH=þÖòþ]Îa»ªÒøÍ å™P%íbóf¨‚KªÉYæû––½Ý ¨YÓ76éEØIôæ>Ìg…xJÁÚò¢*kã‹jh¦ª‹è=7’¦=]ŠñSªUpuöL/äŽ;óIy9ž¹ÒI˜e5^’g?ÃR¿ñ—„d“Œ(š,9…x¸3(’«´ýAÉoÌÈåUOg -ÅìcÇ.ï0¦u•ˆâ×<)궇ŒlÝA0\£ˆw‡Çø…emRö´£ïâL¹A´15=Æ…!Ñ^a¯*zKCû¨¾À¨„ØÞö\}Dî\fÙx·dFæ÷h÷1Ÿ‡)tE„BQ°5 2 D¶Èú’=Šz F¦es÷Ï]Zb4JúÝ'¬ªýýkd¢rÞyiw¯— 'ñ@ŠkCróŽÇÖXoiKÙ2ýÿY¼²Œ7a8Íó6^hc<±Câ<˜¨<~a4lÜÉ7·‘ o÷ ?‚mÌôÈÂÈÓÑtÎ/]Q9w›%1ceáÜÚ;~‡ÃÕÙI½•7‹.ÊÖÞ̬·«©¾ â{±uÐ5ôx4'»ív­ÕMp–Ç„z Y³øžJIŒ@ƒ ¯¥'§Øäf>ßÞ(çs×~‹ñ¬”@Ð9Ìû ”À 5ñ¨tësâ±_Ô=0.°ét†<žên‘κÇ£2œEÒC×…8ñ|_EG4±€â¤ªmã³Ì–ãÄS«ˆ÷8”’/ÔYûþNÅά5#u}ƒš®Ó ×Á»%Ãö8éZðtju˜öÄžb§ò«#Ò.àëW8¼‚ƒyÙZÙz4ÿpÎõNÃ5ÓŒ”Kþcâýï´{X®Ï¬Ÿm_©OÒ´sÛÆ ˆQZÖu£jîU‰Y@Q=Itá5;éøE²R9¼ˆÌ{Ö&£N0W?Т“MWž¬{/Ñùº2®åÂŒ%'Ü~Úî׋¨þlk•eŒ˜7R±uNRµ,«È¨Ô-‰—_M"–ìá„ÎYÃÅ!Öåã³éu[V[ù °8µÎДff=ôg†V[ù¿ ‹›µæ)ÁëÚôج½’Z•YR¤Vi@v2Ý‹Oªªq3@ÕÖ,ì ®©Y6övÆÔÈD?PkôöÖ…ð|Õd1ÀXy`qš½hjO"C·n*㨶£ 2ò“d¿w\¯ÏÍ"7E*ñöŠ$*/‰Vg+Lâ&Jò˜®jLFž#§k<’‘1ïÇêØZÄef2ŽÒx¸EŒ!¯¢¶ÎÇe;«èUÜÌÒhPtÈÜÆI$’û`« M¦ц+­®§þ’þp¿YÿñhÃU<í,‹Ÿ¹ÉÆ®zÀ‹_¤­/–îÆ5J4â€ñF.­Ü)õ.‹¶µ!”TÐÒ—g¦=EôÍlÎ Xñ¾L¬Ðð„aꄱ±“]Þ?ÜÒA}¶Û­ÿ¨›«( H€+{Á•Y©ì¯›³é…¿Î3~­Ml"ÀSé6Zëh.øÕ_ë™´©\pÒ(¸…#ÛT&WÌ@ 2Þ],$¥;3 Œ=Z²{<¦±ÊlËX3†%‚ÉñÉŒmš)]›@Þ…Ü–B°Z›WYnßN>Œœð•ÀÒê .ºhãÜ|§8MÌëØ«XÑ9gYÃø À»sß|›–McÉ”õ1wQWÐÍ2HÊu¥L¸‚ÀØßFZ¨k A`V|Aä­ŒÁl=Ç´†œý³ÅøÂ&¦sb2Ì)%¼—h‹áÀIôÀ{Mƒš*­B}ù¤Våó1€ûÏJ–ÙQõtJaÄu¶wá=J¶ó¨ÛÛ”#ÂP˜¤ó&Ìv½Ýra¬˜H[u [éJ¥UZO¿Çä P.é0ý%-”*ÓµPbÙ+¾„lÓh¹']°ŒŠ{‡\FâŒÇ\_…í¤< ü‘äQnñè E!À—\*û #d(0íÖ2ÚÜô€K‰ïh›-xñ%Ñ÷SsÈœ ߥ¬N‚àÎrK!Q%VÏŒ&#ÆBé*:’¸¦YÓÔvûáJ`L°Í,ÕBöÃN¼ÖùÚä-1J¬Û†çZ^þ(³¶ŒÆ¹-—êâ;u`¥å’Ú%”*hÐ Éög»£2k|Céöý¦¢~nŽû=Ð&©â­ÌÁÔÝFa¸’hU±çòŽ]æ}t7\4'EYæm¦Ë¾cA0J­HS] ×$9穲•Æ0ILfÄ¿ÝÞÝŽ\V^›ê3Ä ~> u(­ìª._XJ“F'X§ˆ ,ÚèÔaß<Ÿ¡¤û9>¨»wÆ” ®°² @~ÎòªÑ4úp•Ľj0,¬®ò(æ¹]h®xƒã®tlÙíÐù%\îÀ«¢Ó̇ŽRÚ¹BwF®côNÃ'xžF²¥jwÎ;›˜_–Ú­ê Ðð\£¢³e¸Ÿ½ —GGÆôíUL k‰Æ‘¹<ådQâÍ›çv› ÊUGezY'èÓ¥“aŠÄž*”>„™h­}Ÿ=ÙÉÒDÞDÝøÅ¶¢‡%וsbC¡P‚Ûî:°Æ®É‹FgjƬB.ÕúTi“ľŒ!º,)ˆ*EavCºAhJ;’˜¿‰¶D>Ö"A–¢KKL-VãI,êóÃÔâv§z7&0u+Ü‚V÷VpJJÈóª‰FÈEL6MIÎá’µÖã[4Ÿ˜^_J=n#:Õ1×ûÅo ‡Þ¼1r|+à v« T±p8ÎâW­g‡w(´Fˆýöp즽¶ð" #—I¬¬è#Å1-_#°¾ÅÑI uf9»µÿá(¯óªÁd·>ƒ&-›¢°|AÇ퇋ê¯3m[wôÁxÈ£‘×qé>_¯6?ÐAÇ?*«>3påEÜKŠ€Æ‘àeŸ7EÒ qlSôMZÈjUZÐ…½€£çõIË*áÝa¨µ¡&ëí¡¬EÌÁ““¢íÚÃz¾eûñ²=ßþ–åSe¹wRž·KcMµ¦éÇx¯›ï ;Ur×ô§UšD"—ÀB‡ªN§9'^“Fâ1Qx;%eÓ@sn²yÍvŽ55iç-ÛOÊ˽šû5 #Ø]P=uP0í[§ÓW#¯½»/Ó>vûôs¿ä>k-"y3€.~Ïö¬/ÁÄfE?Ê4fA»~õ¹Òµs@öË;[N× ¬ª¬Ã[îÜB°pZgac‘*` …E* dÇU[w>—“Ö£ä–MÝvV©8ÚÈ€e}AŲÈ2» ºå Ùi¥Ž—Õñ‹Ž:,n—@IÒLUgom÷?BCÀ´2;5'+ ¬-” ½½Ý,g?ùuMd{cúýO§ý4‰SÙ«-«.9d>´òF[6‘•ë{Ç*Õíl’[Él Þ‡yu':—Ëi"³›Ð³]$ 4ä$–Á\µš:m»’ýÞÎ~æ…)ì Š#ëØ'%º\ÏÜ¥M|©åüIyƒáb•<ËxÁfm„ÿ¹ +¾n")‘sôŒn/$¯¨Ý›cŒ¯èæÝk4ì÷´/ &£²°r¡‘yEÖ?rF9Æ*’Sî'*lÔsITÛMˆ¨xÂ]%‘ÙN½ ÆÇ²c˜‹ÓÜ®5HPã#+ïx¹üDù-ö n×N·n#«íÛZT4­`öƒ,¦óÈTY¤¹å)äWvO‘¥– úµ †mPº[;Ó.““²ú•D·ES{[НÂF«ó>h|8Åâr£¾¯Mc¡‚@ò}0H‘X¡,}Wˆ¬ÌEW«³O>lõ¬Ó.&q'Eµµ]/ Oìg¿Âð'ñòöZ ª¿AdE¹ÎÙ²vÁõãÐ׋;ƒp@µbAø©ëÞĶ€5ßíöô^õ%ë?†ì (TinËXoXªáí2²€ÈUI…£5+Zxžö¾˜\t3º—tž·¡$FÛ––SQñ®àz 3H Š(ŸŸU 9r®^eíh#³Ã¤ÇÚŸÚCbBœ” -DwcHüænë=¨X/Žîë&Îà~³¥àýÎëN0>îùfxÌÓÖÄmÄ'}6ù¢L«S ±‰Ãˆîš&ÞÍÔ<狀²ò,ø$‘” Pq¢¢¾1ª{è¤ÑyK^¿s–v’$Òa'}ã¼éŒž¶ÁæX¶l°¥NÒt98}®“yTÏáX§m«°ÏVÛ¤•E›&I;3ò¥Q´íL¯ã$x¿š=4wdc±Á¯·<òpÀáòuö¹>Š:¯«‹( È®þ.`²ÎžõESCN¬6©ÓÎõ>A,;ß7&§Uþ¶3GîdŽGg¿f¬H—iÕY¿'lœèÿ’f]¬ã½‘Þ;ñFAgk(1)Sñ¾´¬–A§;“?qjÅDUÓÀ4„›&é ŒŸþ4¶µ Â+ÍÀ„³ÎŠŒeuŒ/X­™lPï¬kÉlÓ¬ììQâó¶;Ÿ^‡ ’Cwôþ‡!°(:[ê´í.¤b_ÞQL~QµyÛp‡ŒX÷”>à€Í²~Pdú«Òþ·y®¢³h€XkÚ¢8ðÆÃêÄ'¹¿ñ PrâËÜÙk·=ÑÔgðì‰@:F« ¢NÁ¦Í¢™xýpNKNõr9°ÎW>o&ZˆÚÎ3¿€.óÞQ`1C@Zï=Ê££ïxÞm‘rè›cG.‚±äq®ŸA»/“¤§m—71j>ÒKõˆñ’šu­cÜίn=º4§g&ê#;*bÏ­Î#j\ŠÎã…Ü陉WÎ;ìXñLÌ"?o¤jO rƒK:ˆˆ)&±>ˆ PE8mŒLî´êŠÈŽHžc œ)Iv‹Uèl¿Vø!ü2+Ò˜©ºÈô ÀpmÝ z—bWçÍKõå.ݾƒ·F–FÊk¹\ðÍ%ßÿ´:é~ŒøKî$>á¦[—tÅ_JF>µSè̺¿ôÆ$˜Ès›0䌎¯s em´9¬­ó* Ä+ 2$yt6¥h .hm~™qDƒÉUDÈèj1Ÿ¹ƒ6m#_{_r._ÙeºÅEèöðv¶YÈj¯ëȶ©¬Yl˪ì®R´øê!)"¡klLÄ®þÆÇîf ÞVØA|Ý îÇϦg¤÷鲓|us~v@y /Fw£)S£ë >Ý? Ù1'ºÖr´ûñttw3¾\q ÑŠxÝ\]L¦$¼¶‘Ù©Óáù`2½økzsqw5½žP3uwóú¾fp>=LGßϦÐêÃã`êâSŠäzðpa±y[õb‡çW×÷÷ß¶ˆ®<öÛùðæ&Âêøf½½œ\ìÅ_ŒŽ”Aó0æEŒèÝGw‰úpñÅè¸Y»ø~q7õï,ÓøkG·ƒû»éÃý ]tªànp~ÿtftÇmd‘(G»éýãTâÈ©t÷xÃ/L‹¢^| .×gwW¤M6Mwûî&êUZvz«ãþv|öp1š^܆áÌÚÈì°vÕYŸÅ°áÅÍÅ4jTú¤úpö«¾W__ÜŒGw—÷X´=ßs}3Ö˜´èiìv8ŠwDV·}ÈdzkìâíÅÝ#;TG×d~ oò4éoÙÌÿnïn0>Ýp|?~~‚åpÿ4¾Ÿð,'Ýå k úǬIçÌRt”‹³ÉãCgÚšîg||Ý+‘'ÖuÓÙ2Œñ›/k«´ÿ¥“l«œXÂ5e“ôâ`D\ÿì ge»zLNv›Î{þžI4‘ß›Ádôï ZõiÝö½õ¸·ŸØ¬Jª¾/™Lÿ¾ Û¦èÎ(M<Öe?§3¦¬èî²±;Pî˿ÄIÒeØsÓ`Ùt1Â(²¦îvÊð$Ì…Ñ}Ëð‘³[ø¸æ“i<çwƒ!î¸û¿Oœ¤ÀŽiòü‰þ‡/Ú$z'bÎ[Ç ×>6 ·”Ç×ù„йeVw["vy~H¿dó¦,š\Xúuo;¼ðÏÏBCýÀéD‡sÇf[ÔU)]‡#¸Š—ûØt°²xšøecz›Ð;'ïøþéâáüáþl88›¸OëÌðR¤D ªâus:¸æ›Þ{àÇRŽ´¿èx%lüþE\W134Éô°m¥­2…ÜÏx"ûé¾}µ• Šº”½ÄP¬ ¨sñA‚./$Y‰@²UO A a¢N¾ÒŒ¤ñRœÿšÍ9dKƒçÄ=6ADQrïbˆ.Ñ<ÐÅFÈônV³Š$Âb*{ ˆ!³|žd’Š 40‰Šƒ»î⚎U݈SöýÙŸé6Ѝm²J,ò ÐñÝPé³ÈÑ+u{÷Ð’$ÝEì…’&m– q@©›\$tEA³ïz)>ÊÁiŽ1.gI†Ò½zøâõuI&JBANj5÷ø¬€Žªhô¹«»¤§sJɳé6­ÎÇãç²,ŸÏ¯(3 ÞG§aWç «DtîÀ*ÕZˆ|ëƒIkµ8Wư‹ßGi¬ Y¡DTÌÌØéxV`Ò@+¿b0ù *›íHwÛ¬Û‘<Ó¯*©C«Š`AáUMwœ ÿÍy¼Ô†úÌ!¹X{ Ï”¥ƒ…D—DÀoº59zA¦½âDß¾iT)§j„º½¿»w"éoH¿¬éÎì÷«³´br&·2†œ•Žž‹Ùf|v㳡„<.I–‹Û­¤1$ÎrI•Æ)i^“Š¡&N†ˆ™%kþé<ˆÀe JÒ9â¤>´1ñßùò¿+4”:ã HŽê©_½™©»žÛü$‹”À;†êüŠØ˜\Aƒˆ½#ýxöÊ)4ÈÛÒñlþƒ¢Óœ[èÁ/¡/®·ûÕJÉ‹²Z 'Ϲ§´ú1ÛSI¥´üx ¿ùhѺYwŒip/S‰#¦öÛÿ¤ÒEÖÃ_Ål;Æ,Èì‹›]ž…õÔFÁç ˆr¦)¤[ŸDÄowR‚4>IÁ ¿óYxõ G4H€’ ]®e| a¶½®Ä†¦{(Шq?5q¨ªo©b#L‚„Ê#Ô•ÐŽŠ‡ª]Ê"µòžLJ¹B²„CRÙ§ßUáëÇë•ø%Á±¾:ZO'ŠLA¢æ±¸²nÁ;%cΔ9I”á [(Õó‚ö޾þLäPÔrp1ÅŸeVÃË c5ÿú\ÔªÔóñ0ûå/=d’´&‡¡»ŸHBþ ¬dµÓ„ë’ï^D¸>ÇfUöƒoè=ÏéÃešêzÊ&âß@tñS39ÏjõÁ|­à£½)æ$ ~a:üŒn»ó$¼~~½Z¬h›ª™ž¼Š‘¬’7ò`HŠæ(æ¹÷9Þ/Ql¿ÜbÄÀöõ•èUÈáè’yѧqO`eqï—ø‰t¡è^JOB‘…y¿}AåÃyÅM¶¯Ço/ÞÑ,Í“R$-ArîÊ€ÆÉpóÀ`Ù³†:©íQ›¤÷Ðá¢ïRéø•—Ä$Ú˜’ÁÄ“uLSšaÔ€t7f–oNcÔòæ–ÚÞDÛ eU€«‡›Rh,Øcq'Wa¡ÞH.¤D©WéÀ­j©ßàòh'iå~ÑÑxhd Rà±’îl|X~.¶>Û 9ò-)-³²–ˆŽñq…·@*ah®b"Þû‡²håÎá_ÃÕÏŒä‰ààÇ>é:œ3ÍëFâ§\Ü^hrÆãÉçËá¸:~)¦óaûyäZèº&L‘&ÀÜTc­ÀÌ92BE+óCÚ–˜ƒ€\šË¬>„Ö# 4Ü9KR&÷øÃluàÇI°Âê™§°‹¶kË¸ì©ŸŽ¡Jb#÷º ù]ÄçÊUÝÂÜg~*ø¸ÞbºÆí‡«O\T•ª_øÑ§°4–Û|8à*Í´±ŠÅ“©tÛïnGÓ´ÈåÚÉ”™ŽÆ’Î;à5­$K ý(ޱêÖ~âdÙ6᪾I(_XÃ9|Px†ƒ‹ë­ëH;8°°e‹*Ìf‘Á,þ‚&RJ3 qøëãl·ò5Ió6Wsá 1µÉËÐŽs>ÜßòÂã…^ç1ÄùZŠ»@üÐ<ä‡-ðL-–Üþ‘@»NøÈ<’NÄQ`§(bÿV8Ô„éyÐÍømúà¬"8—6!øw½½™€¥‰“0ÓεÁ ™'Ȫ¢÷Y¿†K­UÑ ¡É?ЧŸ«ï¢*ë0ÖäYE¶(—b#åH×ÇßÃDÓïO ¥ïf;rUó z`Ù&ih܆%´M¢º§h^ÈÕ *ÌÃ.á–"À®)-BD¬´Ö’îŽäÑàbÏš&±/ép|ߺw¦g“SЉ‹î•@žÀä}†¾˜0h›Ïw¥,Š.«Â@Oí—`Yßéö zKסYaÛ˜¾¯6¿`÷‹?Z$§ÿŒ$+46R#*ÌahW®ÖÎwàdH¹þØ.†ËJcº©éìÏew$If:ëS>S–ä—i‚s\iØì×Ùá‡:ªA&¨Ói÷ÝMêÖ´0þ|Y¯ærJㇶöyžúºM옲¯›‹=v§6ÈEèå„€½u¤¢~fu«~XóçÁ_tJV¡8¶'üíU`»µ:²Ë4ÔNu'ªfŒlíU:LŽûeB«šR-“ V0¦¬a»29Ì}Š6¬j2Q°—*¹`apÅA$Å:•ûn*T`”`Êê¸ÜPÊ×Â#ÌŒb§XÞàe=XÿpzOeHôäõÖeU J´K"sFx8—š°™©âÎÉŽZAVÑï׋GlÖ–¶©Éî…ÈV-'-Ð.Ÿ{¼[ðÙ˼›w ÁK¯êÃAÍ.–¬ú°Å®§ %Ízn/ñ¯¿Qb^vsòÙ sÚÚEüâ¥R`&Á÷K‘…å0!P?”!œHŽ€s¾¬øêÙiÒ¥ám”CÝ¥rVK~Xø/ÙªC¯•ùêãæ…_LtYüÇõÙæ°ÂjSâĉÿÃ+]¼x†Åc¢àï¼huX×øù7³ýÛ[ãBZ$ù­AîE‚.%Q€ÃÀ{¦Ýs¸#-F\r{î6ó¹rÿŸâ:mÐ_Ê- ^( öõ‰SF…=, ¾¦Â,-`UÓC†ÉáÇ[É4¢éáUS‰ŽèWOooÏ]gå²õáÙâæl<Æ­`ðz¢ÙÓ6»Éù^¿<~²rV”RyØDê%ß¹Éù$Pà P]§j©l,/Ó`PŸ\|ù7ÛtS;&·o.Rܱ6a ­”ãÅ««Å w‘óŽ­¼°9&œ(ËðÐà¿$núJ/ &Üò]1=”Lq –]Ùš.­S}%Q_^œDeª¹’$!S»Ã¼þ>‡íüãâ÷q?ó"‰ R·ÕÀ2 ³…[ðû<ŸÌ^—¸j;û­ÌD(ú."Œ¥TãÜwdzcÎÖAd%½¢r0X"wîJkóÐsZ ï§tï“UM^˜>g  O“@48ji<1ã]#ïSa§™\L–³ýük{YL_Ö,æ"­0bøùññGªËå•(ML¾:|¾xjZÖ–ˆë‘tf—bMdê-(}þQè±Ø(ÐoÓCÃk1¼8í9Ék)ñ…1®tÞL®®ï'Sçc’bíT™t€€ÖI}ó›¯ÊLµáìÚÆ¤]Šù ‚=î†ÀŽøðR…ãÞ‚|Þ }DÚÆ‚Ž—«ßìÆO³’fy!ö˜¶ŽGN÷¯Cu†‰—|8‹ëƒɺR¦ap¨¾4UtöI5@Ä”ÌfºA@’ “ŽÚ-n/äÁ%’kòœ½û&Ÿ…v;Ù7qi #îF×b=’$ ÙÑ©n^”X(9GœÎÌÐ#%úOW¿ͪ™~4Žº……S$êÓznCs µ@ùuÇ fçJoà4w.r5§Ž 290„BÑ)O™‹œZzZCbe×’REsU±%D«;+ëB¿¬“–Žó¶Ýêl½¾~5ÿu…ŽüG·à8nµš0;Έ9ïÛõâlý‹S/¡€‘ë72nKÙtØöF8¨\Å8¨†˜6³*é·Q'<4 PÊžÌÜ¢¨1“®PX-¸ªs5©!/§Oïl1€ME£¨µ#/CõÄaJ.îš’á:¼ïj½}™­yúàzTdõÕŒ9e+ɇ:^í1,|r¡ÃÙUÔª+,ˆ;6‚’¸ÚÎ׫Ÿžt«évz3r“Tj\¯ÞÞé¦{vІý*äIBÐ'ˆÞü’ x•ZVžÉTR7â<ˆ!¤ûÁ_ézÖn 3wG/ a«{:ÐïGk5·³·XÿØb¬KÞ »›ìn07lº¬¨T{r¹ŸùáLT8 …qkñ® EM˜æ³*UuS)Öâë'3ϪCÁ–@“‚…°ÏsµHñU‹¿Ê KƒO^‘:f)çW-&eZÚÝ |f«Q«û mXsÙûý`½ºä˺4/ Å™­©VÇÆØà £[õ™fMª¤ LgkF¸ƒÀŠj‰ârƒFSâÕê\ϺCùs´,B‡ÓðX-¥¬4jñ9?‚@xPµ¤álI æíc¶QÆ[X­éÇq;ß®c(œ‰úlò£®È`ÐëV±ÁS“+Œ ÓÄå¢ù’¯gU´´ØA¤i)¥HDöê ÕJL¤´€ñ—ñÛ×K_^²½T}vH\—héjºÝ®«¼°¨Bñ"ï>¶¼$’¼ª·¢$Z=R”NÕ¢PEHA2ÍÕ~šýÀÞ|ùP«ù§Ö@¼µ˜£ý”ʹ2ò³ýåÙÂý¾¦_+>Ôäuó×ÝÀ'ìOó6m‹â4íÛøæñrw6eöEû.q>Z^oV˜f¶Þ’a›iö×yÎßùRç£É4,‰/οz1=ŽgÌj>yzp/ÔRIç‰ëÙñj`Ÿ/‘“± VÊ>ÜÝ@Òs\üÆEë×r÷!o9}˜Þ§үºDçÔ*\ZµJ½ì_-–[¶iÿáÁvƒ›ö ®ÍkBbcŸ#o•Mξü¨óÎÒì$DÈ;op©èâÙ.Õ5Þ˜©Å.OjŸ|îÎή—3wsU–¡ é–K(´LÖ¦‰´Ärv’+}Òe €$œ‰!†²)r1 NúÂ'ñA¹-›èÐI"“ ¶ž›„Ã2?ûI¾Ä4pÐ=Л nô„íÁ'—úêÞ=Uâë;áp=Š{ 18)¦S/‰"ú”†Ñ æK1¬$×oèäƒ×´™°þ ¾6BôÄïaCuÖXX»—bCaA¸=%mj_¨cö.wŽþ _5— ®Ÿîxø²ÿmr*¨:­´Ï¾€>XUf§.Î,Å@Ô¶ŠQ*MÝAôñ2DNº|. M±{ð9ycçɸ=ŸÈaÒÙ+ë`›žÄázðžHwÒª‡˜ÀоÓ£Ò¿U§½è«Å·fr":…à6^Eæ…ªh“nP JðœôäÁg…ø“ž`<4v×fÿŸÄV•¦†Ø }®7N #ß~®,-ï÷Ãåœÿª$Xì²eMå”& Ú¯ŒOd’0Î&]G€\¿3àzf}šÄÒOù^Vbä³ïþ‚¿¬$3D ýíHUè’´_€2ª?óVõО'ûîià‚2„¸UMz|g4ÑõI#Wyl!„`=˜óíoWPDëP7 I÷¯ÃÕ‹5nB$ž×¡dÐÞ…®€Z7 ¿cåÄþNÉü1#ýþmé@M0àÿXߊFnò…âœ+Z)1Y/—;€¤É³°;?¨Jj•b¦Áê&²Œ7³¬ o÷=ø2gg¾ZÐÁ×ÂK“: —7ðØ ÇT¡:ãd»·vKJÏû(\Ð*½?héu¨Ý5Ù½ç=ߤ&Á>â~ιšW¨ä)c7»èÍ·|“²–9»v8÷v/l ã‚Ä®kvËåg”m=GrÊÿóAQ¨ª°ØÿÆÕ‹^ˆ¹Ò¹3#ÍX«Ûp]Œd¾7ÄD6Œ¶ê"SÉÎÜEEU‹ÿ÷„K¢”œ8’½€êbªHÕè~ù¯n´–‰íܽŽÏ«0ÄÇÏ4Ì'·—^#ôìó](˜bîÙÅsøz»×ÝT™¾óJºjP°Ú|¾ñ>Wv'Öãö¯ÿ5Û‘Mòüóxdà Hzb˜^ƒ<|Ü/ÆgN¤)SñÆÆ:è3û¼Ûíþ܎ƣɿnÙñA9¶!Ç©ƒHÎJ$ʤ>šfå0|œ>“À„¦,)EÂScp.Ñ ÁFø6Géä3UâÃâ5ý¸e£NqŽ„ÍR%Þöó¢ld[;Д߬‚Ë>“”w{a›CÏ ôbž°óW^É}ÓCRt80<÷âm{¶›;iEn…pbÝ&:2™x{yût9B>%¯+4BªŒxDÐ0BRB2+ª£÷ÑêóÞƒô’˜N?…¾e-Þ¼Xë&…\E=nþéß †̑؉©C{’6æMS;q!=RõE"Trš=nÑm¯ nQsz8u7ÖHÖ&$‹K×Âaœ×B‚é·ûÀá'îDLw*^ äRß‚¾“|‰’[uJ®Ñ¬uFAYnSqµ¦b–­Ô—‚&iºF–ý ¼Í\®2$îfõöîÃíJ±Ù8; Íl'ð:^Å•ý —²rôñAnMÞÍ$ðmWòŽâhÃøg¡^›¯šç'’} qÝevp'»ýŠÏëP=DÓÎàæÐ6¶›2#¨²ôê\ÄÒÏ@WËÝë\.j$Ýæh³’«‘©[gã] öºøeÑ–X,ðr‚.$ê–(‡Ãv¾B_î_>L8äûDÀ9h lm(äîl?>VÁ{écK—»e"”ŠOJ t5½¤[3X©¢ìQ‘ó%út¹¾7ŸòLUL©“ÀÏ5D‚öš,“âÐŒØûp±PA„ìT½èbãXËæz²œóM¹D«úªÛ¾›iYhR\œºlu¹\2ÞÔ¹ˆ¾*-#ºdçˆiÈjæä¾A*›²‡Ç€}‚›ˆó°ûýŠh+«M/h“ãgÙ$x×x « 7E÷p2ÔG5†#g®¨õr9Ÿ•>h{p7žuÈqŠÐÿÛ¾„^à©WÕeëLX¦CÎï¾q†¤é¡¡cŠ„.õ ͼ<ïp½ÁEs ±J zX’Ú<¡÷iu|Ÿ’¿L@!ªA(v¤SÕ!NÅEJµ<†…P:P%*Í œ£9GÑšÇá#`(ÁÙÒX;` §WjZÄ ñ$ùyÇò4¤@ó…HB|ýá\Ìà&ù&€%I“­0ã7 Î¥¨>ßÂ-¸'Ý-Ia–õŒ$0u¸ÜÙBƒRsÒaM> \[òq_Ÿ¯Ž—˜vúàFN¬¨3ùøµcIO8×Ùº…“ F”ú0¿ IŠë§Çéð.qß÷tѶ+Åm¾/÷«×ˆ;Jã´ûIlùáeÿy ¬~U¼=/' ¼ÛRXÐÑ#%fÃ#/6oÔÞ-¹x¤g„ÂÕ2¬ Ÿ`,2‰«ÂD-îÀÐÞšžW2ˆ}Ó¢p¢`Ç ZTŒ.z¿úIþonhÄ¡²ƒ qØ¢¨I=8?Î¥˜i; å˜ØóqÕÉQå`0Ä´=€‰07as[„ÁÀ]õ‡–1 ÁÝŠwUÈv‡–îÁ~ §,ûôe*bÊ}qéT‹ðÿ}…b·‹_nÒú’óJ V~s_Lm7h ’56®•þ :qw#¿ÁÏP¯IëR˜2a~|,8Dn½æSœáDR #ÚÕ”öLþú³‹OÍ&IEÌyL0>|…:Ažnoÿy¿"XOº¯§»¡M~׆Ž6·éæÚàÊí?9åð鄸…N…×}€¦ƒ‘¹Êívñ¹^rÉ G#‰«TðDgˆ ˆt±X~s¿á4RP3Í ýÇòRþgÐ%¿®Ý¯Ðøäýó(íæ‰D´!b²ýXrpÇðų :ìYRKÁyöù‡|S[‡ôNèhy §¬/„üà\º*ñA‹̈ñfÌ/ºpnÊ!|Êv!KH‘† ólMiiº•œ¶)zœÈ Å·úª:, ‚‡Øz ed:‘\ —³ZMÒA¡±úcu|Æ¢PÜS>]ÑÔ>”繨òL˜¯á§Œ‡²l,‘åYV‰5_0£‹’÷p.oþ8ÛbŠÑ¯^¿ÓPx±ZhY¬Ô 5™},U€t­,»¯åsÁ¶&åu5Ö¢rŸÉBl€Á_]KøbúÕ}±ØQ÷ãíz5W_®yFY™¦ËýÇ 3‹ùTm›2e÷PÑ"Ás‚3÷ÔÒC(¬Léàè`:ÛíÖþrÑHc]U1fS~ ü³†{d ìÜ3ì`nZŸIV‰u ¦/"Ì»Ï6«Ã¤*n]ýµæCëÚK·=u·ú†–½ÉÏí¿ïQà?ÿCUDÉþzjhEú÷lÇ~í˜ýÛUBÅ8 ?ý÷/ʃ+Ø%CEZä¢8>ž»åCÂžß °wÉ"äzäùjÂî½UoKÅ%'"£Q•½}jÌ+•õ‚ž'×þ5^æ{ÞSUºç·Ãëlµf>Gײ~Ï?\pèóœÚ˜o·?VÄ ›B ˆ†‰LŽH?»³ãÇëÂÇ䎇ßãàr¸$wÞÆZ‘œHLçŒHò|SKÆ¢óaÈ7¯x?¯Šìž&n¤‰‡ùlç”p«J$ìÏíl3{ó¥ b>ͧ©PbÖÍÂbžîaÿÙ-]&8Ĉ”0Èð¬ C¤“‡Ç3—Sƒ'Æ!K¸”Cðš¶JúÎ*Cm˜ž B}K’ô"¦jDº½¼ZÿÙ½cؤÿÑŠÆÛýçq½ÚøÆÄò؆˜n[÷ŠÅÅhŒåòàåüör8ºÝ^LF”ڤȂíüå\M¥„©ÅÂóâòp²2éKËV‰8¿ð¹ðת*Ec4Næ9}÷j, …,jFx O§8gÌÜTŸÇ¥ ¨¯±P©Ü+42I%BÒåÈù€cÍ ¹sôäÛÙozîë6¤zÁ@žÙjC4¾³‡]j⾸ì£Ã_Û=È»tˆ¸$¤µêapxè¤*Ò`’z‰tü¶ÌéÛÏãØ},ôɯ ÷sÊ¿7i„ŸÇïÞˆÜýü|¹Æþ!µlå\}á £á@™e›´”ËVG˳ŽÙgƒ]¤Q)cx˜O¨¼l‘SöËpÿ3Dè“£¨7ž#“2*b8­‘躙§Å#/:o±çeøg3ûXÍo9;‘ËÐ…Œ² ‚ ´ ó0·Å”•«ÿJ‚Cx$måårÖ®]^.§T‰:M+1 ¼Ðáß³<©èå 3Âé…ÐTaÔP>™LÆZ¨¹\„Ö×ösO³[\9¤Ò¬$daÒHžbj€Åò·Û ÒF´åo’ äµûÙ‹ÿø< Á/ÔØtû4çPHô’ˆÊ¿qšHT *¸Þ4É*n¨TÁDg¦Ì1†6¯…x3r’ŸÑ¡*‘Gƒ[~,­Íc£ 0*.[ï÷6¢Ýo–“ãvþÃ1Hh4—;…@í$–¶G@.8À€ ж…¥Ã0Š= –k"ƒ kÀo˜`8Õ«eZI8âKt<ãáìÕ ¢)æ‡93KýÜŽ7¯×VJÙÅ;瓌ö¯Ï-õ+>e¦éô’…PBÃÿüìý¼àL”¢—/·³ë'H¦²Aà×ÝrÙð€ç¬É¥Ùå3ÐÃ}¸ü‰ 0¼“:³Êîstr !åäËÝò— ¬tyu¿ì’µr'þ",íÜÉZÎ _V»¾QmïBëh"’,l'Îô}ññ[ÒB CFYU¢oF%EÆR…ÌVŽÜ™ZÜÚX@0E½<ÞŽ‡t6i`'t+ñ€œ÷jòxÎ+'„#½°ÍøöðJ)3Îÿ•ÐSg8…Sô{†ý‚ž?ÏöËçûüêD\H^ŽðÜnÃ^ý¥žëÛ¤-ÉÏU ÛFâ J’âUT¤©ÈçÐ('4%&„­6U!7§BN†¡Ñ"H…G›‡ÐV@~/ÏVNö-CZ¤¹ËFó˜|îP=ã’Š/ÌÿsNºÞbèc'‘ý:ÿÿ–›¿Çד‹éóõèêúùüï) xu+Ò…ÞN.§ÏWwg7¼þ‰+:~¼¡¿¼Ëýî¹J|3< G®Õ00àôâvìêÙ€Ž"ë;ÑP(âD±Bš¡’\ÛõŸ7Ïssññžÿ‡æŸ›¬>(í5}J¹Å›ÿuÐéö~zË/WnóÿàŠŽ…Jô »ó’a­?$è´ñ<_ƒÎýú¼9¾‹]c™æ¼Ãõ+ð=' Òö†åïLÏ®ª¶¡¾®/Ÿ¯Þ¤â7üúK~nD,çB¹ÞŒEjüü}Um¸Â”ØM× ÀÎ1\ ìi|ñW€``S]u Ó%BüéZÅ)VÒð¼át™b€e"¹}U¡âLc‹Wu%:àɲĸ|¿Ä¦æi›¨¾v‹ãã¢M¿‹ù5‡Õƒ.Ë.ïªò^œ³}¸$¨* äÁl=ǹ»e‡€sW–|Ãj!‡Í"ÒdçuF|©n­7XÉiåmrRSKèщ]¢ mäMiÛJâÁç—@Veî"º„Ž~_Ž\rs®Fýøäç~)Ïç¥hÖHÆŒ.ä²§ìp0BU[Y ¥èžnÏ9s^†»y?dòù2^ý¦¬t¾®QÎ+ìsÇÕÒê¤RL©UÜ„)¬ÃX¿ñP¹ÞïÑÖ/2°ò°ŠÝá'»Ù‹ö\®œÌ=Â\b›åTýÕ~µ`lL¹|cK$˜Zk?ûéïÓÕí©C~’!K¤šî`EGÄp‹ç*¾ñ«ê¼R]¿øxñ£›4jÏå÷rîeWn¹-TËt¥B;Ó;ÜÕe’©–Ã÷Ánu·Yù{·_ÂiÓ"*%|ËØ?é/„×Tún—û·hjŃߞÇûÕÏ‹Ø4=Ïðª2UƒÎfß_«5„} sXêNõÁÔâC5-S£äR¨Û‘ÂIHõ Ÿ5ßô ¹ sP5¢ îÖñ²Õ-×oqñ"¬7_/ñx$Â}ìÛòø¼£ààç9f€|ÞR½I'?I@ìû˾â’Õ QÊ5ò¾˜SuØÁéʘòÍS^ñ2ƒv‡„È=QpEº´{WŸ«`JÅÉçØÞ«óŠ£<¶˜n-Øk1¯?ýV׫ݖç)ÝÅÉßw˜k|éRj1ruø5?r*=•›Ôÿú¼f',…^¬Þ˜U¢X®ŽûÝó¥ƒjBÕmþõœ²55!ÿ<òÏ¢îóÏ7£«»ñtÂÃî#ñÒë`=ó–;ל(ZôóàŒ355!©ÿ~1ºá¤ð–25=`’¦¿øS„{3åæ‚2«À3™X×™BfèÁO²ð2kËm£0YÓ=p”¦5Ç~ +ŒIõ{û&vÑz_ Úþ‡› ¶F°’Š6=²Lc$X÷MÙðâT”Oá¬é’2&Il"åŽTg1iÌ æÂAÉ5˜ö\ƒv™ /ÆSwSœI-)¦Œ¾óBçþ™³25Á³–^®³‹Í›XBöq"_Œ(3gÓØ/½¸™\pÙ…Æôêâ_lpiÌ;PÒw“™X‡Ìœs³•ôI9~s>yµ™$A&þÆ ¼ÍÌô^/¨÷ìª_{‰þ¿——Î6ÔV1éÎQêø¡ñ”?£H:¤‡+n©Ý&êF dÇsÄûûž.;‹W’̼©ìg]Mùתµ¿úÁ¯ÍB™âû”üãÜÖ,0;jÓQ›Slî ã ç!]ŽpOW[×½‰š1›ÓÂôÛÌ&ñÌáŠi3KX¾ŽÑ5ÌQ+³,Ýb þAüëÝd:˜>ܸ u&ŽÙQ·2Ìj4aÝ5Ã|žö´0í‰mf½^¾¡ì8î?ç^¤­³Úî’&ÂªÇøæ¼C§XôB'åå õ·ã·+ÍÂø¿‡{·[íÒ…ßÝÇ”™9n`õ1WHDeÂ-&! ÿ p  ×5mMž;»˜ÿ}0bJjç寭ãÒÌð¬ã¨ý§)µ²“~{ÆGUHMÅ?󄪻î×3þàRÓýîNÕ¦6#t;òø¨3‰àcà–“³ilCôX6¹}b<æÜqM•F'QCn©HBøoÜæ6;f[àÐéAº»àã¯nÌhÜù)hMSw÷S÷цóÜ'×ç,“Ø&ÊQŠÔ°‹»‡ûGXpQæÃïÐòà‚á¬4§ØýÐ=T´fÃz&jgõž’kùÊ\uÈEÔ±[ûÑÙ/_Óæ–ï!åï´\M>³ U† GLÑý*Ì·` Pt»Æk£ƒëHYõ0-êÁ½Ö칇3¿í‰ù0à®4fþ€±óïví? §N8²ý{¸üîXcmàƒœ€!fΦ®è}“I‰£<:±µ±›úaìßa7؋҅¡¦C'Éf¹Ù,þ 2;>Ók÷{nöáqê۱̇Òn`ñéuAžµô+Èdì6˺ uÿúêˆy/QžÍ‹Î¦[®æàºAGŒÍå[«Û¾ÖÔç”U?™HU ®\ÏÖ¯¡ +ÜDù,»­\Jé "¬ZeÒJj$†IQ*–Êù0ñìîÊíˆàNÆ”ÁÙ“ 0é›Yfê$þyÄ'\Öš­ „gñq…ÇrûýךØXu2–Q@ë€YgŽæF!)cš»:'~1XÀÂÌêÃØvm»ÿ0v福è÷Œ·<Ÿ¯ýQÍ2Lp¢¾¤´ŠÀD>HV¯ž<91#­ìË—Þ6&'4<¬ìl,´;$¾×ò|LSˆ†8Ó$­ûÏÝr›ÇœÇeÏcx2ìq+s>Ny?æ•] .# % ¸š°EÆ®—'>ŒÊÔ´÷ćQAYI¢ß/ïù¬(¬êñ$çQaVÇ“œ!–<¹3ÄŠBiA Ïd³|ÿ ç5®Pó![«¬ÍÛþOêjZëÁÏ#&MC6—õÕÕ½Š{¬Bꋵ¿ÖrŽGXÓK½ØcHWæ ^’¦wíÔ°Ïõlo›Ãˆ{q`_sIqÊ×îÒÓª)‹Ó©öým )®·îs֥Ъ¦”õüñrÜþš{«£?«>–s*¸© ü‘Òªáéª~<,]ä ìÉíÏç×Õþp|NŸ­ËçÏÍžŠ`r¸hÖÊ]@fýH¹Ä ȼ™'E?R„Ø€¼ëE¦b¸ú8¾?·ÉbùF1 X¸¯P.gÞ‡"/›€®~NÞW¯Ç›-9Ó Ó€˜†~¹úý×ß·Ÿî*#—}‡4¼RXš°Ž-[úAu]}Þ,á?kÖýÓ*dM³hýiˆòœÐ¡²/Û7Èè­ÂæýØèýyôMùé÷ã”É&:×µi±ñ*(¢q*¾î8•Ÿ€o5¸){ÛŽ——Dý;ØÝ—]À"*_Âu‚‡±G]—ì3±¿Y¨œ{ò­†·jØÌö=5΃N>`FZt4ÿyéìä¦}qôøÿ˜¤¬ý_˜i'ìÝp0:[üg°æ¢hûð”—•ó¡pA Ï•ÂlvóvÎ;8ç¼RÚÝÛaytɼ%ŒÙwLt˜Ýf¿ÔqÔÔâ}²ûø…¶¡Þn·£À}t…W™9ÉXò:”{$jüòüÏ+©e(åÛýd÷ߎO ˆª~w?©ææÊÂ+|³œˆiëŸgö)ÒZ4ÔÃËêHž ÃåÏ(‘.&·®Šo”—lTL3¹Ò5Ä+Næ €B®:Êg¶ÝlØ4¦3¨._T gÐïŒF·­Z.jvµ …@­$ÆËSá«ã{SÀ…„ˆ]\¸¢ÐY 3)†C"["³gñåvĦ¶ ÿ0_?Sx%]š¯ƒ×K&i‚3EÞ ƒ¥›Tšä¦ƒÂ„\ã÷Ùæ¸ý …åœ$ÄÂA8· @r9ðêºÐ€Ë ‘§­!¬~+a½’ºRHmæ{Rï«õB_ 7RµƒqÞ €€¡Øb©¿' UWÛJê}#†ÍÖæ›§[WÈú»\\¢¿ðÁ"„“áÃô-:îts…›Ì÷[2<"x¢¿\\ˆ"7!ß¹ü~>sÑ™ØÒCtïÇòÂ2cØS)ªÒ‡Ž§›hy€>ÿTû‰F†ÃžêŒXeFŒ½|Ö Ó–ühŠ.¨ÛÉ´LôG¡dØ×½óþK¶8c 3,÷éý@x«fb$äpËÛŽŸ[W'¬S7aQ†íÔô¼ÀSéH¼ÙÎ={%;1ã‹aý ¡k¯=Ä$²øqe 1ÃzИžb¾ÉÿcïM{ÛH’EÑïïW4î·‡y`­,^<€"‹R¸u)ÙÓ8 h±,ñš"9\dyç¿ßŒ\#³²²Ýîî93À´mFT®‘‘‘±¨:ªC»p”MX 07B͇°­5ñAަµù¼Å±U^[Þ|2æKÞ)Ž<éf'‘˜6ú‰ÖšôˆÊXTI¯¶h‹¨Pð…ê´UùMONOz Câj«µ+«åQëÝÒÑvD¢@@ÃöÜíºÚÎf/P$ÄÜ”@ê±Çi‡!Ê%äÇ-SŽAe–:ü¼F¿Ë›ò+÷ò¡)7Õ‹ëiwÞ³Ìá7„· ñUைóp1Ì7nDyKGO€Ù¢±Cõ AQ ³EèD¸oá8Ë+ØÑ7Þ–Œì²` h5ðóP[8^Û{‹ Æ£µP%0Ðà‘²0ù¸ŒZSU†58Ó³˜¸È%܈‰«ŠŒ‡‘H?Ÿ—+[¨vHƒžÄµã…‰™ÝÔËíc–¿š¹BUå–cȘüÐwðH¨Òçâ1Œ²°57jñô}׎"—Z%%Æ(FL|èIÅcÙ–0T~¤6T´ŠŽg Œ=é˜H6Œv ¯‚Ž1›õR(5ó¸çv=¢MMY\ñ\qËR{ŠUlR<£0jŒÊY°°|l%âûÊ ‰P3ÛÑ?x¿’"¸!¸˜ÿŸó‘zíÓläÂïåÉž†1/ƒÉx…ã3ÆÃ¥kÆ[w³YBN®Ód»¡•¥U•@è„ ¢ÊÒãO•"…©-t $×ç²&C˜æªUgàò¾|×·aÉKñ^®7D(×b› ós ¡Œ–{»GWõ{£>qpqó¯ yt[Ò úKPl7W2UŒ£žFŠ Ò¢1a¢ ¦£ÌNo f‘ÿ-?ìÈY˜.W+Ò3Ï~@˜|ò¢ˆëëg#:RC'@*u‚ÊõD°.tE|_ÍåíļÝoØ ºíšÀäD”›'‰â¸j¢€b€[Rö{c•, CØéé%â~ý’ ¾õo s?å…¬){Òø’µh{Q[ºâHõÇæ‘ Ò*Á ãÝI} p)è08•ïu ydu ÜI¨¢z’¼øÆ5 ð ˶o.ÌG Wjk‘ì gBGž¤B–¤¦pùjzƒ7 éZK±Øw"û¤¬óV}Á¢ŽãHímid§Ïü•ç‰&O'¢Ã¶Úl8®:{ê„ êIC6†º‡ÊGb õ|•soª@š7"ImOëä*Z¼#cßxŒÉ~ùwŠàôir˜VËCë¡ÃC†ÐVLQG`Wq et1è ŠAO Þ€/SðˆÁƒÐ:DŸ Ñ![/à :D‚ ¼2 ±J*^UCˆD¾rü5xøîÐäFø¸ 0‡‚H ¨S0BP;ÕjãeÂp¾S®Ì–h ˆR~µc¶[‘οW¥º 8ß(WªÔmT„V±QÏoYÄ*úNÛÖ…Ú(eX3äFEÖUâå…ªŠú—<˜ £ÔaÌ&9Š©1wT ë7Z¨6!f°7šÒC\ò."¢«ôåz;n¹}Æìº²Â£ÐHš¹Ò¾‘E‚Ú*ä¼jÌo§b:¨;„ÁåÖ‰7›uBF®½­êàœôáò³rjéDƒ$»{Z˜ ­Ê‘!`?ÿt~~æ…Â"¥Ñ#”ûüÛ§Ýò°.¿ñçÂÇÒÖd;Zoׯ<Ȫ% ®‡f/ë£L@¶:’y"TQŽHñÆŒ8”äO-_ÙÈmµ‚Z²Þp40®3­J9PØP¨ç¸0ÑÉJE¢ˆ1Øî‡­‡JÑxÀ/øÛûh½VoëcÞeèDŠ•îB&¬èn¤òMh@ù±+“œ•œ„4Ž<É5f¥aàý–§¯î>É⓾z<$OžvätñÄÏŒ<|¯2CSÉ„¡êj†f)˜.y²ð#D°áROËãITkËO'¨ ³ôùGQ0~òšg/,­õYa;^KÀÁè*G4ÙÚhðƒçïeM­xùm«««ŠTBr&µ ôµ›-·*ÀK(_Ê ‡UÁb–6ªaÀá,Q¯p:*ÊÁ7½Óg^ö/ˆT¬òš/*<Ñg½æšu ùš0.K´¹¶Þ˜ìFUG—ÚžþÑ_wgx˜’­=NU( ÃVˆ ÆÃ áÉ$›–EpG_° Té0K7•µŽˆ$°éívVʼn¢¸ª¸¸D¡½€_*æ&~èè½&Fœ–¶½Nø*&D1izUöÈ㸢~7ë=å´äŸ¬Rp6ÄTx}ÒÝ!>À ¿àÌÒÊàGvh ó2i" Ô÷Ä<ƒ[:Yþgp3ÆÔMa˜•¶!m¾ IvCÌo‹HÉV­]tð2ýU®ª˜vá%FKZ†ˆÜYú÷pÐà@É˨ÇZˆ;1< $ÂÀèéæÅÉMøQ‘ˆM*¿¥ãyàJoâå£ß“­ÃPiN.¢¸¥ÓjÙQȽΛÑn‡·j§Xâ$¯Œù…A;*t¿ŸD™.ÖH',¬XðFÛüµ§æíû&ļ2c¤¨:EîÌ;tG˯3G2Vc½:æ*æ †NÚr"ß‚0•¦\×µÁYV<n¦qC†²ÿÒ?,¿²!±©) žÄâgŒ‚ŠÞíq·ÉU eôïO„3íXY5Ùã0g»>‹A‚—6L(ðÞBØ«NÕÓQ¿,‰ª¼¬q^xjy-ùA;2gÎÀ|ïÛáoŽˆMˆŽJݦ΋ˆåñ;Q§ãÚqdf#ßW*é¨d®¶e‘~/¦·mAî"jk]ªõ¤r^›"PW—ã`*$Œ–vG'©è$Är3Eèt D¨_¢P"Ìâ ”0Q(mׂÂk…~ã2‡µ<´›ýÇéô°¹Ð¼Q-ú;!߬xdo"C÷„¾Å(s$ÀˆËc~óå™ÞøèŸ#Œ{T~â8m} <%ðÃúpâù×h–«HCý¬yØŠ\c¬HÈï`à‚Ûµ ¶ÅJi)D‚i‡x˜ XkŽ‹D_‚çãçKµŽà“CÎ1¯ºÇ®€ ­G˜VÝfeùD>"Ê=&^v>)ßDÏ^‚‰E¤d¢°"•^“š*ˆM¥¨,œW?nWjÈ  .‹im¿¥­·;òã~·…éÛBܨ~ Ê,­¾`ÃEÔ†#ìµ|;"g4D«pýÈDQ¦¿àxmßP”‘{ü`N8"¹lµ»’Ó!â­ zBŠ ¥#†DØÀ«´3u?ÇÅÂoǪ?e§3Tv\ª ¸Ò~Ûm €o-eàC Y¹>P1Ù ümû¤šíh«O€Çø}æJ1Ñcð¥A×Y5¦ò› 4Ú,Oq2àWnY**µÝ\•#n¨/Å—\€Ö€fËè>IJPB¢‰Â3Z1ñxÒ6!hë{Í/?…àÃŒTp —Ó1ÒnND+ø‚.U€¹´ˆ‚„¤–¾ŠD’@”r\ªrvpª"ß@!S&&M0Ì#Üí8}%Yf¹ -U\Aƒ?ó;Òõ4ä=Àw1<—ã‘ZC6«5 Dé¢ìŽÅ õ._nN/ß”y–`áS¦aimáw<ûc‘n°Í›!qòöüíÈ‹­…îhùBeÉ'‚«SÀ‘w"zÉJxÉ+꣣ìI„CtÐýr—oöòvŒ”Ë€Ö«¼°~ÖÛi“<…‹;ˆbî¾ ‡¢ÍQûU÷¹B¼%^I"Ìw÷û~þ*ŠÖz."ƒ¤7Y´Z¼4¦¥ÑI[‘U(¢H¯òxË]¸iH½õ’ã 2AßH/Ð.%„Rhæ‡ÐPÁV‹[ õ–¸¬(2¸C!®†³Qãá*—IŒQ‰ßÁ•´\ëJÚ½|lê¦Õ˜ršA†:)ÖÛÑò]2€ `í°yñÒ c‚ø-€—nÒ¬_žßr|½O*̵‚_ú`2LjÌa@J¯aËmkð9;dà£ã3©çøˆþD@Oéc¿¨Â¬+·‘>r`¨ªØÎ/@2TÎm•`á(»>BOÛ†£œÇÙ€´£ÀqÈÌè½Ç,,r%lÅAÑ1+;ªÛi…–›íxy&$®eXŒôlKêØ°¡Š7=«Æ«8åTžFÖr¾|œ“­öÍZÓѽ|CçÐ:{}ËAýÚ0Ùù*Abw‘Æû±ézt?Û=?áz%›yä8-t«ŒÆP½ú Ö^ÙA?SŒÆbþÌHátœŽ³NÚaG‡f™$Ê+¦…±A+Wo̘Ûð’cÉ4ºKàGÖLPÕ»—æs"VûÚe ñ†é-GÈjÔ=ÄXÏ Âý%,?‹´Ï…¾¶Å@=èߺ“„µðõHaƒõæ$<ê”S>…"ã‹vŠÆÚ)‚4æ5‚«¬1UzbL©Uegb©Ú( Ün(ò‚lf jÃáñÈcoh‹Àb3ÔÕ ò}KëÕAVµ(Š4z‚·½}m© JŠÛ ¾Óа!–Âgl1ð!ÕZË¢”¨íIA¥-½ªlÌvÝ ½šO¹äòí¨£=¦Æ‰ëRh¬.*ƒÐÀf«Ó;eŒ²S8 ø(§+€—_¸D¯Üà0‹9„dh:ø—Ýh·Z&„Á^|5“×ç5îâùE0þ²ƒâc]  àwHiïfàm†½‹8éÈ{ލ¸˜>=Þî"‹^È\¬°1ùœ:£2+)˜50…~…Ä xFHp&ñ©v0“pA¤ÔÞ,`3Õ j«ë~:î6|ñ[N'4p¤¯†§“€(™>nWwëÍšÛ‹\ýºß6eïý0Ò`ÈX ‚>Ÿ—Æv ©4öD —Ö;¢¢µÐ:¯Ekù T;ì²IF1v :~£èDa‹ ÃÊ^òÍfŸc³¯ÌçéÉŸãóë~¹’¯Ê c“¤Ÿ,¨…T,îiŽøÎd³2çè`M³‘æÉÄD/1OÝÈ:ØüDu °é5“ïžê ªN¨Ú[U»jPp*ŸWCl¡°bóü=Ý}–tì`?+3z€Á”È]ÂtU°òòÍä¼Jà› ºöÂN ¯S´»G¢ RÕyé¶±ç G¤§D!­{À( :i¾‡§Ê0 w?.tGè°°<ž¢M¡§P¿9Q `ò¼ê›´“u ђƒ„(à‚WÏÃB¨0núë-p ”Â3¢fÝ”5ÙÇ~ó€—mŸ•ã<Íëœ~ˆŒí hÓà šä¡Ûi Ž´F'*ä(}«u¨ý‚x¿"`_#{ïÜѰÝÈ †Ç"ŽâÅxÞvÒÓÑ–_yÚÉV ½ífȃåaåÔ–ï´t$ûUâw4¾D_ŽôG HΩ­X½$¨9€³–~NN"(+lûÆ÷Ê$zºkGR⪯…)Xhžßsõ õ]SÎýNGã¢'›N¸~œ¡XLW‘OÓŒ‰ø-};‡Ód¸--li±½^~ËØiÉ ¼6ª3‰ï5‡ðLy¨(„PßèqO=?—¼j§©’ÛQ._/Té’ 9¬´— éUÐÓiIÄbX,Œ²È’®pvÂ~Màm©jøÍæDÏÏ  áu®êÒ5Ñ×/6~ð6£z¼/³FQ$päÉŽD= ÈùP(+¤ö‚ÊAt³Þc©æŒ 2øµÖk»ÒìMúÔÍËDQs…wã$Z ,V$´ÈÔšMýç˜Ù%«ÍL:h¥h'Y¨bg añ “__y2àì¼ß³´¹@Ò'…`ÂR³5ï°ç˜ÈHJ‚E}ïYn N¨(„»¦ës ˆ5*`ÑÞŠJ¦‡”9DÍ̆wøp÷Ì+{Â‘í ¢@£­Qÿ‡#bžüÊAçL üV€}éÂã„ôï‰tÛ!diòµóc—¸ËüèeˆA™ˆZ4Â?ÑÁc–+?j£Ï™§ƒ³±Kë „åcDþÐR•ð´úR=¢hG°v‘E)&G(·b‚DM×(\wä+é£3 'Ÿè¸Ž[©uÁà›ouš#y®ÖN.?òtJø…´0œ‹k2—á#î(3j7O€ŠKƒZÑà zË J§0ô­4mØ|ûBFƒƩ߄ŸÈ<÷ Ò„ò§%Mtð!‹Î_Zí¿8Þ¸Þÿö[ÿÛmý¿`·¸ŒÆEƒü×¢1®Y­[~ËW³Nã‡x<ebÖ7ólñóZöæ-†“Ç8$ñ°?HÒŒ›¹¼‘ùtj4Òt$Ótr›ÆY–<ÄÆ29. Ò£lËF£E?éÂ8“ÅCœfÉdL3Ót<;J’ͺ‹r¼]„î·:í ô´çèÈQòl¤#w¬Èɸ½yMÆÌPÖQ]´JSؾE·7cPË:QU–¥½[bòh—.é»à,£,!~9tB“ë„åT@<£l˜s¹[=.¯1wólãég‹^wgñ‚¬ÿ¬„R¦Ü~0X®7ñ;dä$ç/3ÅÀAˆp±Ñúøºd:•oÁšlùC^I !c¶´k¸õ†?¿J}£mÀ³3µ‹ÁR£ÕHó=<”{DÑYÆ )®Ÿˆ¢ÌÓÞX–¦7%#r¹-Ãîm¶ðÜ›d–Æ?Ï“Tã'Z2œŒ‡Ñä ðÅ0¹I»éG´Bθ;#g~géÇé„ðš‹ÜŽ›ÍÒÉøvÜÅYr;¦#‹ì˜³´Û»ïÇ7ó[~…µßS­¦‹~<Œg„cAc‹a<¾Ýi­¥dðD¸›ôYÜ›-²Qw8\ŒºÐ`–ü-Ö¸3|ÀÏ&Aúë$ÕÍ€-\<ëÞ ãÛî´b< ‡m¶äú TlyÑ££Ÿd³ðÛºtNXĤ“Ñb>uÇd-ûÚ®•à,RÂH“ñ¢;ö'#ò74l¶#ð)9š]Ìîæãû_;Ï- ’»Å YÛÞÍpÒ»·¶(ñ]úÐEÓÔ¡lÓ†X#ضް›ety¹¯9‚M ±@E(§Nèæ÷nŒÛi6™÷î*xŽ‚“Î)u·‹ þäqŒÆ‹ ɸ›¤hLÐhB/Ì <™Ï&ƒ´;¦bkhCz詬¤hyën2ŸjMcI‹ÜUd>ä@N'Y÷Qw6K“ûú<öº B›“ÇŸ7í²ãï#X¯;…&7óÙ þ kØÏЄ‡È¬‰ißÓè ç}B§”l‡d7§DÆMbê}êkˆ³xÌá Êž:g0L¦^1 “ÞGD F%7¸b¶p&â.Y¢^Œ›BNˆ8”ôÈ "CÊìòÛÿ®› ¤!# ÂC®`FR V1ŽØªÃ$R½M+â.ª”ÈÌ¿+lÕ`QÖµÅj‹¹5X+QVƒÅ«ŒÕ`ѪY{Ïir†h‡A±ÃQ=oS" «û (^Y é•â·ýÈ ýâR(9Â/±+·HøB.n\ž ~£ÑLzí–gÙU" ÇØIj9v(«-Ør-PЛãŸç]"ÇþJÇ’/'3d—X±“aøÌú\S„Ñk¾¸£n/ÐË@öXüx4!=9r’¢½*îÁh>œ%.;oérÁÕÑ =¿¸õL¶(ö4M¨¬:%ÚÄ(“#*ûg'|tÂ'œ³%w,(ÑcÄ¥ 3•äPƒ¤ß‚OqîD ™jéMŠD-+l2;˜`A‹³¤?ïÉ¿ÈúÇD×’ËS$((ÖP'‘"ˆW¨´°¯,ÒĆ"gDý‰¡m:ÊÞ‹hóYFyDð/n¿Ü8Ë&ö¬¸äÌâ¢ãVáÑq‡‹ßÅq}@šB±ßJ¼öZ¨¨jᯌíY üÃÐJu-PE7EèÇùG.}µ‰ôxEõlqÛà$M«^‚LÔ~<è’cŒå"ʇÛdáৃ07ß½wV3Ö26¦Ë‚}³;lü¨Ä?Ͳá¤á›NÉ8ø‹ ÑÜSýy ƒËs`–÷£>ÑT&à K“¬tN ñ†Žìõµ`"± #VP„f=²æúÌ%ˆAÜ"äc驪­n4½™(°Íj4éÇdö1çDÕ3#䀆î¡ãÉŒµ¥á;ör9­{“ “Yg„˜’Ûd\3¸ÞDP' "m3˜W„¹mó‹°Uq–ŒÀ‚Ù`kg³ÒXqg]n7õm`q^B 0Îà¥%Éî4»¬†ñl)Á"òpÚ·-Íl†O­ôµu…è./H s°j÷;§ì­z•¦]x¶N‰Hl9…¢ay68µ…ϦÝa<›ÅN@‘}ŒRhžmÔÛCÙ©­vYÛwÜ <ŸMçÐHïnL®«ÛÕs˜Ì7ãže^¡ï!c0‡ÓÆ«°ÈUK,ׂÅ)¦“”PÂè&î÷¡8u¸¨ |ˆŸ4܇ÄB®²øë¿ìaØ]”X€¨dÁ:ü‹TQmm è[Kh•óS€¦½î“k[²ªé d!³~‚^xtÈì¡?ß² ϶$™Ø!§¸ð§É¸£]Ž1'òÞ]¯ íªm’óqBøUBÎÜߘøÐ4¬l&Ø1,<NÞƒõþàþÈ&ÒIðílP&I’ƒ?/¸ÙƒÙ(%³¸N#y˜N{‹Û´;½Kz™­o€%™«wqß~nKJSÇ7ýHä{pï“zõ€ô"¬Æ uõêN‰Ú•ÜÞÆ6u¶ˆ>˜‡Ù| ršm(þx¢Æd_Šd.HÃ9'#è¼[k· Ý$„õ™[_‘Û˜½"z® 6žðO;vhý~&‹Io&Z‰lðišŒøølàŸç]zÁkމFÂÁÖþ30÷ö‚kGàŸ‡vèt&Ú62:"±Q¸×pûe4дIë邆ñÌnO£ð&{²c¢ÛéU ݾȡӲ/bJ$W"NŒk„Vs²‘t+,¥¢y"YÀ$‰MV­ƒÄ÷Ýú6lb,ϳÙdd'˜¬fɳFKž©wbŠâÙPÀGdÖ»‹ûö]É/j6™Ã#5iÖó¿^ËY5€A·²à‹0!“›g°™ñˆ9ýu‰jOþº`НyþJSctO'øÛh}b  VXžEXÇág àoC˼æ ™Ìà°n†¬»9ÍtKh­~Ýó0_ÏŽ!îxÔ­‰ÞGܾb@€DxI¿:"‘‚…3HŽ ží¸åÚ§¯æDèäO?®94þâ 6æ[rMÜÂÝp7*åhÚ]ÜR«»åW>I£jŒg`Ø^Ž8ˆ~h{çc*Ùhˆo®[ÊÑ”0¹n¿K”´´ÛןV p&†¡X¡ôy÷…é2h–ŒæC0Ÿ"´VÛkûN¤ì™Ÿ꘬wwûšæ(Qè£b7%Ð!yv.móàߎÄà=0 Ù3fP‰8M!¢óo/ؽ;)™P‚$tW§0h´íru }ß ‚¥IƒÅ»h‚³À`3Q{áÚªv-4éêRlòuç÷!š€óiô ™ylR>*"¢ „ÀŠÀö à|J–ž ôÉ3õÔ:õ`^9‰T˜LˆÀ ØøöL+’g"Ý}ÌK.ìg PäŽ œÀÀMr¡¨G¿Š?ÜÞ³ˆëåi‹Z5Û2ôE·7M8›Á÷‰öHQý1ýì# Ú¼éRïß­ÿ’0wÆ#4_ßRü›Ñp­ÓPYÍæ]ýIœÍ°m@3óÕ9릷ñL~é5ú²7œdÅ•¾òãñdèöÌA+#}³¯õ¾• ¿òë<9Rötê6›+6»Œá IcÓè{4Nãûú]êõú4¼ü’ÄáÔÜ„/úÖ®7!½ƒOhŒwÝìNóm-oŽÐò¨;ÍîºýÉ#Lwš É÷Ňð¾þ ¾*+?NnÅg˜ƒ”Ãøú|Ì ÷бõ‡XtÍŸ»¢¥dHãJ¹éÒk_ö ßvø²þT»z”3Ÿ1ç“f[ o¾„ÎôÏÝæió1ëžP-4Á„8zæÔ߈Ù0K›åù¾;BF³Þö’XÓΈ0Qy…·—<òamL "]à Çã¾¹¸MZx˜¦“›¸;îCä3Я¢ûú9;LÆYL¦àÝö7J•}A­ÐP§QCd{¹óý¼¬µ°~a˓ڔ~BZï“)$éT ¶,ÅOÆ}¸gűUzN…¥NƒO¹Ê¦Í§×íÝÅÚÛué÷ìÍ WI„sè³G/lØ\Íɽòã>€Ìä #òÅl2•-Ô“I¦(“ì"=,X(+ýY'úÉ‹`AÃÏ&ƒPøÜ >A=ùM?‹Žœæ_ ~¼†_ÍÇÆRÔëŸû=ƒ8õ$Æ7s e Qv|,xá‹=¹ÙNƒgiB¤×ÅÍlˆÕµúúšgJ)~FÖ"³p~ìÆ1~fÇP@INUÐnÔ:ÂD!h®û•ê›ROTœº¿í^ñ 9¥è‹zj™õSÍQ£‘z5€àšÂdÎ <<·k©Û£u]sÒî:d_‹‰¿°¡ô¡KîôtÆ^Ó9œ{]›„ÊKfë]Þ Ï²€¦f/‡Sñ¿G‹ìbæ ú×7K˜=&L²ñƒËšŽ§|0‹‡[0œùÑupU•O©}y#ÙGž„ÔLµfšùò†È©Y°5£éØÕû&:½T§Ø‹‡ýR1ÈîØo9.6‹ñc™‰ƒsIË–‹IÄAUo)k¬<˜Ét=ùSÒ$È{|µ‡CÚ¶ýª²K»ò’ñË>x5˪Z5•™p8í[$Ž•Aêg·©õv×µUg׆õ"¥@0•ó9Kr¥àJ¦‰‘†Bcéf¥Ž;ôËÁCº¸›ÌîãfßTf¡g‹ÙØ‹….j{¯Ñ‘ˆè [™%ÀX"#ìÑQÄÎãø‘\ÁÓ9Ž4ñ¸G˜6ºS<z9ì¶ëЗYZkãC/fÎ"@»<áTÉ<ߟrúðÙÛm6ëU¾šo¿®·ØcalOëí9Ïòå¥k61Æùñ”¯ä? ÿœõÉP¾–ÛG/áÓÝnƒÜ9¤-Í„eûüi½ÜÀO“·üp8o±bT=Ž.:B•¬š¶£Z\Ô²`9ìIݘ“‹PkÏ*ûZ>êÝÕ^*!(‹fÍ„` Œ Ox¶c¥Eô<¯†oÖÏ[H{m¤‚mk8ª·°±g“íhH,ÓÍ;©ã¹ÚpO§ÃúÓ*R<½ˆRŽÒgËgMJ­€v³<®Ÿt¸Á»ÓKŸ&‚ßiEÔѱ4Hü»É‹S”fÎ>,¯VIoކrdE +ŠÇ/u Þ°x»š|†¿ÁÃ…Ò %ƒq 4³+¯0d,®·_ŒEJ²ªZ綆Y1,/Ò0™wÙì½;À“IìumŒ;µÉ¸$‘1-GûDÜ»µy~|OCde*©'\ % d¼àÉ‘×!§ïçÆœp÷ÅEw0x´\oŽ›Ý‰'ŽÖö7´àé3±¹“aQ¿ c8Z;»•1ZG¿å½Í²è»Š]äj°2/Ý8?}ݾ@NZ£¿ˆ%rÙ»ôµ>)—^ÿ#_Y1AŽÏ¯Ëqa L“Oà<’¬ŒuÆÝM×{óÐzrw„ìú#! ŸÚ©ÁhíðÊ «ãü~vâcùù¼;lÂÃ{ÃFDÚ<ížvÆðƒ@CÜÚiiûåá˜ÓÒF‡x©²ÏëÏõl Û7°v›sakñ²—ÝádÙ~<*r·+ ™Y0Šç6ÐFt:äKã ¹x%Ecîø°ÑR1PÒt˜oŸO/¦¦92&j„ˆÁQ^·åóA°<ì*˜ìàhãj¾ŽqXC¹¥9쎆×,¿ÇáòS¾©¸ÙŽV¦æè·ŸÙHÃ)ÄÓàŒÀ›å󱂮^yN~¹9èöª¼-z7gìo¯KœN.ÂÏË'ê“B&¤Í^i꨸+©7kL  mLfž&Þ’¿d]þ“D‹Œ:ÆæhýtØAá¡m¾A+7>³vdNðïKf,ïz ïLlÇt<å½ê—DIú2Î•ÄØTñE2;>¡ñˆoF1kEÐóÃ+«†6RYÐÔÑå~ý„17§qþLs¯¢%eÆ)@S¼’ vV®Ê‡ßÏ—L,痎昧ƒîó|/ Ü`ÏDø]~¬“aúsî—þ®d#Í!AtïgP®Ë¸×Q<š¤é3HjAM>öŒ^P‘9¦RebUh°4á§YiЉ €ær€í8¥iÔg‡e-ñ'å‹Ý=B5ÍNxWUûq ÌÑz5Ûí‚ÙTF´ü¯ëcMŠë¡kÆJ'ýy¯Ê"1†bà«óÓi¸ÜŽ–Û1& c%@ñAÇ5ûD[›ÉÍb2«@“Oý3«“˜³ò³¨ßɧdû’¢OBÈ.¨—æË£vL>ÁÏòm<ÔnQa#%7Ùf(`Ìù”g‡dLÑÃê&hîü»¶Ôò·Óå3ÔÆÞm(R…›£_ƒ2"Ò2ÎQ‰‡Õà#T[Ó´9 Èq€L jË6–ÎÛ†§KV(¨‚£¶Û&‚yúöKWôZhU³@D,7΂å+²9´O+ƒådösL+7`Ãû}ÞO&"¯­a„›8žâ‹•þž©]fP–Ò¯Ìi(ÍúïE:fóúû}žf“DéÏdT÷³É{ÔÃÏÒ ¦Oúã]r{G›g‰Û]­}HõŽ-äìÇQÌf *¢³߸%¶Sø‘ÕFÀ'’Âîoú¬:K/©‘ ‡ËôíÚ"ÝÇo&,‰ƒãÙŸ ëÉÜþS2ÙXFg´×~÷“.‹ÁÄV›¥,îÐÕ†1šÌ͉…œuï~%ƒÌ°‚N!ãxö8IﱺA–9LF ÝkObã1˜ÁY¸¶~4˜3M]¬MqÀl>¥Yôº#Zîs†q7yÌD‰W£ ö3-¨‚mŒ FÝSl~â¿'½ûbÒzOó›ìc6‹éú9ZO4ÓlÚÚŠeôâhžMno‡rm5ª€aÎoôß5/þ“|åçW[Ò–Ži×õí 6*¬ÿSþö1Âa5è÷9«á¿'·ÌÑW[ÜÇÉcèc>ä{E0>ã¾öv‘Ê¢DÂb<•7R†aR–¬´ÒFÚÏ?Ÿ•ÔZDˆ‡â:ð{þDþ˜ìelOXDº=ìÎûîg¢:ñ'·ˆÃÄáš•J· $Y9\j"a"$(ÈK’‡%àB%' æÑ’m $ݾqóˆVyI¢L<ÌmÌE^φ£‡FE”ì´bKÁg¡Î˜Â™åŸº«”µ¬Âl÷%ßjõ£$hþzTå8ƒ°’A<†\]6‹¬ Þçßd!*5ÕìËzÏ-]û~¤ôöÌÂÿŒÞ³Y_8úUößÝ|]~;JX놌M. etiþ÷s~<áoµQ¤ñ­t·/·ðNˆþ7>ñÒå|/¥ÔBa¢ì3;Z`èÉßO½M¾Üž÷˜ARä~¾ÉO`„:åä›G ²¸3ƒVú8Ää'¶½Íî˜ãSCÁD:±Úaì[Ç)…ÒâœnÛ„³±ó¯; Î)4`LÏm•"à*Œs°9_Ð+ «àF:Ü-WüsÏ„zć_c«Ó1¡ô1Ù-f„…Šß¶itÞœÖû¶¾cÆÊLÅ|&"”Ö‰c`?,‚§ÝA€ “É–oV™þTÂû,XÆbt,(˜– cœoÑ6ê[|È5:o•ÙF†¸ú„„ªCŠÁeç”à` 6‡WwŒ9š¸96D¾% 6éÈ"âm—€ðn…6 åvlxnS­_€aš PL²ŽEë™ ÁZpŒˆŠ˜Z ¨F«Ú¼ÊֽтV®féRÖNؘ‹viΆ‹Ûx¥‹‰µiÌm¹%÷çm¾…”ñßÏZ¾þó-=‰‡Ù˲`ÎÏb¢pCìP2‚¨"¨%vÝaüKœ†øöÀù}6H–[õ€¶J"¼îóÃq§B¶­ƒš1q“RCi÷x\?oÕ¨ŽO‡õþ´Ó2PVcE+E÷ØŠ¡/׈'}Mªd/²Wú¾~ÃìK®þë ´Buv!‹­g³I ò£IR¥e]ddpKÚ\÷éÄ6]oŠj” ó°T ¸hmP«´í"Õ¬ -P¨7»Þ>(èàB\H§ÀÀ»ÃKX?¸ÆBUâ!- RR?’ˆîÇ—ÝfÅd`\ÅQ@†KªAµÍßi¥ú>Ù†ÉÛ©u8˜ÈÁ\Žs&„©V¸ÿ¬Zõ,PÔ¦¦o̦2¤µæqƉjUzUhÃÉ#ž­ e ®aCsKïâ. ½Ѹ¨*æ÷ø’/ᙕæì pÔàzNFÕM\BQGÉtw8áâ˜|ÚKâ÷=×½2”úû`Î̺¸J£†òa:õºë–¾\¾«ÐX|8dù[ow$Í|® Ò!¶}+º±(†W6CRn¿Mžà1"Ö]SÀÞ¨g ‡McË LQC`…CRfc¥p:àý¶JáS-‰oÎvªcs³‡}àc-‘²#D’D¨€Y/Q“ŽJ¶¦vOôµ ‹@yT,ZÇήˆk…óÓáÛòhh,MzMéµ õV©w\’Øø‘`Ò×Ð…¨¯¢6X‚ ]%d ùì… û0hŲKÐÒäön¦UÅ<ˆLŸ¤ªò°cΧ…>Œºh¨ì>°ƒe·¾7ûõ¬PÖ±&t1+ivGdÍ>öî-‘@¨3>­6ϽYse=s¬8ñéë;5*“YËŠþ¾§žà®ïiûx{"3c-ù_Ó¯K"å#^Ñô;ð†xÅ[ûð~ /òÝý8ÌB¥z-I•U±4|¯_:ÀkXWx¸:ÜíNS@JwçÓz‹‰†™ž6Ð6Û‚ì´¤÷^dÃÜS¹˜›ˆ©¡ÝÌŸóÀÝ×ÐgßÃ3(,â:?övgV€É-WòÙ¨›Þ&c^Ô¢”à”Tµ<<¯·7»Ói÷j“|˜>Ùd+ÕS¼Àtýür’*ÉÿÇüÓÿÊfé¼'°Ÿþÿó4¿Õ_|'ôþ“üú YÁª`¶ª¿N~ùé¼=Ò÷âÿØìˆ¤JÐþû¿þ yÿsÔV*û@ë¶]Óíwí­ãü'oøŸ¼©íóà¼}â kïf}¬óÍê'ŽE6z»Z|Z£½øŸN4¥ùÅèžBÕX§DA í©Qó®hþ}mŸ‡õÓ€ê;ô¬=ºM{,[fO_fê²W¹_|è ÉØ´ª]õ½€vwÜ?¹®¼?½4ÛϰfªÖ¾#,'?p Ý_G4Ö>’-ý¶¾õ«hÆÚ%$€¥—F£¥¹ Ò ®éüæØ Œ®ë6t®ë–>Ü­šuì\sT¬ýfðÞÄí6à uƒ/#Ü’“ã·þ}r¾ûɹ’„ýßœ‚ý߇€íÓýNìý 😚œ?35í@F“Ã^þl`E‰e´¤¡X‡½Ä¡5DÑcW#¢™ŠÌÉS°Lü[ÛÆÃn½ª›Gd²õäx<³<ê<Ÿ÷eÝ Çm¢&r¯I$×µ¢Ô»Ú±H ]ßãùïQ(ZäWþÏ_Šm•Œ‰­] : °DQ¬¸¦úô¿Øßþ»n3\c3T /¼ÈX !; }€r0•u<Ê}w>݇´Ìƒ La™n}•°t¸ÂÕ’Ã9¿¯7ëåᛢA¿nGäÑz"в¹Á½óá@¢“?}îäëÙ/¡_{<èR÷î"6ÃlšÙ×ho]P]Üóä.,9ókÔ–ÅC!Ú¥ßu‡å75–'~Ú-ÜS»Š­dö߯,˜ˆߨæC.D˰'‡5Qç—÷AiòꥤŽÕ“›¿BMS?”ùÏÕ®TèdÒÈõ‹WÛkÌ’9Ôð§°ÅøS$-áh+»Óž>RÌÞ™¯â^:`³üf;4p&ªMØb‡€ 8æ!ð«[·‚ZœýQ0ôÉ#}—ž“ŒÉV4/^|MÚ®;iâš–ÙúP j늿8QéKÍqŒE»`N:“sk9ø?÷ÓD&hdÞÜñ,N³*)§~#þ°«ü¸Õu“a6„ʳÿCÖ–wW°n¾òÉçÏG:>±ªûš³©º}P<äBCfèšg‹…•¯ò÷Æ Á…¯*Ÿ™ðJc"—”Àϯ‹-ó‘.MŸR¼6mò¾ÈAÐD‚„<ÿ4+ÔÉßšMýŠ45GuÉñ˜ ôn i³,Û’èGìȯ˜‡y3vWoK¢ËM¶zÀzõ‹!/êw;Kf!õ¬ZÚeŽP2,±ž}Ù„ßuµuY޹+e¹'93u‰L>ÇïDü1%I£ŽCLÎ'ËWu›¹‡ú»œÎË–!ø]n¶*êÖ;«¿Én®ÚHRtÙÞÿѶ±cÄæs—ΫZzŒ‹Ï“o²«ßéU¢ï5Ââ« ã­=¸IÁÎyöŸ‘÷Ãô¦n7ýŽnvÌÍšÎzY²HãŸçPö§Ê{ Œ‡Yah5äØÖú^5¬»l(ÂIæ™Mš]Š2‡Kñù‡·CÓ~^?kâÕ‚‚™o¥~WnçI¿@ÒÜÐÕiDà/ÀèÝi]ª¶˜.½å~ùi½YŸÖy#›¯ØÞ^wÚ½I†É,‰³ºm4ý7Hµ; ÐÚßÏëC9yøf#å.¹_&v’Rw¹ŒšÇj‡bR”bº×°¡ <æZúø²~zÉöKôÚqOks®«üWhIX£zAŽ?tH>¬.ä7óŒU\$ý_ÃÚ+“žåï§ GÄiì$‰ž–±òê,|dªÉòmUnˆÍNRaˆö*žµl¶wía²9C/+lxݦFmº´ ïKôÇuÃáN_‘>óͱŠ-ñ1ÀM;FNY&%bs?©_Ö-OOÕŒœå*sI^_½šÏަá­Jnd…aåVšŸZöKÚç Bñ%$ZÈ5s´[žý._‰ «ÙÙ©+J»•ÄS]¡YZ^t³<¡wõ«:(›XPzí]%ñ°Ï…ÄR{¡t%¸Þ5×ìô°{[¯òcÁE*¬çÃíÂëL÷ð|¹Ã¹ö­H4à^;+Ñ€×H˜­jÁÿ^Jc»eò%Üly£ï]º•ޢз¶Oà=Âò dQµ¢;ÿišõh™g›Èjˆ¸–ϤBoûÆ3'CÓƒJþWö•Wüêe‰ Ò­} f§ ªUug.ß$–ÉÒ†ï›ø,ë„LâlûÆ5§49½ØÝÚ ŒßÖ(ÜvEÌÂõjÜÇÚÔ?_¯Îl]ÓÀ+ÿp†ï"CÀ´|S¹LÖññÚÍEìÀ†¸™!v[p±â[˜³uü(¼¼HIÖ/Ê)É3§›òçþ‘m[É0@ø¼~¶s0ÙÓqm¥çb~*]òvWÓ„ ÉÄ­Z=¿€^f2®«xPLš¤•ºq­—ÈüŠèýäô^pÜi [q8¼åúô¸übm42בnfõÖ—Ü-srjË»EóqiUº¸<>)s×ⱛ̄ÜÈmZUG¼c_©²[ry@F¨õ!Ÿgȶ Z‡pʤK+n<$Øè…ïÓõ{¾Iñí|™PDžoÊ»Ôå Œ…-Bê^1…%k¨‰<}v·èòᇷ‰:î>f”t˜Fm”œ¬f"Y¤4£[¥o˜¿å›âîZm‚OÜšî_d  óñ¾Û|jG9ÊÀùÔ;îo8-Ó²Ÿ.¿¹›¾®zjšX½:Έ ´ šTé­kÕg˜_J' CÎå)2@óЈ#غÒÄT¯X‡N蔞Ԧ“½üT_°(Ü*®/ŠÆŽ›nGÓé¸×ì]X—Ñoý¶,/lÛ»~ãníì=ôÛnÛ&ƒ¿9Çç×O6Õ†Q¶EÙ4ã+hùÂ|‰*tTÐj_­x)°©Ü‚@MÕŒÃyªæ}’¿ZÕ#Kà •jaf9²"·­ÈŒ( ÈÅaÐ ¨zšÁÚÙrù$K(©ÓÒ¥¼}ÿýyí4{eóúý~²¸íŽFÝEÚM¡ð_²pL j¯µ ­Gûôù“„ïÞ»^9¨ôöF¶P}xäía¹Y?‹ïmÚÞ%=¨2=îÇàÒ'rçè75V盼cðæ©Ú`iúr‹qèyÆ#dˆàU~ñjÞww´^­6y“× íÈ· :L·(_Õ=ù…žï”ÏæÚ0qÿÂÈt˪Tõ]Ø|?ÿ 2n)¢2üÓ³Nʽ´×ý¦Y¼¡=Ž×»°;r´¶çÍR³_TÎÒõyi·ÃõëúÔ˜^D¶Ö ƒôгÛgžcºAŸv½<{‘â¦kPÒ¦\Ø%³E7›¤=½uaÚÛzå ­g$úu*ƒÏã•¢¬žÙ(ÛHcÿ;žîO¥õiàà8" ²þMt¡”éG¾9=®vOw›õÓ·FŽ@Rñvê5o6Ëú´>EõA­òÊó“«ñ;nËY«qÔÌr4£Ð|%“ºK"ëµ*? u1¯RÜ.VU¿l Q©³fÖ4”¨~°þ% ¸ã^8/.+Uóýã(Ö~Ç-c6LeiÆnzóÇc8¿tŠÑSŒþÈS ˦ÈÔÃfSDªäpŠ‘é›_aœ \Å’…G¸=¬¿Ö–a5JPÛÐ(áG­ Œômf”(6\a” ¡©Q‚ž­¦F J¥Mì ¾=LŸ+áÔ@Ôo»ÞlÎÊoêóf·,H 9MÅËŽ‚!Efo ÖFwû÷ñGíÎ\}…²ÓMÎY&úª ýüúôw»#ó|»~"Ò~v:¬­Lýî&™A-œ…¦Èž·ç#šYÉ…pw“γ»ë>í÷®ü.Îî¯ûJ‚]÷åmœÍæi U×5µÅ®ürtå:ݯûN$/½êãôöÊiÎ&s¨œ9_¹CÉ8›u¯üvÜ¿êCõôî¹Úپ٬·_šÜŸØHúUý1>‰ î¢FϽ–u-’Îgz¿£ÝJÝ¥Ží=¬¡‡õþáËlw³nÏðp¿˜M„k™|%"iæX­ ♩֘ùONL4Sg<|h+ðõÃéc6KõeÜ=þ£‰O¤1cúoǧæ#yœõ1,ãM.lL0+ÝIø8Ò’‚´Ò„òŸ¦_·«&·ßËÁ IX›èjŸgËçg¬z•4žƒ*AD½É´R@íò™ÔíÞiùL8ÕŠÃËqòB´ì¹ÑEïÍWeýŠ2dP£Õú$ývØQ(mþµçw1ÚÚl:Ör!ê”ëÍX&B6&|Ñ©šø`²e}L+PñÖ(²*Ð-ù¥<Áò͇.¾òýú¯öÜàCk,ˆXy³¦-êçÇõ!_©dµ±TÓQLvçãæXºOÚ· ìTˆ"ËúŠ•àK¯}ºNmôÎë’è{ÛçÂôjÝåía²¡ÿ+âdã·å欅T =;Óm·d^aÙTr•lNã^ ãLÎ’QÛ†¹ìÑü]"‡v€£eÄ=EBá ²–È+öÆUÓü¼ý’½¬?Ÿš8‡ñ”g¿NUC9¼*å+ÖÏúù5DPé"ú€ôw4ëNw»Š·Ï8Cs Ï Ó<É©¹5Sc¼nò™N¬ÙË~³šXàÚÍ&CÈk’Æ3¹{ßK8<ɽ 4Ôÿ)½ú)Ù \¦I.çGµ²ù§ó3Š#uœŽÛäŠîZJ~¯Gv”ˆVì*]¤™FDwÂfÈ!³}øÍ°ÛlAM1VOUQ­é›V±fÙ ÙCð‡¬ ÕÙ,Ž«¬>Â-9Ÿ#Øbä¸QA ‚Â7Dì}zv¯éš9¹­FË­>žíÔ§­¦ŸÊÂ]Z×®ñ÷¨w§ÑÖóç%ó4r£*65]ÆÑ{ïÈôÁ:sÝÔ¹Û½æmªSW 7Ú‘©'Л-ÄÔøÍ–}|¯Ñ9˜†ßo4ÝÔi1­!¶Ã°£fØ®´x4Á¦¬¤!9¦K¤ÐlUR'`KÞl–K3Ül ŠÜŒk§Ëw~faÚKËxìwdô­Å~zG†åZì òvÚÍvrÅÚöša3Nâ6SMSnî„ ±Ù v'ËŸ{Ç]U¡öjÔ5fS«ꀡº Po–|ÿvÔŒ¡†Íb85q¤Ù)`BÙ¯#OµÜ«ø¼6eô^_™[÷ÙbHZç…¹rëQ m&hW6CÛ :•í¸l3£*í¢_…ã³íkUáP¶UcvY¼|Õpèhü°j4Ìé.ª ‹ß© •ï§jùÚìÒ®.e¿_5Ü;¦ÅáÚ„tÏ]̧}þÎ(µ¦ªðz =!½yÚOR]áèïŽZ¢¸Ê7•éú²"‡v»|}]ö·7$s”©˜-[±?Ӈͬ¡R%Ò]7Ñd!K*dG­™&Žb£œ™Ú¸C™GÕ4©™ƒtÅã¤ýýZÆ>|ß¡UÛâ¥ÔVM+ß+?¡~¾Ý½®·Ë†cf¬‰.0{×Sbàî™ðQë€ñ­q6Ù]o2œ¤ä¿ñ`°èwGIoAËtgfzþÃñtA¼ÿ`w>œ^еnYþ´Û®.ˆL˜½¬?ºh⃔¥3üȦ«ÇoŽ–ïwÙ·íÓàÿ]ñ…˜Ï_ø›¨Á'ë­Ö ¿²ë¾ÑºiU|b¸bSæÞ lF¨o!å=£o‰´sqšeÄÆ(»4ïaƒp[=Ün³;Ü,ëã%ù)CtÓÍ’¦‰üi~fhTžW¦YX/îêaI˜={ …ntá,§É‡x¸xèç±xr‘K»é0ë×ì|ø|I" ð„n˜ þa}\Ú䬮Fœe}XéE¸ÔZ¸ƒÞ.¶ÇÓa¹Þ¢÷>#’™ÀñÅAð ׾d\Ô´;K»É¸)50ǤkBËÅpvìÅ$Mn“¦ÉYÓåö9§´GÉßKùqƒMâÏ”¹QÕvœÃßþ8Ó{»üóçþ7ÒÜú‰N™W›Ü·úÓf#—Kµ›‘ÿ÷szÈ?ç‘å0Š.ø§i<ˆSšU¸Y§„!ì2²Ë ÔG(žò‡¤OYrK®AöÖQAIEdnͰ¥.ãjZ5ËÒņ2€–鬙½¨Ûáz›O«üÀýsüè²»U›yÖ뎇É8&ûÏ.ɦ‘ª»Ór#–Ço°:šäâ¶êW‡m÷‰¨€ËÃꮥÏsÖ÷»iÿ*Q‚´4Áfào1íÎî'oioYìN¸˜ågÊxc¾Î;§BZÙƒj-‘ûcœÉJNæÕµÿ6=ìNù“¬bÕµ×›L?NÓÉ,îÛ£êuº|¥fFÏ õÜ(J2Õyáëž(m´ªÖa^µex/h2šNRB—0Ÿé6£ÞÍø3ý€Åsëw’ÿÛßIfßöëÉ¿îzB'«&Ê—Ïà!qÕ›T™B :(áf ³¡jÁ½\Ô«§\h7Ty,§ÙŒ\·Ïùá 0sÖOvÞïy4¤ú—¢E6Ÿ­Vµ…’Õ°ó |¤&ñ¨È2¢«­5ZÒu»(—Û2G˧Ãîúøt÷G¾­Í\Sõ½ð«ºœ7ÍÒçØ“õ\Øñx§ïL}þ“ ;ÀÎ)WfUº*c=Rè–RB²"·fÓ\B¯Æ*E8QëÇí0ëÒm7ëÒÿU uÙiý€óÓtˉ@;[mÇ»Ç=9)ðÆ^/ ùj´|ÿqË%:ýqì¦w>žvÍò+Yst]šæì7=SÙ韞^š²˜_u¦š’›!Aë¹yátà‹ð×]Í‚™55¹ðÞ‘ðQ¯fáQŠ+ßAÔà'µiyÖ7šM­ e²‚Z‰Ð°*)Ç\e®t ¹WÈ:ßL;ÛuÊ"çõöqÖÔ ’´Ìä”UûfóÐ A¡ÿç2‘C›&ô˜‘…ãXS…ð¾̧Á/{U‰JÌ“CÜu”ÉÛ w•ùÄ ÷Ô+†î+•É÷å?g…»Ji³Â=e˲Â}¥Ûྣ4S+ÜUŽŒV¸§œ’¬p_¹•%‚±Ö‚ÔhÄLuTå´ì ‰„´eï³µ˜}c×ÖŸòvتuŸ†¬G}•uì{^ͼq·QãßE²áé¥õ¢o†¦ydöI×â*«3©ªxMkÕ@Ki>;×*„l²q‹º$þ…Õ /( (úÛ=}Q5\j÷ÆšÖóÒ¬ž1³f75Jrô›Ë×wËÃê+ …Z~Ú4ì¹$9­qÂÖ§/—Mù;©õ÷µY~K¶ó¤Ù|#ë|Ûw¼åÅf½~Ÿ|±éò+¯e}ߨÛίÊáªrìÞ€ uù]ô(lLñ¯3¦8+ûlxCX—Ö¹tm³õ†hŒÉ–4²Ù4êØJ¾í‹»ýG³è®ì|ØÖÇœÑÀ¦!Ù9Ö$Ы’#Ë«ÂÿͪNJ˜ß剪UX€0‹=®]¶m9.M‰¢-k}¾aÑ๠ßj¶_ÖÜÒÎ¥¹¥e¯ ýÜ:×öÚLú²çµvÜk{õšõê—ðËÃëÒ…ÓþuIÙmêÁ„我™Øm€…Í«zPaÝs‘ÌèŠjk–Ec_žNÎe¥D¼Ú‚©ÆL‹áËò°|"ŸBfVÆ¢v½ó’o$‡½Ò+kݧS»8¿}Fò«²v°vD¦ —{éßÇì=½ ±TPZ¿žã6XA²z‹øÃ,g`’³ŽâçsÎݬ¹÷ý=_ùŸçñ<¶F˜…ÚµŠâþ Å¢‘†§=3$”ÐáÍ®Qíå~š<ûÂN̓t!†¢Åú!•´(ÐÌgÕ.ä³J…JÏ.P÷Ûs[×%Ÿ:íd•h¯Õ ªÈ–”ƽ*÷šè¶>êiO!fÍiÕÇhAº&Ñ´¹fI±~åI:jó$“Å,Åie[tÕþS£ F‹‡éM)—Ö¨þ§Æ7g»F‡ªé´ŸïÉ]C8 L R]ö“1÷Æõ[Wó¹KÎwåvûkî.c–²AÉV%ÿðjC¡„²J0ÖÚŸY u±ð<äªlᛟ ´6g&ŒKê±%;Qï7)à–ìîsd´«ñš/?µ¤âx$Ù´;ëÝ‘íƒ|H±¦Õý´Ü®v[ž°.Ÿä§ãnsæv¸_cY´%eU?mËô"ß³õÞn¹!\Y(÷Îw7]Ú;=ÆÚý¼ïiîw·Y{ÞŸ‰lº;¸qÌýîëùíi“_6±ï²¤47#•&ihˆøÔ9ÞBjvrSlˆâM¥Ÿo–ßQKt©QÓ6µø}¿æ>Þw·Ø:„¨Ë& lrå½7Vxá’-‘ÑN ç|±m¡¤ÇÓá jWÃ^¿ ÕÞçùžæ âgÅù!L@«_- »?„µ7ÞU/—®{=–¯G%ºÃÚàÝ©Ê/k.,â3·ÐÌ%IÞJ„nó#§ÉG£õñI `ß)-Üüõa]KV“äÇ0&Òg2ûyó#YÃãrMåú;œ ±(aêÒÕ¨»èö»ÓYl$‘ï¿.eéc3¹45™Æ,F"»Z¼îAÐF6šô»CZ„'Nò·¿ÉÀš¥£ƒrGª«Ðì& ø¤»]±ÈeÈ„“å'Eì„â–yFÉŒFZÐ'Ù,‹g3b}¢Öà ’¿÷U’²bWÇÆ…éJæ¶è'Ý[K†øM¾Üž÷ÝÏ„ºËõ&_¡¾‡qëÓ­ð¡Ù·9$ŸqX-V«Gë4tìw7ö`A ¨¸^²}[nÖ+dæÿû1ôrùsÎ 'iTô/ÍŸ6ËõkoÏŠ3ÑÕ¯ E° ®_£ŽúëþšÝ§§¤wGó6]BM]› +ÑEžNùêâä|cûë峈°âÑv5¿˜)"ËkB¤ÿPYIBÙfÓ&PÂmxÎ"U¯ÂÊHiFg‘¶Q8ÛFpiÕ kÿFçEk”-iÎX뺢ólr÷U¥ÛtÜèÒ±K“PýðT׆PŠžÑú^C©¶I&/c¹RlT©²JAþ#(¥÷fa)楥mêR׉RÀu„É¢O!tÓ~\ ÷;LRõ¬¾Ö?èüº 焎b+H8«õk2wþd&°©ªuuÌÖ¯Ôtºí¶kî?èÔ¾ÏçGZ¨óóò¼91§ æåR÷K7=œ¡Ìgwó¼;¬O/¯Šu79kt1ilï| !ØÝá-9ܳ»QÃÃÍçI½Áä+móT™×Ëñn/ÏÕ(/3AB—$Î9€`zu¦Ñ#Y_"a^’! VOxTr(¨Ln}â§U¾›ò#ÈÝMF•ÈÒs/žxÐ:Vô £¶¤‘æ39!u±ëk3tÎ’ÐúU· ¥P€»ã>‹É/e°¾âF ÓÚçlIY§O«Á2›–˪FQ²]öIXf Òï~hÃ/ÍnP7ælNFœDŠ#ŽZÕÖÿ óƒ)–^s36ZróÜËó\¶êÅ“b_·jkY)ª›˜g(æom©%lnYûžâK)A~‘ŦBiÖÒ,ÏeJwýؤêžAßÚ°-úîEø.´²`͹UÝ^¡p¨mÈ.†ÑTXJ¥y­£»ÏÓúUñ’y‚Ÿ|S×Eo¹TX„:wvQ<ÛÖ{;¬/ÑE?Εç+üeç˜|ݲ:xßPõÉã$Îb´)ÅžÉØÂÚXfÜPUˆLtUÔº9Ùú4 ÷Y<êNï&iAWÍöë­#jVКå²!Ó`Z¨ðÙi5¦ ¤ÂÊÏ£rõZXÅôth\µÇ7ÕW&+­uU1Ò’Aâ ‰:ÓýªQr"¢¿}ÝVï‡aþf«¯Vì²âÖ¡ .^hyüÒ¨v}iöž2ëFü¡Oi.Ú4îMҾ̇òOÁwXmÄ3/«©k¨‡ bVFÇ+‚Ëd5Ä#¿'ªËáU>ÕÖ¥D³gÜ]¥ù¦ˆªã]Xà¢AаI*å‚i¸ oNÔômeªÌ”§‚Õøü=|íóÿ~>• ¥‘©¦zµ¬ÆÌøÃb:ÏîÃIï^³¹Wn˜ Û¹†ÐFçÍi½ßäì:ùíR§[;Çlþªë¯ÑxCÿš ~ö”eK^hµÑÍ—3N¯ýÝs¨–%òjÚéU++Lò˜Š½nï.^t»i\ èc]åWç×+øú™ªrÄ*ØF€1¢ÜO4‡×`½É»ÃøDìYå~´Õq ›¶Äàw‡Þ LbïŠv«ÇÚç!ùÑáŠÖ!×{ƒëA8Í,y½—üéKòyº;Ò²H¿ÃÕù}'[¤T&%–9sHë„ýpËìE†d1h.íÿ=œûK·Ó²üß'Fô; ÒåЍÿ§?¿Ñ‡ñ4@ÍÞk#wÙ2ÿ|Îß ŠÝ“ð×øÑ¡þß•LYkPU¯GKDˆ .ÍhŽ.Æ8?õûËdŸoÅ’üðxñß`MÆñìq’ÞCò‡ñµKkB×£óƒ×C¦mv4¾Û„E¡Ré.ßúÓÓ(™zÅ’¤H¼-‹¾{Q•Ê ¿Èo¢‡h°Ñg³Ýi¹ß6“†A´”¡j¡_)‰âú6ìÖË(ª-Ðv´|_¿BzCq2¢ÚbŠô9×ÒÑ/ÈÕ\W¬Ñ¯8eQƒµ1µÅEt}$wl”©íâÄaÙ(aTá~£íí¿ï¸ßqÿ¾ãþ}ÇýûŽû÷÷'¿ã’ÞbÔNÁ©ÞæÛü°~âN€µvŽ¿çO¼LqÔì‹ïe=º4¹4‹’½'F0,äÈqštˆn±' a¦×(B0ýº¼nóHk3…ì„Øѿftù¤òÕYµ> Âsê,ïûƯo6ûãþoz•9ë¿Ûñ¯¿Î·ë¿×° }i ž¨íõÓÿiB§/ÇÃj'£îmÌS+$iÜ›MØIKIÓ¤/ëÃéLŠÅof©á˜d(]ŽÊ=”/ž>möê[Ô}£óˆËÃËêP\^;öaóÔèøTÆ@›Œõxþ¿Ý½énãJ¶&ú¿Ÿ¢_ M–e qM¶Y©)EÉÎ} ƒ&)‰ÇÉ")U8ïÞ13H‹”ìª{$öÎ#VŒ+Öø­#ì]q_¼HÁÅ•_ú;+p?ªêÊ“oØ„:€¥:Z{ÏAQào?-üî(8²ú{ìþáßúÝ£çdþcž¥Xãð=aÀ3îK,¿“%\²*YœvZ`¤ÛNö—¥9·êwœD0Ù}IqƸèÕ%Æõìîv䰄زGB"‘Go†þ´Ï-ûà.èÄ ê®I@lB4ú:¾†~’gÝ„´‘ô°c–»%å°ü ÍL¿Øé>Á±Wý«Wƒ™.¸Hkö{ôL ~Š] Ù8¨¸|¾$˜âð;r»%Á­ÎX[Dñ¼€6WNê¼çýÊ2Ä+~h–;"ý“Ŭí GzÑŠÆ$ÓÚ¤¼Z Þ…å§œ§”PÀ¦~‹è“¾¯¸\·Ú C"Gä"‡]Ýjˆÿ»#†ÙØy§C|N2©®¥[µ9ø‰! dH–P¯j†}bn Á ’[1x°§èU2YØhÍÓkrÖTϽ@1Ñ>¨ÙÙDµµp«Š‰v@dU½³ðõ»5 Ì/١ѲVÊóó§¹âÇüî÷@_S¶—T@[D´¾Y p4Ñ’“Áá÷hSrX@€–ìûÀK ¤·ëðúA°× ½Hö[6½A >FÒTšßmÞ)Uç#Öƒ·ñC©ÀATœÆg/èvØùÀ=å`¢ùWkal ô\­ÖÆzJ0ÿ†ó§,b•á;èÎ¥AÌzïê´qŠÒËlkL^¾ý2ÜlÖÆh»™ž ˆþóa±€Yn¦ëû!ÄÌj8HQWMn¼³lwâÆîý ìEªÈŒ+ƺ–GÚþ748«õëó•KþÊ8Ëœ ƒ¥­69«0N/´j,9@öx=n¦ò³S+G[>æäÇÚ‚ilÑd –௤ò¯%[§R>*_©ÍŸÅËj¸Χ¸ôì(ƒ¸R¬ì/Yf+W€¨)Õ å?HÌN/Êh&ÎâiC„òedÆVFM—'±Åÿû`[·ó¿ú½»Á”\±¨dÃóüœ ëu¹Š‚u+‘”líYøå»§çç¼£æb¸ZRræÓÅÆërÛÉ<Øè4#õÑ{'~˜wbtJ¨T ‘i7¯[KP<„u¨yXp5ü§fãTüw ­å•C¿í×-ª ¸øaš­|(6-qÌìvë=KLZÆÒÃÁž¢œ–¥Ç8)žÕ|+êÍn‚´s)¶Xk-¸?!U›0vÊÈ`þ4¤œœb/ýú& 7‚Xß[Zùzy úàÐþR&8þ…‘ E ë­$Žñô‰uxJ™9íæß£ †>±,àSZ6Gœý^C˜t&Š×ÍÉÐW&eäÃÔõål*ÂÔÅ+ 2eÈÅ2Z“@®º†¶^”,äÅÞmë®ìQÄ×tk2q$'?“aÕ²PýF±"¥è<©v·“ó—Æ­52i¢;ÁÓlŠÁêâÜêviÙÓàÝ‹Ca2¹Õ„a’„¶‡ó+Œ8Ê$Ílsonoþ£`2µRä+4îóÞé§<§²ú\âiÿæàŽ,ÓlÆ6ŠÌQç䆗Õ1Âìð°BÅ•¿ÔŽìÕ2’ óïnì[_™mJ:ƒNá°¤ˆµ›žâ€Šým*©:N¢]…É]“¹RžCíV¼&F_‹jïùR~U6Ñ~«õªr'¹@¤nuÚ—.f‹$4)í¢Ý$ ÷! ËqàNŒ0y…Ul*ž>¥èòk¸óôOΕr‹ÇMK}ÎOÇÀðˆä˜U4Ññ;#@SNéqèÞÕ_H;Éñ£ŸÆÃ$‹ ­ €Ø¥¬*«^•·ÒT¾*µ`U ^ÓèÿŠ¿ü÷ÿ(üÏ7-Gnÿ­-€E_Voš˜—h/Ò1ûaœÛsP·Ë“ëSà„²~òÓx™ù»ó¥Ötæ%œQÞ‚HËâk¸éj†žÿH $þŽa¼?a¯ÝXCÊ÷Ó½ª~èëØCõZjs=•ßá^ì&é™ÇÜ]ZãáJŠl`WÉGð'FdÏßÛévš·r`…n¤ËÊ1ʃʷ–[ÅiÇõKf Ôv1u°9ËI‡EÈV,ýèêŒã:Õs»õ¢ˆ{ͶB>­j¬I2Ñf›hXÌÌþ5¡rY_!@cבž¯Fx¼‰×ÿ4%™Ü•_°Ids?t£W}R{«o¢qŒÐ–ZÜݨÙþÌ «×‹Îß‹F5ƒïE#ð‡šÜžª-¹›uV5”i™®óñmùŽîgËáÆX<¼˜Ã§){hÙ=8_pù¯‡É†l YkKùxR¬ (l?Y³ð´øÛmÁÜ#–Ì“·åô»½vA·ÅBŠòËnÑêCžH6X}hÔ)IGîºqXÃUð˸ÚÂN¢, £²@Ö²ÈR·n ®‘¤YáWp%hïáÑÛ {O¿†îýzî9 yÕ @1z™%ofåòö•Ë{Sw¸0ÐQÔ­FVI³ Dr} ºÊ9_dåúuBH¾”žž¼àì{ÁL€—º8óU°NZM:Ét5f‘æRµ´®bûXÙtµ¾Ÿœ¡N'{pR®Oè'$=E¤ÖËîØ»NÓzÍ*IÖÈ©•PrÜõ Ðêï>ÈxöËaá#Ÿ ótOfWË•i\R1S¥kо`µŠÍ•± 5ê¨ö¥*F/EBÜÁ"uåÚØÄEºñ^3¡R7F^ýš„ŽH ÐBvÙ1y=Û4´¢Jmíôj.²¸Œ†¨I®\ÑQ)JKPø·É{÷Ò/…·Ø×ÞÚ}±¿ƒ…N†sî+ô}Ó¶|÷Þ⌽ÝÒ&Ú& Ô ñòkcšçwqœ23½Y 3½•FûneéÚW ¡ý¶%‡¼ãº5%Õí¿•Ã šIG%M?&i³Û†þç…Ÿ±Fšv¾¬•¹[*äéyÄ׌4êe>;òò?‡‘gÏY½gÔEKŠåùާ»¹Ó9ÝÆ·Y\á¾6ud"is寫ÃWâ¡Ë¸ŠCÚîãÍÖÿ ^Vº­ÿû|öyWÿ¹™ºûZ+ó±Ï##wÖDI [Z­A}ý„G±2:74¨.·Þ>Äá‰a}¾)ùXhJèë¦E˜HAqEÜY¿ J+(Š^7¦Iï¥üÔ@:"C-´õÞ}7[lÀ›¤^m–Öï©Á.º>މOQʼïçjÞùpgîÞ²¿2AC禟…ûÜýÄ—_^vuóǰMÒ'“åE1Ôy¯®0†Úèsž>ÇI ·\ E—šH( =.ž=¤fÉIÈöF›ä‡µ| Mm j±²œ‘ºÝ†²B-¢Ðs»$—I9v¨Dh_œ¤BÒrÍÂA•„¼-J¡’D\‚ëÁRŸÒØsØ{ÖZ‹ã&9ÙäûÏô>f°Í–Ëãg ÞCIÔˆ×í½„ÇçQi5Ó1NY¢5ç1L­j0æt>\=.×…”¨•µèA£c-úù˜òâ㸶òã8tpw‚–ø¸÷TãTíOk™t_O{):µÝ5{pÒ8SÑsNÐÂ3C¿£¢XùwTŸÐņ=¨¼I~7x“œóð&]8àMú%9ÜMnáiŠ¿j[}¸Ããšbv´»ýzm7!oÙ@[N?m—§Ë„o:µ›g´{°Dov–Úmý ›ÄcÄc©¾‰®wÔäA(ËíþÜÆü ÐãíÛ>°ÍŒ­}×6-`ˆí¸ÅW‚ ŸkOlF\ÌÐ×LØÄ*íruѦ•³ùrq@'õë…às77²†ýzæ/c>å–wö yûC›«è©Ñoð7\ ~ÁÇÊŠkäÄ2C ·n°0ðpn I¡ÝÒÊ“•»¯¯„ä|#ÐÜ ÂÃa—7é¨,`Љ"ª$ŽIÕy•ùWÔ_wJòsÊ7ok"‰Å|®§‚º‘éÓÜr‚ÓÏЋŒm«T§ºÕæ ÑFD9!Çw}-›¤Í„<+5ÕmÜÐKMëùHÓ‰ëw}í0ýtÛ/um ÑÂb—n[5ó +RŸL‹‚fÛ gH\ 7ÆÓôe¸?›éx³]×J¾F•!²RaOÖç¶£/C³òOÉʲߺÂmW_º†œí ~’‘Ž»GÇ pØ®,²X0(eá›Çœõäð·lçÖwnEi8ýŒÂ€9to´+†#bH?K7ý+ŽhòºŸ|â~L ÄÄèè#ÔT¾Ò›ú#˜úî;9¬õÈw”®îäã8Œq†¼äho@Éìäp㉋/m½éöê:ÙKaNCóœ+~«B¿ÁHdÓÄG:4U…@<Ò«? ­Xoêʸ€ºè¿/9â‹*ž¡[-ÀA¡ÁŽh×ÐÉÒfï´Ï&iN W<šEz$5bA-zD(aòÌ—CË —å FžE'Ó“~9D©ß»9†ÕÑšL­`OPe-ZË€Ò{h{WhQæ^€1Œ çÖ)#Užô5z]qâÐÆ“¦nµ¸Ãsë“äXmbäÂp“o´BÈâyŠppã*ô=›Õº×™áiÑÐÛ×fe£6Co_kN^ 6:';å®–>E2Ëbó²Z/'Ûñ¦Ž”²à›†R‚ð6ðìÐq±-‘Žvå»Áž,s§ßRš—;áCç•ÓÒc±÷õÞ%È}ûªR3é÷j›yŪ aðtqûÚAIAéßu€úL‡Þ*ßómMîÈ»¦ÈÊw}àHzT2×r5þý ½óý:ª˜¸¸r¾f«uM¨kçŽÐ å‰x·½¨"™¥w¬*DƒäɰXUȳ§²êî¬yBJ ·ÓÜêÁÈ}[‰üVËï²ï¹Œ|{ ‡z ‚M¿¥d: ‘!AgAÔ5&îð%˜9Môñ~:ÀR—ÂáQÎ:aîœÛ¶¶F+m*j´¶4ÏùÆMR´2XÂOäàf¢Ï½‹ì^UÑâŸ#é=‹±+DHm´o9?ù©‡”{•¯µ¢× Û+ê`¢÷ß'Ö} ¸jG×ô©ùV(…¾þO¤wrQ‹%TW­2m@õë›[­µ4±G¶ä`ærÚˆg}Üötnkú½,õÑ&M5ÕKJiu»Õ0(¬¼kóàíRààuõŽ ²˜÷sS €tmýZE‡\á7íÁ_-b¡œñ»~ÓÀ\eð8bŽý}‹8'Ý«†ÿ>ñ;VŠöq)c_ñ½ñ°]Sô Ü©¥m؉º\Ř³¹æù¸ ž‚µ>n|ï57ϳO1‡Ê}[r­O⃠æ¡Ý¿UbÖб*$çÃåpØy¢<#3.Üÿ€æ…õ¼¬>Ť.×¢_a]+/b·áI1†ØÎÛf1It…Ñ õv•,jdº± ,-RYöagK©S¿Ú%ƒ¿4ŸâéºlЬ‚ýòO¾ˆÜ,‹ð(©9§º$¬¬Íµïõ‘"ÊmÎ!8LÑ~½žx%)ýãäIE›È DçíÎ`˜ßÎ\ÞU)&ú‡>j%Ohø°0î Šî†xåj»yÙ¬‡ ×.æ†:€£µ§1è²È‹ó!ˆ¯þÊLdç_E©7·ö4üÌàå3táÏ)jAbÐpeåâImÓŽ]7È¢kÐç×>O}žb;˨ÉUXcfΖî*`MÍ|"èÜòüÄ‘¤R‰ ÈHçn’X{Zù—ˆÂâgxJAUšÙ·$0kçÉ@ŒÚtWŒÉ”Û{œŸ™¡‡jã±Ñ×Y%åž>–2Š\‡Â[ ¸TUÐøÜñ¥j%Yõà0,3XÁÂ%§,¸®,íP2@ñ‘ÒU¨—ŸßÀåÓÔ4þsÊ=ÍRA qýè¥ÞHÑ[]|ÍÇål‚nÇúÁX°âT¸ƒ%Ü1í¹±qÀNÍô‹&…¶ï •àðüñ¸äô× j%K¯\žÛþO-O–wÃÖ§¾ ÔÔºì£#…cïƒó9O,„Zß|eß”= ;Räd•Þ‡ˆïN¾ÿµ& làù¶ï”ÊWÝùî&1z¤ýgƒ%@êWqìîÈäà zº–rÖw (³ á«øwV²ŠÝwÏýX30RÈœ•‹Ý¹i@Ü wéÒ€ÑÅæ ;új C]/)‘åõ®í=ß bT«=¶²ô£Ÿžšq4 y4žà, #(ñ¶’x«.q;Hoð6r˜õÂ4¯á³Þáyã8X$Êé®á3ØÕÝé«'ìÌÀŠÐŒá<«­6“µ›Þ¸™ÆŠ¿0 íøÉè(D:Ý&©ÅµÛÊSÞn5'ÜtÔ¾ö‰§‚©§ØÍëÉ™¹;(Wo÷jÜÔÊ©È౨!Wj?oX‡Eb¼ïÈÐúƒÚ˜$jú1Æ›%€Å>øL\%jj·MÜ/»’#uj³¤ËNâ]]@èjA¥`W[®£oà3’tN‘‹‘@¡díÚìá˜üz³¤kÄ(îb›ÁžR­BDw@ ¼üµ‘'¼cD_ÿ^IŒ?úàKJ“QØÁæ!’ÃX©uzzƒØ|¹0µU"Â"«:ïšwŽ»¢§níúć/%Ü v«¥±Ø ~8ð‹0+‘iWþ-:ÄâÓ»ê/½@|I]He_2]“nGeŸdíJ¦XA"¶±^)l;%æGüM¦ŠPCWɧôxS«=ãR¦^I›•ó`ÝNÕg”ogÖ¼êï²ßT™Vé‚IøÊï’è#•=G­Ÿg Ç'Ÿ"ñ:.OHóÁ\ŸpÝìpw´ ÅN6a$7ïÁš“’¬ù(LÓð(uÒ…¡Í-†óéäee¬¦j3³\½‰W[¸äÚ2N;ë䧒јeðVXà›„-[›ÀŒÙ$ŠI!°JÇ ìý\y‘«†aT ÉÒü¸:-€¹|,Á©2•—'Ðç÷o5|@˜wo‰ÌJ½sKÙ']b×y™bôHaéÇHHhŠ\L^)JkŸþOI¥d–1Múè/ãåzrŽoöêÆ<|¥–+І¯Õ¹)×~»‰™t ’ÉUë3O¯<\ìµ±SC®¯ c(´fHÁ[)!ô伕ZN Å† +@ï )Ä6Ã^Ã0Í•¸n´‰¬>VVÎî‚ÉJm˜™~ábð1V®U›5ÙÎWVa½œå½¾7eB´ñžiìZÇËêY²á<“~°XÔýGè!¶P×Ry3Ý!z´Çwó'¯Uç0ãG²8œlø™£¶p®Ê;%ÑòùbG8’õ•\üDö‹•¢%³6«³ÕèlaÏþ³…ð`zº^ ¨ÌòYc:˜¤º¤°xì9X¬r‘|kƒkó @½üÕEO¹¯˜sOwÔs ¥ùj=Í$€…0ðé0ðÚÊÆž¹ÒQ»ÜSYYr‡'µ3·!z;_V[óñE*•TvsCàiöül&.ÆfpÙÒ÷ :þšAžc?Lh^°Ãrgû?Œ žw›_EÞÔEà g†þø€»ÖZÕ´¥mŠ¡2skzÛù÷+â<9£Ü ÿ¥µ_JIÒÔ02`†_×ɤjcü2®VglÆÞ±i¨f˜V‰Ü£±Ð¼ÐÊÁD”ÌõÓ6U7–—9ÔõS”U”)ßÅtÇ@-+k®(¹|³¾6á9[úñ‚|ßÅ—–‘äfvýò©ª°•³€™åèe¹šb…nhfÁ*%á*|úŠÓ—]=_É’¥YYqa×­ÿïÔ£Ò/Äyaͺ–IËŠ¥Co·¬t¡1S8ʶN éï“aq/·Gwýñ5:”ez†¶¼VÏ‚Lêv€%›óçú_]g Ä"DõhÄ(˜ù‹ö@^Q9"…—å;®\ ™²šll«0\©Ç‚Ô®G¡zZY¢zBL®”& ÔøPæ'Ñô¦Z-ÿ DûZ¹Qgjõõ(T”‰‘ÞeŸ6€™)ž‘ü©ÊÁ0ÂUì…øÂ0áõ>¯¶üÜ ÅiÐ0l´ Ñ5®¹å6pbWqüÂr-,+§FæB¯µ{ú výÕt$²ü$Ô/¼AÀVEÒg_k’Ž7ÆçÑ•‹ñ¨d°¯ánçè4òóÝ…!žá¬,,åc˜°Ýo5CvÇ0Ú :±ÕkÔ…°•ȉÛÛ ¿V¾v¢Hi÷°–ÜrÄÀ¹ê;õ7‡Sðfb5mE!-U-)vÔíÀŠBŒ\¤43ˆ¢|‰› (:6'’«‚TZÿƈ+¢'{ïѸ¤äåÁàgøŽÞAƒ °¤™—T˜}ËÅ8“„]*qµà7÷Ú1W€`ë«å¬7³—1ºŒ1â-&Ë$8˨HÐZé•4ò2‰.8FuzpÝ8Ô=b¤LþªyßÏÌ4åÙh8þõ¢J÷B]bËwVp[k4F-rI[Õ…o26#aZÑ&­ vÔ”åçv+áòúuCBšÒMé§úòšøÈÐzD1¸#ºo±ë’’J"¨±,Båˆ:"zÜ[¾#ê5îÈt÷¸Ðí­Ž­Ô–¡ÔԀƱ£ºœç1LÑsb 9ù,§æ÷Ó%óÎ4* CpͰ«|è814½­´#óôš§7Yw-\Q¾Mk««}Ó í ¸[]maÒ ‰3KÄkwMÇŠ\ôܸ[d3²l’n$dˆ“/¤ÑPÓ:`÷GôQ#¡u8¤Èîhd~b1(¤ëÔ¡}=”b³ówKpÙA£ºÞN +·‚4„—Ùd­äg!®„ ÊWk/;Hx`Ñ[ ‹X µ3hhê ”Éøô-Úü”Z’¶Zs9)Ná°-ú"lŠùu€M²Z20øÒ$å¨$Àˆ¶èÞÒÌËÏ;}ÁT³È-;Zñµ)pÈ`:+ßJñ;E!:Z0¼¥{<×›ló*LRgŒ”V©®÷Mÿ*ž€ã9S•“Ä=¾ú_fÆä’Ê×·Ú™¼ Ms:ÍþBZÏr=D Ä|¸*I%ÇDZqÝ6©DäxWörÅ"wb_þ¾fªÏ5…$iç=Ë©WzBWQõ•…‹ßðz6]Ë%HïÌÉ%óª)ðn7~t}VS»Ó¨Ê;ëm› eºß<ÂVê* ¾2å§1òUr”§@ÊWIÿıÅ9 b ~¸­…µlQ§:ÜÜ=†ñ—(àÐȲ$zL‘*aãÀÄ,ú–ežü SàÀ ØŠÐnGçYõ Ÿ•MÐJýæ›­°†¶v;÷aüaÅ¿ç?º‘Cí6J¾iB’©¸ÂÔ3ø!‡ˆ‡æg³Qè:í¢äqÖfLg6Jê„*·Ðßö¯d¡gHÌR•È»kV3ØÈöA–=TsÑ7Eû`uìNýN?#+ %½ÅPo ç}ñ1ßTãß^2hâ{s•…‘T”ÈýˬÆZí…áÂáP¢‡ æ~ÛoXï7ÄdžˆFjí3vâzG— kÐH‚yÆ£ò"|³cî4rD…›:hd‹ÈOË>Z Å^4¹=š—`z¬¨O£ðüœu€mõ#Nƒ4þ2p$ÙžÛð-y›l鿉óÐ9ùÂÞ«¶›¶S(Ú±€ðòvTR´ìv4-Ùˆ)ïÔÖ;g´˜‡Sê„A~]o;ZrÚŒ¡Û9 È5åS—P m3IþÐÜ/Æ3­›0_Ð#í‚Ñ)MÃà™ º^ð¡Z8DôÆáñ5…ŸÅëÄ—WSÄçQå$¯~]JÉ 4–Óë~7½ä- #iM;ß»¦tÙ½DoÐúfz ñ–œ-l»ÿ3„Ãð ¦K]‡Ã…„Î.#9u¼TÞÉï¥öp™\»ó½ôߌÅl5~^­§s³ÞŽ707Û•¨J$»ßËX£›[ÖlŸJï¾wzó‰ÁÔ0wâïÅ4o¿êØ÷Ü wb[ß{vænp’É}ó )£ÉsÕÞ÷ÓŽCßY±4Ío¦HÌbòª¶¿—›ââ…Uý^N·ñR_fßAM-U>/׿ºþ J´lý´d9øqÁò›oë8ÝaIäǤ®‚”÷ÍReAùf¡¹(‰|³NŸ¿Yç9ž¿™¥«Êoæwg<ý[4×<Ç[>ã ÎÓßÛéb\¨ nº?á(øIdWà_w Y“âënØu:V’YFIp4 ŒY!jµ´€™a“é“1žæz"jËvmz¬úR zùÙ¯'c6}˜¢ÝÚp¬ Ž¡¤Hþ€¬û*öÞ=ßÝgæ¸=^Y4âÌ{Éú‰0H ìYžLÍ_Óá$eãØ åëAò›µBxÕ¼=3”/]ŒPÄq|´ì¼ÒmGŽËòqxxq6ËUÙÙ ~ùåúe±¨àÒË€MÂSÊù.+S^I²2ˆþlˆóáZlp·óo¼Á‘ݶò¹`îܼo‡ùj.“p¦ÛÄݼD$")9á ‡ãå$Ò‡›pF_¥õ˜rdqȆÂQ‡ØÎø×Ë=ŽÞÈWû8s‚JìœS¨(Œ åLˆ‡§Ü˜žr7H»§ÙËf8šM…êË–À§!¨RDÖ§f†§KåY>Ʀsxµ[šôƒû gCôœO^fÆâ—Y¬yÄþri–?ŒÜQ6ËkA¢`dñúôõ (QzXî6±ë‚Pzpü¿|BÿÎ'„2t0Bœ¬SßÅi0`!âµÂØ0—¯Æ(µâ”…óÃÒƒ '¸è¥ÆS‘Õ]#×ìÁ³lŠlYª±oÎ8Ia¹W]NÊy·KÇÏw@LW¿<\jëòÎä§žVoPkW%ÿxS1íö%Çâ|gŒ ¹´´ RúÇ𨻑ÇÓ=áÇå,j='ç’FžŒÙj4šÑöá<À^.¸[V>Î~3Ý£–p£|»åG€ýEs»YØŸ}ŠEôI††¤ªoíeu;ðêpk—•$ &Hå±hóÆhòiprElÙ®HåÓXT¶äåñ ¬ZÙ<—÷ æ$ºT ƒQµÌÅ|D&ïi!ÄXœ+>z 0š‚úmÍÇåš(À=mx5¯üáÙÁ˜ 5{ú2›n6HKo×c—”'a²²Ò¬h¡2 X,ƒVçÊ7´'„N­cT©èŸÏè¯ÅpnŒ_‡æc&øJŒG$môÀOΟ„1O¿×Šú%«£ÈV ƒé1J¿F'ûÍMaØ®HæÁgÖcP°-ÈçÔvÃ’a´0Û+ï=LA€Ð¢ú³±>’ƒzk…–;³ãFr“¡%šNÅ:ÚÌ Þ¬½{a VMÎJ9îY¿óVL[ ”d“–Znyý±lçKh¹Î_4zŠÅ‹ å¥¹]ÓgÙ•/6ô#|<¯%–.cÉTËR@ˆ-¶ðx´gÆ4¤6‡±¨BMƒ$ô%=Ý}a ²H²F²yÖ0êeòGŠ„©$Ëü%U\Ð5ø#Ågè¾ýKª¼Qõ--~ÁY·+§JÕ.}ñŠ •''éq¼AA§F¢lfùéhUpëÅe_ŽSQu`&¾/á–öëiðîÅaÀ5¼v§IX°Ô‰¨}ׂåïKM¥,Åv †pïù¾€l"Ä ì’)ŽW’ßéŽ •Òë”V×V7@G 9<ª˜a4TŽÆ<¸¾ÏÃSÐ4?hƒd›ÔÃ#NcÅÎ4Ž)Üz¯!ü>éÅ¢Ss`mÞËò”²nš¥œ`› Ò×þH¡\Õ+@>ÿK*†ZñùÙ ÷@ HćŒ2­Ç=7ÇC¹†›G W6›ÎYX°dÝÎ@ Z: œì´´µ82ËH±¡0bÁ%,²‘®­Jï8xÉô•†ÀåNî¹Uczƒ³c 5Ÿ$%…Ί‹ãÎ4Õ ¯Õž£ØS³Ê${dlÙžyÕ<<] JþÞg]òýÛ;œó>vfÄ$ÕžÐíR×À9·Nw;—  qÃ;âÆ1B/OÏÌ}w3o1ÄuͧcÌWh/— êv™MŸ¦3 Óð¨WÐÜÒƒ$)6™••FhlÂ7Z:´Ù R­ÌàçVf{G+þ“h_)=<9^j8õMxùµG¬v6• Ù .6ÞšZžŽTLF»žY‚ ªÐGÇðè–…*¨ñ”7n÷Eƒÿ}¢¸¢ÿ«×ëµþCõñ@õm÷FùíŸ~OÙs÷?ŠÜy/›ù€¼yþò4œm§&{O \ym{Q»ŠŠí+0Yè9Å(Ë&¸*=IqÄúpb"Çu91î ò|C(FÉ?r%Uš†mœü'Ë?Õ0Ô0ÑåR_„j,µðü ²xf=Z’9q¯ðŽ “-Y€xÁtJU0Uƒºñu+­Š´.ývÿ*•E}€ÔöG\RŒ¾<\mýP¡ñU➜ɤòJÀh_§Â:—,Û ¢ƒ†½w@½— ÔΛ&ŸÕ>L‹*öæ.ê†Âðö‰2[ÔC`­$wþ­6g 4ÊF È{3Ûoicgðˆi÷ÓBÈN®ËudK £Ðyq?^úE墛;šíòò°5&hXü*¹¢>^¿ÕH?§2)%ÆÊ1Ѥ‚—"½1ÚM×ɦýv§u$tÊÙU–ÏåƒN;Ï!Õ:[Z $†ŠÝ¸¯BÅGƒ×;)“˜I왓¸Ýhéãa8®å (3º»Ì.y©z|f!š· ƒ@eMÇ´ÈJeDzßj”Œ?yÝ›‰¬fß0 98Åqn&h-IƘ0yUá~«Q,€Üá:´r[#KÕÄK°{Œ <ஞ-ÿ z]j—DW^É€+qÏF€Óôƒœ:nã¼¹kfN?H”@ÖM#%Q2•W;b0CJ aN ñö&C¾Ìp—~X1 Õ?%dƒÅk-°Ž7ÂiÄ"Ýô޾ 1çp˜ÍìÂvšjÜ!á_+cB»éBÆ@YžhÒ×7AŒ•Ì–lÉ +61È“9nÆç-G%G+³†7ºn'‹”ÂtZoö‹»¹Óú¹‰œÛ±nÚ‡äÑJr•u!·º6Ü™òVcŒÁ'/NO–Ï+Ðã­} ”ïŽÖ—k$”HþbU´$µUì± VÀÕÆ T.C!©'¢´•J»UŸx’Æ'Ìt˜ôÍ ] "ÕþÖà c!Õrû-­_wf%)¹bËÛ-HÊ%E£^_‹¨” õëëÝÙs7Æ¥cw7³‚ý‰ãD÷›Édó“G"Åfõ[Z7j“³¿²#¦ ÚÁÐûˆ±3*ÍÐvYkêb·‹ ; }N~uZwh%I‚`Òƒ¢—I‰•¢–k–(ôjÖ®‘¨¼˜kÄÈd-§ÃüàezqïÃx‘"}ŽŠºƒ^³XrÞÕÒgüó¶YG+7Þ±npAO+Ëi)zyújÒfMnáM:¬É@ß$<Ŷ»vSÁEúÍ Ü¬S_ˆŠÃ4%Bø9PZìîê:ÓÚ¹¤B /Ó®Oåè´Zm”©iá}a±„ñçæî®‘wÿÍ‹èsK×:ÓÚØ³êé# `ˆ®Ò¸M¹¬Ê…ýä¢âmemN#LQnpàÀ‡ÜÞ3Ö‚“b‡@¢Ôohn7¢Olè-öˆ3RÏf`Š™_¡Çl{ì3=Ú’ŽÇç~€N¿}’uÈÚùdž^Ù«´¡ öH½mœrŠ"±AäÞy²‡nƒOö¶ö&ä KÛRa‚’}ÓûV¹SÒí˜ßL²B4ÒÅi¸ j¦Ô·.&5ý]˜–Ö‡}ÍÕÁ%‚7ކª©dï'b˜7¬¶PY £oÞÔÏûDJa»Õê›ÏÀ´ÃHÎ{ë7+®Ã{šâFr «~³ÐHÑß§—æ»ë6…rívrÑUÕÀ¼u˜€BëiT·÷•K‘«¬1VüÉ9ÒcÝHÆ}^>ç×± ÿ³åauwäkµÜÜiËl<»±dø·ÜÈáäµÁÈ•œüÙ º¦ªdV±Ê[¯óü)÷‰ÐaШ<Œ¹ÑÇ:2ÑúffÝF|ïKL¢×oä5C}PÇzL{iäâØûÿ1«èvCçTv›»Ýoå»{?÷°÷z­JÞr×ä8d4(N¿×l¤d¾^¿ÑÝ}ðc‰Æ2hÔØ¿^¿~µŒÝoÕ›MÑÓ÷çs²“¯Ï).v¥…±hÕ@±4v€WNWŽ¿É"ŠÀ#$.z Õ,ú(?¼Çõ¿¸çJXYNù·eOP!A´ÝW¿@gý¥IˆJ'Ëd!>ýz¹ß.(°9hùŒä™y?Å M`+éL#¢)… ÇSCãØ,³¡d0ÂÙÃ#º½–<'Š,Å<‹Œ”÷>¤JEðm˜û.ÚÐ"1•¨àÅ&¬£iðôV¹±Šmz?×f;—§*€t@U­Yt8C®Õª;;Òº°›¶’Jã–Ζ¸°ö+—hu±æÁ(æÏk  F‹Âù”ØpFôÜí°DD~ÁŽÚ'Àéz7‘o&Æ(>%ÌÒ°g„ƒ¨r¬RmgbLìb#ºVÑhJËÊÏÝ#AÊþ`jA, “ÓÔ«,9¡¥Î2˹r­7þŽš­ÐJðÈ 7ýó²Úš/D-~wƘà®C+j'2äXyYÞè”h€ÓwŽ&§½®¿¦O*H&šÀÀ䓤Î,qíiIˆiä1¢uH`H8@ºã£ç¸•Ä4ðá)ƒ<ê§üÜêœPx‘î_àN+ü½çd*oª‰©ÝÇ£8QtxYPK3ƒµ¸Àù:Ôu»™Œs}´ۙтP—.9”]Á®p‚á1ÚìCNcPmQ©sž^§©L€ØKäàb˜´œÓ)ÞY6óÍé$¯W#°ýz;ˆ£0¡tÂ÷ä%ë}€ž\ŠŠÝ ®ö±ŒX8Ù¤¹·Íðq#âÑšyë¦YNžþÖ³=-ö±ƒõH¸ÞÒ©¬â9Ÿ_«0¾À-¦¢|§/½D]ÓÜmÛi¶Ûùj‚³?›ß8Ü‹Ãhæâd$Í]އdšù¨Pûµ‹fZØ£™sõaÆ´´a£œÁhïx‚6÷ã^&H×IãÆµ ¢ÔG¼èe:sT¤~á\2_s!¦#oÅñȳ Ž6ÏóäS´Lž§€7‘eit;0CÆóÐz™Á.s&RÛA F=O"X‰Ç—_“Õ¸ «#Žßú$HƼf0õõ®ÑͧH€~Øk¨Rþ`®c½ ZîæVÄá`ÕpŒøï“{r 8ã¿Øpo§Û xñçÇéðeº^/×/«áø×tór?RƒAfºI¶³%µajqþ“š°·uuL%ª–o¥»0>R¤l×Yîv>;'­«çæV `µ³¤ª­«GÛ«,iì+|Í¿8¬6Âw¡‰ÕÍO1½ã í£ë€hÖÎü,Ç;¿†O.íŸEW÷@Øç8âûH+͸? lä|$“áfør¿\χ`ü&-†t¯*þÝ×Ä…Ž#§Ütß]ÓiÕŸ›9}šÖˆˆ¡4IR· òª%i!¢" ƹܮÇá³ÎPkÃ{J$kÐ*(ü¥¯ICœïE˜z»/>—n§=n•\'ænµE/y›ìài9&¨…äÉ7iÁã`€bd¶Òëéx¹fG‚]PLÛL8ûžƒòìÑD`š¸‰{QÊcê–+>'–û2Çkc…+´èø`~˜|ÿ”Kvå þÎÏEv:™RPÖ{õ)Õƒ¢äŽ)3Ð(Ž)Æñ'ANÆÅUßá³€À—"c)m̲L&€á® sƒË†¿€|k&‡P"¥wfíÚaìÐî@Õ0ri¡Õ`@º ‘ø’;þt¢k$Áš¸2šêŒJF-L„ôV€Á•›¿µ.¾øxJÙu| }^Ь#-ÖÆ˜cew¾*0Ë÷¹Ü¯¾OÙ1Äqò—§¡ÂP_t½’pi‡ï¸þè·JËH®Ýo•\/S¹`Ç";LMFž_þ¬iüÿædä8Æ7ß.ÍÉPH9Û×ýz«y¶Ð¦ÝT¶¶j>A’léàUbCþ•ÔâDeïÞøîÁ‹@ñâ,BÀmÁÈÏeoðýÏ%¥š×X[ŸÉZð]ªùª•îsC6†wË#ÀsÏVxHÿ·?s3 ×Ñ…¿­×±„Ѳ*ÿ®ü³ß€dúsÇŽCJÅðÝò|îçþK"öm" Úw0èœëüK aMC ÅÄAq€AñÐ\t@•ïHö@]ÿŠ«u§7bP÷„–Çð©UQ98˜ñÈr>©`–ù(Qý™WNè¦ß:d¢+7 aÜùF o~3hBØpp­óçÂxô’I÷ZMHÈ+ïx³ò/—sñ¾’»Ü4‚‡9W̓žÓ8¿B£áâZˆBꀰýÿ cYLÔ‰”s/È7†KæMùk|–˜¡-å8F'úJö·Ù¶¾.8ÌÝFT蹆q«NïzWí3˜Kª!2ñª9fübp=6µŠ]ÛK€eª”rP§÷í|ª¤žÑM#>åÚaà$W©Ò¤$ð—k]ôÚ .àŒóê䄉»óºæºd‹£.Ë&2\V†.?‹ÅdnÒº¬×y²O.®-w´>y?°ŠÌ!†¨¢ZlÉW9Cÿ9ŒÐ{“÷ˆi_h5YŸÔ&W¸Jˆ.šQ@¼¨ËÈæø… îåµµi÷~h¥¹˜›J IUj×¼Ý ÏXåç8%u/_惰ÔqCÞÑËi„ !†~Þ¥!ùÐÏIåÌ^¥Sè®_{šTaà'W;”µçßö4kòçxÌí7ÃÛ)ófõµ;^¸¼Vã½ñ°]€j¯"»vî]"‹&`íHnP¹Ø*]>°ûép³]ŸÕ|[F©wôþá:ð&»9×4Þð䥫å†+‹¤5LšŒ$È©žZûñp=ÝäÒögv+Ï ØŸË`bW¥ÖØ_PýšuPòÉn™Yˆ¿Ýd¸{BªO0ºö 8ЄP éãÈØÌ‡«——³N°G#. ŽT¡’ádQ_šëó¯’è#õ£S‚ÿ³@dÏ) ÍÊ“ùÌî®âGqnJF)Å;)~Ìš 9)Â-6 ÅxÙ•ãYª¬Û Ùá9È•]dˆ x¡ ÆpÇ]Y{W­ªbê–}˜¼ÚÉøž~ß«‡Rù¼X»aòؿܬpDu Ëà2k×FJñ$ü$Tµ«‘ÊM£};m#˜L¦ó™ áqWr:m3òTIÏ%gÇùà+$j µµÂ’ó1‘•Þƒas-: ‰Ìù˜~FÏ^ðDùŒVv>ÃðMÊÛ×fЕWU—JÙ(·VÚ,;çccdë¤Ò.ÁCJ`Iy¿f0(¼Ç_³sîGΗÀ\gì[Iâ&R-DsR=/ÇdOØÅH’ê·ÃŠš*“,~@]¥|³ˆ6š¸ÉïPûÂeX´Ê¾òÒ¦L Î—Ë_çEÓé\'®OšæÍT>Ò„ópZèxU½Åó5>à:÷܇«UFvɳõ&>ïÃ?ÿ[xR[J[qåKL–zö.‡TôñÁÅIÌÕ ¯ç ºÊ#óîüðÕò³™eÒÁîyœ©4Ä%Ã4Åb{mJ[ÝÕGr±s€×º‹§\ýnØHî8Ç]”Iâ¯6®š’ÆVváU_!IP|År2ÛxÌÂp˜‡ÎÉw›C¡6èx>‡W©$÷ÐC½Ñr80ìÓÇÑçë+õ.@+ÌAu?‹…%KÚ<ÓªìŠgTùQò!ú:¢´V¥0„û¤ü÷<;€!çV÷aaÅ彤_̶àÐ~øAgùGéÓ&á×±m~in´ÒÇkI«^Ñ3µ'éûKâÝUïýë‘`¡ƒt¹Qåõ8}j3×â"TõÂ%©ÛÎ`1)ý!,ïJjxÁWf>\ÓŠy…Ý™4ùô°Æö?¹I&\ O dkŽÅn¸Ñ DIç_—Ê€ŸašD¡„î¢èòKúèö #ªp“0ÏË£tÿÔ¸AdžH¡“±bßâ}€ÞÃô²>®å]¬N¯¾gƒÞÑòŽH¡Ñ'/±gu7Ñ< <æ””¹ùralÎÏ~´j<{Šw+мåGàÂn:ê‚)UÔ4ë òŒW(ÎHäæyXÜÅ2ÞCŸâ’Ö®C2È¡œ@î¦xØcÏÁ­è%Z¥ž€þêWã…Ù¶7ƒ$ôeÑ;–ÌålúB\Š0çc²ÉðôÆ1l²HÃÈpà©ÅÎÇ<<%î#N¡(Tk”é&I>Ÿ£Š$"¯y•C:ý”ÖØ6²Õfp™Ñ]Y{‰Ð0W³á_ʾæÖž ž`^œ”"ŒõÕâá|ø°0î1­-`,VÛÍËf=\˜8DàÜÌäZQn+ðl,ºôŒ®ÎŸÀìdÐ5¯x‰Í™Y“ÊM¢£/HR+“ÅA7×XL–ÏØÉˆ´gÒë©LÏòýù•@uùt±UwõhÚqHõ!œ²¼#6š›þ%zÿˆ|ÆV+j%LЪîžW3ewd¹ð \„Úýˆˆ€†â$i?z{`Ü^Ð˃›Ðñ=ǾºdLèíV ÉDÍú!k +XVÅ#­ä¦.¯Uó½'cúœ÷±ˆúƒÆBFä¼×Ñ»¤‘èÀ&à}ÎÓ'µ±$o>DÕSu$ÿ@Í¡Cù¾ ¦nZʾî=æù„õ2Pô‚Î;ÿËDmy¸~ÿÙLçÂŒÁ3ûÊù±?G}©ª/ŒÔ=‚@hí/ÑYYJÚ—èLŸ·€?åì…u>7Ö+ìNŠ”-7ËÕ-«vŠ@*kUtQ$n7ªYûØvÖK£ª~”¤q½ØQe@f™§Wá µU«Üy¸²…ÃP™õU0þ€¸øéè%G¢¼>bâø.ͧ›µ1. ç}Ðâ>Ú$:~ÀµR°¸ ýð¹û5šÜ¬þcGè`"Tw@­û0ñý|Ü`í{î”iv£™·¨uZ÷ÊËÌx í³~Ø x™¶`EÅX­ÞÒnÚ Yi7¼îuVжFíkVî¶Øé)‘®yÓÌ©sž"¤¶“ÿdðº_á)ÅV\f‡©¼Zé±Á厄I>完¢°þ/Ó=D‰ZNç (ɪ‘D¢oàÊ‹öe‹Ÿ›V§w•åŸX¾CÎ+R@óÒêõ7Å׈JlZ ìd²úˆP{Ñ®xÖ3ºÍ. !ÄÆ*K’€T¸Ú§MØ·?1,íÐG¿ƒdZû‹ÇƒhŸ3ô)E_ÿò ã8üH(  £Yé€îbÚÅu²]?*­nrÍŽc}ëA1ìà!ö,šÊ¤ÎÄ=Ïd*ñçp…·Wbjòоnx¨wÙ7›\¼½ª - µÆë–€}þè^`ïÝ™d/=Tø}­Bà U2¨vmeº8dBØF´d•ËÜ®½Î[\ø×—üHU óÀ…¬K"¡y'Z˜²@æçÀa}Ü5êÂC­1Gx1ìÆ«_”ºÜÜRl™ßÜRlFè1¸íSR…ÁQ4¯U„øI²§*†B8 ÷Aô€z•óÏ¢ÚòÒÒ OÌ]-E!37J #áŠpß*?õ3M]н(hî” ôÑK‡±k•X,TÖš¬­îè'(¤âÄE+¡Óß›H#€SEK1>­3äý-¿u·t×9WE¥PgŽ(¯…²Œþ~LökÙÚP½¿1ºbñ¬á>žc/GhP³£âŒX¾@^wñÐ`=3+Ï9 9Pä; ·¥›PïGñNð/«<<¥–32 ,Ø™+á^̳Ó<·"ËÚº-KÚ¬]djª¢7¥sQÈPEµŽe–>4hš?Äó(ƒo…ÀY5,……ÓѺEª³jêxœK¶*¶ Cê ÊAìç0~ãöô©&¬jEOÄЀ¸×ê@`eÅÖ1o>Rœ‚c–Þ¯õý§™¹]ýæ¤Ì„¤µÝˆÁÕ˱Dk´ÙóR¸5aÙˆ“®Và⨷åtNå±sUŠ6¨Â/“E>+²w²åòQÑu•Qõ/ïq9ËjÑgaê$þ›×›p¤´n€bÏ-ÛÕH¸Ü iưÏV„KuŒý3g¨Ä¸ô°NW²PN\ßúrûØÒ½’irâ&i~A«m_ÉŠ‚• ̉,£|5S]E®3swéÏ•îÜ‘ÄűïÙo°É^ÇHvCíƒu%õª+iþ±éŒ¬,V¿ÃŒB½hý”MçÑsc+¶_ì8ÿ\abý lׇ­që*‚QkgÛÙ9[?e[%8FpxÉ"Ìœ±­ŸòC­½ýÙ8@t¯ã‚Z§á vJÕ;Ú©oñ œmà°Æ°º*aíÕ5áG t%/ù؇8 ¬âu¬è›p¿Ý¾ŽŸ\Rbr›¾3;ýÆ*e•NmYe›¸BÛ´¤•ËÜ©»Î²XOS]ººî‰ŠÂDzÍ´,èsš—é:<®FEÇ‚8‰G)7G˜ycоu‚1J»£øÐ|Üò†>©¼™ºu Óʸ6!ž¨› €­rÒ~çܾìùºÒ0ç¸ ¯Ë}Óº”VF„#¦d¡•N>%t¹N¯‰µMXoµøc#Í|Ç÷„câ2$ÀRœÔnb1³ªFÓ`AÅçî‘Äbf!Ç”Üz3{>ÍX\k±1 C‘He(Qù/W®õ µDÍVh%p°SÆ`^¦^V8p¶ÿ:ûþ¹ÛYÜÂuhI½DÂË+]‚&k ŠgF&ûkú„z*î4¾iɪNðxéÁ;/í,ΜŽ½LKúa\tÖE2èñ)N˜kU 3ö6@¯³#íú¥ ëÊ\ø¼O^‰©°ð)?zZÏÞ—û,­ ùÞs@ÇÆ ™y¯8 ž%Éöªê÷©Š¯_Ã$LJs¤ÁdµN°×#]Íû n%ãÔ˜[¬|÷•L?£S@mÜ]=~->Ʋ[€jqéªï¾6Žn¡J^MÓ¨óGOc½‘ )²I”Æ@ßJYöíöFŸ™;N¼ÈDWŠ 6ÖžE…ïoí²¦¶_ïÆÜ>Šè ÓµO±ûàxæÁBKD¡x«:½F>4 ACØ ô%¦æ/Å褤­Ó÷øl,ÌÍPþaþM7ö,q:¾R…²¯ÝGÿä9 >ž¯`pP[£˜Ü,Ä .4eX‰@Qèè¶Ó¨òЈŠ}P½$em‘h2ÎÍ©Z/zñÄaºíõÀøÁ/œL™òƒ^„¿…¯ôöCdeôùr¤ªåÄ€|„8h5. EK~d= –‡zç]ôk”rTA¾F‘'ªË´z—Á6Ó®Ö§ `±À]Ìyu±Tå«¢ˆGêÍ-/ /érÞ+úÃ@ÎÏó0æ¼í7rŽ>"×ÕÁ°/Ÿ+‹zIÜ´sÛ¹¸n娭 KœrF,°5§kôíz³]I¨Lj}Üp $1˳ÛMÜ÷Lî\Íp­4FM?M/xï]ë[Aœ‚aâ½ç€;W3‘« šµ¦œ !1Z-ÏP!5àx*ÍâÝÚÌÆ Ú§€¹<ãqcÌ%Î>©m%ùQÉóW5VÀfä%˜ µ¾ð=Jé÷dØ<2ïN;O1KѤoâÉØ ¥#Ú #œ/ŸH §×ñÓ+/!‹'w E¨c¡šÑ )¾†Vì˜<ž¯ÕúV°PA˜LµÕ‹xÜ"DÊjÝ„"”P›¹{Ëþâk $ õSWÒ¬s‚.zªÖÖGÍùACJtäj¨CµŒdÕl×ì¶Æ4.``/q€G“TªŽ0«•^ëÁ ž®VòXKä¯Wç‚Ti©#±kýÞ¥Ž ô4œm§ç’ÎÇ“åŸ@ÑGò†½qàä#Šò€IkÐUÂoœOd•<®%Ë 1åèa…Ï*C=ϰ"9ß±¬<Ôù…às/–yÂVBÏM {ç‘6î7…®øoa]–N¹PÚÍ`ðËEíµfak‡¶qíÚ¸z ËÅ`©5ŒÚ•…À ›Éj<•Űöjvnçòé»-RM•‘Zõ¹Sé»#H‘ÊÂWè¶I9{Z»4ŽOŸ¼úcŠ ¡ŒS÷¨)næ¾Ó¨²nY\µç˜_ ÷Å)"ÌÿgI“•뾕À¨âá}â‹wBdíä¿JöÒ̵@,èó¿…§8°£6º!•zï´´ù`óðÝ•ÒPJÂdQår‹_ A•=IûÚ¹È.EJ¬£ó$ªM¶zÍ«¤‹(JÙsÌâ(X®à%µ¥ÛÙ¿ ˆBäJ62pš‡|üõ°´Óôcí&nüî:m˜îó5 d=¨ÿ›åÑäÔvéÙéWeÃÜÇáqåJPèߥ‹aB›ðDqªõ¤.}IZ Ÿ½¨úšeÒäÍÂqhùnB35ô»DyZYŽÃa3ZÍ<÷ݺQuÒ]*iªŸ!p2ÎÇo»˜MÝq£$³±d±óìаD¥Ù¡‚O5샾H<ïí¶:CÊ,¿píI^]N¸ S$ÞWejùrÈùÏ1Ž[®HceI5ÉWæh<œêƒØÑgeÙ»èss8_3AG!"ÈI{ÊøÈª™£ŸŠ\¯ü/¨Xœès$Ö·4åþ ãX.ÀTŸñ|œ2 «è“ ¦_ÚÅšoVYq­èS„EõJÉeÏ&ÖT~ÈÀØn:¥_1´¶~ÙÛH¬N·¯;G“áfXÀ1ûW‚³±qÃ@WŒí1Œÿ!úÎÆŸ#ðäÆR‰¯’žÍ‘еãج‡ã_…çß>:æåH¯´zÈ8õiw?”*òè¥KßùžÔߎôfË·0 …På{ÿ3™Z’"A÷ X°|£AÙåBŒ-Ä{Ížó¨÷…û‘ "Ê;Èv¿Ô$ùÉ>(+eÛ¢fºPÿÏóÕiáàÑ¥!ÑæHòI÷®Pæ½™ºôùùí:­~z ¨1±:œ‘ýõÿœ÷U: Ê”&£‡ÍðA:XwU{Ù­›k^có+aH›Êê¶/?*yâóóH*kÊŠsUæè«¶¥!—Døì²ŒŽÕýb<3¦E.ûšz¿¡÷ðu¿ÑˆSI–5y^®M×…†ñþUZ÷nõ®Ö²Þ·ÁÑJí‹@êTZýë“AZF{ÅÜ;è"hMú¸ñ}¢A:Ï^à„R㤱a‡AÖæfmc¥V}H+´”¢ÖÛà¦SyÅ+–PYbËf&Ñ„…j!Ñiä¶äùa—د…ˆï ¶šw¾ês§OæìÓ2µ¿Pï½}Ú“âDžtU˜/mo’ޱÇHÀxuúÊFéldº•€5ЂH§¦‡>ƒQ”f&_ýËýAÛ;½B÷1qwÖÉGÌŠxÈøàZjÆ+ŒÝª;8jÔ÷]‡Øq±Zªÿ Sƒ ZBjãIÄÎí¬5=g}l#‡çöúI¯UöÀö»ú™šë§LÖÔäÁY"\¨ík±¥ˆKQ–Ș‚6žþÑ/ÀaÊîr}éÁ9Kúz0Ë#»Ó4¬5pŒî!–¶ûßœ´õ/KªQ™ÈJWè…¸šâñèç膶nÐäñV¾<¹3 »o%ªwè_<ĽJ¸½ë*µ¥¸®OŸ R¬ŽÒÒF…äÎ<¦/¢†ZQÏ<¸¾?§N—;í÷s‹Ø°—èÐùV$±Ì4Ž[“µ¢‰Î¡ð8\O'\û¿‘òÄÝåURô†îÆ ºtgþ"ñ±¹ƒô†n´²Á#š¾øk¨É9ˆcm £Çáb2›Ò€¼¢üAdd´ƒ™ ¡ÆæS9KÚò’¨NtüÄ0W³á_ÊkHµW€ÏM·ÎŠ¼Ò¼Â‰ëÓà1M|KñHÿ9Í!ÚU63М›"ª‡Gú‰Zö Ha´×•Ì *3§ê³5Ul3·™ê£hí&HrÃE F9«çå8'½ñå쓜ÓZDÎä˜Ôðùâ==;¼ÇÇÍáú(¬£A³ŽR/9B¢ºüÅ‘Alhñå¡A8ÌHŒ«}YìÓ»‡Ón5NŠºT8& 5ÐbXdH«·õXÊj”÷Y‹ë¬Õ|¯GÐ"—ƒáÇ´𾦭ð7‰^ëÜŠÕèç7;påÎ’æÞ Äî­w×pµÝ‹Ûò´~!ùÛ‹ñô…ËÙ&Y»ñÑÕ>Ëá/£Ã¾ýí…9`˹{çC+J̨3#ؼ$KD…¤ƒi;ŽlÏ…4–^EºÓ\+¿™ŒòIšè¤¢ÒZÇÃac%oÏ, @kÆ“TËR°Š½0öÒJÀâ(uêÜ<Çsæz¶úA{y —Ïú Ít=7ÃYþŠ8 [M³€c½­÷$¡±hȾ8bŒ×+Ï\‚çCûÚ¸ñÑ`È‚Z®XÖÓß'nòÆ‚– ‹ü[±ÍR—í6Í×føÃЛW’®M®0™(uqáE–ÔWwôO¦ï›3‹’¸°ãðUJn™˜Gˆ¾q³ïM«¬–¶øjÊbp…×3=2+&ïŸ.qeÿWÌ®,êí8ñö^ŠÔ@g˜ Ý1ý£Œ^*ûú¯ªH°ô8ý$èuþ ÝÚ.íšâ*óÉõ´“{tyX)}#8§ß)ý8µ|Zý¦£Ý locíkÇ:·>óG¨ô°a ÂÁb¥c]y©}νuô|Ê‘n´cFC;ÙoKšqÓÓ~/ª/Qɦ«mðì–†í/dÆI°ØœÅ™ÑèzQðô¦ó=РJ­­ˆõ Œ‡º²™L¡Ójk[FugÓÚÝé7Ä|-§ÏtîÍÔÕ´]ËÿzÄa\ë ½aoÀí¾T´ô^%ì‘ë|ªºz^‚=¼“ÑØä^nÀì»Ê<ùN]œsFÓ‡IB½êåü;µ/"Ë’Ô†ijQ?.„üu0‡'‘7ü°¨Mrá”0›&›>u¼t’´^ø0‚FˆÖ¥ô‘L‡ËÀÏ9N!`ᯂp= NH,òß¡÷ü:õN0ÕÍf¦µÞ”+a—ãûež^¡ÒBÃÒ#%¤cÛ½?q¬<È9ï5B×.§Nñ1Ö..ݳÏ]ŠìIC&W>’Íæ!¶"ûà%Ðý¿NùJ]¶‘Emx&wôÇÛ£Í>~±j4Š—Ý1C† ô:àóH¤ÞF¤^:/—8"„Z%ýGË~{öaqœŽë”z´b¿CsïÓ_v£ÜD%}ZÙû‹Aà=oöª)/p©z›çˆ·¯ŽÈJ©lÂh&Peé*Y'F`Ç®•¸¢Ž"de¯Sä×® 5â4Jªs´Î$óù9pžÃا«”ê˜'$‚bâC5¨F ãÿÔç;·zÕ ÏstѼÈwñc]¡«”RZØ8}‡S,Žß¹o×)еoZÓO3ýB3÷R°,ÔLÍÓJ¾Q>] ñŽëf>ÈÌÕd+¡õ[¤i; zB¾™èSFÿ”¤áqeEnÌÃy ch&û—Œa2™’¯É|Ý»2ú±õ±²R^Zç¦ó=¹%Ô§ó{3 CŸÏð)…«N¿ö½8ð‡·ó]ÜJ(co}Êæ®Sàrb¯#—Y‰xÈaoÆfK‘.\g„a°LÙЬR29²âqúÉ ß@ [jÐví]0–C½Ú©7“ºÊH‡;ýJ_Ùü®áäK†óǯ«8Lá§¡e¯d4ÜÇN{÷Èœ|uPnG·Ñv,#7x˜!î]f\OI{…áÔi>K_SËh„ÁðØmo?¡ÜY]­®TV«^¢>NF„«^§Öªy Ãô@y ük¨%Ÿv.ÕPé@…õûÝèÇ.[;Íp‚ô$7+÷¨&zÅÅ´qIa°aèJµg7†„ËØÓfDm6Tß_[¸´ÌäÕœ«Ô@Ffàó¤#?{q‚ßßf7ºd_ÓOÛHP²”’‘CšÉAee«V±¤èÊNÛïÅU`LÐëÓm ß÷" ÂU¯S?“nOÜ÷9¶àï?€zï*…-õw7îBß+•…µŽ8¼Š†ýêÂÕ¬H„?ÞjA<ë&‘å‚ÑÎóգÛ€eº­DlUùºƒÁe–Ë_%ƒyØÿŠ ’Hj|7Oñ΢>ª"ÒêyDË+AüGÇ,нÔeð¬mM#ŒÃëÆY)¹2ä!›.¢õB£|ò’5’Öç¥ÒÈ”DÄ"öÊ dl‚’#¨ /·Ñ8¤ÉÛŽv,¹¯µÝ3ˆ¸>·âQH)¨©Y(®vÓÖg£–È•m¦ŸšÇÓæ´ùaî'Æe¡®å^¿$’k7݇ýÔWÂ{ü5Ó£x÷ËâU=úpmïï'7`f»ÚgÃsx›ž&a&—Søø&-óM¿ pþ诘a”UËT#³òƒKªaíAÚóPõZ zzøÙSfMà¸w©?èƒèK:{܈¼ØFG<šfÙ=úÂÁô%W'=v`’L~X!¶²ÄlñÐý½°&:®æv^VqëÑWÅQ*îäYúª•ÊöŽ'껂ûÊz™ØVzA¹¹è˜ÐÐ-êËË|ù4Å™órö¼š§T»y Ï¿“^n:M²­þ.ÅávMzH‰G/ÉþŠéÄ{ À >§\WÅ j®³Íelçë`¿ró<áÊ-øm=æñ§²²bö™@`ÓãVü $AŸAÝ>ÌCøAŸÅ}«¨Ê…„¾¿- ˆB _AèpSܲ( Óð(ÐxÛôæ˜'løgêêd„л摺)&£U„x=ÏTÔ3çgŒ‘8<‚‚c¥'tõq ’k¸£Sׂ}žáÔjÅšýa§ Ð)ô)+fSîŸ(žÉœv€Ñà×öâtÄá5÷a|´èãr¶E³C h80`ÛgS•Ñ.Ÿ‡ÇcâÒÃí¢á½2,3-š1k{–/7ÓÏ?yÎ4pØœ¤ò’/³­19ÿv›°žêäùWØò-P˜0ÓÙ™*=øá+ÎQ–ï§‘£ê€‘å8˜Ð¹%›y¯‘Å*%Ä+`^Œ™‡#Û‘àû¼R±OªÃrKM»¹3¾Ô`¥ ÕPa@j®ƒâ¥Â‘©—ÖÕ$ýü¡Öe=yй¬'r ð2¹lhúR½ÕàHø'n®æ6I"ˆS³o;0møþäûŽxÎ(z £†{0áó•6îcn¼ZÞ«ššûéû) Mì]1»”ž¨aÃHÂñJH~±„Sš†¯Ð ØHp6³’îÈE|ì¦Å,½Öw“$µyn«~†Ð”&%1 CŠžfœË¾‰O-fÙ»^t«šðÁóEÈ—VºÉ×ÉTU±2YpÿaâÖ=¡ð¤85M$m‡¾+iT€ù€Ý•$äô>À³`ÔÔÐî³ùõ®ñ\B€è8™&ð÷‰Ç$´ÒÞ-ßËŠf|gÕä×iŒ$hŒ³¼96C¯õ͇†—øþbL&Œï" ?ÌH]N‡p`Á8[pºl9E6SàÁ)kj‚BÈ‘»Hàx4'+ãe»>×Ó—mpJX+=󹌲•°' ¶—X'Ĉëfêì׊APJ‹q˜½žìt–ᩦetÃØûö„°R¯T”¼ ¬<&éuV“nð­f2f©Z/33<Ï©w£ãç¬e½o~žçDÂ9Ú½k¹ŠŸÍ—Ñr=™®ëw™Ô‚¨Ùh޾ì%ÅÄfÆŠ\OÀ ^fâc4Mc43&æeb¢9™=ܯ‡ó)Þe–[Doúçe8OW›{c6…=´iOŒäjEÙ"ËeŠ¥IqG¦“à4/S„Íå|µ4 D(Ã\|fsDqB˜x)WeßÍTý.ü8­€+}Y0^Fu½œ­†k y£{™dEé¢ ;_N†3qk{ƒ+rtD`6ükº ËÌ„‚âr»Yof@š×`B³éýÆ£ œ†kà2^æQ¥tçC¼c½ï ÷£Ëáxc1üuK øœëÏ1 ;0(â]à9ZYs`ðn-À£1+pœç¡Óîgi앴з'f|lŸr¥„sþϱ”ñ>ÀÙbG—KÄ)¦…úX¸"#»Ó4¶)ŽA³ÑøÑ.ЏèAîOÁUѶ°¿þŸó¾JSóiV~9ØÉ9ÌK4´ÓqúIñ‹´©Ls3– nä8q@µ6ß}®B­ …zv!ƒãмLº“ùp³6þœ#óú‰€rÑËœCFqeHúëŠÀ„±.ì ɾ-`@×ÓqÚ3¶³ìXÌ ü.‰Ž¬p_û®C°>G„À]˜”¿ ‚V÷‚q%px†Šs%p Ž Ò¹<ã@f®þNï‚®øx.Aà€ íÖÐ"+++pA/ ä¿éò uvù²‚eLÒ˜çJvÚ 9h¸~˜1v ¾d¿ìiù,ƒ`±M¥è%cƒïdxJJŒM´—^°Ïðí/ƒÕ¡E/žÃé§+1‹FˆääQÂ=yé&‡-Y³Ÿ`íÚïŠH[é#Àáhyà¢* zy¾ Œð2@ÿÔyåø»íæ€ÈöÁÅD"ª]úˆ¼:`rù£X²³|–(²sñOV ƒ²æÈÁµy?úRÏ–—._ÿ‹*mƒ„ÜÈp|WÔk¼³iÍ•TìJq!‘šÔú~hãÀ¨$Ëé|Œã”üDiDŸÏÝ£zK ^?Eÿ dØOÖ?‹:â÷‚aFVb†>iTµ\â£Üb ÄDÈ¥SËŠa°—èÒŽp± Z€º°‰{<“¢†—Y½EtaÿiþßÿÐ@ìñ½ grr-3.1.0.2/grr/config/grr-response-test/test_data/profiles/v1.0/win32k/index.gz000066400000000000000000000107461273104013200271550ustar00rootroot00000000000000‹–rSÿindexÍ]M«mÉmûW4®I%e&•ªB2p `L0q7˜8vHâ`üß³êö»ç>ÈÄÛÞäíÁ¥é{ÏÙG§$-­¥RÕûãO¾ùôÓoÿ!×?úÛoþø“o¾ùôß¿ù]oÿö³¿û§oóg¥dk½F§Î´G³:fÑh+w4oxÓ/~Q^Äío¾ùÅ'¥0—B†)E¾ÇÏw¥ *¥á¿¤øü]ðwÁkEüÛ§_þo¯£ŒÎòö –ïdЯ¿#“Æ‹ðªÿkãÒö¦Tj±0Ý ?½TÕmìf]Ç 6ö®Íˆ.ÚØ5Æ.17•¾­; ‚A†¬mlÚØZùëmlZ{+zÑFîÓB[_¥Q1Õg'ŠAN“>ÛÈU‰ô¹þüeÿ|µ žÃ²+SmS[Î2¯^Ì&ÂðÇxÑv‡U˜é²¯uØš³M'ö©ÕÖÒ2š.Yý³*…è_WåZ骯g “ÊÉd­ݺz>ìs<ö.H›[rqMW}=- Ä÷d³È–5ƒÅß±§R¹#¯«˜!/Ú˜c7÷¡{ «´d ÷Á±¸ÔW<Ö¢wøZ}535³ªÆVªÎÊ’ÒkÃ÷åbòŽ=|>ûì¡V®bO-u q¢TŒzVNêðïn¶‘Z«r‡Íäj<ÖæxR¸5ÇWì*Ùtæf6Ê+gTîÀž“|xÒEû$uY¶‘3©Ûð³˜Õk#³½ÛØÕ Ýac§ú¹ðÿù6êŠV6€UQ7„ðY}¯U¢Q¾Ç#B¢ÖòuP{½˜×Õ’}ÌQûJbš>Åf©­ÎH ùâ=B&wð@¸\ÇÉsu¡ZËf¢}i¸e¥¹Ï{D<Ûlȉᨂ(…ä³Jl^ò{À,Û-¾î§¤êE_·phæŽh$ ­ çëÚÊšút>ŽBWm\m ”šfà:Üàáƒ;}ïœüÁqë-ëˆ5´Ò/b {fÙT·;-ð1¯Kʪ²[[;Æ{½Ô¸#EÚU|lxY« !…v]±÷œ§Úì>«ö—æ*•ïÀð |àËë(ÀB‘œu&‰V?Ÿ‘ ²«{ñþâ]ë=z¦"~ÑF¤u­é ·Ð®4y²,·ˆ×þ™‡70 ¡tK¡z•S4—½;ʉܭ~ªL¢$²zDÛ/n†¼£jE½êk$rx´ 3Â˽@*¡p&ªco¾!Eüx½©DË¥]‘ïëȽ¼‡Ñ_©][c¹ÈqÛ¤@Ï·2]C—½âDΜâíz8ÅeìIA œÀD®ˆjµŠ¨O${Í>ê¸{„õê:ö“z­ûÔÄboäâ ?m|‘3EïÉ5¹j£÷°Ùv•¤Uƒ{9¼¾w+óó:REê·;¸ó!—mÄ‚w×D‘Þ#ÖÆâA]|à;`xkt†Óåu¬!= Jô5C±®‘ 2nIÖwNÖ«Þ£ô«½”ÞZB<‹Di´»ëîH¼iTõ]s}]ìéÈjä¶&d+me[¤§`Y[7é/þxú·äLýª¯9gVY î¦zXdí•·5(êÚ>8n¿‰SÛE|< 1(xB&@I ´>ßuaã:¬Ë==Ò˽”.²–³–¶ƒ¨ªò@>Ï#›£(>Â×#7-F}!ØHìf ŠÞ:ƒ2w}ïéÚCŠ¡ÔDuVC½éª=káeÑ¿¨×ª_©@ýTPƒ»ç^€8À™‡‰¿÷) ïé5ƒêóÕýšVw몃h@"¬fT–§Ï½Òù#ù®x|od^°1y€îŒ0§ÑÒßuGfAX޾Ÿ ¯é´‘܇&á:f–`š[wò«×ÜoYÇ*'ù.úšQAy:í©`;ãh®•o’¿¤­,ï½”ž;zͧ—Ò¯êÂC#ÙB ]ˆLžG¦w¨Ã5 ¯_:ñžžý°Ë={¦Ð Æú-0 £„—‚%f¾êÌMZámSo´«6n‡ZíëH?h¶P°ðºTÄ!iý‹>nº©{µ‚^op2žÓ©åy5v³^’ Xó{”ú-y}ërµÿÈ0«2#Ásm÷C&´ìޤñ„½8ÖqÙ® t¶– }í˜< Å¬}¬c¹'¯ûk÷‚?zE‚ºBTæ¾aºÕµÊxBŸ6"3fnèlâ˜XÑj ‰¸ˆùGÿQ`å-z†©Ée_osÑyvc¨Ú4÷ÜSz ¬/jùj!Lå’k‚F gØöŠ2¿ åþXG»©r¹ª¯acëËøì ‚€Üß ê¡XUSÍ¥ ½i.岯m‰7Hk¦A‰E„•0§–µÏTE¹@XSí«µ4®óâfÝý–x«W{)¼µLI®Ô×i¢µÜÒ·­Kè ýG«³ä€+!XŒ´G§udu©­ñö4¥õ¦¹•ðȪÜÚF¹1ÞH¢ÖžÐ”ækÏÁ ±J›ÂhE*ôVõY'ˆÇÓPF•±³ýDæ|†ÍÊœ âQ!¾Ê‡ž­Ü£g첯GÝ·æÔN)S¡ç6h¬ÚÞõõ)aÚoÑ®H¿«úZðÙgÁ²ÍÓkŽEµ&¨˜V–_ëh½ÝÓ×ç)€F©½ €ðµ5§·.g²§­½rÛÞÇU_2˜XöÒ |<6‚(:I›$h<¡G:JB zŽQ‚´uÔÅÒa@·å‘ûUgËZÅ «³3ãôU›#?Úßš&Ž–eZ[Oฌ»¶1«S‰Ê[%èŒåE¤Æ;ïÁ£ù–>Eá.—m¤m)4‚‘'†Ht.àã²Ï¼ëxõ¤ÚMû\•äj}Ì¥,<(‹‡'[9<÷ ³3õ¤yôJҵݻ²o-:¸>ÂÆ©}fp¡ !½,*ÞÏ8¿kW° [8nÇcõ*ïsշ扺2`i lÑÏ”xï5Ý}msn4Í}­%Öd`!Äj7ÖôU¯G¿§j£«{qJá|†7”µñÉpFØ ²5¾œ7£»âñj¯YQ_¢¯D‘ð[ô±mò××:ø5Ëuf"ïØ>;WϦèÙqÕ!ç˜MæÈ’h+N?eú³_;ê >¯r3õ²ŽN¬§#yª"Ûç¬O˜§8ÃêPµîž4vÆŠÂn3J⣪|ÁÃoÙw=<ü*ö¨û ­ 8óôÈׄÁ Ò̵Ö#°gö§gF¼PQ 3 rCÉ:e}‚æÒ½ö9ôÇ´ü1Ý:1džº±ô øhü`jVhsñsBEd!"¥®þž×\îḠÆUì94Ö³ñ=,"kçˆáRdàfŒ‚ê‚Ã$ÚP™{8´›àSfYOè?›‡ä‘¯ œ›çBõž6^3œUôžyŠ~5¯M Xxô9š†ËôÝ}•-éó} ½®¼£ÿX¬ÑU]hÖ˜CQ¬Uƒ“5æP¤S{‚v5³J}€êâIà;q† Ÿ¾ªù„ùGp²3>Ã̑ԣœŒ7I›ÁC^ëÈà½wô¤ÎÀ¸ºŽ^ þŽmP5´Ork;YSxñ,/nFííÚʶ‹ëèÐR uz*5°§Âõι fÍ8_6ÅXùlÈIq•søuù‘ˆŒ¥}Ǧ[â± q¶‹6B FqÏP|l- v&]ëÔ’üÁ)¾foÏ¥9æp¡˜ÄØcìz¯9–´oÙ/|;„u5¯Ý¶œ{÷¢e ^>ë*9÷kÞ¬ºçLîéÉ]µÑ¡gJÖìüq&´¬A9øŠ3ä²ì…tÏ9Í·)±«9“&#ÎŒøj¨Ð³ŽôéÓžp?E:CêDŦ¢6Eó$$˜o{žfœ^3Ñ&*­IÐZËsªADÝü„Y®Ãxâ4mWo4²Úl¼9•7üò²/÷ØØ®æLð¶u€çÄ.|ZI3{숻Hné5ÿEw‘ÄèÉՃǢ·K*Vw"ñsÔpy{Â|Oè¹o†Í›xVz9ÃH!Iû˜“ê½Ë={Ã|u_!, C7˜a©‚}oÓº„"¶=¡Î„Í1](!hàiP ¤‡‡ž¹{ÂÞGxokÏÃ…Vrø(.=GÑ&Dö8n8Ø·6ovN®´ÌÛ*Ü÷´× Ò×Íë –X*ì„£{·# 7”¶”i}‚抷)ð)¡[KÔÙO3*SPnf{BO Š¥R–sB .«¼Sócv¦ÝtFÜ.÷)æéˆ–Zû[Ñé‹ñ9Xèx|9óqÏ:b)®bø õµî©ä½Ç@HÇJéM¦Ø«orO^¾³#Ð2`åØpøéTØéîhF=#ÏØ¿ã>´H#y9—6wˆ;x¯U{Bßl²®ã#Á¦¥Ûšg|½æÈÎï}³¯Û?×¥H97†Åy|sY W[-{õ×ùëÂ7ísYá«<|º9Ê`ñn&CÎþá™vÉȽ1;3ç~ˆåJA®­œ fðáþž!·ô{É£«ýp¨ÕUöÞqîåâÓÚÅ ¸® ¶õ'Ì*d©È™0é¾ÄÉ<öág];hîà'ðÔjÕLSðY*Hpƒô×UQÂË6|B^gݼmò)0zØ­Ìs›Ï9©É+‰ïáá0éj {é«èjS6é‚L *é9€BÞçqßjá-½æ#gì²´!¶ZCµ#!;ý² ú³\ c=aÖ5I­³W˜Še›g¿'áÛV¤:Þûê‘ÞÃ)N´\å=IÛÜÉäÐýÈê ¿z-¹ë®“ÛÜì| ~W×qì èï§yB¡i Jš)«½îÑT>Ãîw챃R]퇧²¯¤¶éŒ}(yœKgY"_s8tË_¾«)‘e~ M>vØZ’E«Š'ÌΤë^´|©µÙõ › ÇÞï‰3,,Ýrvo¨^ù€ö³åXÉ÷‚§Á”æ’¨X‡Qäz͹n;ÓôFÈÅ;½Ÿ¶oB`ñÔZ¥Ïê HW†¯+‚<-ž°Ïµ$ö¹½e'–¬»-JAò$´ØØ¯uÔ[Φüeë(«@¨žÛŽ÷÷¥ El/…çãÿ’¾è?Þ3Oñœ‹Û´¤EjÖÜÈ(Ù=ÉÒû‡v÷Ì÷ŠÁÕu–4,bIÄJÇRÆÈJ¨ÏÓÆüâÎý¯x÷ì“äΧÿ¨5 9x·cñî§ØVx³žc¯«êæ$:Û31ðüø8#~Ë ûÌЫZa›ížz„et^œR¡jÌ÷^sïEn9‡„Õ~ÙF¯™Ë¡¼"ëF9GÏòœåBu|ß>Àk‚rÐ}XßµQ9ǯyööêÙ:Æ=û…zYÏÀFé,}_a—ˆ½ÀŸ aQw|q©îO§ˆâÏæVà€R×÷üäóGÿQu ðj{Ñ•z’•Š^§ü9Œì™*§ÌNÕ¥æ† OÙÙ ´uuæ]ûª·ªGW©LPüÜRcÎäÎ}G‘»—ýýÏžÑs<¸qLŒ-&gÒ¯ ˆž'–å†qT”ÄJ…þlOÅÕoŽg·|óËàÆiZKÕê½ÉÊon‰#üu¥Ë¡p, ó¯¯CcÌMŠ9cœq“!–4eš Š$^[nh’7ÆÐè Ð8— á Ïð7ÁçLœqatgt³p†ÏìG»@K /bÒÆã‘}ïLìñøW+˜NðÓ¿}z„ÇãTããq‚r—rZHˆÑÏ~ûÖ÷£5%›ò­N›lõO†›{»3œ8Ã’c5 1œ_'ÚNô)l„æmaN+t"Â,ãIñdhÀì$U° ®L >X´1šD ÉÚ#K^«žêpeÉÆhùiI–ŸV6šú<#'€?Áž/úл¸…1œ^Àu£çÈ€6¨0œ‰^Zèù¯wq÷1¹‹êÂóEm;€yöÈuŸ„QƒûÊ]{p<¸4|ÚÁââ™çD¸rÆF1 Õâ'¾·®4ΕCu?Ú;OB+P- |÷ù›ëëÞ+ëñ­ýÇF—ñS>G¬._—#±;`MB±‰EæýÑ5€…G¦)bÑS¼†Iá5 oŽ*b9-–èJXè÷ Ï üÕd¬>V Bn±EMl¦l±lcΫעI¾Ê<‘Dš‚¦<¡ëf“å eÕà³!+Eˆõ eÝŒkLwrÙô1šD º1¾õÃeûá²ÕqÙ˜À4›Óu.<2 +1?èÓ‚¡‡Ï?-Å¡ªÒ¬˜ˆ2bÕÕi P'KñÒi ï'·j²e5²›”²m†Ü šØÌÙbÙÆ¤ÝÞjïèSï7b¹ŠT BíH\®c{€‡›ØD8›+šë‚q¸¹o‡žâ5 $Y<ˆ°2xL]}; ›ÜÉûvð–výß«ëÞic7‰$¼ÝÙb^[§‹ù»ÌóõëN—uö Š`\šU¸Ñš;êo8o0ߪF $eª0]½ ›!¨8r“y3ÉÛ²ö¤Q»Yúe­¹3EUlñgŠ…[shŠÍÖó`òuöqa°`" wÇÁ•°!¸ƒ°11­†§L“w6 @GÃS9ظ¡U?<¥Ñ$¤i3<•×ÃfÌäK¶Å˜|›µ³¬°3]"“Eð›¬ËVè(]$YáÊŠ+£B®šâE’îû2n8ë\›Iàb¶89ZjaZf­ƒeÖ +³=] fEÔí•CæQÓ+ð+hSX]»Y-‘êíU$P @må§Sé“Ñ ½é&Ë–êvx ûf›üŸf—Í653\ÊÔÚøútöÄÌ@sÐ2\¶NÛÊlß·fKIî °=²Ü¹Àže¹Óu¿¦Yî:,}°$i¿´oGV"×HÛyHÀ; ³N/™¥vSƒ|­/™­+»Ÿ“¶²UµdöÚŽüàÓÓ,š.1]DœÖ…·wY4{ŠtdRHGáêj}5!Jß9!H@þZèÑÈnô°ïyµ~4ñg¿Yw À!±#0¦ÒÄY’¹Îßé&v$+6öÑîº%•Ý×eê¤f ÂZ]TÓ:oÏObC9$p(Á&]$~¯Ý©×8ø)’ræs°ÖšÄÑÈnbAjq¿^A[ˆ“/ÚpòÖÃ̲Æ”„r¶Ø®&Z¤ y k!Ek19¯FrŒ eôä(D÷1ÓȳÑÈrΘmrF·XN’þÿ6 ë¼µ•²& ÃFv A¥XäQü}±QYeB¨²ƒh»CÉðFOf: Œ„ñϳ<;‚+᡹ÃL¾˜i±uû¿:Êbð«Y´šf¤ï¹( Â_l9K'ˉ%‘­ÎµVag¨˜ÒÄtq°[<m‡’vWu²x‰ŒâhKVÍ,ÂU8õå„dÝÌá)†d|ß ïk.{kd9±$Èà­eòºØÉ—mm²Thµf\fYewØp˜ Å9' lÖe)v6”¯€ ¼o*°ÚÂDø`Ó(ÇF#ËI`ƒ›eó„Ó_ûipæ .È@’dbí…d$;ìbBbK¥Å3Ù[ ɬ8 [×-êJ‚nîQÏC(²ÂO (¤‘å¤js—WI›1T*ܘCã‚îǵçS…ûîîãPl¶ðqX‹>Ž:õõÀ6B††Y°†d5©¦Å­pƒØ7îÕØÂª…¾ÄSèKõ…næð f.·“öMx\fj ³6ãË%e|£Í`9ñÖÐ'ß¡:"ZÚžmQ±Çþ Sr‚ ûtÝÙBÊvO ŸâŒŠ/`Fâ)q)ª] jë»”àNÒ.ï¹=¸³š;óu2št˜µèµ)E$Ö;]¨\¼­d¥ázkíuš™`‹œÅÖöf Ã}´A ï¦.ŒªýÛ#À" $xvf"m+ÀbHÉ|¨&“¶¬ÊÄ+|—øTëÍ[$ô™)ºé»ÏÔÕ®ã½èe;)‘ä®Ó èÔM`ÍzªxØûÛ£`ÏÔš´gG½l®2—4”#ÀŽ-ìœÙånã~o%»vêù>î&l1#9–Uïµ0.ÿ†$ÐÑ¢=R¹‚eïJÛ`± ›$‹ÏÝʲ€î@ýní, 'ùÜ¬Ñæv¯’26{-¥Âm­Rå›í…·vü3\\ü޽H¶¶ƒ·wÞÈu{_¤4O`hNF‰#j‰ÉÑ1 R˜“Écö’ž󯽣ƎYAÄ=|2lŠØN8¶îD2µÖ„cÈÀÆa£ð^%F)) 30Áo™=‰M)ø¶ìÉ-sÎL_‡÷C*û! ¯nî‘M¦q…I)h&ò'¾»œz™jJN¹‰œ­y 7Ž£ÈëÓ*Ó¿6j-%Sîqû6R(•~Ð)”’S5ÌÙÒߺÍ/Ê€y𙋚²h¶È¬ž5kVÒ °¶ž"ÐÍ£fã¯Vgßö½ºñz½ì&Án3^_ÔÅ–OpÊ6ŸÅŽùe<®Õv½ïPçªì±!ÆP‘¶,Ò\ûéFÚìÓ*Trð÷¤ •”Þ“lÅayõƒGXßÉ)ˆÐÍývIhjÇ0›>¶“@Gà]ÿ‘0ÛÅÉ›ÑéËxÐ{'oOGÇ—C˜²®AøMÄÌl`ò5á7èz'*±bK1­œß¯±S%:º£¸°0º›ÍÏ:åT žãÛ•oïB;¿$²Ãî>Ïç#+²Æã8¼5_Ú³yò'ºJuô§W úʱ¡•övdßþ÷^·àЂT{Ì*6 Ê–RYÿ¦Ë†Æa7ñ*;&`¬;æ™ß4lÇ‘`-…íØÏX‹Ãv)ë‹u·;æœée¦ n%>ØWêàÆñî”o´šC"O¾Zu„¶ÆÑ=ÂxKb.ϰa[rWû>ü›­`mÏ¥grr-3.1.0.2/grr/config/grr-response-test/test_data/rekall_vad_result.dat.gz000066400000000000000000014743221273104013200267000ustar00rootroot00000000000000‹séäUì]Ys9’þ+Z>k48—6ÖçlGŒh»§w×îp°%ÊÊT”܇ÿû¢ªp”,P"¨,;Ô“iIüÀ,~‰¼‰Fç£Ão£Õdµš.æ£cûr=^OšËÅÙtf_~Í×þË/?=ÿóKý‚=ÑOÅ3óTÁÓ—ðD¾€' _RMˆ1ØèpôÒ¾çõø|2úíp4¹XÛ·Ï/g³ÃÑOóõÛñr5Y6¿h€çÍYð/Ó¹ú´^NdzO~Ÿ®–ã/?ଧç“.æíŸÿòþ™ýí{û“ÿi~bë>ü'ø|r6¾œ­¼P‡£w~þ¹ùÛ‹ñ牓êÃoýE¾ŽÎ—‹Ñqó9'ËñÉzz5y×û¿ÿïädmñ¦§£c ,.ÝþÀBœ,ÿ˜Zph~¹^,fîC–“Œg3ûÖ‹Ùåç©ÿ¬£«ñéÈýáÕdÙ}#zGäèb±ZN®(}ÿíðÃhÕ|OÝÛšÚþì̾ùíôôøàù~ð~ÿh…+î×Õzr>jþâÂÿ´ÿµþ÷щ[}qv¶š4ò¸ÿÿíÉsûŸ³Åò|¼^uìxôa|zº¼Ÿþ6ú~ß:›\Mfñö¿7ßùïüÚ[,±–ëOgóø¶w͞ض]w2?½ñb~ºÀ—ééúï£cy8ϦŸ›Ç¼Œ '‹ók«¬¿^LâooB«ëŸéÉÉåzüûìÖ÷Èkï±Êµ¶\êèé~ö¶ûÙÍ·þ#×Þ´'¼õeüÉïmÈó­%˲Uôð%X ·¯?ÛïÿX Áíƒi¤öÄ|»˜6z`ñ®ÎíÎO_VO^=—ðÖªÐé«Éùbùµán‹ñɪƈ—ó•}î“ÓƒÙÂ~°LÜåd¼juão‹ééÁrr6YNæ'¸Ò¾¶[Á›V;¯+©–"(vóÖc'×ñëq£àïíç;~}y>YNOìÓÿãë«é?ÍŸŽW7М®xÉ:p¿;÷¼Âj÷^¨'ôëÅAÃe»×¬.&'Ó³éäôNÑ—ßý+úœ=Ú¶|íTú˜¶ê`ןÌ/›ïˆx@°[ËÕxviÿžøÕŸN×/§“Ùi®œÍúN•{´aDk#P™˜‚,BEC2½hº¨™‹@<ÃxósF abosŒ4üùÅ“ç¿þüÓûS:‚ÿ/æ\ãæ­;02Šë>˧W¯:›ØgOøá´é>Q÷×ÇÖ¹´k5Ë>éß³ÅùÅx9µOu‹oZ `JJͨ Ü`ú{÷Éì2¯Æö‹¸c£g’ÑF‹1õ+YF¿ÇÖ/'Z‡N+Ö/iÔwÿÊdìõlã^ßl'ïõR2n¹x²)¡Ø~‡—ÍÁWíyêw{’üœ»ìöDïÛn¯©PœçlJmrw{j —DPFPµll!MÓYÓúòuK¨äžZ‰¶IÁýÞ/’>ൽÿÅ“¸ýÓ·Ê<¨¤AÝ(ÆØç,¸J)6=“°eèI¶WÒ—Ï-Qµk"‚k"’jÔ3?ºïããÇ.…ÅÙÇóõélvtÚ%ÏR¦âŽxöËûŸZsñìÍÛÿŽñªÚ“¡ÀB¨7 v0B(»õ¡›Œ$l!lM)¶NzùܪbÔÔ;h:íHn67²C&`š mf0ƒ¡l@Fš´.9“°eÈÉøþL¯[‚ÕìÏè6tê^%•h£Áøõͯîa04c{g0¥ s€ðìŒÅ ·~° ¶NôÔmO>·DÕù[ >¢×r‡üÒŸh:dŸPl‚-Cα½¾|n‰š½ ¥µ'!÷H½yýW¿S+Ó“tÐúÓ_ß¼þKr»ö¿Éس۷ •ìÞ- IеÏCɸq¿]N¯š#Y§Xµ:_­Ž¬*?x<*°ÁÞãÄ…aCqï?ðÿþÇ9˜Î­fOïÞW¨a¬ž]ŽŠöÓ¸—a$aS† N†®ÂPZ(Ü’{³Œñ5€]‡ Â9üš 1–ˆ2r2yd‡RŒ¥% Z̧wÿùæç÷ióë•cÛ÷ ENÒºìÚGNTPØ`oI¶µT œ’˜EtŠžÉðÂuø¤æ4íë2öåÝ…™[RlÁ€¡ÃÛ»g(äŠL ³'z9Æ çðk®ÅX"ªÈÉ»ª1[Û0ð@ö ž¼™ÒL1íÓý ò+-’kÀ.³¤0Ë(¥è5/œÃ¯9åAE(ÊÛ—9›ÿ`@È^I^t$‹J&›Êj2.Yˆ“Û! Âuøéw=œT‘“h›¿µùW p™ñÉ|Ñ/¼o pc”4¸Á@³Œî1†]B Â9üšë'„Ž—L&Á·=¡ËUÀ”2hWÃXA@2äp ‰Yˆ•ÛK Â9üª½ûQ#+“)ËÂi-‚’`”:è?ɶ’Jb]^ܾ¼fÝã½5Ï çð«NÍJ,‚ä9as„ ¹:BRvz(‰Yˆ“ ÛK Â9üª½ÉYä$š=üÑH¥”ÔHÐþ|{@±^®2Øí`Ëh z‚¶'Ÿ[¢ê­g­ìË»[Ý~:—TÏ6òJöAs­A®l€-ÄO^PîÉç–¨Úqá8—%Õ]ç¹’á˜Qæù\»^<öµ/t%32Ú Ñ?èõØÔRˆ¡»™€ª³»R˜à»É¤Ûl6n„¡ÐbÅ) €÷a¨ºÐ.Qµc#% MÆAƒµR©È^ZæÛÇíþ@ó{;8Jp‰k96Á–ÑËnßÄ- FùÜugy<¨ÄsjÕ7ÚÇãA%ü Rè Aµ¶ 9»Iƒ4 OÎôÀ˜zÈO,ñû­{Ý#–ž±f=pûHÅ©Æ>(Ÿ.§ÀòkÖûÐü×<©›ÿìU§…• iaevélØãö?¦ÉÐív‰ªý ed¤Ï}šú[¸&ü¡¶ðJ;Ûý[K¿w-ºyû·Vƾ¯ ŽLÛ#êà-È…ÔPd5üAÄn™äw5š!u«ÄÝ5çÛK ÁÙWBíì‡g-Á=žz r¢Z2 EÔND·Jò믆¨"zâ®Bt2U4¾˜Ú²:ùûä|¼SÆH ³#!A‡Ý‚äfŒ,Õ$16¦„¶ÝWO7!ÒS¥ñõ´/¢[%Y®FOI(:(zwÑat÷àY‹£Àš4Zs¥‘›nA.ÂRNØnO_ÄnZ·ÛCydé]…‡mÅÈ UÙI½³K»ää.öAKÖž7@óÈ…4OË4ωèVIzGµhžŽm:«íáFE:¤u¯ëa z´Њ´u`i¹ K)È‹ñ"ºUªöbtlƒÐxmúáÚ jÍP)£À„wz‡ˆÀ&­a€"…\H ¥Šˆn•äý+Õ¨"§AÓýÛ͈£wü|`ƒa7=ä-nA.ÃRƇrkœˆn•ºÝ."KïšQ»½Á¶ï£i£¦< Æw6–M€{léä2ªhƒûáTÑŸ8¶«T)Ö& “c0nžyæfd?ŒÁ0”òa"Œr!–ÂPnÑ­R·[c¢Á0hÃGƒÁŒ0Âg¤´Þd0¶ƒÛ ”8Y-çà>ÎÁýÿ2WQ®êÙë¸T>›b_æœÓ›jB\êÇ9¸÷²ÂŠJì:е9¸ŠŠš+@–ˆ2rk®¥åã\©æ0q)çàþ {Œa§L®ÍÁµø5'KxtÂó¨Íö€~⌂±/šJaâ¤Ä®ûá~Íð»$Ï—Í'ãÙäh>[Ýf.zx ʾÄÈPâ׆žlÙ¼.ˆâÈGÉ’˜eÔsìäHÎáלáŠøƒ9¼½p|÷PHJ‡NÞQA)0dÓÂ,ÄI…î®xá~ÕîŠ"*rr§ k'ó?ýòîãÇE::¿œn2?;¶ü­‰bO¬„Ò’(?*‘K“?K](¦‘”%1Ëh$v¡'çðk.ñð8‹o3+Z ¹éLïOÃj¨‰Ð” Kbâ¤Æ÷\œp¿jÏ%Áâ;ÁrVâËt¾Z^5*Yf¢? k_Ì„´^„ðC5ø.“°þ¥¯ÜPB çxûWnØo¡ê¯2ÑqKÏ´È&4I\3Šl&$00Èf"…Yˆ“ÝuñÂ9üª]MüéÞ6¬ãÔtsWë~×ý%@BÑAi“_thŽrä¢C ³ŒâIžàõÂ9üª¼JÄÌRÖýK›‹J>ÓŠ*Ê(ÃmILb–á¤"芮ãdzºH=œŒÊ÷/õb†—‹ùÚþsõy¼úº::k¿lUqPò¡Æ\Õ$(Âó.+WŸK²4…; %‰YH%zv× çð«ÎîjN‚C–®l$Ä(GwŒ&0©¤È£S˜eXi=ZdVá~ÕÞŠæY™ü¤;… ½!œ{|<Épˆíoš±ìH¡£òˆÃf!ÝSØ™Ü œÃ¯;“½² ·bn°bcÚHÈÁÓFö …=71…Y†“†b{)A8‡_µ—"dH ‰–6jo£Ûï´‘Ð*^ÓÊä§1Š Üð ‰YHñ4v¾6çð«Îך˜û…$Bê¡ÓFÿÚ×vkÂДþµÝ¿jÅÄàÀàæÁ‚ƒzrC‚4·=0ÿú¡À¶b4¼Á=šÄ,¤h;?„ëðuÕùY­C“NÒìš60üæo(¸SG’˜e8I9ºCâ…søU;$ÚÄ|ezrÏ­5ƒóñr6Y¯Öë³m‹múž „F†¢n'»æÆtÛ†…©„)ÌBJhÐÓ³^8‡_uzÖ(<0•œÞôZG‡2 Üz;ÈÅä$fN2@wV¼p>¯ÚY1ÊNêääåü™¶IîßÞ/m€¥BPÐ^ö“·÷7§É ry …YFÏ8AOÅzá~Õ©XS±:ŠÝ¶ù@EÈÄÍÈ{?4·H#—R˜…8 èþˆÎáWíh)"'±¦Iñ¶N÷X.n¦YøÚ%×"aG%ä A ³ŒîEÏÆzá~ÍÙX ášm [\³½E,`q¿ñ‚IÖ]Ÿ‰ÉÉf!N tÅ çðköQ,xä$Òý@ÔþÝo!Q‚@Põü³Ú ÏMb–Ñ3ÁГ±^8‡_s2ºËtÜËœêðÆÅ¾:,mÀ}Kv ³'%º?â…søuû# "'±ªÃ@øÞU‡5IBKš_nyƒœJa–Q4ÉÑ®^¸ŸÕœpJ‚¢ÑôiòlÇ¿½JkàÍ_ &°Ï‰¦0 qR¡;$^8‡_µCB‰œL_èºËæO©Ø¿Íߺþ‚ço²gKt¼AÎú¤0Ë(šâèW/œÃ¯:ã*â¼H‘ž¹õ-0¡`Ã0Û3€€ Ÿ Mbb¥ÆvI‚p~zVt=¬”‘•hS­Eà뛿${·ù3„ȰùCv¸åÄ­'1‹(š!;é„søU']™ž?KÒì*p{[ÊЛ¿QyÎh³ '»ê .'p¿j‡„I9‰æù3¹ž?c\Ÿ–¶ºžïù·¼Á­'1 )šBO¹zá:|YsÊ^ã9sEoÞE@híõâÛcÉn%8‰Y†—Œb;%A8‡_·SÂUäå]³E·7¥%8WàóÒÀXo¤è–¥€ŽJ¸Åá$f!ÝSØi× œÃ¯9íÊÁ„YÓí`ú­mߨ,È೦›´6CnKb–á$gØ~J®Ã§5û)–ˆ*rò>ö ßÜ–€zÈ#eè=^ZJ Ù$1 ©ÆNÂá~ÕIXn|g¦}™3)bsnÈà“"# ‘ï:Nb–á$0l÷$çðkvO,C± È]“"nŽZM>/&—ÓŒBv™=#!”1þKà:{Œ„å”6ÈEƒ$f!%4Ø Ú œÃ¯:AË… †AäÌ–Û|\ˆËÁgË)FU[àFåd³ '»ó“¸œtÂ9üºÚyºÉm—œïu³ïMÑ@Ú­È…n:Iææ¯‹IÌ2Š& vr6çð«N΂ Šé˲[Ç@ Þ7¬šcÈ ¢$f!NºCâ…søU;$  r­oôÞõ +­}à ³û†;Þ঄’˜eMQìLl®Ã'5gb ¤„¬¦Ý'%n³1'4ÔcÊmŠ<6"‰Yˆ•Ý%ñÂ9üº]’x‚Ò'˜wÚþ…| í¿âz±¦B7­yþ™ð^*hËzqG%äp …YF÷4EOÈzá~Õ YAƒEeœ46|‘@6·n#‡)ÌBœ”è^Š®ÃOgýêád°‚¡ÙÁÊÔP&üV‚äZÞ ‡)Ì2ŠfzÒÕ çðëNºr?Oھ̙'}óºI1Íðá€avCR˜…X)Ñ]/œÃ¯Ú%á<ž[àX¥ÃãDi©$·fиÎò'JwTBR˜EtÂÑS±^:¿@Õ¹XIC}@¦§_g’_0Fpƒ¤0K±R¡;*^:¿@ÕžŠ¤Y‰V!lï*šiAÃn]14/$h‰ƒ¤0 ©ôd¬—Î/Pu6Vè˜ÒH5a†¯hé Ž$1KñRc;&A:¿@ÕŽ‰Ð1+dð²Bæ±JÐ5Tú"&•_%踄$1 i_×|¯}!,`PuNVŠ`¤À©H9x@Û— ÷'1K±Ò`û*A:¿@Õ¾ŠŒ ÉôH;…r+Æšá-€„ìJAGܰ ‰YHÕ¸ÀNÊéüUgeE< ½á’m›zaÔÇ6ža9,Haâ%tÇÄKçxiªvLº+wÜK´ÌP•ª9,hª‚ù>2!X~XÐr 9,Ha–Ò>‰— ÒùªÎË*087P*|ø¨–‚(äV²$f!V ‚î«xéüUû* xd%ÚøÑöí~…š1jT¸ŠFñìñ£qÂf)USèYY/_ ê¬¬"!,Pé±”ÙC&ÚŠ €¢’!_E“Ä,ÄJIÑÝ/_ n·$Þ§Ò¦j'@÷°\Ì™ ±\l²ËÅZiª‘/Hb–R5ž‚õÒùªNÁr‡I¤›ß¶¾,ž!¥0x^ÈàF⚀$f!^*†í˜éüU;&<žcãésl;"¥5P¢æ¼0Th*c¦7bb˼PÇ%ÜûÈ’˜¥´Ï`geƒtn]uVÖÐp/a9÷lÎ ™^ÿÎ@a5¶`„Á½•& Zˆ—šc{+Q<¿BÕîŠa,ó>—ôgÌÖëyÙÀ@ mx<2dhöÝ­ëÌ‘m@´”²ì4lϯPuV«PÐ:§:°99¤õàÕk\ÁÚoܤiÐBÄ4€íDñÜ é+€«!¦æ‘˜hmö®@ÐŒ›¦Íi•] pÌÁM¥AËh%;Åó+TÕBqD–=oTÃà5k])Ž ¤@Kðý/ž_¡nÿ ­L ÅÞ• £ÔèÐWÜE™™f aàŽœNƒÒ6J±²Q<¿BÍYAˆo!°/QZ¡ƒ·؇¬´Až=—-ELïŸxñü 5û'–&“buX¨ýë"`ZRáýR0&»‹À1÷Àh´¶1†ŸõâùêÎÀÊP06éû5³“BF ~û@“4üœ:û-»±û‘“ …ˆi(¾ÓâÅó+Ôì´XñHÌ»:ÑnF'ŸÇ@¾,Æ9ñï…½û?€ÐTvƒü65ªŒÜŸý?öþµI’ã¶G¿ŠÌ×ÖFÞÈô DZ%Zr˜GdRØñŒáìœÃÙÙ9Ó³¤d¿û?«ºò²;èKå ;3Tû8»µ«µ@øáÖË‘ÏâECã¹:ݘ É_ºzÃ5h¥ÚçJ€³Šy^™$ÚG5•PìáKoá Ç_Ò:ÐtwwM©A+ø˜?X§¼L08ì×™­ÌöÊÄŒ-‘D{ cy“x‘ÃÐ oP–_ÓÇ5³k»UA¹æ³kZ -¤áõ 4ÑNŠ)wÐ’Å‹†ZTZ±ê%³ke† œÝ\†>„«±{”]=º¶(¯ ‰ö26Ï ãfñ"‡‘aÜéˆg ÃV5«nE2í›Uµ¹/0O0ÓD;)¦ÒÜáI/r:<ѹYõÀ¹ž /`¶×ê$øðF2ñY®oH]‡wd&ÚÉØ´à†l³x‘ÃÐíþm³||ÑÆëœ ˜æÌSeL æ*3M´—böð$‰9 ž¨´g+||Éó{¹@QæÚŠP B2eãP«ç—Åá­(ÓD;›‘Üloá@_ÅØ &/p`’i}.àÚ{Óxî¥v4Ñ^Š ìáI/r:<ÙOî-¹¼€q›óÓIdãbcì» ×yYq˜wÚÑD;Hvø5‰9 ¿f€æ7C]Àhî¬DpÞ°©b’D{)¦eO’x ;<12)¦!׫ÔxbëîV¼€ÖÚ•†?ò«½À^qxG”i¢ŒÍ*vø5‰9 ¿‚JÆjÍ.£Ã¹¨æ»ŒÂCvA»™«Ã$Ñ^ŠiÙÓ$^ä0tx ²bžÚeDv—ºµÝ¥ Õæ|„Bê¸P@®^t¤Ã NrO ÐD;™"jvp6‰9 ÎÊ\;–«jÇúpÕàµc«@[Ï\;&‰öRLä^¢x‘ÃÐÁ‹ÌµcY±èè¦bAm±²¬Ã»*M ÈŠÊ2Jpžy'*M´“):ÃÝ&ñ"‡¡¡[+S¸f勺LóÂÜäÞxA£Qr^ÎĪšÑ^ªéØÃ—$^ä0tøbeê3µŠíF‚U—º‘0ð‚Sá½dÓú#+ŠÖÓ3'ebî:"‰v2@ì€noá@/oŽHùƒ§Ï½­Æ˜æÑØÆùƒhdö $Ñ^ŠéÙƒ–$^ä0tÐâ…ÍŠ¹>xs{ýøv·{õôôݹ郗ÛK#|lIr~ý¤iÒDˆy„ùÙ>Ö¨°1Fcc¾˜‹xºñéßn>9Ü¡ª2Õ\P­æ˜upÈRsßZ;@¶“†JÁ?Ëœ\4”ÆqÆÑÐ\• ‡)iñÕßwO7o´úúëëÝcp7³ê’.ãÓÿùôwùó§ßÌÙÆï>ÿ"—'\.Oà6|‚6JÅQ[»þƒ.7¼=ó%†d{Y¦er.ŒB8qF׊ŠÛγ’Y`ž>D¶—q"û’ËBÀÈchØçR¢§CÐÃîãL¥“͉<¡›¹ SŽÍ¼DéÙN¢~ MFc8"8ôÊØSîãÝîæ±Öy¼óøæ³ÏÿôºØ±üÍšZÇô._â\HÁb*âÝúË Aã&/¬˜a¬d{Yªc_‹YyŒ +C®wÐçãû’çåð„cy[,¿ldyŒä¾}€l'5ªA¼“Œ<ÆŽw Ç;ô8È)orÿI3 Ь·—‰…qŸ(x³º¢&ô>±¼ÞãÙ^–é¹!æRÀ…‡b¶Âëçy–£qVŠæGãÔ*bjnõ$ÉvROÐÜÁM)`ä1rpt³zrŽ º½Óq Qªˆ¯[áVŸŽKºÃ[Û8D¶—Íynä¸0ò9Ö&mÚ׆޴À%ÈC.A¸€K0¨Aq¯ï;D¶“zZñdô®®qÔ³z¾Ä%RAA³GhÛ)5píœ6hëâ3Ñ…8³¿6i·“ Év²BÜøp)`ä14>¬0áÃj-'&0~+¾ÆtÜÐ!²½ÈðGYÀÈcä(Ãî«€ËÇSõé3_ãvÞì}™×ø°…­QÇA.«¬ZýwèeÐ%?cŒVx„r'CtÂ3â2F6d÷Þ0¶¨l²Eµ²}°ÖΫ ÛvÂî¶Ò!z¼é#”{©*È&ªšd\ØÐ1õ0ªªsÜAï18UIØýmWU”VúREéa@#'µp©)Ó*¹º ½W1-Ä~nÝ@IÊ 4üž&šdŒlHLfÕ)=O/ú;ÞÚ”|‰¸Œ/ÑÂZîäãå^ª mž$cd3tØ£A&U…S«ÿèñŠÇ¿?<}~c•GÑà¶æQ씡ڸ1Üî¯ Wx£ŒwÌcÜG(÷1S#æ­düfšdŒlHåÆLE*Qkqºq¼Á){)/ãQÌ4—Ì|Nâå^ªjÛ?IÆÈfìàGäàGœªMÊNv?Õ¹i¶æNІW¤2.&(~uU{Ñ2-aÞKÈo£åN6*µnc£QÆÈ†\{3ŠJûe§¥ëÜɳƒÉH/.äNÀ˜ ø-T•¢ÜKU±QäeŒl†Ž|¤³YU«Úf¾½¯u'Òo±oœIîDâê¾Ù¨e8õ€6±Q‚r'U¦ d\ØÐç"F±Q“çl ]q­ÉN ¨ ¹kP¶q'å^ªêE>QÆÈfèÈÇÌ]‹~‘m¿§ÜÉuÕúS@¸Ûñ'ÓNŸÀ|³ÆŸ p–yéùÊŒT›6 t’1²”6yðÖЃ·+jñ6SÍP³mêOÐ=oQ?!)÷RUß(ô‰2.lÜØ¡È¡½ åœõTµîDnpÁˆ¶Ó`~Äûüê#‹–yJ6IO(Êl4¤ml4ÊÙ HŸm”;Y‘ž¤M# rzÒhÓÈþaƒþÚµHOHʽTÕ·‰|’Œ‘ÍØ‘Oé ЇíO¹“ÿš7Vý{m=Ä3p"Õã«ËP¦U%Uƒ …¦ÜÉNÁ6A¥³Œ‘ÍØ¨´Nv*é3!‡]Š:èR¤±q)`J˼hýåNªº?ŽÀ¯ªIÆÈfèèGš\ë3d­ï”Kùþõmå+iü&½‰Œ»/‹BÔy“É‹³'4å^&ŠM@é,cd34(mÓöðqåögý˜©Æ×› „©´ª’”;©*Ê6O’1²:ð±i{øXµŽýÍî§ëǧ*wb·¸]x§bŸªµë÷±/Zfœ“M’’r/uM0é,ã‡ƤC|šlT­?9ŒwY —IN*Ò7PU’r'UuªMä“dŒlÆŽ|tŽ|tÕøÉãCð&¦ÎèÍÍžà”›è¸×Õî5®w'v@œã]Œx„r/uM0é,cd34&*Ù(ÒS25ÓŒ¨šßˆŠÛ[¥LÆÓ”;©ª×M"Ÿ,ㆎ'ÆQUȪZ•Ü=üXåKPo05Ñ€.eÛ¸Vù'¦[-:»hʽ Ô7£³Œ‘ÍÐ`4¸4Çnåã³Î.“¨úÜÓèfÔþaKÏÛ7HMhÊ}T„nöd#›¡ÃžIeU­šc|·{¢® ï·7Æ8]&5víÏ>VxiQxÙ`Œ‘¦ÜÉD¥hFg#›¡Áh—Ã=G‡{+.¦ÝíN硯F‹zÓÆ&Sñ4å^ªjÚ>IÆÈfèÀÇ)ŸT•ž >åM®nÃOÙ]ÿpóæªÊ©8m·çT´ úS7o§ZëT¬ð*äÁÈ|äåN–ªdHº”1²’ÆÜ‚éèÌs¯$¬Ë {¬kÿ¤CÈ^‰?D¹—žBƒà§”1²;ø*ë驾®CÎâÙY'üóTz[Ûƒ%¢ÈíÀè‹®ó·'ubÏDQîdŒZ5žK6rhàÙå¶G·ÅpÏÒì4œ¾”ÓÁ4ó1Û#”{é©mÜ,2F6C7á7'=¥õ«œ†³wN‚—R¢a±ÚiLêÄ{ûüåNÆhT„¹”1²aÆÜö‹g´ý~rÆÎÄKTÕç'í¬f>=x„r/=ÅVÁÍ"ãÂÆÜ`nðdÏïÙN‹fÞm: „à42:…eoïJ§1©û0û!ÊŒt ¹”1²Hö"ÁS^òÀS^^ žò{Áãå^zŠ­‚›EÆÈfèàÆK•õ” žòróðTøßùF^xÔÃS“:±·]¢ÜÉ­i…/2F6CcÅ4 ?9¼ì7UÉ¡ØÎØ®J>=i§Ññ¯?9D¹—žºFÁM”1²:¸¼Nng<æ4ʃˆP,]l{‘të<cÝ;]Û¶PµtqÖž@Æ5A£(Êl/<­F¶·ÈÙ {› \“X8ŽžBÖS¶r¸‡åp¯T¾<åuu9|R§6Óå^ƈ­ãEÆÈfdÄæLƒþ¥ë3 w±L ¶™Ö (wÒS)[7‹Œ‘ÍÈÁ î­uùÈ—i¸™†Ö˜oQØúLcR§&Óå^ÆèZAÈ‹Œ‘ÍÈ2 c“1ò¦èÚÆ[`.å4œòm¦5(ÊôT©VÁÍ"cd3vp"é)wЪœàÖ†ÕR‹¸4 Å|Ì¡ÎiLêÔ¦>NPîeŒ¾V¼ÈÙ K‘œ†kœÆáLCÊ‹9 /e›i Šr'=ÕºUp³ÈÙ ÜH™œ†”lNcN¯¶í4P(2eþÓØMNcÿÃïßÝÝÍö] ÷EÐÈßü"~ýÍ/òׯï?ùg=­Œüùö>üÏÓ«ðîødú/>ÄÿbøÛùÂ/ùë/Ÿ\/bùMé_uß_öÝÛÇ7WO»§ÇÛ`nÿòÉ_'­y¸zýÿ„§œ¿º¥o†ÿøü›ÿªßûJö|ék_Mô›é)žË7¾”‰Oï_ŸEàçÛ×O?̯ϫ»ð: ÿ˜‰LoÔ’Ëü‘þö9i|ÿ7å7õ‘ïØ÷¾SØI6ªýŸ=ÿê?)ñÞ—“É¥¯þGþ“¾;iÑ/' À<ïCPìówvnå|/²Eòdô ¯oiÁÇ8cúü¢@C$¢VäH£Q·¶ÔR /˜I‘쥔óN¥ŒÂ-ôù/=ŒVÚt’{úÌVL´.W!źh‚mÓ¥²˜^H\Iœ×=ë/VI‘ìdk¶…­©LŸlÆÖTöôo=ŸÌ`.éµõáw{æŠd/­ôÜaI.Ò<.".Ò[\®ÿöúêîæÕýÝ(fw&µÍ[¶2¼ƒZ'R~?¼·Ê?€óNñÂ’ÉN–BxnK\„‹ôÉøfK´©Qnú¼¦SîY†ÑÜ*müƒ•B ÞÊE²“VzÁµDá"ý±£›Úâ¦ÏUÇWnîû—¯¦½ù7ûƒÃ¯Þ¼»=ä*>Üo¸-t°_Óéú´°}:¢¶ÖWÌào³E²—UÎÓbì`’ÈôÉQÉa¬T¶J8cGþ'‡»ªe&ª‰ ŒÙW€7À[°¢HöÑJ/$w…‹ôÇŽ` mß”‰kåDkë‹(÷É!€\¿‰•pž·º@‘ìe{ŽÉÂ-ôqp$×Ù=ê½vÐ"ä[{TA¯yë ÉNZ)wœ…‹ôÇŽS¬/²Ï5U33ú8V3m¤©Íʺõs5è¬Ñ¼õŠd/ÛsÜÈn.ÒÙÍ~åY~àI² ÚÞ#xÁ½M’"ÙI+•fSáújì8‹Ìõô1ßA_Ì#|õÇÏ¿ü3íâ_­ñ ów˜öÕ«à0í/|ÿxï™NÁKÁ[d Hö2?Ï çFá"ý±á\(>€nø8wg¤Ä‚ªË^Û¸iŒDæL¤ÙI3µæW’t‘ÁØñJ°¢B5ÉßZ‡IâŒôÖ<‚( u'¯V{†½>1÷'Q4;Y Üðm’.2¿u…:Ú×÷¨:Ù|£°´Úiæûí$Í^ŠiØ;ç¢t‘ÁØQ‹K×&}bÚ <‘Úà a/…39Cð«w+iÕÜ×Ìhm$ÍNÖ’³MÒEcƒ¶˜–ZÈýå©úRæN$tÙØ°Q+’VR*ËÛ‹DÒ쥚À¡$é"ƒ±#t¦Io£¨CœÛ|=ÁyoS½Óâ¼¼p]‚°W&^숤ÙÉü¬âÆn“t 98x[Œ0·8»íÈdªÅ ƒ4m<ƒQàCÄ˪š$Í^ªi¹ƒ–$]d0xÐRÌ1àÉ9†ž¡˜TØ.z„ÚÊñHš,Ðinü6I Žßº\uvnMÕùXa¡ÈÙ¬é¹gÛ(š½Ùw²Dé"ƒÁcWT¼è~¾ªÂ‚—Û+, ÷®RX‡EùÌ‘µà<,³ iv²6oØÇƒ¢t‘ÁØè­±½5vMGª:ìŒõ­Ý€S!ÈÑÌÝ)š½ÓqÇ'IºÈ`ìøÄX(ó%M©ï¹ƒêBn`ં22/ƒ5°zÙKáùR š]ŒO ÜÈm’.2¹N´ýš>+rjôÜäÀd¢ŠX@Æë¼Õš»!•¤ÙK1=w¸’¤‹ †W‚éB1É•ò5¸ ->âFÞû¼½ ÷GÈVŽ*ÌúÄ›04;Y ´ÜÈm’na@£¡£X õ>§çž^¤¶ö¤Gдbv´Ñzv9=YîËå4ÑNªþ‡»%5‰9 ¶}tÙ;пµÎ;øèÐje‹6Õ}†ºr\A‚6š¹âLíe„–}d(‰9ŒßîOì.ŸqMîð¼!)=æä¡Ù8›à¬â­-ÐD;i§–컵“x ú`Ë8Ú™®XNŸÙˆð6ü˜@LÐ’…³ƒ ‰ö2BÏŽõ&ñ"‡¡±^PTLäÏ^®Š™ª•ía&˜ªlŽÛEPD;i§ÕìáK/r;|€…v’óúu9„5]Ä´g5$‘"=”ùÆZ1+oM´“¢`Çz“x‹Ò73‡1B©³J½fiÆá”&×[íNr^OuW^Ý$‰öÒMþ$ñ"‡±Ã™/K…ϧ¶f7|þp÷öÛ«»Ûÿ›_÷_ýÕÛǧÛûï÷~óÝÕ»»§5gßóbOäfæ"¬qÒ¦G Š½gžõ>¼],÷ñ†Cd;™é~Ç«™FC£ÁÖË‘ýg}>ýÛÍ'‡´æ ^“ªÌ~ćÊfOr€l/%ö8§páa†Žt‚b='¯üá~¼y¼¿¹Ûƒ;ä<>ýŸO÷—?úÍóƒp¾8„ñ"8ígÊ‹½}yÿçl/m:;ÚÀ@Ÿ“íd ^²Æ…€‘ÇØ±Ò9ÜSúô˜Ý{^ä`¥ º¹¦¨›y‘)²î𯲽”„:IÀÈcèP'(JZuW4]íCPu!2ðhž.ÎÙ R«Gó&­³æ#TÌÖJ‘íc­R(v€¹0òb–®@·Üitë=—ò¼Õ¶¨’ûbs«2¹÷ ÁHÉ|<âÙ^jjD>IÀÈcìÈGúè¢ žr*÷OÓê*Ÿ"½Û\^Ö9ÝÂÕè–’Z²«>D¶“uJÍ¿T< yŒ Cë¢Íê@ëþú‰.Ú¬•H“–6$?š÷põ!²½4¹ÃœRÀÈcì0GÍVúEÍVï•=tÑkµ•²ši‚3•ÍUÙYu¶cØ«oÙãÙNf§ 7¢\ ¸ðÐC#ʨ\XÑ[ýÏm¯Ñæ{¡”4¨Ar;šl/ uü¡K0ò;tQ®@«ׂ¨ðV¼Ø‚¨‘;¬PêùðÈòPpýÑÒ¤Qܾ‚&ÛɵáÆK#¡qckt^ bè‹–|…\|ÅoåÁ—¹‘Ž%:D¶— yþp# ¸ðpC‡Amò59C·nUmû3—º&7nI8#ÒQë·v˜Zµß$Ëh†‡Èv2C’Ù K†ÄéG1C“m [ìמ!Bº ›aØFeêéaã½ñ6;"ÛKI½n ¤QÀȃl HIM¡¤§„“…ŸoïÃÿ<½º™õweMŒÜ^MEq A­Þ$îÐOyš3Ž»iöåNV à™­ô#2ëÆPËÅC +šžrÚøæcÜñy#‚åu(G(wÒV+¸Ÿd\´ÕûŸcC¯Á=åVþû«?þùw_üç¯~ÿÙgëýŠñ¸5¿âTx‡I—üŠÁÕ%‰YצýGÈÝót„r/KµØÂR³Œ‘ 9N=Œ¥Z•@K_à;ìWެ™‡Š/àW´”R{æð#”;i+Š&QP–1²; ²*/;³t;È)¿rýxóz·{¨k²6èVPؼdÊJ[çV`Únéxa¯#”{*BCM2F6dyCW€_g\Ä;~©‚®»Œ[¥ ï†ó#”;i«“m‚ $cd3v®@ÁNžÉ£Q°Ý·¶Î«€ß¼Š5 Rc-¬?§5 ¥Q¼3G(÷²SÇ U cd36ZmLÞ&jÌéÜÇÇ4L¦ ÄÂé&^ÅJàÞx{„r'mÝù7ÐÖ(cd3v dLÙÒC識ʛÝÏ»·×?Ö¹zƒn,¤kݸ囹p+(ŒhR[¡)÷2Tß­Î2.l艺a Õbžþ³¸rúïHmÅ:¸L²‚Âæ®‡)÷ÑV%t› (Éٌ٢›ÜÒÝä§ÜÊ.(sõh¹u›œ²•éÿ¤G`WΪfd ã\ƒÒ M¹—¡ú&`u–1²¬Æ¢´‚kK+GÀ°(­4j[žwH ÷]ðÔ;ië~{`m2.l襙ik.­`]ie·{¸½¾»­s+¸ÉÒŠUEi+K+FY)¹ox¡ÜÉP•hVg#›±Áj]æ4ôaÎK!Ã"¯ƒ–nEy‹ÜyP¦M”dŒlÆ‚Œ( [qêéVÂ‹ð‡›»ÊŠ½~kne8›Wòîg¢*ÜŠÂXä½?~„r'CÕ² ZeŒlÆF«}±½ÄŸ±½äÜF0ßþNT|ÞÖrO7¡ÜK[¡M”dŒlÆ‚|±ÉÄŸÜdr ìïO߆_YçX¼Ü`‡ñtM*/=që—žì•ÍÐÊ4h£)w2U£šàÕYÆÈfl¼ÚÙ:zÁ^U+˜CqÇb¤Ùbr…¦ÜK[m›0(ÉÙŒ9k m­*ÚùpýåÓ—áßç©Òµ8Ü\áÁ¡+¶õ:¨+Üu›È´¨°”;+è6˜u’qa£ÆÆ¬ÌP˜S+¡°#…{§ì…\‹2€-ºŒiʽ´BQÆÈfð@H}–÷”k Žä»«‡Ê ‹S[„Â@˜ …9Y …/@É’r'Cµº fdŒl†Æ¬énø|úîq(Lgº2÷ù7-܃6ºI›1M¹—¶º6AP’qaCw¤­Xhë©ó¸¤[ù¯ù^Õ¿×baA±Íæ< :o}î4öê<‹s5ó^Ç#”;Ù*š6°u’1²¶†t[½%ÃÕXX>µî-F·ð,ÃËÑ·HXHʽ´Õµ‰ƒ’Œ‘ÍÐqPÐ*]h+iY'k÷¯ ùJm«±/ Þ­ø¡§¥l&¿1d•_’ã&5šr'KuеÎ2F6C£ÖN@‘±Ð¥Û‹ÉtmÎXZF‚ÖZØ M¹—¶ú&QP–1²: Zd,P•±¼Ù]?}W™¬Øí%+€V¡0阺dÀ…Fµp*$åNfº{øÍ4ÉÙŒW#ó+¸r~åÙ´}1¿â.3¿2ÍlI+y—¡ÜG[µmB $cd3t4´˜_¡Ï­œr*ß¿®ÎTÐmnzÅ¢5¾ØcŒ¶nz¬δФ)÷2Sl‚Vg6vl´ZšûIzƒÿ ,g*à2™Š5 4q*åNÚ*e›(ÉÙ ­’Y[i àŒYûÞîžêr ››µŸ:Á‚ÿvéèºYûIÕü|v«…¡>§ÜËP± TeŒl††ªô&ªg[c씸Ìãð¼1<å…šr'mUªQe\ØÈÁƒ <Â4¬*W ÿ~u.eoÞ–K™¶‚iGñÂãwµ™ -VÓ”{©kƒR'#›±QjYtɵ]`Ïš‹1ӕĶ×.ešÖ-¶‚Ñ”;i«Vm $cd3xTtɺ.°7»Ÿ®k• v€™.Ö¦DETv€M³Â4©Ô“”{Ù©oS'#›¡aj§\úù•#+Ç™‘@2tÝ"Q!)wÒV£ÛÄ@IÆÈfìHyUhkÕÈÊÏ;õMeU%°ÜÜÄÊ”«ˆðJË‰˜zce“R=I¹“‚hƒS'#›±qje2ü¥è ÷5«&ƒ2^¨T²sMà/’r/m5mb $cd3x dŠªà¯Ç‡ª˜J¯›CÀp®7Sº³Æzl‚€Ñ”;Ù©•M`ê,ã†ÎÓ‡±S­³jóÒ\%{mìE¼Š N9|¿+;]t€µs,ÓÃvÿ®–C”{©ªk•2F6c‡AºèÓ';ÀùŒ/?ý·ßþ§ÏŠrIÑÙ%7ã*Lxš¹\RÕÙ5k±‚¿\rˆr'ûÛÞ¶°¿EÆ… =ƒ>ŒýA1 ôòWqx¿} ä/P+™ö¤úì#(‡(÷RUß(ª‰2F6cG5P¨ê)`똫˜S‹L·¨ì™¦¾â›Ï>ÿÓH‡ÿf…ט¿Â¶¿ §~ŒôDL`}ñxûÓÕÓ͹¾Ã*3íli`åN© Ò\ÊÙŒ4C>@>Ÿ.µÁ¯ ß¡/QgŸ6 Ë¿hååNªªE«0g‘qQU?x˜“¯Ï ;Ug_á;4±hc¾c2ÙtÅAyd~¥ï‰+ÿœâ!ʽ Ò6”K#›±ep…ïpk|DZ¼Ã_Ìw„×ÿâ!ÊTÕˆVaÎ"cd3x˜S ©@£©u¾Ãôà æÊ9`½ï*eÚ`Vå^‰­0ãEÆÈflÌØÊì;¬\ã;ž"ÊLT©çˆqßá¥Ômò‚r'UÙ*ÌYdŒlÆsl¾ 4ŒÏwXõÑwX-mºèë¬8ä;v“ïØÿòûwwwóŸ}~´ò7¿ˆ_ó‹üõëûOþy.³_ïw»WáõñÉô_{ˆÿµðwó„ò×_>¹^žÃò“Ò¿ê¾òóÝÛÇ7WO»§ÇÛ`pÿòÉ_'½y¸zýÿ„‡œ¿º!¥o†ÿøü›ÿªßûJvék_Mô›é!žË7¾–‰Oï_ŸEàçÛ×O?ÌoЫ»ðB ÿ˜‰L/Õ’ËüÏþö9i|ÿ7å—õ‘ïØ÷¾SØI6ªýŸ=ÿê?)ñÞ—“É¥¯þGþ“¾;éÐ/'bž¸#½k–ïÿ&þßÿÏoÄonߞ~å(ôÅj‘îo@B–Øç6}>ÝçvÄY‹LÔ6or“„x”×M“4û8èÉ™2;è$ÝÂÈëöã(¦•Y1í©–¶s]³Úç3—qÍ_ýñó/ÿLûæøWkœóü&ï¡À¦‡büêÌn¯O¼—+Iš},0<ÛÄmf@öÓŒc²Ò· ¸†ƒ‹Ê¡iA[[ P  ÎÛ FÒ쥘ֱ+æ"]d@&í)¦ÏŠIwEœêv¾¹ÿí_¾úúëŸoïw?Míί޼»=äD>luž¸æfKØHÿšgò¦Eƒsçýªþ5)¥‘Ì4$ÍN†)µá6Ì(]d Æ6L­²ajÒ»]5’Éš|VIhã5”´Šû%I³—r"w8“¤‹ gæ¥Wñ3™üÔ%FL(„’©»9<”¹÷h]B±×'Þ’f' Tó†"~ t™‰`cNç„Âé5 Ŭɿ×kR!òáÆšHš½ÓqÇ-IºÈ`ì¸ÅéœP8zxìäš—·×Ww7¯îïvÇÌxN~Þi²y~àBÄc˜ ÍNŠi{À¥‹ ÆX¼ÇB1OÝ`<Û/Ý4[ËÂÿžn+¦r‚w«+¹š@ÑìenÈÚFé"ƒ±A[os:>¯÷|ù˜I „¦y~à”’†w›½º#5ò­}„VR*Ë‹!‘4û(¦†;xIÒ- è€ Å|É2Ý÷Ý[tþÑÝŠýíÆåèÕçŸöºÃ ‘4;Y›܈m’.2±©sªp`Æn}ª uóTAkáyÒ™¤ÙK1 {|¥‹ ÆŽOö¥ñó©Tál7 ͳ/•IˆHµ>ÐFiÍœ P4;Y›’Üm’.2 µ1 Ÿ×¸gw™¤,¨f? Õ”C|cæsµœªIÑ쥚À¡Dé"ƒ¡#” D¦PÍ—8‚÷k¶À…6<¼ Ê{‘ÛNK¤è̲ò¬OÌW™Hš,P+nÔ6IŒÚ*Hm§áóš¶Ó#P‘²ÍÛNµ ™ó8I³—bZö¨%J µeÄB1ùÚNçü}[eeìQ™Jʬn;Õ÷XÍ ÙÉÜŒfGf£t 562«dNÉÕªíæ‡Û‹@ÛÍ[ùÔÀì(š½Ù”(]d0x€’v™OúĵË|¢u©]æÃø”ÎyÌ5U./?ÓÌÊÃ;†FÒìdn Ù¡Ù(]d064«|67-Öñ>’hÑüˆ·F£‘yü€¤ÙK1{€¥[àØŠªPÌS'»Ÿ·ýôýÕîï»WßÍ«ûÏ«'h±½sÞJûýˆT|¬>ç­‚yßI³“%ZÃÚFé"ƒ¡A[˜›8$¾hƒEQVvÍ÷Ýig­UÌ.‚¢ÙK1{쥋 ÆŽ]$ú¬˜ŽmƒE u© ãø§ƒE¦®xvõF;í§­Ì¥Šf's ŠÛÜ¢t‘ÁØ­6EªkR…#‘†ö©‚e™Ï¨’4{)¦gP¢t‘ÁØІ"U +àU~@ƒßœ¨½Ê6¿>ð­g.P4;™›³ìm”.2¡Õ>·™ÎªRaA4·a?`„ÕJó–HšÓ î%I  xS(&[wñ±»hºµ†Ò§ý  Ýú>ñVHš½,¹AÛ$Ý€^4Š yÙ©…5P‘zÖzj2U[l;5mœH)àA ivQM-„äŽZ’t‘ÁÐQKPǼîÔZ¾u§Ö^lÝéÀε._U³fýÆÓ½>ñÖHš½,¹áÚ$]d06\k0O)\3¥|?š›ßÛâGÖ:Ç}ˆ“¤ÙI1¥âŽZ’t 9tÔt Åd›R6îRSÊÃ.º³NšaÀØÕCËóI6f¯@Òìe|޼MÒEcƒ· ó@H¦Pͬ—†{6I³“b*Å®$é"ƒ±ÃX(æ©„ç Hßß¼}üþöêvÕ‚#PÄâÞì’ƒSAd.9€X=­`½±ŽyZ¤ÙË=7²›¤‹ ÆFv±9B£¿}DGfªP[£‘f ®Øoñ™¤ÙI5µæŽ_’t‘ÁØñ‹\ 3tG]Ñ.¶&{`\ ¤r&O²½~Sö¬OÌ}I$ÍNh7²›¤‹ †Fv\îKúøbEá›÷%¡Bc<ï¥M’f/Å4ÜQK’.2;j¯ ÅäëK¿½¾¤ð–3.oAÝǬJöÊÛ$4;™Hn7I·0cø` $É®A’žÕŠ$P¶O@[îU’f/Õö%J ¢ØK²|Ë-/µÜbè$ÁJÈ—áÖ' “>æ$¢ÙÉ­äFs“t‘ÁØh®ÕÙ9XÍTf°¦y™­P™“Šf/Å´ìQK”nacG-Vc¡˜|®až*ÝV’àuÊI‚U«+ {åaN(šÌ ;\¥‹ ‡kUÑ„¤Ö4!YŽ(ùöI‚³F3V#iöRMË¢Dé"ƒ±C£Š6$õ’6¤* Z}LB’`ÊxFêõI¤OÌ·ÖHš,ÐivÀ6JŒ ØbÑòtËÇúUTÍon¢WÞs’@Ñ쥘ȵDé"ƒ±£,¢¤£–*×€j{77¥ÑFä (VßÜÜ+s’@ÑìdnްõQºÈ`l¸Öb®([úNôúGÖµ¯({šùæ&I³—b:ö%JŒ X§ Åä«([·½Š²sVÚ´¸?ØüúŠò¬<¼ãÌ$Í>æ&°c³Qº…ÝÊ9Œ¹¡+ò·&8R4@ß<pBhp¼›ïHš½Ós(IºÈ`ì}‘øSù¹õíÍ›UËQ±Xв‘É4Z[P.=\*8aƒ²òޝ‘4;Y¢nÐ6IŒ Ú¢ÍZ2"«h:ÂiIãz‚ÓJ æ‹:$ÍNª©wô’¤[TÓ½X[¨&ù[ë@#Ôë `­rÙ7ÌÛA×ÕöúÄ›?4{Y å†m“t‘Áа­ fÞ9C/A8àäÁüÁØbD´QþàƒFÁ›?4;)¦ÜQK’.2:j :TœˆU/Z+s„@ 7—#€izÙXáÖæÞ[i˜ÝI³—µ!7j›¤‹ †Fm­P)GŸ×äxÐ X¡Ek70ásr^¾Ç¨™4ÑNªi$w„’Å‹†Q‚>ÚB7O% Ï‘¤ÝÍ÷ooÞ­ZrTWoÏMLrrVH³ÖMLšÈ<ÈLíeŽÖÍâEc㺾(<ûU…ç#ß¾ð,…m™g™i¢tw“Å‹†Žb‚©B7×d[ö!ýߪ}HÞmï$›vÂ[kò;aua:¨–SÚò–h¢½ÌÑsƒ»Y¼…ƒÝõ:/»÷ô‘Ñõ½ªÞ4?à,…3JJÞºM´“nZÍÆDñ"‡ÁÃ]„1t¯ß9®b§0°9Oa”šê\é¨Õ÷ƒfát#šÛ ¢½¬Ñsc½Y¼Èah°×мÞ8|^s”ápRaEûûRøà…™×bÐD;é&þ(&Š·pÐCG1A}ÖÍ“'<Ÿ{Š×owá=·¦‘)°±›s^8˜‘ç嬿î˼U šh'ct‚ ŽâEccÁ²¨SH®:…¼Dƒâ®WÓD{é¦áb¢x‘ÃØAŒ,ê²¢Nqýý•?¿½Zå*ä Ö*Ðé(±•… )¤˜[û9Í‘$Úɽdƒ“x‘Ãà`°È§×½$ã¶Š…Ü^ý#Ú^¥T¨$óM´—v{ “Ä‹†d‚éB;Ée_U¯^åXfïVX—_ruçë¢PÌÙI´ª}ÏO#T™ÃÐ °U&Í(…Ïk6-É&”i~îM†gŒÜ‚"ÚK7-øÅ‹†_‚A¡›§V-=Ï&ÞÜ^?¾ÝíVu=)¸Ô9¸a’ '4›†$¬Ò«ï¿-šÅí)(¢¬Qjv8‰·p óåq¬1I„ÏkÆ$ž(r2a•jÝG†ŸëÙûžH¢½´Ùã˜$^ä0x“g%Âg¶?ÖÇ?vúßʘì!Äú?‹B1×°I¢ŒPivø7‰9Œ ÿ*_$ôƒŠdÂ7O&´–6ÕûêV÷¾j³¹]NÖi8<µz—SP-”ó8.¯9D{™#²ã½I¼…½«rs4:›£¡/­Ï*Œ¾@VaÜ41Ê­›ÑNº‰²A³ˆ9ŒƘ¼ |^ŸUÜÔŒI³½¬b“‘² £*² ÐȽ÷&ÚË‘ NâEC£Áàl>éèìšÑëg×Fó’‡ÍG¯5(/¥f.[“D;é¦SìaLoá@w² ¤›y„ÇáúÑëðÆ¼ºûöõª%·7{&($=X={­A+í'gÃjÑ^ÖèØáà$^ä06 6­Ì±@wD®ÇŸ›oþÓV % sRAí¤›^±G1I¼Èaè(&¨‘*tsýæ¿ÙS¬ªSnoíŸÔÚ§¦ýé…°zퟶ8¸f®SD{Ù¢gÇ‚“x‘ÃØXð~iü̳öÏ‚n¾öO£p^!ï2'šhÝÔB³Ç0I¼ÈaðF1 ½¢ðœ’öºeâ ··÷ŒV"ök†G WïýÓÓ|˜d>LGídŽ!Äb7Ç(^ä06le6GK‹¯O)¬jžR„×z ¼®‚&ÚK7 w“Å‹Æcl±jÌÒ«ÆŽ»ŠÛ7»w÷ÁQ\Ÿí(¬Ú^Náј˜†7Âêœ"(–cŸ¿¦‰v2F%¹‘à,ÞÂA [S´ÉšUm²Ï–9íöm²Óž2¡€·JAí¥›ÀÄdñ"‡±ƒS´ÉšŠ6Ùë·ïWåf‹-²¨¼/ŠÙë[d'µr†yçM´“)jÉ gñ"‡±a`„Ü"‹°¦EöHßÓ|3»±›0á!ËiÛ§n’D{é¦ea’x úß{Ý´9„AzùÔñ±»Û77ëÖ9¡Ý\,Jí•˸šÕý±A¯¬0ÌãÙ4ÑN¶h7 œÅ‹Ɔ÷]˜ñóšñì#¸ªæãÙRJË\¢ ‰öÒMËÃ$ñ"‡Ác˜bÕÒ ZgŒg¯ëz º»Åm3ešéˆõkÄ•VbÚ!È|ñôÙN& š}g!`ä16¼¿¼?ŸN,>ýÛÍ‘ÜBeº2çªÏ˜¶R#÷ @šl/%Eöâ…€‘ÇØQ“9Ãpôv~Ús|õ÷ÝÓÍ­¾þúz÷¸Û½º™µ—ôŸþϧ¿ûËŸ?ýf^ø»Ï¿øß‚{Î6p.d2ßrÇúÕÙ†ô>¨˜uÜ»ídÖ°¯è,Œ<Ɔ‰mÑ>kÏhŸ}Ï…<ëŒ2™nÑAk¹ï€2† :D¶—’:ö8§0ò;αE­]ÓG›]È7÷7wZ½z}w·Þ‹Ø¢­v#^Ñ`ó‹bý5íYÑ,ÞŒCd;(ûòBÀ…‡Eö"Çxž^ ±"ÑÝ\ ×ͼˆ'€yãÙ^Jê„:IÀÈcìPÇ S(銊xö"ïv7µ>d¾öuòÍgŸÿé¤#‰³fiùô¶ö[—7J9¿º\>i0ßîf¶VŠl'kuÀ¾¶¼0òpvEÑÜQ4Ï¥ÅÙm¢[&HÜúZút9p¬•Ñ:‘íe–{.Œ<ÆÆž=y ½sw}ç•‡æ ºáIK«´g^$rˆl FÌæ”Fc‡9Ф„ɪŽ$y+Ÿã¯ÿðžÁ[‘=ƒ7«Ó‹¤?¼uCd{ÙrCÊ¥€‘ÇÐ2¸¼4|^ãÔ‘SæžÁ ÌuóCd;i¨”ü±K0ò:v Êd }‰gx“\jLcäëyÓ†i«´á¡èÂUœy=/i·¯ Éö²DÇ —FCÇ(þš?ûоÜßʃ/ó =7Ltˆl'RŠ?ÜÈFC‡⣬Bš<ÃX¼Ì§‡é?þöÛ«ëÿ×ny­ŸùŽÜ¥ÞñÖôÔÈ)Ò‘~õ Þ¡—AÍü<’Ëh G(÷²QÌ6úŒ‘ ©úØ©˜ï&ÆÏðÂn(•é³±Jûç­tˆpo)ûåNÚªg‡Ì¯­IÆÈ†Ô€´ m%ã’Sµ‡ÝßvU•‡ Ñfk•§LÈRÒ€a-¾´W3-„±ÌûËPîe¤^71Ò$cdCn`ÆH•LÛ¢Q)ò·ÖÌhZx—¢…µÜÊÊ´Õè6P’1²;RJÚJº¿“Ãxú6üÊ:Ç¢´Øžc±° ò+CÖ9£ŒŸûzØM•¤ÜÉTAÈ&¦šd\LÕ“Õ0¦*2¤€§OdoÊŽ¥¼ŠÜÔ±˜iwŽàÞ8B¹—¶š6aP’1²; ’˜Ã éVÍx/WÙ=þTçU¤³[ó*huˆ7½JÀ®¾Ÿ±hš– }‹t…¤ÜÉN­ðmì4ÊÙoêaìTèl§‚~§ö*϶˜¹PºÞ„f^1į­å^Ú b (ãÂÆŒ S൦*]ùùö¾Ú«Ø\®‚h¤2Nä÷Em®8išØ)A¹“†¸§‘.2F6c#Õ:o Ÿ_:Ì‘½ŠVÍ•,ÏÛš)€j¡­å^Ú b (cd3v ¤•ÈÚJ7œò*þUíV´ÚâT‡‡¾„G VOu,ª†ÂYÑ¢\ORîd¨NµA«“Œ‘ÍàhuÞ >Ÿ^˜x¼\o3]—ã:ÛÔ­ ³!Al¢­å^ÚjAQÆÈfì H¡-´uÅ Å÷aÕzUàºñ*ˆRx•NÈbøXéU¼Å¼|÷åNvêu#¨:ÊÙŒ Uk[$+ö¥ÉŠÎt1'+–™ìŸ7hÞ†-’’r/mÅ61P’1²;ÒX$+ôÐÕ)¯ò_ón¬¯.ÙkÜ\¾2mÇ2^¦âІº|À c>'x„r[ašÀÕYÆ…®¶Þ§’}ø¼²d¯{!ôE< L}*VòŽ¡ÜK[]“8(ËÙ  -J¢ªdÿýëÛÊuY8îoÏ©È ‚Yïê*ö`AíjáTHÊÌTš&hu–1²­†¢ t tEƒ1fº@ì«káTP‚ÕУ)÷ÒVß&J2.lè9´ m­šYy³ûéúñ©Î«lnl§*©7 ]7¶hœã¾|~„r';UЬÎ2F6cƒÕ¦þ€þª@0x™TÅ¡)yoR¡ÜK[}›(ÉÙ ‰"U}`Á©˜J¯"7×6CæÓ·á}Q×f­ÔÎ9ÞMŒG(w²Sm›€ÕYÆÈfl°|a§þ¥¹Jî³â2óõáy{«Tƒùzšr'm5¢I ”eŒlÆŽÀ¹ = vÊ«Ü=üXçR¬Øb¢â4@ª©€«KTœ9ŽiÑFSîe¤Ø¥Î2F6C£Ôh Aº±´æ€›k*Xퟷ„ðÈ}ƒD…¦ÜI[A6 €²Œ‘ÍØœVSy·{¢Î©ÌG†7èTÒëLMMƒuNEÚi‹Sƒ)Hšr/3uMPê,ãÂÇF©mÑTc馚yŠ(è6_œž74™­§)wÒV«Ú„@IÆÈfìÈ¢)´µê°ÕÕÃmø1»ënÞ\U&,îRç­Æñ-S_“˾ÅÚÕ çƒ¾Ù©E9èó•Ä#”{Y«k€U—2F6ccÕ¶¨×Û3êõGÊ*—Àæ‡í¬f>Kr„r'UEÝ *e\ØÐˤRU,TõvÈg<;N´Õ<Ï­7¶ŸØNFÙu”Eùó÷'•bM9D¹—Aúˆt)cd36"Åd2Ò“ÉçÞ³RQw)ßá (ö¤äåNªêt«0g‘1²;ÌAe Ue;l…¨/uØjXßÚBZþžˆ\¼¤T)öBÉ!Ê Ò‹Ðs)cd38ô\ì`1gì`ùäðZ¯ h™bK;@kzØá}çøgQ¦Q˜eŒlÆsL易 XŽùŽ÷΢˜b¯JÛ³(ã@Th¨|ÅTíU™5ÈHïš@Tå>ög…l(—2F6cÊNä¼ß‰5¯Ž¤nš|»Hšá@HæûˆG(÷RUhÕD#›±£'óa-Gÿ«Ò 'ÝÖÓ kƒÇt ¢B_uB+©TˆŠ¢ÜÉ ¥j„G6rlÌ88Œœ÷»5Õ‘òºKATœæßóxˆr/Uµ­ÂœEÆÈfì0]Q9FˆÊo¢_\x O«!ªY¥š@TåN©T#Ì8ÊÙ ŽC.#= yÀw¹½ˆöR¥qg-{#ï!ʽT[…9‹Œ ;x˜X¨*_iíÇÒ¸‡évIz"¦º4>©”e-½}Ÿo_?ý0‡ÛWwá þþ1™Þ¢%—ù¹§¿}NßÿMùí|ä;ö½ï†‘­hÿgÏ¿úOJ¼÷ådcé«ÿ‘ÿäƒïNJóˉ cig|ƒ»¼¹Íœ3¿¹‹Öù‰Ü73±ÍI'lÃY €Ç|HÑ:³z˜'¸îëÈÉ^fé ·Y.ÂEú¤ªc–Þ@Ìè³5éèÖé‚’Ê{Þt"ÙI+¥æa¢p‘þØ!Œ7>k%毟æœHÙçAÌ?¸°!G&õdy½z™¥²Š{ÓE²“©)¡¸Mm.ÒC›š“˜ã2zPèÜê윂æÀZ¥y;§)’½´Òp‡%Q¸Hì°Ä)™µR½dFó=àŠ½Er u΄_ëô„:ñöDS$;™š–ÜÐln¡OWøG15:A³á3 "œ›ÈLtz¿´…‹Â?2ìS${i%p‡%Q¸Hè°$h¢ËZiÈßZS0´àBƒo¾úãç_þ™ôé¯Ö´ÌßáºÄ…•·é¡(»ºoM{=ãJœæGìd~Fr£µQ¸Hl´Öû¢ŠLCXçÖ XÈ·_e/A æ[[É^Zi¹C•(ÜBŸ® ¤•EÙWm­¿{{}uwóêþnwnÒ°?d¿­¤Áz².‘jÌÞ­_SÒsá$;Y"(n€6 é Т°Ã3û¢²A‘4 n48°Â2û‚d/­´ÜQK.Ò:j šè³VÒGèê’´—J†íVÓ¥X•žàêŒa:-xëÉN¶g57b…‹ôÇFl±ÈpUÆðlW°,ˆx-¯GðJó)EŠd/­Dî8% é§2…Vòõ:±õ}]NÎ6ŸRtë÷uy§glÓö’l 7„…‹ôdžpå,üL¾'VcH('ܺ-†ärÏ7R${i¥cSá"ý¡ã” ‰¶ÐJ直,½$r×l(¤Eèò5‹ fuo©0˜×ü’4;›ö±Ÿ(Ý€Öàa¬Mø\Æ“t'ÔÚõŒ¡œŽ7u—BèÌ<Œ@Ñ쥘ž;6IÒEƒ'¢Nœœ9Žpó\Äwo¦¸«æ_¿¹yá¥EåyF Öù )d¾ªNÒìd𨅢t‘ÁØ(®t˜MÓ­éH=<¿†ÒCk$)É¥‹ ÆFvµÈyƒ~Ù Â\oÐò“lJöQ6‚f'ÅT’}˜9J µÊyƒ~ÑÁÁ÷JZno˜MH™DiT~õ0Û~:—7G iö²6×fžYdc#»:ï@Mï8àÜ7x7à­f^iAÑ줘Zñ4/ÒEƒÇ'éTÙô™Ü_嬨œ§„NDZƒÉËõnÀYÏ\y&iö²6Ï Ö&énl°vïãçu)°™¬ÏÖ¦¦BJ“ÑæéýÀ|Ú‰¤ÙI9ëš{º2JŒ£(g å|IÒû•åõG°A„ÿ-Dz(Xô%;Ý섎,"iö²@Ï>ߥ‹ ††kQçÆððùe[/r•ÙˆbíE£2sxy‚f^|AÒ줚`¸#—$ÝÂ@¹è¢gÎÐ=sUÎÁˆ«/¦…¨(æËÃvëW_ìõ‰7w iv²@+¸Û$]d06`kTÎ =‰½BšcÒ¶RxÌÞ0Q iöRLõ$é"ƒ±££l¡˜là FooxÁ¡™î¢‘«‡&ŒÅ37¢’4;YJnÀ6IŒ Ø*“[µêÆëáÕ¨¨Š¯ÍÜ€gï5"iöRLàO|Ùk„0v|¢ Šù’‹®ï¹Äp7àŸÖ¦¤GP^p=Ó °ÆðBE$ÍNÖæ7X›¤‹ Æk¡hߺ}c}_HßÜ Lá,s_I³—bZöø$JŒŸ„øµPL²ºÆ €"v÷þƒ»SA3¹zµ%çË`œÖFÑìdm^³Ã²Qº…ÏcmÆæ ËØ—¥éL‹¹4ÝÈ@°iæÎ"’f/ÕDö%JŒ¡„L:«&žj0=z[íæéÝÃÕÃíúafƒ¹u3ÃÌÓRnC2°ºÕ€ šÆÛJÒìcš°_ãÎkš‹t‘Á؈-¸"ypk’‡#¥pí“ð€’Ûg4{)¦ãgé8v8®H_òà·—<×:%®O,hÌeŠf'kÛ/Ýbµ¶(]d06b ù&sø¼æ&óóv£ÜŒ åQæF½¨!¶tÀ|i“¤ÙK5{„¥‹ PòaæðùÔaæcŽàýv#(®-o·ÝÑJ·Z@yùÜv£YŸ˜ëÌÍN¨€ÇÒEcã¸Jæ†?ECÎ]­ŠIUlÉkä h¸d^“GÒ쥚ž;nIÒEcÇ-ªè„St'\Ý ‚òƒõ]Ú¾3½Äjç°×'Þê3I³“jËí&é"ƒ±±]k³s°4½~‹¶-–Ê4p¼a>¬@Ò줘FpG-IºÈ`ì¨Å¢*ó%®á=ɢ߀ä”wBç&$kW/E†;€Ù 4{YrõIº…®µ*oµ˜wpô¢ZÝ|«…ó.¤_¼I³“b‚äŽO’t‘Áàñ‰Ö…b²mµ°æR[-F=°ƒ€Ò§õkÓ`õ’ /…ç?¹FÐìe|ÈÝ&é"ƒ±±[,®¤8´¾5MóäÀK‰Ö3ߨ¡hvRL«¸Ã•$ÝÂ@Ž®`qû éÚ\W@³¹ä=J)Óµ`ò«“ƒý!Iæ;kÍ^ÖæØFé"ƒ±QZ”9C¹fPíykj^fª¸{Þêú¦õ^3§$ÍNª‰Š=B‰ÒEƒG( Õ|ɨÚûTæc§«À>_`CQL¯»{†ùhI´— zöÅØI¼Èah¨Ö¢JM¨áóš&Tu0M„š7¡J#œ•Fóê&I´“n:Í~Ñ#‰9 »5*Nz¨S}¨ÅìÂîÞ~{uwûóëþ믿zûøt{ÿýþÃïo¾»zw÷ôêþnwnn^¦›ë\u $xÈgäêÎUi”³Žyü™&ÚÉD½`?•˜Ä‹Ɔx]±­ÒÑÛ*+vå9oš§Ҹ૙9ÓD{i§an’x‘ÃÐÁMУܿêè@¬*Ãpþcÿjð öÆ—‡‚ëûW%Híœd¾òLíc„VHöˈI¼…ƒï !g6B»&Ãx†@ù‚hÎ0|#Jͼj›&ÚK7=|IâEƒ‡/ùh`øü’I·ªb}sV¥ò„]á ´†yÏ&«RD;¡”ìדx‘ÃØ8ð舟×äÏú—ÊÂ\ ‡ž{š&ÚK;-øÅ[8Ð#ãh§)r:ß©sæcaQ8—«©á¡¨šbV(Þ!8šh'#TŠ NâEC#ÁèMŽÓ¼YsÜùÌäA·wV;홇h¢½´Ó²0I¼ÈaìÆg=}V°ÊExøxßÙ¢WVŠœEx]qßÙ†€Ã:æB6I´“jÍŽõ&ñ"‡±±^¯rœæésg7:©‚jqHW5rÓjaÏ<*Mí¥ÈÀ$ñ"‡Áe í$ÝY‹Ðò£‹˜†äœÎ}°~¼Yé"ö Å\¬&‰v2BcØÑÞ$^ä06Úë1MžÞÁvnQÞýœÕ¶¾û)Cjl€»ß‰$ÚK?{“Ä‹a\ÂпµÎI¸P“Åé1XŸVñy[5íйAíd„ìxooá`Ç{‹“nÕI‡g—ÊjDqÓ¡Ôäœqs5‚$ÚK;={“Ä‹Æa\q×Á½è®ÃÕõ±`mQ†¡,X‹Š‚µóÚ{æÁjšh'#´ÀŽ÷&ñ"‡¡ñ^' .…ÏkÎ=<Ï#2Q›¯=´š¼!f®ED;é& öð%‰·è¦:| j$³nÒÝv5"ÐrDp&< —Šñ넉¨dÞÙJíe„–íMâEC£½!nPÙé!«õC×N”{oZåÞ;gÛEPD;ig0_víŒâEƒ‡/¹ß.|~É¥è\„Ñ]„S ‹*=e*\ĤPÜåj’h/#Dv¬7‰9 õN¨C6Bt8»£)õ¹a¤‘ƒPRhÀ;6Gí¤›^r‡/Y¼ÈaððÅá ½…¼ÎAø›½C1­ªJcsnmjƒXŠwlŽ&ÚË7қŋ†FzÈ$Ö€Lϧ"L¦*‹›¢¦‘‹PÂe®CÐDûh'îƒ:VíLâEƒ‡/²€™è*Y‹a&;]zÁ¼{½_3- Å 3ÑD{¡çÆz³x z¡Å0F(Mj* ŸIÐáìÂçJ„„bÛoT‹Pj:obyû™h¢ôSjö&‰9ŒÂH“s\IO‚Ÿy{ú¿nïoî¦_»úútàœCž­\ŸÖÊ­mz3â·8ó–7)­½ÕÀì?H¢½ìÓsÁY¼Èal XúÄIÿ¢ÔRT‹V'ÝÈ{h?½yË4ÑNÚ© {t“Ä[8ÐÐÿ@Ú …v²µ:9%>¶:M‡©…É÷åœtë[‚B9+‘…"‰v2B-Ø¡à$^ä06,¥ÏF¨ÖÜ:VÉ–*7¤·ªd+Rîƒ$ÚK; {“Ä‹`”.´ó%†Þwsbµy!Ñí[1ã«@®w ´œwr!I´“É'ñ"‡±¡`er¡B™5…ŠçYDvªÈÚ›¹@kx¯i¢½´Ø˜$^ä0v£ ç¸ ø  >*,joP:“Š®(T€s™LÐD;!(v 8‰9Œ §âÝUSë&T¤µ*RLðw³I´—nZþð%Š9 ¾([è&_7¬Ò»aíc*•»a•\ß »(3ÌDíd„V³c½I¼…­Ø£!bqFW‘Ð:“‰W$Zµ:…HØroå ‰öÒMd^’x‘ÃÐÁKP£¼•ãÀ5¯º3uH,BÊÔê„G$TÈCœu¼«›h¢ŒpË™×£x‘ÃØH¯Æ\ Z“A„ÿižA ²Ê#sAí¥›Ž=xIâ-èU]éf®‘iǶþ5Ðú¸þuv}Ê ´]¿þUátÃòîä ‰v2BgØqÞ$^ä06ΫAd#„—­•U×¾ á´”À|gˆ&ÚK;{ø’Ä‹_ÀÚɶþ5¼ ?®µè´Ÿ{™´Y¿þU9!eÎ!H¢ŒÐ;қċÆFzÈH¯¡æ­?"áŒlgHy¥<ûÐ5I´—vzö&‰9ŒÀ™˜-U.ÂÈ0“E-¤Á<¡}Ì´W(æ:I´:aÙ±Þ$^ä04Öë´*`&úâü¹C×̤ÛÃLAkî:I´“nJÁ¾$ñ"‡±Ã­ ˜I3ÂLú#Ì4MÌy“ë!½¬€™ö Å 3‘D{!²c½I¼…ƒë ¿0GinÍÈÜóBaA¶˜™›üN '¡åtkÑóf4ÑNú©$w“Å‹Æ`ŒƒB?ù†æŒÿ847eóµR2ŠÕNBz@¡­`ÞÌqˆl/CDþ%›YÀÈclÌ×è<1/>á*>ýÛÍ‘¢„ÈtMžŒm<Åü°ƒ{“Ü{`i²”T+þeáYÀ…‡<ž1EP\ȇ|óÙçú n-³Ûš¾Ât¶"ÄÆ!51ù­!+\ж$ó(÷!²¬Õ ö”…€‘ÇØ 3ä#”áóé*ù{.åùvò\)¥‹2H3§Œ”ÌwRí¥¦¦A䓌<|ŠÝe@ï.;åTu³u>EÙ­å%Á‰H¥Ev"×:%µö•QÈv²N”ìuôBÀ…Ýá:ŒuZ[â-=}xn%=×FæWRÛÚHxÒÒ*"ln %ÉöÒPà¿¿’Œ<Æs¬ÎëË­9µ¾ü‡˜jéŸÿé³ÿ-t´Øl¶ Ç€B£×ùæ‘Uë÷‘Gõá>zD“ídvN²OJFc#ÊVä°ÍÊ­œ-CÑßÌ1Ô0íÇcÖPšl/ µü¡KpჇ.Rú’µ³ï;%.äFî±Bt²X)hEÅÖÙ¨Qܾ‚&Ûɽâ¿S™Œ<†Æ­õ)‰Ÿ×$rñ¿•_æF:n”èÙ^*dùÃ,`ä1t¸Ô&Eù!NåŠò©KEù£–Ði‡ ¥áA;»úMn”×Z9îf§Cdû˜¡s§–F$N?Š:/òŠXOÅ8\S8²ãÉËæ[bç‡Ú3¯ð8D¶—’¢l¡¤‹€ K¶I¤¤¶PÒS»bénÙŸ®x»{zu3ëïÊš‚—z‹5+óþ'çÍZèÈ¡—€ÆŽ$ðåNV*ç¡N+ý@ÆÈ†ÌzÇ1T“1¤ùý²Æ›ÈÙ ý€.ôµªÿéÍî¶®Píí¥šŸ†q*¨Q L¶Ãëbu·Ó¤fVMïE¼=´G(w2Re ‘2F6äŒÃ0Fê ×½ÈdE'máTœµq*V9ë@3cZG(÷ÒW×"*dŒlÆ‚œU…¾’)õÉlåááúæoOuŽÅY¿9ÇFç8yzeˆ*Ç”K)˼kêåN†ªç°‡ÝP³Œ‘ ™Œb¨^˜ý…ÏäKeE¶¢3]ÈÛAh,ÏÛ¸iÁ^ m¥(÷ÒVß$ Ê2F6C‡AAC±ÐV°;åVž®n+g5‚R›Íy)pêíL@C•W±Ú[Ç}IéåNvj,7RýŒ ¬ö>Û©X‰®¨Zغ¢²Þ&üj¡xgÿŽP šÄ@YÆÈfðH1¨BÀ¯vW¯¸{¨ô+rƒ0È ÀLoŒ:̧Ä|דßR)ʽ,Õ¶Àª #›±±j'óàÆ^âÓ ¦Ô…üJHm¿BQV¶‰‚’Œ 1v´ï¨vª½‹ô+÷÷»:·xÂÝŠPÅ,¹«§=¢ªTÌ­_G(÷2Tl‚Vg#›¡Ñj/]r+áóJ·ò ËéŠôr+!Ç&µšr'mEÙ&J2F6CAAC]ÖV_åVþtõpû§¯¾¨ËV¤ß [1FxL(˜ÄJ·Â)Í|êéå^†êš ÕYÆÈfl´Z‘ •^XQ…‚Ébyi[·"š&Ù I¹“¶:Õ&J2F6ƒA¦‚Ì©;¤[ùùöþñþ±Ò«à y™v/…G U¥WQè<óÄáʽìÔ·A«“Œ‘ÍØhµÊËKÂç—&+éûK ©WAgçÚJQ^7Š¢Œ‘ÍØ1Ê‹L‚†U%+?ßTºe6˜¨¨g¤‘• /­t)Þ{‡¼‡BŽPîb¤ „hT'#õCÕ^ø4[>Ÿ¾N{æž^/Eî—iÙf­sÆ þ•”{i«i%#›± )Š´š>œx²¬róøÝÓãÕõ•¹Jц²Çb´téþ”ÎÕ9oÄ~2ŸÝTIÊLUŠ6Pu’1²ªÖ*GZ¯[9RX)ï†6EÀ¼Õ(™OQ¡ÜK[¡M”d\ØÐ»ãh«V…¶V ­„?úêwW¯ëüŠÖÛ›Z‘-äÊÊþ0Úz¿‚“S-šr'KU² VeŒlÆÆªUQ°Wk öÏ*+æ/ƒ¡W!ê–¼ÛPÐ$ Ê2F6cGAª(Ø«º‚ý4 Y ‚m°Zï4jL+½ª¬Ö£×B[Ç»þåNVªU¤:ËÙŒTk,rǘ«¸Ëä*Ó–k¯ÚøŠr/mµ" (cd3v¤]‘«ÐÇDÏ8žûÍÛ]e¦â¶—©L÷só6°ð¾¨ÍTfMkP­§)w²S£›€ÕYÆÈfh°Ú!&°:|^Ùöì®*è^¦ ½1Ê3_A¯âÆJ—‚:<¾“õ4åNFjD˜:ËÙŒ S;‘±GÿÖª¢ŠþR.Å!¶8¯BS¦QeŒl€DÑûõN¹”׻Ƿw7•^EªÍy 0'*8/z¯ð* ”óªE=…¤ÜÉNCTÖÄN“Œ‘Íà5õúòа¢žb/TO ºmê)$å^Ú mb $cd3v „¶¨§ÐÝ•§¼Ê77¿¿Ý=U–TìæJ*褶>Ϭ ©,©8oi±Œ¦ÜÉR­jR'6rlÚù\RñbeIåH¶âÅeö€FAíu‹l…¤ÜK[m›((ÉÙŒy¡ m­*©Ü?¼y˜~n_ñbƒ…c´s.¿1* +^h!Zl£)w²TTm ê$cd34TíP¥)7'»küŠ>² L_fÂÞ{)­hãW(ʽ´ÛDAIÆ…: ZUì­ÓUö÷wWµ+åæ&ì­38ÌH@ÖMØM³R¸(I¹“îKO-ìt‘1²­6B¸h§Óç—¬è‚n† ZžîòÞj«Zܦ)÷ÒVlE#›‘c I«L¡­U+÷7OÁ—|÷¦Æ¯¦~ƒÓ*ÆîSÃå`Õ´ ¡„o±ìåN–êM ¼º1²¯Z¢m¶TýÒ“*Ó5ÉV¦çûÛ ´• ÜK[]‹(¨1²< 2Edª²•×?\?\ï~º¶•ŽÅl.aA Ó*öðTU‚ӳ“Nð',(÷1U% `]ÈÙŒ X!1‡€’^1^Ñ_h9u!Çâ¤DlâX(ʽ´Õ7 ƒ¢Œ‘ÍØaLG& «:ÝõÿýÅ_~÷ÙŸþüê÷Ÿ}¶Þ¯H·½ó]”IHáتó]“®Yh1·r€r'K•¶`]ȸ°¡[¬Æ±TC@IÖ+€0 ጄɆG!QH…Æ6€ÂPJ´‰ƒ’Œ‘Íàq.â ]·ÿæÛÛ·uéŠ4›ÃÁЀ²Æ&LªJ,¼]ô|‡ßL)ʽÌÔ¶@¬ #›±k¥²™†ûÂt%×W”V—¨¯„çhtƒ.ã”;i«–m‚ $ã†ÞÛ3¶ætEÑë N:•ÛûžžêÜŠÒÛËV†, ¦de¶¢„1¶ÁÞ–”{*¶¬“Œ‘ÍÈ€µöÞm›~åãg{[ŠòŠ—AÁ¦59¾ FRF¶ ‚’Œ‘ÍÈAФ¡¶ÐÖªƱ¼RY]ÛÛ_¬…錗wUû‹QJ ]Œ¦ÜËR]¼:ËÙŒWk™@­¸†W&Z^™žwøß ® ÜI[A5‰‚²Œ‘ÍÈQФUªÐÖºá•ÝmµWÑjs£+N¡´Ö¹ü¾¨]A9õ‡@ Œ¦ÜËN}¬:ËÙŒU«¢f¯ÖÖì4ƒ© Õì¥rV)ÁoøåNÚju›(ÉÙŒ©¢f¯êjö??ÕŸñš˜n²´\\Q•5{©HÝ`…ËÊ,E¸:˸Xª®Ö¶ÈV1[Á e+ÚH)$òå^ÚjÚDAIÆÈfì(Hc‘­ÐGçNù•ÿüâŸ}ño_üg]/˜ÆÍå+(W¨D~cTæ+všb0ü+\Pîd©N4Á«³Œ‘Íàxµ)V¸ÀJ¿bެp ù+Œs-†Whʽ´ÚDAIÆ…9 š´ª¨B•_ùùö>üV.pmzÈ·V¼©ô*!$Ý jö4åNv~O;M2F6c£Õ¹Ãà¥ÇìmA777¼µ¢('Œ†Ù M¹—¶B“(ËÙŒMZe m]Ñ_|Éîoáÿ^½ymÍ7on¯ßîÞ~÷ôêçýáUPã7oï{ýöþéñíÝî ¾µFs}ý|ýÝ7ö•x…!b|%­vðÍ}ø‰ß|we h¡%†@R}g¿þ:¹~º«…ØÀn¯Y ëÀ$ˆ-üa•ÓRF«éxbƒ×I¹Ïk@ Õ Ï2F6cƒá ò?ˆ•süÏ ¶<2Ïñ·ŠQƨiø¨…¶R”{i«mbe#›ÁC,Y„X²nŽÿç7•[Ç&–âW.|Tñ_7įŒ¾‰W¡(w²S©›@áYÆÈfl(ÜØ …Ï#U/j0™.æöeÓÒ«ÀT®l°Ëòå^ÚŠmb $cd3v d¬-´µª}ùúñïOï*ÝŠÁíu/ å‹!Õm Ôu/+ç&,·AŸM¹“¡*Ó Ï2.lôÈH¸v ŸÉPµªÀJy‘ºMxÞˆ`ô™Ñ”{i«k%#›±ƒ +°ÐVÒ²N¹•ÿþêþÝÿùE]?€-rð­ø 2× BÆ6¯)ªð+Þiéu ¿BRîd©Ú´Á“Œ‘ÍØX¸)¦bÌÚ©˜#Ó–æBS1Êû ÇiáWHʽ´Õ·‰‚’Œ 7vdŠ©S7óýC5f¶7ƒÒ„dE™üº¨kPÓ:nÑb‘%M¹“™hƒU'#›±±jë‹ðn´®JVP\äþ$NÏBÈͯ­4å^Úꛄ@YÆÈfìÓ îésÕýÉw»é¡ÿTçVPlîü¤Sh¼òi3ŒuUç'QK(UƒÞešr'CÛ¬Î2F6cƒÕ ŒvU³–Ö^ÓršBw &øiÊ´uþ4ÐÖ(cd3xEDoˆ=]Z¹y½ÛU.›/jlË­`ˆŒ¥€ìVL¦•VJ‹‹ahʽ ›€ÕYÆÈfd°Z»üš?¯¬Ø«C}`–Ïû–}`ZY^޾…¶R”;i+Ê6AP’1²9š4ÔÚZU±Ü]ÝÜÿPw}Òú ìµB1°ð°®`¯5é[ŒÄД{Ù©kUg686Tí\†ªÝZ¯ò,YÉ#1®ð*-Gb´vhl Œ¤ÜI[j%#›‘c ICm¡­uk,ïwÕ•·A¯r‘¦%Â#¨õ*Ó]+×à¦ñʽìÔµÁª“Œ‘ÍØXµW>Ù©§;¡«*+¾8*Þ5U¯Zä*$åNÚþiië"ãÂFy­ m%ẓãû»n*Oz#¶çU@‚C•ß²Ö« 4-„Ñ”{Ù©oU'#›±¡j§sØ¼ËæEM`yfÅ™ÜÖrfEƒ•`šä*$å>Új„nE#›±c gŠÌÚT5½Ùý¼{{ýce²b¶×¦QBçdE×µU³ûÙ—†JPîd¨R´ª“Œ‘ÍÈPuøy*…á3ÛÌŠœçë.’¬`È M·BQ¦QeŒl†‚‚†b¡­•õú¿?ÔSŽå§›Ç]p•nEm/_ÑÓ’è\YQ¢2_1bZß­”;ª³m°ê$ã†^Y4Œ¡jÈ ¦OÃV•ëµ—q+ÓÏ–-âÓ”;i«m‚ $cd3v¤ÁÚZ5_ÿåÃõ—O_†Ÿ§ÊŒEÛí Ùô²8 ÙKmê†ìƒº9£[왤)÷2VÛ¯N2F6CãÕR‹jÉ…iy!(Ì(Ø$c!)÷ÑV²Q e\ØÐ÷KÆÑVYB² Žä»ÚÝ-rîëܘ[‘`ã £3N{Û¤Œ¤ÜËP± fdŒlÆÆ¬È†j_Æbä¥2–e7Ù3ISáw´ÑÖ(cd3vdòuìð¹*cy³»ÚÝË:¯bäö’í…˼¤öµÉŠ ZŒ­Ð”{Ù©kX'#›±k‰é.xøLÞ_±»Ets‹ÓcÐF7ÙÝBSJµ‰’Œ‘ÍØ1DSh+Y <åUþëæñþæîß« ÷²hߊgk”ÈMÆrð,`•á4~[¥(÷²Uß³N2F6ccÖಭ‚[Y¸÷‡óð*ÜôÜ]4ñ,åNÚªu›8(Éٌˠ-øªÂý뛟Ñ:¯~{u{9Xñ)_¬¬ÛJ×`×$M¹“Ñ®N2.vJß[ÇNMÎW‚½3Ýœ¯´Ü5iP) -¶·Ð”{i«i%#›Ác SÄ@¦*_™ûŒ+··ÈùQmË­Xgƒ¦d te²‚*¸§&É I¹“¡‚hW'#›Ááj_ÀÕž„««jö Ìe’4ìDòk+E¹—¶B› (ɸ°1ƒA¢‚t+ß}ÿæûÚ­`r6çmùtB…wƒIo‰9a¬ð+N:%š”WHÊ,ÕÊ6€u’1²°¶:¯Ä°ú¥[Á0Ó5^Я8'6™´')÷ÒVh%#›±£ kòV°Ç'ýÊÝ·×WOÿÿ:·bÍæö‚¡@tÚ%·bUå^0ç4jlâV(Ê U´:ÉÙŒV›bzŬ^y6™ÝбĶ×nÅ£63ÔÈ®­$å^ÚjÛAIÆÈfì ÈÓ+¦nzåêõOW·µéŠÙâèÊ´å:Ã`¦vtÅzmöM’”;YªÓmðê$cd36^¿æÏd°º¢fŸý :ÂøÖÑ£)÷ÒVle#›±£ Ì—‚†‘–uz7þÓ»‡êÙtvs~Åi;]½M`qÖûP*±-¦íiÊ,Õ›&€u–qaCCKãXªÎÀÒ@UU{Ôyx¬eÕ~j_M®ÙÓ”{i«ke#›Á£ ]DAô5ËÓ³+×OßU:£¶æTœÔ„K+\p¾üWáT´¯BÛ Y¡)÷1S+L´:ËÙŒV;•ÍÔÑ‹ü«’§/”¬€“Ö·˜³§)÷ÒVß&J2.lÜØ!S9Y9œr*·7OïžnïêüJÜ·æW‚’hW ®8Y™¬€3U‹d…¤ÜÉR%4«³Œ‘ÍØpõ~Gnü¼²fäèŠ-zü[ŽD‚U(çÆvm%)÷ÒVß& J2F6cGAÖ5{z;æ)¿òýëêÊŠõ›«ØOkŒµ1É©X¬«ØƒÕ™•šr'3U¶ VdŒlÆÆª]QYqk++G0WTVš"`Öh0ÐÄ©P”;i«mB $cd3väŠÊŠ«­¬\ÿðv÷T™«l°°bQˆb}‹«-¬Uó æVhʽ Û@ÕIÆÈfl¨Ú«ÜæÕÊF°#Cö^_f)XxÞ¨t‹¥`4åNÚjd£ (ÊÙŒye m­j ÿ~u.ÅS¨î?¸KAg¼©¬âe]Xûò ¿‘R”{©kT'6ôeÔQŒT ¤á²ðy儽>XV ´¨ …KAüv‹ {šr'mÕ&J2F6C@A«ŠS¦P5aÿf÷Óõc]¢"ÐnnÀ…FH!rx¦nÀ>hš¦II¹—º60u’1²¦V2w€…Ï/íS]™DMp`ºE¢BRV·‰’Œ 5t ´ m­êûy§¾©¬ª(¹½0”ÆÊÔÑAm Ø4Ë'›”êIʽìÔ·Á©“Œ‘ÍÐ8µ¹T¯4ՔꕸT©Þ¡‚&;ñiÊ´u›(ÉÙŒ‰\ªŸ«Jõ!U1u^El¯Vï”÷Ò-{%jkõµÖ-–Ñ”;Ù©m`ê$cd34L­Ä¼¼0~&=àŠéz“éÛøšÖê½ iQŒ¤ÜK[M›(ÉÙ ™"¢—ò*oïn®ÞÕ.™ jm¶æWP 36õ€)1ç‹~Å[®Å20šr'Kõ² VdŒl†Æª•ÌñÃç•ñd+²Øˆß2[±BJmmƒe`4å^Ú M¢ ,cd3v$óFü aUñw?Üý\;\xno%¾VΤ¦Öð*WâUC¢ÁJ|šrCE¡š€ÕYÆ…¬VEiE½¸´"¡ œk+Ó@D;Ç"Q‚l±Œ¦ÜK_m“0(ËÙŒ©¢¸¢êŠ+ïïÞ¼½¯ó+jƒÅV(H0˜ª,®Ø©1\˜#+4åNv*U¸:ËÙ W‡7ŠÏÀ‚ ß)+NCúŒËÃ}K¯¢½ªÅÒšr/mÅ6QP’qacÇŽ‚„(@[z¼æ ¬“ÄâÔl§2ÍA­ÈÝÅsu«Â©ë±Iw1M¹“™*Ý­Î2F6c£ÕÚf§r`¸fE²’10x Ì8Ðb!>M¹—¶b›(ÉÙ ©ý”Yü\åTnß¼©u*ÚmΩ ÐÖ`Ä^¦×E¥S±R»&k‹iÊÌT›6Pu’1²ªÖyXø¼r¸þðõ.¥‹™±–ÍÅáy{«T §BR®M”dŒlTÕm»{ø±Ò¥lo Ø”§Ô üÒ•KÀœ@ÐF4ÈShÊŒÔ@:ËÙŒ R‡|6©¡gàjöµZ9OiÙæ$„GÞ¢¤BS¾I”eŒlÆ€ŒÒ…¶Vå)ïvRÔ9£7—§8édZƒ^uyŠ“!åñ-‹iÊÌlŒ:˸°±1jåŠJ½[Y©ÖX, º¹P/š:‹0—oZhësÊ´ÕŠ6!P’1²;R®¨ÓÓãÅ'Ïv=܆³»þáæÍUeµÞo¯Zït=2¦°¦Zo…WV*ËŸ°¢ÜËZm¨º”1²ª6EaÅœQX9 3EU¥6?lÕ"[9D¹“ª¢l•2.lÄØa)ª*ædUåÏøòÓûýì/2Ý¢^bšúŠo>ûüO Fü›^cþ W±”Öä)zS–O¾x¼ýéêéæ\ß‚JÏž—¢ÜË ±"]ÊÙŒH›¢Ó Îèô:‚teßâb¾C£tìÅ“C”;©ª“­ÂœEÆÈfì0Š6/8Ùæu¾ï¹yßá­ô%¤åë}ǤRìÓ'‡(÷2H×z.eŒl††ž¥Çb1žÞ@œ}‡9²~Ø]býðü° Ì= T• ÜIU½jæ,2F6C‡9A=‹õÃxjýðÙ¾#h+qƒa[¾COW‹^`kª}ǤRìñ‡(÷2Hßa.eŒlÆF˜Áçc+Èãõ˜•öR¾‚γCQn¿Ú¢…ª.2F6C‡9A«T¡ªd˜S•wXA\°Þ–ï˜Æâ¬·ù¥ ª}ìP#ƒ¢Þá¤h"CváÁ ýØ ²U…ïÐk|ÇÌÊê‹ù;í¯i¢ªå^ªjZ…9‹Œ‘ÍØaŽÕ…ïÐŒ¾CoÞw ><ÞüR¨÷vÚüÑÊ Ç¸ï”h"/2F6ƒƒÈ˜û°O÷a}r¸ «¨wà%6Ñï¶o°Ýñå^ª ­ÂœEÆ… ½1q U…BUO5a­¨w8µuß!ó2Ï…€Õõ¾#¨T›Z9A¹“AîçfZ¤Êl†‘•-ÖâYz-^EÞá/–wà•7QU‚r/U…VaÎ"cd3v˜c}‘wxƼÃo>ïp ÁçZ¹uõyǤRmjååNiT+y‘1²D¶9ï°ôÁúŠz‡½XÞá¬Ömjåå^ªj[…9‹Œ‘ÍàaŽ…BUùò‹ó£¼wi¼ÃB}Þ1©T›Z9A¹“A‚n"/2F6cƒÈ¨²ï@ÚÏ­Ï;P]ÌwxªM­œ ÜKU±U˜³ÈÙŒæ`±Žéu=l§Ññ¯ñ=D¹—ªºFaN”1²;Ìm U}Iîçúì eÍ-ºrcäá_ZiȨ¢'wÕ¹§Û´UQ”;ÙšF˜q”1²3ÆbE ž±¢ä,ˆ Ý¥Ò g-´i«¢(÷RUß(ª‰2.lèƒÊ©j‘fœÜO²"Íð[O3PK§•ÍiV§“Jµi«¢(w2È‘·3ÈÜVå`lÌ8(O6H8}ßð“sڪЪKùŽà›Û´UQ”{©ªoæ,2F6ƒ‡9»8æÆE.ßaaã¾Ã)a¥ÁÔ’‹ÆVûŽI¥š´UQ”;¤·0ã(cd36fìdöóIßú¼Cf¢J=ÏúùçLˆŠ ÜGU½­ÂœEÆÈfì0ÇÉì;œâóNmÝwL›uê ODÔû§|›¶*Šr/ƒÄV˜ñ"cd36fìLá;Ìßq¤4îàby‡—²M[E¹“ªJÙ*ÌYdŒlsLá;€ÑwÀæ}‡µÎº¼úÐéC¾c7ùŽý/¿ww7ÿÙwàA+ó‹øõ7¿È_¿¾ÿäŸõ”Äü|{÷öû·÷¯Âä“é¿ùÿ›á¯ç?¿å¯¿|r½<ŠåW¥Ø}ñç»·o®žvO·Áæþå“¿Nªópõúÿ Ï9uÿNJß ÿñù7ÿU¿÷•ìÓ×¾šþè7Ós<—o|3%ŸÞ¿>‹ÀÏ·¯Ÿ~˜Á›«»ðN ÿ˜‰LïÕ’Ëü/‘þö9i|ÿ7å÷õ‘ïØ÷¾S˜J¶«ýŸ=ÿê?)ñÞ—“Õ¥¯þGþ“¾;©Ñ/' ÀÜ™GPìò.·ÊÎ0ç»|‘-’']ø ïpðÚÄ„Óg2W9æ™è„µí¦ZΑ£NR${)¥ÌJ…[èÙŒ0Vb¡•då®"²˜Ó\(² ƒŠuñS(N ŸÖhy=¯@ZÕ91ë/tI‘ìdk¨l [S™>Ù£6Ž­%(|¦ sûédáT•­|€ïI^œ’"ÙK/-w`…‹ôL”*ô’kàs¢u±Ï¯þøù—¦ÓËøWkòËù;\^Á8•FÂK`ýÌç¬N¼tÉNæç´ia~.ÓWc›Ÿ+ܪÕÏÈD‹ÕÐÆ)(‰‚¹¿š"ÙK+‘;X‰ÂEúƒ+¾p '·g¼nîû—¯¦‘7û[ö¯Þ¼»=ä>>¼á5qõÏUø=…@FfgQ.8/…PVq/ Hv²Jo·U.ÂEúäûw«T^þš?¯é³~¶6_D³¡5êwPÖ*ÍÛ`M‘쥕Ž;‚‰ÂEúcG0ÊC¡•\-Õáõ'6ßR=9É!(·¾¥ZO .o/5E²íiÜnn¡oÆpͶgèçfRêL‹É·©:Þ¦´€VoI³—nzîh%IŒ®ä뢓F‘í@UŽÁ ýè¼wéά7ó,ÉJXiV&Þr3I³“ùI`Çu£t‘ÁØÀ®)â2CÇeçvGçzˆìZ•г¯›$ivRL%Ø‹ÎQºE1ýàA‹Ï~áÀåÐSàÒÝÛë«»›W÷w»cn£˜æŸ8Ùçyî?: ä´P2®pgÖ¤Á]} hö2FË^•ŽÒEc#½Fçúƒ¡ñ¯³ËÒ™¨!lÙK8í¥`öÍNŠ©{ø¥‹ _Œ*“¯.mÌæZïsQÚ蚢´À\i iö2?ä/K/ÒEc£ºàLÒËle ä›ÏV†Çl,s±¤ÙI1dX¢t‘ÁØ  @#`U~!üÏÆý‚›ÖNy©ÒÁõ“”ûæÞzI³—ù9vP7JŒ ê‚ɨÐ{ÉÖ2´G•< É|´¤ÙI1÷›úxs‘.2<`1ª/©6¼Áæ`#7-ôó"rƒ^ )¡å<’ÅÙòAÑìemžÃMÒ- ÜØ®•yrÈJrrh}z`‹e­Z‘„”¼m$ÍNй?ˬ˜{é"ƒ±ã«rœ¥OT¥vÚܽíô@jïEîF²ó]Øué%óz.’f/óóܨm’.2µÝ×SâgÒ‡ð ú™_ÀLó<©ÄVMªJö.U‚f'ÕDòDéôæõqTEVM}­ò jº°»ùA7«µ:aGjî¾Yéæf|^숤ÙÉ÷›ÉøÇDf06t‹*C·HÇ‘çbG:7«¢ÎºnÔ«ª- !yÑ#’f/Õ4ÜqK’.2;nA­ Õä«6£þ8=MAcxÀ.¿Öœ÷úÄ‹(‘4;Y —Üøm’.2¿µ.ã·Ö“øíÚ{S!l]X€im=ó_’f/Åî¨%IŒµX¯ Å$WwÕ‚qn­°0-ìuG“—k  …3Ìn€¤ÙÇÚŒPÜøm’.2¿…œ¥[ ]Ö¹3Î…×Ú Xç@3×—Iš½ÓrÇ'IºÈ`ðøL¡˜d6S㬕r£Öf¯P@Gvnü]å¬7Ö1{’f'㓚»MÒ- ÔØØ­Ó9szÍúÔ#³lÁ-¶ö (6ŠwJ¤ÙK1‘;\IÒEc‡+Nc¡˜/Ù úžWpÆl/9ðR`î:rjõÕ½îð%4;Y›ÒÜ(m’.2¥-0"\…=+ ØL´Àˆl+7`Ñ{ÞÚ2I³—b:îø$I·0À±ã,0"<‰Û—WÞŽX·1Ï€Òf6æÍ‡|raa= „ ñ¼©I³“ijà ß&é"ƒ±á[´EeÆ^?àŒH€·Ì>cºUíy;UIš½Ó±3QºÈ`ð`¦h•CºU®®ä\,ïÚn§ª³±/&<‘º[WoFmÄ JqšE³“ùàÆs“t‘ÁØx®s¹Qܹ5ËTŸ¯Î+ˆ6_¦³‘Š·ÞLÒ쥘ž=`‰ÒEc,ÎA¡˜|ûTßú>ÕÉ/Xi“_p¸~Ÿ*`y"‘4;™XvD7JŒè*S,Ù6kü‚zv¶Ø²]lQ­<ƒWÞ1/T%ivRM+ØC–(]d0vÈ¢ŠÙ{EÏÞ×M0ÀÅ<ÃØMªBd,Ié ç0ë3˜DÑìeÈŽóFét<ˆZ!˜4}^&=».3Ñ €I^kÌ`E³“b¢dZ¢t‘ÁÈQˤŒ¶PL.0iÒÍ­ƒIè¤P6Ý™œ–¸UøÚ3ƒIÍ^æ‡ìXn”.2Ë J¡!›Ÿ~Ñ®íÂ/ÝÞ/øi+0·b>§ÙI1âXérð€Eû¬˜†ëÃDkó7&¿ò…ðDÔú NXá/˜DÒìe~ŽËMÒE#c¹A)|áVÝ`8’/HÑÜ/„Ç ‚¹o•¤ÙI1½âX’t‘Áà‹Ï~Až¼Áp¾_bë~ÁIÜBêÂUø©¬±¼¬$Í^æç¹‘Ü$]d02’”B¸ìhhamñÙû©o#+I³b‚ÐìK”.2<`‘ÀIo¯ËäÖ¯.Ì~AëìÄú%Nz%ï†$’f'ó »ù-ÒEcør¾ áEù‚ÊDmÎT#¿€r:jÏ«˜Í^ŠiØ–(]d0vÀ"¡È,c¾`/–/ ]z–ʤ·Tð»)ìOÌPE³“*Éä&ébl$Wªœ2ÈUË󎔤nŸ2`{3”DÑ쥘À³Dé"ƒÁc­ ÅäKäåVçœ2H´ùP‘2 “Žy&š¤ÙÉü´dGr£t‘ÁØH®t¹óCÒW#*J žØ?Àí¦a-f(‰¢ÙK1-À²H·0€Á/²bÒxl_ðÛ·=°_P"—$®_¶íœAm™¡$Šf'ó3ŠÉÒE##¹à½Ë+ ¼[³2éÙܳÊD½l %yò2æ}ª$Í^Ši¹–$]d0rÀ2)#Šù’•IïO1ø"fÙ2”„ bÊ Âj×°×'^(‰¤ÙÉAsƒ¹IºÈ`l0WókþÌrÛ9‚æ·Ãc4¼PI³—b"wÌ’¤‹ FŽY&eÌçØ«*eP°ùÛÎÒˆ0šôDôúÛÎބלㅒHšÌo¿x–Õü¢t‘ÁØH®’¹È§Ô‹Öë~Aas¿0ïwà…’Hš½Ó±,QºÈ`ð€EéB1_r‚á¿ ÅÇ”…ÁóŠüë]äB̃Ï$ÍNˆÀ æ&éfd07ä‘O·yzƒÇ¹gòR o›WŸ= Ò̃Ï$Í^ŠéÙc–(]d0rÌ2é*“ïp›··…¬­Oׇ§·Àú´·Z#óì3I³“:`Çs£t‘ÁÈx®Zç:Ÿ¦‘¯õh’Ö®¹k°sÏ*I³“bzÁ³DéÅô#Ç,“™B1_r±çý¬AwC¶íD^‹¡•Z5™]E³—Zv<7JŒçj‘Ç´X3Îð PÊã Z6g¸óñ"J4Ñ>ªi÷ˆœª™Å‹[D;µä›hÐòãDƒµNx¥²wP~ýDƒR1Ÿf ‰ö2BäÆu³x‘ÃØÀ®¶2¡]³lõyîà ªÅnßÈEHÌs 4ÑNÚ)%wô’Å‹_l¾X®}«~Ü·:u*Y¹ì aý¾U)1„ÀŽ·‹•&ÚË7¾›Å‹Fxƒ^¸"N[uóíù|fªE¹ÄF.Bi%Ðò"L4ÑNÚ©{“Ä‹`¼.´“¯2mÄÇÊ´E#mY™Ön}eZ*ÒfAíe„žçÍâ-è±²aŒp~2~^S88ê0rÍa¦[î[>4ÑNº©5{ø’Ä‹Æ_”+z­é‹tu­KþcÂMðMîjÅõEˆE¡xÇh¢½ŒÐ³c½I¼Èal¬×˜œÈúpÊúµækX¥ á f‰$ÚI7a^’x =vðbLÎo ðÕ! |¬CX”bÚº—êFWÔ!Œðû,„× ¢Œ;қċÆFzÊ„¡!‡³'° êÚƒLÆJÜ9I´—vöð%‰9 ¾(Sh'_aôÇbêÂ÷E,+Œ¬È!@œóN#$‰v2Â`0ÜF˜Ä‹ÆFz æ=K×ìYz–C(›©º¼´`²ì&.bHšw‚&ÚK;=€IâEƒ0jh´ÎE¸‹-[×E €õÌ´_á²ÖEÌ ÅÛìJíd„¨Ø±Þ$^ä02Ö Þ˧MŸ×ìÕꑉªÜ,"9góåhšh/Ý´ìáK/r9|™ô±à¤í¨p_½ü›|ýõîÞ~{uwûóëþ믿zûøt{ÿýþÃïo¾»zw÷ôêþnwÌ¥|þ§Ïþ·Ðgx›6ñ(¤/YçE¸ü"(™—2‰bùÆÿ÷êá!ü žr^2ÌË7h¢LÔiv$8‰·pPc#ÁVäfX+^Ö ‹Uß„òÞ/ÈœaD{i'²7I¼ÈaäàfÒ#(´“¯vÎû?f¨¬”©N¾¢Ö{çØ›aI¢ŒÐkv$8‰9ŒCBÁ*êX ª•‹P¤ân†¥‰öÒNÇÀdñô¿ø8ÚY€PÀBÁGjž—pàmªS@µ(o¯M´¢0ÜHp/r ¶Å9KŸc97‹™¨­A(#3Ü7äh¢½tÓq‡/Y¼ÈaìðÅj[è&éÌÎt¤4i'щ÷ )Mû\ÑævnX)-ÊÃë h¢ N7ê›Å‹FF}CP8Xå žMFdgíH)`^éJí¥›ž;PÉâEc*P88é ŠŠÄ¼½ ÿç«§ðÛ¯wuýÃÍ«×WOg{ ؤ·Xï-@ú©=™·~Míd‘ÊrC¼Y¼Èapˆ1‡gH^f9]R.“uEÅoªÁ4ñj „=³Ç ‰vÒO-¸£™,^ä0v4c]Q sd¬®QŒznó<c¡8a­_ .AP'ë˜ïÑD{Y r#¼Y¼…ƒáÙC€Xã!ž­Ïþdö­¼ J©y;œh¢ts߶Ϋ›Q¼Èaìèdö ù¼È‹y‡«Ú Õã+ iµâ-PÓD{!r#¼Y¼Èal„!*!½¸|ýÆ×¹·²í*?|ßÖª›ÑNº Š=xIâ-äØÁ B¾.‡t*^å Ð^ìºÜÀB†€ÐÈT@³þÀ:Š{M´—:nÔ7‹9Œú¢Ë ¤ë¹åiSx_¬Kkä"ÐC`ļŒƒ&ÚI;­â_²x‘Ãàዳ…v¾¤@ý‹ðzó“²Å{jý­ép•­ãÞ ~€l/+ôì³J…€‘ÇØHoˆ&²Òƒáïy‰OÿvóÉáÒµ)è¹<÷,„W¬g˜Wr ÛIIQ³O\Fƒ‡2²ÈuéqOº€ýÕßwO7o´úúëoïoî´zõúîî7ùô>ýÝ_þüé7³GùÝç_äJ6ª¼¿›zÒ¡¬ó%\]°ÎÈâìŠb[ǹ£t“¢Yà^×q€l'u‚`) yŒ;ȫ՜=½:ü=/ò,ÝЙ®Íý躙Ñàö½*¼JJ’í¥¤¦A¨“Œ<ÆuœÕ…’žÚ Nz‘w»›ÇZ2^ć ›™¢¹•Ö¬p)z*1×6‘íd­^òOhgbl ÙÉ<ëäéM²ï¹¢K*VEWb«}ãÞƒ#%÷ 6M¶—šBƒÈ' y ùÈ"òQ§–Ê’Nåþ)ø“JŸ¢ìöò3¿ÌÒ#¸Ö‰(© hËëD‘ícNHnŒ¹0òeöÅaâççž4ÊSÞ4ßž´´J{æ>ªCd{i¨eŸã.\xÀØaÎ~ÓBT¬—”Êß½ðfƒ»Ÿœï£tÃȫջŸ’úð–=‘ídvR±OnFc#ʾ¸Iìé›Äëg·½ÄöŽÁ ¼0³†Òd{i¨å]²€‘Çà¡‹Ô…†¾äÞÝûŽA‰ 9†‘[¨æ9HeòÛ`ý¹»¤Qܾ‚&ÛÉ•æÆK#‘qcðªX6«V-›•‹¯ø­<ø27Òq£D‡ÈöR!ä7²€‘ÇÈáÆ¤6y'¬:¹öÌ—ùDêRQþ¸%a¤•žˆXß k”óèüL…Ñ ‘íd†z>Èĺ¢£0ò ã”AÌÐJ™ûÒ¥¤ûÒWÔl¦k3 Ûè´„Q!Hq¨,o™úÙ^JŠž]I³€‘YLGI­*””ôk§* ?ßÞß½ýþíý«›Y×S¿Å¢B±ò/¼(ÄZìÈ¡i+h­¼çu$G(w2Óý•ON3ý@ÆÈ†œ-ÇRs[bø|:18Þ;«2]Õ| oyÞFKåy¡¤#”{i«ãŽ|>1²<ø‘Eð³æ.Eö+o«êÔlϥ̻ƳKYŠbV³é´‚Š·…öåNF  [i–1²!±þaŒT‰l¤Š^±"CÉ.eÆ­.àR¼Bþu‚G(÷ÒVß$Ê2F6c@JªB[«R•ÝÝuKQr‹YŠrZ˜ü²¨ÊRpê™ÒžùÄÑÊŒÔZÙÀH 6@ngÇH²‘ÂÊFÚgÕnÌt­~n€ü.…Wހ筑¡ÜI[Q´€ #›Á ëZ %42Û8B¹—¥ºxu!cd36^­óeåðy%vxÙ•Ô’X:×À¯(ôžù´ëÊ}´Õ Õ$ Ê2F6ƒGA¢ˆ‚襓ûJþöôÃÍ››J·"7‚9eƒž ˜¯Á‚ªyë[€`4å^†ê›`ÖYÆÈflÌZ(›auúVø{nEÁ´¹Hº¢\ðâŽù ìÊ´5çM´5ÉÙŒ ]@¶ôèÕ)·ò—ÿùÏûÛ§JL㽊W6Õí÷›9Ö{<“šëÿÜvJSîd§J4«³Œ‹ú±Ájã³z‹ð  º¹´ ½ŠVsØÊß v€r/m5Mb ,cd3v d¼)´µª´ò¸»º¹ÿ¡Î«€Ø^ie*Øû4F-«+­h°ÖXÓ ´BSîd§ûlšßN“Œ‘ÍØ`µ19W1fe®rdfÅÀer Î1¯|?B¹—¶B›(ɸ°1ƒÇ@PÄ@P•«\?þýái÷PçV l0Y™Z#reÅèºdeºƒ®œkàVhÊ ÕÈ&Xu–1²«6"OqúØÔñ>0éÊ\Úl´~yÞÜ¡nP±§)÷ÒVhe#›Áƒ QAôì“s+»‡ÛêF0#‰Öùl·‚Jéo悽7un%$†ûöùÊ T¬:ËÙŒUƒKWÐÃçÓWÐc`¹`ž8$Ú­(ð^¶(ØÓ”{i«m%#›±ƒ ð2k+=ºyzü›ð滪Á dw+nBä¡Ò|·ô•nÅÊíñîr+‹+F€VMŠ+$åNvê¡ \dŒlƆ«‹Ó¥òÀéÒªtÅ©ËLÙ3-hR\!)÷ÒVß&J2F6CÇ@A«t¡­USö_>\ùôeø÷yªLXœÞÞ = ty!•Üoªq-ÒÍ|¶ýå.ÆŠBØ6u’1²²F̃öHßÛ¨ê2F§/äZ”l“°P”;i«¡(cd3v „˜¡¨Ý)×ÉwW•í`è67hÜŠ-íÑÖ ÚãÌËÍù •¢ÜËP± ddŒlƆ¬-2ú·®ÈXr—±Ãœ±4í2m´i1hOSJ¶ ‚’Œ‘ÍØAÃ"c¡7îr+ÿuóxs÷ïÕ–y‚`kžÅá‹„ÅV&,ÎiÔÌ×}Pîe«® fd\ØàИµô2Ox¹r,òÈ’|¯ˆÞ™žÅcx9ú I¹“¶jÕ&J2F6cÇA^å±H¯ªÆ"¯^ÿò­êüŠW››‹œ2— ˜ðDÝ\$¨7©±Ð”{Yªk‚Zg#›±QkÔ¹ÉéÅP+æ"MA7_?j9ÀZka[d,4åNÚjt“((˸°QcGA¨ ØV“–uòDäîúé»J̨ :•éBa†Áæø¦Â©„¤Çc‹}“4å^fê›àÕYÆÈfh¼Z ™Â¿ðù¥›ÁtA×]«PZÉwøåNÚ ºM”dŒl†‚V™B[«6ƒ}ÿº6SQBmo1Xp*oÞ*!êƒÕ™\hÊÌÔŠ&hu–1²­V0›)}Òrf2]{™Q{°Fƒ&N…¢ÜK[M›(ÉÙ Y™µ•n†9¹Áåæú‡·»º-ÆçGW,º4©„©] „k‘«”;*Ê&Pu–1²ª¶EažtßdQXÁËVeðä-NyÑ”{i+´ ‚’Œ‘ÍÐAPЪ¢°BŸ3= €ýtýX¹ßãË*ÓVº„€y¨,«L%gÙ#)w²S§ÚÕIÆ…¨Vrø'éwÊŠdEtýe0‡ šìƧ)÷ÒVÛ&J2F6CÇ@A« ÐÖª²ÊãCp*¦.W‘v›uoS®"M]]ejÜó¢Ån|šr';õª ReŒlÆFª÷ãñóK÷·øLWfÌ7ô*V{'T‹b=M¹—¶b“(˸°±ƒÇ@²ˆèVèS^åíÝMm]EÊÍ`ófüy]ô€ù:ÌòÌM¹™N‡Þš˜i’1²©Þ_3‹ŸùR%.“ªØL?œ_[)ʽ´Û„@IÆÈfìHå ÙásUªrûæM­SQr›™ŠÖ6ùU_™©X©]“s+4åNf*Mœ:ËÙŒSÛb/¾]»ÿÈÅaë/³iÒNÅ ¥Z8’r/mumB $cd3t´ªØ4Y·ÿîáÇÊ“›Ü‰ïM¾%måN|;ÕøM‹Ùzšr'#UФÎ2F6cƒÔ]Šüô¤Ÿ®×ÉVTAÔ_ ®2?lo@±;–C”;©ª•  RÆÈfì0Èäu-áó©bý!Ÿñå§ÿöûÙ_dºTnÝÄW|óÙçúé0â߬ðóW¸Z½¬0R&¬Ë”{Y¾x¼ýéêéæ\ß1©;Øuˆr/ƒt PéRÆÈflTZc)ꌱ”O¯ú*’’b&¥]R2=l§Ññw¢ÜIUQ5 s¢Œ‘ÍØaŽ*fRÔÉ™”c¾ãó?}Vtp³&r#i†UèEn VU³&³9_÷k`å^öç Í¥Œ‘ÍØH3ÈŒ4ƒ:]nÿäp­=§ ì…Ò B"{­ýåNªêt£¨&ÊٌՀR…ªžªµŸŸf€"v˜n+ÍÚ{ëm~)ˆÚ4cV©&E¹“AzÑP.e\ Ò (_@Tt£NDå/Q9pšÿjã!ʽTÕ´ s#›±Ãã ˆŠ¾0Yç;ÄÖ!*€¼²#<]W QÍ*Õ¢¢(÷1H%D#Ì8ÊÙŒCQÁ*ˆêXÞóÖÿYÆC”{©*´ s6fì0 ˆ ^Q}à;ìÖ}‡›ž§É‚ÁÔû4ìmW‡(w2H)[aÆ‹Œ‘ÍØ˜±±¹‘ÅØÓ½¼ŸœqÒWT—òNyÃ>rxˆr/U…VaÎ"cd3v˜cl†W žjä=ßw$¶YoÊwLÛלȘ•[í;&•jSï (w2H¥ZÈ‹Œ‘Íà ²Ë¾Üßñ ³’™¨'ª| Ý&ï (÷RUÛ*ÌYdŒlÆsÀ¥9Ïç;ÀôÁw„ü+=<ä;v“ïØÿòûwwwóŸ}~´ò7¿ˆ_ó‹üõëûOþÙLØîæñ§Ûë›Ý«ðùdúoÖýå“ëEòåG¤Ç}ŸÀwoß\=ížoƒ‰ýË'4åáêõÿkþêþ”¾þãóoþ«~ï+Ù᥯}5ýÑo¦Çv.ßø"J$>½}Ÿo_?ý0¿3¯îÂ+$üýc&2½FK.óƒOûœ4¾ÿ›òëùÈwì{ß),#›ÑþÏžõŸ”xïËÉÈÒWÿ#ÿÉß´æ—Q‡`nâ&(öyuO˜_Ý‹l‘<é±ye£ˆW¦Ï§¯ A5E&jó‰FwRK¼·(’”RjÁ¬”Q¸…¾"ÿ¥ÇÑJ+²VÚS×Î $&Zx¡@‚Œ!Ö…\!Ï”9ݳúLÀ¬;¼H%E²—­yÛÂÖT¦O6þŒckRe[“äo=7¿„LtjÌ[ yÀ|]†"ÙI+•æK¢p‘þàq‰,âIz«S£Ÿ7÷¿ýËWÓµ²œã¼zóîö·øpòsRbý\‰ÿ±½‚×ZéTXaV{ o-óŽŠd'»ÔóaµËE¸HŸŒv†±K›–2OŸ_Ô! ¢Íu”TÞóz Šd/­4Ü1L.Ò;†±iùòô™i&'’››É ù‚„t«28€õ[•Õt5†·8E‘ìdjf—YMm.Ò'qóaLÍ þ5&ëç¶2d`œlî¬UÌu(Šd/­î°$ é–ÄB+Éî¼`œÙž°¨\ìRÀÂZ '؉wŸ>E²“©âÆf£p }:ÛÆÔláì*ð,™háõ#h-‘yð’"ÙK+-wX…‹ôÇKláì‹Àû[x€Æ­_ýñó/ÿLúôWkšæï°íšœÚQRR`KŸpfçšöZ1oħHv2?«¸áÚ(\¤?6\kM†k­YSF>ؤ}1;ZòÂBÉ^Z‰ì¡Ê"ÜBߪ@.#[:ƒ©s p©2ò¸ýhàmZóžˆv«=‚wšû@0E²“í¡æ†d£p‘þج)<‚YåžmôÊÁ´÷ÞM§˜µò9É^Z‰ÜqJ.Ò;N1…G8€iUy³yà¤7ŶZe*<‚Æó.’f'ës†½x¥‹ ƆiQç^£l}š€F´v R€²Üí¦Í^ŠéØ{à¢t‘ÁØÑÊ>Z‹ŸOµïÐèðJ0F¥Ãã*8‡õ®AÊýZaN ¤hv²@Üøm’.2ÀÅ¢åé–ïõe´®¹kÒ)æƒ$$Í^ŠéÙc–(]d0xÌ’v7LŸO!YáP~t Á5è:¤¬A­w í<É:Ÿ@ÐìcVXþa Eº…=÷5ŽŠ\ÛCúdÑÙÛSÀf²²8Ù>=&mGfÚ/ÇÜxJÑ줜R°·ÃEé"ƒÁ㙢Qž:ѾÂ=H÷Ñ= €Ó.uÇ+ëýj÷°×'Þ̤ÙË-7¤›¤‹ ÆÆt]1*äèæ©õ# N5aV΄ø‡¹%•¢ÙI1•äŽ[’t 1vÜâTNi:Ul gØîÞ^_Ýݼº¿Ûóïõ¬:…ÏsÞìžÕiÆÙ«ÔB>­žqÖVÃÝ´JÑìeŒÈð&é"ƒÁ^_Äi/[ý.‹¢Øý.¥Ú¢’¹s•¢ÙI5µdï‹ÒEc0è¡PM®u½ÓkðbëzGN!P»¹eyÀÛÞ÷úÄܼJÑìeŽãMÒEcc¼Feç`è}œƒ~æLAµp¦s0(06“4;©¦QÜqK’.2;n1 ÕäsFtSâ0­™ÍMKr½sØë/¾DÒìežáMÒEc#¼^ç7¯× ¼=Ë2¾4Ÿj‹/Y^Šwm;I³“b‚æŽZ’t‘ÁØQ‹×X(&ÛÐó¼{[Š«ù|‹È«ÕCÏVƒõÌn€¤ÙÉÚ¬àFs“t‹µùÁÑ\Ÿû@æùxŽÅ¾Hѹ þË3/Ê#iöRLß$é"ƒ±ãç]vtµ¼Ê ¸u¤!¤J`ö û.éU^½ÍìHšŒ7v›¤‹ ÆÆn=ÆçÖ\#?–8ÛÚ+8tÒ1'$Í^Š ÜáJ’na@Ï4Ž£˜NŠù’Ûãï{ç·–8©]¹ý£Xë|tµâ]ŠJÒìdmûÖ±Ò(]d04J«EnõŸ_6½ ªÅøB³Ñ6¥´e./ÓD{)'°¯ÒNâEC)AL¡l# Zè# !ÐvZz“ЬaRyîÉgŠh'#ôŠô9Š9ŒÖ:ë3~4ÍþÔ/Ä€\cv˜»ý QYŠæå©4Ñ^Úiù矣x‘ÃÐLÐ#]h'YäªëAr⣋˜€¤bÇsxÈŠh1MCðîÕ¦‰ö1Bš:Š9 äj6Çiø²-zEQ.1n6 Þ;î $Ñ^Ú‰üsÐQ¼Èaè&èQ‘ãÒ }uY„»Øî¤q]„Sá]åÒÕ0-lÅú$¥Õ‚ÙED;¡4ì£ÐI¼…½üe#™Ötª>Ÿ…–¢ ›a]%›Ýì4Ú8dÎ#H¢½ôÓ±‡0I¼Èað ÐO¶vÕð>üØ®j½Ó 2ÔdÖ·«.»x'Ýh¢ŒPv¼7‰9Œ÷ʼ0#|^³0ãX!‹}Íò’cg˜×)‘D{i§ga’x 7v#óÆŒð™mcF õqc† AI-sQ±1C0Ž»—•&ÚÉ5°ã½I¼Èal¼Wû¼4CÓ·\„úÐEøbâMd¨É·ªF€@­¸³’h/íôü·Ÿ£x‘ÃÐLУbM7}·nèM|„š,‚³BåŸÚU@Mà½@îjI´“ËŽ÷&ñ"‡±ñ^%SI0|~ÑÜ[‘E(%Ûg¦7s5‚$ÚI;A°0I¼Èaè&h$ÚÉvð-èçǃoÁEx¥òþ­Äúƒo2ä¤Ó>Wf#¤ˆö2BdG{“x‘ÃØh¯t.§òô÷¹Õˆhò¶½‹ÀiE wOI´“vZÉÀ$ñ"‡±éU¡/øh*–~m×E ÇàwU~ˆõ. †ùM´—:v´7‰·p û„†1BerïùºÉ¹Y„Îõj¹¨[íg4÷â=šh'íDž¼;‰9ŒÀìk…Q§^2;ýAðÑE åEºû£•¶«]„ÚIË<Aíe„Ž}w/ríÕÒf IÚ5@ÓóS¡Eí&%¼ïxǨi¢´Óiö%ÞI¼…ƒ;€‘¶h¦°|@“Ä@Ótà¤H ø´„õ@Ó¢P¼µšh/#ôÜho/ríÕ¹ >¯™¯>¼f#Ê #­rí‚~3Ÿ‡£‰vÒM¯Ù×$^ä0vø¢…)tóÔtuqæáwo¿½º»ý¿ùuÿõ×_½}|º½ÿ~ÿá÷7ß]½»{ZsùAkYD<ÛØÍ1ŸÕ6§¾¾>o7ǤnAߘÝI´‰:!¸‘à,^ä06´%§ùHv¥Ÿ=5a2U—ûªFÝNjº ;£ œÚIí¥†=¸IâEc7 }ÖNGn¨¡Š5b›Í0œDas×Vs:·2ÃØ+3Eíd„R²#ÁI¼Èal$XꢔMoü<÷Dá"¤±í]DxÁyÃcD{i'°0I¼ÈaìFš¢”M»³:Ê|,eÛ¹œè‹R¶®)eûiJÌqïp:@¶“!*Å_ÎÎ.<èžÃ˜¢öÖþôpݧ»9’NdWaQ2dnz J  ÷|ݲ½”Ô²·åFcG3Fä;#NÍØ‘§G¼y¼¿¹ÓêÕë»»CåÓÿùôwùó§ßÌNåwŸñ¿ÅÈØ*n‹‚ÊŠtSkWŒÞ‡EíÍ‚a¬8@¶“†Ä´‰îŒ<ÆMÑeÎh‹zÏ‹<ïŒÊtËÆ¨f^Dƒ`xËÞ‡ÈöRRlê$vìPÇÝQædwéEÞín«}HÑDÕÖ‡ŒzÂÉIeryÜèÕ(&­³¤âî²¥Év²Öýƒá¶Ö(`ä16Œ¬!·Qi8ÝFõžKyÞI¥2a[ÔU3§Œ”ÌC{ÈöRSlù$#±# Eþ §ú©H§rÿüIOÑÖl//AíœNðVð««kärZæšymÔ!²¬ ;Ì\yŒ 4ƒÌµHPk¶”i´•×.´j´’ZZ¥çû¬¼J’í¥¡Ž½V^yŒæ€Ò…†¾dSù{ÍS ó¢ò4O9iÀÏ÷Ï£íË Ç°WæÚø²ÌÎ{u¼0òQö`ÅtþTCûó§Jšù=ÜŽ&ÛKC=è’Œ<Æ]L¾ƒ‹ëj u±;¨—È­‘˜(W1Ê5ŠÛWÐd;Y"Zö©BÀ… +m‹å‚4Æ}ÀWÈÅWüV|™é¸Q¢Cd;©üáF0ò:ÜPûòKüü’ €ï/ÕŹ¬mµžÐ ŸQm¥aýö?£ÜÔ=7/f4ÃCd{™á<–Ìi†¥€‘ ±Œb†MN¶Ñ¬¬))S#ä’B£2uxؠ«”yvâÙNJêçÍlÌJšŒ<È¢” %­ª(ìnº½¾Ù½º™xeQa›EŸ‚¡®ÅŽz‰R¡gO ŽPîe¦(™Íô6ô~‚a,Õú\]@qººp¼w6W¨±Øëܨ@½¼©ËUœØæ¤Ga|ÆÀ\6ÝëDî#”{Y©ç†ª?1²­¶Å…dK_H^1¦‘}еúB>E†yçíÊ´Uë6P’1²;²[K+Où”ëÇ›×»ÝC[±Önέ(- äu$Ö`[1VZayGÉPîd¨F4«³Œ‘ÍØ`µÇÜýèÝéýUÇ!0™{t}±EN6jÒ]ž8Níè- I¹—¾š6aP’1²; òNúzj£]´üéúî¶Î¯xç·çW„t U~cˆ:¿J€cîý:B¹“î§aøí4ɸ°cƒÕ^ç¹›¸« 0oÔeÒPÓ" ÞCG(÷ÒVh%#›Á£ b‹§§·xž,Ùï~¸}°•^Å\jcÉ0^%hU€`^­^Q5 å<ŒØÀN ÊìÔÊ6Pu’1²ªžz MŸõK³“éjbåu¯b%×¢°BR¶Q e\ØÐk@ÆÑV­ m­ÊUÞì~Þ½½þ±Ê­˜ùæî¶Üʼ¶=ïä /ŒÊdÅ‚S’yŸâÊ U´:ÉÙŒV;ŸÏD9z\¹j7¯óî2n…ÖÎ;Ýx„r/mµm‚ $cd3t´ÊÚºâpT]ßìªLVŠ&”íxéóÙ;íÜêsQQÓŒhÒ]LSîd§N·ª“Œ‘ÍÐPµ‘*‡R‘á_Mw±‘ÅÊ¡¦ Úx‚r/mÅ61P’1²: j m%—/œž†¼~W»µ7hµÞž[ ©ŠKè‹‘ÒTº° ™/Ù¡ÜÉP½iƒU'#›¡±j#°ÀÀÖVìWV-{!·b-B“F0’r/mu‚ (cd3v$\UÖë¯oþöT‰€m¯\Á³áuQ‰€…(^ZÙ"W!)w1S'´ª“Œ z¿Ä0f*±ÈU1WqÊU¦-ÌRµ(¬”{i«o%#›±C ‰E®‚U¹ÊÕ»§þ¯2SqÌTÀ INEÚºLÅH°Ê¹#+4åNf*¡ PeŒlƪ­ÌËV’qêa§òì<®.èæ¨®Ñ°åy£4¦EY…¦ÜI[•hem¥G ÒÖbÀŠîƒ9™©ìn«[‹­RÛs+°Ø$o癌 ·¢Â«Æ0Z?B¹—¡Ú&Hu–1²©ÖêŸáóÊÖâg¹ dº6 ´t+Ê[t-¶Ñ”;i«m‚ $cd3tdö‹r£†Uµ‡á7wu“çæz‹RÆ‚r阺Þb£…0vš|a7T’r/CÅ&Hu–1²©ÖRdC•+›ÀŽÔU´tÀÂó¶–{ÅýÊ´5¤´u‘1²<’E$«šÀ®ÿþðômø••ŽEm°,„É6ÝÕ :S×fô´mN4(ØÓ”{™ªk‚Vg#›±Ñj#²©Á—¯y¡|% |‹QHšr'mÕ& J2F6c‡AFä|ÅȺQÈÛûðî«ó*³ßÝ–WA¡%dÌh_™®1ÍT6°§)÷²Sß®N2.lÜÐpµQùXVø|úXÖ™;ñƒBšË¤+FN--P0’r'mµºM ”dŒlÆŽT¾ËeÔÉ»\¤Wùòáú˧/ÿÏSe¢Š#^q-NZ©EÚÝbTyµk•k‘.$|-êö$å^ÆêÛ@ÖIÆÈflÈÚ³¶Àr 3ö2»[L¦Û$,åNÚŠ¦Q e\ØÐ‡ÒÖ"a©+°GòÝÕC]Ý>ðÜ\Æ2ã`>ÍwS[`1>äÃ-zŒiÊ 5ØPC2F6cCÖª˜‡Tkç!Ÿm0Ö™n1Ù´ ´ÑM–·Ð”{i«i%#›±ƒ UÌCªºyÈÿºy¼¿¹û÷ê ‹ÚâH¤Q KåH¤qNO³R l•¤ÜÉV½lƒY'#›±1kðÙ³€éô &ºV‡ôZxáåè[$,$å^Ú mâ $cd3vÞÚZ7½òú§úûA­7çW¬QEK¸:¿!p…&5šrK•B5A­³Œ‘ÍØ¨5˜ -¼tÔ>¯›¸ÌºIÐZ Û"c¡)÷ÒVÛ$ Ê2F6ƒGAPDAP¹nòúé»:§2o{Þ–Sq¼žcÄøº¨µ‡à<ªN…¤ÜÉL¥n‚Wg6jl¼:"¿æÏ/MV2 fá20X…ÒNm:ìÚJRØ&J2F6c‡@ÖØB[«’•ï_×g*°¹LÅÉr̃BË#Е™ŠÕ™£ö4åNfªt´:ËÙŒVCÑc k{Œo06Pô7ÍTì4Ö Mœ E¹—¶º6!P’qaƒc‡@PôC]ñîæú‡·»Êµ`°½&ã¹dïr®b*›Œ'Uó!Ólc¨Ï)w2Tmš@ÕYÆÈfl¨:"¿æÏ+›Œ¬Cs™&ãð¼QiÙ °BS®QeŒlÆ‚Ðä&c4UMÆá߯Υ Ù\s1J0ûqyª®¹,ˆ´€¿HÊŒÔ@”:ÉÙŒRÛ¢Vo×ÖêŸÕTr­/T«‡ öV·ØŠOS¾M”dŒlÆ€lQ«·uµú7»Ÿ®+Ü^¥~zƒy©ÓŒ½­­Ô£´Â4©Ô“”;Ùi°¦FvºÈÙŒ S£+ǘ¨ø %*8Ý"Q!)wÒV+ÚÄ@IÆÈfì}‘¨Ð÷æNŸVßÔVUÐo/W^kÌ+ˆ•¹ÊÔ+›”êIʽìÛàÔIÆ…§Ö0/ÜŒŸÉßzØ«¨Ã Œ3þÜ´TïPl‘”;i+Ê61P’1²: Z•×m½lï”Wy|©Š©Û_ è¶æU¦\ÅåkÃæ½ï뽊 ¹%6AÀhʽì›ÀÔYÆÈfl˜ÚC²ÓðyåZüg˜.è^f-¾ N@48àESN5‰²Œ 9t ´ m­Z‹ûæMmªâíæ–âO-‚R¥3·fö°Â©X©]“[+4å^fêšÕYÆÈfl Ú Ìf*V¦*GÖù¢U¦%žw°uÕ©”;i«WmB $cd3x$‹ˆ.>åTî~¬t)rƒyŠ Á¡Hè—óuyŠÚˆy M¹—‘ú&(u–1²¥vsi)~&Ýߊ}-¹§Øa^Þ²§x:Z'°ÅT=M¹¶*¡›@YÆÈfìÈe¬6|& S.åÝîAŠ:§âŠ­©[r*˜UÜœ(V89UgdƒŽbšr'3•¢ HeŒl†©AäA•ðù¥ƒ*"Ó-UDS§b§Þ`¤ž¦ÜK[M›(ÉÙ …Ÿê²¶Ö ª\=܆³»þáæMÝJüÀxsÓ*¨Ð«ä[|Õ´Š^YÒ±Z9D¹“µ*Ùª.e\ØÐ¸Ò(Öj\1­âΘVùäð±á €¹‹ŒªÌÛ€Fö ÈC”{©*4ƒJ#›¡Ã  U¹ÌU9ä3¾üôß~?û‹‚.>Ï­›øŠo>ûüO Fü›^cþ ×ñG#f×áÊ©”/oºzº9Ów8Øß*à7HŠr'ƒÔ²"]ÊÙ Hƒ€"/9cçý¤Ke¢Yx??l«Œe/ž¢ÜKUm£0'ʸ°¡Ãœ žERrráýÙ¾#ЂûŽù6 Z—žH¹×þ=ß±›|Çþ—ß¿»»›ÿì»@ð‹ •¿ùEüú›_ä¯_ßòÏfŠïvW»Ý«ðúødú¯=ÄÿZø»ùÂùë/Ÿ\/ÏaùIé_uŸ}÷öñÍÕÓîéñ6Ü¿|ò×Io®^ÿ?á!ç¯î_Hé›á?>ÿæ¿ê÷¾’Ý_úÚWÓýfzˆçò¯¥DâÓû×gøùöõÓsOÓÕ]x¡„¿ÌD¦—jÉeþgHûœ4¾ÿ›òËúÈwì{ß)ì$ÕþÏžõŸ”xïËÉäÒWÿ#ÿÉßtè—1ˆÐ¼ë« Š}^䍨ïì,²Eò#ÇnJU~ÍŸÉßz Öx6©$2ÑbUV#Tj)wð•"ÙI)5û9(ÜBè;:“&ú¬•tú\VL´ˆe·ÿØð¥“€Â¦Žä F[ _κÛ{R$;Ùša¿ˆ…‹ôG.V…6ÛšXƒT>ëÿ.<€4í=ûÉÎqnuNK±Øµ²8Òè—H‘µRr’­K’Cy¥séüêySé­enµ£Hv²5`¿\…‹ôG®,›ð…­Ñ#à9€w­=À4šàysŠd/­d¿P…‹ôK¼)´’DÁÏôŸÿé³ÿMdQäŽO¹ €N;¡ŠÀ©µ@Y% oëE²“©Yö3Q¸Hä pˆR¿êôùôÀÎ'§»à¡b±@+`ÿoO5E²—V²Ÿ’‰ÂEúc‡%y‡ÀôùÔ`ÎÙ Ü °!`Ê `ýn=%¼ó›ÉN¦†ìç`¢p ý¡ïÀ„ 3ÞŠŽtVçf2uøÜÐx€Ö™ÛÔ(’½´’ýìK.Ò;, ¯­B+Él¥ B/.„}óÕ?ÿòϤHµ¦½`þ[[³é`Øô «{Ó´×ÏîÚ¿Ôü’ÌϱŸs‰ÂEúcC°¨siéߺ¾0€¦yiØIÜa’½´’ÿlË"ÜBè{-“&¡Š9U¦Çõß^_Ýݼº¿Û»µ¤aZ´[Ü2œºÑVϽ€ô–yBŸ ÙÉ=ÿ]–E¸Hl€Ö%:G—èÖ' NÙ9³+¸û“ ’½´’ÿþÊ"\¤?vÔâ¤)´ò%eƒ÷“§ˆM›êHž¶0hÌãÝN¨ÕôÊTðÖ(’}lÏ ö³*Q¸HpÄÖdô$Ù¹ƒ+² ÚÜ#x%y7 E²—V²ŸO‰ÂEúcÇ)`L¡•|à£GçIè à´0¼…Šd'Û“ì'Q¢p‘þØ®W¹†çÕéýÂGrQõ­1$)ŒæÊI³“^*öã'IºÈ`ìPÅ+(óÔ*áó‚×Ä‘êx È¹bÂÀËÕK‚÷ÊÃ[I iö27ö&Iº…ÁÐ×KB®èTÎÊÝéK‹gÕ\QÇkå¤4R2Ï™Q4;)¦f?W’¤‹ ÆPœ³…bž:ª¸.òzƒ~À»¢ËÈáêk‰{åa5£hö27ö«#IºÈ`ltÖÛlns©ã5ƒ ùbã©l„É ÝìófÍNªiØOŒ$éC™”(ƒ—«!ÞÜÿö/_}ýõ´cãñ§iÁâ«7ïnùŒ—+N\sÃlÅgXiMê‰QÖϦIô–ù¶.I³—a²IÒEcã·Îä6@G×Ä×O'¸¼m•;(ÒñšIšØï‡$é"ƒ±ƒg°PÌSkÞWä`¶–; „dÞ'ñ–¢Iš½,бß]ŒÒEcúFäj#^6Bm2UYÌP›6ÎÁ°†¹MÒ줚NqG.IºÈ`èÈ%(QNj }tª*w0òãõ|ò­ÚÒÚ¯¢Þëo1š¤ÙË=7°›¤[¸±]íò&M·®¬¯8hç[ÃJÆX†·MÒ줘^sG-IºÈ`ì¨E;(“í¤Cx ^ê¤ÃÀ®¥v©.ª5êõ®”ôÌúHš½,Ðs»IºÈ`l`×X•ƒ3»æÊÃá‹ Ú hî@Y¼Åh’fÅôb¿9‘Y1÷Ò- ôØ1‹±EBK¯¯ËðRW†v Vïºå¡€YïÐ…lŽ9k hv²@)¸AÝ$]d04¨«ÎóE†~[Tì×0&7ƒ´Ú¯Z„'Í[Ž&iöRMõ$é"ƒÁ£–b¯°¡wÖ9‡âpífƒ›v:ètÂX›yiü:ç°×'Þr4I³“*É ê&é"ƒ±A] 9<Ó°¦Þð|ô­À”lû«@ò`ϼ´•¤ÙK5;nIÒEcÇ-ÚMt–¯Þ íÇzCpzºº—梵Y_oØëo1š¤Ùɵâ†u“t‘Áذ.è 놟Îr:TϰvÛ³Ö£æá7’f/Å´ÜQK’.2;j§2^.p¦kxï¬ûïüÇÞœ4]†|Õ^ƒ*6´ž·9 …TšÙ 4;Y›ÑÜn’na ‡p}áú59Âá+p„ií8¯™7'‘4{)&rÇ'IºÈ`ðø¤³zÌ¦Ê b<¿M‚ðÙçú,³&=˜¾ÂçL><’ƒÕ·A ‘Ù+4;ß>a5¾(]d06v ®0>÷¢·Â+8×Ú+x£‘û6(I³—b:îp%I·0À±Ã•ðê*ó%C ï{O¬zü‡O¼6'¨Öºü2*ÞQg’f'k³†¥MÒEƒ£´ºèI¥WÀž}Ø ªESj«ë "ìt ×2ç$ÑNº){h“Ä[8ÐWÕ†ÑM'r ÍѹPU~áÄÇ1¸½0"±Ñ­ƒ“h´nAíe„ŽNâEcãÀûýnñóša‡çUŠ A9­ÛCPè!D=Ì.‚$ÚI;•b_’x‘ÃØá‹SyâÁÑÛ ê\„¶]0ÖŠT¥p×»§¤‚¹Míe„žNâEcãÀ¶8gWƒ{¾3Õò6rnòÆž¹Mí¤Z³0I¼ÈaìÆá,ãE8ûñ"ÜR¥ÐÆäWÁú‹p‹B1g$ÑNFh;œÄ‹ÆF‚]±¢Õ­ZÑú¼mdA¶è‡56jH^rßw ‰öÒOÃÂ$ñ"‡±CWljuŒ›ZÝÇM­ó…ÞV jr›Z¥÷!Û5Ì¥l’h'#ÉŽ÷&ñbp¼·XºäV-]:rΕ;—Ú85µ!÷éP’h/Ýö³ÒI¼Èað¦Øºä·.¹[—p¾ð°Ï§–‡R±uIz@)$Xf¨éÙN†h%;â[yŒùz™Û½<½ÓûÓ¿ÝI'rÓ“W9¡oÕô4?lÀë+‘í¥¤–?’É.<`ìX&üÂBIOí÷.ZŸ¾úûîéæV_ýf÷^}»W¯ïîù“OÿçÓßýåÏŸ~3û”ß}þÅÿÊœ lØÔ¯e/a⬗:u³ãÉ7u€l'ûDÅŽ Fƒ£ÂEYÛžQÖ~ω<Ûñj2]Mìßçv"^(î£r‡ÈöRRËéd#±#[T·íÉê6éD~¼y¼¿¹ÓªÎ‹Ø¢ ¾/bUÎE¬\½ùo¯h UÙNê4?hœŒ<††ÈgI8ã,é{^äh¥3Ýâ0©næE¦]UÜ÷ç‘í¥¤Ø ÔIFC‡:A™DVÒ“JI/ònwóXéCK¼xm "·Úz¿zmà¤uV€d^uˆl'kõ†½N^yŒ 4ûâb?ãbÝ{.åy?UÊðåÕºVSÞôyšy»ì!²½ÔÔ5ˆ|’€‘ÇБOPÍß:y¿Žt*÷OÁŸT¢[¸9t Džçó°ÝRR‹@E[^'rˆlëTámÏ]«,\x˜¡Ñg#r»Uøü¢v+Qõ­ë#áIK«´×¼¹‡ÈöÒPÏ^M/Œ<†s‚2A¡¡/i¸*½(ú­63è Ö;Té”ÝUg;†½úð–=‘ídv! kev6óQ6 Àêe-V…c°ÍoV(iPƒ惇ÈvÒP%øC—,ࢡôÿ8j ´êEVï;†¢ÏªññŠqû¬¦µƒ&_·3¢¢Ï*i·¯ Éö²DË—FCãÆÊdK Ÿ×\²‹¯ø­<ø27Òq£D‡ÈvR!-øÃ,`ä1t¸ÔÆ*ÄusB¼Ô͉QK VLË\ÒµúMn”7(@2_#:D¶—¢`6ÃRÀ… €Žb†Fû4>ŸÞ4þ^MáÙTR0óÔaÛ=Oóão™úÙNJjæ–fv%]Œ<È|))Jzjá8YQ¸Û]ív¯nfí]Y¥6ÅÝÅíTBÆ©p¤¬ŽNãÆ„@ÄðŽPîe£è˜mô#2LÇLÏfJm­˜¾0™.ƒṖO÷ÏÛ*tšwãåNÚ Š;ìù@Æ… =Ú0޶BùÀ©å¤Sy½ÛÝÜÿP×û4— 7æU  ×>{#«¼Jx'Jí˜w—¡ÜËNçµ¼ìvšeŒlÈN¢aìÔ˜l§†>íW—¡@ó %>o§ ðV'ŽPV5‰²Œ‘ÍØ11XhkUªò°û6üÄ:¯b`{¹Š3(P˜ôt]®b¼P6h¿Ò”{Ùé|‚ÝN³Œ‘ YÆNµÈM& òãÙ«h©/âUÌt&Ž{=áÊ´u“(ËÙŒí FQê¦ývOow?]Wf+rsÓ~(t‘­(¿zÚoÖ5¢æ5·G(w²T'¸qêdŒlƆªMQO1kë)‡ïfh_OYž÷ô»=oùýå^ÚjšDAYÆÈfì(È…SWXÙ]½¹»ý¶Î«À++Ƹ´ #<õºÊ J­ ü~¯r€r';õ²V]ȸ°¡´‡±SeóІ²§‡6ŽOþ©‚®¿„W ÏÛH)˜÷ä¡ÜK[¡E TÈÙŒ) …¶žà ½Ê~ñÇϾø·/þóÕï?ûl½_Q¨¶æWœr* ’«G=öºf…ЮAÅþå>–ª…lV2F6c£Õàrüîô‰¿³³ßüÊ_|ÞS4Å‚ ÜK[m›((ɸ°¡§~ÆÑVŸ£  ßœò+?ßÞ‡ÂÊlÅ»­yTʨ„¾¸©~_çUœÐ`€w.äåNv*U ´º1²­†¢bk+öGV_AQ±o´újyÞR¢fž'õµ†GPW±𦛲ÇL·˜†Ä¦Ž%„P²E'M¹¶¡…AQÆÈfì0ÈÓ¶nòÛëÇ¿?<=<Þ¾¹Ä¨í4ÞÞ\ää_¬“)q±•s‘Aç¬æ++G(÷²Xß·Ž2F6CãÖ d Ãç—îó™®Ês‘¾¥™´^¶˜‹¤)wÒÖ7ÑÖ$ãÂF  ÅB[ë6ÿøN½«r*A§77œŠ²*u„uc‘AѼœ§ù˜)A¹“™*ѵN2F6c£Ö¾(Ýûµ¥û#‹Œý¥J÷J9ÌWÝP¦M”dŒl†‚VhX]éþÏ_=üø}%¶½Â½ ¯ÉàUL~]T"aá•8£ja¦åNfªeÐ:ÉÙ Zƒ°E¦Bß"^‘©@¦[\g…¦NÅJ-%ÿ%¯”{i+4 ¢Œ‘ÍÐ!PÐÐ"S±U™Êãîªö’WPê ¦*á­à­KjSk¼wM¼ E¹“Õ±N2F6c#Ö²þ$üö*úð^0é.³L+‡²M}…¤ÜK[m£(ÊÙ  ÅB[«¼Êϯo¿¿ÙU–íçîÛr+­ÎƒöÒÖº/÷ÝÊü†JQîd¨ ÕQÆ…¨V.!` üK‡Wt¦ëñ2neÚ™e[,ǧ)÷ÒVl%#›¡ƒ  UºÐÖ*lwýÃÕýýÍ]]º¢Åö@0éóPdxcT‚`Z ЦEºBRîd©V·Áª“Œ‘ÍÐX5(ÙRÍKgí ¿úB~eªÛ¶X8IS®M”d\ØààQ)¢ ¨šµ¿{ûýÛûÚù•ÀtsÃönR›ÚÀ@éÊaû½®µ¨Ø“”;Y*š6pu’1²®Ö:[ª6/ÍWl¦kr¾b›ú‡S¯t m¥(÷ÒV×( Š2F6cGA:sŸ«ò•×÷»ÚÍ` aƒÙŠ r£Íï‹ÚlÅMî© FRîd§ÚÀÕIÆÈfh¸”9þ/µ‡‚nžµoZ²7VhlÒ\LR¾M ”dŒlÆŽ”(rkQ5kó4',•ÙŠÜÜ´=‚UÊ›„‚I_9moœT¶ÉP$I¹“¥zÛ¯N2F6cãÕFçøÏè•Eû#ÙŠ1ò2Ù Hþ_‹l…¤ÜG[Aˆ6QP’1²; 2ùHPø\U´³ûI~#꼊1¬Ù[/E®­UY³ŸbçZd+$å^vŠmÐê$ãÂÆŽVë¢f¯×Öìïp ´.4µJ€ Æ$åNÚ*e›(ÉÙŒé¢f¯ëjö?ï~¸}°•^e‹ûiZ'{][±…r®ü7°S‚r/;Å6Xu’1²«6®ÈUÜKs“éúœ«4Ý7 V†Þ$W¡(wÒV¥Å@QÆ…;2®ÈUèuC§s•Ÿwo¯¬t+~sÉJp+á•÷²‡G€µÉŠµÆš 'Iʽ Õµ«“Œ‘ÍØ`µ„l¨^º,'+Ò^æB¤ ¹aŒ¢ÜI[µjE#›±ƒ is!PÚª½`óZ°Êíøûšé¶Ü bÈVDÞÜ"Må:0@([TVHʽ Õ7ª£Œ‘ÍØXµÍ§\Ãç•ûgÙŠ”á\²—²¥c±Áw;ߢfORF· ƒ’Œ‘ÍØaUPèkUÍþÇ›ÇooßÖ-š«7W³w•Q. Ú[YY³GaD““ö4åN– ¢ ^dŒlÆÆ«!.‡Ï+–#ÕpJXP8h3¹BR¦M”dŒlÆŽƒÀå8\U² Êü¨U[·¹„ÅIëщäVÀV&,(…5MVM’”;ª•më$ãÂFŒ X[,|iÂb º9_iÚ † t›ãÃ$å^Ú ‚ (cd3vd±HWèSÙ§[Œ¿{ó·§ÚtÅm0]±ÎŠ<immº¢…Mê+$åN–в bdŒlÆF¬¡h1†µ-ƇW‡ÀW^(]N·h#)÷ÒVÛ( Š2.l`ì(Šc¨k1¾¿yúÿ…ÿveº²½ãàVð½t¥¶Çšöе0TŠr'Cuª ^dŒlÆÆ«ÑæíÊý-‡Ú¢¾[ñÖ‚o‚‚Q”{i«mE#›±ƒ Ìw‚†UíoÙŸóªó*ˆÜÞÞc:Êí-N(íu‹Ú I¹“zÝ­N2F6c£ÕXTíqmÕþYmÅt/tÓÞi£ÍôÃùµ•¢ÜK[±M ”dŒlŠš=ÖÕìï_âU¶X±·B ¤^0¬­Ø;½ìk`§å>vj…iV'#›±Áê‹üš?óå*N](W™ú›Ü´')÷ÒV×(Š2F6cÇ@Næ\Å©ª\åêÝÓÿWçTœÚ`ªbÅ´•==Q›ª€qªÉ8$I¹“™JhƒT'6fl¤Z÷†åÚ{ÃæÈÜŠºP]%(:ˆ&õz’r/mõB (cd3v$‹{òîÞðõý÷Wï^ßV&+rƒ'‡åtÅ+×ëeíÉag¥FÛ¢^ORîd© Ú@ÕIÆÈfl¨Úûl©Þ¯l/>Ó…œ®ø¦~Å#b“Ú I¹“¶‚lE#›¡£  UEºuÓWov?Uf+°ÉlEbº·b…®ÍV¼¢IÅž¤ÜËN]¸:ÉÙŒ W{‘k ^®Ü`ülhEæêŠ—y…±lY^1ÒL¾±ÁØ M¹“¾ZÕ$ Ê2F6CGAA­Šìš.ž¼¹»ªõ+àÕwO]ÕNä7FÝã i›\¦)÷²Sß®Î2.lÜØpµ49þ“æ¥Cöª ›û‹Ûz• üÚ7ñ*åNÚŠºI”eŒl†Ž‚‚VA¡­UýÅ»ÝÃmuº"aƒ Æ`ѤaH+u]ƒqP5«œkP³§)÷2Tß®Î2F6CÃÕVø[[³?|ÌÞÊ¢fßò˜½‘(ÛWhÊ´Õ™FAP”qa£‚Šš½¬«ÙOn¥ö–}à¹E Q@FÁ*köF aš\‡¤)w2T/š ÕYÆÈfh´\1cïÖÎØYï.4cž·µR¶p+$å^ÚjÚAIÆÈfè (hh1·R7c?×ì¿ ¿²rve‹cö!öð6Á`®rÌÞèð¿¥hƒ‘”û˜* Ù®N2F6CÃÕVi—"@Eo®ÈW Ó5Ù[ž³7Fá[ˆ¤)÷ÒVh%#›¡Ã  UªÐVò·žì1¾½ᄎtEØîV¼ŠÒT*®„÷…¨ó*F€V¦ÁJ0šr';•ª \dŒl‡«çË3ñ3¬Ölš´J¨Ë¤+FN{ ´‚Ñ”{i«m%#›±c 鋈>9qÊ«|ùpýåÓ—áßç©.a |as®EZëP'$LÎWk\‹tF«’r'cÝ{Þƺȸ°QcCÖZçPÓ—œªêöÚˆ ¹eÛ$,å^ÚŠ¡(cd3v ¤ç“fñ3iY§\Kp$ßUEj£·æVP:å]:iõÜ—XãVœö¶IÝž¤ÜÉPµnY'#›¡!ë©Ç Ç€ôšS^–½[ñBÎë<øµ•¢ÜK[]£ (ʸ°Á±ƒ å ÌWá`ovW»{Y™¬øíá`ÓH¤sµ8˜ Z ¯Ð”;Ù©1ðêÿ—½¿’ã¸ñÄáŧŸOŠ|A"3صéÝõc)$;ö6–šY|<$ç8#É^…þ÷oVu Ô »§rîö®e6©E |ð¶È¸°¯ë¨ Öo^q»Á ­uv¥i7X˜Öð¶Ø &S©M D2.l†ŽÀ®÷&¯Æ«üûÍÇ÷7·ÿ\[· 8¾è©b<½3*ÇW¦Åú¶Å°½L¹“­†Ð³&6ccÖ×ÎÍ€jëñ ­ó¬Ç‡èœ-NË”{ikn‘Œ ›¡ã ¢UikÕøÊÜVyzC¼Àñ•#+܇P9¾’’/ùp‹„E¤ÜÉPÛàÕ$ãÂfl¼:¬Ëa˯7ޝ<*ÜÇ•®Ê›-ÜÊ4ƒÚf*R¤ÜI[£i‘Œ ›Áƒ Ç‚ ùFÐÉýøo~xu÷¶Ú¯¸Ëœ_ kÕ>˜ºù•à„& a2å^–›Ö«Œ{686` ‘ …òë;'ͯ¬é ¤óìœ Þ{ƒ-€0™r'mM¶I´Ê¸°; ‚™¶Víœ|wÿúáÛ:§éN&H™œ `ÝÂÉPÈìNMª›©H¹—™Æ&xõ*ãÂfh¼Ñ®]Æó ²g%+ë¬ý¼bê Õ•€.ZœvD©k«H¹“¶f×&"÷lìØ!ÚµÃåþýSNå/oª3”ðx§q=æ…hêú‹zS¼SƒF0™r/3MM êUÆ…ÍØP5¬%{„­%ûGǼX¦ÂJöM3•Â)@hâT$Ê}´5×&"6c‡@àY^]W²¿¿yý݇ûº[^—X¯1ºµ *ëõ“ªå¹ÌÜÂPSîe¨¹ T½Ê¸°ªŽfþ¢ TMDF{žþâ0ð-ú‹eÊ´ÕúFAÐ"ãÂfì (ZÇ´µª¿¸üýÕ¹”h/°¹8ÆÝææåeQ×\0˜`R øK¤ÜÉHiƒR“Œ ›±QjDáFøëQMe­Õ£Ô,ÓÂ¥D[’Ã-`2å^Ú m ’qa3v„Èà/yjótMå‡×+Œ—ˆa¦ûQå„Jü«Ä˜šTêEÊìÔÛ605ɸgcƆ©c`‰ŠÜ­V—¨à™•Eß"Q)÷ÒÖÐ&"6cÇ@Y¢"ß]=¹ìÞý©¶ªñ"s4ëû¢2W™zcm“R½H¹“‚mƒS“Œ ›±qjŸÖŸ6î/ö‡Kõ>¯û-š–êÓtâ¹ ü%RØ&"÷lÂØ1Ok ÐçªýÅïJª•K[ò./.¹Ê\LÚ?‚X·¼sl‚€É”;ÙipM`êUÆ…ÍØ0uö«WÉ~£W9rl%Ãy¼ 'ÂtwC_[%ʽ´›Ä@«Œ ›±c ìW¯’¡Ê«¼}÷®6UÉp‰N¥„´³«t*h}jrÁK¦ÜÉLÑ7ªW6cÕ)¯Ce)oœ¬?€%¶4©%†ÓÆeçZ8‘r/mmB ’qa3v”r`ÚZ5Y{÷×J—b.pª>Dœ‡íö<ÕMÕOà-րɔ;i„&(õ*ãÂfl”:3ô+oE¿Žå)gB¿ƒw&7è)–)÷ÒÖÔ(Zd\ØŒe†~å:ôë?nß¼º«ÎT.þšjn»‹éûGP %ƒŸokªL¹“¡¦Ð¦^eܳ±aêë˜r‚ËZŽ Õ§°öÊ´U™òs[,k‘)÷ÒÖÜ$Ze\ØŒ¥ÀòêPµ¬åûû;kêœJ ¹©¥DÊT©O¾nSK²;{õpÿðñm±®ÿõÙMJr÷êÍÿ-OtýêîíCß,óûO¾²ú:úÚ7ÓoýjzbO廼ƒˆÄ‹÷ožDàÇ·o¾›CíW·åíQþüãJdzƒr.ó3§?}L:~ú3­oæ#ßÁO¾ÃŒbµ Ýï=þêÿpæ“/“}ÑW»þÎ/¾;)ÌO' ÁëîÀ(vyk[㌉ʯí½pD_ì5ä}m±niŒ?ˆ?íSSÃÈNW9ÛüF¹O"ÙM3!+kæ"1#É‘T3rÕwgT³v™¢ 1ØCèµK@^Ƨg`ÃÖŸYtñJ‰d/‹Û=u‹sŒ¸Qc‹391‹“O«m페)­Á{£öˆ’"YÔû”HvSÍ ¦,ÒƒÑãã¸j>gØó—ÎÀäs¥–ßüë—_ÿAÎ-—?Ú’\ÎßQr.dôÁ±W9^ñQy¯™D²—º9TV5½tÄ@L2BäþA>X“,ÄæÛ\‰³n² ‘즚¨º,ÒƒÁC—u&`þ ´ `¦uqÛ’cp \‹Ýo^àpWèÒ48d/ƒó󔫪ÁáZœÈùî8gB^ Îà–éÿƒ‹bfJ±¹/@tÊ·'%’ÝT3j‡)‹tÄ`ð0Å çªùœiÿO}‰æ"}_ÎÞÏvo·ú?ÑÑí‘–Hö28ðÚHí"1©u_Nnozj^Àp#‡‚¹éú‚âÇcÔíMHvSͤ¦,Ò- âàaŠ ÈUS«zÖγµB‹Å€9ú¼¦ ¶·Cûìò™‰d/#   Þ.ÒƒÁÁ[gY@æì–"ó£ºËf¼¬m®¦Ä?ºu‰d7ÕLÚ¡Ë"1=t±‘«¦b‘Ù¹Ë+2—ˆÍâ Ìæ"3•QŠ‘Hö²8 ÚHí"1©u‰;ƒ¤Õqär{g€¨=#‘즚Y;NY¤#£Ç)‰;ƒ¤é òE:ƒl×^HS~«3œò6a‰d/‹‹¨ Õ.ÒƒÁ¡ZïÂÏìƒÊlËDÉ7n ~~hª¦@²—j&£§,ÒƒÁãïXËûª»%7ï?ÿã7/_î‡,¾x÷ýÛC>ã—Kfžk[D¸ ŸM„×2¨ñvóÍ’’Ó&§[y–Hv3̨ é.Ò- ppH×x`å=/.â8à3ü#Ÿ]XOe»ÐÆkXkÁZ婉f/õÌV½In8 ÓϺäŒ|öº.‹0 ý¼¼’Cˆ.¦ÕG”Är{«ê¬Tʳ ÍnvÕLJñˆÃàÐ.ó /lzrUÚ²ºô<8»Ô¥m£Ê´³èPù’•H³“†zãÔ[èñ2œ?’†2OAÑS€túÒpºëò‚V%í`côÊm±"ÍnúÔ»ôñˆÃàqLðë§ÇÔù‰Àš..×O¸ü:7æUCÛüD@ói/M;”hö²Ã`µ¡`8 æYƒ§YŸZ¨øÄOXhî'Ðâ.oQÔO‘f7ýDí8†Ä[8„ÑãË iA>ÉSé'l¼ú‰d&¾ŒcwÔu›ŸØ)•nƒ¬H³—¢Sß齈GFÆsùÏb†Ó¯·”³Ý¡röD¨y5;Û*[‹4»©&j‡0$q9„™´˜jn¨eÿËí‡?¿º}ûßóÛþåËo>||xûþ/»_üææÛWßß>l+osyåmç=æLGórÚ\ÝÎåû^¹j!Òìe¢Ñk£Â$qF`QÂÿqBHͳŒiW©G«Û%í¦¡Q}8ÉG,FpfU®¢§üȆDƒ½&É…dØ:RƒÞmN4öZ¥‹HÉD{™bõi'’X Ž £eØ0ÊZ &…ΟÁ[DˆY¹È-í¦¢Iýª ÉG,Fh,+s£¼e¿Ò[¸k™{ò1K¡Ù^æÞk•..%íeŠ9hÄ«| !ÆÈ*ÝŸWéFN—UºuDY뢳Êg$d¢ÝT4ëo/ò‹ÑÞ´‡rÓ^¥·H×b÷îÔP‚µ) q{±ÛÚ¢©Fy,O&ÚÉaw`A×ùˆÅÈ`ñTõ˼ž¸©’ñ¨Öq² ˆjä+\°Ñ+OæÉD{)¨5êá É·(h<œ ¸‚jâPæŠCí2 ËÎÒ…TCù€!+‰v3Elpr/±ŽüBd”/DÖàPÑšö8TyÓí£D2Ñ^*êŒz8Cò‹ÁÙÈÛ÷¢Ü¾Wç-¢½£˜«‰õéÌÛQX²òü¶L´›)FuH˜ä#ƒCÂyG»Ü4S³D0Ä3T-‚‰Þ)/Ÿ•‰öRÑÝÞOU%ùˆÅàM@VµòѽÊfÚx­ZÌ8”Il;TU‹iA÷¸L´›)&uH˜ä#ƒC‰çiSnq´j‘xnѪj.¸¬¼ðC&ÚKEÁ©4$±< I<·Hš¹Eºæ#: lM¶‰5¹E,š””gôd¢ÝL1«ƒÂ$ßÂB>Ì2Ž)î4éƒøÓV!Q)´Ï-Š¢g«<¦'í¥¢Á«4$±< ‰‰µaD¹«‰Jéê-b°ÌÚÅiâœËmô9[_òmq€l7sÌêÀ0“˜  'Ï®â%y¿Ü'>ãÅßnŽ$À(ƒPHTv9»€r’q€l/MEPm˜„ ?xt“|äšzêHž¸Žö¯7ßßÜz÷Å›ÛÛC¾åÅÿyñë?þáÅŸ„ËH ÖuñBF÷,d§ÝLr›¯éMí?8å+ÃUÈö2ÓhÔ±c&!1=ŽÜ¡Ä­åQ÷”eíS‘yÛª*çàƒþ­¤d»é*4~HBb2xð¹K‰u.åýCñ%•þ$^¢?ñ>V+Ûý‰³Þ„Ê«QÕF‘íe£Éj£Ë\Bb28¾œ »U“­x«¦âlw¶k)²Õ ë-:Ÿ½ò™Œd»©iпã²JHL{²u\MÅJÝ­O×…d»]ʺé²I<ßÉÙê#v:¤ b"ÛËø²ÓÆ”¹„ÄdpT9%bÉWŸ*î(¥lÛû(9’S?¥t€l75EýPf•˜ ʤÄ,¹šXå#R†3ùˆk%’ ‰]ó1)²ÌâÉW÷öj¥í6d²ì1¯s•paâFF”§-p‹×˜~½ÅiØ½ÓøÜ|©ƒMÚÒ!²Ý”(êÇ«„ÄdäØcRœÈ”Hé•^Hų½Ñ÷åïÿE~¡ïÿdËû|úŠÚëÜFºaQžHØþ6—M%žÕ×>D¶—!ZʆÈ%$&âô †hµ~ÍÀˇӽ²Ç+ÙQ†µ[¶QûÓôÀƒ‹Î뺌Cd»ijÄšºHHLÄ¿û‘4¹¦žj™•«Þ¿ûâfVàE‡¢Íþ‹βEQÖ:Ø (¥˜mt9`ŽÊCzG(÷²SNÙN!$ññüqLµ¤é«©š|ºúð‰SyÜUË(çµÑ¨–½æè¼Qñ>B¹›Ê&í èBŸÁã “WÙS•ѻܽþñûwuEm;ïN¹0ÿ2­­kQ»¼66,fmóÖĨÝ'u„r/cõÁ´0ÖUÈ…ˆÁÕ8ÆjOZÒs“æ_l6gñ/Þ–6+n¡ÜMes“h’ø Ùij—T•½¼þxóæþþ®ÒÃØ|yŒÃý"ºåĺ ÆGF{´ãå^æ !51W’øˆ»×Æ1WÃ.LmþÏìÇåLpçñ0Ѥƒ.2v„r/• ¦MPDB.*›Š ð¤;ˆþ𔇹/ý±vÐcú˸DãØZ’é¦W¥‡Á’3+?B¹›¹¢6–ý !‰Ïàp¶ã…·µðr #sp¦&F7­ôk¡²å^*‹¦QP´I|НÀ¸º Ìïîÿòêîm¥‡q—X…A7’]ŸAe¦èÚ&U™r7sM íUHâ3:¤m ÍéuìŸx˜Ç{9åæÙ÷Ï<™bMr‰r/•¶QP´I|ŠŒái·ìOæ0¿ÿðíßksk/ÐÃØÙùÀœ7šõ ŠŸÚ%CÚæ*Sîf®© ¨½ I|µ}dÆËþpCÆsÊ«‡ñ = ØòNåþ±#”{©lrM‚¢UHâ3xPä#p•­ó0÷wo_ßÖæ0óúÔ ó0J×Ù8ë±ÒÃø!Ì·º¹Š”»™knj¯B.|äBä@æêä0Ÿe×Bɼ‡³ä0å™#jµ¡ÜKe³o‘Ägô Èó Hîÿ?]éÿûÝßËÏYëc|¼<S„¶ÜÇØTçcÀï@wøåån››ÀÚ«ÄgpX3Xغn2pçÁɬu÷9¡ÜIeÑ@›°ˆ„\øÈµ‘T¸ÊVe1_ß½þúáëòwôPëeæÄïÒ¼L‰™Ýz ­Ìd`šÀ² êý2å^&kMh{’ø m;Þ³ì¶ö,?ê(cX™c=ËM±²àÁCjáeDÊÝTÚF$$ñ<0r¼gÙÕõ,ÿû¼;øŸëSwmËMH†•ü+Û–!%½òV–#”{Y¬³mÐm’ø ŽnËâÂ`7¶-?Je"£ìÜc3ládr,¯ÉÜ`ðR¦ÜMeC›¸ˆ„$>ƒÇEÁ²¶åyÚ|»“yõæ‡Wwo«û–ƒ»Ä¾å~°<&˜º¾å€Þ$hQó—)÷²WïšÀÛ«ÄgpxxͶÖüUd€Sn5p1Áº»#PØ$*Z…$>ƒGEÀkþPYó¿yý݇û‡Z¤ìkþ-?Ø[ÜMR0˜`RƒzŒL¹—¹‚on¯B.|ä*ú0æjr`·QsØXów‡““Q¸ÑÂÃD[{‹¾e™r7•m‚"’øŒÅ2LeexÊü»ÿáõÇJSx^^ÁÚwÏŽr˜ uÿ0=Öµp0"å^Ö|\{’ø Žk#»ø[>œ¾øûä¶ed7[–bBŠ.XÛ%“)wSÙÔ&&"!>q온(–e*{ò°è`>Þÿ• ²CÁ—ä`XÙ"? ¼ÁÁBq:u£o­2å^ÖŠÐÓ^…$>ƒcÚÈ®9–¯99®bšW¡gŒiPë—)wSÙÔ$&Z…$>£ÇDžÇDuG_ݽ-?ÎýëïnÞ½ªu3yÛsëLÜ~Û±(šìmT>ïx„r/›-Mßf¹Ägp\ ëÏAs(ûìIÊОc2f÷Àsƒ e‡(wÓ×Ü ,âBŸÑÃ"ËJ‡(÷Ò<ñìËì:8åø¸txQ‡_"„¢¬g,d††=ñòË¢W%~™üp³(÷2Ë„ Àk.$ñ¼¶‘¬Ey`í©w '{Žá—ù§’p©—óQٴ {öBŸÁÞèëë©rþ7Yv}™n$¹×j±ÎU»‘I¯Ô{Qîf–±DÍ…\øààuDîFäèSOÎs7‚gs#¹ÄPêˆ×!Êô5Û*ìÙ I|F{»Ôt#ñêFŠÉ޹‘PïF&½R/΢ÜÍ,c š I|¢2 :È·a¸‘G++Yád>yÞ¼p2=ðäcÒ’ÄS•ùcnä“óô6°vø¶ÇŒG*…cXÅ=„šŠ;©Q¯!Qîf…©´¼I|‡–0¯‘`‹×8–|$vÑ¢mò‘MTïç:D¹—¾:×(ÊY„$>ƒG9)0¯‘Âs¼Æ/’„)ª‹K>v»—Gâsmò1é•þpã!ÊÝÌ27‚–!‰ÏàÐrâ«Àì²}j)Är²B(ׯ„)×n¢¯å^úê}«°g/$ñ=ìá{ÀÒÉ=`[܈¿x «$#`Ö£…6Ùj kÖ«&¥‰r/³ÓZ^„$>ƒCË)q7"Ÿ>¯ÉFÒ¹J!%ˆôúë$QÐ*ìÙ I|F{w#r«r¥ÉïFJ6âXlS|†)zÕÔ(÷2Ë`[AË{!>rÇì8f3#‰ùôÉgOêïMÆžË †ÐÔ(wÓ×Ð*ìÙ I|{bŽ\_OÍlq#®n$6ínc Õn¤èU›1‰r/³DÛ kÞ I|Çš3°l$˱hE6’álÙH„G QØ*ìÙ ¹ð‘7ꌤ¯ÀõU1™§e.Ý Vaßí©s#“^©µ¢ÜË,£k…5ï…$>ƒcÍÙ²l$Û-Ùȱ1‘ìΖ$—AýZý!ÊÝô[…={!‰Ïèa\_³‘ì®Ùˆà V6õÙȤWM¦ %ʽÌ2ùVXó^Hâ38Öœ#w#q‹9𤳹‘lm›iC‰r7}­Âž½Ägô°‡/‹Ëò²¸J7’.ÞXèͺú$ã!7r?¹‘ÝþþûÛÛù÷¾-¿*ªù«ŸÌÏ¿úÉþüòýgÿ3LÔ>›þ´ðû¯Ÿ>{½wÏ™þövÎß~øøîÕÃýÃǷŸþ×gÿ5iÈÝ«7ÿ·<Ëõ«»·}³||üÍÿí?ùÊêïèkßL¿õ«éY=•ïò "/Þ¿yß¾yøn~]¾º-/òçW"Ó”s™6ýécÒñÓŸi}3ù~òf«ñì~ïñWÿ‡3Ÿ|™L‹¾úÛõw~ñÝIS~Ú®-÷?ìV{Ù®ŠsáŠs8ZÅ”‡™Š}¼ýÔ€¬íí÷Âý±½|ÉgÖ~ìòAìÇ>•ÆÃSg…Rn=ufý4Ÿ¡ª˜Énš©>¹HG ÆÆ1Š®šQ-Mλ3 bì¹-ìT»î‚3f}3ª¹iÂlV ]Ü["ÙËâP½+n‘ŽŒ Q$ËR¾òáYÃd–‘eËÁM48>Îýï¢9ê㎟þž §X¶¼|¨Ú~óþó?~óò%K{¾x÷ýÛC~ãñ’ÖÂw­ü‡ËðÑÎgIÜú ¶ï·y· OÓ8’½Œ3ª·Á-Òƒ±ûß’Cd‘𼝩&‰ˆÐ:‰pÖ嬛DH$»©¦ú|ã"1<¤qìjcùðœÕ«Ÿl©(´âã æÜwÏpyaóá!7ݬÖ-zJ${\Rïe[¤[ ÞÄ–¬O,PÑs=µ[†ù;µÃ5öˆÎë6íK${©fVR\¤#ƒ‡)WM1ã©òò¥ù‚ OB·nÊ)vo¶ú?ÑÑmÇ—Hv38õ†´E:b08‚ëCp}ܧæ Oòè[ãIÞÛ¨¼NB"ÙI5³QŸ4\¤[ >bX´13ÕD«W\ðˆg*.üé›ýòë?ˆ.þhKËüµl‘Zòóž²m}’>ûù ¦ $»¡z§Ù"1Ôõ–ºÞn)>?ª7N¶yñ9Ù`rK½@²—jZý½tÄ`ôÐÅòÐÅž*>‹õ†Û¯_ÝÞ|ñþöþé©„wîÒR‰©Äa}fsi:›µD$»ÙcRo¢ßKG Çq a•[ºçÓW®ùYQ‹>ù¬‹+‰4{)§S$ñˆÃà °‘«òá9½òŸº`WäíÂN`6Ÿh^–¦lshv³¹¬^s^Ä#ƒ£¹>±¢³OÏ*:sp) §íŠYg]tI¤ÙK;½ú̉GW|fug/WÉ+ñ¥|é'?1aJ™õ$ù¸ýä§ÆgåÁ‘f/#,/sm#\Ä[Œ0òB`µhÏ‘>5i`.ÂÛÊED“ŒWžnhvÓNP`ñˆÃà  ãÚùœrô/\`¾ºˆédb¯Sá"0ƒöÀƒD³—£>c´ˆGÇy-Ç•ì&\éѪQë],ÙF{œË>*¯ivÓÏ ÞM·ˆ·p€ÁCË‘%«¸Ì§hèÙ¶0Œ[§Ž=_RlÅ>ŸY©”÷ŠŠ4{Ù!Zm„—Ä#ƒ#¼8„M#R `ˆÀf QÂ{p^ysH³›~õN»E<â0xøœCxÖœÃ/üDˆgÛ†öÁ¬ùDÛ!§R)74I4{ÙatÚ¸/‰GÇ}°–¦ÏÚ§a9Y¡Ã\ÝK (CN"ÍnÚ‰êýv‹xÄaô(×NÅ•!œk¥ÆÈ^"f@ÖÒuð~»—€i9 .ê$Òìe‡ÉkC¿$qú ì`Hù°eÑÆ£lÂáJ ;ÛŒüD° }#M¤ÙM?£z³ˆGbа(Þ•æ4ï5¸t?‘œ7†W'BÚ~¨ÙŸ´÷G‹4{Ùáî|‹®îÅ[8øÁÑß`9êd· N21?x[a+? êV'DšÝô3©Ç1‹xÄaô8ÆqÔIÎÍ+ó wEæ5Ñ9»µ:±+Ønô“RiYK4ûØ¡3ÔÑßE<â08ú‹U±1})Òìe‡Õ±ßE<â08ö ™a¿·T°Ÿ» È ¯f8ÉZx ˆ ¬Ó­Nˆ4{i¨7Úq ‰Gc ®¡šUls­b—|Â'Y>i{{§Tº9DšÝì0j£¿$qý–ElQîà­Xû'À³íNô)kONˆ4{i'Xí8†Ä#ƒÇ1‘×΢\;«Úɰ~òvr ¬…ˆh`ëN炲Giv³¹¤ô’x ‡8:Ò›8Ò›´an~@¨<êi›µ¶v>¦ÙK;ƒÓŽWH<â0x¼‚<³E9³­D˜òµ« £ñ.X\»š0nïjBHÉ nW“H³›&m¤—Ä#ƒ#½‘×£\|r‚L™›h„/Mç]ƒò6?‘f/ýD¯Å,â-ÜàQLDæ'"*ú‰ˆW?10¯•ˆ~b:³¬¼áO¤ÙÍs“ËÔÆ0ƒã¼EQ˜¦-ç#w5q?‘}{?6[å™k‘f/ýŒ^=ŽYÄ#£Ç1‰ÝˆYñ†DÌ×8]’ôÈvsĸý†ÄN©tûšDš½ì0u¤w8 ŽôšÄúšŒ¼·ö€ŸðÇü„aVØÎO$À¨ÛÙ$Ò즟 Ç,â‡Áã“×OÅÎ&“¯MƒµhØý“¶w6í”J·³I¤Ù˳UÇñˆÃàøoŽÌ³|©â†Ä<¥ÕøÜC‹Ê»9DšÝ´3¨8YÄ#ƒG19"×N½zuNçªWº v*_Þûšqsù:ù©V×Aˆ4;™ 5Nø%ñrÆ@&èÙ]ö[ÆèŽ54eh~dh:€F·íU¤ÙM;Q;|!ñˆÃèá‹\;Çèæá±³¤¢sØæ”\”#äõ†Dv›¯ í4HùêœD³—ÑY§~r8ŒñfÃö/—ÏÚÔdYš»`AùF©D³›vFõ€eoá ïùH;eÚéô*Յع*Õø„d B‚´>“7»„YƒtÛ—Dš½ŒÎym8—Ä#ƒÃ¹%\ú™}XÅÕêÌfZ¹„éè«òJ&‘f7íŒêË"q;`) ÉŠaÙˆ9Me–À–K^ˆKˆ1®w ÊÓNns ó¥eÝN%‘f/£óÐæ8µaÆÆn³a§¼²‘·@o޲‰í+ !guû”DšÝ´3©,‹xÄa쀥($rí|Neá—YBôç8Ì×g¶×f ÒmJiö2:êhí"q­M5¯¦°¥yõÑ –%$ôÍ]ƒr±Y¢ÙM;³zÀ²ˆGÆXŠB²ÖÕ„Š­« ÏÕº:ŽKHè0†µ– nv ³)——%š½Œ. :Z»ˆ·pƒ£µ–Í3”Ïšg`Y‚Íí]B´è’ryY¢ÙK;Ѩ,‹xÄa쀥(dfÚ©8ÍíÙ¦Æq yÚ¶IÃVåÄí.aÖ åò²D³›Ñ¡:Z»ˆGÆFk³–š[ùqp4¯¢mí’MÊ 3Dš½´3Zõ€eoá`FX‚aÚ)7ÐVº„p®óã¸ðüºV/[Ÿ¶»„Iƒ”ËËÍnFÕÑÚE<â08Zë<3:çE£«ÈœOÍ]BÉ{½òV=‘f/í,𤭋xÄað€ÅyàÚ)þ´u.Á±.éKq ÓNdV^În^ÒµÍ%L„Êåe‰f7£Kêhí"q­ÍÖ°&Ôòÿ:GÙÚöM¨Ùº”•ËËÍ^Ú™zÀ²ˆGX¬eM¨Ö*6¡Z{qM¨ÑDë0°òrÞÞ„:kryY¢ÙÍè²:Z»ˆGGk‹º°8,n©%Ž\j_KÈ%ìÑže–hvÒNg¼zÀ²ˆGX\dµ—k .]\-!¹lý ,Ï·×f R./K4{5êhí"Þbtyl´6%¾ð>m: Ç:Ž\óZB6à3ê–—EšÝ´´8Œ°5b§¢“æ©èt¶SÑø„˜¼3Ÿt™Íµ„é–—Eš½ŒÎm´–Ä#ƒ£µž]Ê*´:ŽÀ4Ï&˜+Ýò²H³›v퀅Ä[8Èí#i'ËÀ(f `..Kˆ¦$]àÖò²O›³„é–—Eš½ŒÎ[m´–Ä#ƒ£µ>²ò²[ÊËÇŽ/R+VÛjYj¶±¼àt Ì"ÍnúÔC–E<â0zÈë§bÙ§s˜G^–Z\„ ¬äì‘•œŸ¸,uV*Э9‹4{ÙayH-ìèM‡p˜ŸyûÉÇ,§ËüD£cnsöÊG EšÝôÕã˜E<â0x\?ý„«ŸÀBb×bÊSñ~bV*eˆI¢Ù˃WÇuñˆÃظnöÀ!&Ø19ù™}–+{‰h<(O0ˆ4»igTbñˆÃàQŒ1ù 1͉ÔÅ{‰)LÌëÕìýö=9"$哟"Í^vˆ õ.â-üàP/DÖ#Qì|*êä8Ùõþ‰kå%¢7A·ƒU¤ÙM;“z ³ˆGa€7ÓÜLW™K$wõ1§¢qõ€~»—HÞ€òÁO‘f/;Œ Žý.â‡Á±_àÁ ŸŠ9…Ï¥µA$4ò)LW•µS ÙM;³z ³ˆ·pHƒÇ0Áx®âu:/¬¹z‰hƒÍÉ$ö6°^"‡¬|îS¤ÙËSPG~ñˆÃàȯw¼‚-×QžºY#Nlã}+Ä)c”GDšÝ´3«Ç0‹xÄaðÆ;^¿–Ï›T"NþZ—˜:_=²6'[Q—ÈhAù–›H³—îîÛéÚá^<â08òx.ÏË%xŸ²d¢UŸ“5ÆE£|ÎM&ÚIC½1ÚqÌ*±ØõýôJØžPìµJ·†-ífŠQ^å#ƒ#Àw¹ëðÉ]±Œ,ƒåv ­ò¤„L´—‚Z«ͬò‹ÑÙ˜˜‚Ê•Jð)ë¬ÏÀ¾"šìrXêr@¬ñÙåëo2Ñn¦˜´aàU¾……|ú|SDî+p“¯ÈG3 î,še¶¼<” 2Ñ^*ºÛ¡¦«¢‹|Äbðp¹·8P~gÞâåËýßËË—ßüýþáæw/_¾~õðñLJò«Ÿ~ƒy¿öŸûôâÅçÖþÆ~žÂ‹ð¹1¿6ðÛ_—7ç‹?ÏßxóçCžgö:¿þò«ÿä ×åþÁ§ôrŠhÙõ ÄÍåvê¨|QN&Ú͆“6޼ÊG,’‘ïÅçíýÄÍøöƒzÖ8çQù¬œL´—Šz¯ -ò-,Üè‘_‹'—Áör3l±ì¥¸0Îf³VIpûbÙ½:êÖÒe¢Ýl8ëƒÐ‹|Äbp:òze”ë•5ÙLôçÈf\ÊVùTL´—ЂׄùˆÅà‘Pt,›‰ò@T7ýåe31Úd`mÙŠ¶"›™ÕQ·/íeÃÁèã׋|Äbtüšg3aS6óhL8YaC´¶“™†¼v.#í¦  -ò‹Áã Às™P—Ëܼÿüß¼|ùæýý«»·_¼¹½ýâÝ÷o7¸p™ŠŸj¯iu!¡&S™4XùRžL´—…¢ÕµùˆÅà vš7ÕÐñ}òÔL%3²qí•ÉÍ\HñÖêyŠD´›‚ýg‘X ã$D® "x÷DòúãßKð!)ú‹ó!)€Y±ýò feÜèCÀ§|ZO&ÚËD£ÓG¬ùòÖñLÔ2(!ÉeÜš¢Jrx´ RˆÊ÷õd¢ÝTõÜE>b1z˜ãx˜#êv%—/ÎÍ€Ái¢š½LL…›)ê¨|®O&Úˆ“ÓG¬ùˆÅèˆ5o‹Ïl'æE•³´ˆ• Û)ß쓉vSѨ -ò-,äð$åE•Q[Äâ%¶ˆeŒ.¯-b±¦ElVGíÚ½D´— g¯Y/ò‹Á1ëÌwôæM;zÖî3œ£E m §´11‰h7ú‘Ð"±<Ê|Mo>¹¦·“›Éáò /¹¼ß;4›}EáeVGíÚ½D´“ ƒ}\{‘X ŽkgËÖãeû¬+R||vlÇo«ñHk¡üW4‰vSѤ ‘|ÄbôHȲmÙ)îùÍ Ù½ØñÈd}yM± K6Û÷üî´Ê)c_"Ñ^¦hƒ:~Mò‹ÁñëœyR’Ÿ•”¸À³’¼f%.´JKœMµÑ/‘h7%Íê! ÉG,Fi2OKäb5þÂc®[º¦+S&%†aå´}K×^«”A,‘h/St¨D“| ‹06 Cʇ-µwäl¹ k©¤ÑÚò¬³Y‰öRPoÔ’XŒÐLLAåðë„õîþoïnýÇ©Ÿë˜/ùò÷¿ûO®ÂkñÃ6u%ã RÓÑ)O'¶Ë3ðÛ‹Î…à´Q)‘h7³Dud™ä#C#Ëó åÏ샸=o{ñ£bkV›?Ê“6EÛ•UT"ÚKEÁê‡6‹| 3th3ieä*šG,~L —WüHÞY:³WžÁ qot3³:*OˆD»ÙpTG–I>b14²lyµa›žµGØ0²)6OO‚àžžˆD{)h°êqÉG,ƒlò\AOmfNæ_n?üùÕíÛÿžßòÅç|øøðöý_v¿øÍÍ·¯¾¿}øâýíýS–Â=›KKX01†ð–é}a7{’¢s9iÏ/ŠD»jRÇœI>b14æ\bŒÈ–¨—°¤3$,Áû },W&ÚKEÑ©;$±<Øq‘',qÔ„%]b‚&Ñ-¿ò p{²SGåG‘h7Îêp5ÉG,††«§=—ÀâÁð¼ÙËè"›=iÕ­RÈÑj§,Ñ^*½~$´ÈG,„ÊOÌTTȬ«¾[¼.³Çh!B¶n}*P±Ì~§UÊU‘h/S,þ´)®U”˜‡¨=¯¢øMU”Gð–cdY¥Ñav‹>ùœ•;{E¢ÝÔÃ’X Îx^Cñ'k(|…guËõÉǸƷå©ðJÈS}EѪ S7ÅÇD{™b6êH3ÉG,FGš/…ø-¥Ç;3£ë×Z´ZÁ¡x·¨Ü×+í¦¢A=œ!ù0x8c=/†xµ“ŠS }=©8ŸTÜ%lôJ¨8©¸Ó*å¾^‘h'SœžQSDÆbp,n€bàvÀ[L›(×; †öõŽ’@'« D‰D»éhPhH>b1xDs±–>ø1ëÓåÕ;²7àW BÞ\ïØ©£2‚%íeÃÖ©ƒÉ$±LŽ`^0œ£8ôÊ}À"Ñn*Šú¡Ð"±=âŒÚ —ØœSŒqíÞ‚Š>à:*wo‰D{Ù°óê84ÉG,Ç¡ƒe6¬^:Ü9ÒtÙ&åö-‘h7ú¡Ð"±< Ž¥3Á šÎw‰éŒCïW?LE:3«£rû–H´— {ÐG°ù~pÛgÖòlôö õ©3l¨˜!j/Û‰vSѤ -ò‹ÁC!0Ž«è© õŠ,`òµÈ‚¹DÇ™9 ŸÙžù'Y&­Ò^¶%íeŠúö"±À¼È6Y/Ûž•°"‹ƒVþ"MU-íe["ÑnJšÕC’oa‘i¯²„“U– þ"°ÊÈÅú‹d=úÈŠò×Jžê/vZ¥\”‰ö2ÅÔ‘h’X ŽD{>âŸ9ÂÜ…Ç3&IÉ$õñ"Ñn*šÕC’X Òx>âO‡t±<^àa’ò¿ëý«ò `ûn®:*×äE¢½lQˆ&ùˆÅà@4òš<êÕäñ5ù4yuíÝ\"Ñ^*~$´ÈG,„×äqÔš<^^M>ãaMg°¢&¿SGåš¼H´› Gu šä#ƒÑ ³a¹:[U“Çx†X)ûœrM^$ÚKG“Õ…ùˆÅè¡P®£CÀ*?XºÀX R`SòˆÛ`íÔQ¹&/ífÃIÀ^ä[XÄÑl^“G½š<ž£&Ÿ)i»rM^$ÚKE³S…H>b1z(Äkò¨Y“ÇkM¾8‹ ðC¶æ1ÔÔäg­åš¼H´›)&u›ä#ƒØÂÏìÖs‰Ç³’ü9ÜE4Y{N^$ÚIGÑxõˆ†ä[X¸Á#šl•C j÷'b×{‰³»Àõ^by*¾â^âN«”Kò"Ñn¦˜Õh’X DGÇ@¬(O[ÖÔJ¢;†•m‰‹´ÇäE¢½TÔzýˆf‘XŒÑ8à*ªx-1úëµDŒ68c`½FmŵÄV)WÖE¢½LÑu8™ä#ƒÃÉq>ÉBÄ0³.¹`KµÛ¹‹ò|ö¸»H´›Ž‚~D³ÈG,Fhhä³ •î‚]͹Xw‘‚3¸öaÅùàVw1k•r…\$Ú˽Շ…ùˆÅà°°I ‹2i ~é-#›W$*5ó’Õ¢$¢Ý4èÇ3‹|ÄbðxÆ$D™| ˆËã7ï?ÿã7/_þpÿðñÕë›éÈîï¾{ȯåïù€Ó…•¿cÊ™¯>1‘ATO,g‡1h¤‹D{Ù(8}°x‘oaa‹Sf9G’7Ú?¡b'ç€Æ'³‹£vñ["ÚMA±A”³—X ådÃŽ,§ðOL8>=h˜Íšo\ÈAÃXþú³c•î”Òv¿à}‰¾µ ÝÑ^fœ>,¼ÈG,‡…S`-ô)l>?v7±Ñªf~ÁûèÔ“ ‰h7úË"ßÂG\ ž'|Îàù§~!aº@¿à#¤µH‘`û «ìs±n튶D´—Ù¡×ÇùˆÅàøofvD³«©hgÈg(Q@IÈ´¦‹D»©hÔ]ùˆÅà¡Kæ=zYîÑ«+Qäà®%Šh|´!¬³y¾Ë²µD1k•vE["ÚË#è#À‹|Äbp8yÖ¹ždßVs¯6±ƒ=ÍîÕæœ¨ãKÑn*šôšE>b1x@“<@å ¢uÞ"¿z‹iUHìašûͶz‹I«’6æ$íeŠ)èC½‹|Äbt¨72o‘ãoñx‘MæqB¯î+²þB‘h7ÍúáÌ"±<œÉ¼A/Ë z•™Eºú Œ6&ØrÜŒÛ}…›FÊŒÕÅ¡d¢½L1£6ü»Ê·°cÿְ²`ùð¼É NVu}Åô¬ÕÏÊD;)h4F;˜Yå#c3E“€+¨Þ\…5ö:W%šÏóŠKTø kó e©š¢D´›)¢6 ¼ÊG,„“áµl³¥–ýè¶ù'(” ÍQ¨©Ü'å2Ñ^*Zž¤ºŠ.ò-,ÌØáLQ%^ͶŠkÔ“½®QŸP(ï ŸÙÎÛרï´JyŇL´›)Fm@x•XŒ O÷¤Uឺk›W¸Ý4 ï•q(™h/uV? Yä#c4–OþØ“?•¹E¾V¸1zçü¼ ny*q{…{¯UÚ8”D´›)&mHx•XŒ O‡™˜)ʨÙSkÞ1º¸PLÛáÛx‹â˜Ayd[&ÚKE½ÓhùˆÅè r¨T>/ðoñû/ÿé׿~ñÍ7œð:Aá.×[$piµötépûÈö^«tG¶e¢ÝL1ëƒÂ‹|ÄbtPØóÜÂoÉ-õC}â-|>ƒ·ÈÑå°2Ñ^* ^? Yä#£4žç¾6·¼¸«·˜r‹˜ÙXk\Mn‘ç½R Lq¼Œ>(¼È·˜¢<í<Ž)Zd¦hñyËf¹»°Ñ·w“jåa ™h7õˆ†ä#ƒG43ÓÑX»lö±»°¯îbj‰ŠÁ­… kÃöe³{­R.s‹D{™"uT˜ä#ƒ£ÂXžoåѧ.>ñÎà-œ÷ˆº“d¢ÝT4¨G4$ßÂFh¸ŠÖ6E Þ"Ø«·˜FÎгÑb18*ì\d›Û2qñŠFÖ‡Çv¨ì+ÜÔ š•«Ü"Ñn ÕÃ’X Î8ÞˆáäFŒ:_áüuÞbºzÄû8'o\1o1iÕ܆«mŠˆv2Åd@&ùòJ›L1°Ìµ“ªÓ…„öÞoµ(‘h7Mêñ ÉG,FgK-V]²xýêáã‡åW?ý6óí?÷éŋϭýý<…ásc~mà·¿v9¼xñóü7>äz_º˜v3^Ú¥‹4½ïÖ¦žò `󥋽:*#X"Ñ^6lAL&ùˆÅØ`²1À–÷¹RzÀÏÀ‘æ&4¿t1=ëè¼r+•H´›‚fõ@ˆä[X¤±¡¢IìÒ…‘;Um47áò.]€ÉÙ„u•”ñ›/] „Q¹mJ$ÚËì\P‡I>b18l ž´çWåÀ€vù‡õ0W3UuT"ÚMG³~ì²ÈG,ÆŽ]ìn0…>œê›ê”ØKË?"@XïµZpn»Ÿ™ÕQyöO$Úˆ=ªCÎ$±rÃp.0[p®c5°ÂæPu'“såú¹H´—‚‚Ñ„ùˆÅèa XÅú9Øký£/Áe‚µÛÊçŠúùN«”ëç"Ñn¦õñæE>b18ÞìËI¼¼¥f«ˆOgåðÞíãÞ2Ñ^*¬~8³ÈG,g|®¢z£>_G9"&cŒ÷°&>VŒrì´J»²!ífŠI8^ä[XÈ‹þÇ1EHžn)h þ³ÄvÞЦ¤ `ID{©(:ý€f‘X Ð@Š\EņÀ*o®Þ£3×û å±ÄPá-f­ÒÆ¡$¢ÝL1écÉ‹|Äbp,Ùó~+¿©ßêè*gX*âCv9(wçŠD{©hôúÍ"ß ÐxÞnåO¶[mÈ-ðºT¤x‹€˜aHÔ Q“V¡rw®H´›)f}Px‘X  ÏL1€hŠ5¹E€xoõ¾)‰h/M^? Yä#ƒ4b18(¼Æéƒøâ¨©[çÎà-RÖhW¹%¢ÝTôšE>b1z@3ß!½q³:oáÂÕ[oáÑ\2ÂÜY±Õ[ÌZ¥]å–ˆv2Ål¬>(¼ÈG,…CdUî WåñUîœÐj_Z‰vSÑ Ð,ò‹ÑšÈš¨WåéZåž·¡çä°¦Ê=k•v•["ÚË­Ó…ùvtP˜ÏiøMs®¸zN–9‹F¾"Ùd *W-D¢ÝÕÃ’X Îx>¤áOiòBÿ¬‡ëÅïi¤¯d—q]në]…¯˜µ*)W-D¢½LÑ9uH˜ä#ƒCÂØz ϺáÊ3 g¸³”ü=+W-D¢ÝT4ª‡3$ßÂg·a Ü†Q•Y ^ï,̓y6;¿z „Š;K;­R®ZˆD{™b‰SÚ˜¢c,‡„ѱUè(7ÇÔT-Пazp¨½ÛV$ÚME£~@³ÈG,Fhxò‹rò[ç-üuú¼Fjrœë´ÚŠMè;­R®ZˆD{™"€:$Lò‹Á!aœ÷áÑÑ·UåÙœÁ[„è1+W-D¢ÝT4é4‹|Äbô€&ñ€FÞ{Uç-²¿z‹yé`ð¬Æs•h«·˜µJ¹j!íeŠ% hcŠÈX  £áH”Q»øæHT4Qy6O$ÚME³~@³ÈG,Fhøb”ÓÔy {E¢öHT ¬6× Q³V)Ïæ‰D{™"¢>(¼È·°ƒƒÂѳæÄ(ß~®É-"à¼Eò!yí*·D´—ŠF£Ð,ò‹ÁšŽ«¨˜ Uy‹ùê-Š·póZVöJ0ÞbÒ*ЮrKD»™"êƒÂ‹|ÄbpP8Z6øí–½GëÑaïG*?[í*·D´—Š&«Ð,ò-,Ìè\Eõö~DwÝû1M[„éäÅÚ?MÅÞViW¹%¢ÝL1êƒÂ‹|ÄbpP8"›äŽQm’;Æ3Lrg“cNÊUn‘h/ÍV= !ùˆÅèMäMÔ›äŽé:É=Õ-¦[ ¬n±b’{§UÊUn‘h7SLê 0ÉG,…cæ[ÞrÁõøUŒdÖ1ÙfW1ʛΫ E‰Dûè¨7Æ©G4$±<¢I¼¶–äÚZÿ«sŽvaW1Rñ2ÈA¬Äο>ñ*ƬŽNÉv³á¬'“|Äbp8Ùóâ£ßt#ÝFhϰ0» !+cX"Ñ^*j½~(´ÈG,…<¿‹á«ïbÛíuaq&O{×Þ[Wsc§UÊ–H´—):£'“|‹)æÁáäìXñ1Ëñi †•ýzo3¸€¨aID»©(è4‹|Äbð€&óa¢,Uy‹ì¯½·1ðÖŠG¶½·;­Òư$¢½LÑ}8y‘X ''Ža¥MÖÑúxfV;oF¯<©!í¦¢A? Yä[XÈgÞÇQÑÌ!¬|ÂÚà-êt¹Þ"B6àÍš[$D=Ù[ÌZ¥<©!íeŠ`õÑäE>b1:šYnq š_3©‘Ò9r L1iŸ‰vSÑ Ð,ò‹Ñšˆ\Eõr‹”®¹Å|s/ÇusEy,X“[ÌZ¥<©!íeŠÁéƒÂ‹|ÄblPسš¢3ræ“ëãÌ]8cϰ4$§é|œv}\"ÚMGQ?¢Yä#cG4E• ÓQù l»(´®KC¦åµ!r(*W, ™µJ{!¡H´—)¢×G…ùˆÅè¨pây~R[H˜ÓÆÀs†œµŠD»©hÔhùˆÅØÍ4£ÌUTo <çëøt¢5y°yM.r¬ßi•v™["ÚË#è£Â‹| ?6*ìŒ,póÏk¾ý$¹€ö• _²!k”7ÊD»éhÒŽhVùˆÅØMQ%ËtÔ*…Öµr1·ÐÆÌvL9ã¶W.öZ¥[ç–‰ö2ÅÚ°ð*±ηœÈ;NªêÜØŠòÆÝVÞH(í¦¢Y;¢Yå[XÈ;þRQdûk3êí¯Íx…¢Š·@ôvíû/¶CQ{­Ò­sËD{™âîMÙÀ‘±ΞnyËÖãÉ…5í׆L-=Þ*¯$”‰vÓѬÑ,ò‹±#š¢–<–;÷ª’‹ù>æÕ]<Ý”[qÚ¾6d¯Uº…n™h'S´µaáU>b16,ì &fŠQk%a!Õ~%¡7Á)¯$”‰öRQkô#šE>b1zDÃ:÷ʵ•„…Öu%áEYãÒzJ©¼¶¯$Üi•òJB™h7SŒú¨ð"±¶n½Y>ˆaf]ráÝÜšà•wÊD{騳úÍ"±<¢±ŽE4Vî©K.|¸º‹)¹(.sv.Øê.0Nؾ¶) D»™bÒ‡…ùr‹ø0¦hð =ØRè~tÓÛZF7°%S¶‘·˜j-VyBO&ÚKEw–UU”ä#cG4E•ø’)ù”pÝUïÖB÷åz‹˜CŒl'aòuîV)W.D¢ÝL1©£Â$±vlWTù°eWÔ#(Êf–\8¶,jnÑkã/r²A»t!í¥¤àÕC’oa!oÔII3Sғۢĥ„7ï?ÿã7/_þûÍÇ÷7·ÓÏûÅ›ÛÛ/Þ}ÿöwy¼v°°^ñÕKY;ˆÆCSd%óà›¤ž¶vp¯pʉ‡H´›•fuȘä#ƒCÆ.0ÈØÉ%û*œÊaûio_^+µË"Ñ^:¼z¸Cò‹ÑÃÖÖW>¨M{½N{O{“O9âúX`û´wѪ˜lTÎb1xLc¯½ÉÉ|RUâh{Eªbˆ!Í”§2×{7ú‹VéðÉD{™b´ê 1ÉG,ÆÝnûâòAþi«Ò ¾2ºYzá}ˆI{€O$ÚMGƒzLCò‹Áco×Q½®)o¯]SSz!åuÞ»¼*º¦vZ¥<À'íeŠÉ©cÆ$ßÂÂŽŽ'6’áÒ–‘Œ£=¶.Ÿa"cÚÆœ´øD¢ÝTõ#šE>b1xDãRä*ª7‘áòu"cZTëaZ@¸>–X1‘áCðÚÉ…D´—)f§Ž “|Äbp\Ø{Vaô°åëãä"# ë,m†FîLLQù4ŸL´›ŽFõˆ†ä[XààÏu´ö’«€Eù`®XT Ù OÀÞ Û/¹î´JùžL´“):ãÕaa’XŒ Ö5eÖ®©G{Í-#ËŠˆ­:lƒuÑi§"Ñn Õã’X ÏØÀ⋵÷õ¤ºâÕWÄâ2×¹-l¿¯·×*å:·H´—)ZPÇ„I>b18& ŽÕ¹AÞÁþô«ß–^ëÜÍ2’rÝB$ÚMG“zŽ)›¤-¶ÜÀ8Þ¡ý ²õÑ)Oï‰D{é(ýˆf‘X ÑKAKëÜ^`L«¤ò:s\ l?‚±×*å=‘h7SD}Xx‘X  ûȰ(/_Ï©Øj^H¥öÞ @ÌÊUn‘h/ V=¢!ùòYÅ‘T¸ŠÖBQB m²Wo17Eù´Ø+Qt5iU2ÊUn‘h7SŒê¨0ÉG,FG…ëfî‚¢òæ¹ÑÆ¢ò|žH´—Š¢UhH>b1x@ ¹ŠêÍsC¾ÎsO¹Ešò‹µ…bÅ<÷N«”[hE¢ÝL1©£Â$±ü2r–VAQÁž#¹ð3(×¹E¢½t4:ýˆf‘X Ñ \Gõ’‹à®ÉE,¯¨¢W(*˜šäbÖ*å:·H´›)fuT˜ä#c£ÂƸµraæ+OvþHWT!µ.šuEaòÓL®²ŠJD{©hòúÍ"±;¢)ª¸ŠÖ.wEÃ6ï_¬·ˆÎX\W•§b+ ;­ÒN.$¢½L1}Tx‘o1Å<8*Œü22Ê—‘k g(scFçvn!í¦¢ Ð,ò‹±š¢J«¨^™õÌ8L,·@_ã-f­ÒÎ-$¢Lqº´ÝƱFËPa”7•b1z@y@#_ «óéZ枎\`6†çXQæÞi•r ­H´—):§ “|ÄblPØE÷(/Y¯iŠŠæ UîèCÚ‹¢D¢ÝTõšE>b1x@ pÕ«rG{­rÏÓÜ1G»Îça®¨rÏZ¥½(J$ÚË‹¥41ÅuQTùÏà pȬnò–ºÅ±c¬…ÔªÜ1ÅœŒvn!í¦¢Q? Yä#ƒ4/òºÝó š‹¯r'3mêY.Bª¨[Ä Ák÷D‰D{™"€>(¼È·°ðƒƒÂɰ4?É“ZO_ÅN"%».l«‹H 0£vS”H´›Ž&õˆ†ä#ƒG4‰·y'¹Í»Î]$¯î–#¬ÉE‰&¶»‹V)7E‰D{™buT˜ä#ƒ£Â1±ä"¦-ÉÅãÛÝŠJ,¹hE%4&j7E‰D»©hVhH¾……<ñ6’Š®¢zMQ1_›¢Jrá³3–AQ1V$)牎²)JD{™"uT˜ä#££Âüôq”[=µÌÍs‹ˆgÈ-r˜ŽZ)CQ"Ñn*šÕ’XŒÐ ¯­¡bnQ^•×Ü"–ÿZd‹#Tä!»¤ì-D¢½L1¢:*Lò‹ÁQá<Í—w¬?9·°œnû¥å`lôu½…L´—ŠîBM]å#ƒ4 €«¨âÒò®KËSp™oŠJ~{™ ø0×ÊUMQ"ÚÍ£6(¼ÊG,…£çH”ß‚D=¸Hœì D¥V¾"˜i­²‚JD{)h¶ÚáÌ*±<œ)®+¨b‘;µÈÑcˆ&²ÌÂmÇ¡À$—²òZ™h7SLÚð*ßÂBîÇ3[üQ>b18&œ2÷”<}Þ‚Õ-²áÃÜ à§ó¶ºJ*í¥¤Ö«Ç4$ßÂÂÓð¡ ,Uú s-\`Ì!»õ­UÔ!m/\ÀTÿ°¨œ^ˆD»™bVG…I>b1:*Yz‘â³6EÃé®ÙÅtC°‰·ˆÓ†Råûy2Ñ^*ê¼zHCò‹ÑCš¸Š*f)]³‹iay άKËVd;­RÎ.D¢½LÑu\˜ä#ƒã™ß&Ëòm²'—¹ÑÅu¯‚…FÞ"ycŒòÀ…L´›Š‚z@Cò‹Ášû2ÅÚk«RnxõÑ主¡¸<Ø~m”‡ ºMQ2Ñ^¦¸;Y®kŠ‹|ÄbpX8 ânÁ¢Â/½?pW$ªÑ¸dãLV>µ*í¦ A=œ!ùˆÅàáLà÷ƒo -,÷®&·˜µJyÜB$ÚË£W‡„I>b16$ìMvÌåŠ|MnaMûåÁ–ÿÓ]ü!í¦¢Q? Yä#£4™4rÛ^•·°æº±|¸°6­{³Ë#NÛ7–ïµJw« L´—)îfD˜"0cƒÂÞXŽDÙg ç}’[Øs Q‚ú¼…H´›Š&ý€f‘XŒÐXŽDYE$Ê]‘¨¹n‘’O,·05HÔ¬UÊQ"Ñ^¦˜ƒ>(¼ÈG,…í<¹I‚e½=ƒ·Àˆ.iW¹%¢ÝT4ë4‹|Äbð€ÆºÈU4ëå®Þ£M=­¶+eöÎ[½Å¬UÚUn‰h'S õAáE¾……¼¦oSt9±Ž¨,o#}ê} ~ )çsÔ-’‰>hW¹%¢½TÔý€f‘XŒÐUâ³y²o«ZA›óµn1¯þ°&%Ö?kê“V¡v•["ÚÍQ^ä#ƒƒÂŽ&+ÄŸ¶¦ná¬;ƒ·È%ƒÖž¶‰öRQgõšE¾……|Ôd$MLEå†ôªÜbÆã®Þ"%p°^Zõ»‘å­ÞbÖ*í*·D´›)F}Px‘X  Û˜YšŸÄÁ§*$*ÅæÞ"ƒ9(Ÿ·‰öRÑò•Ut•X ÐØÄÁÒ$‚¥uHT6Wo1Õ- FLì•`7{‹½VéV¹e¢ÝL1iƒÂ«|ÄbpPر Ÿåó&¹?É-ÀŸÁ[8cBÔ­rËD{©(8í€f•X Ð8ϵ“ÜBnxõ'*­ç-¼sÛ'¹÷Z¥[å–‰v3Ŭ ¯ò‹±AaoC¢lØ‚D퉲؉*r᣼²\&ÚKEƒ×hùˆÅà ‰²ò,a]nW$ªx‹Ñ²C«ÞÂv$j¯UºUn™h/SD£ ¯ò-¦(·‡cŠ.³Z—Õf¹]nßA[’8tÑêV¹e¢ÝTôšE>b1x@ã2O³^í¼Âíê-Ðayk­KÛ;hwZ¥|hU&ÚˣхùˆÅà °c[¢ÊµYnÛ÷D²Y·Ê-í¦¢A? Yä[XÀè ÛU>èÍr»x퉊˜lÄì8U±'j¯UºUn™h/SLV^ä#ƒƒÂÞ±Yn/CØ5¹E ÜÎà-¢ƒ„ÚUn‰h7 úÍ"±< ñ¹ŠêÍr{垪Ü.‡±Î[x»}–{¯UÚUn‰h/SÌN^ä#cƒÂ.»n` Ç6РDµòÖÍòtT$ÚMAQ=œ!ùˆÅØáLѤÀTñ¶E×ÛÓQncÌÚ?낯À¡vZ¥œYˆD;™"¯ “|ÄbpH+ ‚üÓ>ù’gtýÚmÝY Àk_B’‰vSѨÎ|Äbìp¦¨’ã**ú¶*oQˆå«·˜6Ð"®g¹Ë+Ál÷;­Rö2E ê0É·°wºdІµ²ƒÙ²÷ãQG”edíºöÃ6òÙißA’‰vSФÎ|ÄbôpÆD® µ[?$_aáê+b bðëdžÏÛ·~ìµJ9³‰ö2Eê€0ÉG,„$ó Ÿ$«©pža2Ñí–ˆªª¨D´›Šfõp†ä[XÈ«^RQäá êMæA¼NæMsÜÑfà™E¨˜ÌÛi•rÍB$ÚË}P‡„I>b16$ì}d8”—ÃÌŠQ…žÁ[}·Ú“y"Ñn*šõšE>b1x@ão·åÖU¸S¾z LÎæàØ¶r+p¨V)ãP"Ñ^¦¨ “|ÄbpH8ðUÐA^]“[w†9nL©è¹òdžH´—Š£Ð,ò‹Áš`YúœÞwp×9îi£ ¤˜ÙÖ`*æ¸wZ¥<™'ífŠQ^ä#£ƒÂl¹gù ú¶š9n˜F[{‹h,zíÉ<‘h/E«Ð|Äbð€2p3¡:oaìÕ[`Ì&»ëd̹ÜFo1k•ödžH´›)&uP˜ä[XÄÁAᬑ=ÈCZU¹E8ÃdÞÔÌáµ'óD¢½T4:õ€†ä#ƒ4!°€fnyÕòá:™7×-𓎨à+&óvZ¥\å‰v3Ť “|ÄbtP8°¢[:¢ÂѺ¶¿„TrØ@{2O$ÚKE“×hùò¬ÛH*¹Šê]Bòx½„4íˆ ²]½…‡Šž¨V)W¹E¢ÝL1«ƒÂ$±ÆÀJˆ(×äkæ¸Ï0ÇÁäà•«Ü"Ñ^*š½~@³ÈG,h0 WQ½9nÄë÷ŒD¥éÌÏúX bŽ{§UÊUn‘h'SŒÆèƒÂ‹|ÄbpPù K”OXÖ QèüEƒF¹Ê-í¦¢ Ð,ò‹ÑÏ–^¢W Ôy Ÿ®Þ¢x‹M4kÝ箂­ÞbÖ*å*·H´—)Z« /ò‹ÁAaägfP>3S•[äs QmÑve•ˆvSÑ Ð,ò‹ÑšÄš¤‡Da¾"Qó•Up°^Yõk¨I«’v•["ÚËÓ…ùvpP G¢äfÊšž(´ç@¢’)*¯]å–ˆvSQÔhùˆÅèáH”|¶Î[Ø+5U¹ƒs.¬³Ü!× Q³ViW¹%¢½LÑ;}Px‘X  G~”,ÊGÉjr‹g˜åŽyÝÒ®rKD»©hÔhùòŠúTb18(ù™™(/#­Ê-â¦ó’Í!£r•[$ÚME“z@Cò‹ÑšÈÙ·Õy‹tΛ(œ<òÚA±b:o§UÊUn‘h/SÜu60ÅÄX  ‡ÈJˆ!né‰:º'*¤3ôD¥é¦šW®r‹D»©hÖhùˆÅàM1*¦¢I¯'*¤kOÔTh h]fu ¬è‰šµ ”«Ü"Ñ^¦Q&ùr{ø8¦˜3ÅÔnr§p†›Ü Ê›Ä*W¹E¢½T4ý€f‘X Ф¸ŠêÝäNx½É=uЂe{³ËcŠ[H;­R®r‹D»™"êƒÂ‹|ÄbpP8ñ–ÆzkêÉŸaóG )Û¤\å‰öRÑlõšE¾……Üe4Šz–&¯·ù#ùëæ ‰J¢[;h“­Øü±Ó*å*·H´›)F}Px‘X  '¾:ÉvUn‘ÏÐA;)¹Ó¾œ'í¤¢ÉXý€f‘XŒÐ$ÐÈ×8ê¼E¾vÐNUnk#2$*ÅŠÚViW¹%¢ÝL1éƒÂ‹|ÄbpP¸è 3E³‰::o‘Ì9¨¬wÚUn‰h/µN? Yä#£4†#QF‰²W$ªä&ïG4—*w®A¢f­Ò®rKD»™bÖ…ùˆÅà p¶¬™=Û-³ÜG‘¨ìÎ0Ërr>kW¹%¢½TÔyý€f‘X Ðd¹ŠêÍrgwåž.­–„o̦b–{Ò*0ÚUn‰h/SôF^ä[L1 g`¹Eµ*w†3äyÚÆ•«Ü"Ñn* ê ÉG,Fh pÕË-r¸æ“·˜R ¶U0ûŠÜ¢¸ôl´÷D‰D{™"uP˜ä#CƒÂ&™õ0Yù &;à-ì#oÁÈ:6ÊÝÆW -ªnƒnf!í¦ A;œYå[XÈ'MRP繂ÖNrýâŸ~ó_ÿÛ^0Ê~-­]¬¯(OÝšYL/„í“ÜE£¦Ø[·Æ-íeŠÁjC«|ÄblH,“úèžSµ°™Ñe7,'è ‰·p]P¾…$í¦¢A;œYå#C‡3“*9®¢µW¹y‹‰X¾z‹’V$4k»¼¶_å..§d«ÊûÊe¢½L6$¼ÊG,Ɔ„Áäµj1íZWšÍkÚW-’˜œò¾r™h7Eí€f•X И¹ŠªU-ŠŽ^«óUnôn¶“¶W-öZ¥‹CÉD{™bôÚð*±ƒ,·0ò ñŠËy…žÁ[”˜È)ï+—‰vSѨÐ,ò‹Ñšè¸ŠÖæ½…‰ùê-¦Ëy Vb1z@†©¨|.¦Î[Àu§àÔAk½ã´Îmß)¸Ó*å}å2Ñn¦˜ÔAa’oa… ðZùˆåoG{¢Â:h§aܨ¼¯\&ÚKEÁé4‹|Äbð€Æï ½Ú&¾z ×ív*¼Vx‹Y«”«Ü"Ñn¦˜ôAáE>b18(ìq=KV>l¹³z4·ð,Ëoç-J•÷•ËD{©hðúÍ"ßÂB^R?’в&o/'ëUÞÂÇëÕi§ ‹`óZ·ðaûÕ½V)W¹E¢ÝL1ëƒÂ‹|ÄbpPØûÌL¶ìý8Zåö,Ëoç-0Ĥ¼¯\&ÚKEÑë4‹|Äbô€†§¿^Në¼E0Wo1z3aæì•°}ó‡·©(’vrq€j/cŒFfÁqáâÓ˜5f±Šøäåf¥ fm9™¦/Z8Œ¢ÏÙª_æ©vÓRÐ_ZNÑÚÌÂ0bXS·ÿcÞävéû?’+QÃÚû_žwŠ›}†-:å -åÞ¨Cd{Ùc²Úð0—˜ ;î6ÜÜÆ‹¿Ý|vx´˜©3ÇmüFyà. ë8‘í¦©A;¾á“ÁÇ]‡?é:^¾Üÿͼ|ùÍßïnÞy÷òå_o>¾¿¹õî‹7··‡|Ë‹ÿóâ×üË?Íþå×_~õŸ\¥W›úÑ»ló+ZÅ;4¬Âá¸Gùÿ½º»+{§JÑ6   Z"ÛËL³ÓF¹„ ;8† ‘õ§€¼3â°Cy\éà”×Q©F;kË÷!™º•ŽCd»i*6}HBb2x踦ŠhÛ)‡òýýÍÇjwÉžÉüéw_þþ_äŒeÿ'[–é+:Þf— ­dÖÌ­ÞÅ£ ó¾Se›•Èö±Y0Æi#Î\Bb28æ ìèwùpºA÷ïò¨2bYeØÝoÛ¨2Ryð¬rßÕ!²Ýt56ˆ„HÂ… Ž y ¼þ-ú—÷ŵԺv$üB²•¦«ðnÝQü"ø“ýI˜ Iå³}‡Èö²Qëµáh.!1 O—Ù?ñ'&™;™GЖ"f;o˜¢òõ¾Cd»ijlù„ÄdðÈ' çšzªÚ.z“»ûWwo+½Iˆæâ¼‰ñÑ"Û‚ÝêMœõ&·„ºÙÉ!²½lÔ6DÍ%$&ƒCÔÁ±ˆ/È àŸZƒ7œì |5ªÀ—§mÑùìu›¶‘í¦¦I;èá“у\MO_‡œÅT„ÿò÷¿ã>¯€–½aKx‚fE°‚ÝŒ`‘éÜ‘íe|>h£Î\Bb28ꌆeh·4ö>J7˜@Ûûˆåï0Dm!“í¦¦Y?”Y%$&ƒ‡2ÈnÚ—Ï9ë÷©@gÎä#îÓŠ!Ât|”½¶÷ö’Zi» ™l/{Ô“¹„ yIÛ8öh,+|¹ à€Ûð{·ñ¹=øZŸö›*×$‘í¥FÁèG«„ÄdðèÃð ÕÈjÕknüZ¶–mmŽl^Øí›CÀeï]Òî½=D¶›1Î`¦¦1r ‰‰\cŒ ™1&y“âáâC>R|H˜Zæ}V>”qˆl/MEZhê^Bb"î¥ISkjU«Ôý¯¿ûpÿðÅͬÄ[Ë)ž«Wjh)L›€ØÁ¥6CK)f‹&•o‚öѥÔ»Ùj´ÚC¹Ÿ ¹ðAqÎ@æÊ“…ô„dáDU›Mu$'íýQžŸžº5­³ÊCä‡)÷RÚhµC¡_I|F†xj’N¦&¢ywÿ·w·¾²ÂÜÅõK%—ƒ_K¬å˜ÍýR³º¹é²»×Þ{˜r7k¹…µ®BqokÍ–Yk–—¦nÈ]<§Ü|ÌcÿÌ™¦™Z¨¬D¹—Ê&×$*Z…\øØÁ£¢l«lUóÃýýŸîî+Lv——Ã$‰¤gS—àÏÅ[ås‡)w³Öy¼RÝZW!‰XÒÇZ#¿æåkÎæ8“i Žíž9cöiÀÔ{©lvMb¢UHâ3xL#r•=uöIt0_Ý¿zóÝí]¥‹™×M^˜‹ñ¹¼+Ø„zD¨r1ÉØä02ånöšµ!í_I|Gµ3¯¿ä­õ—Çç¡8åóä0iêhVùæÇaÊTÖß$*Z…$>ƒGE™br]!æÇ¿Þßÿðº6‡¹À:Œóá“1\Y‡I.Cíµ‡)÷²ÖbFM¬•„$>ƒCÚѱ}ÚÑ‹½A¦Õyãñ,9LyæÑ:탵‡)wSYh‘Ägð˜(zžvËã»§Ì›÷÷7{¨Í`|¾83« »9çRX…ƒñÅU%í»S‡)÷²Vg›@Ú« 36¤LXÃÁòáôM‘ã 0ʸ^iYæO¼úÇ#”»©lh‘Äg온hib*+ï{‚ƒùxûÃÇ:S¸†‹s1Á”L—6=•gXçbB,1¸i’‰”{Ù«·M@íUHâ36¨ +ô—ÏÝçè8åæMÊûgžrV>ux˜r7•Å6Q ¹ð £GE–GEu…þûWïnßþ¹ÖÁ\`¡?d瘃©,ôu+ïÈÍÊ2å^ÖZZ#kÝ I|Ɔ´§÷ŸÙ‡çæ0žQ¶î¾z}Séb¬½À&›èi»`q1¹6‡Éi×”ÖÀ^ʽì5ø6 6 I|µ1±ª)ʇ‚뎜`>L#dô-r‘r7•m¢"’øŒ-e¥C̵.¦~ß#æËs0X¢e¾Ë cƒÉÎMñ}#Sîe­M@íUHâ38¨í`­šNg•ž™Ã £Ìn¡bC“§Ëq64è$“)wSÙÔ$&Z…$>cÇDEK‘«lU³òMå$LÑêËkS¶¹„t‚¼<_צœ]2`”Ä¡ÜËRchg¯B.|`p8Ûf†68yÃT]Æ™ót‘e— B‹.2™r7•Íâ¡EHâ3z sÛÎeyL΄¼ÎY–—F] Y¡áRV¾}r„r/SM¡ –½ I|Dz½gq ÷wÅYB<Ày¼K±€”7סÜKe³i‘‹ÊæÁ"¬%ÅËG!Ny—¯nn>þæí}e—rázq»b¢µ6±[Á»º]1-à|MÝ^EÊÝì›`Ù«Ägl,;¸Ì£Áü\tÌEf‡†ÍòÇ–N&ÅòÌ›¤0"åNJ[ÒË6q I|‹\æøX®ÄÇnÞW{sqYrÅœ#®Æ¥Jˆ,M›gšÔ_DÊÝŒ5¶³IHâ38˜mùŒÝ:óhÐ’÷áyzÈrÊh|j°,F¦ÜKe­m‘Ägð Èò9[7óúãßïªgù ×Ë+ñÏcr×gP7q&#êÏò ÜÍ^S H› I|‡´aîL¢"DR‡“A çÀɦgs‹æå^*ë\‹¨ˆ I|Š Y¦²rCÂÉQËï^ß½..+} ¤ti>xkÖ6²°ë›¯ñ1LT¾ y„r7ƒÍ-€m&äÂ' lƒ÷Ì`å]TU×è€=“™–h¡þ(ÌʽTÖûFaÑ"$ñ=,ò<,ò¢œµ¼sWݨ\T.ÒðScS¯ÒÃ@´©Á4ÿÊÝÌ5·@µ™ÄgpT;8f®Á)f1sù,&Y•o¡ÜKe‹Çn£²‹ ù=Êz–Å5;åa~û_ýñ׿ûý¾øÍï~Wáb‚¿Ä$ƆV ,ØÚ$&a0 –^ ÜË^ƒil3!‰ÏàÀ¶OëûàåNÕ íÊ60Ò™™ -Œu°Áêþ”»)-´‰‹HHâ3x\ä³çJ{êܽ¼WùæÏo?Ô&1¬å‚ƒE84ôAô†'ýËÛ÷ß=@¹—­&ßÒ&!>r]c[Åȹ¹º® ƒ1Ÿ§ 3mèÉMª0"ån*ÛDD$$ñ<"ÂÈù:ùS{Éj3˜t‰ŒÉ–-A¬Ì`œ!B‹*ŒH¹—½fßÐ&!‰ÏØ€6 ›‘.6®í‡c+/aô®¼,ϲµM02‘r7•M¢¢EÈ…œÆŽ¤²|K+T­íûªþ¶%†‹[Û?9t‰­¼ôUkû£šãC‹"ŒL¹“µzMíUHâ38¢«˜&¯ëUNxž^eë:gô*Ë”»©lj­BŸ±c¢é2WÙª^å¦ÊÞUæ0 /®Y9Zˆ&°µý êš•­wÁúU™r/{µ¡ ¤½ I|‡´“adÉ>·“Œ»Ïãbüt¥:ê¯í?@¹›Êæ6Q I|FŠ,Šä§\Ì¿}õ¯¿ûꟾú·Êfåä.±•Ì$ ÀÞu­dñ-( ÜË^6µW!‰Ïà°ö®|LÄvÃâæbbôçq1h ¥Sý2å^*ëM›¨ˆ„$>ƒGEYTåºÑZÉÞW—úç^ÑËs01øu&Ωd…ƒIÆ-`2‘r7kM@íUÈ…Ž j‡œÙf²œ7n&;Ò«\\íY6“•gnmô-Jý2å^* ¶MLDBŸÁc¢ÌîM-«ÚLvÿêÝëÛJSx^Þ^²˜1¶¿?§º½dEÝ›´*Ë”»Yklj“ÄgpP;¶ }¾¡U‡É!'ƒ™šÃ4hU–)÷RÙàÅD‹ ;zLÄ·µfy[ëÉ æ¯÷Õ&d¼ÄBðüxr†ÊBr9¢i‘‰”»Ykji“ÄglH kË)ž›Á8F9¸39%ºjQ…)÷RYtb¢EHâ3vL4AzLeCUóþæáû‡··•. ׋Ëa0ùl&)ÏÀ×å0ΤàƒiЬ,Sîf¯¹ ¤½ I|‡´³a·6²ÙxƒìQ¡e»öÛ´lVvå¡;ßbÜR¦ÜKe£o­BŸ±£¢¢X<í¶U7ÈŠO¹»ÿ{í åÌzX.ÄÔW›ñë2,R®:AÝtÈ,5¸¡|€r/sM¦ ¦½ I|ÆÆ´ÑzZØxCùXcá,7”§gch±YY¦ÜMe¡MPDBŸ±ƒ¢¢XŽ«lÕ åÿøæ_ÿðë¯þí«ºV²Âõâ)G[„†u ¦¼9ª)G—“·¹Åò~™r/{Ͷ ª½ ¹ð1c£Úh2ÇɶVúbКóàd.gpÁµp1"ån*ÚDE$$ñ<*2¼Òoë*ý©_Ý_X^ HЇ¡ÙòwPYè/Ú†Þ´XÝ/Sîd¬`lP{’ø jÛÄ5k¦0ù<)Ìô¼CJ ü‹L¹›Êb“hrá#0¤²™§0òáïSþåûûéÁÿPëaòåe01{ï­c/Žº Æ[£u *ý2å^æj]L{’ø ŽiG¾W9nÝ«Ž Ã¸ó¬%óÖZŸ\Q>@¹›Êb“ h’øŒÅâó[u{•_¼ys_»W9^ä^eçùm˜X¹WyA©ÅâK™r/su¾ ¦½ I|Ç´½[ ý8w#> #‹Œ²k4ñ0 ¢mQ†‘)wSÙØ((Z„$>cEE± SY_Uèÿóë¿{¸ûøöÝÛIÚž2ï/¯âo¡èÍ:x‰Eê\óÎù=e2å^vë¡ ¶½ I|Ƕ]b؃K"ö°¡§,0Êy]°ÑòÙ´=¡Dä¹…ÊJ”»©lj‘ÄgðèÈ%ä*+FG§\ÍÇûW7ï¿«t0.û‹s0Ó` ›ìG¡ÎÁø`ì<§n­"å^Ö ¡ ¸MB.|`pp Ám¼|TANy¼Ä–Ƨؤ#R¹MLDBŸÁc"pÀU¶jðòÍûûú‚?ø‹¼Œ!zc×ÁK[7xéƒ3a¾—©n­"å^ÖBl›„$>ccÛè#ËâsÁ2Vð÷ ÎSŽ ÎOŸMTV ÜKeÑ´‰‰HÈEeóà1‘O,KU`Ù÷ß½½ÃZˆ,]"Dæ’]Ï¡ÇJˆ,¸‰V ˆL¤ÜÍZ± ´MBŸÁ¡mˆ<ƒ‰ÏÍ`€S>ÏÐh’Áˆ”{©l4b¢EHâ3xL‘g0±*ƒywÿãý‡×­MaÒå¥0“‡„õ`m ƒ8]¦jb®ånæÛ Ú$$ñÑæc—nëØå‘õÊ…Ø™z–C,Y#4ñ0å^*›l£ h’ø 9>véêÆ.çrmGYaz‰=Ë!³ídåÅQÙ³ ˜&ƒý2ånæšÚ@Ú$$ñÒÈÂâõ@²Ï3uYžy ¹Åv2™r/•Í®MPDBŸÁƒ¢€,( ±n¿rÑèµWÈ Ó œ»òzIC¨›»ôÑošä0"ånæšÛ`Ú$äÂ' Ži^ç[ëüG®íöLŸÅÓoQ†)wRÙ`|£ h’øŒñ:¨«ó¿¿yøÿ—»ÖÃ\^¡j$s×ÉþP[èÉÅ&w.eÊÝÌ5·µIHâ38¨„ˆŠ“ýˆgBÉb.Rä&9ŒD¹—ÊZh-B.|üàA¢ã*[…’í¦b* âåd’÷ë•Ë¢2• Y2Î7YM&Sîe­Î´Á´IHâ38¦–ŃhŸ ’±B?º$kZèO<¸ƒý"ån* mb"’øŒY¹ºþÏr0îâ0²h„OŒ©ÄÈ’v~Ï4°Vr/kõ¶ ¤MBŸÁ!íh˜µF«˜ÁD{¦ &…yP ••(wSÙÐ(&Z„$>ƒÇDÑ:®²UÌ«ï¾ûïJÿíÅ%0˜B0Æ"{mÔ&0h}Ä5‘r/c-[c]„$>cÚ>ÇÕXˇÃüîpãs2çI`²Aãš$0"ån*‹mB"’øŒ-E®²UÃü?ÞüðP=l¹[äviLŠëeŸ±nšl˜604ð02å^æZR‹æº ¹ðqƒÚÙ3ˆl÷žUå÷Œ2¬™oèaÀÆiÉIƒŒL¹›ÊÆ&AÑ*$ñ;(*ZÊ’î,7ןì#»¿{[}G¹0½8Œlî#KlvuYÑ·°;4ÓÀ\ʽÌ}D{’ø Žhçd™¹Ê»¨ê:•çº3`dÓÓZ¹”)wSÙÔ&("!>qô (®²UÛ•ïÿV»î2ç‹Û¬½ ˜YYŽu›•ÁØb³²L¹—©Fhg¯BŸÁáì”Y—rÊ»”MZ¦|ž.åòÌ­m‘¿ˆ”»©lj‘Ägð€(ñƒyI>˜÷¤IË?—Ÿ³Öǘ‹ëSŽÖÆhâº/&¥º>eð埶ÅJe™r/ƒM¡ ¤½ I|Ɔ´£ñkS>lÌ`ެT.ÄÖ ¦åJe&·XH&S¹MXDBŸ±Ã¢¢X«lUóãÛ÷å%Xç`¢ËKb,Äd×6²h\e&x- 2‘r/kÍØÑ&!‰Ïàˆv¶ñ2ÁÆ—Ga çÙx `§Þ½md2åN*‹Æ´‰‰HHâ3vLT‹çÝ¡jãå×w¯¿~øºü=Ô¦1)\ÜÚ˹Ã)'_·ö²è\ßâÌ¥L¹›ÉÆ6¨6 ¹ðÁ±QíhÙÍÀhå›UýÑz&/ã Ä6iŒD¹—ÊZÛ(0Z„$>cFEK3SYyýÀ)/S|Ê·ÕÍd…)^š‡™)¿²>ƒyG^‡I>c“f2‘r7smm’øŒlG“8P¶µÔ¤Sˆ©ÔÙØ&·ÇdʽTÖ¹FAÑ"äÂǙIJºRÿ»ûW÷ïm-PvÕ~¬5ëåhj«ýEݦÝ3m¬õ1ånÖšÁÚ‹ÄglX»8C6¼–ÌÆy8Ò­œì:Ó´[9Lé-6÷Ë”{©¬wmb"’øŒ-娮©š‡ù÷›ïonÿ¹¾ÜŸìÅÄ$çÝ'Cý1WŽÄ””9ÚÔ¢Ü/Rîf±¹ ´MBŸ±¡íèpµØòac5æNŒr\«1-‡.!:çC‹ÕÊ2å^* ¾M\DBŸ±ã¢¢X†©¬|ÑèI-eµ«• Ó‹«Ä”4ÆÄ@€ò Be%¦¼e ØMË"å^æLX›„$>ƒÃÚÎ9f®ncs 'sÞœ'‹N]Pú*+QÐ&("!‰ÏèA‘ãA‘«Jc^û—w©ÞÞ_tûâ’L`KôìÖg`+“˜d“3M2‘r/{EÛ×&!>fp\Û#‹=nœ‹y4u9åôØ [¸˜”LŠM¦.EÊÝT6´‰ŠHHâ3xTäÙI£ò¡n.æöϯ_=ü¿JããNÅdïýzEy:ç[éa’/°‰‡‘(÷2×òÀ™ë^Hâ36°½e¡·Ï…ɸ‡qp“£Ÿ[ûEÊÝTÛE$äÂ'Œ9É'Nî¾|óë»·ÕIÌ\¯º,ƒ SŒÜŘ:œ,87mðn0#Sîe¯É5µW!‰Ïà°6Xf¯`Ÿ›Ä§œÎR‰ %¸2Ø¢Ü/SØ$*Z…$>ƒGEÀNN”UIÌ»û×ßVú—y¥íeù—©?ýºü2‚©KaBH%¦iq€L¦ÜËX³oj¯BŸÁAm×M‚ѦëûÍ]zF9­c-ÛɺhÑ6¨ÃÈ”»©ll‘ÄgðÈ&ÇU¶j}ÿ_ÞÔç/6]ÜúþyqÌÚ&;½6êÖ÷,™´˜‡‘)w2Öh  ¢½ I|G´a`kæQŸç/x¦üeê}‚ÐÄ¿H”»©lj‘ÄgðxêŠ0÷7¯¿ûp_y€,Â%aЇaË•#Ta&}Ë!4è$“)÷2Wš Ú« Ñó©Oú þ´u3ýÁ®;Î[v’•go1q)S¹QP´I|Š‚eCÂA¾ðwòÂå}í<°B÷Ê?¶w™ÃÌ{Fï2 ¯ñ.ÁÓbu¿L¹—©ºÐÌ&!‰ÏØ`6ÆÀÏ[âF|Ì.ñbÂZÞ¥„ è[LÂÈ”{©¬7m"rQÙTMZ~¼+ T:¼¼ûÉsD†•÷“‹ºyï[ŒòË”»Ykjƒf“Ägp4k!C¿";VâG¶y¶i‰?£õ¹ D&RèÚÄD$$ñ=&ò<&òUÙ‡Û›Wß×o‹Ay YH!&ìÍQ ’e &µå—)w³×ÜÒ&!>ilH;¦y<}Ã× Ëah™Ã ±Ö#6å—)÷RÙ¼´PÙUHâ3xT”lä*+ØÉ.²ïn¬ßÛŸ¤âx–÷)§ùXÑvƒ¶üÏ ·©›«H¹›¹æ&˜ö*$ñÓFvf#Fñå²%ËŒ2[ ˜[zŸ“q-æ,eʽT¶Xx•%!>~ð (FÏUV ŠžÄÔWaü{)þeÛ#«ÂÌ{%*üË4gÕ¤L¦ÜËX³ii¯BŸÁ!í„<ƒ‘›*3˜x¦ R ¡Å22™r7•…6! I|‰ò F>íwÊ¿¼}÷®Ú¿¤xyùËŠ+ÂìÐWø´>¥s–2åNÆšŒm‚h¯BŸÁí’ø²‘‚$­UÝOŽ]gjÙFVžyFçZø‘r7• mB"’ø …Äê†!‹uÃSþåöS09\¤wÉÔ»453a•wI&¦Aö"SîeªÖ5³W!‰ÏØ`vqëÀÚ!_xØ»äÃ%þBl-ƒ¶,ñ'Êco±èR¦ÜMe±I@´ I|ƈö‘!}¨ºjùýý5uþ%wG-çn=XŸ©;jY´+šÜ¢…L¦ÜËXoe¯B.|ÜàPvæPC–¡† è˜a”ã晦þeù2 ª/2ån*Û„D$$ñ;$*ŠÅfø³<pr‘òÝÛòãÜ¿þîæÝ«Ê4&Ç‹æ/ÁsL!® Y5Ãüh²+)¨ñênæå^6ë}D› I|G´3°Áµ §—‘}ö¤=1Ò²ù7AÈQ©AXÄ…\øÄÑÃ"®¯§6‘r_¿ø§ßÌ®ƒQöqÚÝÄmüéw_þþ_Dß±üÉ2EÉ‹”ÿºÌVògÏŽ}õñí¯nžêF&½R¿Ž|ˆr/³h\s!‰ÏØÀu2™£aò-çnäæ8Ù|&72­HÐ_˜|ˆr7}MžEHâ3vØS‹Car'f•IÖ¸‹w#ÎL£’ëóM¾ÖÌz¥>Ôrˆr/³ ¡BÍ…$>£#ÔlÏlùpºdñân$ž£^??p[ž¹:âuˆr7}ÍžEHâ3z؃‰ék™å %öœZaÍ{!‰ÏàX³ ‘™e8ÝüÙS:µ¦éˆs¹>¶)± ”;ék6®Uس’øŒö k 90SéF¤3§—åF|y ¼6b!W»‘à¶©”»™en…5ï…$>ƒcÍŽåÃ7r,qîln§Iå&ú*Pַ {öBŸÁÃç˜qòå:7âÜÅ»‘ .ëÔr¦Þ o¶1Ë_Rîe–δš÷BŸÁ±æø‰áMÙÛ¬r¾lsƒõö‡(wÓWhöì…$>c‡=E±ø}aÅl$†k6²»-µÖFÂ3²‘I¯ÚÔFʽÌÒÛVXó^È…|û}³Lžz,NŸz|¨åÏrçq~à±äÞmj#ånúZ…={!‰ÏØaÏtÏ–éëÉ;²Ï8^¨ñPÞ]ë¦úäù=ÇndÒ«6µr/³Û kÞ I|Çš]Ê $ȧWÕö”N­B)žË$ô¾MmD ÜM_±Uسrá#ç£ékö\_Oí©ßâFŒ¹p7‚ |€€ìå`«ÝȤWmÆʽÌ2¸VXó^Hâ38Ö칑±hM6ÎæFʫϵ?(wÓWlöì…$>ƒ‡=»´Œ>hº¼ºð%#ör¨w#“^µ)± ”{™%úVXó^Hâ36Öœ\` [vj=Ú:o8Ùhn··qzàÉǤ5ëånú…=‹Ägð°ÇàúúœZ_þþwlá¯ÃuÒÉ6õ"¢Ùæ;71®g2Ê3¶CkÓ&Æ6·éï•(÷²Â åEHâ38´ ž•BÀo)…kÌ8W)$cÛô÷J”»ékjå,BŸÁ£`›CËÅRÀ¥—B0ùlØ&Æ®º’BÉæš$å^f™B#hyráƒCË`†òÈr†5—€ÎãFC›þ^‰r7}ͭž½Ägô°‡-YH /Y¨t#îÒ1¬Æ³ÞN,/‡j kÒ«6ý½å^f¹Û›ßÈ,Yo£CËÉ1hyÊ£T*ê>›s¹‘©%±I¯D¹¾cL«°g/䢯yð°Ç'ÞH˜Äì¹²2Mt]¶±a ‚Ë#‰PíFöÂÌrˆþÞb–Ø ZæÖŸÁ¡eˆÌ@ÜâFŽf#éln$¹Ü¦¿W¢ÜK_­iöì…$>ƒ‡=9ݤ‹w#SiX/`½™ôªMmD ÜÍ,c+¬y/$ñk†¹‘`¶¸‘GµËÈZó¸>ÙÈDãÛ€Zå^úºÛ-ÐD_wBŸÁÞ`ë«¢ öêFЉn­°C>äFî'7²ûÑß{;ÿÞ·…âWE5õ“ùùW?ÙŸ_¾ÿìÎ#œ÷?¼þîÃýÃå=òÙô/Þ-ÿbùÓù7ÊÏò_?}özÿ(ö?ýÍîú ¾ýðñÝ«‡û‡o‹áý¯ÏþkÒž»WoþoyÎëWwo&úfùøø›ÿÛò•ÕÒ×¾™~ëWÓs|*ßåõD$^¼ó$?¾}óðÝ ì¼º-/–òçW"ÓÛ•s™ÿ"èO“ŽŸþLë[ûÈwð“ï0[Y k÷{¿ú?œùäËdvôÕß®¿ó‹ïNZôÓ‰€CPî(vz¡ƒ~‹Ô^8¢?ô‹<˜àèNÔôAÌ^žš¿FÖ¯oñF­|Ö—dKÿ”HöǪ̀>ú¶HG †NU'mÌL5½X櫉1&bx¦C /¶E:AErž›)Ï`e7µíÍ ¤ mJ$»YœzãÓ"1: -ig²?³[Ž\>ª‰YN6·ÎB­uº%’½T3©°-ÒƒÁãH«æ©{–/_îÿV^¾üæï÷7ï¼{ùòæýçüæåK–}ñîû·‡üÆì3~ýåWÿÉ~¶‘<\Œß©Ã¢<ƒè7ûŒÚÇÉ$’ÝŒS½Ói‘Ž ÝâTb‰hX¤·ÌM"bóy gö‰d/ÕÌêk‹tÄ`ð&D઩5úSh¥‹ýIÎâК€›G:í½5ÉNôە郻O©ÄàX [*Y‡gC ¥`šûD§\Â’HvSMõ9´E:b0x˜€\5ŸS´úÔ@ðé ’ey‡­¾ÀOtt;®%’½ N¿çh‘Ž Žàb`î£ÊOÍ ž„[ãIÞÛ¨<ê)‘즚êÃd‹t ƒ±§È&ò\5Õ¦r ±x¶©œoþõ˯ÿ ºú£-- ów´z’O†náN¯‚íƒ9>ûy[¦¦ ${¡~3Ñ"1ÔEË@]”ë‘O­7°\]óâs*oP£Ü5-즚úSb{éˆÁè¡‹å¡‹;U|ë ·^¿º½ùâýíýÓS txy©„÷y=YžÙ\šNÁfíÉ^öèzŸô^:b08Ž‹™•0?«ÄÀS‰œZ§) AeW!즚ú“`{éˆÁèQL®šÏ)1ü"•ˆÆž+•´z.?³†JƒÉmÎ#²óH…¢J${Y xm`w‘ŽŒìò<âÀ.ÿ§Þêâ}KN€uuC.9ZÖ­9H$»©¦ú|×"1èæ7 ºùGíª–Óe“n­¶°N{ µq#‰f/ýô^=bYÄ#ƒG,žO»yÍi78ß´ÛЋ32o4¾bàm·?TK’hö²C0êøí"q¿µ&®Õ…òáY»3€‘•®¸i{‰ä@y"Z¤ÙM;A=ŠYÄ#cG1E!3ÓNyã‰C ß¿»{÷î/·5Æk)âB†¢OÂú ps)¢ä¥>*ŸBiö2Ð`ÕWa.⇱Á^k‚a¶¤Ú•\@NxÍ3f(®… ñœ÷ÚûùšÝ44h8$q=À À5T/Ñ(¯Äk¢ij¹‡µfm lO4|ðIûL­H³—¢S_”¹ˆ·p°cƒÀÖ² qåó HYËNĵ¤À w^·H!Ò즟¨ÉxÄaðHƲ3qE©ô6lbgÛ°1²ŸˆÎ²)ikíö%à]ðÊcÒ"Í^v60L⇱ak¸Ÿ0›üÄã%L<¡à~¢Q>>›l•ý„D³›~Fí8†Ä[8ààqŒá~Âhú sõ»ƒ.®+E­©ò“Ré¸Eš½ì0ymh˜Ä#ƒCÃ%˜`ñš¢Mò‹Áa°Ì Án¢¥>2ºnE¢&d¸‰£´œò¥‘h/ NÛÌ"±<’Çjàkà®5‹yzÂ[æ,Àl¯YXˆÐ(ïó‰v3Å¬Ž “|ÄblTØzYÌ&#Omxâ~ZBÚx€bZuj­òD¶L´—Š¢WhH>b1x@³ƒÜèƒøÓÖy oÓÕ[Ää‚Ïëëæ^äÞb:Êá´·?‰D{™b4êÈ/É·˜bù…È ¨âëž“[à ­´¡¦ë•s ‘h7õ€†ä#ƒ4yúõN“Z¶”]š·H3g•ä¶{‹i/}ÒÞ2.íeŠÉ¨ãÁ$±Þ­¤£[r‹£­³XnÑj«,â«(—²E¢ÝT4¨4$ßÂBþKHEÙMÝòA1·€pÍ-0N%,cå+r‹V)ß­‰ö2ÅlÕAa’X  ³Þ2-¶Ü2}”[0g1WPY;Tö%qƒ¨<{'í¦ A=œ!ùˆÅàáLàPi¡Ò:_,\}Eô“aKd!‡í¾¢¨&Tö"ÑN¦˜v+tMq‘X  »Äp(—¶àP×>ñ¡¼lÚgiB൉D»©(ª‡3$±<œq‰Ï&EÊå+5׸­ ².VàP9¸îJ™h/S´^&ùˆÅàpl¹NW‹>‡òŒ.ßšàÛx gL£|U&ÚME£v@³ÊG,hòäWöm•¹E4WocD¾°®¼ìfoጷhµOTˆD{™¢mHx•oaᇄƒg'‚O<¹#ŠQàšçÎ$0º5n™h7MêgTH>b1z@3Ï“^Eoáê-J¸`Cvk;Ì;€¶z‹lÂÜV¥jŠÑ^¦èA^å#£ƒÂìrê¤4Z5îp†Ë©Î‚7.ê"Q2Ñn*šÕ’oa‘Fh2h§–°îzÓKЮ}9S±Ý[” ¤ä€º³y2Ñ^¦A^å#£ƒÂ•¼Òê©w¶0º¸†m®ÑrçJ ­½aV&ÚME³z@Cò‹Á‡¬#Ê¡bG”ÃkGÔ\·øäb…ƒíQûßMŽ¥‚DT…I>b18(Œ<·@½ÜÏ‘[x@›”¯VÈD{©(õ€†ä#ƒ4Ès ÔÌ-â5·˜fó¢E`=QX“[ì´J·Ê-ífŠQ&ùˆÅà 0"Ûʆò’ÚºÆö'SÏ mT®r‹D{©h´ê ÉG,Fh5b0¨J$*^¯ÍHDv5Ãö+G.¸Œ)ëÎæÉD»™bR…I¾…EŽ|6/nšÍ{b1x@ùl^Ԝ͋×Ù¼’[Øœ?Y)+fó‚µó€Ÿ¦)ŠD»™bR…I>b18(›·ˆîY«g­ÍŒ°ç¹‘¿ˆrÐö"Ñ^Jš½zHCò-,Üè! ¿ÔåK]•þÂ_'.0úår,*Úš‰‹l}TÏ/‘ífŽY}ŠIHLF‡ àPž)üÄk¼øÛÍg‡õ€SÎ RyL/gŠÂ+7Ó"ÛIS³ñêƒÝLBb2x|ƒŽc§îÔE v雿ß?ܼóîåË¿Þ||sëÝonoù–ÿçůÿø‡šý˯¿üŠí8ŸûXö*›úÑ»ló+Zx•—3ëìöÛ³¶aÐ^r€l/3µF}è›IHLÇ7Ó$›éa‡ò(a£|‰Ex&ùÊ÷!™ ½SêÙnš B’˜ ú$Ç*I=åP¾¿¿ùXíN’Ç3¹“‘Of×¾Üdc…wñh‚uÊ‹míe³Îꉯ“ÑñæÄñfùÌÇaïò¸†î8é5_™¦Pù—àXí3KÈvÓÕÐ " ‰Éà‘PLëjUÂòþ¡¸–J÷óf+ÞO'¹Ög7g+åEkB ^{ˆüÙ^6êþÔÕ*áÂÄŽGgÃÚw³ÙÒ¾{ìŽk6kñ²Ñªôò´'¼.+ŸÖ8D¶›š¢z‘IHL{²®¦Ïiáýôj_–6oþãûˆì¢•²«ð;RnÁ:@¶—ñS/«3 ‰ÉàÀsâ§”“|J¹â¦kb§ šùˆ>¸ Ý´{€l75 ÈIÂ… ʤÈá,y=J•H Ïä#F®¬‡4Í®X +úvµÒv2Ù^ö¼úГ˜Œ /O;µ~f¶Üxµ{·ñ¹=øZ›´Q¤Cd»©QÔ>V ‰ÉØÑ‡ñìkùðœ;¬Ÿ¼Ö ­x®×ú¸Õïãš _qƒµÄÈÞ»¤Ý-uˆl/cD0ÊÆÈ%\˜È÷è‡1FçìÚc[>œî±ý¤ü­a”ÝÚdÛ¨ø0?ðè³òZóCd»iê<~«®©{ ‰‰¸Ðo$ME®©§mÅâÃý¯¿ûpÿðÅͬÄËE£ýE–pMŠQÃVh©¤q£±¬ršp„r/[”mõB2Ç\-®ÛBâËå°cyTŠðŒ2›ºmÔ5µærrºSG(wSÙ¬ýBÈ…|Žb •ew†Ë1:åa~üóÍ»òÏwo¿x{{_Wç.¼ó¥9šè d³n¾(ïSçhJ.lQù&øʽ¬6lbµ$$ñí` «uÀ¬ÖÞœþÔö\gYs|SGcmö!ëî8lœ7|„œñ’ [ªØÖÑxSþ¯EB#Rֶ‰HHâ3xläØŠEçN®X<4rÿêîm¥‡qñ\“‡ãx—§£¨¸>ƒ°yÔp¯o!åóåG(w3×Ôè&!>qp ÛžÊ<á4íñT†Afž§m ™Av&‡F¤ÜKek‘Ägð È#OeNžª=’Ê|ûêþá9©L¼¸T&M <• •©L°&û&M"ånV›ÚÝ$$ñè6imõ,N#nNYX¦ÚÂÑ„’?jïˆ?B¹—Ê–”£Ê.B.|ä ‰#©,p•=5˜xÄÑüÇ»·¿)?ø•ŽÆd{Ž&A\'éܪp4蜇&Å‘r7«Ímn’ø ŽtC`á჌03kidÅÆ÷O=Æ)´j¡´å^J ¾MtDBŸÁ£#`w9Ëqó)®¦èîûJ'3Gõçd¢aû@¨q2Ѻ˜Õ'Pîe¯Á´@¹™Ägp”;°Õ*îÀO[רv•†…™òÌSqíF¿àån* -â"&$ñ<. lÍJùP—ÍÔ–ù!^ {)q³[gýK•î%y«½²øå^¶š}8{’ø gcbƒÓ˜Ÿ»T†¹Ìx&÷’Á…3˜(wSÙØ("Z„$>ƒGD˜WÙª¥2¹«ŒÁ|q»dЉüTymTí’™´ ½öù#”;kIõaÙ‹Ägp,a (¯XÛP~áþ%¸³ø—éy‡”ø™r7•MMB¢UHâ3zH<$ U»d¦›7ïk•1\Þç1G¶E}Õ™Iß2˜ÛÊPîe®å52×½Ägp4;zf®3˜y#èY<ŒÅ˜ZôÉ”»©ln­BŸÁƒ¢Ž«lU󿿇•g ÏKLa‚)šÂÞu)Œ7ÎTøeʽ¬Õa8{rᇳ‘7)ãÖ&åG#—žS^+ü gûË3÷ÓŠÄ&F¢ÜKe‹nµQÙEHâ3xL„¼Iëš”¿ùêßÞ[›À\^‡òä_l2k &Tv(OÚ†Î5èP–)w3Vl‚g¯BŸÁñìY…?É›nêvǤgò/1ªŸ;B¹—Ê‚m-B.|Ìà!Qâ[(’¼…â þ÷wïþò±ÒÅÌâ幘â¬[cÖUù½-7—sÔíU¤ÜÍ^cH›„$>ƒCÚÉ3À!É= uY‚æ7ÉöÏÜZŸ“þ阔{©l‰!Û¨ì"$ñ=*â}Iî{<åb^¼ysWëaà“Aö‰ÝŒI®ê8YôÎ;ç[ŒYÊ”»™kji“ÄgpH;;f®Y^Iµ!‰ Œ²_“˜ÐÒø’+ZÛ` F¦ÜKeѵ ŠHHâ3xP”=Kb²¯Jb>Þ¿ºyÿ]¥ƒÉþâR˜ˆøOŽ’e[™ÂD@h‘ˆ”»Ykni“ÄgpH;òF帵QùX#YƒÇD‘7*ǺFå×ÿ~÷PÂÄËkUž=Œó޽8êêü`N@§¾¹Ê”{™k2M@íUÈÅ\óØ ¶7n§.µ:L!vž:?Øh|ƒ:ŒL¹›ÊB“ h’øŒMÅ®²Uuþûû»·¯o+‡a¼ñX釸Vú½±u•~p`!Aƒa™r/s- _s%!‰Ïà˜væ•þ¼µÒÿ¨ Ãv‘eVéo¹‹ \ÈÓfà*+Q¡MPDB.|`ì ¨(Éê*ýïÞ•Wà«Z”ì ý36Ο+ ý0uâAh0Î/Sîd®ÎØ&˜ö*$ñÓö&ò&>7‡ œr:Kв·†‘)wSÙÐ((ÊŸ Ã>cEE±x#/8åaÊñ»›ÛJ”Ì›tq9 U a½ ã Væ0ÞÀØ`F¦ÜË\­kj¯BŸ±Am›¨]>ll%óÇö‘™ó´’•gŽØ¤[Y¦ÜMe±MPDBŸ±ƒ¢¢¥ÈU¶²•ìïw.?gíR2sÍd>¦Ÿ)>Õ5“/ÿ´-šÉdʽ Öù6°6 I|‡µ]X}LùðÜve–Å84çÉbÀ@“kÊ(wSÙØ&,"!‰ÏØaQÑRä*[åc~|ûþ¾&+š}‰&¥Œf}Pé`ÀL_nQˆ)÷²VmPmrá#·ëd­&1k•OØT5“bçi&°>´)Ĉ”»©lj‘Ägô˜Èò˜HÆ¡O9˜¯ï^ýðuù;z¨Lc ã‹k(›Òó‰—1• e`øS—2å^& ÐÙ&!‰ÏàÈön }ЛºôÞž *ƒé¤n›4F¢ÜMes£Àhrᓌ¼A®²UiLñ)ßVoW.ª}‰yL„×bŒËµyLò›´,‹”{™kmm’øŒl{™™kØxÜòÈýäB,žÉÃdc›L]Ê”»©ln-BŸÑƒ¢à¹ÊV·|wÿêþ½­u0 ¾ãOa]®\Þu×-'u 3ÄÑÂZSîe­ˆ`íEHâ38¬m‘5çXy“ZÕîKo㺾¿éLLðà¡Åú~™r/•¦MLDBŸÁc"‹ Ûµ±j}ÿ¿ß||sûÏÕåþÂ÷7ø;p¬Üïm¨Ûà_T§8¼‰Å ”»Yllm“Ägph€…„bHX‡“A°çÉbBÈZœP–)÷RÙdÛÄE$$ñ<.ˆ\ese¹¿¼wï*] ¸4-ÿ·.À,¡I¨t18v´èZ)w³×Ô×&!>ò,ã8öê3ÊÀlÊŽüÁœ ( ÓŠ­&s1"å^*›]£¨h’øŒ™* ìÍÍ…l­ƒ±—”9ŸÝ|>ˆÞ•@Yˆ!ÚÔ¢eY¤ÜÍZSX›„$>ƒÃÚ¹µæçæ0ëh¿fÍašŽöGçü|g^]eEÊTÖß&&"!>òÔ‘T–ç0¹*‡™Çb¼«ô0Á\\ 3—b0¬µ~H•)Lt¡I #Rîf®¹ ®MBŸÑqm¾žìÀ˜èaGRËÖ“5MabQvœ|£¾ÊJ”{©¬õm‚"’ø Y¾žÌÖ­'{ýí_Þýåcµ‹±—¸Ÿ¬$1Y!¦v?Y²É™&Õ~‘r/{u¦ ªMBŸÁQíòJù™}ðÏLb"§,Ì ´p1)™Mƒ312ån* m¢"’ø á\ ±ÊÅÜþùõ«‡ÿWéaÜ¥y˜hbÊkSyÎWz˜ä£M<ŒD¹—¹zÛÔ&!‰Ïà vH sIÄ6Ôa˜‡ Yè¸iáarôàs‹R¿H¹›Ê†6A I|ŠBfAQÈbPtr?Ù›^ݽ­ÇÉrº43'1ÈJý!æ:“ Á6küEʽì\X›„\øØÁaíÀ»ÉÂÖn²G-ËÜÅKhàb‚Å4­?ÑWY™r7•Å&QÑ*$ñ=*âÝd¡®›¬ü,ßßÕ]†Ëë&›]LfS1¡²›,8¡Éú™r/{ ® ®½ I|ǵ£c#QÞ¦VWì~]Ó²Øü4êÝb*F¦ÜMec“¨hrჃGE‘]/ªÖǼ»ýðm¥‰üï_æi$öÚ¨[B*a¸ká_DʽŒ}P{’øŒj'V7E¹õmJƦ.1Ÿgê2 ‹ÓÙê*+R±MHDBŸÁC"dçYýc²§üË_ÞÔCd(Á¿ÿøþeÚ,½>ƒX7pЛ- 2™r/cÐÒ^…$>ƒCÚ1òüEÞ|X™¿¤3å/¶×Ä¿H”»©lj‘Ägð(&ž¿È?íiˆìõwªç-cºÄ Æ'^„‰±2ƒ)ú–ChЬ,Sîe®)´A´IHâ38¢kËINlË©[L–üº°e³ryæÑù‹ÉdÊÝT67 Š!‰ÏàAQrlD8yqDøä¥ËûÚúKbÀï¥x‹Ñ6l™l¬ô.Á“Zàc"å^¦š± ˜MB.|äóØêt5÷çõƒì {w¸Ä_ˆ fØÂ»D[ÒÆÖ2åN* Æ´ ˆHHâ3v@T‹ŸÍ“÷Êž®¿üðúceúbçk:æ`Ü4¿O‡¯¦÷Feú-hRà)w³Vlƒf“Ägl4Œ_ 0åÃÆÌ‘d`Ø´@Óô%B ©ÅF2™r/•µ¶MLDB.|ä]ø#©lb* U˜ïÝŸj+0…çåU`¦ &®W”Á¸Ê Ì4Êa›TøEÊݬ5¶³IHâ38œ3æÏ24RWáÏlV i…?•ä½Éâ~™r/•u¶MLDBŸ±c¢¢XÀU¶j˜ÿã]I` ÖÁ˜Kå÷Ÿ\¸Ì©n”¿¨›Ÿ¦›X«@¹›µ¦6h6 I|G³3°CNÄàuà +ñg6)дğÑf- 2‘r/•õ®MLDBŸÑc¢Àc"y,ô”ƒùp{óêûú…d™]=º“ÝÚ½TžÁœHnw1hËÿ̉§¶½Ê”»Ùkni¯BŸ±!m°l[LùðÜm1™S^±êÜÐÅ`‰§Œk1#Sà›DE«Ägì¨h:úÌU¶j[Lq1Õ™½¼]1³ñ #³•»b0Ç&U~™r/c ¦ ¢½ ¹kÑf»bʇçîŠñŒ2h‰‘!¤B‹md2ån* mB"’ø ¶+¦|¨ÚóöÝ»úÌE.ŠáÓ}åT.ŠÁ’/§&‹bdʽŒM@{’øŒh6R峆u •3»œÑ²È_žyFçZø‘r7• mB"rá#ã¤#©,Guå–„Sþåöè˜õè]‚]7,†}»|wq Å.e™r/S¶ š½ I|ÆF³Á±1à¶îˆ9–½86*Ð4{Áà]“5d2ån*D‹Äg쀨(–ã*[Õ£ü·o^ÝUç/îò¶ÄÄãÚ¤\^uMÊÉÄéN\|L¦ÜË\“kf¯BŸÑÁl¶%¦|ØØ¤|¤Ä–m‰iYâO6”ÇÞb—²L¹›Êb“ h’ø Y¶%¦hYU“ò÷÷wÖÔÖ_.tKŒón}•[b¦fg“[´É”{köMÀìUHâ38˜í"Ï`¶n‰y”ÁF™m‰1MýK ¯L‹›É2ån*Û„D$$ñ<$r‰g0u[b^ݽ-?ÎýëïnÞ½ªMc.qUŒƒì2²·GMƒfÚúŸæ‰]›=D¹“Í 0m.äÂÇŽi§ÈWÅÄÓ«bVãí‰IçØ3?pmR¯Á¢ÜM_Sƒ°ˆ I|Æ‹ŠŠò=1éÔž˜Cîãëÿô›Ùup•–ç5qúÝ—¿ÿÑw,²ÁÌ_Ñò"PtÖ•É ÙJ˜¯>¾ýáÕÃÍS݈ß]od–0†YZh^s!‰ÏààµgãiåÃi4ìHªÂæõÁœc^~à|T/¶¢ÜM_s«°g/äÂ'öeÙ5ÈëkªÜH!®n$¥ ]vÂj7vǘ¥@¹—YºÐ¡æBŸÁj¬éØãé¦ã#æFæWÓyÜN³MôU ÜM_s«°g/$ñ=쉬ãØÇSÇ܈éêFŒóë‚}ð!W»‘¢W¨Þ[|ˆr/³ô؈æBŸÁh,¹ñç€9¶= ðlÙæ³÷‡(÷ÒW0­Âž½Ägð°ÏFä{™•Ù^³Ÿí9€úldÒ«6µr7³Œ­°æ½Ägl¬Šú0³t[²‘£ –?[6“…6µr/} ¶Uس’øŒöð• ¯„¨t#þšø”ýº ÀÖg#Å!éo›R0¶ME]¢ÜK_£oå,B.|ÜàQNI˜¾Åä#„kòá£uë–H¾:ù˜õJ}þånf™AË‹Ägph9XîFì³0,ËȺð8”käFŠ4)…H”{ékò­Âž½Ägô°Çq7â4݈»º‘’‹8Ã܈y†)ªÔÃ’(÷2ËlAË‹Ägth™]L)N_LùìIYÀ6æ5ÎFC›Æ,‰r7}…VaÏ^Hâ3xؼNžKÙâFØ”‹u#ÓzÁµ¿øY”n¤èU›Æ,‰r'³Dc[AË{!‰ÏàÐ2ZæFP®§V€ZhÏæF¦Ë„m²r7} ­Âž½Ägð°-p}Ut#è.ÝÄ’‘¡e«ƒÑÔ»‘I¯š4fI”{™¥u­°æ½ ;:Öœ< RPjÌ ÙžË$—Û4fI”»é+¶ {öBŸÁÞÀo)ù–Be6’…sp—åFrùDz‘0o´¨s#“^µ)± ”{™ån7n+³Ægp¬¹„-näh6ÎæF²µ¾M‰] ÜM_c«°g/äÂ{·„ ÜR™HWE/ÊL´b ë-ô‡ÜÈýäFv?úûïooçßû¶Püª¨æ¯~2?ÿê'ûóË÷ŸýOœr›û^÷áþá‹òùlú ëÿúé³×{É÷?ýEîºÔ¾ýðñÝ«‡û‡o‹ý¯ÏþkR–»Woþoy¬ëWw/"úfùøø›ÿÛò•ÕõÑ×¾™~ëWÓc{*ßåmD$^¼ó$?¾}óðÝ€¿º-ï‘òçW"ÓË”s™Ÿ;ýécÒñÓŸi}Iù~òf«í~ïñWÿ‡3Ÿ|™¬Œ¾úÛõw~ñÝIi~:`^·'C Øéý‹))¿¿÷Â}q Ô(ïmÄiÇÚôaËŽµGq†YÉ¢Yw¬5j·Þåæ ‰d/Í &(kæ"1FRÍü3S(µuj±s­S£‰m„Z ᳡¢<ÝÄö§=­Ù{V ]$S"ÙÍâæ…êçVòÒ˜,ní“>œ¾Û|»´œ¬0[¡í ‚EÝ1 ‰d/ÕD«¦,ÒƒÑã”Àã”PuŸùæýçüæåK–ö|ñîû·‡üÆ£íÍS={]².Åoçìº5¸dã›4Û\<®n?žD²›qÎk_Us/1Õ}ãD0,RƒgµNð$Rë$ÂY—³n!‘쥚Ñi‡4‹t ¹k$Õ®šÏé’ࣅCÒ/f`ÔÅõ/¢w[}Cg•ËXÉn7gUª·—Žˆ¥ q .XÇ5ùçS»±™/Î4÷ˆó•AUÕ|L²—j&§¦,ÒƒÁÔ`‘«æ©ÉO÷ó,Ðú†tOgK¶ú?ÑÑm°–Hv3¸¬à.ÒƒÁ\L,iÇ´¥¸p OÂ,˜›®/ðÞFåÉ^ª™½v˜²HG S0ñâBÖ,.ä³Ýjùæ_¿üú¢K ?ÚÒ±0G©óÍ€g[ÊS‰ÛϵøìÝ/¯×?×’}Œ0c´AÝE:b08¨­ÿ™}xV“Ë"›_hµ}Ìk”›¤’ÝT´C—E:b0xè×ÝÓ‡Sýlb½áöÃëW·7_¼¿½z*\`*ácZñîâ<ÂÖT"›µGþ’½ìÑZmw‘na`Çq!1{yLá©‹*-Ë%€Ýý¶ÍŠÓ]ÐÍ&DšÝÔ3è—§÷â‡ÁCȬuäļ.Ÿà{(.:Ÿp˜Vqûz˜Ré&"Í^vè¬z%z8 Žñ&·¥M;ÅŽ¥‰íkVŠž¦*†í{¼œÙeÝêƒH³—bPÇwñò^¡qŒ0eæ"R~ÖòGæ"²iï"A@å:·D³—vf£ÚìÅ#c‡6S ;ÓN«ÖùTh]\çS‰R mWóöΧœ‰iÚœD³›ÍEuHx8  gLkÀ–£xˆ¢bGŽØÜ#”'³rY[¢ÙI;­±êñÊ"q;^™–Sqí›.ªzasÖMþã{„’M"3}³y‡±€ÊÓ"Ín6—Ôç­ñˆÃàpæSÞ0=š¢sa~Wdz"-¼ôÎëÖ(Dš½4Ô:혅Ä#£Ç,dÊzwD&=[{Üf'L®¼˜”ž9ì)vJ¥[Šiv³Ã¬ ö’x y‚y;œo–¯§çMM§ËÒuhã'‚-Ï×è#Dš½ôÓyíH†Ä#cG2E€ë§ÞÜDÉëÏ671®ŸH®ü3¬O%ÁØ>:|ù[R^à$Òìf‡Y×%ñˆÃè¸.ÛË_>lYñ÷¸)Ö2ºÈvü5*Z‡ Eå-N"Í^úéA;Ž!ñ~ô8&d¦Ÿò5®J?×=SqÚvŸ{§Ùì'¢c”ó ‘f/;£ö’xÄap´×óc^ /&<à'Ü‘ZL1kã;sÆ¥`´×7‰D»é'¨ï!ùˆÅØLÑ$Þ{'›“ÜÝô/·þüêöíÏoý—/¿ùðñáíû¿ì~ñ››o_}û°m XsiŒ’o/ÂöÅú‚ÙTÀ°RГ‰ö2Ô`ÕB’|Äbl„8:·Ö ãØ^ÊØk•òñk‘h/SŒ^ýü5É·°pƒ£Å–MÈ–[f(ŽV3œ9ÖqÁ&åv2Ñn*Õ’XŒÐ6HáŒÞ¢ñBìºh|¢b\nF›*ÏZÊH”H´—)›ibŠ`‹±!ãè7EyAPÅÄK¹yMLˆ•3 ‘h7Mêá É·°ˆƒ‡3ŽÝ_,DsªºsÓåK«PèVÇàæ`d[…L6NÛ/ˆD{™Ý®[Ùìöò‹Áá_Ë"pËÜÝ£) æ,6Ÿ»³÷y¦‚ŠD»)hR\H>b1xàbÙ¾ãòAmô®Ð:×èÝÈ«ýÅN/ƒÍ“xå•pÒдB‘h'+t»¶QU+$ùˆÅฯ¬Jè£X%|jiÙ´Î95ij’Aå ™h7Íêq ÉG,c<Ÿòò PÔäS¼BMlÌÁãúTæ} ¡¦Vé®v’‰ö2E‹ê¨/ÉG,G}}`P“—=ÛS¡&>¸]h­[³ÁmÑe«|ÉH&ÚKIQhH>b1z@Ãg¼< Té/Ð]ýE )—Ôrm{òà·û‹dœ›WÑjš¢H´›)Fuä—ä[XÈûõ2EÞèåħ²#ë×ÜÂ5ò)jßA•‰öRPoÕ’XŒÐxž[xÍÜÂ_s‹éÔ †"ÜòTlEn‘Cê-²"Ñn¦ÕÑ`’X Žƒe¦öY«>\æt×~×êþÅìÀ*Ÿ6‰öRQp Îfïå[XÈwÒGRQà*ªØ" îÚ"[œEÈÞç5³Sq(Õ¦4j•MQ"ÚÍ“þ5íE>b18( ž·¶·T°Y€µºÝªE¶$qÖÏ¡±¦ŠŠD{©hpê«ÆI>b1z@Ž«èsÊÛ¿ô¯Þ"æi$ÛùÞTäÙúˆIù Þ!²ÝÌ1«ÃÂLBb280lyøfåðíŸñâo7Ÿ>mŒ²€ae@*g‚í©íd{i*zõ‚7“˜ ÝXË[÷œÝœºqô×›ïon½›Îò-/þÏ‹_ÿñ/þôøÄQáºÎ ÅKé­…’~$6tapsÓÔ¬m@®’Éö2ÓhÔ±c&!1=v]ÖS>œÞcþ‰CyTá`sÝá­Æºsö!MÕµ5U$ÛMS¡AèC“ÁCŸ`#×Ôª£yßßß|¬v'ÁÁ™ÜÉÈ-¹–×̓Ù|@oR=4»3|Ê6+‘íe³Éª—Ι„ ù6Ý86 Èv†‚<|Ø»<á°¬€q-NÚVôœƒ`•q®Cd»éjh ‘„ÄdðH¢çººamáê_Þ?L‡XëÜ $syÙŠkØ$ àæ]…ÎzbðÊÛ ‘íe£Ùª£ÑLBb28BÞR296'rû;|ÖO[IJ×.°Ëd»©)ê—ØW &að°'dÇÕTo*0ä‹;ÈW|„O{l$Ò-‘"ÛÉø¼qúEõUBb28ð#Zò­ñí·Zcˆ¶½(1hp!jû™l75EýPf•˜ŒÊ ‡³ä.ø:áL>bàÊútuÉò:HÛ¯ó‘Zi» ™l/{´^ý¾7“˜Œ /£gPú'@U«Û°{·ñ¹=øZ›´Q¤Cd»©QÔ>V ‰ÉØÑGÑÏÕèŠôä×:z]êB©Î:f²vó;\öÞ%ín©Cd{£›{K5‘KHLÄþ£aŒ1&ËòðdO¸ø¤üðx$ƒQv«56*>Ì<ú¬¼µüÙnš:§óꚺ—pa"ï„IS‘kê©;bñáþ‡×ß}¸øâfVâ­å‡äüE–,ƒ–’­ÐRŠÙÆé¦ŠMÊ«CŽPîe«PÙV!$ñ_Õã˜kDV‡ˆñtâx×s,1bkDzæ%®ŽÊHÓÊÝT6iB¿’ø  Åè¸ÊžªIˆæ·ÿñÕý»ßÿá‹ßüîw.&Æ|i.f^gã2²7ÇæêŬpÖŬŽD¡ÜË^a>á¢n¯«ÄGœÎÇ^ß,šäÍ¢•¹Klž»ìŸy‘Á)ï6êÎŒ²wͰ‹q)¹¤½´äå^*‹¦IT´ I|ŠÊÌTÖWMþöíÇ›_ÝÞþÓWÿVée¢¿ÀÁÂMf·ÿ¢Ý9‘ÉØ|‡âòÌãÔ¯ÓDeʽT6ÚFÑ"$ñ<0ÊÈö¸e<µRQô2ÿñÍ¿þá×_ýÛW•XYÆx.fŠFV¬,Cªt1ÙxݳG(w³×ØÛ^…$>ƒcÛ™×ùóÖ:ÿ±rLn_ç_žyF¯\ê?B¹—Ê&×(*Z„\øÈ%ô‘T–GEuÿ¯ï^¿¸+ïÅÊ,&_bÅ¢ÏnÍbreÅß•/†`Z`e"ånöšš`Û«Ägll;³Úkš×A?+‹FÙ®YL£Å[ûg0—_´PY‰r/•Í®MTDBŸ±£¢¢X†©¬¼ú”‹ùx÷úþ¾Î¿–—˜Â˜×å˜s] ã­‰Q{GÊÊÝŒ57¶W!‰ÏàÀ6ò q(_ˆÛ°ØÑqÊé,)Œ·Öú¬|šêåN* Æ7 ‰V!‰ÏØ!QQ,à*{j•¼è_^¼ys_›Á`¶—ça %ÏNbtuÆyç|‹ F¦ÜË\­ij¯BŸ±Aída5×òacµÿQå°VûCKãЖפîMõ#”»©,´ ŠHHâ3vPT´41• UÕþ÷¯nÞW™ÂØp‰…~›â:9Ÿ¬¯+ôûàLH©ÁPŒL¹—µ:ÛÒ^…\øÈ Ó@Öš-³Vy“þaó褉ã”óyR˜à<„ÐÂÁˆ”»©lh‘Ägô˜(®²§îìÊË÷ß½½ÃJãŒÐ(ùï`\f#1É&_ë`b aZd0"å^Öº;8ÙÂZ÷BŸÁí’b1k•[U7”ùSNg©Áø€6€òIÞ#”»©,6Љ!>r;áH*Ë“nS…‘½»ÿñþÃë¿Ö¦0ö1²`£[É’É•Y@„U‘r/s×Ò&!‰ÏØvrÀR'_ĨêU.ÄΕÂLK’•/l¡ÜMe±QP´I|Š®²U)Ìë¿{¨­ÂLñü%z˜¼n,)Ÿ}e ˜&Ó02å^æ|H›„$>ƒCÚ&ð>²­Ó0f.™‡1gš†)Ï<í­dG(wSÙØ&("!‰ÏàA‘AÞGV7 s_4ºúòV2—8 1ùu7Y2•Ã0`º”ä02å^æŠÐÓ^…$>ƒcÚÞ³€Ð{1 ÜÃxFÖF÷Ï3•q÷öIs÷öõíÛJã/ÒøõøVòóù ㌠Æ-eʽÌ5†& ö*äµ/ô»­…þ#ã–…ØyP²ò̵ò¡ÜMes› ˆ„$>ƒEŽú]]¡FÉþ\~ÎZs‰µ~ˆÅɬ>ÆUÖú‹ÆEãZlX–)÷2ØšÀÚ«ÄgpXÛ'žÅ¤çf1ÌÇøìÏäc¬Í¾E3™L¹—ÊfÓ(,Z„\T6ùij˜\•Åüpóñ¾¸‚Z“/0‹ «ÄøX›Å”Úó02ånæŠM`íUHâ38¬ ~]S>l\ó¨]™ÍìKcZÎÃ>`r#RÁ˜6A I|ŠÀ#WÙºËoß——`¥ƒ¸¸•1Ó!¡°Ž’—gàêVÆu ÞA‹F¤ÜÍZcT›„$>c£Ú™µ–KýîØH?œ§Ô`}°-_Ê”{©¬µmb"’øŒÅâ[(äñÐ'l%ûúáëòwôP ”Æ—Yîlq ºÊrÉÇÃÜû¬o²ån&›Ú Û$$ñÙFË& Pá©+÷£[ñê¦åþàKúÕb(F¦ÜKek‘ÄgìÀ¨h)ëGW5Öÿï7ßßÜþs}5ÝŽöƒ÷ ÖTMÝh?¤òú5MœŒH¹›Åæ6Ð6 ¹ðIƒCÛˆ¬âøÜÑþÈ) 7[8™”LЦÁv2™r/•õ¾M\DBŸÑã" \eë*þ·~ýêáÿÕz˜xqõþhbñ/l¶Ce½?%}‹s—2ånæšÛ@Û$$ñÚ‘ ÚÛÐS9åt“c Äs‹jŒH¹—Ê´ ŠHÈ…Œ˜Ž¤²ÀU¶j¶ÿÕ›žqî2…t‘Ãý>°ýd»sŽÛ]Ì”‡&õ™r/{ ¦ ¸½ I|Æ·S´,‰‰ö¹ÃýÀ)¯ILËõ1%êö[ e2ån* M¢¢UHâ3xTmà*[•ļ»ýðm¥‰îâR˜i?§@hâ_$ÊÝTÛ„D$$ñ<$мëŠ0÷7¯¿ûpÿP›Á\^&9ç£eY¬,ÂLú–Ch0Ø/Sîe®É7A´W!>rN0޹&Ãs’|¥½nè2Ùu2­eÇryæÑù'bdÊÝT66 Š!‰ÏàAQb§¿Ë1ß:åaÊßa¥wIVè^ùG÷.ÁÆDëJ¦—†©ô.% 2-îÃÈ”{™jömÀl’ø fCâ—òÁç '.Y‰²yl†-¼K´awf^]eEÊÝT6µ ˆHÈ…O< ‚Ä.å.ÍÓõ—^¬M_ _ÜÀ圾 ®é ĺˢnh I_¤ÜÉZËOÒÍ&!‰Ïàhvæ;còÖ1Çå3íŒ Ó–¹ä[¤/"ån*›ÚÄD$$ñ<&Ê|gL®Ûóã½ûSu&_äÊ›æƒðË3¨\¦>[Û¤Â/Rîe­6´³IHâ38œùy˜üìó0žS^„¦þ’¹‡&'”eÊÝT6·‰‰HHâ3zLÄÏÃäºó0ïJµæ¯Ã” &°•1¹ò:LQ7ï½mQ€)÷²V‡mÐl’øŒfg×p0›$†ƒ‡L:\â/ÄÖN›¦%þŒÖ7¹#S޴‰‰HHâ3vLTËs• 5æÃíÍ«ïjs˜l$ø÷ÛÅLƒ–ž +o[åbЖÿ1-N\Ê”»Ùkli¯B.|plH;v¦|x.H–e¶07t1ès2®ÅŒL¹—Ê‚m­BŸÑ£"Ï£¢ºó0ÅÅÔû—Ë;3û—L½KåT‡AÀ›TùeÊÝŒ56A´W!‰Ï؈v¶Ž«õÏMa<£Ì†Zbd)…ÐbUŒL¹—Ê×&$"!>vðÈzÏU¶*…yûî]µ±pqùËc‡DE±xÙЈeÃSþåö#ì?ºï’-ëQžÛ,¶{—dbðÐâì˜L¹›©æ&hö*$ñÍ.Ù1܀ޱŒóö,˜dCyì-ÖÉ”{©lôM¢UHâ3v@T´4r•¢SÞåûû;k*³Ç–S\’‰¸V_ܼ§§Â¿XŒ&·(ðË”{k2M ìUHâ38”myßn-ð?ê 3Œ2+ð›¦þ§KY ª/2ån* mB"’ø Y^à·uþWwoËsÿú»›w•§Ç²½¼"rÜÚ ;½=j@24ÙaQ&ý~ãC”»é+6 {!‰ÏØaOQ,¾S Oí;æF¾üýïøº0¶gÕ^†ž•âCͺ0R£&^C¢ÜË o€;s!‰Ïำφsrã@†ås:Sò‘MT¯Ã¢ÜM_c£(g’øŒåÅ®¯§ÎmH>À­#–|@ö‘UB|rµÉǤWúý‡(÷2K åEHâ38´ì‘cX¸Ã:²Ð¸hã¹0¬4Y€ú<ý!ÊÝô5µ {öBŸÑÃäjbXñÒ1¬òÏ`MÍûPaÍz¥Þ¸uˆr/³„ÐZ^„\øÀèвGf–òiÚnäÈÌIöçr#èÕgNQ¹Uس’øŒöÏžå³J7Â&¡‹r#%‰aÅRÊ#q©ÚD3׿˜¥@¹—Y†Ð ZÞ I|Ɔ–3°‘åÃ7ò(±Œ,ëÁ·mÝÈ´b·M6"PhZ…={!}̓‡=ÀDf8y r ¨å¯nÄ[ƒàòHì!7r?¹‘ÝþþûÛÛù÷¾-¿*ªù«ŸÌÏ¿úÉþüòýgÿs>³twwÿÃë/Êkä³éß+œÿë§Ï^ïßÿ ô÷¸+ }ûáã»W÷ß3û_Ÿýפ+w¯ÞüßòTׯîÞCôÍòññ7ÿ·ÿä+«ç£¯}3ýÖ¯¦§öT¾ËˈH¼xÿæI~|ûæá»ùÅùê¶¼FÊŸ\‰LïRÎe~ìô§IÇO¦õ}ä;øÉw˜e¬f´û½Ç_ýÎ|òe22úêo×ßùÅw'ùéDø!(7ò û¼¾“ sŸ¼æë{/ÜB_†eFymǘÕ"¦bPôÔ0Ã0²¸îòmÔqa½5Êh§D²—f¢õÊš¹HG Ä™²‘T31Õ”›j"ЉX8SD!Ûâ­5m>F¶~2¦ù̦îŠYtL‰d7‹›'.Õ-Î1âÍ,.#³89ãxj#EXÉf³æœ¡‘36('›É^ªv˜²H·0°ƒÇ)Ù˜ŸÙ‡Sé¥8[zóþó?~óòåšõ|ñîû·‡ÜÆ£ÁÒ‰m|¬ÇÿØn#¹Ææµü’RÚì62¢òb‰d7ÛLQÛ6÷Ò±aÛL60·aO/ŠþìpÅ‹çηÎ!œuó)-EÕ”HöRÍä´#šE:b0zDc3SMwj!ô±‚7hO´ð1Žþí ¦ÎmÆii×V_àÐioHv3¸yÒIÕàöÒq'à8—¥YîÕ¨À“r€æ¾Ñ)ßÓ”HöRÍìµÃ”E:b0x˜’O!ä ‚U¾ ‡x‰¾ !ÙÝ®ßä ü”_è¶WK$;œ5FÀ]¤#ƒ¸13ƒ‹›ærMsZN6=67]_àýTr×UMd7Õí0e‘Ž ¦Ä \5ÕFp¦ øl#8ßüë—_ÿAt ôG[úæï¨¹‡`ØÁÞ)_ÚÜ÷æ³wV·ò,‘ìe„å?ÚF¸—na ¯µÆ;06}Ø‚nq+”Øu±Vþ!Çy5ªj>&ÙM5ƒzè²—ŽŒº$vHlR¨çàFŸú‡ÄO„]²€ ¬O… {¢€bÐ-GK${¡³Úàí"1¼ÍÙ²„]F¾*ê 9çÖXRJ•±$‰d7ÕDíÐe‘naÆ]Š®š¢!<Ôòáõ«Û›/ÞßÞ?jJƸK„šX=tJÿýV¨iº—mtËÉ^öè6¶»HG ÆÆvËÛY¼&_V®I%bói™é"„ò ‰d7ÕDí(f‘ŽŒÅ2L5£Ú`ÌDì:“ÀÚVIØ>_Yü‰öY{‰d/ ¯ ö.ÒƒÑÁ^dÁZ”ßœƒä£ÐÔh&ß½òbb‘f7õŒêís‹xÄaì२$kRŠQlšH_Á¦©aCX{XcØ6í”J¹‹U¢Ù˨Ï-â‡ÁA_ ô=QW$VjQ° |'X¤ÙM;“vC⇱£˜´+ÊЇS×µ6äÍ5ð9®çË«Ànwè§lD×%š½ŒƒúÒ"ÞÂÆÆ}“uÀŒP>'þÔ’„å>Â3\·‘“p*/§ivÓϬÂxÄaôÆ%¦Ÿ^ofº;×ÌôÀ©ÄtXѰÃLÉZÜì'vJ¥›Jˆ4{Ùa úcG{ñˆÃè o橄ܨûÔÖW™!›AuÓºŽ&íMÎߦ›Nˆ4{ih2ê½w‹x‹†æÑ#ÃÓ ùb[¥§°gK'Æõè`]8XÞÛ3ŠRéÖ­EšÝìµÁ_8Œ þ–Ÿ5ÁΧÙ5šœ’Í͇§Ë£>è–®Eš½´3í8†Ä#ƒÇ16ñ8FÎ~jfæ ­ œŸþE±ÚÆÍóÓ¾D.F9wiv³¹¨>š´ˆGÆzctl„:nÚü뎴½Fß|„º<êÝMn]í|L³“v:cÕã•E<â0v¼RÔˆu>kÏï§SÔÑ_àuò> “³Û§¨ç¡/å1j‰f7›KúÃH{ñˆÃਮ÷ Õ=pGëÉ…i&y6‹d[aI9GÌʳÔÍ^úizIJˆGÆŽXÒî„}xÎÜ_`IòKš¦å‚Y' Êû€]Æ}ò4õ¤TÚãÔÍnv˜õç©÷â-Òà˜®· Óõr$ùT,É'F×­; ¦ƒV-üD0€Ú× Eš½ôÓyí8†Ä#£Ç16rýT»X8ièÙ.í'p€É›íG wJ¥;V-Òìf‡YÕ%ñˆÃਮg çÉË çÛ—ôJ±5„l6º•i‘f/íô ~doáàGb"bä᪚ƒOæÒ¦Tþײ³ÅôYúibTö"Í^6FÕ%ñˆÃبnQÖ×êâ–¾ÖGýJÌ#¸Ôü PrhÑ+ß”hvÓNÐŽWH<â0x¼â"Ã?]zNWë§Á¥p&0êäô]LZ„ÃÍwJö嵉4{™`°Ú/‰G‡x› È&øÔÓ@ÌA@ÂÖ"[“ƒrÊ Òì¦AûË^<â0xøÉqí|NâS)_ZÊ0yŸÙŒD³Õ#ìH{á’@³—Í¡ÓsI<â08˜ |E&ȳÝ ÒŒ¶öV½$-Ò즨¾òe8Œ¯€çÚ©"A¸8)šœ}v†™þfi·PNyË’D³—ÍE¯ Ü’x 78p³¹ ¯ |jŽÀf£ƒ·-Ny†qΣÕu 2ÑnúÕ÷»|Äbð%¸ÈT±þüµþŒ8­G@6ó¶ÃM¶ÕŸ­WK7w‰ö2ÅäÕM“|ÄbpH,+8€U[¤®ý"’©•ˆRùþƒL´›Š&õU/$ßÂ"΀å§SÜ¥îºKcîVÊŽu+Ù¾Kc¯Uºµ™h/SÌ ¾ “ä#ƒã»!0oÂoñx‚§xoaST^ñ-í¦¢I= !ùˆÅàMÌ[Tô¯Þcya• „åPá-¼5Ñi¯è‰v2Eo‚ú¢L’X Žý:6¢šœ<¢úÔ}ß¼™É§Ö• ‹&8§½ÈU$ÚMA³z8Cò‹ÁÃçy·?u}”]ú—Û~uûö¿çÿË—ß|øøðöý_v¿øÍÍ·¯¾¿}ØvPÈ®þ£—3üò®ÇçŠòl-g”oe«¾\$ÚËP-ªÆ$±0FžwàóòÇȲ´£Õ݈6¨W4D¢½ÔõP‡ä#ƒ‡:ȳÔÌ:ðšuLãè°ñ ¬É:vZ¥;z-ífŠQ.&ù88\ŒŽõC¡<ŠûäŠpoÁã@+‘a^𦩤"Ñ^Jº›ŽWUR’XŒÐxÏ•Tqë+Âuë+FŒçw$Ðmßúêš<·[)š¢L´›)Fõ á$±0F¾ø7-~}”[”„–f«_}jä/ØAÙ_ÈD{))8í f•oa!ïÀIIyPó¬ý¯¿ôùzš#bùÕº0a¬8M—³õ%WQ^îtˆl7sLêÀ1“˜ î5¼Ƌ¿Ý|vxVeæ6 U’‘]»yc]MÉöÒÔàÔËáLBb2x|¸ë']+r|ó÷û‡›wÞ½|ù×›ïon½ûâÍíí!ßòâÿ¼øõÿðâO³ùõ—_ý'WéÕÇÄ‹)nÄdp-n„íKÆwÚ†”›píf¦Y?f“Á䈬Xñt±ü‡ò8á”×z¹oæP|H&€rÅüÙ^šŠ¾AèC“ÁCŸˆÀ5uCÕ|u(ßßß|¬v'ó|ËYÜɨÛBæÙ…W|+†í¥ó¢zh‚U¸‘íe³Ñè£Í«„Ädp¼9Zd6kOß²øÄ»<®‹0˜+²•Ÿ¶YU$ÀjÏz ÛMW¡A$D“Ñ#!Ç#!wê²…è_Þ?×Rë^\¼´leò'EI˜?1›`8ëË.z]øëÙ^6š¬:Í$\˜˜¡ñèd| >lií}4bî9Ùæ©Êô´½ F¹¹÷Ùnjôop¯“¡ÃžIŸ€«é©TåÉe“B í¹Ê&ƒæ ÅEäi§íúH€å O¾Á]T*¯|8éÙ^Ö˜­þ%îUBb28<«™˜Œ¯Ø]˜ ù‰Õò´-:Ÿ½nï!²ÝÔÄ6$áÂ$ ÛLšÉ &I^¨Vµ²*ñ3_—‘XLeŒaM,’Û\!RO,D²ŒŒÓ—¹„Ädpp9Y–ü'»%±8¶Í0Ùæ3ƒÎB,™PˆÚ>B&ÛMMQ?”Y%$&£‡2|mN’׿Ôùw®9À‘Û±¦\"ÁÚŽ•LMj±W+m·!“íeÖkcÆ\Bb26f1¯1[bi`sµ†™«•÷QlÈ^ó1Ö®Ù‹kêcb¨½ñånJ›ÛF$$ñ<0²Ös¥­Mc~|ûþß+ÌÜVqNÆ[\ËåÝQ™È¤Ð7q2"å^öZ¬ª‰½’ÄG\ä6½dö6Žuשޖ.Æ™dÀ·HcdʽTM“¸h’øŒ±9×òaÃtGñ*÷+ÿûêÝ„?½{ûúã‡ûß>|ñãî_ø¢èò»ï?ýáýÃÇ·÷Âß,Àë×ßÚ7ßþ ¿0_D4æ ‹>…?½/?䟾}…¼ñvÞFû-¾|Yȼ~¨žu/"]âôZ¶1[Ø<=2k³w¾„KÊ÷jPîö2ˆÚ˜ù/„\øàذyÊó¾Jú 6lØ¢8åõ`th迼Cë­Õ½*r„r/•¶Iȵ I|ƹŠb®²"v|*Eúxÿêæýw•ã‰9¹Ks0“oö&­ý`y.·U8Œm‚ÂÉ”»Yklš¯BŸÁAsX´éž0§x¢‡€SNgI¼Oæµ”ú*+Qɵ‰‰HÈ…¼ü`$•®²UëUÞ¼¿u÷¶2ƒqx®õ*9˜¹ÇÖg›÷©ìÔ- *ßW?B¹›µ¦&ˆù*$ñ1w†!pÎ&•t¹I»ÅV>LðŒÜÈ”{ì.×Ö7Xrá##OÃl¿HÍs¯ÈóÚ¡e¶U©©™V-ÌÝ=ú*+Q¡MXDBŸ±Ã¢¢XŽ«¬˜sò1_ß½þúáëòwôPée ã|i^fÂÊ"°ÁΟTz™lÊ+XwÌʽLÖÛ&Ðö*$ñÚö™ùôøƒÌ ;VsƒÙÄTëkª§½‹;]â(LTûd»lËV˜¹ä)RYku"ùÌU-ÍTeÙ1áÇë/_^êL_*˰7sH_b»?SÿbŸƒÉ6™ Ràg)³VÐA³QHä39š]èÚ˜²umÌCéK!kcTÓ—r¯‘¾°”G©¬s:1 ‰|掉ªbª²]=d?ܸ?vW`Êþ¶Æ2—Z:·Æ,%i°*~–ò0k-:p6 ¹òá\æ±V ·g`ë홇ö’¹=£Zá‡ì¢Êî~žò(•õ^'&B!‘Ïä1ÐÛ3°åö ÙÝ]˜Ðé``ÇajãÉjeè<SÕÍ{o5 0,åaÖZtÐlùLŽfƒ%%~àÑ‘ -d¤ÄîL%þ’¬/*Ky”ʆ ¡+¾h>“ÊÒ˜ˆ¿4ð˜ƒùxuyñù¶;‡·»ÿa{"÷ÇÀtÖøKŠ4FùyÊ£ì5H…D>sCÚ¥”L‡²qóå= s0†lÔÐÌa’±Ö§¤0ÊÏS¦²A%*jB"Ÿ©£¢E±póåòеùòæíÕ½÷a¦;Ü{™aùö­€¾½—ÉÖÿ0÷axÊ£Ì5YL» ‰|fÇ´#iÉ)qcÿJVe2î\4=LMHÓ˜³ä)SÙ¨5!‘ÏìAQ¤AQìªó×$¦¿ “öYæw$ƒ)¡¯ÌŸB*Y¥Œ§<ÊX³S´›ÈgjH»c!“p0Hf0ñLLˆQcOy˜Ê&…D>S‡D‹bÑ &ve0ïÞ¿ïô/ ËÝå/˲ËЊ0õøÎü%Y*×ÇxÊ£Œ¼ ¢Ý„\ù¸ÉíœÈÎçøï­"#md‡ÛÑgh#«ï¼$ç4ü Ky˜Êf…D>S‡D‹b9ª²]süW×îÌ^rÞ粉|4ú¦øÁäèƒQÈ^xÊ£Lµx0» ‰|&³m ¡  l(Ø3Å¿kf¨Yâëk×XtÉS¦² 5!W>yê€hQ¬HU6÷x—Ï7×Ötf/6º]ú—Ð.*ë}Ÿ±5*-d<åAÆšMP²›Ègj(»¦¹…¢c[ëû÷ZÈ 1CRß7ªþ%åhŒBõ…§N"d•œãzòá…Gå/[ž¢“‡Eˆñð˜9å>~ÿë_üêà:(e¸Ÿv«¸?þæw¿ý'Öw¬²Á~D¨Ôbm¤“âÆ'âE¾ýôîËÅíåSÝÈ2S¥ãFÊ£ÌÒ%àš ‰|¦®kÌUhèWGÀÂ%[ÎåFJˆNÇ0”Gé«7ZaÏÈgò°Ç …•Ç ° nÄ‘k«;u#¹•7‹Õ÷ ¾Û,z%^T9Ey˜Yf„š ¹òIS#Ô¹dGWfÿøâÊæFüIÄk¡”Ï€x-/ü²çHC_9Ê£ô5X¥°gùLö,Šå©¾>¶µò!7ò»ßþ†–âÉ&o» +ÑFâìzR¢©x Žò0+Ì ¸3ùLŽ;‡¶|iy`Û^£<|ëΔ|@H&‹×áOQ¥¯5$TÒ×;!W>üðúLú D_y×—|÷ž|Ù&‚aÓ®äcÑ+ù~áS”‡™%(AË«ÈgrhÙ%ÿ#yx|Þñg§ËíĸlÏåF ߨrŠò(}MN+ì¹ùLö¸”©¾>6ì¸ÃÊáÅÓö²ÔWc·‰p^4Ìò>åafY” åUHä39´"îøÂÍ 7²ìp=ޤs ÞxJ1ê¤# åQ ›½VÜs'$ò™<î ÉQ…}lèdK:’˜Nö]ù0&›€ðë`ºýHr‡¿ ³¼Oy”YVW«e–G!‘ÏÔØr} Ž ZŽFOø‘{³‹–õî>²üâFúõ5hÅ=_»“Ç=Α¸Çñû”;Ó¿wTëP!`Šq¶ÕZÖé Z åQfY¬Ø|'äÊÇL6{GP-ï¶ Zufy6Tk9¢ƒj1”‡ékÔ {î„D>“‡=Þцt'ˆjy¿{T+xk#Ù¥âm?ªµè•ø8â)ʃÌré]S4KGøÌ6—D¢;þ^yGqÄ›p.7®ñM*§(ÓפöÜ ¹òáæÌ£¯¾Ý[»—²Å˜¼s7 –bKµÀ‹yÈ,­Óš¿v#ÖÍŽ5{2'ü–9‘¥OætqÄŸkPd~Ä&­¸çk?bÓäqOð‘*¬à H»±vYZÛ¦Öƒë9è•Nq„¡<Ê,×›ï„D>“ƒÍ¡Ðš%?´ÜSdÆœËk\[AaÊÃ6k>wB"ŸÙš?>îó#‡Ê»ö#à\°…ôü/~ä!³ôA mþÚø09Ú=A›£ß²þä¡êH çZ²7âA+îùÚx˜<î‰tëhä·Žvº‘°÷õ'KBiéHt§ÖŸÜ,näø«ø|uuøgßUŠßVÕü‡¿™ÿáoöÇW~öß!Vj7_^¿ýxsûMýŽülù/^¯ÿÅú§‡P—ÿúÛÏ^ß½Š»ß ÿfã˜ß}üôþâöæöÓ»jxÿãgÿµhÏõÅ›ÿSßsûÑã— ²>ÞÿÉÿé¿ú‘æ ñÇþ°ü£XÞãSù®Ÿ'$ñëožDà‡wonß>¥WõÃRÿüS#²|])—Ã_þé}Òùëß©}µø™ôÕÏ[i†uüg÷ô¿9óÕ£Ùáþcû'?ùÙE‹þöH@’b^ ÃPóA/QþŒçpHî|´úÄrKaCàqïò¡dÛW\iÓõÖOq$‡i¦øµÎU:d07äYu(PÕdÛ®R±gŠ1Øðb[d!6Hd]nËp–»\[·H¶FÆ‘eqò7WéÁÜQ=$ŸˆÅñ—⟚…ZB6´æ ¥Vïš³õ†«¯/®.¿ùpu³V»¿TÂ[›Û.“eåéÖTâ±ñZÒ’£ìQáLd$ê ƒÉqÜ#z[mî݇$®Àh» ›§îüS|)¦sáK“È<ÙûR½©C?\²Ëj}áÁ–æ0#?æˆâ­æ>ãP,©Eû¬£òÄE‚ðj¹ˆl–­xÒÚyŸæ(í”?݈â!‡É˜âH9º8¹ÊJlï3”‹‹È@ÊÓÅl?!o—c"ÒÍaF(~¹ÅC“㼑âJq®t»½#t °d•Fï+> o¶giŽÒOùK(ÞÊaòU%ÕO¹}-Ë9£—:õáLc2­öÓö•-¥^eÏÒf‡â§Q<ä07Â[ ¹¦U̦kZ÷R ç ]zMËk53ç…—³°4Gé§ü)F9ÌÇT=rT?åŽgUbg;ž5³Ÿï]óõ{°ý~ÖQ©„š8šÃìPüö"ЇæÆ}‹!-¯åÄ6ý'W%¨Ÿ =¯j~¢ÄCT(ªŸ ÍQú)jÅC³Ç1–Æ1ö½>8G}yûùúâúÝ7o®®¶ RWÆ AÝÍ uq¾´›'ÅÐŽØ'L„;PKÒ@9š£ Tþè"ЇfG…3)k—¼¥¬ýPOlõYjìòÖN†æ0í?±ˆâ!‡¹Ã›ª¤¬]@nœºÀÇ©‹‹†ÌHTMØîjÄ!¼[ƒ¥9Êæäï'¢x+‡É/'Shj¿iÇüÛ5ê‹Uo}­¯:Gá1 –æ0í¿–ˆâ!‡¹ã•ª‰j§Xëk±f‡­¯¢q$G€Í­¯>zÞÏÒdsYþ"Ї&{­' “å§À·CK.iy„¼^²ÁÒ¦â‡Q¼•Ãä'«BˆÉò—ú·«Úõ3±=ŸÎE'Û¯ÄÒeŸ1J#½(r˜é-.‘ˆÍ%6b{òD"t3Y©T‰HaÙT,Û±ÄÒ¥ŸÉˆG7«x«~ò=@3ég¦úÉn…é•;Àk»¯DÔÿ %§öVbÜ\‰8*•lKs˜&q¬w9ÌõB ôRPزÉ?à' ƨï'bôQx©+Ks”~f#Ǭâ!‡¹ã˜ªGd?SŒ‚û™b<Û~¦yý8È`HÅ:úí+š¥J‹^YšÃì0‹#À«xÈar8ø6W„®‹–Ô'âÀ.=:²^‚¥9J;ÁJG1(r˜;Š© Iªg!ˆMÄUZ皈›y‰ÐL¢þí€Ó²'Ö;–æ0i@ÅC“¾´@­>°ÚS ØÞQº ãõJ;üÀ;o„ ,ÍQúYœøé’U<ä0yãK¤úÉ0O,X|º¸ysõ}G½"·»z… ζ{hõÕZ ¶¹ƒ®ÉV»YšÃ̳HãÁ(ÞÊ&ǃÁñý0=ùè_¡ó.[á,ÍAÚ¹ÀòÚy9LÜT;åæ&J(çš›˜Æ%€K.}•Qäí§æüÝÁoQ£ch3º"~üq9Ì ý–HÛÐ#߆Þ1`½úÊ ðÅeéˤÍQÚiƒ|Àr'ÞÊÁO°D—¨vʭ܈~+7ê¿‘K˜õØÍ+7 Ä`…Wn°4GÙœ3â0ï*r˜æõ‰ØÜ‰ÃGO°¶c"-#Zw" dÂÇ„XšÃô3ˆG,«xÈaòˆÅ“SêõMbûÒŸó™Ò„©‹ÕÙoZï«?ôyn+V—’¬ô=!–æ(;ôVëEñÃäXo¤ÍéñyËúl»9WÙÖgµŽÎ™Qú Ot˜†Fñ[Õ(²˜<”‰tc߉nÝ>W‘ÌËI¡Ã&›ÛuÒaûI!kj‚ðk–è(S Nü$ʇ,&w“#Q[âë˜O>Pš(ÝV{Ðj­o;/ÛÊ¥U”!:LE“øk”YLÐ$¨Š Ö’ÙÛ”²‹Ñ‚iøS²Û÷6Yk¬1A¶&ÁeŠÑ‹_³FùV<’:)F:¸ùÁ¥§ö9ÑÜ"樟[Øèƒô:žè0Íâ ʇ,&hb&­x1ËÍL”ÃíÓÝ{ 5Û¤¹Eì8kmSŠÒG#x¢£L1yñÃÖ(²˜N´ë0ñ]‡OÎ-ˆ·Èt/¿–·pGdU”%:LEA< AùVü¹è™T”ÌNdóœÙ‰Ÿx‹Ãpáî½E„Pü¯^ýáã§Ûw¾?þ?¿ºüîâóÕí7®nò._·I¥Dnñî¤MÊ@2Ü¿Naó,…M²^Èe¨Åc”YLgÚ˜yL­+ïðA?ïH¹&zY¸Î¦¢E<ØAùÅäÁNö¤ì–ùýy‡i–J`ÁÆÖµSߊÝÞ,e—c¸9J{ Žè(S,I0FùÅ䀱tv;lÉ;ƒ}µìûWꫵÙ/; „½KtŠÖA< AùÅät|;<–ylð‡UÜ{÷ÙF“[×N}+Þo÷y¹;(¼X–':̳8`Œò­,ø¹†yL1é®Í°¥»öÁ x.gè®…`c²Â5 –è(µV< AùÅäMšþò»:s‹òÒ]›–SŠÐNsÖ·’;ºk—éa \ÒY¢ÃL1‹CÆ(²˜2KÒ|à'Gzf1j~«ï-J\æ|e¹y¢£TÔ9ñ€å[YØÉ°ª¨`w-¸—îÚ”s‰)„Ö] ¦£»v´½—öÑa¦â 0ʇ,f…#é®= t=c›Ìb䤿ŽÜMr²Þ‚':JEkž*¬¢M>d1y@“Ksì®Í饻¶æ5y˾m‡Êa{wíVÉöKñD‡™b‘…›|ÈbrPèÎYØ´sö~•;Pº¤n”¼…u5{¾^Á¥¢ÁK4M>d1y@´];»Á[óR·H‚ñ©Ý¯(ÛëΦₕÍ-x¢£L1iP¸É‡,&…n‚MÛ£F¢²~O”sõ}K¯ä‰SÑ Р|Èbö€†.ÉRð²@*§K™Ûµºt,ªZÎ o቎2Åd¥Aá&ßÊÂL º}¶ð—ýžœ[DBȵʨä-‚Ï˱?Ye‰SÑ$Р|Èbò€¦Ð&ï·tæP^¼Ev\±Ž|Ìvo꿊tnÁeŠÅ‹ƒÂ(²˜.ÑSŒQªnQ’ÕG¢BIÅIç,Ña*šÅ”YÌÐж½Â·íuz‹^¼Eõ29|Q¹ÜFo±:Y’4E–èS\ÎeqPåCsƒÂ@¯æÁ¶«yîoñu‹erÀEaoÁ¦¢ Р|Èbî€èé¼S Ÿ»¼Ä—ºÅ1·÷ÞÕ·ÒS·8j•0ÅeŠ6ŠƒÂ(ßÊ"L —ú­ÀÀmyxÖ6ó*8!\ÚÀÅá¨ø‹¼|í„êñD‡)iiP>d1uH³è’%JÊ·y÷ø‹…ØËÄEõ%,ÉÚ[ÉG­’ÝÅeŠ.ŠÃÂ(²˜®ª‘1Å´%»¸7Ÿç!¹¥´f. f/½Ñœ':JI½jP¾UIùku3)i¢J*–_,Zú’_¤¼¬B%Ý9ÆÄŽü¢8WŒt~ÁfŠIFùÅÔÀp© ÿ‘<<¯vAÒ IíB+»(50ŠÒ•n–è( F<¤AùÅä! ™ª¨XíbQÒ—ÚEÍ.œË®uçë·×.jTÖÏsóD‡™b–†›|Èbj`¸ª†bŠüÝØ§¢Q±µÑ.´ZcTÔê£õÎf°Â·Xy¢£”4Zé¦É‡,fiœ£J*Öµ{éŒZî%ÕÿkÝËGa{gÔVÉf<Ña¦ÒÀp“YÌ {Z½ð[ª÷÷–kå@öE«t5É'¿´Ëî቎RÓãåjQ5EùÅäa ´~ÁuâQá¥~qô¡í-ZÊíã U ;ÕÍfŠEnò­,øUËó˜¢3$xsæY»Ëfζú¨e%-Ã…²ˆOt”’f/Ö |Èbò°Æ™D•T°~áìKý"Õ·º‹H©²½~ŒÍ> wÓòD‡™b‘‡›|Èbrpص#e˃Ðöò…”þöòP=~ánZžè(… Ò4ùV~öƪ¢bÛË+±ð²½<åÍWx”sÛ·—““—¾ºÊeŠÅHCÃM>d1;4œi)1?k{9oa!’äBÉ[X°¶$ÙQ<Ña*Ä”YLÐÔ_˜¨(bQ^°¨”½Ðæºë[IÛ±¨àRòEøÖOt)Zc¥aá&²˜v‰˜¢ã œYåC³‡3ÅSe[½û¼…7æÅ[d¸«hÈ'Án÷ÞÛâŠpfÁeŠGÄ^ÔQ¾•¿²`S4–Néñ •'¼… ³0ΨgBÍ eï\ðD‡)hgP>d1y8c,ÐãïÃvvD¹— wõÖfG'ºMG…û¨U²3<ÑQ¦è½8 Œò!‹ÉáàH…;ð­”OÝE댔r„—?ÑñÑ9ï¬ð”Ot˜š‚tHÓä[YäÉCšàUSÁ*÷¡5ìÅc`QÁn¯rßi•,ÅeŠ!HÃÂM>d19,ì …=ÒòÉXõ¦…nZWW£w`²p•›':LEA:¨iò!‹Éƒ_\ —vz “^¼E6mˆ?¬‘Ûè-üi9Ù‰ žè(SŒQnò!‹ÉaáI•;ÄgÝèv”¬z•;Ö¸;áþYžè0-âá ʇ,&gBŒTA«Ü!½T¹S6°€ç­nÂö*÷VÉÖ-x¢£L1%iX¸É‡,&‡…}&X”ç·•<µ#*Q² ˆRªqÇe?¿ô®(žè(ÍF>˜YåC“3>ª ‚(”‡*³rlݳ>u P1gk…»gy¢ÃL1‹Â(ßÊ‚_›9) 5îÀ(ëB¡ŠÑG¡Ø’­°·`‰ŽRQ°âá ʇ,&g$ª¢‚UîP^ªÜ)ƒO–vDWèmô9™dƒl•›':̳8 Œò!‹Ùá@küñã§NæÑÌ"zõÌb9DŸ„wDñDG)hqâá Ê·²à{ŒfRPR±ðQ°báãKÅ¢ú ðñp»m}+¾£bqÐ*áQ<Ña¦â€0ʇ,&„£'[h#ï¯'³ˆ!ég‘¾ Ç¤¢õÄÔYLÎÄਊ î áeí’YÔˆdÑoßAKò9'aoÁfŠEFùÅäp´dì)Ú-.îÕ,èd^tú.bÉÆ;á{H<ÑQ*j½x@ƒò!‹Ù›©Š ^¸8ÜÞ½·ð5Ç*¤jÍö iÙN#½–':Ê»W%M±É‡,&‡„=¶ð›¦-îm,w–Ò%³J¢’ ÙI÷ÎòD‡©hhš|Èbò€ÆÓI /9iá_&-HTJôzžï˜´¸Ó*Ùí³<ÑQ¦è­4(Üä[Yð«•ç1Å”ˆ·Hüˆ§"QÎe ”‰¿pK”†ÇÈP3g/|‰':LM£tPÓäC“5)ª¦‚#å‘Àù\44*ÅíÖXÓÖd„/tŸ";ʃ•‡©„Èdrx8Ñõ ‰/}~å7~ý—Ë`)r)‘„_é(Òá…‡•×T†ì0MMÒñ •pegph>|âq¯^Ýýͼzõ‡¿ÞÜ^¾÷îÕ«›ï^óæêê”[ùõÿþõ/ÿýß~ýǃkùåï¾ýOʽm?˪î…u,Û\ŠÔ9ÖPüWÎäpøÎ™üëÅõuý‹{Ô—ë«_Þ#uŠì( N:¦"“ÙÁãLKùñ>Û¯|ɽæ)Zf­›´/).ÖWdA«Sd‡ij’zš„Èdò¨'æD5õ±v[Ö—üùòÓ‡Ë+ï:Êa ×Ίhíºñhy)t8”ªm) ·áž";ÊL“—F—©„Èdr|9Óöªü„öª¯Ê=\ËʤÁÊ«9_ýV ² O‘¦©Y!ôA ‘Éä¡O¦]VùÑ.+Ö¡|¾¹üÔíN2iÆÒu'üÍï~ûO<úu÷'[À¯åG¤¼‹7€ØËáëa:¼‹O&ZáU#§ÈŽ²Ù£¶JÛì*!2™‹.‹æÏ n€¾è‰×ÃtòÚ‘¥´s¤¾òèc°Â³§ÈÓUPˆ„PBd2y$” „øÖ•ÇüˇÛêZzÝ‹‰;ÌVCà¯ÃÀÃ&⬯éeô­½§È޲QˆÒ5•pe&¨¶÷¦öÞ{ë«HHw¯R¥¾m›œ¯a·´š²d‡©i‘{¨„Èdò°h‹/<«Å÷w¿ýÍREm?»á­-äâ+Ð~Þ'ûˆ£É–HN‘e|%JÏTBd29ðœÆqü§â©mZÄGŽ£kûˆ}tQ¸EëÙAjêkÀ'®¦MÂUMËä¡L.Îâ×2vùˆ\Ê™|ÄÔ]Z9¤Lf3lŸDµ’v<Ùaö˜¤áe*!2™^†šú`j±@y”Êz+ýDHä3{,h,ØXè1óéâæÍÕ÷}õíÊvç`‚[³šö\és0Ñ;ñ‹Pf­‡0HÁZW!‘«ÿóX«Í$´ùñ ¹_9˜{µîD(ƒú’Ü»wžMÍÑU Gy”ÊV;×QÙUHä3yLds!* íÌåû§.oß_|èt0ÒÞ̇…²ÂìË;H¹ÏÁÔøû8ˆ(n­,åaÖZ¼Šµ¢È‡Õÿ‰¬Õ“pÐúçBc‘R.gÉ`Šq¶dáZù”G©lô*1QùÌyù.Œ¬:˜›·—½=ºÖ†ýdò’¹½×’¥XBH.˃d'(²×d¤íŸ¹Úk™Ó6¥fÝR¯¨?uVÝÃ,"’w1iY.kœ“.|€ò0• QùÌU-ÍTe«Þ³.æõÍëJ¶$3awfQ G†@ lnð=¨[ré0Ï o­<åQÖš¤M„D>“CÚŽ,C©—¡^¾n¨ÃÆ“mwš9Lª/y¢ÒPYŽò0•:Q ‰|&мóTeY{Ìżýpyûú»ÞJ¿÷fw&KÛ»U?¶ÓÀχ^ æÊPe®Åi ÚDHä39ªíˆÐo\Àu¯•Œ&1>'‰ñÅ[_dÛ” s£ÜÖ'šÔäIÍ=ÜŒ&5ùLIM“¥w©<@y˜Êf( …D>“GI>Ó¤†Øærú}‡ý¥7>ÚpØ…ŸÎô&º Ex þÊ£ ×À…\ùð³'ón ÇOêÃÆã'÷4ÒgÈ.$Å>³úÎ3¤úÿi¨,Gy˜Ê‚Nx„B"ŸÉã@® Ô‡®+(?\~êô.a‡WP¼]€Õž…íWPº–—;Ý 0&s‚ò(SuAënB"Ÿ¹±nSBËdÌaà{‹w¹w×|/±™¡â˜LÊÖD^<ã)SÙ¢5!W>üÊ•‰T6Ò®ÈØ•É«3é\4\Òþò—åß,9ó[B_þ’mýWR˜“9Ay”¹ú¨‚u7!‘ÏäXwŒmƒ}}ظÁþû(6¦6K te}çåØ,® ² åa*[t‚"ùÌU-%ŘºÙÿð§Ë÷Ç¿ùÒyϱ²ÞÝB{pÉcÛlœÇ¼‡“9JY}UÙñ{cÀ:…^fžò(•F'4B!‘Ïä¡Q2‘ªl×,Ëfw[23øêiH*“ kKfõXÎù R•a)³Ú¢q£Ègvˆ;ÒªL|î–Lk(ir¦Oé äÝ[Ï5ξ"óåQJ[¼Nt„B"ŸÙ££H£#~]ÁS\MÕÝÞUÌ)í¯"³àe¸xy¡³"“ÀzoÆ1yʃì5£o£Ègrx»F'?’‡#2÷ð2’Í@çÉfjB&~¶øÊÃT6(ÅEå«ãÅÑðÔD*HB׈Ìí§?ÿðçÞ‚ „ýMɸÁûÖ[®sJ&SŠÓèaf)²VkuÐmùÌŽn“SãöÄ©ñ p™5äœ CÒÕI&),2ã)SÛ¨¡Ègò¸(—DÕ¶kWæÍ_oÞ_¼ëMcÀìoU¦ ¥$Z”¾U™¹xãu&eXÊ£ÌÕ9„…\ùØÉnšÆÀsÓRörú\µì_|*Îj¤1,åa*›t#ùLA¡iLéJcn¾{ýÇÝiLÙaM¢'Ë w¦1GuÓè+c)²VïtpmùLŽk‡DWɤæÞ=â`B>—ƒ Á• ‘°”‡©lVЉV!W>iò˜(dºJ&w9˜‹Ëëw½#˜!ïп„â課{ýK4Æ©ûYÊ£Œ5xP…D>sƒÚθ6fP6Žú?ÐUæŒ?Ó¨É&s2<åa*›•B¢UHä3wHTµˆÊòËÃó/ׯ/ºgü—3„{t0&'hïÀvÎøp¹$ÃQe­1èÚ($ò™Ð.@¢ÁúÛËÝ++p¦ÑËr€%U Gy˜Ê‚RL´ ‰|掉ªbª²]£—?¼éŠ)ec—Ë1ykÚ.Ì’ûÆ.Áƒ‹Ic(†§<ÊTST³›Ègn0Û™LÓ—üÜôÅÊàÎâ]À—`T:•yÊÃT¶¨DMHä3w@Tµ”¦/Е¾|º¸yÑYà¯}—/‹[¶ái,¿ä)3Ö¬g7!‘ÏÜp¶s¶Fׇ‹cèQvÎù³`dÅe»oÔPYŽò •Mƪ„DMHä3yHäl!*Ë/R{´Gùª·¾ïÜþ¶Å„ÙáïœéÛSuÍÃáþ‚‚©2”‡™*¨ÀÙMHä39œmi™ÝÚ@ö@}ßYž L}ç³U¨Àð”G©¬uJÑ*$ò™< ²´Ìö5½¹ùôñê²7}ÙaYðRhÛÙ@¶¬› Fc³2Oy˜µ8» ‰|憳7$ôüÚ¾ôÅÛólV.®˜ŠÂˆ%Oy”Ê:¯­B"ŸÉc"o=UÙ®ÍÊ·WÞÅ»ýmUÎ^$9|4ú¶*—`Âq¡™¸©²”G™êñýÈ›* ¹šj™Év‰‚c|©hËš˜@H熎YÍ ‰ÎAÑ8BÆS¦´A'$B!‘Ïä!‘Kã/=º‰ìâæÏ7¯ß¾éÅÈòþ02k³O¤‰ÌÅNŒì¨p ~žò({ FÎF!‘ÏÜp¶)äh`}ØèdüéÆ{¦ Lµ€½F ÃR¦²Q'.B!W>aji!*Ëgݹ˜o//?ýêÝÍmŸ‹©\wèbbñÁ`‘ß—Ò÷¸˜ƒÂi d,åQö­¦B"ŸÉ1íPH&”ç–aHY4­ £ÙDV’õÆ,†¥gSLÕíý][6­Ú¬»®eë]¬ÿ§‘À°”Ùk6QÐ&B"ŸÉí¤Y9ÁÆ>²‡f-[Ïáb|°ÖdùÌ ÊÃT¶èDE($ò™<*J@Z•?kö˜‹ù—oÿù7ßþâÛùæW¿ùM‡‹Ie‡}dÉØèZ“rWYU¸˜‹1*.†£<Ê^mR´›ÈgrH;{’ÅdÿܳÉÄÅäp¦,ƃuAaYÌ Ê£Tö¸¡CAeW!‘ÏäQQ&+Z—õ=.æýõ§þ2{Ìa•Û;p9L2ÆC¸“#Ú)D;ñ×kúŠ0)”ó8˜d€Â8ÿ Ê£TÖ[˜…D>“ÇD)д›Ç¡…ÉÞ}¨&E·?S<$²î2ú¤ºL*^¥ÃRf­ j£+Ÿ<9¨f0°1ƒyh¦¦rgé#«IbN1«8Žò(• N)&Z…D>“ÇDh]Ì¿þë¯.¿, YgSö—ØbK$7-sîÍaürDUÅÅp”‡Ù+è€Ú($ò™ÔŽ…6’ñ+núZ•ISu1Kå ¨ÔaXÊ£T6z¨…\ù¸É£¢dhÚmºÉ.>¿y÷ñæÓ—Þ,Æì¯›Ì@v%·µÊ:»Ér ΩÀd,åaöZt@mùLjGF ŠÛ8nùPæ°9ç0Ùrɪô*³”G©lò:Q ‰|&Š Ý^øMຘ/Ÿ:ןâ÷7liªG±Ð:ÉŠí¶´<€Ê( Ky”­f£i£ÈgrH2A o¶|¨“ œÇ½€±E§“Œ¥“EÇ£´øÀØ£æõŸß÷‚d$;߉·Ü!!då0ëÑã_ÀÛ¢°SùåAÆ Æ©ÚMHä37 í ©ÁÔ¹L%vžŒ+%¸¨pæåa*›•B¢UÈ•Oš;$Z“S•íªÁ|Ý= ãÍ‹0ñ°ù!´wÐY„©Ú–¼Ê¬%Oy”±Z¯‚h7!‘Ï܈¶ÔzrêÃÆQ÷ÀYHç…YÞw< âÒ*ËS¦²Y%$jB"Ÿ¹C¢ªX‘ªl×(Ìç›åÅwv‘™Ãòúy-ƒYJ]¦ê[ Fáºå Ê£ÌÕ@» ‰|æ´½÷$ô~ãU˜n'WÂîLƦ ;ÉxÊÃTT‚¢&$ò™;(ªZ DeC×U˜7—_>õžO®sCÚÞ…DâÁ 7 ã]<Ï(Œ9(\N>Ay”Ê&«¡+3yLä"ͺù[¬§0½¾íNa\Üß$Œ€Zßù¾IŸM0PúÈxÊÃÌ5ë@Ú($ò™Ò´ ¶Vaɹª0¹:ò†-yÊ£T6[ …D>“EVaB_æ¦jô§ÞÃ0•éþrSŠ…vƇÞ2ÌR88ŒÔˆ›+Ky˜¹‚¦B"ŸÙ1mãH@hž;kIs{ž­ý~ ­¬F§2Oy”Ê‚Ó ŠPHä3yPä M»ùsß/$»}ûÿz3»¿IK[3[œð³ `Ö7iék*îsÒÀÈXÊÃŒµè Ú($ò™ÑŽŽ„ƒÑ³áà† &ʾgÒœå÷Å$ãœF™Ÿ¥°!Ñ£Kû/¿ÜöÏÂD_vça\ÈI&Fè¶{˜`ã2³©àaxʃ̵£i7!Wså—Ïc®–ùÃÖ2ÿ½*Œ'”I™ß+z˜`³ Á+`d<åa*T‚¢&$ò™<( ´ÌúÊü77×ï^_õz˜°Ã:¿M‡‹oítÖùƒ 6¨¬¼ä)2WkT í&$ò™ÒNŽ„ÉmÄÈî5’‘&ùóì# Ë­›02žò0•:A ¹ò “EÉ%ª²]Ù‡Û÷õxÑéa’ßJæbôäv²O¶% .Y4ÎÂð”G™«³*vùLiÇLQ2x.JFZ•#4”L³U9¸¢4mÉS¦²Q)(*_M[–C›ÔÔ* %ãå=Z…¹¾~{yÕÛIa(Y©Ñ‡#ŽN”ÌRVØxÉSe®Þ©€ÚMHä39¨m#ñ06mô0÷‘:¿MÍÃhÖùë;OÕ¯k d,åa*›t‚"ùLÙä¨Êvy˜C¯òŸêïÙéclÚŸ1£i;cê§£ÛÇdã4¶’ñ”Glð:°6 ‰|&‡µsj[•—CºrÝÊ9Ÿg«rXÆ}T¸ä)SÙ¬­B"ŸÉâœ2UÙ®­Ê_.?ÝTWÐéarÞÝ^åìâr ¾UbrìÛ«|ýw«1ÒÏSe®1èÀÚ(äÊÇOk§,Öþ8û†Z?ÁɲËçÁÉ‚ õEkx–ò0• …D>³EŽE|oõ£Ýdï>Ütb2©1îÅÁX€à£#ß Ûç`‚‰ÇÉnke(²ÖtPmùLŽjo°áƒ` îL)L°Ë ’F!†¥\^ý¯g4”¹ý ^o}2-‹±¦sð2ú䛚,–¡<ÌbAÚF!W>üñi,6˜Ðp²ú°'{ ³Ô¥Î“ÅÄXrðY Ky”ÊZ§¡Ègji!*ËazB¹¿~wonû\Låº; ìÇäÖQŒïÊbZ†5æbXÊÃìtpmùÌk‡ã|ØxIù ¬;Ï%å—C'*“—,åQ*ë¼RT´ ¹òq³GE†FEüòŒ'ܹ¬d{ŒÝß!e‹i9L)}‡”—²_¶ Ñ²ÌRf­EÖF!‘ÏܰöÒ­J¬•/óv-À Ö´FuyLvÎGþ<åQ*ë½NL„B"ŸÙc¢BrËßL{Òàeï ÿÊtŸ)Lò®ý-@g “] Q%…a)2×`tpmùLŽk—H §…¿ÊÙ×MVRsEU±,QY¾™æQóÝ÷ï¿ï¿sÂwæb–{$.$æVv¸°àŒJµŸ¥<Ê^£ÕAµQHä39ª}„ ×þæÀ†$&Ê…9¨ábªö…-þ<åa*u¢"ùÌUÅòTe»æ.__ýéõÅíÿíLbœÙßà¥ä¡õ“ÕGçà%€?®P0W†ò(sMNÔF!W>ü\ØDæJKývk©ÿ^†z˜È,¢Õð0%ûà‹F©Ÿ¥ü”ÉL*K¡Ý¾Ùþú»|¾î»,;ì?Üí…vM¹töGçBTYÃSe¯àUpí&$ò™×ÚÙúÀžÝØÅb¿+Í 5‹ýÑ{o’ÆT Oy˜Êf•¨¨ ‰|掊ªb¢²ËÅ»ž±Ë×·ßõ¢dü÷î_¼)x%~y‡óþ%B Æa)2ÖT@í&$ò™ÔvÁc /‘Ý+õ{B96°Zsê2&—m²) Ky˜Ê‚NH„B"ŸÙC¢@C¢Ðu‰ìû7ý™ãàß¿{ÿ²tÿâûîÅä  ˆŒ§<ÈX­‰*vùLiW¥ù‘<æ/>œ)IÁÇUü Gy˜Ê…D>“‡D>üŇ®üåæòõÛÝó–>ì2ƒI@š•½ëÌ`ª¾•š•yÊ£ÌÕ&D…\ùðí¿™+¶Ï¯}#ý¾œg1Y}çÙyÅd<åQ*ëŒRP´ ‰|fŠ S•í*ÂÔ¿Ã^ïRöW ¶Æž±å/>wÖ_R4ÇSfò¦ÊQfªIÌF!‘ÏÜ`ör1íGòÀƒ§½‹ Äo23. á]²­i£Æ°%Oy”Êz«¡+3w@T+P•eé=^ùòúSgúâ 0Í+çÆ,+ [¦&3®ÏÁd›LP)𳔇YkÖA³QHä39š )ÀIJ±óPú’È´€jú’CŽ ±‘Œ§³ÇD‘ÆD‘‰s0Ÿ®k:LŒeoæÁ„LÌ¡ Öá` {ï5¶Åð”‡YkÑA³QHä39šM Öj6.î¿×BFJü‘¬T-ñ—d}QÈXÊ£T6y˜…D>³ÇD†ÆD¶kqÿǫˋÏý É¢ÝáÚ~ȹœ‚ ¡ô­í¯ Wÿ5¶Åð”GÙk6:6 ¹Úk™Ò‰n‹IÏÞCr˜D†4s˜d¬õ))l‹á)SÙ 5!‘ÏäQQ¢ÛbRß¶˜›·W?tÏY†¼Ãm1.¹*w ޾m1ÉÂâ©ú”yʣ̌ ¦Ý„D>“cÚ‰n‹IÏÞSe2.P4=Œ/`œÆœ%Oy˜ÊF• ¨ ¹ò ³Et[LêÛS“˜þ*ÌWÅxkpþby«bÒxªô‘ñ”GëqÝ„¼±¢ÈgrH;{b¬'‚×¾ &‡3e0 F}—<åa*uB"ùLS9|èÊ`Þ½ßí_rÜ_þ²Ìñ;â_²ïÌ_’]¶fjä/,åAÆêŒSA´›ÈgrD;$2´ÒÆ>å{«È¥Üú”5ÛÈê;/É9 ÿÂR¦²I'$B!‘Ïä!QM`¨Êvõ)_]ÿ¹Ó»„¼Ë&ecB[tb_“rJ΄ Qá)2UëuÀlùLfõ.°Õ»<”½ñ.ªÙKŠÞ©,ºä)SÙ¬­B"ŸÉ" Þú¼Ë\½¹¸îÎ_`‡féT¶äj2t{˜ƒ¾©xŽò(suAÌF!W>~r0,™)ûÜ=1–º²oÖjú0Ùº*0<åaJ *aQùÌ9¹¾M1o/¯®ú}ŒÛߦ犮ad`ú6ÅT}‹>… Oy”¹ú h7!‘Ïä€v‰$$,qc£ry Q¹¤ó4*ƒõµk\„á)SÙ¢5!W>üî•™T–4*—ÔÕ¨üùæÚšNÿBïµîÅ¿,5Ú¥\B_—r i³)ƒ0<åQÆ¢  Ý„D>“ÚÅ’pðð›? %3”rCÉŒªI9£‘Á°”‡©lÑ ‰PHä3{HdiHd»P²‹ëwõ×¹yýöòýE¯›áÎý½»¨Þ57cz ²dŠ‹¹€|«ò)Ê£l6&d› ‰|&G¶3†ÉO†ùÙéaKRçÏdF¯ÎxáÆ‹[ž¢¤aìÛOï¾\Ü^>Õ,ý#AÅ,ÊÃÌ2+€×THä37xo¡_}x { Uq„lpgr#Ë¢7ù³/§(Ò×l•žUHä3wØSUˆ¾†Ç °§»‘J,îÝ8ðCh¯Ä¥^7’TZÃNQf– €PS!W>yn„z;ˆYò»qO¸‘{U{êFÈz e7rÕUô•¡“cÍÁ¬9øÇ57š ç¸v|áPŠJm„£­6bs8— ñp@MA_ÊÃô5j…=wB"ŸÙÃrì´><6ϸÁØœ÷îFlYö¬7PËFèv#iÙˆ­b– åQfY¿ïJfy'äÊÇNŽ5;G܈s[Üȃو?›©Š/]ååaúš´Âž;!‘ÏäaóÄ8/èFœß½É¬i ¿ÑÙg¸‘ªW: Cy”Y§…5ß ‰|æÆš£%+ˆ£} âŸ=en¤R:×ÜHªªt@-†ò0}ÍZaÏ+¾Éb"} „}tÿð–l$î~nÄÚì3iøµ¾{nä W: Cy”YF¯…5ß ‰|&Çš]$nÄñ±h¨UßùÜ$ïu@-†ò0}ÍZaÏÈgò°Ç%OõUиüâF^<|úÝÈ¢W:s# åQfy¼3¥e–‰ð™kv@ÝȦ)öA­³M±§¢Ó™a(ÓWÐ {î„D>³‡=´%Ä N±Gÿ2ÅnS .7Ò?Å~Ð+¹†ò(³ÌQ k¾ùLŽ5[CK–æñ[?;}ôÄP²çX¸µ¼pðä6ž¢ÝÖA¯T³8ÊÃÌ2+AË«Ègrh9âF?ÔÒ‘{67’\H*YåQúj­VØs'$ò™<ì ÖS}t#ÁíÞ|@>ýn$›U*êåaf ZÐòÈgrhÙ;G¢»¥E\¤¿×{s.7’ä¯'ž¢“‡=žŽ5y~¬©3ñ~ïnÄ@´t…–?zét#p€Ç”ÌrŽÚH8öwh™%>“cÍ!7rØ"$j…x67R·×©0”Gé«÷ZaÏÈgò°'„DõUЄøâF ,ûñÛ+ñýn¤ê•Ε*Žò(³<¦kJfÙ®TÕqr¬9dêFò7rÔ²„,47buÝH±VgL„£~zq{sûé]5¼ÿñ³ÿZ´çúâÍÿ©ï¹ýèñË„?Yïÿäÿô_ýHó…øcXþÑ?,ïñ©|×Ï’øõ‡7O"ðû7·oÀÎÅUý°Ô?ÿÔˆ,_WÊåðzŸtþúwj_í~&}õ3ÄVšaÿÙýýoÎ|õÃhvø£ÿØþÉO~vÑ¢¿=¤…Šc>è.;ñÎð;áþÌòêiòa›>°µ”§†Mí+®Ô¾,FîÆàHÓLñðU:d0sªzÐÆBT“îˆ1ÄÒ™b 6¼ØYÈà :Ó–Ó×#oíþ>(l£Gr”Åyñ~ïUº•ÁÔÞ‹N൧Ãû}x*˜i)Ù¢…ÖäÉ&ÙbGr”jñÖîU:d0{œbiœÂ÷|gðêÕÝßÊ«WøëÍíå{ï^½ºüðóÿëW$úæýçw§üÆÁgüòwßþ'ù%\»Ö÷á7j2š­+­°Ÿª¸Ío”$}œŒ#9Ì8żWéÁÌ-NU'ÇJ[ÆJJ"@¬ôp¥G6‰àHŽRÍ(Þ˽J·2˜º‰û Cª¦ÐéBk¤KA¯¶‡¼}‚Ô%'½þŒ#9ÌàÄ»´WéÁÌ}JõWMXÉ:<<«¯Žø‚D*YZ¾ %'Ü Á‘¥šI¼!{•L¦$,ZžS´úÚ$R³Ú“/ ã‡!Ñ"ÕÓ|_èÈö8p$‡œx«õ*2˜Á…@’öC·­ž‘17Y_à½Í§\8’£T3‹wU¯Ò!ƒÉä¸|•®¯¸pX±rž†?üóï~ÿo¬KÀ?ÚÒÂpø!Ø(ecŒm°xRnxb+œ/ÞYÙÒ3Gr˜Š÷P¯Ò!ƒÉA]Èž!ŸÙlíz[(“š û‡’½•Å8’£TÄÛ¥WéÁì¡KÎT5¥nD´s÷7"—š‚õÄ9¤í7"C¬ Ùb4Gr”ñÎèUºÕ§n‰^Ê@,0ö·}ê®JëÝe“Çê”fk x顎ä0åoƒ^¥C“G.)’N‰Ä_ªìs)ÂKú6˜àÈG:\cÚæ!¡áH2B0FÏ]¥C“ã¹åpt}Xv*‰” éÔê]­ê]„×á³4‡)gï¥[Å[9ðÁDÚ™ÕN¶öXÇÒÕÇ×W—ß|¸ºyz1¢$¦Ûîï¿aé¼_‰fs“RÇ¢&ÉÐe’ÖJc¾(r˜ô-žDm…‡ :êÅë÷·†š¾ /¾giÓÎ(ÞD·Š‡fg|¤ÚùX‹ë†œ¢÷9Õÿ%õˆâüæ„ÂF“½ðµ–æ(#tN|æh9ÌûFcZN}VNYË…]Ärï[¸&ÁÒ¦I<€YÅCs0UÕήœân âöâæÏU]¯¿ysuµm ¢2nñÎNÆ „][LU¿Û3Œ˜$ÙÞW–æ(õ^|Ji9Ì GCÆ©ëÃ–Ž§r/Ã0„.™§¶Z T²œìbb–æ0ýÌâáÍ*r˜=¼!3ÕU©k{zpŒîõÛË77_^÷8‚°îÇä\Lhï cþ:yF¶¢ÁÒe !ˆ£Æ«x+?;jlHz1[nmÝ_K!lɵ­¥EQg„Rî›eiÓPqP<ä0wˆS‰ {+u]ë@ìl×µæ-}gã!Ù¤eû­£Rɶβ4GÙa òÃLwâ!‡¹áâh}³Ãúð¬¡kk)ÝÖ€bµÚgµNø Ks˜~éHÅ[9ÀÜ‘LÕ£@õó9“×_û‰hƒ}ñKEû6€­s›ýÄQ©d!)–æ(;LQ|Ði9LŽ[C )Ë÷t=¹è]K )¥|bxÌE¶‘–¥9L?‹tƒâ!‡ÙãC )Ëßsëô\Ñm‡~"E›Hå¢tLâ5Fµ'AžrÒ™Õ6„ÃÜÐpHŽ.îØt+Üóar«þާÞE/Œ<±4Gi(éHÅCsG2U)éþ±X=ÛÒùÉ=E„¶Þ)u\Á:*•,òÄÒf‡YFñÃÜp<6âàÖɼæ.¢Ëm0O©Ä‹·‡±AídiŽÒÎb¥ã9ÌÇT5²D;ù‚|Ï–§J‹£û¨Zƒƒ¥y¸U­]$sxO«ZÇ’|ö,Ía6ÒX/Š·rà÷LdsŽtÍ:¿¥köÆD=‚WŸÄ«zn²ðá*–æ í,ÆIÇ+(r˜=^ñŽjçc]³<7ø³»¹ [œ!_‚Í}±9U v,Ía&Ò /Ї&y=m\÷|ãzGÊàúVXðI8e`iŽÒNëÅop®â­Üäá‹·‰j§ØbتŸ»[ {ð-x­ïÀl^ {T á#êÍa6W¤Á\9Ì æFg< Êxèù©®¤{Éqkù¥=BqÙÈ6/±4Gi§óÒñ Ї&Wœ¡'䢯(íìÙÖÿÍ[jë½!—$¢-Û7BˆAú–Ks”z# æ¢xÈar0÷x ¶lìx(o¦¨ç !9/}£9L;ƒx ³Š‡&am­ |k]WÞ¬Û_ÞkÞàZŸ’/›ÍAõ#Ò%Xš£l.Xi0ÅC“ƒ¹>’ÈìÄEÕ'·³zB7‘µ°^É'Äì¤×þ±4‡égXVñÃäËñŠ0>kOßO2²¦oO™ƒ1Í%„²ùÄñZ³Æ}ë)°¤jIçÀµ!&Ço“%Í®‰ï¬êÀ’’Sß´T ¤ ÂyGs”v:+¯¬â­ø±³‰´Ó‘NºÄ_vüªÕµþjߺxÿ«‹Û‹W¯þõÝëOo>~wKZ`yñúíeýÏ×_.?ÝÔOÿÍ7î›7zº+9,ÜŸ+ɯ0×w`6·½–%ñ Gs˜±fqàw9Lü&Z¨N› ÕMÒ¥3ª‹uÞ 'ÍQÚYií\ÅC³:´P-TŸÃ•ì²Â]?iíHvLî’lX¾ ¢ÆÊÐf¬ ޝâ!‡¹ñâKËJêÖ¬Ä?PÏÉDõz†5b†ªx¢£4´š²°†6ùÅÜÑNU¥–šÔ‡ç,ýéªp/% °>&k]û I:žXÒ8j•ðOt˜)ñ‹Ø(²˜7>®¤Æ‡gÄ&‰GqêUå]ˆ² Q<ÑQ ½øIl”YÌÎT$…Â/³í+w®Dóä¾fžZe£˜íw®Mõ/A¸M–':ÊîŽñ‰¬Ý­ò­vÇæóØжàÛN:ì ´MiÀ®¾ëœðRXžè0 ò‘Ë*²˜d¹ '\g‰SÐ$æ |Èbî0§jR  *‡]¥Ã¹¿½cW5’ÎÙ⫾Ó]´JºÎÁdŠÖxqåCsÃÈÉx ¦¶G½‡]‘Œ£’JgÈ8’ Qx— Ot˜Šfùpf•YÌÎGUô9Rê-Byñ‡m‚meÅòI0Þâ UÂøKt”)Ú $£|+ ?9 †\J³åRêCCà`Õ/¥ÚÖJïâ‰SPgVùÅÜáLÕI  šÇŽ¥nÕø[úÅ?šTà×?ÿUŒðóðé×?/ÿËÿòç>Û” üâ—~ÊoÜ7_.?™¿˜¯ÿ6Mw€ÝáaÖ¼\÷i5’\6f½ÓVÙIAžè(wA€^åCsÐÉÚv›µ>l¹ÍúÀ¬`²9PôAÑyé Gt˜‚ù i•oesIU'3UP¹ó¬UGÏužuÇS9v¬ïÀÄÇSžû㉎²»ãá9a»»“YÌŽ*§Bp‚ÌFªO.ž²9߯Ęœ¤,Žè0- ‘Ë|ÈbòÈÅdO”5§'–Î?ß,¯þËöÒy2Ðrí½”Î}Yú*ÂuXç·Ñ‡”àœ‘¸8¢£L4$y¬y•YLŽ5×ä›ÄniK9ä±t¸½¡<öJ®ÿ+ pqDG)h4òAÎ*²˜<ȱÉQ}¬òùrssûéâõe‡±©ìωؔÛÛò©0›H45š ÂýW,Ña6šÅAh”YÌ B'GVå‡ÊžQS'™ˆ£¸°V*£wF£b‰ŽRÑdÅã”YLç8²/·ê•ÜXyrö\cåS×ÔmL¡M&KWè>µ¦~Ô*aØŠ%:ÌA.FùVyn¸8f’r—§<Ù[žr<½¦þ«_ýcæþÑýüýºÀσK¿ú98€ŸÛ_”_øòKÿ¿ú…;US·›jê™d,;ª©û¶»oùÒtd,¥˜ Ò Gt˜‰ƒ82ò!‹É‘iGŽ@Õ‡g"5uGn@éù  OŒ°DG)(xù i•oeáæ’ª&‘‘&'xª;רyƒ®Dhó!.o%L&¦iËÚKt˜Ýq¸åC“ÃÍÞ‘zˆ÷Ï!d=sUGØ1$“L°Âõ–è(-^d1y8ã­ÌñÖ:Órjf¿Þ|6©í×Mîp_{«·8h•0äÄeŠÇS „Åܨrò‘T }ÚÒ­ûääSV‡œRŠòKJX¢Ã4ʇ3«|ÈbòpÆ'Oô±nÝ-™E6»ƒœL®_§Äü··à¦lmiȉ#:ÊzQ¾•?4Ý9Ok~K-âÞŒy"dC«E$-ÇsvâGt˜‚&ùÈe•YL¹¸@kA²ÎU‹˜9‰È°L|¶F[ç #‰8h•4äÄeŠÞÉ£¿«|Èbrô78’D~×ÖS“ 9ŸÏ9Aõ÷Ò»×Y¢ÃT4ˇ3«|+‹4y8¼§*úœ¡¿ï¯o¾¼î˜Ö8L-ìkZÜrÛÉ'ò¥èÈ7 ’ŠÂý·,ÑQZ¿sòz'²˜†,# fËíñ‡v®§`"¬¶±ªx6ÒPKt˜Šfñ0åC³‡9†taûØò ǡֿ÷Œ#›9Б|IÛ3ŽƒVIïËe‰Ž2ÅÄQa”YLŽ ?G뿯£l@¿l‘k8.¾‘%:LAA<œAùÅìá Ð|ƒÿmŸè+¾š H¡´,b'`K8†·g¹8,5;Žè(³KQFùÅä pt¤ù)òBzf¾£;CóS.1An~b‰SÑ"º¬ò!‹ÉC—è"UQÁæ§è_šŸR.`\€V·ˆ¶£ùé¨UÂÍO,ÑQ¦˜“8(Œò­,âÜ pÌäN}Ø‚9…{šÈyñìš!:­ES`²Q¸nÁ¥¢`Ä”YÌÐT­¤k Üc˜ÓCu‹|÷éò‡‹««_|û/·þ²‹{«^,%pŸÈ­¿lÒæ¼ ÑÒcY¢ÃÌ4‰CÃ(²˜N4ïH›òއ.Ò9òŽâ ¤(ŒH±DG©h±âÁÊ·²0s;U•"UQÁ¼#½äˆô[ÄØ@ªÔ“w”å*¹tÞÁfŠYFùÅäàp,¤·6–gõÖ~å-LP÷ÎØúÂ…óžè õÆJ4M>d1{@cHwm2‚ݵɼt×nÃB2m#ÂöîÚ;­’íŒâ‰3EŒ›|ÈbrÀ8SS̼)>µ¦Q(ÙvG¼¨ùŠ˜¤—ðDG)¨uÒáL“YLÎdÚº—ùÖ½'bT¯?ýõúÖ»ŽîÚlíÞð)°>B0­Ô‘ 90þ4|ªjD²øOt˜‰i¹É‡,憑SŠ$ã¨ÁÆsú¥$‘­;ñ!¹~È–¶ÛöÂæ%„Îx°©ÈöVñDG™hMØÅMt•o5Ñ29€|Ü[ŒÏÊCB¤t["¢–)&í­â‰SÑ æ¬ò!‹ÉÜúM£*úX&²µÊɾ V5ᨑ¹à—I8žŠZYã³^CÈeŠÁˆÈ(²˜@Î@*â™ÇØ:&42´‚¸Ò„†³Ö¸X„+,Ña ÅÔoefg R¬‡çr®zøžè0ò‘Ë*²˜žè0ñåC³‡4‰d{³‹ßþî¿üå¯ÿðª£-¹pûõ¥$ŸH bGvqÔ*áKt”)– £|ÈbrˆøøÖ~)Ö“³‹LèÆÖ€¸Lèêx ð }c':LE‹|@³Ê·²€Éš=UQÁ»I%ënÒÌÞŒñ@±¨`;¼ÅA«¤s Žè S &ŠÃÂ(²˜G Šàž5îM*ÞàÛð…VÅ;@pÒ7öx¢Ã´È‡3«|Èbòp<Kýs†½¿®h=ಓŠ6D°É¶Y°Û*B1^úÄOt”ÙÙ$ÿ®ò!‹¹áßlˆÙÕ‡ç TP²p?>“ö Å#¼ª–':JA‘\VùÅÜKÕ¤@ô9ƒÝ?¼ûðööözûP^6awƒÝ|ò¥MÊÆmìeiAF¢8¢ÃL4˃«|ÈbnP8‰‰òC!Oìv„®=CÝ"ZcÜÒy/©¢,ÑQ*ê­x˜ƒò!‹ÙÃSˆŠZ±ºE¥õR·¨Î°&·Åƒ¥tÔ-ŽZ%ÜÅfŠ  £|+‹<7(œ ÐŒž•qPg¤'JËW$¢ô–è( N<œAùÅìá ÐŒä:¢²)/Q œ5Î×ÞJîèˆ:j•pfÁfŠ  £|ÈbrP¸_Q¶øŠ{Q‰’m¾"iùŠc ÒyGt”‚F/̬ò­,ÜÜÁLÕ¤@´×WÜï‡*ÄUì8¯¨¾á«îÙÒã+’ïp^ÁfŠE(FùÅä@±õ­Â]¶T¸ïÏæ‘ÄâPæ_ë‡Z™Å²‘:I/©e‰ŽRÑäÅÔYÌÎTU"©¯ r Í+±—…æ©;Ö·â:š'0Á9á~(–è(SÌFFùÅ䀰µ–˜"_?µfñ•·°Eß[ä꘣žäf‰SÑ Р|Èbö€†,¨rË¡êwñåXRÊ®(m‘`¶fû±¤;­>ÁeŠ`Å!a”YL ÛÃb |`A‰'×,,¡›ÛAK§µ÷£ÆD.áþY–è0â ʇ,fh2 hø©óNo‘™^¾½y X L€öV[ʶz‹²´·àˆŽ2ÅâÄAa”oeaç…CÌm»`}ز]Ð=[„F?·XŽŠØ(ì-X¢ÃT4‰4(²˜; Yª€TEÛ/øtoQ•Ô¿x‹ì’»rê[Ia»·(Æ»„ë,ÑA¦…Q>d19(ì ´ÀÍ/—´úk܈ò†4&*ùŠbJ?hÁ¦ Y<œAùV|:9‚z㨂²áL_fáMyñ°¬Ýò‡r‡µq[}EŽË¾{aS䈎2EëÅ!a”YL §MðýmŸ~´›QZ»‰ÕÚ@[?$9'áÝå<ÑaJš¥š&²˜= É™*)ëÝúü…ƒðâ/ê¿[KüÅaŒy›¿ðfÚI²¹Ot”)º 7ùÅä °'·ÈêÛžøä*7ïö©­Ò|·7rÞ(Ȧ¢ Ò4ùÅä!4ýMlúÛ™]¤øâ-²‡åJƒÂM>d17(œ½#C²žß®þT$Šäž[À#ì+œµ. ïˆâ‰SÐ"Π|ÈböpÆ{ª rûëWñeŸà²«<š¶1{ù lß'è]гpGOt”)†$ 7ùVqvP˜\®¬ÏÚùA¨Ã7Hù’?nZ–öÑQ*x8ƒò!‹ÙàáL‘»„T‰½\B:tDEr6/û¼}ç‡wPŠîˆâ‰3Å$ £|ÈbvH8$ßÅ-5î{÷Vm$tc3D•¼…ËÅPaoÁ¥¢ÉŠ4(ßÊÂLÐ8r¸>V¹]|©r/¹…Ï‘¬ta{•û¨UIv'-Ot˜)fqHåC“C¡VöÀƒOžä.Ž&ÃyE©+jÙ©Z²ðUžè(%ÍV<¤AùÅä!M(‘*écÓyí¥ýÿ.?}¸¼Z~ߎմѴRÜNVÓ‚-5×pm#™Ü{ÚjZ|0 ]Ò`‰³RGŒQ>d19bY Ò–¥ ÷$²¹5¢¨¹‘`’—©X¢£œx¬ƒò!‹ÙcLV‚„,¸$ä—• ˲ÁàhI#Äí+AZŒpÚÁfŠE/FùÅäxq $íˆ|kדÓOé’¬CéX·¯i’IÂkÌy¢£T´xùpf•YLÎĩР®‰ñe%HõùÐeÜÞŠß¾d™è±Y¤b‰2ÅdŒ8^Œò­¦X&Ç‹õa“·¸¿š6QºÍ[$¥å´>FHFx9-Ot˜Šñ€åC“4z‹ é-‹·8 îåâ) Õã-ªÎ-X¢£LÑq´åC“£Åt%HÞ¶äÈ ] ´1RLÅHç,Ña*Å”oe&hèJ,¹$¿¬9œHŠ9Ó¨ž• >%’ðrZžè(S¬oFÜWùÅì °¥U û¬cÝ´jáô«UÍ¡¯¦å‰SÐ(Π|Èbòp&8Zµp’U ÷RµX™‡BÖGå`:ªG­n­e‰Ž2EïÄ!a”YL 'GZk“ßÒZ{/³0„¬oµFÉW€39Hç,Ña šÄƒ”YLÌT¢ *ØX{˜]<‹¯`½Ä6ÿ ä2€õäÄEr¤ö‰­Oà–^ÂIKt”Ý‘8a»»“YLŽþ&ÚY’øÎ’§–³%Ëlƒ–v ¹d/D°D‡)h\P>d1{ä’UPÁ;« ^eZ‚owVSÚ~;ÏÔSx-Ot”)Û~dMq•oeá'Ç~“!‹’Ù²Wð¡´ÉZuÀ©Ôßao£¤‚²D‡)(ˆ3(²˜=˜1™*¨àNÁd_v ¦eÓG¢7¹cÙ¾S0˜h¬ö<ÑQ¦˜‚4öÛäC“c¿Ù‘âÄ¡Yîm²dóGöäÎªÒæ`‹QØ[ðD‡©h‘gš|+ ˜<œ©™:QQ/XžÈþ¥<±4>ëHf‘íöòÄV% SLs˜bŽÒèo“YLŽþfCÚdO\…íÙ•Éé=oC'{ß‚':LE‹x@ƒò!‹Ù©Š ¶É6ºíÝ[$ˆÁÓÆ§T¶·ÉçL´ [³à‰Ž2EHÒp“YL ;Gï[ð³»'¼Exh_¹óä¼…RÕ¢êº+!ËV-x¢£T´ñ€åC“4ÎÑëNòº…A¢R‹£×-lå½-®ç,Ña¦˜¥Aá&²˜KÒ|°[*ÜU-À‚vÕ",•¹(|9':HAkÞ'Π|Èbòpl  *Xá÷Rá^v kÉNA0Û+Ü!,±ðOt˜)‚8$Œò­,ø3_™¢'m²žÕ&Kq(I‡ 9Yé<žè(µN<œAùÅìáLpTEe!¼l MÙ,i¿}mˆ6†Ã \ISd‰3E‡„Q>d1;$L¯[äM×-˜;«„î®[„X“è(¼–':JEhP¾•ì̤¢äºE–¼n‘_®[,ÞÂúHGðrÇu‹bIF‡b‰3Å" £|ÈbrH MóËó®¬oQÈjg5oQãb㥑(–è(õ^< AùÅä ’þ#xeõP°yñËîH² `û•Õ=¸è„ûgY¢£L1qPåC³ƒÂ‰nÀ×XžZµð‰"ûž½–·€à­5ÂÞ‚%:LEƒx@ƒò!‹Ùšì©Š ÞYx¹³š²r"Þ"m¿³êwÄ‹O[°DG™b´â 0ʇ,&…‹#HTqbwV«®µs‹rX¡,d17, Æ´Yîúð¬óx$»cõg¹£Ë8®lvÁ¦¢Y<¤AùVi’!*Ê7ywy‹Jìe–{Ùü±Ìs7oQÊöYîlYn'Éš"Kt”)‚—†…›|ÈbrX¸™å.üé×§V.l¡téYn%o–yÂ(œ[°D‡©hhP>d1w@SU‰Â¥|ã^'U^f¹S¶Æ›Lf¹ch½EŸ’´·`‰Ž2Ťaá&²˜ŽdOT‰Ï:bñ•·HAß[$ŸL‘ö,Ña* â ʇ,fh(\Zx¸´Ó[¤—Ü"- ³‹·¤r:r‹ªR ï‰â‰2E0QFùÅÜ 0˜IšŸžWçö„n&un¥ãÛq©¦Kï‰â‰SÑ"Р|Èbje!*Ê7îu"Qù¥Î}˜¸0.¦öVbG¼«ù‰ì47Ot”)Ú$ £|+‹8;(((žµù2¥ÛÊÜ x â-¢õNvš›':JEhP>d1{@UQ¹*÷1–Û½·(y™º!ÞÂwT¹ øà“p•›%:Ì“8(Œò!‹ÉAaK‡Ÿ?ütÂ[ø{Þ"üŒja(mLÀ°>A剎RQo¥š&ßÊ‚¿1Š:㨊 îþpæe÷ÇRå6¹]o[> ÛwÜi•l-Ot˜)fiP¸É‡,æ…Á’æŸ3{z¢œi°VOT²Á—ÝJª(Kt”Š+Ð4ùÅÜÍ]~…róyàìË|ÞÒA[lnu‹úIØ>Ÿw§U²Unžè0SiP¸É‡,&…-9bY¶ìþ¸‡DB˜na_áBŒ`dq(žè(N<œAùÅìáL¢  ·ù£{Ùü‘rÕib|[ßJÚ¾ù#Õ°Ø™$œY°D‡™b‘†„›|ÈbrHØ‘³dàø³dOÍ,‚J˜Üä^¶—«ø‹X\qVvÞ‚':JI“hP>d1y@ã| J*X·pá¥nQs ëCiÓÜàÜöºEJ)k…s –è(S<Þ5E”o5Å27( 6$Êò\[h+©3 Q¹fF¾ÈvÐòD‡©hiP>d1yHc£§**ˆDfÒ^¼… 5‚0ä“ÐDeŸía¸WÔ9¢£LŒ8(Œò!‹ÙAa ³ÜÄf¹]ÑŸåNJ<ìùUQŽè0â Ê·²“4®Ð¸Îr»ò2oq¨r§B°(—·Ï[Üi•ì¼Ot”)h)˜b",&‡…]²Äù»°O®[¦¨¥á¬Y¢ZWT©)tµ –è0%â! ʇ,fièPЉ6ÃN‘_¦¹—:wª_*‚EÅíÓÜ99ðÒ›y¢ƒL±' 7ùÅä°°u´Îí¶Ô¹ïmü ‹òú7.r³ôp«(Gt˜Š&é¦É‡,&i¬£•n/Yéö/•ÛÖr°v{¥;çú.Ax÷Ot”)Z/ 7ùÅä°°Ï$Ñ÷ùY•nGɪ_æ^’+¼ùƒ':LA³x8ƒò!‹ÉÃOÛö<ß¶×ç+<¼T¹SJn[Á§íUîêp| V‰â‰Ž2E¤Aá&ßÊÂO û@’|¶lþ¸‡DQ_½º¯(1™,| ‰':LAA<˜AùÅìÁ mÃð|F§¯ˆ/{?ª¯p¥$C|…ß¾÷ãN«„Q(–è(S<ª¡‚)Âbr@Ø;šW¸-yŽŽ(ê+œz^±lWEƒâ‰SÐ"Ì4ùV0{0CaRÏä¾Â¿ä \mÛ¦¢úVìö¼âN«d1(žè(S Qnò!‹Éáà@Î’-8ŸƒA%2l|k5IJ³õ—_ΪÉöCñD‡©h‘gš|Èbòp&xOUT°{6„—îÙ”øäIÅ"¸íݳwZ%‹BñDG™bLÒ€p“YLC·`ž5Ç]…%„m+pÞ‚Š¿€}ž¶à‰ŽRÒš©J+)ʇ,fi ©p+Xáö¥Â²³‘^΃ªÛýE±%iÁfŠYnò!‹ÉAaC·DÙM[¢ÂH”%K¢´¨’-d­ZðDG)h¶â ʇ,&h,Ýe%wDÙ—Q‹¯€h2òAèÈ-ŽZ%[µà‰3E…Q¾•EžŽž„m1lÙ?{‰Ê‰Š¡•³U–±Þâe‘(žè('Î4ùÅäáLý¦Q•Û?[‰½ìŸM bÕ²­<úíûgï´J6³à‰3E…›|ÈbrP8Z¸E~ŽðÉ“y)ÂŽT—f~‘Œ5‡ž3I%e‰ŽRÒâ¥Cš&ßÊÂÍÒFhñým;ý… /þ"‡è\$“ÜÑÄíþâ U·x¢ÃL±HƒÂM>d1;( .[²‹û[¢<9†tÀãðtžÒ5$kŒ3! ¸8AuŒšc¼tXCD“Ç5¡8ª§‚)F(/)FÊËù]KF.lO1|‚¥bd}Æ ª£¬Ñit˜ˆ<&‡‡c¦ f­ñ©Y†õd ;‚!^Ci¢Û§’ þÚ²°Ô ªÃô4H7D@ä1yts¢zÊn5ëL4À¿xÃ=zê"¦°ÝkdoJ AvÃà ª£¬ÑYi”˜ˆ<&‡‰“!óÉ®AWü7x&%à™Ÿ/íóÙ¿¬IÙú"A¦²Ý¾äN­@¸žÁSeÑ‹ãÄM@ä19Nœ)2•Ÿ‰LQ² î1ê‹.Qúh÷ ªÃt4‹G5M@ä1{TCq©,‰Kå\jA¥² 96‘zp©R#@¸–ÁSe)ˆ£ÄM@ä1;JœIŽ‘øoÇ“+àÙ¤°Xÿ@Ék€èŒðŠT‡é)ˆG6M@ä1yd“2É3¿,±³š/yFÊÞ€µ¾!S)uäwj%;›q‚ê(kÌQ'n"Éqâ 4†ƒ-{Bî!Sd6#²%DÇcã-¼$äÕa:Z¤#" ò˜<²É´#<óáyFyY’rð5Õ0m8#çíkB‚‹±éÙïTGY#$iœ˜¸òˆ³ãÄ‘âÄ|ôÉÈí´Í‰œñÖê´ ÁÙl½ðâÚTGéi1Ò‘ yÌÙÐ>Ì÷itzü²0$eSJlÉò]ؾ0dU+Ù®©T‡Yc’ÆŠ‰€Ècr¬,A§À>¯NÀ)pœR¦²5É$>Ïz‚ê -µÆŠŸni®<Ìä± XÛœXrÒç3À½`SÇÓí³UߊَMÙR¬Ï „Á©Sd‡Ùc–ÆŠ©„Èdv°Ø“³ÞÉ?~Öû×¹üÙéyð@)3C¶Â³à¥ÔôNü®÷)²£4ÕZñip"!2™<ÀIž–ßøáuâ:^½ºû›yõê½¹½|ïÝ«W¾üôáòÊ»oÞ\]ò-¿þß¿þå¿ÿÛ¯ÿxð/¿üÝ·ÿI~…Ð@׬êcXï²Í¯HÕÈ›¨HµÃ‘“ßÿzq}]ÿöw(UÛÒa=‰¸™Þ';ÌLAJ¦"“ɱd(¤¯ Êã}U_9”{–§”[k•ÒZôúÂ}#¾]äÙQšêœBèƒ"“ÉC(jêcÝU¬Cù|sù©Û¾³¸“?þæw¿ý'>c¹û“- Ëò#RdSȚÚÆuxŸL´N¶g÷Ùa6[¤!g*!2™s†@¶;@`·;œö.÷Û°È&uˆmìÊ*­R¯¯<ú¸ÛҺʒ¥«Þ+DB(!2™=Š4Šl$ô˜ùp[]K§{˜w™­D²d›´·ú“pëd;zO‘e£õWQ°ÑUÂÕFËäxt¡½’…ï•<íOîNˆ;) ~˜ãðÂdá­Sd‡ijPˆ|PBd2yäSÀSM}¬ÚÎz“뛋ëw½ÉJ1{ó&Ù×$¶¥º%Û­ÞÄYobŽ>Éf'§È޲Ñh¤!j*!2™¢.D|%b9ꤗèž";LM£|(Ó$D&s‡2UŸ^xö‡”_ZS²Ã45 M½“pe’ØñDšJŽ¿Ô‡ÇN1±Å‡›/¯ß~¼¹ýæò ÄË•iÙ[ùáPÌÎXM]¾f+´¹ØèÀ›ãŽHAC}€ò([­/HØV"$òa `"su˜+ï7ôàÚDHûÖo“Žk9¼uorˆÕä•–§fö¨ÈÒ¨È>Öv¿üåý•ïu1dÙèN\L BjC]Œ ].Ɔ%‚ .†§<ÌZ³œM„D>“ÃÙÉkMü·eKC\L²Ì j dÒË—`NP¥³Ñª„EMHä3yX”,É`’íÊ`ÞÜÜ\~xÛéa’Ý]“—5(%Sú’‹7>É£d'(³VÐ@´‰ÈgrD;Ðå°µAù^Y&”IƒrÖt0iY¦’°”G©lr:A ‰|&ŠíT>Â=Ú©|Ý]âß_—r®ÿFÇ^êG£«ÄŸ+CU¼ Oy˜© 4›‰|&G³éöò” ìä/ž’>K?õ@¾s‚ò(Í^%"jB"ŸÉ#"z‘½<~‘u/_nnþx}ÓéaèáöxpΦ˜Ú°üWgÚ7xïÀC¥$o­<åQÖ FÏnB®ÖZ&dz­ò§­Uþûg±ÈL¢E~Å9˜ä½I`ÚÈNP¦´A%,jB"ŸÉâD‹ü©¯ÈñæËõÅë?÷bdû+ôçª,K  ½ƒÎB¿÷ÙyùFå”G™k1*ˆvùLŽhçH³~ËwoÏ“Åx_¤¬âb8ÊÃt6êÄE(äʇ߫2“ÎÒ,&ve1?|¾¾é<|RG­wæ`lÌÉàv’úBgãK\’"ce(2Vo¬ ¢Ý„D>“#ÚΓ$ÆùI̽ ¤QÙ…–Ã(ö)'¬Ñ)Â𔇩lÔ‰‰PHä3yLäÞâ'™ó/¯?ýõúöÃåmï4LØ_lXök¶wàúr˜`ê2Z…†§<Ê^­SAµ›ÈgrTÈBðúðÜ}1ÄÅÎÁÅ„ú…tN£‘Œ§“GEHk ðÓ̹˜?½»­‹o:=Ìa¹Î¾< 8Èdί¾ßµ-&-kS³Q˜·0yT…FEü~›G]ÌŸ.ß¿zõÛ_ÖßúKg&SÌî°²ì­W.Ö¿ èÃÊRÍ”½QX}y‚ò(›=®äR°ÙUHä39´]5…Ø,?ÅÓw¦õ³0Çwî¯ÿ¡0ÃS¦²E'2B!‘Ïä‘Q)4“)}™ÌÁÍ,ÿ^Ù÷ú™²¿tÆÇ`Œ1äóÑ™Îx²ôú(2Ú”Tî&$ò™à¶Ôh-o´§ýL|¨±Ì˜3ù™å_*é Ky”Êf£¡ÈgòÐÈ–DU¶kAÙÅåÕçë›/¯{ËÌþV”U-1ž‰±Ð·¢,-khœÆ&Oy˜½f„» ‰|¦F¸±íuyØØ»|1«Äüyz—S ®¬q ežò(•«¡Ègê¨hQ,CT–ßGð˜‹ùtqsñæíUß™…ëþz—]YuÓÞíë]NÑe(?½]/b¯,åaö :7 ¹òÉS#ÜUQ²'öšÙûëвH(Ck¿‰š.&fHz—yÊ£T¶8¨…D>³GE9S•-]hÙeߘE­Ãî¼Kðɸ@¼KŠÞŒw*%–ò0S`…D>SÛÎp?’‡Ù½¾e’À˜r&Œ,B Y£o™§ú>GS*µ¤2ÃReµ5ÉбÚUÈ•ôu"«µzð–…6 ežPvmFMsÌ?ïJ±å~–ò0•M:± ‰|f=eÛr¯{q°;÷b ˜ÖÅTß)î¥þ/hì)ã)²ÕètmùÌŽlÓn2·µ›ì^½Ÿcà<Řll0Õ­Ë«,Oy˜Êf•ˆ¨ ¹òI“GDŽv“¹În²Cóéòúͧ/ßõ:·ÃÆ2C¢mË®³±¬ª] V£m™§<Êj“W¸›Ègr€;Øð#yxî.’ÇçÎ’ÇdãCÉžò0•Í*±QùLKʈo²~âÿûwŸoß]õ:šàö·M&&W#‘æh‚éÛ&SÕ®˜ •žò(«ÍAænB"Ÿ©an[,]”nùEé§Mx`Ê߯óÿ³ %;ùžò0•¥ØhùL-ŠESðëš/þ÷Õý†û«û;Wl¡þ¡¯îŸmýWÒØºÌSeªU°í&$ò™ÛŽ… D~!G_“L8Ocmñ±hx–ò0•-: ‰|¦ˆÅ"þ‰ïÝ|ú®²ÞE2 ëýMùûê[ÚÝ’úÅ€¾)ÿl—óóQ¡ìÏSe´%é€Ü(äÊ'Nr§@ê2)“ÜÑ~ÐÈo(ذV&Ê6Ý7CS–kÄ-Ì,åQ*¼RP´ ‰|&Š¢¥ø®íê,{wýöªû~ÌÂuwíephñ‰|9:ÛËê2ª¬_æ)²×ãûѰ×;!W{å¶æ±WÈÄÅÏ}CCÚËš‹Qm/ Å™5’–ò0• :Q ‰|&Š€n ¾Õúiõ˜ï.nn«wùK§£Ø£ÉU=Êa`¿Ž&” ^%—a)²ÚdtÀmùLnƒ'Ððûwûê1ÜyвšŽ•=ÿ<åa*ub#råfèVWàÝâ£õ˜Ë›çd ìnsÉeB2ÄŸÎAÌè³NcT†¥<Ê^³ÕA·QHä3;º]hA†Ÿ’ØÐ[æ)e8O.Ó²yK#—a)SÙ¨¡Ègò¨(Z)]™×WŸŸQ³»‚ ؼä-¤ ™EßœÆ%žò(s§ƒn£Ègrt»d²Ñ¶dv£m_É¿€?S“½-IcH†¥~nPÛ×̵><7…BÙ·4=LrÖê€d,åa* :A ‰|抪–¢²¾/…ùô¥»£¬òÜ] “c‚Ú;°)LrÎÿ<åQÖzÜ©a­wB"ŸÉ!íèÞe~Áiê`¬!¤É§¥ZÑÅäì|T¸·ÌS¦´E'*B!W>0wTTõ”n^ÎÝ›—«î~èݹœwWêÏ.FïÈìeˆ¥~€ŠÓp2,åQöꢪB"Ÿ¹QmkS›î¯Ïî÷„r¶çÁÉŠ5Ùd ÃR¦²E'.B!‘ÏÜqQÕÒLUöÛÊþã_ÿ¥?—9,îØ›› àÉÑekc߈ÿ²O¢DÕþ<åQ6ë“ ¶Ý„D>scÛ NBlÖ±ÈÆŽ2G(»¶›V³Þ¶,ŠBÓ2Oy”ʯu(¨ì*$ò™=2r42rldô¨›ywñéºÛÁx³?³Àê8k;LqÑj´,ó”‡YkV¶›ÈgrhÛYb­ÎÊm)³ÎgKY}çɺ×T–¡“GE&Ó‚_ÏòíŸz½‹Ù_Ãòâ] àW­¾ƒÎ†eX¶TÛ¢p6†§<ÌTAÕnB"ŸÉQmoH4è  öb¼g)Ä€ BPhXæ)RÙìu"råã&ˆ¼µDe-Ûcÿ„¦{ä²ò„:˜äBiÆ•Òé`B8ŽÖ(X+Cy˜µ<…D>“ãÙŽVúÝÖJÿCýÖ©Ò|^¡ÒÏS¥²Çu) *» ‰|&‰­ô»¾JÿÍÛ›/¯»ñ±Öø#²­¤¾ƒÞ¿“ÆLžò(k-FÏF!‘Ïäx¶4ƒ‰ÏÍ`>æS<>æ«KWéVæ)SÙ ¡Ègò˜È'šÁ¤® æÓÅÍû‹Î^åÊsLÌÙgRã÷¡3ƒñ%&•™~žò kÍÆê Ù($ò™ͶňY6Äø“'/+1Ûæa4O^BðlШñ³”‡©lÔ‰‰PHä3uL´h)•å ì æâúw].fẻq˜þ/m˜ÜSúÆa Ä÷påí•£<Ê^­Ó´QÈ•ÒNŽä0ÉmÌaî õBÙÇ3¹Xvò©¸Žò0•M:Q ‰|¦ŽŠÅ"9Lâ7= ’ýß÷ýU˜äw—Ã,‹/m!MdÉvæ0јè­F™Ÿ¥<ÊZÓ´QHä39¤Ta"ö)Çr¦>åh‚³Yáš2Oy˜Êf˜…\ù¤Éc¢™ªlWæ—n~ÑíabÙ_ÆBI)»örg&zïŠJ#Ky”¹z¯ƒi£ÈgrL;ešÂäç¦0ÄÃ$8S&†êӋЇá(SÙ¬­B"ŸÉƒ¢O•…®æýuçÖËÊpwùKч­ÈŸRoþRã§ÒEÆReª!èÚ($ò™Юaˆ'1òÇp¦Aþ¸ìè)E~–ò0•¥€hùLUwHU¶kÿæâýÕ»?õ¦/qƒü~9¤Iúâ;ùãò Ky”µÆ¨g£Ègr8;g æ¼qqÿw”+±ó,î_vóØ ±¸Ÿ§“ãÙàˆµ‚{nã(år,ƒ/Y¥Q™¥“Ú@nlXà7sžv/ËÂ×þ%Ò¹­lJŠþ¥¸ä“ ›ÈxÊ£t¶X•¨ ‰|f‰‹jñµ°ÇüËe·w!Èï^¼ ݸòÑ0ÞeYx¤‘¼ð”‡Y*¨ ÙMHä39š ‰C\sÍyÖ\—-˜¬â\8ʃTŒS ˆV!‘ÏäQ(´)Åôݵ¼êÝÓÍþÖ\Ú\ß94ï oÍeÕ5*–<åa¦ZT€ì&$ò™Èvæp^XT¤ sƆsyÈÙ*Ô^xÊ£TÖz¥€hùÌUÅ2Deù«y—77Ÿ>^u÷+ϼC]ÌmÍe9\¿ëq0`‚) KbxÊ£¬µ~Ku¬urµÖ29]Jb#׾˒͙L©‰»Æø Oy˜Ê¥˜hùÌU-MTeY{ÌÁ\Ü^u¦/%ûz“éŽËrØWÔã]Š6)Œ¿ð”G™ª7J0ö*$ò™Æ^® XotëL_Ò™Òo“QÙÒÏS¦²Q' B!W>a*M_øC±y—êS¾ë¾”\™î116´â¾3¡3ñ‹ƒÖXÃSe®Áê`Ù($ò™Ë>VŒ×þÀTßšþâN­9ÿR|)¶xü…¥¬M[—=d}>&Ù‚×ÈaXÊ£ì5y@…D>sÚKK ñ1üŽö-(Y¦¤ÛšËšNr}ç*U–ò0¥Í: ‰|fŒ" Œøœëñå˽Æ&»;cŠÉ¥m‰Y1ú< ”tÜg&o¬åQÆšƒ¨B®|üä ¶ ÄX]Íb♲˜b–“S}d,åa: :Q ‰|&Š\ Y ¿‡é1óáúýõò ÷f1qYŒ75m‹”óYL1Þ«ÑIÆRe¯t`mùÌ k;K[•íÖVå:Éœ=W«r©¼Ñq1åa*[tÂ"r哇E–¶*Û¾VåWÝkb*Ï–úSÉ.àšgz[•ëÿÕÏŒF)†¥<ÊZKÔµQHä39¬íh)Æm-Å<°êÒyR‰Q-õ—ä“s kbxÊÃT¶(ÅD«Ègò˜ÈÑJŒï«Ä|¸¼]úÉÞwº¿ÃJŒ« ˜ ¹×[‰)ËA“¬’Ãp”Ùë2 d¯wB"Ÿ¹Am"ÙDâÆMdñ§.ÆJºuÝXÅe—¹fÙå"?΂ò(¥=æ›ÒJK„D>sÇEU³èŠØµ‹ìöâæÏUw¯;[ÊBÚÝ>²åZ¯kM}¡kYU¸š¥$¿1æåaöš5€m"$ò™Ø¾õÖ¹‘Kwè ×Ê–wž‹F±ÿåQ*[ZIeï„D>sÇEUKUÙ®‘Ë7o__¿¾ùò:u&2!ìnðlÎÁûÔÞ뼬çƒÉ^>‘9Ay˜Á‚²M„\ùäÉ‘í 1XØxwì¡ÁË鑳ø˜`Oòƒ—'(RYUHä3{XDN}/]Ö][ÉnÞ\÷WcBÙÝá1p°ìì7äÃÑuxlÑ·e ž|5æåaæ Ð6ùLm_ÄúÀïQëºlY‰¥3y°Ë1* •å(RÙà•‚¢UÈ•›<(òÅQ•í¼üÇÿøößù›ßþÛ7¿úÍozª1e³—®”Hn[Ö/G×ìå¢p)j¬V>Ay˜½%`{ùÌ l»˜ID3nHbl$¤¡Mبéd¬Ë!)”üOP¥´ÑëÄE($ò™<.Š9S¥e¯å=æd~¸üÓ»IL„°;SsÝ’SKbbŠ}Æzç³B½ÿåQÆšŒ®B"ŸÉqíèLýF˜ì^)†´”Eß`2Å–²úαFÃR¦²A'(B!‘ÏìA‘§A‘ï‚É~x÷áíímg±ßŰ;˜lñ0)†@>0™3!$…ãc'(2×luPmùLŽjרõGòð܆Àd‡a¾sÀd˘qQÉXÊÃT6êE($ò™<(JäÞw}èÊ`Öb§‹I~IŒ]ZeÉ\L²IŒ‹Æ˜Œ¥<Ê^ÁéÀÚ(äÊÇÎkÓá~¿u¸ÿÞ2Ò´ì<î×mZöÉfe'(SÚ¤¡Ègò¸ÈÓé~ß7Ýóúíå›~'ãw8Ý¡äìš“ñ}ÓýÙD_ã•<†¥<Ê^‹ÓµQHä39¬S›Œ©'cîå1‘Rn%QÕJLŒ¢Â 唇©lÖ‰‹PÈ•ye&•Te»æbþòþêêÝmï%²œw7.ÛäbkY®aI§‡Y66+lÁ³E©ÎvMÅüðç›gx˜²Ã¡Hå°˜m}¹o(¦ªÛ²èL#c)²Ö#†¨a­wB®ÖZæÆ´½)íBm}`¿-]•þJ Îä`|¨9¼F†¥{ó0Þ@‚¶2 ú9:< ˜äBÒ@ÉXÊ£Ì5È…D>“Cæ!s üvø 9L&”3³ƒPÃÃ88 Ê«,Gy˜Ê …\ùÀäAQȤÊøŒë1óï>]þpquµl èó2!ﯓ—^‚¶5À‡ØY‹XfˆÚÕxÊ£L6E`…D>“ÛÁ‘<&ðó|}ÑÁ·³FŽF®+ù?üó¿ýòÛù¶o1MÕíÝ%2©~ÙR  ë;°‰L‰©ä¢•±”GÙkN:È6 ‰|&G¶£%öùóŸ}Ñх󸘒–rµÂ™žò(•=®3TPÙUHä3yTId"ßOóh¹ÿõŸßw¦0Ñí.…¥zI;t4)Lo‹ÆÄ Oy˜±f\…D>“ãÚ>Ób?Âw¡©Äγ[s…ÝÁæåU–£³Ú´™,nm&{¨Ìóyj0~Ù£4¶Òð”G©¬ó:A ‰|&Š"m&‹}ÍdŸÿtÝ]‚Ùe™ËíæI}]dUÙr¶N#a)²UoTðì&$ò™ÏÎäöL}ؘÀ<‘å3ÝžñÖZ_@aÞ’§ó§×Ÿþz}{ýéÝûw‹ ½ÛcrÚß›!îG¬ï ôÝ¡ñ‡ÕœûÉxÊ£ìöØô(o·(äʇožÆn]‰ôX3o·§}M<½=¦;Ïöï’­!¹BÃ2Oy˜Ê&ð…D>s‡GK‡5UÙ®†²O7—Þö9˜Êseà!€%§šc_G™_nm[Cg<åQÖšœ´B"ŸÉ¡íâI5¦ð«nú.i–Ъ1š—4—^ý”²Âgžò0•Í:1 ¹òáKr©l Õ˜ºª17¯ß^|øpÙ[ð/agL‰®UdŠë¬Èxoâ“•·WŽò({Í^ÞF!‘Ïäð62a|{†‚?u1ÆœÉÅDc‹Æžò0•Í:Q ‰|&Š $ª²]sýW¿ÿø¡ÿ˜f1»›ë¯.¦À!¿]ß<ôÍõß)œFI†¥<Ê^!èÀÛ($ò™Þ†@àmˆÏ»$gh 6˜Ló ÷CR™‹a)SYPŠŠV!‘ÏìQQ¤Q¿›éѦå7ýƒ—w“-KìœËŽ|7:a²l20yÊ£¬µDP…D>sƒÚÁxÿ#yˆÏ„ɬ!¤CO[šô\Lȱ§ÑWÆR¦´E'*B!‘ÏÜQQÕÓL•–m…|(ûô¥;‡©ªÍlwýûv19æ’]+õãbŸ‹‰ÎD•C1<åAÖêMÒµQÈ•OœÖ†B`íbåæbJihµjãòÒk£F©Ÿ¥sEUKiå={|öò¯×·Ý³—`w8c‚±¤ÐŸKçsGEõ=¢³™v-ÃT•þä]gãrÚ›‹IàKHÏÔwpXlØãb¼ñF%‰a)3×¢j£ÈgnP;8g‰¹:vG×™J¬œÉÃD“AãF Oy”ÊVeÒQÙUHä3{TähT䨍è1óáòöÿWÿÛ½Æ3‹+þÞ=L(¨‡±¾Óä’\TIb8Ê£Ì5T…\Í•ïןÇ\½%æê­dãݹ’˜ìŠQé%c)ÓÙ ­B"ŸÉ£"oIã]WóÃû›ï»û•+ÓÝ%1ª^dh.Æ›Þ$&'«rè’§<Ê\³ÑµQHä37¬l&…Óú«‹5“ gÚ‚™ÁT3PÉ8ÊÃT6*EE«+Ÿ0yTdäݺ¶`ÞüõæÃíwíô0v·ópŠÌ—Ö®lSçÌ .{•Å1,åQæ V Õ^…D>“£ÚÁ€0ØíÊ&1Áž©_9—”bQq1åa:•¢¢UHä3yT¬§:ÛÕ¯|Ü‚Ùéa‚Ûc¿r,€G—Gg¿r h¼Ê1ežò(k-NÕF!‘Ï䨶§µ~¿µÖÿP¿²'¥~Õ~eðÁëL\²”‡©lÒ ŠPHä3yPäi©ß÷•ú?<ÇÁøýUús0q0¾·Ò>ÚÃd‚µ2”Yk0^ÓF!‘Ï䘶¥CývëPÿ½­1$#3ýª ÄÇ:ve–ò0•ÍJ1Ñ*$ò™<&²t¤ßöô_|¾}ûÿz!²]Nô[Ú¬\¦s’=Þ^7VŽò(cµAÑF!W>ü¶âyŒ5Mèõṋ/I²9OSL2N%a)SYÐ ‰PHä3yHÈqÖúеøò‡Ë/·ýeþ÷·÷2f_‘æaŽg‹:0yPi &öÕ`Yu/.&î¯ 6Á²î’|9úª0ÁÆTuL!‰á)²WU í&$ò™Ҷ帟 X|ä´‹q'·÷/ÄZ»æöþ`³Õq1<åa*[T¢¢&$ò™:*Z+P•eÛG;Én®ßõ.¾¬L³Ý›‡É1A¶¸4¾¾ƒÃîà³ìYÕX|ÉSe®!©`ÚMHä39¦]“ÉÃs÷’‘2 øó”a‚[Ÿ˜Œ§yrD2Í_òsó—H(CË_¢ª‡)õ-ÃQ¥²ÕÀuTvùL~<øÑ6²ëë·—W[/Ãá>Û¾È-½ŒÆgé岡*ê”úYÊÃT6êÄD($ò™;&ªŠe‰ÊòÇ&s0¿¿~ýûÛß׿£ÛN ¬2ÞÝâËÃ}˜vúª¾Ó·ø²êï4bXÊ£LÖ9d…\ùØÉ‘íBËýek¹ÿ¡bL3eÁ…˜uÒŽò0•MJÑ*$ò™;0ªZJ²¾rõ)ßõOõ—ý•ûÁ:rYzËý¡úª¤2rÉRe®ÞéàÚ($ò™׎&Ñ<&Iæ1ù\yL1ÖZÃQ¦²Y)(Z…\ùð›X&RÙLó˜Ü•Ǽ¿¹¸ù`{S˜¼»¦† 6Ü_ßAìMa–aMÅ—<åQÖ¼¬½ ‰|f‡µ‰SØè`âÉ™þJ,6£:Ó—ÕÀ ”±”‡©lÖ‰‰PHä3wLT‹c—ƒùÿ.?}¸¼ú_ý e)îÎÉ€ƒª'$‹I¾ÓÉÔ f‰ÃU,–¡<ÊbcжQHä39´]ÞºøÜÝd$‹qñ<÷aBŒ%;Ê<åa* :q ‰|掋ªbyª²]ƒ—?Ôÿæ§Ï7 üXâ¾\Ì’Çä?/_ŽÎɢ–áA¹–ò({MQ×F!‘Ïܸvt&{5çbÊœ=Ó\L̾š¼JÃQ¦²E)*Z…D>³GE†FEüÆÖÇ\Ì›Ë/•l¯ƒ±;ŠÉÙšv!&ÚÒ9—c Ñ²ÌRe­9éÀÚ(äÊ'Nk»B¬Õ¹ýʕؙ–Çdç|Ô8£ÌS¥²`tb"ùLyã©ÊöïWö®ÓÃx»ÏÆ´å1õÃÑ™Âd—‚Êžò0sM:¸6 ‰|æÆµ—‹i?’‡C1t“Ubå<)LPã²åQ*[¬NP„B®|ÌäA‘%wYÝÖæ»ïßÿ©ÛÅØ¼¿±˜%‰iû•ë;ˆc1`Á•j?Ky˜½fT…D>“£ÚžbüÖBÌ=”,ʤ“5] €¬²_™¥\¢V0W†ò0sP…D>“ƒÚ–^Ú­ƒ—÷&û‰‡±dðRÕÔìƒ/¥~–ò(•µN'(B!‘ÏäA‘¥ƒ—¶oðòâÍ—‹ëwýIÌþ¦.sCŠ¡½ƒÞ©ËR êœ!c)³×¢k£ÈgrX;q16º˜{•âbB9‹‰6Á²þD^eyÊ£TÖy•¨¨ ‰|&ŠÙw´lSë:syûùº{ì²rÝ¡‹É˽:ÓÞAîs1ñp)Tc} Oy”½z£‚k7!W{-“ãÚ!Ð!„çnÀ$ÅþÛ`¿f±?zïMÒ˜Šá)SÙ 5!‘ÏìQQ Q?ÈõøØåëÛïzýKÜáX?„â€øß7Ö¿´Ã—ì4ü Ky”±£j7!‘Ïì 6m& [›Éî•ú=1CÒL¦9uYx¶Éj¤0,åa*uB"råf‰h3Yèk&ûþM?Dö×JVýK4ÆòÙè«Â,‘= ˆŒ§<ÊX£U´›ÈgrH»èäEGúò—à<ùKªÁTˆ*þ…£°¿íãÙë·»ç-#IÍ÷äa2©óGï:=Lð%F…fežò(sMNÑF!‘Ïäˆv¤E˜øì" iVŽå<‹Éê;ÏÎk,&ã)SÙ¤­B"ŸÙƒ"Z„‰}E˜úwØë]öWI˾—Z‰?öÖ_R4Ñ€>ÆReªÙë€Ù($ò™Ì‰€ õacý%œ.ñ‡d™ Oûd[ÓFaKžò0•Í: ‰|截–ÒEz¦³þòåõ§Îô¥jö 0õ»Ö6÷‡X: 0Ù&T ü,åQÖ AÍF!W>~r4;'R€Éù¹ƒ0$}Éù<Éb9‚ÆF2žò0•˜…D>sÇDU±²‡*üÙ·}dªþš»G•Åý<åa*[tb"rå³ÇDŽÆD¾kÙ§ëšÀ„^ãw·ìÁ$ê`lß>²ªnÞ{m1<åAÖšMÔA³QHä39š€ Ù5ázæ e ”Û¶ÕIÖˆŒ¥yrT;yÒ¨œüs\B9´Få¢éb|ã4FùyÊ£T68¨…D>“GE)Ph7t5*¼ºìÉÂîZ•uK¶‘%×תœB*Y¥U™§<ÌXAÔnB"ŸÉAí’H<ì4“Êfª²]­ÊïÞ¿ïö/‡5é»ó/ ñ/%öu*§d=¨l»ä)3Ö¢ƒh£ÈgrD»X‘·"»Wç'ÊŧS¹¾ó’œÓð/,åQ*›¼NH„B"ŸÙC"GC"ב]]ÿ¹×»øÝ¡c‡EdÙ:òÑèDÇ’3!h”øyÊ£L54…D>s£ÙÉÄ Ö‡èØ½Œ'”S– d×0ê;øØQßT< Gy”¹‚Õ³QHä37˜ŒõÄ\ísñ1K]Œk™Õô1`jp‚B†§³‡E–†Eü£ÇÛÈ.¯®ú}ŒÛF–ªª”Ü0²dLFVõ-úÃÔ¦‚¹2”G™kq*€vråcç´“%»7êÃs³˜@(Û–Åh¶‘õµkã)SÙ¤5!‘Ïäa‘µ$‹±¶+‹ù|smM§±vw9Ì%‹‰ä0¥/‡›²)³–<åAƺtÍèë*$ò™Ð1¶Lˆic ÆÿÔ¿B9µŒQõ/)Gc42–ò0•Í:! ¹òIs‡DU±º><¾3æÆ²¹M¤éÕù/|™M÷1§(Ó׬Q!‘ÏÜaQUÑBô•ŸÞ">æ”ûøý¯ñ«ƒë *›î§Ý*nã¿ùÝoÿ‰õëŸlp ‡xñ¾„ÃBœõ•D²æÛOï¾\Ü^>Õ,z%ކ¢<Ê,]P¯©ÈgrðÚêFÊ7òÀ^þäÍÙ܈&‹Ca§(ÓWÐ {î„D>³‡=ä^Õ2A7âÍ‹q È ±ä ß,EñÆãS”G™¥ 5ùLŽP»C;ëúÀŸ¿=áFîUíi6Ò¹ÜHp‡ TA_ÊÃôµh…=wB"ŸÙÞਾ²N¯3 ÌB¼Ý¹IiÞf©úÜÈ¢WⵓS”G™eH @4rå碓$ñQ,IgËF¢ òÄNQ¥¯Ñh…=wB"ŸÉÃi6Â×ú:³‘ô’¸d 47âC6’£Â—S”‡™eÒšï„D>“cÍÞ‘lÄó÷Ë:j#ÞŸ-ï¼N6ÂP¥¯Éj…=wB®|ÌìawT_³ïwŸXlq†|º³‘`2Èw Ÿ¢<Ì,³Ö¼ ‰|fÇšiÛ¥ãÛ.O¸‘Fé+¥r&7l,òm§(Ò×l•žUHä3yØã,­åÙÇVæoµœÛ»q\&nÄßíFÜâ‘TÌ’¡<Ì,A k^…D>“cÍÁ’läÄ>ÁŽl$¸se#Á/µŠ¾2”Géëq¼†¾Þ ‰|&{¹äP³‘àvŸø¼AH~ù8ôg#‹^5³ “˜eQšW!‘ÏìXs!Ùˆ/[²‘‡J쾜- &Êï¾?Ey”¾¯öÜ ‰|&{<í,ô|ga§1»ÏF|u¸‘`t»‘˜° fÉPd–Å%¬yr5Ë29Ö"q#!nq#f#ñln$E+òåaú´Âž;!‘ÏäaO -!o ét#i÷nÄ.[|  ¹‡ÐïF½ÒµÊ£ÌÒ-¬ùNHä39Ölè>°¿í 7rïL q#–œ\Uv#Ùû j1”‡ékÔ {î„\ù„Éà „µ|®ßçFla¶þìËxɹ֩eä.7+)vŽò(³tV k^…D>“cÍ‘–Øã¦ûC V<[‰=z“t¦Ø9ÊÃô5*…=«Ègò°'Ò{”,±ÇÝ—ØÁfºê©¾’þûA¯T:µ8Ê£ÌÒ;%¬yùLŽ5šœ¸ÖÑ©ΖD 3ÅÎQ¦¯I+ì¹ùLöšÉl$¼d#‡ùChZáÙˆÊù¬S”G™eðJXsüê|Vå39Ö3ÍF²Tm$æ³e#!)vŽò0}ÍZaÏÈgò°'fšdÉlöžd ² å¸$³Ï,z¥Rá(2Ë”°æUÈ•ŸkŽd#1lÉFµâÙ²‘ÊJgŠ£D•†_Žò0}-ZaÏ+˜<ìI†¸‘ÄŸšës#‰;¬³+7’ÀÇú=hZÇ“ç}n$ÐY†ÂQe–9jaÍwB"ŸÉ±fK¯öÚ'\ímn$<Ô©ENö*»£³ …£“cÍÙxb–†=|ÝÑ©U5ò\nÄ™¬³á—£[ ¿åQúê½VØs'$ò™<ì—©¾ ºð{w#°ü'-±ƒíw#‹^©ÔF8Ê£Ì2-¬ùNHä39Ö|<¼‚l,Ú1Åž œË„èu6ür”‡ékÐ {î„D>“‡= ›ø3 ¿ËN˜]»‘ì]ÌÖ4P+Žûõ¹‘E¯tj# åQf­Ö|'$ò™k.–˜eá ¬µ‘bÏV‰>&ÚCy˜¾F­°çNHä3yØSl ú*X)n÷µÁÑ[ìÅô×F½Ò©0”G™erZXó+;9Ö @A-µÊÙ@­d}Ê úÊP¦¯I+ì¹ùLöPP $A­²wP+Ad ä~P+{¾tÌrŽ{#Éd§…5'Ò2·ð™kŽÔ‚¸Ôz¨Ä~è÷8“)EçÞGy˜¾f­°çNÈ•Oš=ìI${>1•ÕéFÒÞA­êFBήM±Cèµ½Ò)±3”G™%x-¬ùNHä39Ö\2ÉFJÞ’<jÁÙ²‘ VçÞGy˜¾f­°çNHä3yØSr¦ú*˜xÉF‚ùêˆnIýÙÈ¢W:%v†ò(³,A k¾ùÌŽ5’þhQ¨UâÙ²HÞë”ØÊÃô´Âž;!‘ÏìaO¤µ<¾’ÓéFâÞ³XÎæÒ†ßâû³‘E¯tJì åAfiMÔšï„D>scÍÙ˜æFêÃ7ò@6’=›)!:;Cy˜¾­°çNHä3wØSË}å[BºÜH%¶w7’­1Á“N­RúÝÈ¢W:%v†ò(³´I k¾råÃW¦1Ë”< ’ß²SëÞ]CȆ¶S˨ºðt®r”Gé«3JaÏ*$ò™;쩊Evj¥ðœZ¿ûíoþ“n½…VÕ‹°d›ïÊ> &ðdÜБZÿzq}]ÿNžæ5j¤â58Êì0)AË«Ègnh9›âI0W„³js®R„dtŽr”Gé«·JQÎ*äʇO?gÒ×LõU®rœØuò./•ÓÞ/t—B½Ò9vÈQf–Y Z^…D>sCËÙ$Šañm9Û³²Éç°`±•Æ,Žò(} V+ì¹ùÌödŠañ§;1¬¼{ «~½¾v#±Ã:è•JcGy˜Y‚´¼ ‰|f‡–}!f¹ì4íZ·„lÈ÷%7^gÚ£³‡=fÏÍž;ÝÈRµÜµ9`Z©5fÕƒíw#U¯t@-†ò0³,ZÐòÈgnhyÙŸô#yêïÍölÓ†RÔ™6ä(Ò×äµÂž;!‘Ïäa%Ó†õAÔÚý´a^š+$__Iÿ´á¢W:Ó†åQf™Ö|'äj–er¬Ù’iÃ|¢þßS9Û´!äu¦ 9ÊÃô5h…=wB"ŸÙÃ2mXA-»ûiÃ\“‘ÒÖWÒ?mxÐ+P‹¡<Ê,ÁhaÍwB"ŸÉ±fë¨eýPë¡Úˆõù\n\Ñ™6ä(ÓרöÜ ¹òá…&ÒWO³g/jÙ°wP+ÈÞ’Úˆuý Ö¢W*Ó†åQfY¬Ö|'$ò™kv–¸綸‘‡²çÎæFе:Ó†åaúµÂž;!‘Ïäa#w ꃠq~ïnäPiüòq8åFn7rüÕ?|¾º:ü³ï*Åo«jþÃßÌÿð7ûã«?ûï‡]™7_^¿ýxsûMýŽülù/^¯ÿÅú§‡P—ÿúÛÏ^ß½Š»ß ÿfÝÏß}üôþâöæöÓ»jxÿãgÿµhÏõÅ›ÿSßsûÑã— ²>ÞÿÉÿé¿ú‘æ ñÇþ°ü£XÞãSù®Ÿ'$ñëožDà‡wonßÊÌWõÃRÿüS#²|])—Ã_þé}Òùëß©}µø™ôÕÏ[i†uüg÷ô¿9óÕ£Ùáþcû'?ùÙE‹þöH@’bžWe(ú CôQøƒ~'ÒgGfù'çWê.¬ÛyjàaÙeÎQw°hi›nêãHÓÌÃZIÍ\¥C¬×žI5¨&_–î‰1bñL1^l‹,¤rÓ‹+©½ƒCwó¦!¢ƒÉB›ÉQ—ý>âç6¯›Èâ‚!Çoèy*˜i)YffOÚD+ܚǑ¦š ¦¬Ò!ƒÙã”@ã”ðØêÿW¯îþV^½úÃ_on/ß{÷êÕ凟ÿû^½"yÐ7ï?¿;å7>ã—¿ûö?É/[PÜß.˜ö¼Ûì7J’>•Ì‘eœ9Zi㼓neئ¡yŒÓ·"X}ØT{(‰ð¤¦”D8ëJ‘M"8’ÃT³H‡4«tÈ`òÆ·z×òð ’."¨´H¹k'‹_†äžÖ·žæ êOIoÑäHŽ28ˆEÚàî¤CynƒsÆ’@ͰaåS§|( ´œ0Wö©j´l_6Gr”j#¦¬Ò­ªÉìϤš‘ª&kH]¾ÀY·C_LŠÍØC¨±Éø¥Ø%ÛqÍ‘fpIÁ]¥C“#¸>“¤Ýó‹Ø;ð$Œ¹Éú‚šÄdáûÄÉAªYŒ‘SVéÁäaŠÏ¤¸àA°¸àá\Å…?þáŸ÷ûc]þÑ–†Ãψ¹‡ÑºöV)7<±Ηš`È–ž9’ÃŒ0Kƒº«tÈ`rP7Ö%âÛ£÷T܈ø‡`™Ô\Ø?”ì­,nÄ‘¥šÖЇ.wÒ!ƒÉC—Ðöv/lWwŸÖï¼ÁmÉ\[§¿$‘a³s¤çl8’Ã,¤‘ÛU:d09rk3±@›· hÞ[yl¡K®"Y¥¦èÞCIÉQÊéœtä²J‡ &\,N Ëo^êsÎ69yú,A—ÒöÌE§‚,¼Ä‘f„EÏ]¥[ð»*æ1ÂHK qS©á¡²sÔ/5Øšìá«*,ÍQÊy,»ŠöD¬â!‡Éã—H« ñÑjÛ±tõñõÅÕå7®nž^Œˆ»,FD g¡\Ø^Œ°!Ø\„»[9šÃL²Hc¾(r˜ô ´ÄêA¿Q_u”¾ŸÂÒ¥!ˆ7Ñ­â­ø«93i')IÉ’D8_IbbÈ)–¶æÐ…Žz„­^Ü ÝbiŽ2Âú»Há*r˜÷‘æñY9…õ”nK*XÅIÄd¢pÕš¥9L?ƒx³Š‡&ab¤Yß øÔ9ˆËÛÏ××ï¾ysuµq"¦ñìg졇e}a{޳ƒ$ÛýÊÒe ÉŠÏ)­â!‡É‘áà‰ÏhGÿk^”й~e«,ÍaÚåÛ;ñÃäáMðdR'ðó¨]-°aÉÛꔎÆÕ¸Ù#$ÁÈ)Xš£l.;q x9L'Z¦H›Ê÷P'CÉê—)Rp¡'ÍaÚ™Äã•U<ä0y¼’h™" E¤]Ö!r.­ÉÆÅŽ:Är'IxáKs”ÍGzWñVnr¤×¶kîËÖkîá`õ¯¹×W Æ o]âhÓÎ,¯¬â!‡ÉãH¼bŸu»ý§½MdÌ^ö.Ï59j…»ýx»­If^¼ÄÑetŋ㺫xÈar\7eš$ðƒO…%Û’¥^WW?nÉÊ& ,ÍaÚ âƒÓ«x+‡@wT*Ùv%–æ(;tIìEñÃä`oN4£à¡é'ß/ „n&—§‚ŽŸ.³fiŽÒOo¤#9LÉäL3 þdEgF/ÅaÐzY$G¾Û3ŠƒR OZ³4‡Ùa–F€Q¼•CšΞÄkÙo9 ñP[kö­"¨T²Ž&,ð¨v²4Gig°ÒQ Їfb| ÚùØuˆ‡¼Ä×ML9´‹ûibŠ!“bDv›/>H¶bÍÒfsYëEñÃäX/âÀ<ëX­E€õZD´5®¾zÎÒ¥ŸÑIG,(ÞÊÁN±€ T?Ÿã~’9€µ/™C69Ep¡¹‰â6gG¥’E˜XšÃ중^9LŽô‚#k À³k :–¼‚gޤ½Ø Œ/±4GigrâQÌ*r˜=ŠñŽj'»‚ø‰óÔ?ܼ½}}ýîºcžúÉílžzˆs2ä;a6§.8¾ ÁÒf EFñÃä°µÄ@­Ý²#Üßs‰ÐudIxRr Þ@neiŽÒÏìÅÛU<ä0yxc-]Sl…[w¶Eá3§¥fôÎÙ¾+ü¨T²­±,ÍQvF^ÅC“CÀ¥?QʳnI´…7Æh(RYv›Ê6Ʋ4‡igŽbP<ä0ySJ¢Úù/ñU¢ê§ßc"‘S®@Øš9¤¥ì-ìXš£l®XiÅ[9˜ÉàIëHá7ótìÝ(Éj{ˆÎKŸŸciÓÎ(¯ xÈaöx%fª¬-u•¬K gò/{_-{-‡d“ƒ€X5JØA°4™ 5VûEñÃÜØï2Ló#yز†ã~eºd‡UªM[•ÜÈV°YšÃô3‰Ÿ7YÅ[9ð݉ô“,â¨r‹8*±s-â˜ZŠ€c]õ­ÐÕO=2tP*Ù 6Ks”Z' ñ¢xÈarˆ·Ð vÙTÁ¾×ûJ; )aku:Äw‚³4‡ég’ŽcP<ä0wSõˆBŸÖ°7” ©Kï×O¸¥ÈCŽÑZ©~ªŸ8(•l>ÁÒe‡Î‹ß„\ÅCsƒ¼Þ’OXë(An%ëNõUCN²%–æ0íÌâQÌ*r˜;Š©jD² ˯Ñï*AŠÞ;+A@ I ›²y«_¥¬•‘`i޲9¤A^9Ì òÖ_HŸ·d” *¥¤îªsFØ#p4‡i'ˆÇ+«xÈaòxÅdGµS.o¨ÄΕ7Lã f &ZâÒæ~Öâ³=lë5:†æ(£ QÔ]Å[9„¹A]W芴¯H{êj&2Q,3¨*írÌÂCs,ÍaÚYä–;ñÃÜKUHZ•æSØN(Ɇ()ûCÛ$—R™~*”ê7„KÍQv£8¤»Š‡æ†t½C’uxÖp5…’@}ÝÆrÉÙeÙ¡9–æ(í<žs’ÕÎ;ñVí,sÇ0UÕN±uÞ–ý­Û€äLi'’½Í›×m”˜Ž3’6ÇÑfsI¾]ÅC³Ã·äðo}xÖ]QGȦÖ?®U‚NÞç"»€‰¥9J;³WVñÃìñJ,D;ù¥—}PRµÌ—¼!€o `ë[ ysÞ`Azó7Ot˜%fñ{Ž(²˜Õué¾ ØRs¸w\ÎÒ…@n(ALÖÔß¾·+ñDG©(Xñ#Ô(²˜;–©ªD—n€`ÃÀKÃRë—õ8eÊÛ–¬5ÖábOt˜)‚ø­G”YÌ øzWHϒ㇧MÐÈzÓz–@ÉWXo×à‰ŽRÐâÄÔYÌÎTM"mK'Ö•÷eÞ¼ A¤óÒ·ØÊÖ¶AXkƒ=,Ô5EŽè0S,âW«Q¾•Lû:Ú/âø~‘§BPt^ΑMüj™Å‚ðá†&žè uÆË‡3«|Èböp&'ª¢rÛ˜–ˆúÅ[ädJU‰ÔÞJÚ¾É:Ë¢¬)²D‡™b?hò!‹É!aG¦æ¼Û45w¯Ñ‰”°Wï}µÑûšB û –è(µA<œAùVü@ýD êi8³eõë?]}üÓÅÕ»ÿwøð¿zõ‡Ÿnß}øþøÿüêò»‹ÏW·ß|¸ºyÈ»|]÷vdÎn/uïúKÁò½ØÜ/»è\%&ìIX¢£ Õq¸åCsÃÅõ×%A[®™ÞèhÞá馭¼#B,ÙÊV¿y¢ÃT4ˆ;(²˜<Øñ‰ôëù$wδ{9gzp&–†Rù°ýœ©M&V7#ŒR±DG™¢·â€1ʇ,fŒ=Œù™ñ”ÊÓMË[¤&I£T,Ña*Å”YÌÐøHU”õmÞ"¸o‘ÁçÚñk_ó«oqÐ*áú7Kt”)'£|ÈbrÀØ©{¾ó•·øõ_.H/"¡\Z d1{DShDÃlyìFÑï>\}üþã‡o.úËú“_ÿï_ÿòßÿí×¼ ¨rmµò¼€*.厶öiéÈÞ P-ÁÈa­¤²DGhôâH2Ê·²ps#ÉÎ'R¶4Q¹{³@èâ´Ú¨ÀAˆÂcÝ<Ña*šÅã”YÌçTU²DEõ!OO9*±—6ª¥åÖzß¶8“;Ú¨ €—] ÅeŠÉ‹cÅ(²˜+Ž ŠÏ¨¥K*¥Y>[|M:ã`‰SQhP¾•Ež; ©ª©Š Tñ Z6ÊZOnéÔ·ÒP•g'œ[°DG™bâX1ʇ,&ÇŠ#¬üdmOñ;’º¢V9ÃÑà‰SQhš|Èbö€&yª¢¬Auz‹l^¼E¶¹dŸ‰·8lÑÛæ-–Öíd“lñ›':Ê!JCÅM>d19T i•ŠfK«Ô½¦Û” ]²½-e-oÁáC¨<Ña*Z¤š&²˜= ±¤Uê°0UÌ[Ø—V©šV„em[ÊöV©;­’Í-x¢£L±$iP¸É‡,æ…},ÔË–-ƒ÷wJÅD 7Lø°eKÅ_X€bœlå‚':HI}M¤•åC³‡4%P%}βÁŸø‹dì‹¿È\Š4»·Ý_8gSéã‰3Å, 7ùVirX8Y2җܳÎYÐì"¹¤Ÿ]¸L^CÈ¥¢ÖЇ4(²˜<¤IÎQ¼i‘ÜËj©ú¹‚ú† OÂöÕRÎIQ¸rÁfŠYFùÅä°pHÄCz|]ÈW­µÌ.BOhgº2Ä+¹Œþˆ§Hê)Kt”žÖDZOQ¾•…<ª )Q=}lgÛ^[ÿÑ~ño͵!·Õ";i®…eå6þ‘,yZsmÕ´T²tIƒ%:ÌÌ÷iôù‹l_ö¦lCòm„¬ú‹²}OáØ8'|/ƒ':Ê£‘FŒ›|ÈbvÄ8Û·4ØÞ?ÈJlSÔo°õlå#í-8¢ÃT4H‡4M>d1yH“¢§**Ø`›ÒKƒí’]h߬哰½ÁÖ‡`Žˆ–¤)²DG™b²Ò`q“oeÁŸžÇ³'¦˜ù0³g»TVß[„âMÙ[žè0â ʇ,&h²ÏTEånx/[•^¼EιÆÐJÙm¿áí£‡R?~²¦ÈeŠÙJÃÂM>d19,¨)ÞOx ÿSoÙÀ`¾"[5[ØW°D‡)hgP¾•Eœ<œ ì"|Ôç+ð/¾¢Ø@Û¥‚Û¾¤ÅõeJg,ÑQ¦NFùÅä0x‚CAxÞ 7)[@ 8”VÕ"ÅTŒtfÁ¦¢I<œAùÅäá OUT‡‚ø‚C¥ì’õ†ŒîïÀ¡Rý)'¼DŠ':Ê‹‡„Q>d19$ –tEVÉ<‡"MQàZS”VOÔ‚›Å(¼DŠ':LE³x@ƒò!‹Ù:-ü´P§·p/=Q)Û˜Jܳ½'Êç /'ÕDM‘#:ȃ â0ʇ,&‡„àñaË ÷ƒK¤ ƒ~Õ–ÑHá1ožè0ñ€åC³4´Íø6ïNo/cÞ)X·¶ª¤ícÞ5MóÑ ¯3牎2EÅAa”oe&…;íÖ‡ò¬Ž(:æKC¢´Æ¼}1±„(ÜŦ¢E< AùÅäM.´ ƒ_yÕé-Ì µŒçAÎd)H†$ê¨U¹Kt”)º( £|ÈbrP¸8ÒÊ^œØuÖâõ¯³ú—[a¹Kt”Šz#Р|«Š–ÉšâIú[¼àÊÁâ_V.Þ™v‚¡¾»}å`0&¸Pd½Ot˜)&iP¸É‡,&…‹! '…ß=÷䕃”l[ΣTµÆ0^v’›':JAƒ‘gš|ÈböpÆDª ‚§/S´{÷Ùxo¾Â¡ÊöÓÁ€ƒ"¼@Š':̳4$ÜäC“CÂ%’îÙ·R>9³ dS«*åÁÖô9Ù¼‚':JA£fP>d1{0“h0ß‘íôé¥{6e°ÚÊ»úVÂöîÙàL>®‘4E–è0Si@¸É‡,f„)æ´¥êÞ¦A’WäìÔó  ø"Û Å¥ É‰3(²˜<˜É‰tCå,Ø •óK7Ô²ñcÙÝØ|EŽÛ»¡‚wÑKoä‰3Å" 7ùVüìiL1’WÔ‡çå…Ð¥‰…Ò¤E¨æFøHOt”ŠGìeUt•YÌÎTU²DE3‹Jì%³H98L[?LOfܲêQØ[°D‡™b„Q>d17 |ל‰ìo{Â[À½Ì"º¥-jsJ'’BÈÉJÏåñDG©(ñ€å[Yðƒû3©h!*Ê÷nuz‹’^¼¸êv«oå0ݳÕ[´J¸fÁeŠÅˆCÂ(²˜Æ;bŠ~ËöÙ{õmŸ!Z_¢ÏJXTô6”$|ñ‚':LIƒtHÓäC³‡4>Q%•Û>» [½ø‹ÖÚ†ˆÔ·â¶oŸ½Ó*Ù~(žè SŒÆJÃÂM>d17,lj­‰õaËdÞ½ì‚tÏ›ô'ó¢OÙ­róD‡©h”iš|ÈbòÆ’ÒZ}›Ì 6¿LæUg±¬«o»ÊƒÛ'ólYvÉÔoŸ,uŠì(s´N¦"“ÉÁakIøfíã_Ö»WÂ0„²k3FÇi^¸ÍN¸„qŠì0MMÒ± •™ÌÝ8ݸÇ/ØÓz?üéòýáþõû÷·¿ÿæÍÕÕ)súÄ^åÝæ4vrb/û_'›Ú;0d*ãi'ölYZ&NCN‘e¬ÎKcÈT•‰›E®A)éP)åñëÞ_¹•{“ßPæPdi·R\Œ.ˆ»žì0MÍòP“™ÌU}rTS;òͺ•?_~úpyå]ŸC©\ËîŠ)Ñgr„¯€ép(UÛR\É‹›é}²£ÌÔ{i™JˆL&‡™o%¸°Ñ¡ÜËS<¡šCQ:þ]_¸`¢ðpø)²Ã4B”pe’ç}ª>9ª©]åóÍå§^w² ñžÉüñ7¿ûí?ñ@ØÝŸlÁÁ–ó.)Ù6ìQ¿=ÞÅ'­“FÁx²£l¶Æj 6»JˆLf‡¥ …¥Ëã_y—‡–àgô—àÖW} Vø4ø)²Ãt"!”™L ÙB#!óØðë_>ÜV×Òë^LÜc¶b2„öwi«?qÖ›XÃáªÊ)²£l´þKØF©„Èdr¬ÚÛ¶R®>l¹ìw¯OJ*ÞYí’J}Û6¹e-¾´š²d‡©i‘{¨„Èdò°ÇÛLÕô9×ý~÷Ûßü'UT²om?>B;弉>â¨C²%’SdG_JÒÀ3•™Ì <4Ž{B‰ä8‹øGê#j>"dô­ðSdG©i6ò¡L“™LʸBá¬Gë#O÷ŽT=t}ÄÄ [ÕkcÚºÃúU HÕ¶P­¤ÝOv˜=fix™J¸2IsÃËŽœ»mçöÎmüÜžü¬×ÌVE:Ev”•>š„ÈdîèÃÑ¡p÷¼¡ð¯>ëŽÎ„+Öç­>Dk²k¯¤kÕ„êœôß ²ÃŒñp©Ev›O“™°Í‚ÓãÝN#|x|,ü«òÃýÉpBÙ“Áp¥¹p·ìU3NøNÆ)²£4µ¥…5%D&l|=“¦’éðÄo>y¬øpsùéË»×—7ß\´xký!ù´»úCÌ@Vs×w`óVl©j[ÉPJ”Þ^È“f¦àäÍ%D&,Z3™F +"®mC·T¤”[ÖµJ1¶úì$¼òöÙAššŽƒ¼²šÚ$D&“‡>‘nĉ|íýÑ©Žw®>~ÿñC§C‰ÅíÏ¡¤»°x}Ùow(Å{Òó§È3ÓbäÍ%\™;x7‘™zR)Œü£ R$C‰!êg(õ…g_³ryMeÈŽÒTëåCŸ&!2™=ô 4ô [|†òåõÛ7·½þ$ÀîüÉÒ UHÃmte«?\l}uÆÇv&h¨Pf«‡&>I[ý‰È‡íeÇ\³#åÅìßqõ0ôeÏß”u,wï<‡œ…káP¥².HB?råÃïšIeUÙÇ6^ñ)Ëçÿ?{Û\Éq›Ã_ÅÑëXÕèî¼H•#˱+²¥’ì;Ieå¢w)-os¹ É•ì¸ôÝÿ=sΠ±"Î9œfãt—†y°=Z fpáéâöª²7Lw+þ%Fåt*ùJЮƿ€v¹ëÆ=¸G(÷2V«Z£Õ?ùŒXÒeÉ $0(÷²V§[£×?ù `‡@˜ðÜ&ʱ$0QÐÁø8íBk¼zñån*ëEb¢"$ò<& &0¡*yøß—w¯Í`âö2£÷¦Œ‡ìŽÌ­w0ó=GãÛ]ŽPîe­Þ´F³"$òÐv‰Ì:~¤lÅ*-ZzQú, 8¥´2†§ÜMeA$&*B"ŸÁc"—UÙSs…¬ƒ¹»¸¿xóöú¶ÒÅxå¶æb¦žÖYWO î.eLÛµZG(÷²W°ˆ6ráÃcÄãØkòdýIò+ן¤#.&øÍÛý;OÆ€Œ‹á(wSÙ ¡Ègð¨(y‚ëη׻˜Û›»Û›ûZ“`s{P&ã-AÉ’[½eÑ·œ47î;B¹—¹+‚i!‘Ïà˜vÒdywâ1½º —¤ãy<ŒW6ØÆ³‘G(wSÙ(¡ wIeiP¤O*a=Ì.n¯þðÍWµ†¬ûÙˆ‡ 6©¡lÚJÊÔy¯âtVÄ\ʽÌ5:P»‰|µ#P;Âs™ƒ;“‡Ñ&8‘†¥ÜMe£LP„B"ŸÁƒ¢HPt`Hù ³/w7w•&†Í]2™RHäžbô«/™ìÕ-dZ_l?B¹—µî°!k]„D>cƒÚ^©j燕#0G:•§Û•çèTÎï<…d“H ÃQI(&Z„D>cÇDY±4QYþ|é)óúâ/W7—u&3ÝÜ, ä[þ>”Y˜”ªfa èü?sËjkså)w2× @Ó.B"Ÿ±1m¯H&?<· c eR†ºq²¼ódýTðPY†r/•ÕJ$(*B"ŸÑƒ"R†ñ ìiG§­nYά7WŒ‰&©iÓry•Ř`’Ë^K*ã)w3Ú ‚l!><ø4ŒÑºHg.ãÚ™ËcÃü‘Ì\JBeÁæk¾ÃÚ\eYʽTÖh™Ð…D>c‡FYK)º[9s‰~&{—¿ÕBf¾T9t¦³1±rø2Xý•DÕŸ§ÜÍjƒÀ]„D>cÜ^;j¿røòHÕ?;Ïðe°Våÿ•HhXʽT֙؅\øè±c£¬X†ªlÕðåÍÛûêñþÌt{Ó— òÿ`Çìôᨛ¾ vÚÓË<ånæEî"$òáÞ1ø°2;rØk}&ÈÌ%£’—ð0,å^*ëŒLP„B"ŸÑƒ"Eƒ">ñzZ*óíÅýC}*“yo3 œ‡Õ¯R%fÆX'‚™±”»Ym’ºQHä38ÐM¯®úWWW¤2º\ìÊÔJ.£…NvíßzÎmã-˜G(÷RZoe¢#ù e¨ÒÖm’É®&ëîM¥“1j{ÙŒËycr$›IuÙÌTá‰"ËÊxʽì”Ê]„D>c£ÜÞ8OìÕ­¼ó¨€´˜_`kɳhµKQ¢‡™§ÜMeH\T„D>ƒÇEÆ%¢²¾ê Ì›·¯o_¿¿»„Zã·w&$Б$2Æ®¾³h\PóGƒe(÷2Ø Eî"äÂG p;G Ö9Þ`ûw¤øï|8KM&Z“_yHcxÊÝTÖË„E($ò;,ÊŠE7 yvÒÉšÌÝíýÝ÷•Ejƒ&íÉ2™ù®BƒqÖ8'€”ñ”{YkÔ"øvù ŽoÛX¬5?¬ÜWö¨$C’˜yöâ,IÌwË$1ån* B1Ñ"äÂÇe- Te«ö•-ILecÓæö•ï]Je%¦·¡n_YÌßG­$ö•ñ”{Ùk2"¸vù Žk[K@ëVæ0G˜3±3å0Î$v.ó”»©,ÈDE($ò=*r4*rU9Ìõ»·õ2Öo.‡¨] Ñ‘ïF]“RΘ•h\æ)w²Ö¨¬ª]„D>ƒ£Ú.€Ð…çÎúã¢ø¹Ëý;×”ÉxÊÝT6ˆÄDEHä3xLäÈÉïüP5ës}Qß·<·ólËÁD“Òîc¶¼¨õJ•C˜öÌʽ¬U; H›‰|Ɔ´½³$tö¹ u0î,Ký§wžÅÔþìåÊÝT6JÄDDHä3zLdiLÄŸH–s˜ÚJ¿sÛCÉr£œ*(™3U(YÈßHç@à2Ùʽ Öx T›¹ðqƒ£ÚÞƒõ¦aãíY’˜üÎsÀN+ ÜMe“LX„B"ŸÁÃ"oIãmU³ø˜JãíæÒ˜ìbŒ+øL~º2±0h“ ÜË^­—@µ‰ÈgpT;°¤û3­lX~t›Ì‘©«HDzàTLPÞDåû ÜKis )¢´(䢴ið¸È$Z=TU-Ë?\~ÿðŒZŒÚ\Ãr4ÖmŒùo!V5,mÏÿß¾Ÿìånæ À6ù l°ÒÇKc س¤1Ú:­%–P^‰„EEHä3xX@< „*ó»¯~ûÅW¿úêwŸþú‹/*\ „͹˜©qé#¤ |¥‹¥ì<\ÓÜ^YÊÝì5ˆ@ÛEHä38´ †ÀóÄVÕ0é<.”‹Q¢ÃS e¢"ùŒ6*zÂí˜ü×X™Ã€5›s0>Y«pkI~ÚÖ:H6àd<ånÖEpí"$òךXkÐÏÍa<¡lJãEL~á^¢ÃSÁÅD‹Ègð˜(h’ÃS•Ãüþ÷¿¾ü~Êaê\L0ÛËaTŠÆ›âb‚ªÍal ó {e(w³×$‚j!>qpTÛÓ–e¿¶eùÑL q1ž´,‹º˜¬üÁ‰Àd,å^*­LT„B"ŸÁ£"O[–}]ËòŇ7Wï«'û3×íUû³š€ñ¤Ú_Ù´¬ç1_˜Œ¥ÜÍ^“ ¬B"ŸÁaí¨HHõʱËc•˜¨Ï2v9½óüoªýØåʽT69™¨…\øØÁ£¢¨-UÙª±Ë‹ïïjÏ_F³¹¡Ë9ƒ1d3YTUC—YÙ¢Q`qÌÊl5)%i£ÈgpH;ÐBX[è?V… ç*ôg]O2…~–r7•u2 ‰|ˆ-ô‡ºBÿíûî²_ù¶$Û`¡Ê`æûË;¨-ôÇ骷H/K¹—½j-j£ÈgpP;zšÁ@Ë ΔÁLð°w K¹›Êz™¨…D>ƒGEhU̽}][èa{9L̪R.-NßÊ&š´[;/`­ å^ÖjŒ ¤B"ŸÁ!í¤ÊÚüÀ¢#+6ø“´;“ƒ±‚À‘˜”»©,ÅD‹Ègð˜(Í›ÑñýmO.޹|øðpu}_éb7âb zï•*…þ]•a½‹1*N»ÝVÇð”{Ù«µ"vráÃÆ^S&Ë+a2{x¿²sú,GbBöâÑX‰* O¹›Ê‘¨¨‰|ÆŽŠ²–Ò›|áð$Lv÷þöþï•&3Ý"J–Õ¤l¿t6Õ¡dÆÈI „‡a)÷2WgEPí"$òÕJ“ž›ÄXMHÇ’ÅLÛå| $ˆQ`ÿåÊÝ”6Ê„E(ä‡Wƒ”6*¢´ü2µ“«cþòÝÛËëÛ:“™n.‹ Î8('ó;€Ê,&*0Nb&O¹—¹z'k!‘ÏØ°6hkˆ¹ò‡tWTb¡ì¼ZÂÃÄh¢Ó1<ån*eÂ"ùŒYño§<Ìo®î.¸¸¾®ŠÉêm7çeBÊŽW/æw0iÕx™èvm¶&ËPîe²àE°í"$òÛ5»–~ûaUKY&g)Çäw‚Ÿš T–¡ÜMe“P`´‰|ŒT2TeÙßö”—ùÏo~ûÇϾúÝWu»c2×´5³sO®t-ç/‡ªs1)gÍIb&O¹—½Á¶QHä36¶ &”þœü°r“ÿ‘Š?˜xžMþ&%g¼‘p1,å^*•LT„B"ŸÁ£"CF…óCÕ&ÿïn«/ÅdÅÞÜÿì_²WÅ"@~P·Å?kعo@ÀXÊÝŒ5ÈàÚ(äÂǵIÄXm»–åLì<-ËÓûö1 øžr/•MZ$$*B"ŸÑC"KC"þ¸Ñ)ÿòá~zñ•cý`8 øçía‚JJGC<Œ©ëY¶Z… @Ï2O¹›¹\»‰|ǵ•sqàG)ƒòæ<Fkm%®) ÜGeãtæNFe!>zð h7€ŠZÆúÃSæõÝå›ûûÚb¿ò~s&˜`®]Ìï`.ˆUxc± e<ånæE0í"$òÓ¶ôæX~tÕúËL¬ìo’ÜMf èü™L*ËQÚÈE($ò<(²ÁQ•eÛSæîþâòæm¥ƒ±ýÝŠƒq.D u~;*ŒõJ'/pê’§ÜÍZ“¢]„D>ƒ#ÚùûB¬•ŸàYQçBÙ¬$ŒÁHÆRÆÊÄD($ò=&²4&²uýÊ7÷õUk·×®ìsHîIcu]»²õFùª0<å^Öj• ¤B"ŸÁ!mgˆµ:~w{]Æ™xŒÌçO¢÷ K¹›Ê:™˜…D>ƒÇDÎ8ª²UÌ÷o¯n¡ÒÁ8»¹ &jëmYX’ß®Ì`¼™¯2‹X+C¹—µ:-ƒh£ ~Ë8Öªq0Šï ZsI™R.FrªßzÐÞ‰d0,ån*ë…b¢EHä3xL¤­ò79O9˜w÷?Ü¿ý×Ú"ŒÞœ‡iÇi$ó)Õz˜ì@b{?O¹—¹z-ƒh£ÈgpD,~t]£2hu¦&ä¬Ñ‰xŽr7•¡ hrá㊀lÓ›F2êÊü¿}¨.óƒÞÞ´¥ÓÖ¥r‚,»˜ºiK¦°[bÚ’§ÜË\ÁÈ@Ú($òÒÎß“b®žÜ©ɲ³=‡ *ú$±ü’§ÜMeA&(B!‘ÏàA‘CU¶jÚò>kô5•ÆÃ‡-Á$§ˆ‡ñuÖ6fÿcãÚYq4±WkŸÙQF]ŒMgr1Ó¡%’Çp”»©¬ŠŠ!‘ÏèQ‘¥Q‘e£¢“;ü/¿ÏdkŒ3Ûs0)xrç2(c+LðAG‰–e–r/kMFÖF!‘ÏØ°vІX«6ÏÍa¡lK#¹bÙc¬—XOÆS ¡Ègð˜H“ãßY˪r˜yð²v=Yfº½&Åüa+gȂ֕)L0à¼H ÃRîd®FY\…\øð‡½†1WÈŠó#y` §u£ý)ùó¤0Áåè~bÖ^e9ÊÝT6ÈE($ò;(ÊŠ¥‰Ê&6ë>éa¾ýîÝwõ0SŠ›s19‰Oö“¥¬¬p19K6J¤ÚÏRîe¯ÚÊ Ú($òÕ6šD„Æ<·a9ʆ©‡J¸˜U J`&O¹›ÊF™¨…\ø„±£¢)é¢*[Õ°üúú/¯/þ·2‰1v{ ËÙÃD…Ûã§GeÃrŒ6̰̕¡ÜË\“µQHä38¨­i©_¯-õ?ªÃ£#sLCÂä`M¥~–r7•2A ‰|Š4-õëºRÿÅ›ï/n¯êq²-–úSpe-Ö´Þ 'K™ Ì’e–r/{µ^ÖF!‘ÏØ°6$:ÛŸÖÎö?:veÏl p1^CœÖŸ´WYžr7•M"QQùŒe-¥ÐnÝlþ]>ÜÖ]¦ öO8Y°PÞAå`¿Ïq·YÃSîe¯» ¡íí…D>cãÚa·”VNÅ<ÊbH±ßšb†’Å~o­U 1ÃS^‰DEEHä3vT”K•åל»|ýðme c9øgï_üî°èòTÝ@Œ÷1‡áF¿°”»kµ‹ Ôåp`~XyMùQ©ßʱ€Õ’S—LÎØµD ÃR eB"ù ™Te«®)÷¦"3üûó÷/Ù¯ÿb î–²‡ì™œDÆSîf¬AÒ.B"ŸÁ!m 4á½aeþΔ¿€³ÞyÿÂQÁÈ„D(ä‡ObRÙ@ó~¿ìn)¿}_=oiÃ&3˜ºÔù­¯Ì`²¾%ïš•yÊÝÌ5Ê Ú($òÑN“¶§WaŽô;sžÅd~:Ÿf%“ñ”{©lþ_!•Ý ‰|ŠœTe«Š0ùï°Ò»8³½úKÎr•*[É‚S•õðÊ«(±”»™j’³QHä36˜í,”¹‚ü°ršß.ñgbé±Jx— sÚ(1lÉSÉÊD($ò; ÊŠå©ÊVMó¿»ÿþõ]eúâæœic&§/Ž8˜œóÖMóguåD ü,åNÖj•’A³QHä38š äÄe€†'.3±ólî÷Á%6’ñ”»©¬“‰‰PHä3vL”ËR•­„ùáÞü¹ºÛ»p “¦Ì÷zñ»Q7ã§Q-Rág)÷²V­eàlrᣇ³\¸ ðì —¤ÂäÂ¥h…?ãE÷ó”»©¬—‰‰PHä3zL¤hLTwáòî6'0®ÖÁlðÂåT€IåöXð•.³ºYk%¶Åð”{Y«Ñ2h6 ‰|G³=Ȧ…g¶9J¹@d¢%þ”]YÈXÊÝTdb"ráÃ_oIe=UÙ*ˆìýõåŇú…d~“ Ù¤+¥‹Ìׂd ¼ŠÛbxʽì5¬½î…D>cCÚ!8ÒEÜÊ.²G Éa‚?ÏmPZ[m1<ån* "QQù OºÈ?É|²‹ìíõÕs–™éöºÈ¢Ó»þ†åغ.2Ðùß”èSæ)÷2WgE0í"$òÓŠÌÁ8c³%K„2¹2›$=ŒMQ‰9Kžr7• "AQùŒ)ñ0ô’˜ê &èmÎÁ8²RRÝ 8HA¤Œ§ÜËXó[1Vù i‡D55Ì`¢:Sãbô^bß%O¹›ÊF™…D>ƒ‡DQ‘ &ò[Nù—«wïªýKTÛË_¦9~CüKˆ•ù hEV‘ñ”{+xD»¹ðá1§qŒÕӑϬXEFÚȼ9ÏÊþüÎ#á_XÊÝT6É„D($ò<$ò†Ö MÕÊþëÛ¿ÖÖ_Ì·õûPP™üTݶþ왽uJ {á)÷2ÕàEÀì"$òÌŽ‰†‚üÌNÝ$G3$KüQûüÚ%v)ó”{©ì.ho¯²(䢲| ;’Ê:ª²¬ò.îoµªô/I1\þþ"ÙÕ£©ó/z¢%ÑBÆSîf¬ e!‘ÏàPv¤õý¸¶¾ÿ¨…Lʤ¾¯DýËNIÜLæ)÷RÙ¤dB"ùŒÑú~¬«ï_Ü^å_çþõÛËwµ Ù‹üÙÍe H«Šü ’ñ`oÞFvˆr7› ˆ6ù Žh' Y‚Ó Ù‘ AÈR8B6¿ð Á5÷1‡(wÒW§´@XD…D>ƒ‡E)„,…SÙ!÷ñõç¿úõì:(e&íqþâË?ü;ë;–?Yá@æiäE¬ –<þº»úþâáò©ndÒ«æhØ!ÊÝÌ2 ×THä38p ý?­}À<‚¨qñln$ Ìë¢ÜK_µ‘ {öB"ŸÑÃ稾ž‚ÂÖ¸r¦h£n$g¯&¹Òqœ¬©w#)¶o9>D¹›Y&„š ¹ð‰ƒ#ÔŽUÜŠ*Ÿc[+ÓÙÜHŒÊ6šƒ‡=ŽVTÜÉŠÊ 7âÕæÝˆšúYé‚ÊXíF¦Xíg#Qîf–Iˆ¦B"Ÿ±è¨b1ËüÀþ¶ëA­¨’9“m }áäå^újPس¹ð±c‡=YE#ÑW¾I­ÊÄùç¶ÝHŒ^y¼Òž_É<,UçFÌÎ! ˜%C¹—Y:%„5/B"Ÿ±±æ˜Õ†˜¥_S9jE窀‰)‰d#ånúê¤Âž½Ègô°‡lÊíj#™Øæk#SKiŽÊU×Ff½jÞÉuˆr/³ôZk^„D>ccÍQYEÌ’Ÿú?àFµqQ7bÏj :6B9D¹›¾z©°g/$ò=ì±4{¶í@­üÍÜ<¨å£ ŽºSjMzåÄÌÒa–`„°æEHä36Ö5¹!X+²mÎæFœ·¡ùÍÈC”»é+H…={!‘ÏàaϮ׺m·îFò;ЩŒËMõndÒ+™ÚC¹—Y+…5ï…\ø˜Ñ±feIt§N߆üä)#ñQés†œ_¸·ózZ}e(wÓ× öì…D>ƒ‡=JQV: ¹&Ñ̵ìM¹‘œ$¯éÔJ¾ÚLz%ÒðËQîe–»¹)³Œ„ÏàX³Ž4á÷6Õd#ñlÙL[ŸEô•¡ÜM_£Tسrá{4m Ñ|KHe6’¶žD“C`²Ä>êPŸÀ´ÙZÊ,J¹—Y&'…5ï…D>ƒcÍšÜÍËk²‘cµ gËF \I9D¹›¾F©°g/$ò=ì¡-!šo ©t#°ùld*†ƒÁQ»úldÒ+™;C¹“Yz奰æ½Ègl¬98 çW¬q#öØÜH8› YÛeJì ånúš¤Âž½Ègì°'«h úÚ΄yEÿ¦ÝH4.‡À8<_‰¯w#“^É”ØʽÌRƒÖ¼ù Ž5›X.žä‡ÓOž–˜¤ÎåF"X+Sbg(÷ÒW£¤Âž½Ègì°'«(P}=uîdE6b’ݸ Ѱ¥6MpÕndÒ+™;C¹›Y)¬y/äÂÇš­&nÄò•*j#ÖœÍ$—ÿ6Eô•¡ÜK_wMúºù öX T_ºk6ïFT´H§–UõndÒ+™;C¹›Y)¬y/$òk6ŽÔFŒ{V§–"dÉ‚"¹õ¿Ó ÏTl|ñå^úêŒPس¹ðá?Ì#ék úúPëË?|ñßTc ¦¥E½ë@ÖùŽv }9c ˆµj¡ï¬F"^ƒ£ÜÍ £´¼‰|Ɔ–s´áI07­v­Ç°4!ëíc”ñN'™iCŽr/}Í‘ˆ¾î…D>ƒG9vž£F-Ó “i÷Æ“ä&»O¬ µÉǬW"¥Žr7³LBÐò"$òZ¦˜€áCÏõ›£1îLVôJËLr”{é+X©°g/$ò<ì1t:ÖðÓ±•¥¶îFtÑãñ¤üJT¬v#“^‰”B8ʽÌ2(!hyù -;K²g×d#ÇJ!ÎÙ³¹‘he¦ 9ÊÝôÕI…={!‘Ïàa³$q®a62oÛ¶Q)MÆDò?¬w#Y¯d@-†r/³ŒZ ZÞ ¹ðQƒCËN‘©Ž¯§V4fÍKÏãF¼Ì´!G¹›¾z©°g/$ò=ì¡ Žï©t#:mÝ䯢/7ö¦ƒªv#Y¯d¦ 9ʽÌ2i)¬y/$òkv@Ý¿ù¢& gs#Á™iCŽr7}©°g/äÂÇöêFBK76ïFRŒÖE’@½™ôJdÚ£ÜÉ,A)¬y/$òk¶‘ìÙ¶‘ݳ]±BËÆt.7M’™6ä(wÓW {öB"ŸÁÃiKHdAØÊ;¹ˆ³Q7¢Òtà”Øƒ­v#qw6QÈ,Ç(±ƒ¶RXs$W''>ƒcÍ^7âÕ7r Ôòêln$i-3mÈQA*ìÙ ‰|{¼òT_º‘¹¶¼u7âu ¥ÄîÒ!7r?¹‘ݯ~óáúzþgßfŠ_eÕüÅ?Ô¿ø‡þñÕÍ'ÿ¬ÕKÜß¾}ÿý§ùCòÉôß̼ÿ矼ދ¾ÿ-ðor×íüíû»w÷wWÙÐþå“ÿ™´åöâÍÿËïµüèîK„?™ÿä¿Ú~¤ø>ü±o¦ô‹é½=•ïò9BŸß¼y®Þ<¼?×ùC’ÿü®™¾¦”ËüâñO“ÿNå+}ägࣟ!¶Q i÷Ïÿè?õÑ£™áþ¦ü“Ÿüì¤5ÿ8€€÷çSŠ}>àɘæ{áúcfD MÓóZÂ!Kš0„‰´Í_±¶x'G²›f6_¼±H‡ †.”MÚ˜ˆj¶ë·˜ˆ«ß‚ 'ÖE­®p¡LÊÃG Oš¨-”É‘ìeq¶ùØÅ"2 Š`“þ‘<< ¼Ô”lÉ:…æƒr²¤·âq$»©fóõ‹t ƒ±÷fL:ä©jžJ0_½Úÿ­¼zõÍßï.ßYóêÕåÍ/ÿôÍ«W$íùô݇«C~cöŸ}ùÕ¿¡J.ê7ã7l0P 3íj¿‘`ÞrÐÒ8’½ŒÓ5Ÿ³X¤CC£?Ù.ÊÂÿéáYW,iAþ %F›ÖW9’ÝT³ù¾ŒE:d0xHãÊnÿéá9»ýéâL‹¬ößÊ⢠eM 8ºËÿi¾ §µ­·fr${œo>,±H‡ †®\åøÀ¨ñ÷lŸ:J|%î Œmۇ͑즚ͷ`,Ò!ƒÁÃëªæsv™}ì ,0 06à |$ysk}62·í°æHö28h>ñ°H‡ Gp=×Á]½of¢¤ñ$kuh¼!€#ÙM5›¯²X¤Cƒ‡)>Xªšì½ºâ‚êLÅ…?óÛ/¿þ#ëðÖ´,Ì?ÓÎ=¤ˆ;ʦO^Ýúf“5ºmé™#ÙËCóQ†Eº…ÁØ3 Y) u絸õõ’+x+^|ŽÚkÕ¸Kš!ÙK5cû{éÁè¡‹¡¡‹=U|fë ×ï__\_~zs}ÿôTbnÙV*1•¦m(›KÀëÕ¥éèuj=óÏìfíÇöÒ!ƒÁq\P¤ÄüñŠTb.³¯®ô  ±«`HöRÍÔ~Å^º…ÁØ (&rT5›ÎÄôÖÏÏåçr…>û†´þ|pÒÁ«¶5Žd7 l>„°H‡ vÁRçÀÏöµ­9p$;©¦UÍ·K,Ò!ƒÑãKƒméÜ‹s0©A€©pÓÕ•¶EŽd7 Œ­‘ÞE:d08ÒkMø‘<°§'žzÿW{BwšÏ[¼ƒ—qÚ8¯/¼giöROÝ|oЇ^¬¥M×–mº®ó–Ä/›®DxšAXV;‰RµM!XšÝì05Ÿ6ZÄCƒ#¾!?Â?ù KèFâ'¬”ŸHÑÙÆÃpÍ^úiš/†@ñÃàqLˆÄO~³ÐS' .>Ü^Ü^}úæúzåD =ÙÛHžŽ@ dÍè\Û4ƒ¥ÙË@­j?¡´o1Ð48hçkXÕùz … ¤óUlzN»¨Û¶;±4»i§¦Þ‰‡Fohóëκ4#ÀÙùœf­§·å­¸õ·|µ `|ÛŽ'–f/;Üíjok‡{ñÃà€pФñ0è5—{ÍÊeý“_¸•m¼a˜¥ÙM;}ûf/ÞÂÁÃhšëVwz'ýÜÞÞè½.ýúù¨Õwzµs:¤Æ;78š½lÎëæð"rŽ´zŸW½V”¬øôt~Õ¾õw–f7íôÍã•E<ä0x¼i;>«€ý±Gˆn{Ô“G°©¬3fõµö*XÓx›G³—Íiõ.â!‡Á¡^ˆ±Øð…“'ïaB7‘ærò >LE¶ÆúÉÐ즟ÐÒÒÒ@9š½ 4¹æK4ñÃà pò¤D‘|«Å|dUx©_ðªm‰‚¥ÙM;Sóðfoáo’wT;O•(X÷ñîþoï®ánrO/a$Ø^ ÃùS9ì É­ßuT®m ƒ¥ÙÉ&òÍWm.â!‡Ñ!b ©?Àš6§Gk` 2zmì1’Ëytc`Š£ÙM;Sóxf9 ϪµmNøòWŸ}öù7ßPý,mNf³ÀTpnê .ÀxÒùôT`jRªÆ#,Í^v¨¡9@¼ˆ‡Æˆƒ" bƒZµ öÈÈD¦$¾ Ö$oMã‘ –f/í4ªy ³ˆ‡ÆŽa²Yª§ÊÇ`©ÿüæ×¿³” Šl“Ý (¥œ#“_ÓWB¯M1¬ÒOR°4»™gh¾\|9ŒE¶Çæ‡çU5YË,óo¼]\éOR°4{i§ÕÍ÷‹/â!‡ÑCCC›º²{çqusùp{[ã<ìö*VùÇúe²6;]Ýxè‚¥ÙÍÅÆ½·,Í^êmëÅ[8˜ÁE¶’ç‡v‹gsD}¶Å³ã–8¦Þ[h¼b1ù¬T{oYšÝì0µ‘Q<ä08ˆlT™å F¯™å;Ò:æ;O²­S>‚w;oYš½´lë8ÅCƒÇ1FªÏ™äû¨5*ÓJáŸwî0í ´›t&ÓWksS4=K³—ÍÕFñÃàȰ¦Eoý¼«¨Ä#hRôòÁ¯Ÿ«`ivÓN×:^AñÃàñЦEoý¬Ã¨{M*Ù²aà{ɹîü%X .?­hë Xš½L0êÖè/ЇGM )?¼õÔMä4eˆâ)ƒ‰^Eí7ϲD»é§oÞµ‡ò!‹Á#iÖf q“Yƒãˆõ¯ÎòOeŸ¸ã‰ö2»dš9¡| =8¤k< ÍŒ_3Sñ¸fí ]:Æ$tÉÈ$•sc×x%ÚME¡ù 7ʇ,F]| *úœý±?©:ÌåÁ­W¢É¶ê¨³p5ƒ¬o>YÁídŠ^™ö#N‹|Èblh¬"KÚ,ßkÀ[˜G%jBV—4ÞHù ˆ!¶Úf‰vSÐÐ<œAù0v8“u¨‚6¼HaõËEŠ]baÉuÔ?TøŠY«Ïj³D{™¢¶íùÅà ¯3ÅókŠ5™…³î ™EŽ‹Sãi žh7 íÙE>d1v8“U‰tÜ9~K~]fálxñ9³ð@a(7Ÿn_ç-²GWÞ6ÞÅíeŠÆµŸlZäCƒÃ¿NibŠŠ½DùäÁ»Déô7‰MOL;lÚnóD»©hlÐùÅèòTEÙÙÐJo1YêÖ½ÅtíÎ+â-l²Þb:êÙ|ÎŽ#ÚË­o?ʴȇ,‡„…„ WåàÅs «õ”½5ö,Ñn*šš4(²= ÐÀ©ÓÚk¼ÄoŒJ»Á¦å­¸´Þ[hð6ƶHO´—):h>–ò-,øÃ¿ã˜¢ ‰:0EþäÓGÄ[Ì@¨¸·HæUMU”#ÚKE½jР|Èbð€f·="Q6¾ QSn¡BÐeÛBe|Ø]Úk:„ÍífŠÐ~ {‘Y  {rL;?<«#Ê’VYO®i[¡^Y›S9¡m¯,O´—Š‚nР| ¾n<’Šª¢ ;¢¼y鈚s H¦ä^­ïˆ²Öå 95^ÈífŠ¡9(Œò!‹ÁAaïHšïÝšºÅ£¹ CÉ–²…PG”uJ[Û^Uå‰öRР›‡3(²=œqž*hêÅ|%nó¾Â¹¨Ðö¶¢jáTˆ¡q÷,O´›)Ææ0ʇ,F‡„É îàVà~Tã&¾Â‘ Üb¾B;gZW¸Y¢½4šæÁ ʇ,f¹ÁÚÝàÎÄ^npÏ(”Šå2^þ ¬¿Á½×ªÆyK´›)¦æ€0ʇ,„} ¦èù,¨bÅ“' ¤0¨ ò_`k Š%ÚKA“mÌ |Èbð`ÆÓ¢šç‹jü:Ù¿~ÿ—‹ë«ÿ›?ü¯^}óþîáêæ»Ýøõå·®>½¹¾?æ]>žðö‘Ù®ÿóžð>A€IÚdã‰;e§Ñø/•e‰v2TØ­Tmk¨‹|‹¡¦ÁÁb [ÉaÕVòG•&kÉ®%—ÚK> óþó¦*Êí¦¢®y°ƒò!‹Áƒ «ÉáäjòyuãÛÍ;|Ô•"Ÿ½>ï9] ¶qÞÁíeŠZ5‡‹Q>d18\l=©gX¿¦žñèÆª¡dåëÑ«LãzK´›‚úæá Ê·°pƒ‡3Ö{ª  ë^êM„ V/oÅUÔ3vZÕ8³`‰ö2E£›ÃÅ(².ô`ŹOŨŒ”0=X„üE²ÆCj\Ó`‰vSRß< AùÅàM 7+BË›áåfÅ\ÿ6ÊaÇNÎ-*nVØéö „Ƶ,Ñ^¦hMsÈåCƒCÆÁúw°ÏÚAKç09I)6‡‘Bçæ‰vSQhÒ |Èbôƪ¢ +àÁ¾TÀ§ÿh”òIX_wJ«¨l[oÁíeŠÎ¶…‹|ÈbtP8D³Nq$ H±P‰r*ûb«ßÂc‰vSÐÐ:œ)ò!‹Áô°O]ã^Sµ [õ·ë+´ M¾bҪƵ<Ñ^¦è]ó»”(ß OL1@«ËÛY 7–4öSe.6F¡x¢Ý46fP>d1x0ÀRmXáá¥Â=å*yåÈa}…{¯Um+Ü<Ñ^¦®5 \äC£‘ φ¸fwÔc*‘Ì"$²<*IåÆA°;¢x¢Ý”4µ?´½È·°ˆ£4‰´a„tj{é®ýæï÷—ï¬yõêòæ—úæÕ«ÿ¸¼»¹¼ž~ßOß\_úîÃÕ!ï2{–Ͼüê¿éïQ*q^Ô»°~eGiæK’ñdú;²Yêi­µÎØÔ¸YŠ'ÚËJƒo†{‘Y Žƒ'pà/¬=u±…¨|‡¨L˜‡¶]+Åí¦ ©y¬ƒò!‹ÁcðŽ*hÃâ7ÀKñB´9€ÒXëÖ¿Ýt«OÅÆK´—)FhŽ£|Èbp´8©,F¾Z³²6’ü_ªøí¬ŽÑ4n­å‰öRѤš‡3(²<œ‰TEÛOÊJúr‡á#™ÙÛý]é-¬ÕÉ´©X¢ÝL14Ç‹Q>d18^œ bŠv HõøõN~Á¹³>jg—¿Y¢T4(Ý< AùÅè Ý|ùÍg•Þ½,8Ÿ[¥t9šßŠY¿à|§U®qnÁífб9ZŒò-,øí™b"ÕŹ.Ú&·HJþˆ·³qzá­s Žh/Õ¦}@³È‡,Fh hRÕµsZµuo1ñvÀc\¿²Ö9­|0mÏaðD»™bl £|ÈbpPØÒìvÕaVûxlÐ%‡Y”·p`•j<†Áí¥¢Æ6hP¾…ÿ—>ŠÒì¶åaVûr˜u·´6Zâ-lÅaÖLÃì®»65EŽh7SLÍAa”YŒ G¥ËÐ^T|˜ùäÜBº† íI5×zãÜÄÛREY¢½TÔÚæ ʇ,Æh²*ª¢í†ö2±—¡½¹n‘žð™> C{>;Ý:·`‰ö2E§šƒÂ(²N‰J«¨#C{Q Jª# D×:³`‰vSP×<œAùÅØáLÖÉ@´•uô‡š3 ëÈú¨TƒCí´ªq›%Ú˽n £|ÈblH8*—HØæŸ7´„®'S{ ã-¼Êï;4ñæ‰vSQß:œ)ò!‹±Ã™¬J–ªh»±½¨àeloòÁ”³ Ó'aýØÞN«xóD{™"˜Öp‘oa¡‡„åQú·ž|Ä;ºàPQÈ[h¯µi<äÍí¦¢Ð: )ò!‹±šèÍ–Äßl©¬q‡jîˆRŠ,I°‡òF@ãóI<Ñ^¦¸[³×ÔQ>d1:$ ÜøÃ€O¹EŒò¹…1ÖèÔv6'ÚMECó€å[Xðó #©¨£*Ún6/ªô2›·ódŒ;ª°~6Ï;ð¡õ"sžh/SŒ¶5(\äCcƒÂqwøcyàq³'/2'dµøaV?'о1Åí¦ ¡y8ƒò!‹Áí UІn­_2 ^±ãú ¬Ï,tJÚæ¨£ñlÞ!²½Ì1¹Ö°0•™Œ ‡dÈb…ÄgCyŒÏÿvùÉáKIŽP¶Ìš¶N#¿ðüù3εmŒ:D¶›¦ÆÖ‘ •™ŒÛd夸)¿ôùÔ&©¿Î+¤¬™Hò-Ÿÿ×çŸýéŸÿ™Y"•l: ¢>†õ.ëüJS›§Å]FùÌ÷‚öåiK¤vÚÞµM?‘íd¦S’&b¦; ‘ÉØØqÔ‘Tu<Ý8õ‘Cy„YYB™ VÌ¡Ø)Ûvm§ø‘í¦©I ôA ‘ÉØ¡OVÎ@5õTëP>Ü_ÞÕº“¬ÐîLîäÏ_|ù‡ç3–ýŸ¬IX¦iæ],$ü¼åW|…w± ¼n\8?D¶—Íjh4S &~p¬Y[Òj¥ÝéV«¼Ëãú9¹é¶B¹ò+÷Ö;­ÛÖD‘í¥«F DB(!2=r4r§z®Xÿró0­º­t/^m-[™ÖüFÄŸX½ÖŸm•ÞB[rˆl7…Öh4•™ ŽGï‹.|_ÎS &Š…R0Q2®$¿m ÆÎD[5eÉöRS«[‡=TÂ…‰<ì1dçf~xNÙäË?|ñß”p©šèmøˆ Ѳ©ì£ÊßUá#v:Ô¶Drˆl7ã ­g*!2xÎ)*‰ãŒ}Ö( õNËû¬7Ù)7VSžl/5uº}(S$D&£‡2dÓf~xÎ@àO|„sgò#WÖ§Ì”·Ó,ùêÊ:ªUk·Á“íf±5¼L%D&cÃË`ÈÙ×ü°æì«Þ»_ꃟõüÍk""ÛK¼i} ‘ÉØÑGÖœDÔèYÇY?ú¬gZp®Ïú Õ‡àA%‹ß”üJj³šdr. w/8²ÝŒq.–5ó&"6¸Æ÷Ÿ$|8½qð£òÃ#ÄÈÊ–YºÐúTR~Ý*éÖ÷¼í¥©0¯—n¬©(!2aýù@šJæ‡S‹ÙâÃýíû÷×÷ßz9+ñÚòƒ' ·R~È%PhÉÓu„Oƒ–æ+; û¥ŽPîf«É7¶ÕŸ‰|Ø­þ™k Ó ;¬q,ιzB9˜Ih—íî§<4 ?B¹—ÊÛ:ú‰ÈgôX(ª²UíS?\ÝXs[[áöñ\ T㸘Œ¡8”‡ÕS³Â9Sš_`k{å)÷²×¨¬„½!‘›šc¯.’¢ã»ýW4æ’Î)—J£‰PãÔþ§ü‰l|2üån*ëD¢¢"$ò<*r¨Êžºãw8‰yõêöî!{—×ùþnv<·w™F¥ãqÉnÎñLs©€eÑWéx4ïÖ=B¹—'­…¬>êÙMŠ ½Æ±b(œ>x<·!Ž‚?ãÑÊ*ð¹ O¹›Êz™X …D>ƒÇJ4QÙpê$ ëx¾}óÕÍm¥·æ_¢1ÓHvÁÎÀ§:ÿ²Ó¶¶%ö#”;kRº5Îý!‘ÏàP7‚Y‰Û{V|[ûþh~–üån* 2! ¹ðñ£‡D††D¦ ;ûÏo~ýû÷7µÆn9s>‚+[#èJäL›d¢’H`Xʽ¬U¤»‰|Gºƒ&Ö:¯ýn•Às®Æfh|Éüån* B1Ñ"$ò<& †$0ÁT%0îÿò®ÚÁ̇D·æ`L ‡+ò;PµÌt¹ñlÉʽ¬ÕXœ…D>£ãÜ–L!Î9ð³¦ÚiiƉonÜ¿óük„Œ£ÜMeƒPL´‰|‰œ£ÕDþXÖÉêÿýÍ»Ûêí)Î¥íyTˆŽ|8V..ú“Sm¡ÜË\­´!‘Ïà€vÔ$Œšõ‡uY${We=Œ·Óýo •å(wSÙ(-B"ŸÁƒ¢¨=UY6á:YüÏæâöªÒÃDc¶ça¼2–x˜]ûT‡ñÞ%‰fžr/su^Ò^„\ø¸Á!í@«üam•ÿØÞÇ@ªüB{÷ï<ËÐzŸÊÊÝT6 E‹Ègð (Ð*¨«ò?¼¾}H¶½2ÿä`¦^¾òjËüÖøÉ= X+K¹—µz/i£ÈgpH;Maà¹)Œ¥”ÓyŒ ùiÛNí¡ÜKeAÉÄD(䢲üÕó‘T–¦0|Íè #2s ó§oÉaÂse­W$‡ñ•9ŒO‰: K¹›½‚ ¨B"ŸÁAm›È%;›ž{ %°Z3L’.| ­'üP»Òj{•E!‘ÏàQ‘M´tȯD>åb®ß¿¾¸®ŸÂtjsWQ‚MVE²gØÆÕWQf…ózª÷6¾´u„r7{ "¨vù Žj§TÖ9%ÅÏŒ®)Ä”“¾™ZY¸a„NúîÞºÍY{h¼}ìå^JµH\T„D>cÇEY³,UÚªMöïîÿöîê\LRz{«ìŸÞu$_ŽÕ«ìwê6u™Z‰,†§ÜÍZ£¬]„D>ƒÃÚÉÔ!ñ°^Ý ‚2ö,YëÏï<š ‘Åð”{©l22Q ‰|FŠ<9ë“àÔ’KÖÁü濾ùý—¨Ìa9ذc“cJ“\¨s0ÓÀUëÛòG(w³Ö$k!>ü)ºa¬5)Gs~–»ª™, gq0 UT­×â¡ÜEe­Êq»HLT„D>cÇDY±hã«2˜.ÿry÷ýÕëËûÚ46—ÆDc¢)uæéãQ—ÆL:ç`ªfI˜ìcÊÝL6‰ ÛEHä38²hËrZÛ²üh(ÆSÊ¥Þ/¹4L›<Z–yʽTV;‘À¨¹ðᚌ¤²4ó®kYþÏo~ý«êŽå´ÅŽe7iJÙ“*;–Aç˜ÆƒÀL O¹—µ%‚j!‘Ïà¨6½ÏšÜg­Kc´?ÏÞ0ùÛ+2ÃSN&&B!‘ÏØ1QÖÒ@U¶joÌ·nÞ\Ý¿®La´ßÞâï,¹þ‹Ö-Žã@%#áaXʽÌÕjX»‰|Ɔµ“¢Å~½¶Ø¤“‰ (3Þ€‡á(wSY/¡Ègô ˆ–úu]©ÿ«i³òïîß_ÏaþÝk½Íëþ!8ŸJ÷rþˆTf6A4{0yʽL׌…D>ƒcÜ:QÓM ó£Î”Ï8¥´’؃ÉS  ¡ÈgðI'šÏðã<§¼ÍÝÅýÅ›·×•«–³no/¡‰^eSj2:Ö%4É@°"•žr/{õVà.B.|øM°ÃØk´ž\´ž½*xØÅØ#­eÖdz¸˜d‚Ž*´–ñ”»©l‰ŠŠÈgì¨(+éòìL×É52וpY´ 7ç]ŒÎÞ%”=Ëv^Wã]‚&üyʽL5gB¦ºù Žn;Mà²éVÕžåLìƒDŽªlÕÌ÷·WÖTºÛƒ±~Ú^WæøÁWÁ„¾øüÿ}d<å^öê• ]„D>ƒÚ@‹ü°¶È¬ ÎTä×Ö驦&¡²ån*ëd¢"ùŒÑ"?Ôù÷Õo¿øêW_ý®² 6Xæw6ÒC— *Ëü”²ÑµŸ´<@¹—½‚A´‹ 58¢4±×Ò¶Ëb‚>SÊÅ(Q„á)wSY/¡Ègð¨(hGU¶.‹¹ºÉ•9L0ÛËa²ƒÑ®Œò§ *s˜mŒN"‡a)÷²Ö emùŒŽhÓÝÊfínåG—”iæ<»•§Ù#dr–r7•™˜…\øøÁc"Cw+›ºÝÊ·ï¸Ë~åÛÚJÌö–+C4ÉA$•˜ºåÊYáÌÔ/ ‘ð”{Ùk42°6 ‰|‡µ“%0Y²+a²tÄÅ$w&˜,ZÁ‹¸Žr7•™¨…D>ƒGEÉ‘´;¹*˜ìæòáÃÃÕum¯rrۃɬVN›âb’©ƒÉLTÓúöë.Pîe¯ÉŠÀÚEHä38¬£‘ÉÃÊi˜G½Ê˜¡bÖ6 ¸£‰N¢•Œ§ÜMeƒHTT„D>ƒGE1UÙªi˜ß\Ý]þpq}=c*½ŒÚÜDÌtè2ÑÊDLŒu1fBz¢ÀV²”;™¬QNÙ.B"ŸÁ‘íüû“õª]1&z8K"“ßyZÊxÊÝT6 F‹ÈgôÀÈÓÀȳÑéC—¿ýãg_ýî«Êzôik.&D›•…"‹s>YábR¦4ûªæöÊRîe¯Ú‹`ÛEÈ…c¯)’-‚)5ܬœÒY6+çw>­×5.†¥ÜMe“LT„B"ŸÁ£¢D¯%~‘Ú)óÝmíÚ˜œŸsúÏÝ¿h—¿eŽ|6ª+OÚÓú;ce(÷2VãE€í"$òØŽŠ4çDÅ6çÔµ,GmÎâ_æ£1 øžr/•µJ$$*B.*ËóIeiÖ­Ù¬ûäÌåýô⿯É¢ö›ó0S+;~Ù¦†²®\ïa¦eNEj?O¹›¹‚®]„D>CãÚ9‹N+Êg0™X:OCÙÔd¢ÄÜ%O¹—Ê:%!‘ÏÐAѤ¥ªlUCÙ›Ëïï*·÷Oš½¹v²©Ö¯,ŽÄäwêÚÉæ¨[dó%O¹›µH»‰|††´³¢ØD¬•¯­¨ÂXB™´ÜXQc½ÑO¹—Êz--B"ŸÑc"Gc"¾Éþ”ƒùæ«ßÝÔµ+g–~sYÔ9Rܬ<}6ê ²ì§BÐF"a)w3Ö(‚g!‘ÏÐxvRÚcÕüκF»3%0ÓÎá4•¦Û«,G¹—Ê‚‘ ‰PHä3xH¤m *[•À¼¾»|s_·ørRííe0FOø¦¼S™ÁkÌœ 57W–r7sM2ˆ6 ¹ðá3øÌ5*b®qåPÿ£O)—¡~/éa èü™ØÝÏSÁÊE($ò=(ŠŽªlÕPÿÝýÅåÍÛZ“68ÔoT¬Áäwê†ú­õùý‰@d,ånÖšdmù hÇi>”¬àX»ûòÑfe ”‹ƒIccp Råg)÷RÙèdb"ráÃ'#©,ÝS·ûòÍÍ}ýõ±°½Í—ÓH¿r},Tn¾´4(‰yKžr/kMJÐF!‘Ïà€¶Õ±„ƒÖ¬œ„y„‘iEH›2 35ûȹ|rF%c)wSZ'¡Ègè¨hÒ,C•¶jæþîû××µÊÖloÆiÈ_MC¾u“0ÖåcèTæ)w²Öi‡¬ˆµ¢ÈgpLÛ‚8˜°²Sùð°e&ÏÔ©ìuÞK€d,ån*ëe¢"ù ™@¢¢ùªïzóÃýÛ«[¨t0óɧ9˜èU²¤ c ²QÙ› ‘ÈaXʽ¬UH…D>ƒCÚÆ’*Œ±+A²G£0ŽR. ™ä}KëA{'’±”»©,ÅD‹Ègô˜ÈÒ˜ÈVdïî¸ÿú¯µÆm% Ñy›béT6¦%ó$–÷ó”{™«±2˜6 ¹ð1CcÚI¹9—éë$›q—³¤0!gNÄÃp”»©l Š!‘ÏàA‘Ó¤¹Þñ!ÜéN²¿ß>Tw’9‚ÿnÄÃÀÜÔK¡ßÍu† òŠl$ã)÷2Wke mùŒiý#y`Ã×:̆tTôIbµ2O¹›ÊF™ …\ø„Áƒ"ã:éaîo¯ê ý.l.‡™=LH¥ã|]3­Éßfežr/sõ^Ô.B"Ÿ¡Aí­*‹ÐóÃÊó0æðJ²hõyÎÃäw µ„‡a)wSÙ$¡Ègè hR,ET–¿Êú$”ì/ù÷¬ëWž6 oÑÇh<}5|Hu÷a²Æ…iy·ˆÁ2”{,€¬]„D>ƒÃÚÁ’,&ð¨^]%&¸óTbÜ4/h%šÉxʽT6(¡°hù MZJ²˜À¯9:åc¾¿¼»Ï® 2‹ n{YŒsAayz¦6‹Éÿª%fúyÊÝÌ5ˆÀÚEÈ… kï–àÃs+1žR.•É™~ç”SIÄð”{©lÔ2A ‰|Š yª²U•˜®nòG°ÖÁ¨íb²š˜D`2ˆ•…§¼5N"…a)w³Ö ƒj£ÈgpTÙñü›šÍý™˜÷çIaœ¶^Kã)÷RÙddb"rá£G‰<‰xú”ƒùúöõ×_ç¿£‡: lb7çeŒÖFCIc`N&k¼ŒŽÎJ,¿ä)w3Ù(ƒl£Èghd;©hÉŒt´Ï=¤L¼LtêL^Æ8dÒŽr'•ÂH•]„D>ƒFÑUÙªCÊÙ§|[,ºÍQ|NwKCY4uG”‹6HCK¹›¹&\…D>£ãÚ‘ I‡ÔìˆòDìƒE!ª²U‹cÞÝ_ÜßèZ ,moqL4J{C*1±nq̤n~¾Å,a­)÷²V£„`íEHä3:¬­Èþ~à7©­X~I:–A—ágÑŽeo™ëç)wSY'¡Ègð˜ÅvUÕþþÿ¸¼»¹¼þ·Ú†²I»7·Â¢ºd1>Õ­ðÏ*S.b± å^kµ ´B.|xÇbS N&…†GbR<Ï‘˜iµVpV"‹a)wSY/¡Ègð¸(…@U¶ÊÉüÿ›wî*]̼Ee[.fÎcpyüô ÖŀɨÄ\ K¹—½î6PØë"$ò×N†4€&þ@HP–l8“‹™.HRæ)wSYŠŠ!>~ô¨ˆžÎK<¬÷„CÊ™l­ƒq›;t9/ñÆ‘ïFݡ˩ìt”hYf)÷²Vod`mùŒ kkeеæ‡çæ0ŽP¶%‡‘\€é‚1ÖK,á)wSY‰‰PHä3vL”µ4P•­ƒãÚ1’ ƒÈï ©ëYŽéLc—ÁÅüõõ*ËQA&(B!‘ÏØAQÖR’uÇT·óÛïÞ}W¿Ÿ,¦ÍÍ]NIŒsªTûc¨œ»ŒzöVöÊRîe¯ÁÉ Ú($òÕÖ*Ð$fm!æJåȬ:—p11fuWwÈxÊÝT6ÊDE($ò;*ÊZJ“˜ºBÌë뿼¾xøßÚ$f‹u˜œèú²S«Ú:LŒ6Ø âa8ʽÌ5zP…\øð£ŒÃ˜«òžD„žßtsØÃ¸ÃFÍpË92ÿì}d‰P&ûÈ’¤‡±)*#1gÉSQ$(*B.|ø _#©l *[5““˜ú*Ìö¶‘ÍU2žr/cÕNÒ.B"ŸÁ!m «b`íª˜£L8Sãbô^bß%O¹›ÊF™…D>ƒ‡D@WÅ@ݪ˜«wïªý lsOŒÕŠä/•{b´"«ÈxʽŒÕxD»‰|G´ó¯KF ;´¶bŽŸNÁµæ’mdù'0F¿°”»©l’ ‰PHä3xHd“¡*ËÖ Où—ëÛ¿ÖNÁ¤´EïâRòÑPUÞ%ªàíÜ+ÐÚTyʽLÕ‚˜]„D>ƒƒÙz—°Ö»;9ˆw‘,ñGíók—Ø¥ÌSN‰DEHä3x@¨w uÞåÃý­V•þ%lÔ¿Ä23}éêüKÎýT’h!ã)w3Ö e!><Þ4±:2QÜs·\*BÙ—ag%ê_ x%q3™§ÜKe½– ‰PHä3zHähHä«¶Ä\Ü^å_çþõÛËwµnÆonUL)†@Ò˜`kVÅ€JŒŠª9Hvˆr7› ˆ6ù ŽhÚFžÐFöÉSŽZê@zÈä²Ý )5oS>D¹—¾îZ§Dôu'ä‡׀ô•ö…“=d‡ÜÇןÿê׳렔ãã´[Ämüù‹/ÿðï¬ïXþd…™¤• ÆÌ';—WB[žº»úþâáòÉn$ëUólåånf€k*$ò¸ŽtA`äp#Çæõc8G¡e~á6èØ¼Ðrˆr/} F*ìÙ ‰|{b0T_OAa+ÜH iënÄ9m]Œä㠪݈ó*Qîf–I¡¦B"ŸÁêèHtÝéÅ•G/êFÜ9¶VÎ/ÜÛù¦€¾2”{ék´RaÏ^Hä3zØã<Õ×S[+׸ϬòÞ–ñ b"¢µÕndÒ«æµùC”{™eR@4ù D'EÜHâ˲ÙHRgs#0¤Šè+C¹›¾:©°g/$ò<ìIÊS}mèFæ’çÖÝHzgrwZ»ÎÀ4v+e–?¥ÜÉ,ƒÒRXó^È…kÞíÀ‡5n$s#ö|n$ ¬p9D¹›¾z©°g/$ò=ì±ÔðãÅ•nÄmÝD ÆxrN2™g¸‘¬W2µ†r/³ÔZ kÞ ‰|Çš-Ðk,ü¨nÄB³¹‘µ“©0”»é+H…={!>~ð°Ç=Å ݈åîÓmË“ÿ¬”´¾ÞLzåÄÌÒa–ÆHaÍ{!‘ÏØX³Q¶l€Í§·â?©6’)c%þüÂ#XÛüfä!ÊÝô¤Âž½Ègì°'+–£úzj%þÓ݈QN¿¸‘h•qå•SíF’óíwߢÜË,­•š÷B"ŸÑ±æDA-¾!à© ¿Š’-ÙˆÜPÉô£ ±ýJ¯C”»ék {!‘ÏØaOV, jñ·ñžèF¾üÃÿM¼ˆ*ɈÞИH"7ëS¬¹ùˆj$â58ʽ¬Ð9!hyùŒ -•hò‘Ö$G*ê™Ò¹’èvÛ ô•¡ÜM_£P”³‰|ÆŽr²bÑä#5L>´ÚzòŒÖŽl6*V'“^µ_Éuˆr/³ô^Z^„\ø¸±¡e£À³„Ó+…Ÿˆa}.72Y€HE£ÜM_“TسùŒö¥ùáÔ>á5Vp/nDèdz%ÞW»‘‰¢HE£ÜË,w›/¥ÌÒ>cCË:Ù’àôn”Ož´Ö1‘ò¤°ãÚ>9D¹—¾%öì…\ô5öd%Ó±‰ŸŽ­lÌ"›®·êFrPiSÙ°•ñÑÐP^‰«ÏF&½Zç(w3Ë …5ï…D>ƒcÍÚ1Ksúšü'‡+êšµîq}Rȸ 3&ÂQIK…={!‘Ïèam$Ô|#a¥±aónTte߯Ñ:V»‘iw°L6ÂPîf–Q kÞ ‰|Çšu¤n$®q#G³‘äΕ$­eú{9Êô5*#öì…D>£‡=´%Dó-!•n$mÞäÏ•#»OŒ‡ÜÈýäFv¿ú͇ëëùŸ}›)~•UóÿP?þâúÇW7Ÿü³žohÝÿúíûû‡Oó‡ä“é¿y»ü7§?žÿIþmþ矼޿Œýï…·»Æµoßß½»x¸¸»Ê¦÷/ŸüϤ?·oþ_~ÓåGwß&üÉüøø'ÿÕ~ô#Åâ}3ý£_Loò©|—’øüæÍ“üpõæáí“_\çOKþó»Bdú¾R.ó_þécÒáãß©|·ü |ô3ÄZŠiíþÙãý'£>úa4<üÑß”ò“Ÿôè'BðÞ¶ÍhŠ}>éÓVlüIß ‡ôÙ Õ Ÿòìk¬^zÂç‡g­]S”¬xO¸¶Z5îÇàHvÓÌùZHKÍ\¤[6ÎI5=UÍVè1s®aT6ÀX[´ëÜK)ºòÔêþïYÚ¶Zp${Y8°8C°ËfDZ8ƒ=Oóó.hB–Tª…àÌü9Ó—or$»©fl¦,Ò!ƒÁãHœbêÎ/_ÞüòOß¼zE¡Oß}¸:ä7~z^fæ[fü6üD•²ï€òÖß`žú´ŸÇäHö2Îü¢Zç^:dÀ",ã§õ@"5ÿ,ü’&¤4-”DmZŸáHvSÍÔ:¤Y¤Cƒ‡4QMxTIfHgZáqPós÷Z‘€6¿×ú¦õæŽd/ƒ‹`ZÜ^:dÀ¶ŽcpÆD¨Ù5ç`5h_`,ˆûcÛΉr${©fR­Ã”E:d0x˜b¬¡ªùœË/ûCÖºnÈL•Kb÷«¯ÛiMÛ PŽd7ƒ ­ÜEº… Žà:G\ÇßÈxj^@ð$ç­4žd­¡mCG²“j:¥[‡)‹tÈ`ð0ŹDT“_ï\W\pÎT\øó7¿ýòë?².ÿhMÃü3 ÝCtÅ=¸ùnкf8›ìŒ<µ4B†d7# ­AÝE:d08¨ëuݪc-’Í”ä’i¯Uã)N†d/ÕÔ¦uè²H·0У‡.І.'ï²°õ†ë÷¯/®/?½¹¾z*áôöV“M¥iÜh9ÁJiýj2¯Së+_ Énö[㸋tÈ`p×Rbp|ëJM*å'm<¨Öÿ É^ª¹ÃûÚªæN:d0zI‰ÁÅVÝÐ3±­wCÏågUF£ƒõC5I¯ÚÖ8’Ý,0µvéÁèÀ.Í#̪<âљڷ¤X·­s˜‡¹ÛÖ8’½TÓÚÖqË"2D‡®ñ`G³—‚n>¶´ˆ‡‡Á‘žÃ€u ðJšÒ:ÚÐøö/K³›vBógoáÀÂŒ¤@µ“ýmëÐ) =z›í‚ÊNb‚fy+óaÌu•69mË,Í^vLó¹ëE<ä08J ŠDr ž…Q‘F(У’ÚÂa\2¯k±4»i'4añÃè1Œ T;Ÿ³|øãf'ÐL÷ÅÏ=o°ÉEE°§´{š×J´­Y°4{Ù\´ÍqáE<ä08. zþRkÅH5Dy0½^Ývv‚¥ÙM;ƒÀž˜xÈaôx%Pz®oÁë‚$Tx„¦ñÞy–f/›K®9Ú»ˆ‡G{5í€Õ«:`í#$‰@Iššœ–””ò­±$Žf7ýŒíwÀìÅCƒG,š¶Áê–m°ú|m°ãbIS³S ¤h­+:awJÕKâhv²C¯|sLwoáÀ£¤ãØa¤Ùzä³õ§f‘¤s€º·Â(µ‚#¹¤uãÍnú™šï‡YÄCƒÇ1‘nŽüÆá:?u|ñ³Ÿ0¶¤!¥Õ~bVªÆK³—jßÕEñÃà¨nˆ¤2øù¿§ÖHsSH¥2-ÔÛdR¶ôØvÛ+K³—vÕ:ŠAñíLƒG1!ÕΆ•é^*Ó3èt a}eÚª©Å¡ñ‚Žf7;„ÖH/ЇGzƒ#uˆàÖÔ!ޭ󛝿ÉÖ!ò«Ž­o²4{ig~íµ3–{†‡Ñc¨v¶:‹;+è¹ÎâŽSˆ°ÎÛ@Vú»ºaÖ¦ñu–f7£ ­^9 ôF ¡YäwV”¦ç¢§°K˜î¾û¶ðK³—v:Ý<`YÄCƒ,12Däm©ª4CäÍ•¦}ðQýê…ßvÚs×øjK³›ÍÅæ»4ñÃ讣®{Ö? ”.YÀB>Á;ïwkªŸ Í^úéMóˆe9Œ±Ð=Ä‘ßC\Yrðg[Â1.˜4—èm¹h×ïá°”j½í•£ÙÍSóuà‹x &Ç-ý¥fÇF“ü±ÑüªwÛ{Újçcš½´ló(f9 Å$zo4=ëÞèÇ™C2ÛÛéjmŽMéVJëÏÚ¨´ŠmÇ£YšÝl.5pñÃè®&ׂæ'{„G›û !kÊ~#ä"Lçok'C³—v×<^YÄ[8ØÁã•`h‹?DZY^0é%oȯ7XMœDÐj}Þ0ßd1v@“µ2Pm·)+é¹ö/ í-¬S©ìßÈÚá×{ kl47pðD»™bh¾õå[Xð{ŽÆ1E¤Ý„5Ǫ•± Ùz#u0t´¦q£O´—‚Ý<œAùÅàáŒ!­òÊkÕÿ~ýþ/×Wÿ7ø_½úæýÝÃÕÍw»ÿðëËo/>\?|zs}Ì»|\û6‘¹žûó®}£!)SX¯ltªuÞÁíf¨¡9`Œò!‹Ácã1T~òª¦ümÈ®±¼cRrÓ:ï`‰öRÑhš;(ßÂBì8Rv3žõ|uy‡ñþ%ï9ø ˆ³°°>ïØiUÛý<Ñn¦›Æ(²0NÖQ€_ÁüԼòą6xèàìÔ¬ÜVAY¢½4Gº­åCƒ‡3–ÝòC»{C™ØË½¡©þ=UµÊžµëï e­JQ·®³D»™bj£|Èbp¸ØhŠQ™5Õ£Yd1x@ãi+†ç[1ê¼…7/+æÜ"©r{µþ`Eö8*¥ÆHO´—)‚k ùÅà °KФù|WMÝÂ¥(ï-¬¶®õaTžh7Í”Y Ð8šþ:>ý­ôdMò†½…uA©2oáæ:ÑJo±Óª¶HO´—)ß.ò-,Üè 0ÜÂÁšÜâq-õá ¹…]k$Š%ÚMESó€åC£4tãWTÖ-ÂKn1÷Diƒ[Ró[ñ¹…Í124^dÎíeŠÑ7…Q>d18(ì Üd18( Š Q žUå6a] (3eX"þŒv­§¹y¢½”Tëæ! ʇ,i@‘tC,j®î¾ø §õ$»HXXç]ã µ<Ñn¦›ÃÂ(²ÖÖ«6ÔÚ£·’² ˆ‚oí-8¢½TÔ˜æ! ʇ,i4ÝQ«Oî¨]á-t|É.vÙÅÑá'¡"»€”NjŒE±D»™bj £| ‹88,4YÛôš[IG{hƒ–¿•d‚óÉÇÆXK´—ŠZÛ< AùÅàM mÞoó®óÁ¼ÜJš6Úû¨\éŠ jý­$3ÅÅ®ñVžh7SLÍaa”Y  Ã<Œƒ¬o{jåâc,*¹3`QÉd—ï÷E±D{)©sÍC”oaai€6zßè]‰E¥ðâ/rvam²%»€¹³`¿°*BDÚf<Ñ^¦èUkX¸È‡,F‡…dk²‹G]´ÞPº%»ðBÛ?lÎã4ž¹à‰vSQ×:¤)ò!‹ÑCÚè |£w¥·/ÙÅä-‚›Wp-oůÏ.¬³.ûÚVºy¢½LtkX¸È‡,‡…C [àëòOÅ¢ RºeB„¶–[ÈZ®tÛÜ‚'ÚME}ó€åCƒ46z81V‰EÅ— ½ÝÌE"uîë'ôl44î‹â‰ö2Å`ZÃÂE>d1:,ì(,ìÖôE=Æ¢"Á¢‚'}QQ‹²ÙÞÝ|?¶¥’²D»))4iP>d1zHC[½ßê]é/üK_ë]šø »¾/j¯Umû¢x¢½L1ÚÖ°p‘oaa‡…s ù#yxV¥ÛÓ!½¨%5¥gSÒÞë¶Q<ÑnJš5(²<¨‰´Ù;òÍÞuþ"ê4jò>Ðí‚!­G£œŠÉ¹ÆhO´—)&Û.ò!‹ÑaKkÝ|ѳf-¸Rê–êŒrÚåàØ·Í.x¢ÝT4¶iŠ| ‹0xHŽVºùN•µ ÷RéÎÞÂEëM™Ò³¾Òí¼Ñ)6ÞÂídŠI¹ÖÀp‘Y  'š]¤çeÆPº%¹0B•næ«¶½K´›ŠÆæ ʇ,hÍ-RËÜ"½ä¢¶Æ²]0Öäa90ÝÞÇÀ¢rFÞ.ò!‹ÁaáHnù0óɵ B6’.Z_áµ×Ú4Þ-Èí¦ ©u8SäCƒ‡31’Ì"ò{s+q¨ø’YäÌÂøüKÝ"ÂúÌBg¿k³ßi<£wˆl/s4Ðþ e‘™Œ [rÒ2Zöóñ‘Çøüo—Ÿn¦u„²cFf[ÒKÆ{ã\ëSz<Ù^šjUóCÝDBd2zlCqÓÈã¦Äu¼zµÿ›yõ꛿ß?\¾³æÕ«¿^ÞÝ\^[óé›ëëC¾åóÿúü³?ýñó?Ïþå³/¿úoªÒ¥ƒ#ˆúÖ»¬ó+m< Äœ†92óç={òû‹ÛÛü·wÚ¡dmïÚ–6‘íf¦¡ýÍË"áÂÇŽS ))ž^ò‘Cy„Y‘zx"žP5<¿pë£ò®íì÷!²½4ÕiÐ%D&ƒ‡>Ù‰PM=µ-„u(î/ïªÝIJêLîäÏ_|ù‡ç3–ýŸ¬IX¦iç]H¼<}=t…w± |û“ß<Ùn6Úý."“ѱfK±f{º9÷#ïòxË-­ˆàNîòwòÖ;­ÛÖD‘í¥«ÞDB(áÂD Y ¹S=º¬¹yÈ®¥Ö½8Ø^¶2-K‡R+I&¬õ'F[僷ÐxéȲÝl4¶¿¢Y$D&CãÑYY<Î]MklÄŸ:EÈB)\*¡¥#Új06;ÄÖjÊ’í¥¦»Ö˜ÆjŠ"“¡ÃžI3#QSS~bÙäË?|ñßTQË ½ ŒÖI£ÈïÀA…ØéPã5†Èv3¾Ô|§(‘™ Âë­}O¶—šÛ>”)"“ÑCk©š>gùíO|)äÉúˆ+ësfáq"pú*Tì¾]ÔªµÛàÉö²Ç¨š/%"“±áå¨MYéÖ¤zï6~©~ÖÝt¼¡-Štˆl75rí£"!2:ú˜4'5âwêV|Ö'Zç ýÇ­>LßtìïTû‹++;kM²ÖÄÖÝR‡Èö2Æ]“wÓîZ"!2açF1F­,ÀäátíGå‡Gˆ‘!”ƒx‹íüƒM­Ç÷í¦©.Hhê^BdÂÆ×ijÙy6=œj´e‹÷ß¿~ûþþáÓËY‰×•&¦akå‡`ô4âX %ëãZh)†¤|ŽT’jÛ/u„r[5JiÛØV"$òaQ›qÌÕi’¼;Í~\;–tı8£¥Ëþ›ü–û–#”»©¬oýDHä3x,ät *›j<Ìo®.îÿ÷Ý»÷o>\_V•¹'w›ó3VzH¹9:¯ñ3F[×xˆüå^F«g°NÂh÷B.|x3Çh­1$,4+Ç=O”ÊVËÏ80×§¡ÜMeA(4Z„D>ƒ‡FÖМ›ßwÊÏÜÞÜ>ÜWúk77ô¬Ó.–BÊêÕC;mƒé&cãrÇʽŒÕÌ%âöÆŠB"¶ãucu@óX™Ç<È<¡Jã%ýK4Ðü˜ÓÊÝT6È„D(ä‰Ð<†ÿmOù—œÆ|w{y÷mm 6˜ÂØH÷ö)çëR˜0írw¶íf“#”{Ù«µ­a퟉|G¶M ½†¿š¾b„¤0óRö3¤0aZlïÅ:B¹›Ê‘¨¨‰|ŠL4TeÙ¬û$TöíÅíÕw·•ÆÄ´9cœ¶ÁDòáP•&š¦b¯€¹2”{™«s"Èvù Žl{O"BïÙˆ°®ÊïI»½¬‡IVYÉxÊÝT6 E‹Ègð È—ƒ˜Ók`O(ÆTzq‹Þ”*™Ÿ/²Ôx—ä“’(Áð”{™ª÷"xvù Žg{Zê÷kKý‡¤db¤Ô/´ e~çQi› ´Ý‘r„r7•M"QùŒÑR¿¯+õ¿¹­-Àø øÓ‘Âò* üq5BãÕ(G(÷2ÕÝApS]„\øðÙÀ8¦ Š˜*¨çæ.‘PÖ%w:v»{çZçcj{‘êå^*”H@T„D>ƒD Iîº*wùýWß|óÿû¬ÒÁ€Þ`úbœ"«Ís R—¾du³¢8ÆSîf­ ‚e!‘ÏèX¶%S lkÅÂ`Rá7®,M‘¬ðGsd%Ò–r/•Z&&B!>|”1’ÊÒŠ¡;5BÉ:˜ûÍçŸþú‹/jJ/ÎoÏ»èðѰ¼1«W¬Ìº–Óä`Uã“ëG(w3Õ ‚c!‘Ïà8vˆd×JH+·›ƒ )œ¥ô’LÐ1s“PYŽr/•MZ$ *B"ŸÁ¢Ý©W|¨Z#|ýº2w™×`lÏ»8[¶ÖæÆê¥Á;]sÊ¥¹ƒ¨¹©²”»™jÁ±‹Ègp;8OLÕ­ÜüÓŽöd{°Ð¹“Ý[÷ÆÄdJû<åNJ;µëˆ(- ‰|F‰ ‰øêæ)ÿòpqÿ×û×oßT:™à7·I8›œ%["ƒ]½Ix§pqºÌ-âdXÊÝì5‰ÀÙEHä38œ-±×ȯý®Ka¢;S “”¶`ú“yʽTV[™¸…D>ƒÇEÑYª²U)ÌÍí»Ûé®ÍcüóŸr É—£2IÊ*¥¦,yʽìÕ(@»¹ØkЊTLÃŽÂ?yŠ?гð¢.FkP2.†£ÜMeLT„B"ŸÁ£¢ hê}òH<ïb®/.nk{”¹%¿S]Ê0@/ǯr0:S’(òó”{Y«U2˜6 ‰|Ç´#-Ãĵe˜G@éQޤ #Ù£œX0F ÈÏS^(&Z„\ø¸Ác¢HË0±® ssùÝÊ·ï*]LÚb-¦åo@¾U9LPʨоÒ€r/{ÝmÍkm¯DHä38¬,Yë”øsÞu0Yrâ«”—w’Ií7Å ÜMe½DTD„D>ƒGEɑʉ?pr æíëÛ×÷ß¿†ZC0àÍøëÉšþüLÕVå¬qnj.iŸÆ ÜË`½‘Àµ‰Ègp\è ÿѺU1pžAþüΣ֡ñý®#”»©,…E‹Ègð°è ?Ô òÿæ?¿úÓg_üᕠ˰Åi~cm4eÔMó5­7Ð~Ùʽ쬮M„D>cãÚZÙNëi›íŠÉÄây\L޼Mq1,ån*d¢"ùŒeÅrTeÙ ®§¦1uYÌmÏÅX"ô4Såbô”6·>!y„r/{ NÙ&B.|ìØÈ¶V!{ +³˜#HÙÔus£M#±³ÿån*E¢¢"$ò=*Šš¨,?prÙÃýÅí•5µ.&n/‹±J;í\yP—Åhk¼žO-4·W–r/{NÙ.B"ŸÑ‘íH‹1qe1æXCYJç)Æhë&çØ¾¡ìån*›d¢"ráÇŽŠ²bÑbLª*Æüî«ß~ñÕ¯¾ú]%P–Òk1Îz2“B]-fZži£ÀÚË”{Ùkò"ÀvùŒ lkmH£M»¥Êš2u1 \Œõ~žr7•M2Q ‰|ÆŽŠ²b‘,æÀÏÉ,æê&ÿ5Væ0Ún/‡™Œ+•˜ü?u9Œ .p0<åNÖ:­¤”°Ö"$òÖÖÀÚ:¬\Lö&³„r,£‚=Ëùû¤@ÏòʽTV+‘˜¨‰|F‰È)£¬eU‹Éî.Þ\ܽy¨õ0q{ËÉ4XGZ–µ†ªådÁDÆI´,ó”»™kAµ‹ÈglT[i 9hr8ìaÜO=L ”™@OÂÃÄhâÜÞ^e9ʽTÖh™ …D>cEY±UÙªZÿo®î.¸¸¾ž€²Êëcjƒå~ãTt(Ó±®ÜŸunJ›Êý<ån&E€í"ä‡/ c²ÚúR‹É+k1Ç€2 ç©Åäw‚¸>v€r/•µF(0Z„D>cFY±H¤…ªZÌ~óÛ?~öÕᆰ«ÅèùZÛÖ\Œõ%2ÖÕÕbLòBhZæ)w³×(l!‘ÏàÀ¶Õ†Ø«fïÑV•ûõ¼–õ.&±Ê¶ß²|€r/•uV&*B!>|An$•¥Q‘f£¢S.æöõ*gû³bÛíù=Ϫ¼å*ýK´:Y‰†¥ÜÍX“ ®B"ŸÁqm×6ŵ«æ.318“IÎx-Ë(÷RYo…B¢EHä3xHd‚¡*ˆD§üËw·ÕëÉô KlÍ¿X§ñ/fN#küK«$æúyʽŒ” ªB"Ÿ±QmíTYO¦^¹žìXþâôYV,‡é}ûü O¹›Ê:‘¨‰|‰¹ú}h9Ó)ÿòá~zñßWzg6¸Ì¤ ȇ£n;Ù´?4h3Ê(÷2× Eí"$òÑÎI Ís¯\Ò Æšóx˜©}4 \¹<@¹›Êz‘ ¨‰|ŠŒ¡I·­j&{}wùæþþ¶6‡±Ûk&SJ²8F]×LfÍT8PÍd<å^æ ]„\øèÁmïÈ<Œç·ë®(ó{BÙ3¼£œß9èÌN ÃS ¡Ègð È{2ãyx²]ùþâòæm¥ƒñ~ƒó0>%ïMy¶nÆz£|Øá€r/kMFÑ.B"ŸÁm¯âàùQˆ:Ìk}žÆë¼—p0,ån*db"rá£ÇDŠÆDŠýmO\Þ¿½º­Ü®œ5ÛmÏÁØéß‹ƒqÉ×:˜ çÉMke(w²V«¬ ¤B"ŸÑ!mO«0|ðº¢ÊïeÒÌ)xK9¿sÈ©—H†¥ÜMeƒPL´‰|‰Ð* ¿ ú”ƒywÿÃýû×­­Â„ Va²‡ñ È‡£² ãœÈH?O¹—¹j'i£ÈgpH©Âäß½Ý( ø3Ua|ÈY£ñ0ån*…‚¢EHä3xPŽTaÀWVaþ~ûP]…¿½*Ì’Ñ:?ØÊ*LPN‰ [ò”{™«ñ26 ‰|‡´A‘É5P+Gúd Î³¾?¿óè“X|ÉSI&(B!‘ÏèA‘¢A‘ªé¿Ï}W½ZôÇùS(ûµö©nœß†h‚Èježr/sµ ƒi£ þª×@暨¹ò8êr˜ Î”Äà“ˆ‡á(÷RY§„‚¢EHä3zP”HTUó—9‰©t0Am/…±Þ%£ŠƒX™ÂD볇–HaXÊݬd0mùŒi+íÈî~íVGv÷kž}16N{,$†-yʽTÖk™˜…\øð•óTÖÓEz¾j_Ì҇·ÿW¹Lû .‹ÑÁ•m‹ùغe1N{01 axÊÝŒ5ˆ ÚEHä38¢-™ŒŽv岘Ge~²WyΧϰWÙé ³ O¹—Ê‚ ‰ŠÈgì(k)P•­Zs{õúºvœ?º-®‹ÉÿA•—ÑÔ­‹qÆå0Ö @d<ånæEí"$òÑŽ4’Eþ¶áŠ" i$›GÄÏÐH榤–ØxÉSÁÈE($ò=(Š–ªlU#ÙÍûü ¼¨õ0iƒdfj 3äÃQ×Hæ¬R»3óÍÍ•¥ÜÍ\“¢]„D>ƒ#Ú!RD;­\Hvlœ?¤ó,$Ëï@k‰†¥ÜKe£• ŠPHä3xP’¡*[µl®Áü%ÿžµu˜´¹¥d§c¸ȧ£n)YÖ¸ ŒÄR2žr/ƒMJÔ.B.›Æµu $$L<ªW×J–âyæ-ÝÄËJÌ[ò”»©¬ ‹!‘ÏàaQ ªlÕ¼å÷—w÷ÙTz˜78p9¸´ÅÃ$¨¸tSÜ­%VÆð”;™«SJÖF!‘ÏØ°¶ÉþðGò°²YùÈʘL¬4+K®ŒqN9•D< K¹›Êz™ …\øð{ƒFRYGU¶ªYù‡«›ûZ˜Ì(»½^e09){•Òu½ÊYÝ|V2‰†¥ÜËZs’'d­{!‘Ïà¨önwÎò`Ÿ;ÑOS{ž½ÊÎé©O¢ÃR^&&B!‘ÏØ1QV,šuó+3N9˜¯o_ýðuþ;z¨Ê’Û`1FǨHÃr2•Å7uKHìVæ)÷2YcdmùŒlhÚÍ\fb癹tÎ8dÒŽr7•¡ÀhùŒeÅ¢iL¨Jc²Où¶ú>ŒQq{yÌ4*•ð®b~P›Ç$åÄH O¹—¹Z+ƒk£Ègp\;н1aíÞw¤e9½1¢-ËÞ:+²™Œ§ÜMeƒLP„B"Ÿ±ƒ¢ü+Ó•º½1ÿqywsyýoϨ÷oouÌTïOÙ·”wP¹:Æ…é‘–è)c)÷²ØœoˆX, ¹ð±ƒCÛ9$+1¡Ñ+{ÊŽ¥1³¯=G“?:¦c¢íU–£ÜMe£L\„B"Ÿ±ã¢¬X†ªl]OÙ·ß½û®zwL溹–²`ŒÏÿ¢È—£²¥,êh”HÃRîe¯ÞÉ€Û($òÜÎz㉽òPüŠ‚ ”™O“p11ª”À2žr7•M2Q ¹ð‰£GEd)xÖ2Ö!žt1×y}ñð¿µ`{Æ&Gš–™KÕx˜˜3å âa8ʽ̼ °B"ŸÁm ØÖ°){Tñ'Fs“‚͹¢D-†¥ÜMe“LP„B"ŸÁƒ" $ïÖ¡ )»xóýÅíUu£Ãæp²`tþw¼•߯ÃÉ|vN^¤©Œ§ÜË^ˆ ÛEHä36²m¬"IŒå{¬«¦ûÕ%‰‘œî÷ÖZÅžr/•J$**B"ŸÁ£"«Hcù[å§Ïļ~ø¶Ò¿X½¹fªÃ„dI “êRïcŽi$,ó”»kµ‹ÈgpP[Ó©½v*æÑl¿¥”K;™d±ßƒ ´@†§ÜKe“– ‰PHä3xH¤éTŒ®›ŠùîÍ3ò—í ÅÌsý±´+]9ãÁªè$ö_ò”»kA´‹ ~ìxcµ´c×aŽœ¹4Δ¿€›.ð‰øŽr'•õÊÈ„D($ò<$²´cëŠ0÷—¯ß¾¿¯ÜàŸ™n.ƒ fZHF2[Y„™ô-y/ÐIÆSîf®QÑ.B"ŸÁm§H[ŽS+7,ë$sºÌ¥Iv’åwŒÕEžr/•ͳÊî…\ø˜Áƒ"§€ªlÕ†åüwXé]œÞàveã¢7¥þbSÝve^åO¢>ÆRîfªIÌF!‘ÏØ`¶ÒÄ»(½Ö»˜Ã%~¥53õ,á]‚Îi£Ä‰Kžr/•Í6-¢²($ò; ÊZJOÕy—w÷ß¿¾«L_²foÐÁL‹¬ËÖ¥jL˜N”ŠøYʽ¬uW×–°Ö½Ègp4æ³VøÀþ¶ué aÑô%¸à£•H_XÊÝTÖÉÄD($ò;&ÊŠå©Ê²îðäZ²{óçê ¦;òçî`¬PN(˜ï­Ö8£©ð³”{YkÎr…¬u/$òÎöPÖÔæ©º@fƒ#Ú.¡µ«tW,í§S0ñ<ÇÇò;O0ŸßPY†r7•M2! ‰|‰v‹¥ñ¡êøØõí_k§`ÒæŽŽÍÞ¥l‰Ÿ>uGÇŒrN¢þÂSîdª @ÌF!>~p0;&2°;RP—½$åΓ½€·FIlëç)÷RY­„¢EHä3x@”Yl”»Øè”wùÏë7·ÕùKRak&˜yÑeÁÇr]åa¢ ÞΓ±­Í•§ÜÍ\AÌ.B"ŸÁÁìè ØýÊ9Ëc{b"”@O²‰,jŸ_»Ä*ežr/•5Z$(*B.|ÔèA‘§A‘¯š³üp«U¥‰ÜŠŸ·™3 eŽ?ºº1˘?ˆ*I4)ó”»k³‹Ègp0;Ò{cqí½±GdŠP&ëf•¨à•¨ïó”{©¬Õ2! ‰|F‰è½±Xwoìâö*ÿ:÷¯ß^¾»¨u3Û»96ŸµŒdØ2VÝ•Œwaîxnk³‡(w³Ù(€iS!‘Ïà˜v $&Lá4Pv%#5˜¬Œg¨ÁÌ/Ü{Ó¾Kùå^úêŒ@XD…D>ƒ‡E)R”,žBɹ¯?ÿÕ¯g×A)‡Çi·ˆÛøó_þáßYß±üÉ 2ÿH+0,e°¥Ü’€€a_Ý]}ñpùT72é•3K7ˆY&ðš ‰|F¯©æè=8àFAaÔøs”òçV`eò!ʽôÕ[©°g/$ò=ìñ–êë©Rþ7¡·Ûr#v¾3äã «ÝÈÔ""ãFʽÌ”BM…\Ì2 ŽP;ZTqO(ª7bu„Á9ö"O/|ÚåÖþ²Ë!ÊÝôÕ …=‹Ègð°ÇÑŠŠ;YQYáFw,b[nĸéôfq#Ž–NÖ¹éþ:D¹—Y%DS!‘ÏØ@´UPÌrºEØ&±*œ Ô‚i]^óÂÉ!ÊÝôÕ …=‹ 7vØ“K} í@­LìÔr*ŲÃÅ*_ jÍzÕ¼Åëå^fµÖ¼‰|ÆÆš­JÔ<¡‰øIµ«ÕÙ܈‘èï:D¹›¾z©°Ç|Ôßùcpãè«&Äù¡¡ÑêÅälDaœ¿±Þ5Ÿ¦1ËG”{™e2BXó"$òk¶Ê&âFxHã€yÔÆE³w®Ú˜˜Ró]“‡(wÓW {öB"ŸÑÃg©¾¶«äÐ{󵑜èìHÈÇ¡º62ë•H§G¹“Ye¥°æ½Ègl¬Ùj‚5ç‡fÙœ-±AG‘N-Žr7} RaÏ^Hä3xØ£f#Ð2—lÄÂÔjP^‰«ÏF&½)±s”{™¥vRXó^È…kÖ‘º‘¸ÆÄcn$Í8oƒL‰¡ÜM_£TسùŒö$êFRK7’^܈uÊô»Õ¡ÞLz%Sbg(÷2K㤰æ½Ègt¬ÙPKó¹SE‰]Û³ZÞz)±3”»ék’ {öB.|âèaµT_‚ZÚ½€ZÖ™XæFòǡԚôJ¦ÄÎPîe–ÖKaÍ{!‘ÏàX³ÑijƵŒ9›é<ˆ¾2”»ék’ {öB"ŸÁÃCîú䇆nÄØÍ»¥Tö"Š|êÝèyg¹ŒYþ”r/³t …5ï…D>ƒcÍÆQ7²jüð¨eÎ6~Î9¢ÜK_½’ {öB"ŸÑÃOÝHÃñÃi7ëÖ݈M.’¹‘üqx†Éz%Sbg(w3Ë …5ï…D>ƒcÍŠ,0ÊkÆ,¤·Êœmü0DídJì å^ú Z*ìÙ ‰|{”¦ êºÝøaVÙ—ñC“(µ¥êÇ'½’)±3”»™e”š÷B.|ÂàX³5å4c~8}šñiµkÒ¹ÜHkeJì å^úŒTسù öX㩾žºË¸ÂXk6ïFtV 27’ÿ¯ÚLz%Sbg(w3Ë(…5ï…D>ƒcÍÖS7â׸‘cµëÏæF’óF¦ÄÎPÑJ…={!>üIö‘ô•º~X²ÒÀ‹Ñ9¾&ÙˆuõndÒ+™;C¹›Y&)¬y/$òkŽÔ2q ¨ud‹|NF ¨%·E~záцØþJü!ʽô5Y¡°gù öÚ nøõ'º‘/ÿðÅS-˜–õ"¬Yç;Zí…×JÒàkBÍù‘YœN2c"åNV•‚–!‘Ïàв³åüˆuîôù‘OžTQwΔ|D¯´Ì˜G¹›¾:¡(gù å8g¨¾žº=²"ùp.m>ùÈ®H¯³ª6ù˜õJÃâ(÷2K­… åEHä38´ì4Á°_O­À°œ>†}´2c"ånúê¥Âž½Ègô°G{ª¯ 1,g6a)ë=ZwªÊ^¦¿—£ÜË,‚–!>zth9:-GxNE]²ÉaWçF‚ 2ý½å^fi´¼ù -»@܈ kÜÈÑl$šse#Ñ$™þ^Žr7} RaÏ^È… ö¸@AØØÐ¸¸u7Œö.a!7¿¨w#“^ÉÔFʽÌÒY)¬y/$òköЏ¯Ö¸‘cµ¯ÏæF’Ö2ý½ånú¤Âž½Ègð°Ç+âF¼nèF¼Þº™/¯ƒ*Cë.r#÷“Ùýê7®¯çöm¦øUVÍ_üCýø‹è_Ý|òÏz7Ñqqÿ×·ïï>Í_’O¦ÿjfþ?ÿøäõ^öý¯•»ƒoßß½»x¸¸»Ê–ö/ŸüϤ.·oþ_~±åGwŸ"üÉüøø'ÿÕ~ô#Åùá}3ý£_L/î©|—ï’øüæÍ“üpõæáíŒä\\ç/Iþó»BdúœR.ó›Ç?}L:|ü;•Ïô‘Ÿ~†G±¤Ý?{ü£ÿdÔG?Œv†?ú›òO~ò³“ÚüãDÞ7n g(öù‚Oû@ZãI{áþÐ8’‰0Ò˜ÖD‡{÷&4­DB½{óͶ 8’Ý4³ù–çE:d0t¥lÒÆø#Q¨fAÅDì\AO¬ %ÚDÑ­=Ò ’(âi}z³µÅ29’½,.6_à¼H·0{ss¶ Äâì³®ZjBÖ9é"Ø”(4n¢àHvSÍæ»šéÁàqJpЍ¦;µ¤ùÕ«ýßÊ«Wßüýþáò5¯^]ÞüòOß¼zEóžOß}¸:ä8f§ñÙ—_ý7ý-ʺ&¿Çθr +W;Ž­¯Zr${Ygj¾²y‘ ÿä`¢ æMìoûÔµ6$‹r¢\(‹0Ú´¾<Ƒ즚ͷ3/Ò- Æ^Ë ¥[Z@´Ðt½öÁÄÆÐK³›~6ß6Œâ!‡Áðt"Ó²™uà8}.ðhà&%•òGP“VcVãG;¥j ±4{Ùal¾^ÅCcƒ¸I—Ó§ÓÚú‘âsÒ\¯Gs/É·ÅXšÝ´³ù2a9ŒÅd5RD;Ísæá~ÿÙ÷¿sõðþîÓ7××ëfâ2óÍÍħ!<¹˜ßZ?7U¸U[܉¥ÙËHSóÕÂ(ÞÂaì¥Â&©PšDòÚÃXª@ÈÆr „\€I›°4»igóEÂ(r<ÀQ¨vž:ƒuÌ…üpuóî]…ïPÑnÏw8ÊVˆü`õÁ,”M—2±4;Y§SÍ÷ £xÈalh8)k‰uò +×/fJʉW-tÐF7n~eivÓÎæÛƒQ¼…ÃØ{ƒ'… T;ŸS¸ø¤Ê êÎR älöåpxRf}å"篮õr&Žf/£ÓÍw£xÈald8§;Žäü«võ=F¤l¡kȲ¾©ï^Ä)Dc‚nŒIq4»égó]À(rÑÎÒ즱yx³ˆ‡ovЧc¹÷—wÖÔ8o6ç<œ6)bCg~vu­NJùÆ[Xš½ÌÓúæpñ"r.ÖHöÁŽ?y9,©fÌaí’}H•3¦}Š¡qöÁÑ즟©yp³ˆ‡nt°T?YgWIiRoÛpß”UÎJÏË´VöMÍ{M½9š½ìÐAshxoáÀoÔÇ­&(€5k–vŠÙ‹‡b¬1T;Ÿ³·ã£‰‹L«$Á™¸ˆ‚÷eOG6}µ6s0ÞûÔx›¥ÙÍæ ùÖÍE<ä08.l…ø8òÉu‹h(absQhæÂ‚r®qîÀÒ쥡 [Ç,(ÞÂA ³˜D¡'~m]î`Imm« ;œ7éÈï7ÚՉìQ­×Âr4»ahÿ¢xÈapüW)’8(þˆèSHhGèj²îÏÉ8 ~·™½¡~²4{égЭÃ9 Æ(M»¹u»•™ØÙVþ 0Áô$~B©õ[ÿvJÕ¶3–¥ÙÍck ÅCƒ½N‘`Í©5džŽìvJN‹ã#4®b³4{ig4­£9 Å8EÊdŽr­˜œÞܽ¡hÀeˬ„M«ï IÚ5ö,Ín6—šŸ°^ÄC£ƒº@&™,d1xãèè„?9:ñtáÉ4ÄF²ˆZƒrÅ)¸õÓ{ jëx¢½ÌN«æ…i”Y é:OB3ç×ì|ÜÓš %L–&¡Ê´ICTmñ$žh7%õÍïW£| 7zðâiðâO-<6ñ—w7—×Óï[1á ¬ØÊl„«hÓ«sfµ+IÁO}›­”#ÚËJn~ôåCƒã¾ÞÜ×óñæSS âH¼+9¾˜‰:ÆÆN<Ñn ê›Ç:(²<ÖñÎRm8áýË|Äî.Qé·™>ëç#¬RÚ»Øv ›'ÚË­i~åCc#ÂH;?¬©`›Gi¹]¤„­…–ËZ•=]h HñD»©(4ïÅCùÅØáLÖÊDTôYeìŸn!'uìíz ­ ¤Òì=­l?Ù[ÌZÕ¤â‰ö2Eg[cÃE>d186 t/ð{ž R‘MäàÏà-´×úØ)O´›Š†æ ʇ,Æh²V’äøMu¹øo!…¤“/}P`+¼…¶I‡Æ8O´—)z×|’ å[Xð».2EzøÃO>‹M½…‰gðIƒšüqSåˆvSÑØ< AùÅèqTEÛ]8ÊßÅ— G9·pFC*E Ðë/M[Žc0'îX¢½Lq´45E”Y  ½ü €§æ¤jÑIW-¦©b«¿y¢Ý45gP¾…E=œ‰4œ‰Ïižý©¯ˆáÅWÉøD2 ˆ¾"ÿTëõ<Ñ^¦|sHåCcCÂÉÓ% ž_’ðäùlšY¨3àP^O{g,Ñn*šš‡3(²<œñ‰âPü.ªJo¡^p(΀׆Ըc•?É4>žÊíeŠšCÂ(²Š\ˆ ü *h/ï-À+ë}coÁí¥¢Iµß7³È‡,h‚&{É‚f ªÎ[_¼EÐ*©¤In1{ç•Þ"(æíä-M‘%ÚÍCsHåCƒCÂÁ’Ü"ØgÕ¸ 9M\É-ŒÐm ›3·æïx¢T4GÒÍ”YŒÐÐïÀ7xWz ÷’[L»>L~¥jLEn‘éXÓøª6O´›)Ææ 0Ê·°ƒƒÂžnTðüF…ÞÂË-|8C;ZŸ2â‰öRQmš4(²< ñÁQmXãžËû[÷Á80ŽÔ¸=TÔ¸wZÕxÚ‚%ÚÍcsPåCƒƒÂ‘æñy¹Yþø¾@§µ7^·Å¡x¢½ÔØÖáL‘oaag"Í,âÉÌ‚ xÿûõû¿\\_ýßüáõê›÷wW7ßíþï/¿½øpýðéÍõý1ïòñºè6·d0§r:YSÖ…D³zÉ 3NéÚžßæ‰v3ÔÔ0.ò!‹Áã¨IÞõ³zkM¤tKÞ1)¢ˆ/1É4¿Çí¥¢Ö6ßQŽò!‹Ñƒí¨Š6Ì;¢yÉ;¦c6gs¥Õú¼c§U¯YðD{™ânGw{S,÷,2‹ÁãDÛÜßæ^±t0Yñ¥ƒ9~ö)†¶yO´›‚ºÖáL‘Y Î$C–&{jé É;~óþæaÚ/õûן]¼~{ù雋‡§§Énn+aÐ*xeÊy‹¤Wo%Ü«XÛ4ƒ'ÚË.½nùÅàØqŒ°âáµÀ*‰VÞº`Mã$ƒ'ÚMA}ëȦȇ,lb¤€ j[mLÛƒŸ¢Õ*’mµ1¬†Ÿtv&S7µ]rˆl/ÓÓþ¸v‘pa¢G‹=vžpìâó¿]~rxÃÊäޅмü³;6ε­"ÛMS¡ý¡í"!2<Ž ´M#œ<|Á.®ýë¼±Öši_í!?òù}þÙŸþøùŸ™µœÈq(¿geT`Ú¤ºú&ÆNÛ õLß!²½Ì4˜Ö€1•™ [¥ ¶ÁO§ÏsäPe–R.w-­˜C±>*ïÚ®˜:D¶›¦Ð%\˜ÀСϤOžjê©3ݬCùpyWéN2O‚½Êº“Q/.gŒ%·”Ҷ»XP»AÂÆ6Ë‘íe³Ñ¶†˜©„Èdt99ÀÄwö.GÉ–‘ Š,´f$¿ro½Ó›°‘í¦«A B ‘ÉБФPd 0ñwOù—›‡é²F]¶’bÜ\¶bmÊaH¿¤µþÄh«|ðÚú“Cd{Ùhr­‘g*!2{ÎñF¦5«WÕ­ÒJüÖk~ÛŒkŸmÕ”%ÛMMcóc0DBd2tØ3é“ú‘<´:ú:Ñ:×Ñ×a|DÔN9(#JÅÕˆêPã“~Èv2¾ |ó[šDBd24ð<-¸£ˆ¿<{u}¢”ä}„ ó-¡Ö>‚'ÛMMSûP¦HˆLFe…³øä¨ÊG¨hÎä#†nÕ5 .MÏoRõÄV]T«Önƒ'ÛË54?³I$\˜ø¡áe}(ýÑG¶ò€ÛÐ{·ñK}ð³îtl""ÛKŒj} ‘ÉÐÑǤ9†ª‘kÕ•i¥s}ÖG­>h°$˜LVÕŒ_(åjÜ-uˆl7c×~%D&lf;Š1ZeÁýHNa|T~8|™5 %È*>L/\[§tÛlàÙ^šjhê"!2a?Ä#ij$šVLc”âÃÃÅý_ß¾¿øôrÖâµåmüæê*˜^”,ÁúÕc1$ N9§¢m;›q„r7c ¦±±þDHäÃZÀ@öjÂkŸphéxÛ”§”KPhgáþC4.µu.G(÷RY§[GB?ùŒ  <¼Äº˜®nÞ½«lŸ²ä<ÓVÛ§|þ¿Òª,½Í´ÂÝ€Ñvº7ÞÞvyÊÝlw¾ÿÒÜv‹ þöÑ8¶k©{›'\j:ÞGE#¬iÿÎí4ëÔ¶Q÷å^*ëH„T„D>ƒGH&’Éœ¼Ýĺ›w÷þRénLÜÞðGÔù_ @£ ¬.•ï´ÍeoÝz£ÕÊÝŒun%ho¬($òa£­qŒÕ+RŒôêôÐùGþ%+ÌÄt™;+Ü¿ó¨Bëîª#”{©,X™…\ø˜ÁC"¯QY~«Ã)ÿòÕû»Y¡}ùýÕëË_Ý^Uú¯as¾ÆÙ¨ËâD«\Z=¹>k^2ì¼¥µáò”»njsÿDHä38Ôí€ôg9þ’U]QÆA:K.“Lбõ6Å#”{©l°"áQù 9ðTe«Fï¯_WzÎ5w8wÑb¹x§œ_=h¸èÚ4°Øv6äå^¦•Ê]„D>ƒ£Ü» MøðÜL†xö\Þ%†Ð¸Yìån*ë„¢EHä3x@ä=Ídø½.§¼Ë›û»÷×—µé l/}±ÉGŒw•é‹Ë™i¼Î÷å^Öš´®]„D>ƒãÚN òûÂVTþ5ÁÊœ!#í’`YÖ}S㣅G(wSZ/¡Ègð¨ÈÑ-?Žßòó”ö²û×oßÔf1f{ãíSãK@9µz¼}§p1s"N†¥ÜÉ^sr!n!>zpph=ÖÖcŽad Ï”ÅL=¸`%²–r7•™¸…D>ƒÇE@ë1PW¹¹}w;ý•.¶X†ÑÊ«rì[ùÚ2LRÓ:¯¶S1G(÷²Wmd0mù Žik~$,F²b“0m)›Ôñ,.&‡WJÆÅp”»©l‰ŠPÈ…¿Nz$•¥]–ýmOº˜ë‹‹ê:¿!W?·â`l²BSÞÁÜF^ã`4hÕøÞîʽ¬u§¤Öºù kç_¹Xkàç¶ë6 ²Ih³ðþÃt@V g™§ÜMeƒPL´‰|‰Â¼ÂØ-c'ÌåCv+ßÖNÉ­¶èbŒ&.’®q1ù³QÍG1ÛëʽìÕ: X›‰|‡µƒ#ap+ÇbŽÁdY3Ï‘ÃäwM”p1(wSÙ(!‘ÏàQQðd,&ðu£S.æWþvu}uq÷÷__Ýß^_üý›Ë»©ù¾ÖåøíMʸU\ήÕq½ËÑ:ªä‡G:ª²§vøó«e¦ºÌÍ›ot2:¥Í9ë¦Ñ]C¾ªÎÉ€‚dE03–r7‹27 ‰|Ɔ¸5½ ®Ü_‘ÐxBÙ–ªŒà:æé¶E€Ö—¿ŽPÉÈÄE($ò;.ÊZšˆÊÚªªÌïÿëËïõÕïê\L溽²Lþ¶9(ìµÒ•e™à§ûí×– ÜÍ^“ ÆB"ŸÁ1nr|zX¹¶ìXY&ų¬-ËïL~ïy K¹“Ê&ee¢"ùŒeÅòTe«Ö–ýþþ³‡oÿþæêáý]e&“Ò÷—MûUËR¨Ú_ŒŠÞz 7ÃSîe³»‹ÙÍm¶¹Ø,_OÆfµÖ$,ÔfåÔÌ‘MÌ™X© .— S_¥±¥žr7•u"‘QùŒeŲTe«¦f²O¹½ÿ{e³Öv{C3ÓBšÈäÿ©ó0ÎHºý®ÿ”{™k6+sE!‘ÏØè¶¦‡ÇõÃã•XY<Vfœ3Þ4¾‹y„r7•õ2A ¹ðá'§FRYŠ•ÅºæÞUþgž[Dʦ漨CÊ2-eƒˆƒa)÷²V«Eí"$òÙVÉ’VdWnÈ|4"Cd&çϓ„ä}fžr7•õ21 ‰|ÆŽ‰²bQp×UíÇüð·‡·—ïjw0'·Åõ˜VѹÿdªÖck¬1V$ã)÷2WgD€í"$òØÖʼA~Xy}ùHæ)å³\_ÎïtÎÙj1<ån* "AQùŒeÅrTe«®/ßÝ_\Þ¼­LaL8×ù匱Q—{ËÚøª{Ë!Ç/5¬ýþå”{Y«·"vù i ÄZùmÑU2Ú˜óÌ`Z?]7u) O¹›Ê™˜…D>£ÇD†ÆD|wÊÁ¼¾ûûíÃým­‡1ÛÁÌÆÅrqYïª ë=ŒÓLØð€r/sÍ^@Â\‹ ~;ì8æj51W«Ÿ›ÂXJ¹¤0‚Û1ó;9¶X¿|€r7•"AQù Yí¨ÊV¥0÷÷·W¯¯kË0Öl0‡Ñz:^RÞªËaœUÓéR2 O¹—¹'‚i!‘ÏØ˜¶Ö¡L±å‡• þ4,OKÛΒøy]•À%Ì”»©l’ ŠPÈ…O<(Ò¨ÊV-øŸs˜¿äß³¶—,noÇ¿!'o¥Ô¯¡jÇÿÜõ¬µD!†§ÜË`£Aµ‹ÈgpTÛ):¾ó­®ã´9K!ƹé*ŸÄP O¹›Ê&™°…D>ƒ‡ENE¢²üµÙ“»Ê®nòG°ÒÁ8í7ç`¦í1Á¨’ÄÌ;+ŒSÞ‰Me<å^Öš@Õ.B"ŸÁQmK+ývm¥ÿX!Æ’J¿hã´õZ¢—Œ§ÜGeRJ&&B!‘Ïà1‘¥•~[Wéÿúöõ×_ç¿£‡Ú4Æn°Ü?ý«sÄËT–û‹{8¶½Ér”»™lA¶QHä38²íƒÇDhÃ~RÓrííËÌt{)LV‹T¾lù„Ê&p^$…a)÷2WÐ2¸6 ‰|ÆÆµµw¤pêýÊ{dÇÆb¼?Ï=2\ôÖ_ò”»©¬— ŠPHä3xPä=ͺù™€“æÛïÞ}wWíb¼ßÞ5²)‰Q¤Úï]Ý52u4J¤ÚÏRîe¯ÁÈ Ú(ä‡ßÇ2޽Zˆ k 1P²@(;¦*ábbT2ç•yÊÝTd¢"ù Zˆ u…˜××y}ñð¿•&l¯M˜É’Ä„Ú:LŒ6ˆÜ»ä)÷2×hd@mùŒjÓ¹K¿vîòÑŠeâa<™»õ0)Xg“D©Ÿ¥ÜMeƒLP„B.|`ð ÈÓ¹K_7wyñæû‹Û«ú$f{“—¦ÚB9D¦]íäeÊe”±”{Ùk²2°6 ‰|‡µc .&†çÎÄ3_“>ƒ‹ñâ4œÞ^eyÊÝT6ˆDEEHä3xTq1‘_§vrAÙåÇÛúC11nÎÅg£]p²u.Æã¼Èp?O¹“½jåDpí"$ò׎–€‘¿¦»'s”rî—,ö{k­‰©žr7•"QQùŒYñ½o§Ç._?|[ë_ÜæÆú£ JÏêòLÝX¿÷1‡áF¿°”{«ö" vùŒjÓf²ËW”úÉŽå@šÉ$§.=˜c+‰†¥ÜMe“LH„B"ŸÁC¢@›ÉB]3Ùwoê!²°½V²hÀzE¦aBe+™›ã ˆŒ§ÜËXw×·Œuráㇴ“)#Òùaå¡ËcùK²ç9téÁY(á(÷RÙÝÒt•]„D>ƒ‡DÉj¢²¶êÐåýåë·ï«ç-IÍ7âa²ž¤‡”q˜¤ë]Nú–¼hVæ)w3WA´QHä38¢hæþ^7ÒŸây“åwŒ•XLÆSN E‹ 5zPD‹0©®“ÿk½Ëë/ÓIxÚE–jë/à•WQc)w3Õ f£Ègl0[iW¼K~Xé]Ìá¿ÒþL%þ sÚ(1lÉS^ËD($ò; ÊZ‰ÊòôéúË÷¯ï*Ó—Ìssf.ÀXS6’i[é`¦N[-R€a)w³Ö(ƒf£Ègl4Ûh›~,Sé²Q& ç)ÀÄ`¼È^ežr/•#¡Ègì˜(+–¥*Ënj=å`în³quÆÌNmsÆ:Ÿ ùnè:ƒµVb˜Ÿ§ÜÍZ“ œB"Ÿ±ál£’ÿ‘<„gÎÁ8b†dk“h&Aö’" K¹—Ê+¡Ègð˜H%)6&:å`Þ__^|¨Þ“¹Âö\Ìt¾ºl$3*†:“À«(1ÌÏSîe¯QÉàÙ(äb¯üF¾qìÕX»ruÿ£"?ÉaŒ;Ïê~Pzªt óó”»©¬‰ŠŠÈgð¨ÈØ@U¶juÿýÛëªÇ`²joootÖërãÒS··tþ7åÚÈxʽÌ5)L»‰|ÆÆ´Ž4"LÏEÉ¡Lº9“¤‡±)*#1ÃS^$(*B.|ÜàA‘N%ãï=!‰©Î`ŒÚHÔ4YY®[æÏFHR)óó”;ë´2LÄXQHä38¤m"Í`bË &)ƒÉ™»÷ëÈxÊÝTÖË„D($ò<$2‘f0±*ƒ¹z÷®Þ¿¤Íå/S•ßZR„Éÿ¼Î¿€¶QdS O¹—±j#‚h!‘Ï舶/3ù)XqÜÒPÊeë¬d“r~ç Œ‘ð/,ån* 2! ‰|‰”§uCÏÖ Où—ëÛ¿VzLwäÏÝ»€³‘d/jñ.~ª¡ Ô_xʽLÕX0…D>ƒƒÙެºÌ+›”e/š¤/ŽìºÔ’ùKT!G Nã)wSÚ !‘Ïà!‘#Ë.³šÕm"{{y}]Á¸ííºœÏZj’ÁØÊ]—Yß¼­Ì•¡ÜË\­³‹ ~þ8æj¡lÝÈ+‘=ªÀ8Jù<‹È¢öùµK¬Sæ)wSÙ(!‘Ïàa‘GU¶jÙ‡û[­*ý‹ ›\Df’&þÅ×-"‹‚JmÊ<å^Æêœœ]„D>ƒÃÙÎÓ†ßWä0ŠP&P‚õ/¼’8›ÌSI&$B!>ü6º‘T–f0üùš“ëúo¯ò¯sÿúí廋Ú46—Æd7ãèñäéóVáf@%ÞzhžÆ¢ÜËf½@µ©ÈgpTÛÒVeû„VåOÂ*Œ%}ÊrU˜ù…ÃÔ!.¢¯ ånúšÂ"*$ò<,²´OÙžìS>ä>¾þüW¿ž]UYæØ·ˆÛøó_þáßYß±üÉ 2ÿH³­0hÁÅÒvä¯î®¾¿x¸|ª”Ú/;D¹—Y€×THä38xM‹™§;…7B/‹ »‘o»æÅüC”{ékPRaÏ^Hä3xØC/‹™Ó—ÅV¸z0l£nÄù龋+É­©¬t#¬m^¸?D¹›Y„š ‰|G¨•!nDñ5¸{¬'ÌžÍ$çMsÄëå^úš¿õBúºù ö(C܈âÛbê܈â¶yoÌ8­*nd7œQçF&½’µÊÝÌ2 ÑTÈ…Oˆö‰tûtº»øH6¢(Ùt†ÂÉô£ ±ýhä!ʽô5¡°gù öxº’Èó+‰žèF¾üäŠt+n£t4.”ÅùÆÇš®áYÜnG²€2”»Ya‚–!‘Ïàв§í1žo©(…øp®ä#z¥Có»,‡(wÒW«¬P”³¹ð1£G9@1,>µ¯Ä°Â擤”V¤ ¾+W%³^‰`Xånf™„ åEHä38´ ¶\̧/HI>4!KÊ“ZØd h¾\òå^úª­Tسù ö€#ìÀßÿ®s#@noÓ@ðÔ€‰Õn$“‚æò‡(÷2K£„ åEHä38´ìi£‹ç]¸‘cãñÞùse#Á…ö;ŠQN*ìÙ ‰|{¼£˜«;u%rM6â˜y¨M¹‘à”(ç†7©ÚLz%Ò˜ÅQîe–VKAË{!‘ÏàÐ2Y áô¢È§Z¹ÜH4I¦1‹£ÜM_½Tسù ö@°T_Om‰\“Dµu7bÁ*P$]íF&½’©0”{™¥3RXó^È…kz"ð(*ú{ƒ:›IZ[™ÚC¹›¾‚Tسù öe©¾6t#AoÞ˜äw-•øq8äFî'7²ûÕo>\_ÏÿìÛLñ«¬š¿ø‡úñÿÐ?¾ºù䟵žœóÝåw÷ßßYóiþ’|2ýWo—ÿêôçó?É¿Îÿüã“×û·±ÿÅð/w×rðíû»w÷wWÙöþå“ÿ™èöâÍÿ˯ºüèîã„?™ÿä¿Ú~¤¸Cü±o¦ô‹éU>•ïò…BŸß¼y®Þ<¼¿¦×ùÛ’ÿü®™>°”Ëüwú˜tøøw*î#?ý 1—b[»öøGÿɨ~-ô7åŸüäg'EúÇ:e2Ó*Á®ßÝ£"½¨ÍvÕæp( Þ7ž-`(v ¼!¢–¡À^8¤Ï¶©84èÓÃýò¡YSt¡&Pmµj\€åHvÓÌ kæ"ÝÂØ¿ìTÓh¢š¦V>;VΦëbÒV᨟òÈ‚ÉEÀñ§5|Î ÔçHö²87×›[œ! Ø k ‹ó‰X< ¿Ð„,üB¨)'§ÝÚŽp$»©fh¦,Ò!ƒÑã°T5«î"MÉΫW—7¿üÓ7»‡)óùô݇«C®ãÑÚ¤Ì:`ÃoÇuä8Ègbõ}$¯}åHö²Oï|kûÜK‡ Øðgû„‹}¿ãó©8$€Òy„Ñ&¥¶yG²›jÆÖQÍ"2<ªy³->°Bsc­ô8®ùÙû­u8²Ý«µ¾À€Ñ‹¢É^Þ¶6¸½tÈ€ ÌÇ1¸¨Hõ³ºiˆ/ˆ:ˆû€ùªsSÕ|L²›j¦ÖaÊ"2u~B‘ÉÍ û‰8Á㪼«ýĬT®mY‚¥ÙËÁ´~Q<ä06ðëT9‡3=¬9‡sd|Ú)rG¨ ÖÇœ.7ÞÃÄÒì¦Ð:ŠAñÃèQŒ#¹®zÖñ›Z]3-¦lösou#©=vó´VWS4=K³—ÍÛçEñÃØ8ït´ØœQkªáˆG0J|¡Æ|’%µÍXšÝ´3´ŽWP<ä0x¼b”¡ÚÙl§F¦u®#ש’Ï_‚Õ+6‚ŸfÛ:–f/Œ®5Ä‹â-øcb㘠&LN?¯“‰8 â[6¢5¶õêV–f7팭Ã9Œ¾N¦üÐlцÓaƒ‹6²G€H•cŒÔx‚'ÚËê’k¾$åCƒã¹ÚÒºT÷©õOÈ’s/ã´6ÁèÆ‹øx¢Ý45_éò-,âèQ‹%i­ví&å2±³MÊ\pðÞå­˜õÃrZ[Z÷/ñD;™bP¾ùDʇ,GuwGyñaMÍáQA|…ñNÞWD0J7ž…`‰vSÐÔ<˜AùÅàÁŒñ¤ì`ø›œu¾Âøðâ+f_¡Ë`µ36®÷F›œß5šc‰ö2Åœ½¶6E”YŒŽ÷’W˜°&¯xT ¾"Êç\t®ñm–h/5ªy0ƒò!‹Ñƒ™@ËeüþùJ__òŠ© «•/ÃsÎ@E^‘` ¦¶ ý‘ífŽ¡ý”u‘™Œ ۔ȜRJl…ð#ñùß.?9¼û•ö¾*f”µõ¬uš‚£ænãÙ^šjuû‰ë"!2;¶ÉÊ TSÙ<øÔž¿¿^ÞÝ\^[óé›ëëC¾åóÿúü³?ýñó??¾*”Uº´sQ3PQÃçe‰mŠnuQcֶݸ^s3}L¶›™Ææ¸1‘paGŽ­#õnËßÀ8ìPU7,¡LÐ+æP¬j>ãÔVSY²½4ÕÐ%D&c‡>YŸ,ÕÔª[uî/ïªÝÉüY=‹;¹‰ÊDzu"=*nÖ¥ü"sÒÓz#O¶›ÍÆæH3‘™ Ž5[Eõ,?|~Ø»<Þ/kiMfõÄV&oýn8·­®²d{骷‘J¸01£GBŠFBü}­Sþåæ!»–Z÷¢aƒÙж|МIa­?1:d¦6Ó¶þäÙn6šÚœ,"“ÁñhgHÁÄ™5“cݹΖ‚‰Ø=ÔlßfZXÚZMY²½Ôlë°‡JˆL{Ùu69–fmºó­û­µéFÐä#5õ=Wøˆµ-‘"ÛËø‚j~ˆ’HˆLÆž'°™.mýí#7¯Î’ö.Xo|ãu´‡ÈvSS×>”)"“ÑCe©š¶åpú\£#WÖ§URº\QÍ_…е´‹Zµv<Ù^ö¸»Þ+b@˜Œ /[Ÿè~ÚU“ázï6~©~ÖŽ­Q¤Cd»©‘o} ‘ÉØÑGÖºH¶Ýw¦õ2Âí³™–¹±l²ë—È:“¦!=õ=74ÆCd{c𓤖ÆH%D&¬zcŒè¾Nà÷u®(n“êè‚ æîšd"ÛMSç#oÍ5Õ}4”‘ø»†#i*AŒ@ŸBŒØâÃ×ïîwÿúéå¬Çk+ ýö* s¢P¦5|Z.Åék›ÿ_Úz•#”;™kT3ßt ÃÇB"v0i ‹õšX,–ö-ÇFýÀ—HOh|cÿΧýÝËÊÝTZÇB?ùŒyOU¶êôöýííëÊ7“À›q/Þ+]úA¸õ¸'e˺¬j|"éå^¶ªç;,Ímµ‰|Øk[õ@¦t=œ>„q¼sÊPÊQ:uÙ¿ó cë¬G(wSÙ !‘Ïà‘GUöÔu Þ½\×zô&½‹!¬¼75Þ%8—”7ºm™ãå^¦jæË­M•¹ðáWcªA‘äå@E¿nê#˜Zhêc÷νuvîn®²,ån*%""$ò< ´•<ð­ä§¼ËÌó„Ó/Zéd‚Þb 3mC+¤ª&¸m°kéG(÷²Øü"‹B"ŸÁ1m¯É&,¯OoÂ:>«NÎùy㛡„“Ia^PY–r7•M2q ¹ð‰ƒÇEÞЬ›‡ O9™‹7ß_Ü^UOæ¯íö\LòŽ4 9¯Vï˜.ÿM߆¶+Pîe¯9»–°×"$òщ…üæ½y Y‡Éî¡u(»wn­U ‘Çð”»©l‰ŠŠÈgð¨(ÐöôÈ·§Ÿr1ïî_?|[é_¢Úà˜!|´Å…¸zÌp§m>ëWë¾G(÷2Ö’ÛÞXQHä38¤h‘?¬-ò?ªÂPœÌŸ'˯8h(ò ÜKeAÉ„D($ò=$¢EþPWäÿîM}þ¶XåÏ©-Dâ_êªüYÛ¬Š.¶d?B¹›±P»‰|µs†E‚Aþ JeþâÏ”¿€³9yñ/å^*´LH„B"ŸÁC¢HÆE~aÜÉ*ÿåë·ïïj3¿Á ÆGD[™Á€W^E‰ †¥ÜÍ\£¢]„\ø„ÁmÈIј¬ó0æHfv´g(Âø ³c÷¦ÜKe£‘ ŠPHä3xP”Sª²U›ƒßÝÿú®ÖÁä¯ëöLò»5HË;€Õ{ƒ÷ê–5L‹@d,ånÖeðlù Žg'z""ñ]Du­d)Ây ²˜Ã+­ªü<å^*›¬LL„B.|Ìà1QІªì©}ÖÁÜÝfÿâ*Ì|Ork&g0šœ:IaõýõYÝÀAþQ‰ †§ÜÍZ“ ]„D>cÚ^™‚‘凕Ù£AKK([{Ù{¯Ú.©?B¹“Ê&eEb¢"$ò;&ÊZšˆÊÚ*ŒìêݻڌŸ_ÐÖü äÿT–Ãx¥ë2msÔ-Pƒá)÷2V­Dí"$òÐNô¸{zÂq÷'OZ&'¾$fyç Œ‘ð/,ån*ëdB"ùŒe-¥9÷Ésיּ¾ýkmöâ6¸&Æ»`É2UkbBTÁ[§²žr/S5ZÌ.B"Ÿ±Áì )¡ æo,­È^¡L$+üQûi]ã)wSY/!‘ÏØQV,KU¶òÐÖ­V•Ù˼›cƒþÅ—-ëù³±ú°Ö^Û ¨¤Û¯!;@¹—±Z#‚e!>üØâ8Æš"Âs;È¡Lª B ïñ{¥&`xÊÝTdB"ù eoHT6V¡c·Wù×¹ýöòÝE-H7’EPÆ j@2P9ýÉY`û*ÿ!ʽlvwȧ±ÍR!‘ÏØˆ¶‹tÐ2>aÐò“Ãüä¨JRçð1Ó 6ÄöS–‡(wÓ× Q!>0vX4•5 BvrÊòûx|]%‘ñÉÍ\àò>j2ž«Æ'g5š]7/­¢ÜË s"'d…{!‘ÏØ8µ7´jø:èSÏ5BÖ†3ÔUæ>@óÎãC”»ékŠr!‘ÏØQNV,Kõõ97¹æ„ƒPvê1X»­ë-ÖøRBɇõ¹¨^5ǸQîe–ài*$ò6ä¦R~8=Ãrà¢n„Êv#`4/Ï¢ÜM_£TسùŒö( úzj€eÑÌTï¶ÜHNFŒÒ¤R’\µ™ôªùJýC”{™eð¸3ù Ž;k2 ™Ö¸‘G]^šÌ½U!7Þ7¯Ã¢ÜM_“Tسù öh2™º_܈×H%DÃ3ÜxµʽÌ2‚´¼ráãdž–½I4á§g*@-«Î–„i¯™ˆ¾2”{ékRRaÏ^Hä3xØcÍFRC7b¹©s#&ijÅz7óÇD&a(w3Kš÷B"ŸÑ±f [ÖTÔ‚ZÁžË$­mó½_‡(÷ÑW¯”– {öB.|x˜h$}¥µ¼ðœŠúOA­›w#9ºVÔøpÀÜOnd÷«ß|¸¾žÿÙ·™âWY5ñõã/þ¡|uóÉ?ëy™Ëý÷»EkÓ=èé¿™yÿÏ?>y½}ÿ[àß䮿àÛ÷wï.î¡ýË'ÿ3iËíÅ›ÿ—ßkùÑÝ—2?>þɵýHñ}øcßLÿèÓ{{*ßås„$>¿yó$?\½yx;Gà×ùC’ÿü®™¾¦”ËüâñO“ÿNå+}ägࣟ!¶Q i÷Ïÿè?õÑ£™áþ¦ü“Ÿüì¤5ÿ8€€Ÿ[Ï~ÈŠ>à14ÿ€ï…[èýážfÁñ¦Éôpú’h 4ÒÁÖ½‰R9#*Ôº§­V»/8’Ý4³90¿H‡ †NM'rT5O] }rL‘‰‘k ²1N¬‹$Qëü×oÊ;X tV ¶É^uëäs‘ uN»H€XÜn²gÖÀ2%rM¨–“% m¸9’ÝT³9¼¾H·0WŸtˆÆ)u·×.o~ù§o^½"iϧï>\ò†‚&¾¥µÔoÃoÄœÙ{Pª¼ƒõ××th¼Ô€#ÙË8wÛšç^:d0tK“W®\ßÖ •Ç’§ÅçŒ6)µM"8’ÝT³9ž¾H‡ iœJD5u«QŸ‰ÖöF}¦s­Ë(Ù¤Õ£>Œn\ÇâHv2¸¤lëö¤E:d0t_Ò´‚3üHÒ _Žø½¸/0¶mG²›j†ÖaÊ"2óK”ß¿¾¸¾üôæú~¬zs©D´N›×*çV—¦£× /cHö²Gë›÷Eï¥Cƒã¸†ºŠKrŸ:W£)Y&soì*<¨Öãý É^ªéTóè½t‹jòC)#©¦£ªÙ°OÉÀ¹ú”†í}¶Î(ÛÅò+¡¾á‰yÄt†Nµ­9p$»Y ´véÁàÀ®/³ûÓÚ¡Ëc}K^~v?í/ÏçHöRM¯ZÇ-‹tÈ`ð¸Å ªÙl¾rÒÎÍÏW:§¼.Q¬òcú)ZåÚ!8’Ý,0´FzéÁàH¯7éµ§Or¸ YrE/ 5µ*Rc”‰¥ÙK9A7ïœ[ÄC£‡.–†.üÊÖ'öµ¾¾ûûíÃî*äʾVoËÅá­ôµj`Êw,&V_ÖÊÅ97ijŸ Ínö›Ï -â!‡Áq`£iψf{Fž:ˆOÛ™t’.Qh5-h< ÇÑì¥Á´mP<ä0xl““!ªlãu%ôdÌ™²‹a\BÐÞxŠ+£ìj— õîŽ}K£ãhv3ºÔ|ioáÇ{!‘WHk:\u5¹B6p}#]‚Ω[jÛÖÄÒì¥Ñ6XñÃàKP$` ê9M®?q ó.ƒ­76M§N’%MIßë1'­C×x"Ž£ÙÍSóQêE<ä08ð ´&ϬI¡K‹ ä'Ì~ lKýähöÒÏäšG1‹x ;zC в0ç+LŒë'²³Lqž YÞJEmb§Tm+×,Í>vJ©æð"r†rUhz`¯ UÌËÓÒ“™ö…è¶ÙK³›vºæÓÓ‹xÈaô(ÆÒ\ײ¹nÕÈ8f'ÌÏ_HÚÇ2> ƯŸž¨mÉ¥ÙËæ´n>@½ˆ‡uƒ'‘YàóTlÓàÎà|Ð×ip4»i§o>C½ˆ‡W]ø…‘•ø„Í•¢Ž¬wPÁ­Þ®dTš*Ž¡ÙËèŒi ê¢xÈatP×RP×®©B?“4¥[ÊÐZ¨Åu^`Ò|¯C³›~‚ÈÎܬ1q=d±žêgÃ:tpçªC &—É‚!•é'‚I"¤ÆÝJ,Í^vhmkPÅ[8˜ÁAÝH‹‘/þ=5u0”lqBgC¦5“­7¸²4»ighÅ,â!‡Á£˜H×DF~Md—ˆúÅK@ð)ì¶ì,^"Ux‰¨£j\šfiö²Cg›ƒº‹xÈatPW‘‰Ðk&"ÏRÓÒ4]‰)Tš61Z߸4ÍÒ즟±y³ˆ·pà‹½駦­üGeiš´]o×OL{ûœ#¥i¥*üĤT¹r4{Ù¡wÍ¡ÞE<ä08Ô)DD~ ÃS³ ®I•JµºZí|0mó –f7ýŒ­ã9 Ç$EJI5,E$u®RÄÈ~Â:óÑxuŒqµŸ°FkmýK³—‚o¾Js9 ŽþFOšD¢_3ql_ñ•ßùU{ëÛÖ&XšÝ´3µŽbP<ä0z…v[¿#0»Ã~îõê)[ Stë·~;bã3r,Í^6 ùÞïE<ä0:ÒK·D~«ÁS›Z'Steúa^µ&áœóà\ÛÜ¥ÙKC£j³ xÈaô˜ÅÒÜ–Ö¨¬E¸—ñÚÙ MY¯Íúñ‡Rµ­E°4»Ùahõ¢x ëMžÔ“Öé¸H1&(V…0&?Ÿ¢h[‹`iöÒϤ[G2(r<’IžÜKðœûq?Ř^üDPNçO@§N.¬ö~ò7·³4»Ùahõ¢xÈat¬7’1¹׌ÉMŸ˜Ã-°ó5KáX0I;ßvRŽ¥ÙIAµ2­oáÀ_#IAUÐçLÊýÔQ$÷â(‚1ÓRªÒ›‚_í(¢ƒÆÐK³›ÆÖp/Ї‡{“¥EAþZêS‹­mA{¥ŠÖÄÆÕ,Í^ú©Më@ÅC£2ÖQýlx-"¹³]‹ØO¨`òWø ³þ`ÄN©ÚŽJ°4»Ùaj £xÈal8”Åóón“?‘Ca#î'&OËÖ,Í^úilë8ÅCcÇ1SÂCô“P­ò™ØËR)°xÒ»UDëüDpÊûÆÀK³—ZÕFñÃà°Ž¤P¨ùÝ´ü„;†;i’ÕKáN!™ãN,ÍnúéZÇ1(r;ŽÉzDòÝQW]>¡ÓK,D“<=†¦tXß»Sª¶ùK³—:ÝÿEñjlüWk’×ç‡5ùÄ‘&X­Éþ±C1¸Ú¦<ÑnúéÛ2YäCc2Y'IB¡Ý©„‚\ú÷ë÷¹¸¾ú¿ù«ÿêÕ7ïï®n¾Ûý‡__~{ñáúaÕ‘ë̽d [霵V…P.ßL@åÚÎÙIçbë<Ñ^†êuóÅá(²!Ö*y’ù§5-QG6Âj­¬¸'1.:Pm;gy¢Ý6‡ïå[Xð+GRÐD<‰zNOÔOü‚‚Íù=5Ë—zÅô¹ZíŒ×Á¶ö ,Ñ^f¦ý¢ðE>d18"¬#Í0øáÜš #ÉgN%gmãÃC,Ñn Í”Y ¸èH3Œôœ’ÅOüB:W¾0ê©ëh‚6&”r…ëÓgŒ¶­Ó±D{Ya°ÍOB¢|Èbl@X« HúÀ_ç~òv'MéFñ‚…vÁyŸCQ,Ñn*šG2(²<’Qö^ð­ç•µíøÒÁj¯À¬IÁú¨Y«`ªÎ¶6ÅGD{™btÍQa”Y Ž ›@ryÙ\¾¦ ÊÄR<”jƒÊZ®ò·®ñ:–h7Í”Y Ð2ú“ØÑŸ:oa’zñÓ%KNkæO‚^ï-¦µï&6ö,Ñ^¦˜|säå[X¸Á‘_ãIà6ïߨ‡ Œ%t¡`PÓt°Œ·ð)øÆ+Æy¢ÝT45hP>d1z@ã eøE9•Þ^úf§¥€ÑiPå­¸õ}³{­j|›%ÚÉòÍñ`”Y ŽCs »&·xTȦH”±A‰mtëÞYžh/Õªy@ƒò-*Ê/ HE-Í-øë»•Þ½ä|tÑkC> ¹ÅN«—·Y¢ÝLšƒÂ(²¶´?Ñò¸Y eÈ#Q`£M­ë,Ñ^*jTó€åCƒ4Öª¢íSdb/‡) D¥¬#EîÝE·µÞÂÇéÂMcSäˆv3ÅÐFùÅà °Õ$p³zÍ>¨cQµ5òë tÐÊÅÔ8·`‰öRQ«›4(²= Ñªh»PYI_6BMUngȦmÕúP{­jœ[°D»™bl £|ÈbpPX9:RáÖŒTø£=QÞžÁ[L»ðŸ¼ã‰öRQgš4(²< QŽ€¥Ê·[4«gœxóÞÂx¯™¿Svý¢Ù½Vµ½fÄífŠ©9(Œò-,ø%㘢3$ÍwüXHÅ Aí¬’G¢BL9>l\åf‰öRQoÛ4‹|Èbð€Æ *Úî|EVÒ—óÓùŠhæûœË[ÑëÏWè8-¬mÝAËífŠ©9(Œò!‹ÑAáDÓü´æúÝÑ*·S^>·ˆÞÄÆÞ‚%ÚKEÁ5hP¾…>huJo¡žsï§ÞBÅoâtÆ‚x S…·˜µªqÝ‚%Ú˃j £|ÈbtP8Ð"?¨õÔ鼪Üñ ¹EŒ*Æ©«©ŠrD»©¨kÐ,ò!‹ÑšTEæ6¾ä9·*D2g¡&·˜µªñ,7K´—)FÝFùÅà °ó4Íç÷=5·ø‰'ï-’ Ó•–¶*Êí¦¢¾y@ƒò!‹ÁdÝ€ƒvûg3±—ý³ $kM™ÎsnýþÙ½V5®r³D{™âî̇€)a1:(LD¹ç-ˆúÈ[$ù“:k¹Õºq-K´›ŠBó€åC£4tE”{ÖŠ¨Ÿz‹ô27]?²SsNy+¡b:oÖ*Ó¸nÁídŠVÙæ 0Ê·°à‹rØ¢ÒP@áüÀ‚¼…}4ËMÉ–Nv#å+¢®õšY–h7 íÙE>d1v8“5ÉSe›ö*/[óâ+¢ 6«A9½­½]í+Œr.˜Æ8O´—)îöæ·4Å"²MúgA¯éŸ=šY€±â™…™Ò8Û‡â‰vSÑØ:œ)ò-,ø:ÀH*JúgÁ4ìŸóÒ? Á9 žàP Ö÷Ïš©Öl[Š'ÚËwëPšš"ʇ,‡„=9I–Öl =ZµðIþ·™Ì½õ1$žh7Í”Y Ðøä¨Š6Ü@ êe-Á™ÍóqýÚV5Þ)ÈíeŠÖ·†„‹|ÈbpHiN„°‡z´÷ƒöÏB(@”Tÿ¬1ÚkÝx§ O´›Š¦æ ʇ,hòÇŒªh;$JC|A¢ò;ÐÖX[:¢*(c¢™—n55EŽh/StÐ.ò!‹±Aa ŽtD¿/· ‰òòQf)²'¹y¢½TÔ«æ ʇ,Fh4¬[øðR·€NÅáæ·â+êÖZuãºK´›)†æ 0ʇ,…ƒ"Þ"¨gÞ¦Þ"è3x ë“I¾qÝ‚%ÚKEƒiР| =x@ñA7ôA¿x ˆ&%p–䩯[LZ‘(–h7SŒÍAa”Y  z: ð§j¨àô¼EôÓ ´Æ*Êí¥¢Ñ´hùÅè TEn  îe-­bNßJÝ"˜õhsn29߯´,Ñn¦˜šƒÂ(²öŽöD¹5=Q6ÐzKé–ž(/t9Ï䯞2·DñD{©h²Í”Y ÐxG{¢ø-%•H”鉚ö•ëœZ$ÊVôDí´ªí–(žh'StùW‘1ÅHX  GzÄ2ò5ù§öD„0”,¾ß*â/`šó…ÆÙK´›’ºæ! ʇ,i"ª¤ ¯!Ex¹†!:¯Á¢¢_ i¯UëÜ,Ñ^¦¨usXå[X¨ÁaáÝ®,|xÖæh]SÚ£Ð4·ÝŒŸ5UQŽh7õÍC”YŒÒhÒð«tˆ·xõjÿ÷òêÕ7¿¸|gÍ«W—7¿üÓ7¯^]¼ùþâöÊšOß\_úîÃÕ!Ï2{•Ͼüê¿©B—-!^Ô³°>e7iäGB2¤Ù òû‹ÛÛüxʄ逕jìFX¢½lÔèæx1ʇ,FÇ‹#­.¦f»C’?Ø5݃Nm—ÓòD»©(4tP¾…¿cr M´ê–ìŽêå`wN:¢'ç¦OÂúƒÝ&™äæ¹ß–¦ÈíeŠÖ4Ç‹Q>d18^Íÿù®š¬‰¢˜·H9m>æÍí¦¢Ð< AùÅàML@U´á*ó¤^V™CРR‚²$Æõ«Ì­r*†Æ¹O´—):Û-.ò!‹ÁÑâdH<ñ×8ŸZÒp1RÂäÍTä‘ðÖxå£o RñD»)ihÒùÅà!M2Ž*iÃx²/%p)£ti˜Jz} |¯Um‡1x¢½L1¿,SÂbp¼81ÅÀšOÝ3ŽtL²ü3ÿ¿˜öi¶>ÚÍí¦¤±yPƒò!‹Áƒš¤¨ø…º• ¶áe9d³wpà8¿¿~yÖ*¿ Ûš"C´—)î646Ž| ~ÕÆ0¦h¹q™žµFŠŒcdR¥EjÃÚ8ívhœ]°D»©hjÒ |Èbì&«’§*ÚnTŽ©_ÖHA˜–Ú§T¦RZ¿Fj¯U³ –h/S ¾50\äCƒÉ޸Lünë§Ö.œ£Å‹H£œPõÂz0&é¶µnžh/%ªyHƒò-JÊ×RÒH!S>ªD£âË"©Ù_èDI%X¿H*kմݶqõ‚%ÚÍ¡90Œò!‹±a£| ¡›g'iø‹iÑ‘ô¼|záÓtw¼íüO´—Ž&Õ<¦AùÅØ1MV%šó½*Ó ˆ/î"èàé–Z£\ªp³Vµßã‰v3ÅÐFùÅØ¸°QÖSä?rŸÿíò¥M$´i2Rõnp6*Ý‘b‰vÒÓé¤\k=EùÅèaª§µýQŸÿ×çŸýéŸÿ™sŽì>Û¬ë0IÙTêF™Š>©v5F¦X¢ÝL26‰Q>d1:HL.$ÅCÚ‡]Çãdãcß‘à¾#±—KñD{)ª6Íc”YŒã$ãðíßÏô)½øŽì;²¶•1ðüX?nƒ3Zµî™b‰v3ÉÔ0FùqtÀØ“SJɯ©?žßË1 ¥LŽ))#T¹éЬm¼Ä–'ÚKMmâùÅØ!NV&OÕ´á9¥ìC_€ªàƒVV•®©äÖ×ÁwZÕx‰-O´›)¦Ö˜q‘Y Žk²ó-?¬é²=Ú55ßg.k8Cðó žh/µ®uPSä[Xð¨ÏH*JâkNêÊÚ¿ôØBÔÖÙ¹»sy+v}í^«ÚVÁy¢½LÑ©Öpq‘Y kˆ)š5ûAŽ­<Ϥ‚¼·ÈŠÀµ-‚óD»©¨kР|Èbô€ÆXª¢íöƒä7ñ²B4!è²Ä6ÖïÙkUÛ"8O´—)zÝ .ò!‹Áb£Jûb~X3ñ}¼gʨxwáÔnVSåˆvÓQß<¢AùÅàQŽêh»ocôËÀ7D¥µE’‹´~à{¯Umøx¢½LLsTåCc£ÂF2¥Ãšë{Ç¡¨(}Ϙ<´m—â‰vSQhÑ,ò!‹Á#šlPDEc»ë{™ØËõ½œ\¯’+mRÖ_ßÛkUÛR7O´—)ÛFùfpTØXÒìnìšR÷‰äÂÊÏ{;“ ¨ÆÛy¢Ýt4´hùÅ౞êhÃyoã^êÜlÔÊ’®Zc*êܳVÅÆun–h/SŒ¶=,¼È‡,Ɔ…uþßÉÚäÂ;ÖêÍ’ «c4¦q›%ÚMEcóˆå[XðCþ#©(Y¾ïùâZåù=ó’\ää§dKr¡½ªH.vZÕ¸ÎÍíeŠÉ5G…Q>d18*lÉÝäü°fÚûhÛ:ùao—™( ëÜ,Ñn*›4(²; ÉªDò_ë{[÷2ìs‹d­/›Í5뇽÷ZÕ¸ÎÍídŠ |sTåCƒ£ÂV“A(Ëü>uê<¡ûÿ±÷¯M–7š üW´ú¼¢ù ø~X35Eõ´º¥¥›Z£•ª’bY×íÍ,^42ý÷×㜠Љ“™á ?lµ¨`±€DÜÂÖp’¡—·@__±µ·ÐˆSÑbЬò1‹ÙŸ¥ŠÚÝÁ¨Jú|#cý`•DÂ[¸ýóÝË~ïŒO{ëDG™¢Ïæ 0ËÇ,&…£X¢a7å˜ûçàƒ7nŠR‰ŽRÑcC©Š²|Ìbö€e@£ßìhôø|Ø»z‹@)•,> û'ºoµÊ¸)J%:ÌÑfùVynP8HT =HÔ+ŸU¹Ë(Ñx«¹Nt”ŠS?[]åc“4¡ÈNŒbˆD…òŒDe$Ç ë[Á$ê¨UÆMQ*Ña¦ˆæ 0ËÇ,&…Sý‰ öÌçÝi¡­« Û€Þ!”íâ/r% `œ]¨DG)i æ! Ë·²Ðщ”¢TRà ½”Ÿ'ôr¦šZdE¥Ô0¡·DÆÉx× Nt˜)’9,Ìò1‹Éaá$Î]Ö‡=Û?îÅ¢ëÊzg¢ë]Q*ÑQ*Zãs]åc³‡4AÀ¥IßlÕè-âóöL dv‘|ÃöƒVYïŠR‰3Åb ³|ÌbrX8‰s4õáI¼?ót†qîŒ% õ®(•è(ÍÑ> Yåc³4$½‡«Ñ[”çqîeWTý;l•‹„ ãÜG­2î¡U‰Ž2Etæ°0ËÇ,&‡…c‘X”ÛƒEÝÝEK! StµüJૺߨӉSÓdÔlò1‹Ùƒ'Ñ(g‰Fùg4jÙE‚D£bÙFÝj•m­[':ÊÉ[Û|+ 790 ò èkI[ò H©{~q¸–~³MUT#:LEÁ:¨Ùäc“5D ºokóž/².IAÂíÖÅÝë-Ze[»Ð‰Ž2Åâ­áM>f190 ^´€ß³äÞÚøþû?pAámk:Ña*šíšU¾•ÌЈ¥áÄÒFož÷dt”"â†FÛ¿ÿã UÙÙÖ.t¢ƒL]°†7ù˜ÅäÀ0dÑG yOíý¹ö½Œ˜lk:Ña*šíšU>f1{@ƒ2 AÃ>ZÀç>ÚŒjf!î\T ið­²­]èDG™¢ö ð*³˜Y @…¼g¢îº@×ß[ä¥ožl'ºu¢ÃTÍ–YLЄœ¥ŠNt|žèΙb¦íÎE€ýÝ·Ze;Ñ­eŠ!™ƒÂ,³˜Î(JˆÕbKn‘ÉŸÁ[¤œñD·Nt˜Š’y@Ãò1‹ÉšIUÓß6o‘)={ ÅQŒ•34x‹ƒVW¹U¢£L1‚9(Ìò­,Òä p–ç,³^ðl©[dè¿ÿªwKÞx¢[':LE‹}@³ÊÇ,fh H5Üÿ‘áyÿGõÅ%Æí4ÏòIØ¿ÿãV«Œ«Ü*ÑQ¦˜Àfù˜Åä 0Êûd¨ß'kÉ-Ð÷ŸÐt>Go\åV‰ŽRQpæ Ë·ªh™< A'Ô·•´y ôÏz‡Úâ(R.û'ôŽZŒ«Ü*Ña¦˜ÍAa–YL gyü8ëǽ‰Væñ H¤”«Ü*ÑQ*šy@Ãò1‹Éš$,‘¨øŒD-mILèe߀DµÊ¸Ê­fŠh ³|ÌbrP³hfGýöæcs ïHÞúMü2uÒÇ_`pd]¹P‰ŽRRôö!Í*³˜<¤Á,`½‡«1»Àç‰î’‡ò–] ìŸè®Z1o‹Ò‰3E2‡…Y>f19,Œòœ%êç,[*‡.ÍîÙE)%o‹Ò‰ŽRQ ö!Í*³˜=¤‰bé&ÃݘžoèerÅ­raÿ ½£Vo‹Ò‰3Åb ¯ò­,hvXX®…F}-tS墜a>–¼Ùx[”Nt”Š–hа|Ìbö€¦È€¦Îç‘{žÏËÀ‡ ¦¹‘æóŽZeŒE©D‡™b1‡…Y>f19, EvEé»­Zî\ððîÞb9á’Œ'.T¢ƒT”\2hX¾•…¾ðeÍNvE9Ë®(÷ÜuèÅIIäPº¢ŽZef1{@ã%å-‘¨ðŒDÕÜ‚JN^än?uÐ*2¾ž§fŠh oò­,ôó-ó˜¢O[•»>X]æŽúW¹³# ÅøzžNtŠçíšU>f1y@ãA¤¿^OÖs x®r/×óÀ§ä¶·÷W¹oµÊ¶Ê­fŠh ¯ò1‹ÉAa¼0Å`u™»’ê¿ù#× œñõ<è(õÁ< aùV~ö€&€TQ»ÍñpÛòâ½EÌK:±åÞïßüq«U¶Unè0S$sP˜åc“ƒÂ^œ&«V—¹£§þ³ÜÙ'‡Áx­Nt”І`а|Ìbö€†d@Cv³Ü•Øó,wÆPª×”Þ"ïŸå¾Õ*ã*·Jt˜)sP˜åcsƒÂ¡X]ôö˜–=Q¥œ¡'Êç\¢ñõ<è(Ñ> Yåcs4Ëñb¡¢ú­¿¶é¼Rž{¢2úìRÓyz¢ŽZe\åV‰Ž2ÅäÌAa–YL ‡(Jˆ!t/Rÿ{HÙ—èÁøzžNt˜Š&û€f•YÌÐT­D©¢v÷ª’>ßCZr ¶Zk}+aÿ=¤£V_ÏÓ‰Ž2Eðö ð*ßÊÂM qȲæ£{6ÜÛuHm{{‹P_w6¾ž§¦¢`а|Ìbö€Æ©¢v›?*±çÍ5·ð%m}œË'aÿæ[­2®r«DG™böæ 0ËÇ,&…ƒ8LV̦ó ó»{‹@θʭ¦¢Ù< aùV0{@“e@£ï)iôøŒDÕÜ"Æ$î[Äã&˽Þâ UÆUn•è(SÄ` ³|ÌbvPXlþe׿¸·nq†Í9,Û–Á¸Ê­¦¢Ù> Yåcs4U•¢TQ»y‹Pž7s —JŸ„†y‹£VW¹U¢£L‘¢9(Ìò1‹ÉAሢ™=êwÄ[z¢"ža–;r®W¹U¢ÃTíšU>f1w@³ìÓ–*j8Ëéy–{¹Ë]ðл¹¾•Ü0Ë}Ô*ã*·Jt”)–d ¯ò1‹ÉAá˜D3{LVw¹c„þw¹s )Êž–*ª¦¢dа|Ìbö€&‰uìîrWbÏw¹«·Hè2ã!õ­Äýw¹Z•Œ«Ü*Ñ1¦ˆÎ9(Ìò­,ôéèyL19ÑÌžœÕ]îJê Óy\Šd\åV‰SÑbа|Ìbò€&9*j8—üótÞ!·(Û½Ïê-JÃtÞQ«Œ«Ü*ÑQ¦èÁfù˜ÅÜ pŒA"QauoOT g@¢"æ Á¸Ê­¥¢Çþ[]å[U´LÐÔLª¨%Ÿ‘¨CnQÿ&¼…o@¢ŽZe\åV‰3Ål ³|ÌbrP8hfO`6Ëòf¹“ ”Ѹʭ¥¢Ñ™4,³˜< IY¦¿Ùp–;åçYîœi9ƒ&6–§Ô0Ë}Ô*ã*·Jt˜)¢9(Ìò1‹ÉAáE3{ÒÇz[ê‡5eݽE(޼q•[%:JE“7hX>f1{@#Î;Ö»»ÜUIŸïrׯ!†"¼EØ—ûV«Œ«Ü*Ña¦Hæ 0ËÇ,f…ÅZ…˜t»)·(g˜ÎKph6VQè(…`Ьò1‹Ùš"ýG£·(ÏÓyo‘åt^¢†é¼ƒVeã*·Jt˜)sP˜å[YÐä pýpˆÑ§²§'ê¾=Q1º3ôD¥#{g\åV‰ŽRÑíšU>f1y@Šì‰r–=Qî¹'*ã²}âÕ®ï›z¢ŽZe\åV‰3Åb ¯ò1‹ÉAaH¢„Él–à ³ÜàjŒ«Ü*ÑQ*ŠÉ< aùV:¶3“ŠŠô÷Äž’6oð<Ë‘(F/ªÜf¹Ze\åV‰Ž2Eræ 0ËÇ,&…Á‹À ‚Ùí¼C×Mwo±tûã*·Jt˜Š&ó€†åc³4!J5¼ñy–{™åŽ${¢À7ÌrµÊ¸Ê­eŠÅ›ƒÂ,³˜H ÙtÐ(ÈÎC4®r«D‡©(Ø4«|Ìbö€e@C†HÐ3•ÉÇÀo{¢ 7 QG­2®r«D™¢wÁfù˜ÅÜ p(QÞ·ˆ{¨tt$ŠrÌh\åV‰SÑlЬò1‹¹šª•ò¾…¾¡qOTzF¢$*8â›<õ­„$jÑ*2®r«DG™¢ö ð*ßÊ"L £퉨ïWoé‰B†»ÜÙ `\åV‰SQ4hX>f1w@³84¡¢z²Þ–[ ¾Ë«Ñ—€që‰:–swz‹£VW¹U¢£L1DsP˜åc“ƒÂYž±ÌúË$*Ó6äHxXvkª¢Ña*Jæ Ë·²ÀÉšL UÔpóG.Ï›?2¦šcÉkH6µÊ¸Ê­eŠ1™ƒÂ,³˜Fy˜ õÃdM¹E:Ã,wÎà¼7®r«D‡©(Ù4«|Ìbò€“h0Îrczžå®ÞÂAJ14ÌrµÊ¸Ê­eŠ ÌAa–YÌ Ç ‰:q§¥'êpª»·(>0®r«D‡©h±hVù˜ÅäÍñ"?"Q9?#Qy i=%‘[¤$ê UÆUn•è(S„l ¯ò1‹ÙAá"Ú±ì¹Ë}onAî w¹Ñ×P³W¹U¢£T4;ó€†åc“4Xdú[ ïrúÛ/Þ[PõÛn»úŠ©á.÷¢UÉW¹U¢ÃLÍAa–oe‘'…Qž±D½àÙR·@<ÃæúÙËŒ«Ü*ÑQ*ŠÞ< aù˜Åì ©¢†›?Ÿ7d ‰¼ãZëòIhØüqÔ*ã*·Jt˜)¢9(Ìò1‹ÉAa’ë I_Ý”[Ä3tÐb.t({šª¨Ft”ŠR°hVùV~ò€†‚hHßSÒ˜[ÄçÚŒ1ð¢'Š|CíQ«Œ«Ü*Ña¦Hæ 0ËÇ,f…£ì‰Š{z¢îÝ•ãz¢°dGѸʭ¥¢%Ø4«|Ìbò€&GÙ-{¢ÒsOTÕ‡’q;/‡†ž¨£VW¹U¢ÃL±ØƒÂ«|ÌbrP˜H”I?ºÙ‚Dá… W¹U¢ƒT4¸hа|Ìbò€†H¦¿zWcnQž¯!eL)Cð"·À†kHG­2®r«DG™¢wæ 0ËÇ,&… DàF°góǽ=Q”ϰùƒ÷ÆUn•è0Mæ ËÇ,fh@lþ l¸ùƒòóæ¼ô9ä”·º¥†Í­ ÆUn•è(S ÞfùVútô<¦X¼@¢Š7›Î+þ Ha«Ü*Ña* öÍ*³˜< )¤Š"Q%<#Q5ÀÎ9á-Šk@¢ŽZe\åV‰Ž2ÅèÍAa–YÌ ËÍy׿¸·nqŽÍŹ’œq•[%:LE³y@Ãò­,ô!›‰TTnþÈ–›?òóæ¥ƒ6—œ-›?ŽZe\åV‰Ž2ÅÌAa–YÌ 'ç·föú`5Ë\8Ã,w 茫Ü*Ña*šÍ–YÌÐTUòBEƒÝ,÷rùÙ[`Ûn»úV\Ã,÷Q«Œ«Ü*ÑQ¦Ñfù˜Åä p‘g,‹>ÖÛ€DU•;Ã]î1æb\åV‰SQ´hVù˜ÅÜMÕÊ,UÔî.wUÒç»ÜËæï·+ õSÃ]î£VW¹U¢£L1'sP˜åcsƒÂɉÃdÉévSng˜Î+X€¢q•[%:LEÉ> Yåcs4U•‚TQ»é¼Jìy:/ã².k»½|¦óZ•Œ«Ü*ÑQ¦ˆ` ¯ò­,Òä pÉb­BÉ{¨»=Q$è¢@¢¨·@ç–iHÛº…Nt˜Šë€f“YÌÐTU’h¸U°à3•ÀˆÛyö#Qè|ˆ`Ü¥eŠÖ ð&³˜önkf¯OšåÆ(èú­Ýd1ð>Þ"-MCÖÞB#:JE‹³h6ùVÕ±™TT¤¿^ßSÒ–[xÿ<Ë—¡0GŒ‡ÔÜ¢ìŸå®Zµô‚Z{ è0SÌÖ ð&³˜NNœ±LN?cùغ…E¦­ß¤þB/qÄUŒ•T#:HI£sö!Í*³˜<¤q¥’Ú]æ®_ÆçËܙ²jÛY^? û/sc;ë¦,MQ%:ÌÑÞäc“ÃÂ^,V¨{æóîfYÐM[ q™Wìâ-ê¢ñ|žNt”ŠzoÒ°|ÌbòÆGÒød7ŸW‰=Ïç-]Q¼¨\ø°>¯jU&tÖÞB#:ÌÉfù˜Åì°p’]Qúõ¦ÇnŠòÞ Â°Åm‡ó;}ü…ÁÚ_hDG)iö!Í*³˜;¤©z)û¢ôb`cížû¢2F %ÎÝÞJÜßµhUu<¶}Q:Ña¦XÌa–oeA³ÃE4´ûò¤yn’ÙEÙZN¨Wv<4¾Ÿ§¥¢1š‡4,³˜;¤©ª$àb7Ï‚{žç^6 Æú÷ ‹ò´žkÌá2ÚÎ\èD‡™b1‡…Y>f19,ìs¦¨_äxl_Tq‚.nóÜ >ÜÇ[•hî-4¢£T4%ó€†å[YÄÙtBEup·‹ÂçyîeWÔ@oûç¹1dÜ&jjŠÑQ¦Îfù˜Åä°puoÿOšÐ“¹Eˆî ¹EÉÙ_DÒ‰SÑdЬò1‹Éš²TQà ½Ÿ‘¨Œ„ÕÃÖ|;ÂY–¦¨eŠÙ›ƒÂ,³˜ÅmEÄPüž¾¨x'·‚®XóÄ-]¼EŒK´çÖ‰SQ0hX>f1w@SU)JµëŠ %f1w@SU)H5œçŽô<Ï}È-!ˆOÂþyîªFeYÕhmŠ ÑQ¦HÑfùVzâ<‘)‚hg nE¢Dn‘böýs‹Ò6ŸçV‰SQ4hX>f1{@(UT]9Ðè-rzöHQ\[M1Á~o‘¶'Ê;/Ç Šª¿ÐË_”ê­±(•è0%%ûf•YLÒûˆùÁ‹ŠÏXTÆú_$®s×BnÉ„+*ÑQ¦èÁfù˜Åä°pÊ¢=å'Ís{‚0n'~I5ºø ÅøÎ…Nt˜’ó †åc“5)Ë 'º>OtgÌËNÞ ò h˜èÈ˲kSTˆŽ2ÅÍa–YL ›úùAõnßå$ámÏçám‘$óý‚*ÑQJyPÃò1‹Ùƒš”¤’ªÙP£¿ÿì/°CÑ•Ò!ŸÛé/²£¥CÛÚ¢ÃLÍ¡a–oe¡O½MdŠâèL}Ø3£w7¿bíAÿØ_ôÚG›¡xïŒñ(•è(%MÞ<¨aù˜ÅäA 8Ô€îÝÚü¸ç)½\?S‘’Ø/˜¨aJ/gïŒç.T¢ÃLÍ¡a–YÌ ;ÙåöôFÝÝHö^ø‹^×.–my„Æx”Jt”’B0jX¾•…Ÿ<¨‰NvG9Ëî(ÿÜUó‹€ ¥¡;ê¨UÆÝQ*Ña¦HæÐ0ËÇ,&‡†Až)}dëÑxTL‚pc§[zˆ™ZOê©DG)iæA ËÇ,&j²TRùnÈÏsÝÕ_øàI쌂Ô0×ÀúòªNt˜)sh˜åc“CÃDèáI·ô|ùDþ¢W~AË`ºõ•è(%ÅhÔ°|Ìbö &Š5˜í®éUbÏ×ô–­Qä)lõ ð ×ô(z0¿¦§eŠäÌ¡a–YÌ ËÓ3 Ÿžyt~‘d~Q•zåTDs¡¦¤É<¨aù˜ÅìA É † ñ((ÏxÔR¿ÈàÒ†G6àQG­2®_¨DG™bñæÐ0Ë·²p“CÃAn »6ÀrÍ Xâ¡×¼^Yš9¬/$©D‡))˜5,³˜<¨ rH°Üžw,ózÑE»@BË.Ù™_HR‰2EpÞfù˜ÅäÐp&Ñڞ˓¦»= <*q;áQ5C¤‚Ŷޭ¦¤Ù:¨Ùä[Y艔´D©¤†óÝèžç»3Æœ¢œ¿È´¾›\LèwGéDG™¢ÖÐð&³˜ÎY´¶ç¬z·ÇâQÁƒ ŒÛõ™°¬pèâ/|ˆh[ïÖ‰SÒlÔlò1‹Ùƒš,’à¬ïºjóáÙ_ QÆì·íQÇmÈ;ýEýš¦œlë:ÑQ¦¢54¼ÉÇ,&‡†1ˆÖvÔOq>6¿)HÂ[%1¤NÛ)0ï§Õ‰SR4jX>f1yPƒ!I%5œ×Ãø<¯—#bõ ôûçõ(Dƒ7Î/T¢£L1&khx“YL ç(ñ¨´ºÓ@Ô»sÚð¨êÝ#D(¶õ è0%%ó †åc“59I<*âQžñ¨UÿFâ£Ð€GاùlMQ!:ʘCÃ,ßÊB?G?)"ŠÖvÔ•>:¿±? ) Ñi¥äS2Þ7¨¦¤Å<¨aù˜ÅäA ’L‚uïÖ˜_Ðó|w®CAæyÿ|wÕ*„b\ïÖ‰Ž2Esh˜åc“Câµ½*ΓêP$á"üE§[IUÕÑxŸ¹Nt”’fgÔ°|«’êk`fRRJª.Ålô9<û 5bb^ùÜNQÕÈ9kf1yPC^5ä çõÈ?ÏëUu(·z7–ýózKɼ>w¶¦¨fŠh ³|ÌbvhØËþ(½û÷±û£¢ÜgžÃ¹Å^û̉\®NÎØ_¨DG))yó †åc“5ÙËþ(ý¸qcý"<÷Ge\v¬H<*»†þ(rä¢ñ¾Aè0S$sh˜åc“CÔE)‘ò“æ»cûÌ 8«¿Hö™SI]0®_¨DG)i æA ËÇ,&jj&•Ôp¾›ðy¾{©wÇeoþöV`ÿ|7Á£1¥fŠÅfùV494LQ„n¤ws=¶?*‹ö(JÛxwîÕU̧»u¢ƒT4»hÒ°|Ìbö&©¢†ÓÝ”ž§»kv‘B)bº›âþéî£VoÒ‰3Åb ³|Ìbv`¸4ŠôŸö±Ù…ôÅ…îÞ¢8—²uo”Nt”ŠúdÐlò­,âìMMÑ×±µy‹âž±¨ê-¼§Ã.éõ}Ó~,êV«l±(è(S ÎÞäc“ÃÂ`•îó!û3x‹è(;ÛÎ(è0MÖÍ&³˜<  €RE ‘¨Ÿ‘¨%·Häò†D…´‰ºÕ*ÛK¬:ÑQ¦½5(¼ÉÇ,æ…ÁÁÖÔ^öLv/÷ØNº‹ã:¢îîСñánè0ûˆf•YÌÑTUJRGí»ÁåçÁîeÑ`,qK.À¥ýƒÝ·Ze;¨§eŠ)X£Â›|ÌbnT\aŠAíil#ígÞ"Æ3x ŠŒÛ¢t¢ÃT4ÛG4«|Ìböˆ&¡¢QÝ=Ðè-b~öË &¹í +8 Þâ U¶enè(S„h ¯ò­,Âܨ08òÂiϘÞÉ…XÝÍ]xWªÉÛÖ¹u¢ÃtÍ#–YÌÑŒhÈnJ\yžÒËè‰äU=p¸Jï¨UÆ[u¢£L1GsX˜åcsÃÂàœÄ¢Ü,ê¾:w%u(ÊG¨ºn\çV‰SQ2hX¾•…¾úe&•P”>QØè-ü3•1R&9Ó]JuÔ*ã:·Jt”)b2G…Y>f19*ìãVD¬{fºïO.|‚3¸‹ìK Æ…n•è0%ûˆf•YLÑø$`ŸìFº+±ç‘îåÏ?†ÃñÏõ­„ý#Ý·Ze\èV‰Ž2EsX˜åc“ÃÂÞaŠúlï£O$ Âa[öé©ÓHw ±¾a4£T¢Ã”´˜Ç4,³˜=¦ñY*©š 5ú‹ŸýEõ®dQ»ð‡tn§¿Éfc0J%:ÊK6Ç…Y>f19.ìÅõð:ŠÝ–^`ÿ½rÆâŒÑ(•è Å#c«£«|Ìbö˜eL£ßçhtø<£WÝEÌž¸›sù&ìŸÑ»Õ*c4J%:ÌÑfùVyn`8Ë> îiŒº{ñ"EA˜¶À-,Bs ‹¢q#­Jt”’ó?S%eù˜ÅÜ1MÕKq–¥]kT%öÜ•ÑC¦¶¹‹’Z£â²·’ŒÓ •è0SDsd˜åc“#ÃA+«{fºï6Òú"G1Ôí;m0¯ "xóüB%:JIC0jX¾•…ð̤¤"úÆ’¶ü"Äç©îŒ±¤aË/‚o˜ê΃õ†Aè0S$sd˜åc³#ÃEtµ·ç¢ÞÞ(À(,Ñm·gê/tò´”‹Šq~¡¥¤1˜5,³˜=¨qQ*©ÝE½úe|¾¨·”/<X> û/êyçJ€dÜL{‚ê0c,Öà°y̧"F»SÙ5Ú}g‰¹÷’îÖz²4-öpÞù” 7H :JKS´Žk„€ÌcîÀ¦jS’Zjxµ»<w/ÃÝy™ÖÛ6G•†án¿x`:\µ´Fê(kg  ™ÇÜ1D'2þ¨ãÙî’‡’*­ ö½%ù˜C‚Œ½†Nu˜ž&óØfyÌÛTu RO +߇%½ï5ÈÇ´m½[¾ û+ßµ*1ÙBS'¨Ž²Æì­ab!àÊÃÍŽ“ÌûéIç/²p¡ˆ•ƒý|xãɽT‡i)ØÇ6, ó˜<¶ „RKí¶V=}Þ:X} :Õ Ü¿upQ«J%˜û ê(kDo  ™ÇäXqŒ¢ Óž‚ƽ›¤bÚê½Úkëë¦X¼ñïT‡iiîÙ¬®<`òÈ&¦(µÔ°¢á¹¢±ÌˆR ‰ÄW¡¡¢q«VÖè”Ju”5R0ÇŠ7™ÇÜX1ý(úÉc›lˆ¾Eû"tšáó‹›+ˆ¶ OP¦§Ù<¶Ùd“Ç6!©§†èTÈÏèTƘBÕŠ,¾ èÔ­ZÙî Ã=¥úºS¦h|~ïÕQZzl|4ÖÒUÀUKËÜ‘MUL¹7Äð¤R%öŒM-Uðêns}©4œTZÕÊöß ªÃ¬1Û#Å, ó˜)™gœ¸Õ‚MÁyò Œ.á;Au”–&×!²YdsG62ÏË<žó ÌBöÛ½†úVšòŒ\ÿŒ—ž :ÌÑ)f™ÇäH18qˆÜžK|w:§>ó®ÿ!¾e«ZÕxë©>ê(-oÙ°€ÌcöÈÆÔRÃ[|àŸoñeŒ±”­žQÓ¯ŸqP+klJ¥:ÌÉ)f™ÇäHññ%ðÓ.f|æ3Š;ƒÏ@G7N :JKs°lX@æ1{dC2&ÓPžOf,}SÁ¡èµÜ2cU+klJ¥:Ì‹=RÌ®²a™Çì‘M–Ùp6<Ëùù,_ƈ>óiÿY>_ê×/fÆ ²Ã챘cÅBBf29Xœ¤ÛHp_ýtõËÓÛ  ,‡ëä7–ž(Ziœ ;JS)™Ç7B•Iœ<ÀIÒu¤]Ç‹·2/^|ý·›OWïbxñâæÛW_¼~ûö”[ùê?¿úòÏúꛃkùò÷øŸ’ûæ^°«{QË>—bUÇêTI4TIgòï/?~¬pú’â&-T';ÊB‹3Ç…„Ìdr9gQxÌùáÑÏ|É,$IÊJpgíKJɺØq‚ì0MMöQÏ&!3™<êÉ9IM}h|Cõ%ÿuuýþêm %£¿8‡’‚ õ÷©æ×ŒW²Ÿ";LMÉ>”Ù$d&“‡22ÝÐÏ!7ù<“˜¸ç—jN+zN—Ë`ûçÑY­¬Ý†Nv”=XƒÉRBf27˜ì¼Û– ¹ þh·áoÝÆ¯üÉÏzòd]“8Ev˜ûèc“™Ì}T͉Ržr¡é³Ïº;TÏóYŸ¶–½¬ÙjÕd÷_gJ¡,Ù„uïí)²£Œ1€Kc”2U½§1ÆìÊÕ‡­RwŠÙ[ñ!{½‹‡^õÝx¡á)²Ã4õÐb®©·2uyÇ<šêÅBœúÐ6Çñëï>Ü|úâê Ä;Ë•éåÍr¤–ÕeÛ'‚vCK„ÅCô\ýËÔPï¡<ÊV1ƒ±­þLHæ£À<æê Ç¢»Á‚±Òyk¥k9¾õ)°Åšî¡æÓëïÚÊÛùp;áÂüKMXê_´½ƒMþeùÄ„d¼ãêÊÃLcSÝ„d>*¼3©ú$LÕ§§&.YP±¹¤£wÉÞ/Ñ•mîråQ*[ .*ËB2ŸÉC"2ƒ‡3˜ú£ýõúå»_ü¶þÃv6¿øM}ûï__]¿xñï¿|ûæêý§F‡ãáòÂLo[x³m Í­úÙî:¹‡ò0ë%ßÑzÃÆÕOø<ÖëDõ#»GT?>s8wn ì·r$õt8Á/{flÕï¡v ’6!W>aò )$jûÐ>xö8¿yùéeõ.o^]¸ùðí'ÍõÔÿõæý›ÅQüâÏ_¿ü´8¨¿…|È¿ùþܯ’ÿ—¯~U0Ò¯~íóäôÛI¿¦¼xñîãÕû¿¾yÕ蹄‹ó\”€ò¶s%‡›<¸{x.ò°O@é‚¡oB2ŸÉ1t/; üÞŽ‚»…a†®ûò•ÛwŽ!Gã‰Æ{(RÙ»[›Ìgö`K¶„G´<"OúãŸþÐêm.°Í j Âv·=û¶6ƒŒ%Ö€‰ìÛ NPeºÑõÀÔ…ÌgnLJˆJ~øïgÞ&Ý3<_ãÈÞýkë;Ï%xû&ƒ”‡©lê !™ÏÜRÕÒ"TV¯³>b!ñ7nÇè æ‹s0ŽJ:ôW¬ï°ÅÁ ƒ¸ôÜÛ§3'(²Öä{`èBHæ39†J±¡¾–GÙ6ÊÑm¨ôs0õC¤Ãe{•Õ(SYè !™ÏÜ1QÕRú‡Ð2u©ÌCæ§woß¾ùÔ ˜E‘©_Їñ)ży˜gÎZ< Ö”9Øî)¾‡ò(s…Ð3B®|üä˜y”¥ž¸·Ôs0 ’r9G Sß9ùÎ=”‡©lî­B2ŸÉƒ¢(Ë<ñeÅÃüxóªyXŽX‘ ÎSÆ #‹mô‹ùÄþ=”GYkƒzXë&$ó™Þ†Ä®¥v:˜xFÎã`|XÎÚ:û>‚”‡©,v‰‰6!W>y*–„uu{ÐÁ|ZVM6oÆ/ñò\LU@ÿ×wàÛ\LÍ@£·Þ%våQöб¦-„d>scÚ9¡hŽN´³9ú¾&žÅÅ„RR€ÐÁÅ蔇©,v‰Š6!™ÏÜQQU¬(UöáæhÅÅüõc{ “ÊåµC/ÓžbåXýl4µC/Ú¶›öÓž'(2VJ] íMHæ39¤¢’ÞO´£ #ýK:K™—÷ Dü‹Ny˜ÊR—h’ùÌE¥¦2ÿrÚëêý­&]^?AB'@²ú›Ö̱‡Êj”‡©lémB2ŸÉƒ"@”*Û´­æÕõÕë››èò6Ö¤HËJ´íä¦5Uß õè$Ó)2WïrL{r壯kšÈ\ƒ!>#CA9*w‘ºxª{‡qΔG©¬w‚¢UHæ3{PeP¤ƒÐy˜¿¼ºþÛÇO¯ß¼{³ÒØ´œ!]\æp&ñiƒËbˆ!Dס¥L§<Ìnsl{’ùLŽmÇ"[Êô8vÇTŒlZ.[Å¿gÓr Ù׈¼CÓ²Ny”Êß':b!W>nòè(ÙR¦/£~ÈÕ\ß¼¼zߺ}3¹Ë«÷S}ÕÞm¹L¤¶zý­9åÔ-S)³Vìn³Ìgrp»Æ&ÿêáš¶zF:ZD©G.£R¥²Ñ÷‰‰XHæ3yL”1I•U¹FËj*ÓŒ–e_Ї)‹’ÄmZΡÍàKÎú$Í=”‡™+õ·YHæ39¸^€Û¨Ïð´Õc0t?L³¾s‚.S1:åQ*{,±öPÙ[!™ÏäAŠ>ûúÐv¡¦jôukÏrezq«ch™''QñG×´:¦ê<\Q¶7Wò0s-}Àm’ùLnçE@¾‚üèž²Ó™6 ¹Z«¾[rk%/âAÒ¯“ìHa’¤¼UaROC1Åz´”©”‡©lê±Ìgò˜ˆ¾yõ¶uîñâ02$*E`dІ‘¥|¢W6OPe®ä»@Ú›ÌgrH›²Laô›Ó)L>O “BÍ»ô,딇©,ô ŠXHæ3yPDY¦0z§æƒ)̧wõø²5‡Á Ìar.Uòí@c–ËÐ$Ó)2×ã‚£æº É|&‡´‹Ëj‹W—Õžö0tO«rýl¥U9…Rõ¿Çr2ò0•Í‚¢UHæ3yPT|*›Z®ÍÃDçRî1w©Sd®ÁÅ.˜ö&$ó™ÓcÒõa'JîYyØAr†:}ç¹úõ(™Jy˜ÊbŸ ˆ…d>sEU±ÄÆVÒ[5Õ«ü—ús6î¿$º<œ,Bu1DÛ;È8YtèBýd:åQëSX›…\ùĹamtekÌ©vó0•ØyæaÒ2.{\‰Ñ)SYê­B2Ÿ¹Ã¢ªXIªlÓ<ÌW×7Õ´y<¬?¸0C1æÈ{±ê‹§¶y˜”–SZ]*1*åQæRX›…d>sÃÚèã–Åà Ø4ƒ>)‹I>BŸJŒJy˜Ê–>A ¹ò¡Éƒ"/Õ‡¦,æ_ýñÓëŸQë-²Êøòò€úîóæe|hÌc’§{lÁÔ)2Ù} m’ùÌ m£KY…Én&œg&&¥»ä1*åa*[:F«ÌgòÀÈL½¡i&¦ú”o›7ù/'/ÐÊ[½]lŠI‰bÉ]z–UÊ£Ì5å>Ð6 É|憶ѓÌcô¶ )óå\yLq¾Ëj2ò(•×)(Z…d>“E¾È“ÇDÎɬ۩Y÷Cæ¿_]¿¿zû/ÍõþªÝñòœL D¶är¨‰58ˆy‰Ã»X¬By˜ÅRh›…\ùè]ZóXl÷iëÃÎ{d÷Ucb<Ï=²P0ÅYŒJy”Êbè±Ìgò¸(ŠóUËšî‘ýXÿÍëïo‡û+×Ë;H–“+qۃѷ$[PYôÔa‡¿Ny˜½R\›…d>“ãÚAô€Ö‡£—w€²$)ŸiôÃRñêѶ¬R¥²ûDE,äÊ'L©²M£—‡¶åÖ˜Êå^¦ŒÂ¶Ä6Ž^’§àº e*åaæZúàÚ,$ó™׎(“ý^ûŽ$eR°„†ÈºûÉtÊ£T¶Ä>A É|&Š"Ê$Fo±~ÐüýË«—Ÿþ­9 ]^“üRí9LnÌaˆbý#ìâa4ʃÌ5:רf!™ÏäÀvMËaoÓòv2áa‚hZîêa Æt8zf®²*åa*›úE,$ó™<( ²i9´5-¿|ýÃËoÚ“˜ ìX^va%·õ“…ÆŽeõËÐe.F§<Ê^½ïkoB2ŸÉaí”ED˜ô愦 e•ž&ƒ£Ë=Êý:åa* ]¢¢MHæ3yT”0J•mºªüîæÕ§oýK¢ <¥\\Ž$K¹í”rÕ6(1wèWÖ)2Öº`Ú›+ý²×<Æ ^ôæ€ß9sg?™HaªŸ=K @>—1:åa*›û„D,$ó™<$‚ &b 4Mļ¹ºþôý§7o] „ˉ¡ä—ÕpÛ;pm#1UájÚÜã™Ny”½RzØë­ÌgrP;Éf²´·™ìž5þ˜D3YÏŽeÈ}^–Y›«¬Jy˜ÊbŸ¨ˆ…\ùè·fRY™u·5“ýõu;D–.°“Ìa(S˜ÆN2¨‰¥#—:åQÆšbH{’ùLiC–)LÞ™ÂÜ‘U%<D–Ó²š¯‹Ñ(SYì±ÌgòP¦0Ø”ÂÜ\½úîCs¯2àf0õ[æ¶CdK(ÝèaR,V,ë”G™kµ©^æz’ùLŽhg/í¬µÙ’‰q˜¶=Çaê;Ç{ õ딇©,u ŠV!™ÏäAQö(UVÍ·<sÓº2&kØï?¹wú¹ôbeL>tIµxpà¨>¦ReªúàÙ,$ó™ÏÎ䉘¼óDL<]‚©Ä¡‡wA_ÓÆ“0:åa*[úD,$ó™; ªŠ%OÄä¦1ïn~xuÝzG¹ˆóz—â`júâ}ÓüÐv!¦ª[v©K™Jy”µbîƒf³+˜ͦ VÆPع2æ¾ô…¢;Oú²ôQi~ò(•=žFï ²«Ìgji–*Û´2æÇ›ðMs†âå­‹IÞ¹´­‹Aòmëb–<ò]*ü*åaÖšûÀÙ,$ó™ÎFÜ2˜ú¿wf0w*0¢Âb­k…Ÿ0@—¥—:åQ*[|Ÿ˜ˆ…\ù¸Éc"¤ U¶)ƒ¹þX˜Ôè`.2ƒ T²øn4f0´ì‘ò= 0*åaÖŠ}Ðl’ùLŽfcÇœ0ªÇœÚ–Å`Ú6jt-ñ—ìcé‘©”©lr¾OLÄB2ŸÙc¢(c¢¤ÆD9˜o¯^~ß¾-µ!âr\NÉm5~<$’ .¦dpÔc[ŒNy˜½RH›…d>sCÚõ‡-ŸEßv¸$9LÃ=s˜ìx8wØ£S¥²>t‰Š6!™ÏäQQ QªlÓ åÍwol? SâŽZbðY|8ÚF-«¾!x×aã¥Ny˜¹–.˜ö&$ó™Ó–ûÈèÉûÈ<Òb!ÙÒžÖÏÇxôà{ì‹Ñ)RÚ»„E›Ìgò°ˆäF2jÛHöýõÛwÍW”é’E_]ŒØC Éò²eµËÞ~ò(k® ª½ ¹Zk™Õ.r[LÙ»-æN#p²r¦m1Ù××ì±Ã(ŒNy˜Ê¦>Q É|&ŠŠÜsˆ~pšÿ]ýCúîíÇÖ,æÆÐÒáH|9³_ÿvªé`¯ åQöš\\{’ùLŽkç"F×rQG×vì¼,’ò¶°ôt1±|è±L§³‡EbxÕ²‡VÆœrüê׿9¸©²p7íîâ6¾ùÝïÿã_Uß±þÊrø-v/Ám‹aªC‹aþpý懗Ÿ®íF ÙO¼œ¢<Ì,±x-…d>“ƒ×1Šl%êÛ'ÜÈ=»“+¥r.7Bä¢ùæ±S”Gékô½Âž[!™ÏäaOŒ õõ¡Te‡‰Ú²¼ s#±ä¼Ý£b³YôÊô:Ey˜YR„Z ¹òÁ¹jÌY{DãñæFÒ}ÄÎÒu|xá]ºŽOQ¥¯)ô {>ë:®|æ{0gyAìÁ®ãÇ»‘ezãÒ݈ÏÎç¼;βÁxŸÉyY†ÕÃ,5ÊÃÌ’:ÑRHæ39â6_ž¿¨•"ÉÔOI‡=ȧ(ÒWˆÂžUÈ•O˜;ìY6ÐH}}hø~G6’’¿t7£‹1oÙH ¡ÝT½ê’h”‡™eé„5¯B2ŸÉ±æäD¿LÒ‘ñnäN—t#þ\ÙH^ÎuÉF4Ê£ô5Ç^aÏ­Ìgö°G®…HúZˆF7â/=¡ª ´UØciÏF½2ßi|Šò(³D× k^…d>“cÍINÓ§] Ö½ÙÈÙ@­L9FóaÇS”‡ékêöÜ É|f{ä(}2µªÊ^ºADïbÙÈ@­E¯Ì‡OQe–ä;aÍ«Ìgn¬™R‘nDÏJìàÎæFJ‚`Þ |Šò0}…^aÏ­Ìgö°§H7¢oos#à.ÝÔl¤f¦ÒP»YôªKïFy”Y–Ð k¾råã'ÇšcXsÌ{~ï,&C%·¶—~C%Ë ¯¬È~1ñ)ÊÃô5w {V!™ÏäaOÌ¢á7âS~ÿ¿ûŸRcÅ&‡ )b#d„–ˬF]¼†Fyf:AË«ÌgrhHTÔöTÔïM>è\uJÙa—1ò0}ÅNQÎ*äÊGG…fÒ×$õÕ°¢åÒ+êäqLݼ`sE}Ñ+ûŧ(2K;AË«Ìgrh@`X à7”B Ÿ ÃZzR±Kc–Fy˜¾b¯°çVHæ3{Ø#ɾH®ÑäKǰ0…è¼ĥԌaôªKc–Fy”Y†Ô Z^…d>“C˲0Ë}koÌò‚lLwNn„bîƒa)”‡é+õ {n…d>³‡=²ô~ôF7•]qæF’ƒD"ñÔîFŽ÷R:™å$ V„^Ð2ˆs3 ŸÉ¡åœD6’õ¶œP+ÃÙ²‘œAi}U(Ó×Ò+ì¹’ùLöä„R_ ³‘ —ž?,¨Ü5æØžT½ê3m¨Qe–)÷šo…\ùèi÷DféE6’ýžlä>P+‡t.7‚ ûLj”Gé+¸^aÏ­Ìgö°'ˆl$Ãl$k›«/ÊÔld™7Ý@­ìÚ³ ¥Ï˜ˆFy˜Yæ^Xó­Ìgr¬9£t#¸ÇÜ›ÐÙÜHñ¾Ï˜ˆFy”¾fß+ì¹rå£ÏïM¤¯²%$ë-!n„.ÞT( ÖÆç|ÊÜ,näø£¿ÿþíÛÃ?û¶RüCUÍ_üÝýã÷ÿxñþ—ÿ§O˜ÿÏ_¾þñÝõ#òËåßú¸þ[Ë/þIýIþ×ßùêöEÜþLüçzlZûöÃõ»—Ÿn>]¿©f÷ýò-ºóñåëÿ¯¾åí·¿Kü;ëãÝßùÇÏ~Ëæ ù·}½ü£_,oñ±|דøêýëGøñÍëOߪ/ßÖÏJýõëÈòm•\ ü«wIãç?Óö;ç÷äÏ~°”ͬŽÿìîoý?‚ûì7³ÑñoýíöO~ö{úûáH03R(úœûÖŒ[á˜þÔµ‰ú­%•–‡‡o¥ýòt-Í ²eë®íÔî£wƽÉašiÞ„±JÇ ¦ŽˆòB5ut¶%ÂXˆÑ™" 5¸ØW˜õ~{JyKˆw_:;(m›…Fr”ÅÙ÷W¬Ò1ƒ©+ K®…ÅíªˆÝAVTÄ “3ƦFr˜jš·R¬Ò1ƒÙã”$㔋_êq™«÷¿úó×/^Ü&A_¼ûþÍ)Ÿqç¬Ì¢Äé®ÿ³ûŒôygÉ¢Ø#}FÉÙø,¦Fr”aÚ7S¬Ò1ƒ©Ë ”K ÿÉ((ÉõN ‚¥Øú ä0Õ4ï›X¥c“‡3%f©š*¤Þ0;º(g¼¼ÙQŸ])›/¨Ñì^_r°^|¦‘epö«t+ƒ¹[!–’@AšÛ³\àÎþ~ &ùîË:ëgÉQªißü°JÇ &SÈ‘PMoµG`¡u{< w–„e÷¸4ÝÙ6Éi$‡œy[Ã*3˜½E—6ƒCªÁ=¶-Î ²ËʾC:1.檩¥šö «t+ƒ¹[ R5Õ”µ©°P‰•3¾ùú¿ýþR]ÿÒžæ…ÃﱺÜâc¨é‚ø¸ÝMp5¹ ޶쬑f„h è®Ò1ƒ¹]t"W¨{r…{p#týs…ýxg¼V_!9J5Ñ›wdÞJÇ f]œ ]ÌÔZÃÛ¯^¾½úâýÛ›G§•Õ¦5vÓsÙŸJøb=¶©fd>ÿv+3˜ÇEwhUXHEZR ÑgÚkÞ²ËÆ®B!9J5)˜OøßJÇ fb(JÕTÚÆT¢¸s¥³vA§äJÙ`&<®·Û—G‡}ц¨‘fÅØ]¥c“»EcHÑ/?¶gÉ ²¤Äb¶Î¡Åv|_#9J5K´Ž[Vé˜ÁÜqKÕ!ÑÀZô(«­µÐ¹X§v)l5ˆ’Ë~ç@Ñ%Û"„FrŒçœ5Ò»J·Z ~Öa Äãx?ìq÷e>õwËÏk[„ÐHSÍd·ÜJÇ æŽ[ªy¡šzgx[æàÓÙœÃÜE'<¡ûýƒw‰m«*ÍQfèùÑ*s˜ìõ^½RÿªtÁõvÞAÈÖpÍaÚ Öñ ‹·rÐ fÒÎ,µó)-¬?÷!>{‰¥üÄš¥«i¿—¨_ ïçâ4š£ì0xóé£U<æ09Îë³( zý Ñc Q­ö¸u3õ“®_àl— «4‡i'˜Ç0«xÌaöe ƒ† MÏÕФú‡}žÁîFopÎ ÛíK”ÆÀ8qÐhŽ2ºìg¥oÅc“£»(ªÒKKô—îPUiìäŠslËÒ*Íaڙ͖U<æ0wÀ²D¶R;í ÓÏW˜ž8qðŽp[ô¸| öצƒ‹>7¹ª4GÙaŠæcG«xÌar˜7ˆ%6õAõi…—°Hº[`¶Äh]!9o“´û.{¥”»¯ÑHy¹l›M¨4‡i'YG1,s˜=Š,µÓl“FÕÏ Ü¤=жU CÚ½I#¡'0ö*ÍQ6—“5¨Ëâ1‡ÉAÝàEkù‰Éþe‚ïír *­·ñ©4‡ig±ŽWX¼•ƒ¾‰w&íD©O9Fõ3 îÞôõ·¶zi+J·{í^Ž‹±ƒPiŽ2AóÅÝ«xÌanˆ#¸ˆõCÃuêí Æ@àwï©D‡ég±`6ù˜ÅäL„$Tñoò1ûËË$h{)ìu ‹§h|ÌA':Êì(›/½dù˜Åäî±6ÏêGâÑq¢¥5F‘«wêi­o›–– kUˆŽRÑúá¶WÑ[ù˜Åì¡KýQ¯á5Vb~®:,Míàaƒ˜â![ÛY>j•m¡fŠh¿s•YÌ ífAZ}س‡)ÜñIÐÍ[ùϧNÞbiKɶ¹U':HE½óæ ËÇ,æhªVŠÝ­˜Ÿ²»õç½Lž½…±Èu®)ï÷ £un¡fŠd¾ß›å[Yèû+¦1E' àö\©½ƒ9 ë•ã*ÖÍLõÏÏשu¢£Ôëpf“YÌÎTM (x³³´ ±³¥ÙWº¸-ÃTö8¿Õ*Û­L:Ña¦Hæû¿Y>f19ü›²(¦ü¤ÍL¢>‘°ûiÑèJI‡ÖbSÕˆŽRÐí[îVùVaò`&¡èÍ>Ñ©ÛTŸHH—WŸˆÞ˜¤N°û¾è¢AÁv•«Nt˜Ùó½ß,³˜ü¹”éDcîcsˆ]±•)tBœ¢‡'_,UT%:JEc4]X>f1yèr9X.g‚çåLÄ)Ù Ë™b ÁqÒ‰Ž2ÅäÌç“X>f17ø‹)‰Áˆ”ö FÜiƒˆS×qªo­'#t¢Ã4™‡3,³˜<œI)K5\Ñ”àyEÓa‚î³M)î_Ñt«Uƈ“Jt”)‚7Y>f19ø›å˜RÖÇ”ֽ欴¤ûŠ”\ŽÆÛÀu¢Ã̃–YLÌä,ª9V'r~®NäLàRM²95T'­JÎø6©Jt”)æ`þ²|+ }$h"S”{_óÓö¾ŠêDÝ®#FðÉ:¯P‰SÐl̰|Ìbö`F®~Í®~Wèþõ퇿¼|ûæ>ü/^|ýáúÓ›÷=þß\}ûòû·Ÿö¦Ëáò¦´c(bxv»§´})ËV;*Æ‹Oe¬Ìp ™Éì±Ü ØûÕOW¿<]ð–u TZÚ­7–`ÞJ{Šì0MEó…âB•‰Þé0‘¦Êm±ðà¶Xõ¼é]]¿¿zï߾=åG¾úϯ¾üóŸ¾úæ©|ùû?üOù#ˆíeâPȇìJŒýkeÚ–evs3½Kv”™R´_ß¹IÈL&Ç•s‘XAyx¼û3‡r'G‰’òVƒŒÝJê°eV';LS±CèÃ2“ÉCŸ\’ÔÔ‡æ¼U‡òýÍÕu³;AçÏäN&Þâ Š*I¦Ýãá‹êe‡Ë5Æ6«‘e³%™¯.2“É‘èXDºrîöx—; Ì}eK·å+K~'ÿ’7Þ!rŠì0]¥‘KÈL&„’“- ®)ayÿ©º–F÷R?­™­„íÔgý^ìÎV‚b¶õ'§È²ÑàÀ|ˆ\HÈL&G«±ÅbUN!×½œRß¶Ï!ãk«§ÈSÓb>H.$d&“‡=X²TS»E¶ä.¯DB‹ls㈴»DÂ:d<8~‚ì(ãóÙ|t\H¸2Ég”'`ò†@ì?|Z6,Zûì(5 Î>”Ù$d&³‡2r, Çñlc÷h-»©ŠÛmöÏ~°ZY» ì0{ÌæKD…„Ìdrx¹æßÂÓž=·ëȯüÉÏzòd"";J¢·>6 W&nöè#%©FvÛhεvæêCM¦Ä7=†Ýßô(Àlç¿O‘fŒ‡î Kc”2Пlj„1=¼uðþâ¶죲íì4ØW_xòÎeã«Ú§ÈŽÒÔ䓽¦²„ÌDõç3iª(”Qyhù Z|xýã»/® ¼·ô@.±ô€^¬˜"Ì{a%ÂâsÊÙù`|_õÊÃ씜±þLÈ•ªpé<¦Z¢HÜK|øÖêgNåî —¤·`¯ÝçÇ·Ž ÷áÞCy”ÒB°ƒ~&$ó™<*¤Ò>t€U÷/?ýõMcm»¤py&ÕhYtâ–ÛLMs‚÷¶Òï¡<ÌV!P[]…d>j0­’D¢èHÔý3b]z¥&°áNSÇ·NOšßCy”ÒæØ'*b!W>aò¨ˆ$îEâ^§˜W®¯} Á¹Ús'ò1Ñg9‰Nqw?îAß þ·+=|ŒNy˜¹3ÌÍu’ù¨­IÓ˜+9q½©><|½éþ$& ÊQY'ÔÁÃ@ñËu:ÛšÊ=”G©,Æ.aÑ&$ó™;,ªZZ„Ê>xÍI÷0ñµwßøv/SçËó25“I[—.9yçi—Y*òÞxóî=”G™,9kHûgB2ŸÉQíB*£PÙ}õ—B¥wýåöÇ‚ÞwÈctÊÃT6õ ŒXHæ3w`TKeúñƒGz™V¬¬\&V¢²<™·Ûà#·ÌœÙ®ßCy”¹ß×B2Ÿ¹qíŒâO}؉•ùŸ{””é®Ú{tõ-§êÚ;¨¬Jy˜ÊB HÉ|抪bÉS˜¾ )»ýG_~x}õê¦ÍÏd ˆ—%ˆÈ]©õ¸&¼ —³HàŒ¯ÖÞCyÑFzÀÛBÈ•¾xn£¥ î×Ö»N²åHÁ92™ê]LÖ7Eî¡Ay˜ÊbŸ˜ˆ…d>“ÇDGOË]2Ñw>þô黫w­õ~xy¦FYÔû=P“‡IÑ¡;äBÖæªSe®1u¶7!™ÏÜÐ6ÕøâááÕ+÷§0APöâênG“¢÷%‚}½ÿåa*K]‚¢MHæ3yPtÜZÀ­aQ=ÌW×7Õ4z˜¨ÿÙ=Lp$@²²ûŒûQßÅ’Évõã=”G™k‚. ö&$ó™Ô޲Ÿ\‡‘FÔaºz˜TœïÑQv‚ò0•-}‚"’ùÌÉ:Ll«Ã¼»yy󾱡¬ò¼¼*ÌrW+AÞÞAcfQ7è1Ý‚ò(k=ž‰éb­ ¦û#èçrç±V‚@ÂÆïßXå¸-îtåøÎ!¦˜¨H¦S¥²Ùõ‰‰XHæ3yLäƒÄuõAчÌ?\ÚZ~ÐVœLŒ}]Š“¡èH–ú½ß½™xU¹¼Äá],V¡<ÌbsX{’ùLk§$BÂ9WNvˆyΑÅL±G£R¥²Çþò*» ¹òq“ÇEG‚š®£üXÿÍëïo>5º˜—w ¥æ1Ù‘_ŽÝRn}Áò0{Å>¸6 É|&ǵ“@ÙáV–U±ÿ°Kñ Åþ„!Ô|±Ã`ŒNy”Ê’ï±Ìgö¨ÈɨHŸ<{ÈżºþÛÇO­+Ó‹DÊBàQ Z m¦þVŒÆ«òï¡<Ì\©®ÍB2ŸÉqí$n;ì½íx'‰ÙF/+1eÇFS0Ö ¼G£R¥²%ô ŠXHæ3yPâÄc}hJb^¾þáåÇ7Í..ñÊcŠõË&’˜ýW WUMC7÷ßCy˜½–.Èö&$ó™Ù†$¶”AÚ¹¥ìNµ_$1gÙR†ct¹G1F§“‡D$k0ÔVƒyóî]³¡K¬ÀDŸSÙ*0ÔXÉÙ/¿»Gþ¢Re¬˜ºÀÙ›Ìgr8ŠìQ.;{”ï,Œ³üÙm=Ê=gùë;/9„þE¥“D%'©²MèØ÷7½kô//«þå0Ϻ¾hCÇÈgt]ŽŽé”GëQG;ë*$ó™Ê.^ì,úÎÕ'(‡­ËÆuõ/¹ª¾ëP}Ñ)RÙúƒô ‰XHæ3{HdH¤÷Ï<8ÄÿñMýqn^}wõîe«› xÆnäõ¸–Ã0Ù•Kû.²S”‡Ù,v@´¥ÌgvDe.Âüòt ™ð1Dp³¼pŠHöþS”Géëqm}]…d>“‡ED²CU`N¹?~õëßüþ?~'K+¢'Å_׈e¿(·”Vjí×$Ÿ¢<Ì ©N-…\ùàÜ8õÒÇöñð0øuò$Y:C]åðÂsû[b§(Ò×:E9«Ìgî(§*V’úúòuŸ×8$‚2ø»`m·ñÍï~ÿÿªúŽõWv8Ão1ò")-qoÚ^I×®ßüðòÓÕcÝHÕ«l^¡?Ey˜YR@Z É|椋CéFôæÒnïs#x67‚ í$OQ¥¯1ö {n…\ùèRfÒWéFôÍn„žÝ„’7«¸ÜîF½2/•œ¢<Ì,KÜY É|æÆ‹óQ˜¥xÔþž:‰dƒ¿‹tr#D©†¥P¥¯)ö {n…d>³‡=¥¾>4g¿ÇˆÒÞ…º‘úU‡së+qÐìF(”d~˜ååQf ®´|+$ó™Z.Þ 7âÝ7r¨å½?W6RyEó…`§(Ó×Ô+ì¹’ùLöx‡R_ ݈÷Ïn¤º”Snäfq#Çýý÷oßþÙ·•âªjþâïî¿ø»ÿÇ‹÷¿ü?}^b꫟>¾ýp}uýEý’ürùW+óÿõ÷_¾º•ýöÇà?ÊceèÛ×ï^~ºùtý¦ZÚÿõËÿµ¨ËÇ—¯ÿ¿úb·ßzüñï¬wçÿ?û-›óãßöõò~±¼¸Çò]¿GLâ«÷¯EàÇ7¯?}wøv¾|[¿$õׯ7"ËçTr9¼yþÕ»¤ñóŸiûLßó{òg¿GÇfIÇv÷·þÁ}ö›ÙÎø·þvû'?û½‹Úüý$DÛƒ= Å!_ðT?[æûPn…cúS¹ ǽ}ËÃý}[¤QN6]TJ¾{cŸõõÚžÉQšIæûqWé˜ÁÔ¹é¢CN¨¦Þ ÒT,ÄðLA…Oì %¬0M@ì|ã(®‹ƒÙb™Éag¾ºd•ŽLvVÈøñ°§îq„Ý;ðür¿Ìv8U#9J5‹ù*ÛU:f0yœBè…j¢U³ÝBë›íJ¡°áa»›í|ÉÙxÄT#9ÌàÌ׌¬Ò1ƒ©û”jŒÂà ¨×’ˆûì|Að¡ÛÄ@#9H5½3ß:»JÇ &S €TMu›F“/8Lâ]˜/>…¸­‡rXŒºË„\‰Ø§4’à Î|%È*ÝÊ`î] 5>$‚/}Yèc›ãd^sw_€.ס4’£TÓ›/ˆ]¥c“‡)ƒT͇NíÈ b¹8_°&õ1 »ß}Ã,V:Æ‹Í4’à Î|Ç*3˜•ÍN`DõaFäÝÉ·JJ€DZÜbôˆ¶Î@#9J7ƒù6×Uº•ÁÜk\òB7Ÿ}^1Ȳ¿sÂ×ÿí÷ü“êø—ö4"~‘¨¶ò¶×7;‰=²¡-–¼m=Y#9Ê£ùŽU:f07R›]ˆÂÞ޵{€£ì¢ï,o½AY!9L5í·±ÞJÇ f]‚Œ]ô5ßî´üðêåÛ«/Þ¿½yt.Qu7]\.K(Î _á÷_¬'ù’£ì1Ù/Ò¸•ŽÌ äfW6\){·Wº›Kä_ R°”{õ9gHÖÛï’¦›v«¥c“‡1Þ©›­ÀÒ¥` ± Y‚ ñ)DÜ.-–¿Y*·Û+ -N#9ÊâÀ|AFë> &‡rK‘­¨eO+êî# ,9%ø²u%x0^^¬‘¦šæ‹PWé˜ÁìŠs"qЧÇ%w®VÔiç[`Y&Ñ™úHT©P´¾©‘eÙ|íÅ*ÝÊ`î}5h™*ä=©ÂTI8Ÿswç@h= ©‘¦šæëKWé˜ÁÜqKÕ!™)è?mÎÁçòì09Þèµ|ÜnçP³7´­9¨4GÙ š¯³`ñ˜ÃäЮ'éÊÓ $é JwqœË²MTšÃÔÓ|W)‹·r˜{Ké¢FÒGè[Œ}D9›˜¸2½I³¨6×ãît‡i-Û$B¥9ÊÉ|]‹ÇæFu¶Å*ËÃÓ«AWnVé´ZÅS4¿a¢Ò¦ŸæËHY<æ0w³œñ’úi¶HeÑг-R™ØO,_+XžÜ¥rŸ8(•ñì›Fs”0„^Åc“¾¡ˆN‘Pöt¹Þ…›âF7:ÑåÚéüò `‹8©4‡é§ù¶Q9ÌÇT=®Ñ5]¿zÿ«?ýâEý‘¾ÿøòã›åÄÕï¾sʧ(•ì趮؋©d»ã¶Ù<j˜vŒæTšƒ 4÷%ÛNOߊÇ&…ƒ¬W„]õŠ{ViTJÝGæür•"ÃQÍQÚéÍ·Œ²xÌaöðF–,‚eÉ"œ­d1KˆÇ‹Ëlû»››ŽÛ!Œ±'æ0£Cs xoå'Ç€c‘1[Ù³Qãn‰ÂIºÝWjø‚ÎΩ4G©gðöË­xÌaòˆ%êi¶U#'wy[5\ .º­liÿV }6ž”Si³9´†{Y<æ07Ü›c0SLO‚™‚ ÊÔ©Q_u!ãb„Js”vÆ`¾õeoåàgX@,ú °Ç‚LŸŽÄ[@&¸8‰ê§1¸´•³cÜ 2WÐ_žRi3P²FY<æ09 œâ61QöLLÜ›Q¤Ô}{w ‡!Щ4G©g æÑÍ*s˜<ºIILM$ý4s[F‘ðÒ2Šå€ÚêGýÚç|>®ï0µ9…æ0›+ö«1ó¶ñäÀavd×ì.gíîYÕW)a€ŽÐ¶î Ò¥Í–U<æ0yÀän˜ ï†iòaÙSxYS/¶õUÓ÷»=B‚ñêVæ(›ËÎ|Aæ*s˜×… ¢0Ðw;7ìc‚@Ý=Bˆ!F¨4‡ig2WVñ˜Ãäñ „$µÓìŽy%ÏuÇ|—è}ÚŽüdða¿K(³m%Z¥9ÊèЛ»«x+ýŒÚ™c¼«xÌarŒ7ËÔ¬ >z×·tèú;‰úÑðÖÉ„Fs˜~’y³ŠÇfbr–ú©âcmN" Hôré$û†v: „ÞqÒhŽ2Â㹩®â­Òä°/Êé8Ü5wïNW„î§Fë»ÎÙzÚ0+ÅàQ/P oì4š£´3{ó€e9L°ä€R;Ÿr âs£r÷ŸÜ#8L²äàa¯GˆÎ§ ¶c*Ía6GÖ.‹Ç&‡tIö.Ѯޥ{“*Ý×gÔwMh<§Ò¥ž¬9L°l]¢'µ.}ÈõEyh÷úŒèÈùb[„Vi³¹bß²x+š¿%ë3H¿[Ô°>ƒ ûúŒúª)’muA¥9J;)Ú,·â1‡ÙHR;Ÿ²>ãs@Ù_žGHÁ£8íCi÷öŒ¸LIÛz³Js˜Ík¨–Åc“Cµ% ›+úaìG' (è¦m=vr Óá\„©z*4G©gIæË*ÞÊA_³;“zŠBWÑÁ¹µûÓwW﮾o¹ WÒÖbw!K»19<"ë;8Tþ÷¹àýá“¥}j4ÙgrÎ×eñ˜Ãä¸.ɪíª:Ü}d£°{à!‚±÷ÐhÓÎdܬâ1‡Éƒ’UzRÕágíJ$Ê—;ømUòû¯OÇe¸³-L«4G¡÷æ8ï*s˜çE¶ŽA4”!*©î½J1”è­A'æ0õûæV<æ0wSÕ(Hõ|¨WéÅ‹ú£ýõúå»ß¼üôòÅ‹óêúÃ͇o?‰ÌãË—¯¾»ªõÃÕõMõ7_„/^ÿåÑhUý!.°É)CL!‰Æî&§X Äh\ÒÖhŽ2ÖÌâU<æ09B\H¢U´­º¯~QÄ.Í^®$¡ñúo•æ0íÌæ‘Î*s˜;Ò© )Á*}âאַ¤þÊpè?¿+îÜ\ÞîG®’CBãR¸Fs”±ÆhŽ,¯â­ôá iŒÊ´ä‰#² ,†(tZ˜/‡ª¨Js˜Š¢u´Ãâ1‡¹£ªH251\X‰m àÌðf߃ýe[ WiŽ2­1d9LŽ!CA݉ûH'üDþ¹›Èâ¬uv›—ÈîZ8pÁ¿RiÓO²ŽcX¼•ÎÇäãQ0~°s•Øó¦ØŒþ0k!®•ý~â¨T¶•p•æ(;„d#³xÌarÙ— šªFÐךBï]Ûù;•æ0í$ë(†ÅcsG1U!E¶ô(¦¥µ¶Òº8„‰B•:o•oô´aš~&c ÒesÇ5ˆ¶6—¶ÑÃÜp0zá`Ï¢{ӡϱ·G ªàÖÃ*ÍaÚY¬ã9̯@Ú™Ÿr†èsàs>“G˜[:ôË:·½’„{!y2v*ÍQ&ˆÙßeñ˜ÃäønˆÂCzÒq ™2¤îóÙ¡ Äh½ìO%:J?ÉÙ¯”Yåc“G0!E© f#ÚàâF´kÖàK‡whßjñn?•è0³Có%›,ßÊB߀?ÙyïEhæ÷\´¾³Ê©IwtK§’Ct¾þÇx¿ŸNt”ŠßaµÌ­|ÌbòÐÅ{™Ûú‡ÎZß7—wóÝÕÛ·1ìŸËC6lôBæòhÙDGI¤n÷ ìÛEFÆS*Ña&Šæ³O,³˜òrî"îš»¸/»ˆg»p5J¶>J¤¤ pìo·UÐU¾•…Ÿ<̉rò"ZN^ü=ÿú·.úêW¿ _¥ßæ¯~Uþ%~ù«¸ ST~ýÛTâ?¾_üpuí~rŸÿ•v kÄ ÖHɇŒA|iökµÕx·ˆJt˜‰“ùlËÇ,&™ƒ˜×¨{Šâ÷•@Âæ5fW¬çÃU¢£Ôû i•YL$’uqË‘¿ÿæ7¿ô¿ ¿ú—¯JõA!ÿæWTÙýÊÿºü:–/ãoóëpÊù]>(\â”GÍ:CÉÛ;h˜ò8nï³Îƒ4¢ÃL¼Ø¯]åc“ƒØQzÄ]ƒ÷æAýOe,ï:;ãÍè:ÑQ ¢}´ÊÇ,&’¢óˆ–cñlcó8†EìY˜CrBË|ˆõvtè(»‹®Ã¶Ñ[ù˜Åäv Û2Üú°gIR8×6\ëìD#:LCS‡ÐåV>f1yè’B’úÐBÜ3ì&IÚb¶r‚èIN &¿“®+1óåêÑQöš¼=¢½Ê·²ps#Ú€°õËÀá0÷£=Jº³ ]¹¿ºÛ6Ýes1Z¯ÓÕˆSQ0zX>f1wÐSµ¥ŠÚ­D¬Jz¶•ˆ3 æèýæ, †Ä»Ço—ˆS*ÑQ¦¾Óæu'XLŽ=Ë›hxâ&Z0•#tO?ó=h|ŸI%:LA³ýîõU¾•ÌÎTM}ˆ9ª}ˆMí¿9ÒÅeÞ%çü†Ke_vgB oŒK©DG™]æx0ËÇ,&ǃåF<±Ñá±Es(‚®ßšî—À¯‹g.-=‰¶*ª¦¢Ù~¯ú*³˜=t9\>àÕµ•,²ÏYÄüQÚ–ŽÔ<-íÏ"ŽZe}C#:Ê1ÚoW_åc“cÄ¥·À=ÞâNbXäpüe=àÔkX$ÄÌ Ü*Ña*ŠöÖWù˜Åì Jo¡/Ôjôt6o1ë¬y‚€|qny%¹ÅUDLHÖ®B#:ÊçíðV>f17ö‹( Ü•XÜ-x{A×+Ӽ枉¬«*ÑaJöÁÌ*³˜<˜A™W e^çË+fõ}‘Q¹)©HÉEëžY•è(;,`Žü²|+‹49ò zfAߣòØ tQš€|†“M©þežRhD‡)h±eVù˜Åä¡ ä ôáÙAeþüÝÍOïÞæëeðüñ¥ È—7ïG>,Õ ñuØßRÀY·ÔªD™ev` ¯ò1‹ÉqaDѰˆú„ücÁ(™`PèŸ`€+ŒKÚ*ÑQ ê}`³Ê·*h™<°A9 „ú0Pc‚Apá …eþSÌäaÎ ÔTͺSV%:̳=$¼ÊÇ,&‡„1ŠýA­vãbê¾wy×ÌÂjDG)hp"™[ù˜Å쑌Ü͉únΦÞ'LçZ;OËêÃí$bؽ7†s Æ CT¢ÃÌíàU>f19LNôÄ’{¸'ö«Ÿ®—CW–$X»†œ¼õ½%è(Þ>vYåc“Ç.$×s’¾žó®á«ÿüêË?ÿé«o”\‚üÖ›ûæ7AŪ.o7Á±”†t]HÙº²­f’d¯ò1‹Ùá`/p§ƒ=Ò'|„3àN¸\².lkDG)èqŠÙZAò1‹Éãšã¼«ÕÃ{¦îÙ—ûþõÞÞÜ|hؘ a ‚.dc.æ â†JÛ¿)jA·œ³®zkD‡i±‡WùV498LYœ; ¼g|û(åAÐE1¾ ½ü…’¬7‚¨DG©(Dû@g•YLèP–ùq~h|û>?òãÍ«ïß|ñêã^B˜.·8ŒÅ¹­É–öûŠ¢u\#:Ì@‹=n¼ÊÇ,&Ç)Š@ïDGðc;§’ +PãÔ˃”œ²3Þº®¥ 9Ù9«|+‹8{“‚TÐÖmƒÿñû_ùåW_- oQá‚G÷"BsÞ÷ß ¿Õ*ëb‡Ft”);½;˜" “É„)xÒèž(‚—¼ct+‚/—‹u¶¡¦ É>˜Yåc“3²TЧŒc|^/â†ñ¥ÁɧãæJJ»sˆè–;DÆÕ •è(³#o³|Ìbr°¸xCÿ$Jú…à»û…¸ÁŽÆÓ*Ña æ ËÇ,f\f1yà’äøOÒÇôêÄ¿¾ýð——oßüïÃWþÅ‹¯?\zóþ¯Çÿñ›«o_~ÿöÓïßÞ<Þ“$º¼Eå>GçËv—/åý‹Ê«Î%²®t«Dj5(s˜å[Y„¹A`r¸µ0Ö‡=ÆïVº%Ye8ÖÞ“ã C%:LAÑ<Ôaù˜ÅÜ¡NÕ$ ú”ûâß½ª.ã‡7¯¯®oöwL‘£‹»1Ž1„ú_y{yÿñ콋ÖÕn•è(3õÑ fù˜ÅÜ19±Â¼>ìYa~§Ú ‚lTÚ­ýˆŽ¬÷„¨D‡)(Ù:«|+ }™ßD e óà óûüȯÞâ˫巵8±óüR Áaæövžg@h<®e§!™#Ê,³˜Q&ŸE¼çóžyð;¥ð(ÈâVgŒÝ ÕO¢q)\%:LA©C¤s+³˜<Òñ¹ŧ̃>ìW‰)­}µ8¤¦£ò¶™°j†˜lÏTÉ'ëž)•è(;Œ`1¯ò1‹¹!æe™°Ã`…\ùpä*$óˆFt˜‚ûHf•YÌÉÉ„§ Wï>¶$>^b…è=Iâ+ÈÅ‘µÿЈŽ2Ïc=ÈÖ—‘)ÇbÝu«¥¢àìCœU>f1yˆã\’*úP}Gªá¼¿ôT#AM5i›ä;.SÞ›jPɇ‹à¶v¨f‡h¯ò­,òäØq×¼ëÞ6Ü{QÕLWéL1vXÄdœj¨DG)höæ± ËÇ,&e‚¸å]ìnyW}¾å½\áŸ6_A¡å–÷Q«ŒG6T¢ÃLÍáa–YL‡…)êí_¾ÙêE^¢Ø¶à;%©†œ!7UéDG))ë€f“oeágh¢È}ƒ~زÑ_,œ/>±ØV­.¯ä°ñkŸ³HÎ;rѶحf‡d oò1‹É!â@"Á?Qù|lb!º¦BQ€_kGá·½’¡¥ õÄ^Aoåc³G3DBAõ[P¬a|suCC#”Ë[UHK»±L8p÷ªÂäB,ÖW¿u¢Ã,´XcÄ›|ÌbrŒ88QnOüNãm$Iw«ƒ/ ‹}œæXß·±ŠjDG©h‰öQÎ*³˜=Êq Uô¡BøžlÇgtªþwLD`­y—Øp´Ê:áЈ2Å¥ÆÛǃ`19P£H8¢>T²¡Å´Ùa§Áqp± 7¾¶¤¦ É:œÙäc“‡3Qlͬjµ#áøí‡÷Ÿ–¼ãSýé_}ùòÕwW_¼~ùé>gòÙœxe¦œ…ù'O3Ïó–fİ;͸U1Û4C':Ê.½·FŒ7ùVú…ûiìPÜÕ¨{G<í8ÃGrѶ¤¡¦ `Ùlò1‹¹#›ª“$ôÁ»ö •ÖÅù…šWÕ¼u[] ¸ÿRFÕ åÈœíþè(³;vŒÍîV>f19@ IÀOöÀO÷U0@¬îTÁ¨ïš¢7î¡Õ‰SÐl¸¬ò­,ô]°3)(H}ÊÆ_ë¿òýO  €ËÄ 2oBZÞAÜ=ˆBU0ÛÕ!:ÑQzL¸l-t•YLƒ ÂBõUí ˜øîËÏ뻎9%ÛC:Ña šícœU>f1{Œã²TP³åçUE/oùy r¥T*»—ŸW *k:ÑQf—¢=¼ÊÇ,&‡‚¡ÈÔ¢<)µˆ’¬(l÷ò ¹þZ§Ña ŠöË*³˜=p)2µ(;R‹ß¼¿ù©þýå»×9}óîÍ«ë7¾ýôÅÇá‹W_|ñ«WÞºþðöæ‹úƒ}øþúÕÕÍ7¹rüKN>¥W¯¾õ¯¿ý&á¾ÀìÜËefø¦æ)ßß|ã]þ¶üåªøËò—t_¼¨¶ðêÓÛ¦æ«ì./uYú·Å}jH]êŸU ¶ƒ:ÑQ_Hö ó*³˜t¦,«•y׿%;99˜Å‘¿N“õe瘂u=]#:LCÉ>ˆZåc“QYù«­Gþ”Þ«, Ú ôXÎb˜ôÈ þÀaH”­ëçÑQv˜Á†^å[Y¤Éaè$×X'}õcÛt…£H¤ ÖŽ㵆:Ña ZìC™U>f1y(“P¬5<Ṵ̈r‰.~­a‚XÒvÙ‰RÞ¿Ö°ªTqÉø ‡Nt”"؃ͫ|Ìbr°½p蟴ÿ¶²as¥—£ €![gÑQ JÎ>’Yå[´LÉ Žƒ¡£Àðì(’wA8 t-Ž‚ŠñÅ è0;Ìöèó*³˜}FÙØ‚zcË£±'1ø‡°yŠNsõeYÔ‰ŽÒÐâìC™U>f1{(“¤§KOï)¢¯ Q¶"ÆOQ‚OÆ'5t¢Ãìí1àU>f1;,oüå§ÝøIö =º%ù¶â:ÑA Zœ·eVù˜Åä¡L–àh~Ò¿«Ÿ>¾ýp}uýíuýw[êÝxå|„,Zuóþ+Uçjlb|sC':ÌPÉ$^åc“ƒÄäÅžQò{®üÝÍ9D¯.‰«n½º¥,G­5T!:JC}èëÜÊÇ,&uH^…!ý*L[ÎAΔsÌãRÄê·Í"ävŸíï €ñÚ[è0»+æ¨0Ë·² ÙQaP¨û±Ç–-„c@Q;ìåê»®q}[%:JAC4]X>f1y肤‚6B!«jÇP3†š¦‰•Sˆn¿c𞯩ÝiD‡Ù]1Y>f19LYØÝ‰¢JSÊ€ýÇû¼9 1ú¤¥¡1Ù‡.«|+‹8yèr,&òƒÝxáå÷-ž ˆû{ûÇûü2êë×*ÑQf—œ9èËò1‹ÉAß…Ù%ý#ñØû{Â/¤”Îàh¹3i® w‰SÐÔ!r¹•YL¹¤$Žd$}qbcGl:בŒyCHÁQÚf%R ýŽ!¤âÁ¸\­ewàÍ!\–YLá9V[ô±ÚýPRq.öw 8ÐZA¢Ãì#—U>f1yäRÊÖ×TÕ꡾¦/þ|su}óâŧ«›OoÞÿõÅ‹_üø›—Ÿ^¾xñ»¯^¾}ñâß×pQÙþÓÕ»®_^ÿíÿ¶Ð|õé¿­4ë¯|ù¡þƒ÷Ÿ¾ø·¯àÅ‹ú¯_ýôТÛÏÝO9\’½0÷Sã ä»ËŸ!á~÷}ÊÆwÁu¢£¬;{ x•YLW)Ü<©[ÊI²¥¿û‰Ñ;s¼J#:LA³}|´ÊÇ,f@ÆGðp·ÔI÷óÇ/ßþ‰æ€¾üðá¿Þ,þ¦ÁÅPÉç:Ì1‹‰!SH[UIûÛ¨|¤ãü‡­+DGY0F{Äy•oe¡_]È‚h£*nOÕapéb|ÿ.*ŸB1_¦®¦ h­ò1‹Ùc /c ÿPU[†óßÞÜ|ªvü?ššú^^k–ÇêpDÓ.•†Ö¬”³u^#:ʘ)ÚãØ«|Ìbn»8BWÐos/žVÎám ï×U‰SP²‡VùV8w8T5É Õ}vò6ÿþõòè|Xþê_Ç¿ÇF`­\žªŸ¿À IË;À?´4ë‚¿Ft”™—d›¯ò1‹¹aóâ 3×ï íÖ*¥þ-Â!…d>¯®¦ d(±|Ìbö@ ‚TЧ´ÖVimØï¥4‚%p³ð i‡pÕ "ëW*Ñ1fWó70dzY>f17ž]|ù‰OÊO’ +îy¦n~!ùMZ•è0-æ ËÇ,&\¼¸qVìf +±s% Óî1,ˆ)m¯$ˆüá±{LB*)Zo¼R‰Ž²CŸÍQi–YLŽJ''W”zµïæ„£€ÓŽ¢RRº1­,5fãÆ0•è( Î>’YåcsG2U“¢TP0ìîÂ…ˆTJ_ßà(–=“Öv¨f‡h(³|+ }Fj;,QÔ×ëƒÕš’ÏP`ÉY/ÑU‰ŽÒÐèíC™U>f1w(S5I¤ñÁû㡦(Já—59‰Dh(…‡ Yï¯R‰3;´GxWù˜ÅäoÈ¢ô.œ†RxÀ3” r(`^‚ЈŽRÐúŸ z”oeá'\© v[J*±ËÛRâRÍ( óo¨Aà­s1µ;è0»#{ˆ…G>°˜â â :ÄûØÚt”dûßš]½AÖ ª¥ ì#—U>f1{ä"¶ýׇ‡†>ö88רƬÐRðép{}%QLn<Z¢¥{̺¡f‡Åâ]åcsC¼%Šá«úð¤átá(bŽýÅÍ3è(ÍÑ>’Yåc“G2ÄpzÌvG7*±‹?ºá1'ÙìSÃÑ@„`½ÅD%:ÊÑÙ#¼«|Ìbr„76¹ðƒ^>vÆOf!œÁQÔ¬Ùz!®Jt˜‚¦‘Ì­|ÌbòH&x‰…ê[3Š tÞ]–£ ¸46‰Œâ°ðo¯£(õ¾•è(;$où®ò­,ÜäoJòMúÇ£‹ÕÂS$pý=EÉ`> ®¦¡`ʬò1‹ÉC™”²ÔЧ,Èý™§HâÖä¥z JåP7]_ILû=Etž²õÚ•è(;,Þfù˜Åäp§ÁKzÚipŸ]q|y]\EuÊõç7N*T¢ÃT4›3,ßÊffÄqðªW†èSz>ƒ/ÂU´?¨”õΕè ;ô.˜£À,³˜N(]…~QóÑIEtis¡›§(!Zß|U‰ÓÐÜ!˜¹•YÌÌ ôdé)èâ= ÂSäOáSÉÖ[9T¢£ìÐGs˜åc“ÃÀ‘ Ë“¶rˆéëX#´v>g‡Ö)…Ft˜‚¢}(³ÊÇ,&eb RA [bë.ÜQdŠD$¾®ÁQ!´U¢£ì0$s˜åc“£Àà„£}ÀêÑè“ ë7Gá{9Šš8Gë5‚*Ña Jö‘Ì*³˜<’¤‚: ð—î(0%Ú.ׯA“£ ‡Ù¸ ­e‡ì1àU¾•…^€›È£tº[k™¾†ÔÊ®¾ìã¥c ½Kt˜†–¡Ì­|ÌböPF¶\€ÞrÑ4} éýÅêJæ¿È.Æ”£³®_kDG™]{Èw•YLùzÜjÖ5œÜñµR¢þ~!æÉ:ƒÐˆŽRÐc@g¬ ·ò­ Z&\<&© ª9}¶ˆ¼þh½~ùî¸|\=¢ôòÕwË ¥W?\]ßTpóEøâõ_ïPüR¹0‡âpÙb"6Vßít(ÉWÖUnè0{ÍöÐð*³˜>^ƒã‡=3÷fC²4öDãÖY•è( ÍÎ>äYåc“‡ûTwS=ûÉ}þ—ßå„2ÂÅ9¡¯» z­2ä'„xhíµ5q…è0G{Øy•YL;g¹¾n§à‡§ÁZÂS ØôÖÍSTÇÉxÉ”Jt”†–hʬò1‹ÉC”§QŸ_oó¿;ÄC–—½ ƆÝ!1c<¬¾µµC…è0;,öðò*³˜^F/°§Ã©œvì)ˆÝ!(6ø„^ËC–ÓÔÁ}R‰RÑp¼yiª¢,ßÊ"ÎÌ>a0DŸ0\:ú„õ`]¹èЧ£J£O*ÑQvè9 Ìò1‹ÉQ`Dé*Ðì&Rÿ›HËÞÕd}I%:LC“y0Ãò1‹Ùƒ’ž‚ìn"!]ÞM$Ln¼ÿ&R 9’õM$•è(³;.i56»[ù˜Åä¨/Ðv´²>¨G+»¨VÎõ¥sÑÜ/ÔÈz£¹Jt˜‚‚}ä²ÊÇ,&\€P*¨¹4Îõ-Óä—AÐÀ‰EµpX´7ƒˆ¡Äd 6©DGÙa æ /ËÇ,&})ˆ©)Ò7`5Ô¯)ºþŽ"Ƙ¬7š«D‡)h¶dVù˜Åä‘ …,ÔpO-Å‹ßS»BÉnÛB¾aOmU§DÖÇôT¢£ì0E{Èw•oe¡köDvÒQèáeCG,ås8ŠR#"ã© •è0ő̭|ÌböH¤£Ðwê6:Š|ñŽ¢¾ƒPDFA©ÅQT_“¬é©DGÙáqK†­®ò1‹¹_Š´5:Õ‡=N鎣@A·ˆF'ìå*ªf£9ø¤¦¢dˬò­,pîX†äzL:±Ø¤ÉUTbgëtúú¿ýþÒ}ÅúK{œÅá÷X5;eWЇí­`C³ÓQ«¬ñ'è(SÌÉ^åc“ãÀEN{—]ÓÞ÷áOûwÅÖwMX¬ñ'è0%ûpf•YÌÎT]±åÁaïiEÁ‹ïŠ…j§9mí Ž¸`½D%:ÊëÛ²¶C–YLŽ9‘]vMdßWÑ.g˜È®ï:Eë­ *Ña ZÌ#–YÌÉȉìb9‘].~"½ >fá(Z&²Á{@ëÕ*ÑQvHÙfù˜Åä8p«„–=ŽâdF±tݹ38 ï YO¨DG)hqö‘Ì*³˜9’9hÒê(VŽâ@ìÒ…Ç &뀚ùh½ºC%:ÌÑfùVyn¸¹º£ìZÝqgs­Ì(ΰº£¾kHÖ«;T¢ƒ4:ß!’¹•YÌÉÈÕ'7f¿º]À˜ó¶¶´¬î€2Y¯îP‰³C4‡€Y>f13¼„Uщ€M¿ý·z:P:ƒ£àŠõæ•è(õÁ>’Yå[Yø™#™ƒ&%© VŽb!–.ÞQx8®­¯$´8Šª§Ñzs‡Jt˜’=¼ÊÇ,&‡€‰Än¢=ºážûÜTúßçªÑ9ô¤¥ !ØG2«|ÌbæHæ “â>7Ãûܤ¾¸Æ§è(” æ)°áD÷Q«¬Ñ'è0S,ö(ð*³˜ö¡l1›ª)6”)|ÄþI¥š³Y£OÑQ £}0³ÊÇ,ffš¥‚ª+Ú’ ŸÜ¥'xDøkàE©¹ˆõ*•è(;LÎ^åc3£À‹j¸ ìPßHÕ€>yßð®¾ë­§)T¢Ã4ÙG2«|ÌböHÆe© Vƒw½øÁ»]N<'ìœ+ ƒwP2¢õ*•è(;o¯ò­,tÍžÈIfzr¿wBû@é EAOÖ«f1y”“J–*jØ:îl­S3')Y$OÔÐ=uÔ*ãî)•è0S$sø˜åc“ÃÇõ'¦¨Oq=zm ‚0leE_zT²ë)o•è(%­ù«µ’²|ÌbödH£ßÿ}dÒñ߯®ß_½]~Þ†Ä#A¹¸Ä#†ee*‰†ÛxÎ8ñP‰³Òb#³|+ šF^b/«jAO“›xÄ éné~ìäHr}¿@Æ[Íu¢£T4Gëhg“YLí&©¢†Ëjζ¬vâÄ£~¤¼ [_äýûjoµÊ¶Ò¡fŠÅHÞäc“ÉIÉI’½¯²$¼i‡.þ"V×É6ñЉŽRRLÖ!Í&ßÊ"NÒ¤RIÕò6‘b8—¿˜tÆCqÄŒ_òq¿³8ª”mj¡e‡ä¬ãM>f19`œAÌøeØ3ãw· W¤9oQöJ-".'#mûpu¢ÃT4™Ç3,³˜<žÉ€REŸ2å÷3WqT¸hWA}ÍÖ6W‘4¸ ŠÁekW¡e‡Ç£]¶v¸ÊÇ,&ÇŠ³\Ëõµ +ksTfm­ÅìÁv¡Nt˜‚‚},³ÊÇ,feäE¯¬oWhtbÿþe: ¤¥éX:ŠÃʽ½Ž¢äè£í‚)è ;„ã)[;\åc“cÁYžBÎú)äÇV¾eJáüÔÉQ¤Dx€Ì,T%:LA³y$Ãò1‹Ù#RA Á§ìÏ>M\¬XÆ2ä2B( øÓQ«Œ“ •è(SôÑfùVz˜>)¢Iê'9‹?‰S‡%Œ}wLÕw]üaÄVA¢Ã̓–YLÌ`Iêý\M;¦0(øÿÉ[ž øìÄÝ t"‰x\ËSNÁz´[':ÊìB4}Y>f1;è+Ï^ìí¾lêöby×èÀ¸*¡¦ d¸¬ò­,pòÀ%˳v£Ý‡â¥Ÿ½@Ÿ‚G1fÑ2×Sö”Š1ؤe‡1™ƒ¾,³˜ôÅ,À&Ì{À¦ûæº1—þŽ"‡Åv$O':LAÉ>’Yåc“G2˜A*¨!Ø„xñNPðØm¼¾hAš2¥ÃÙV[;TˆŽ²Ãö ï*³˜ôÅ"EÙã(î;{厂Èã •è0-"™[ù˜Åì‘L‘Ž¢: rï(<Õ¿Ò6l‡Ôâ(pé³0žŸP‰Ž²ÃãX‰­®ò1‹É߈¢ß0âžMQéçŽ" ²wÐÚQÔ`³€uF¡¥ ÙÙG2«|ÌbòH&’ˆdSÍCÛß¿yݶ˜–.oSL^”µcÞ½)*'òà¶u¢Ã,íÁáU¾•…~Ÿ+Û˜¸ªz reC¦ªóØŸpµÊ™R‰3E4GˆY>f19BL(6E‘¾×ª¡ÖM”»#SSLdŒL©DG)(óp†å[Yèmo)(© m‰ÚƒLQ¹tdŠ;…£@×à(Ò²Ô™R‰³C2GˆY>f19B\ÕDÄlúЇ†ZwIý'ð`¹÷c=X¡¥ U“:(èQ>f1y$S’h–-Ép¯¤ç ¼å.-ï–¨¯$4LàAB—¬GµU¢Ãì°˜#Ä,³˜!.Y: -k¨uí,²¹£ÀÖ£Ú*ÑA š]ìÉÜÊÇ,fdäFË¢o´ltxñŽ¢ªBÊn«uhq³sÆc*ÑQvè= ¼ÊÇ,&G D)‘àI£Úz‚þMQUÉõVè0Mö‘Ì*³˜<’!ykžô[óÐS¾ô¦¨L¶óyË+I MQ3Z_³Ð‰Ž²Ãàí!àU¾•…~^x;¬¾rË(êÃÃÅW?]݇>eAZ.€êµU0†l½…\%:LKÁ>œYåcs‡3U•œÐÒæ P_ýçW_þùO_}s×kT¢[z‘ûzy‹Û¹xrr^ßJË2(ÀBïck’ ÑQ&½=$¼ÊÇ,f‡„K&錹+¥þƒÜ@.„h EiD‡)h¶lVùV0{dã¢TP»AîúU¼øAY³( ƒÜ@UQÉŠÒˆŽ²Ãì!áU>f17$ìXó\Œt{—»è^Þ5"ZCQÑa ší#™U>f1w$S5É Õ7 4:ŠL—î(ˆb.Ü´Y_I* Ž¢”„` EiDGÙ!D{Hx•YÌ qjŒô–˜ÇÞ7’5 q7¦›£¨Á%kJ#:LAÑ>’YåcsG2U'e?·~¹¯±f•Ò‹räãrcg£ÃÑŽ"»ì·ËªDGÙa÷­íåc“£ÁEÀæÑhãG¥Ô¿¸]ßµý<•è0%óH†åcsG2U“@*¨]qÛ{ºôâ6.½ÓÞo…Ï Åíì— ã…Jt”"˜CÀ,ßÊ"MmøaOFqôä¡FQßu)ÖKÈU¢Ã´ØG2«|ÌböH&‘PP½ ßè(à9£(Št±%£ð¥þ>ã…Jt”˜CÀ,³˜N8Šàö8Šû2ŠàÏá( $ë­ä*ÑQ Z\‡HæV¾UAËä‘LpÂQ}I›£þÒÀrQgs¥ÅQ¨jd¼•\%:̳9Ìò1‹¹!`_³y°ù=ÅìûºžjbÕßQ„¼´iX+¨Bt‚¢sö‘Ì*³˜<’©ßs¡ Á°˜}89vÙŽ"bt ŠÙÞ5³s !Yo%W‰³C´‡€Wù˜ÅäpˆÂQú&M §Îà(bÈ`½•\%:JA½·dVù˜Åä‘LHÂQTÛ2Ì(ÒÅ;Šâs¤mRÛ‡Ðä(‹õVr•è0;${x•YL»"G›ô$û'µ+%:ƒ£(áÐ/i«  ÑQ B‡HæV>f1y$ãJ’ ªæ?Å25tÑŽ‚‚÷”·®'ï_ĽŽ"ñ"nj‡ÑavXì!àU¾•Í™Q”'e´‘nË(¨—£¨ŠNh]ÌÖˆŽRÐí#™U>f1y$È(¢{ÊùŠï¯ß¾ûð~ÿùŠÊöòÎWÄrÏÚ¾"£‡œ¬s è0 -öàð*³˜b;[}Ø“kÜ©^$’tEÆß͉”šF›º5¢£T4%û(g•oe¡/žIEe'†¾á¿–¢KÏ6rù¬#*ä–lã RÖ…nè(;g¯ò1‹Éáá˜D¶ÓÓ² '芾Äšëâ*0ÄR¢±«P‰SÑdͰ|Ìbòh&‚Ì7ô—m®â°Ûä²]…+ËZú ˜Š±¡‚qT)cW¡e‡Ù›Ä,³˜ –wUý¾»ªwšg¥§wUû9Šd€[%:LAÁ<–aù˜Åì± IGñà]ÕûÅïÿãwm"¥ÈöOŽ6¥9Ꭵ.mTÉzµ¬Jt”Ùa0ǃY>f17ì"ˆëbQÿHœð ñαT'èæmýZèæ(´>W¡¦¢Ù>tYåcs‡.U+³TQkÛèsYLŽ"ŠEäñ0»7‹X´ÊzO%:Ê)š¿,ßÊB_í=)zHb]'$u]çc'‘EøþYDUòÆ“*Ña ŠöáÌ*³˜;œ©:‰RAÕ4·)‹P®oý“gˆ.%‘E@„ýYÖw*ÑQfW¢=Ê»ÊÇ,&Gy“Ü3OÛ3.ý‚Ø3ÞÏ/”­'îT¢Ã”:.·ò­,pöÀEî‡÷Œ«mOÞ^½|õêúÕÒñ´Ãqˆ=ä—â8RʶŒ¢~ü~ÇQòq+¨©]jDÙ%¹dú®ò1‹ÉQ_ ±2ôM@- Åâ<{;Ž’íj«D‡)(ÙG6«|ÌbòÈJ ªšS[BQ”E–ÿì~<‚¨WÃ!2ÙçÈ-—SŒ›`U¢£Ì®æ­ÖfÇò1‹¹1_Ÿå-±¬/El¹%Ù­ˆü9¨Ñ¦qQB%:LA‹yàÂò1‹É—“TЇZ`øË§ïªÏøxóÅ«{')rÚ€ÓK™¤¨±]DÌÛ;¡Á‰_œñfY•è(=v Ûè­|Ìbr08É6õ¤·©?zj[x‘$ö;ûnn$ûeC£±ŠjDG©htöqÎ*³˜<ÎI(òߤ¯AhkMt¶•S×¶]!Úv|¤Ü°5ð¨UÆP”Jt˜)¢9DÌò­,òäqÍ‘þ!ötB-ïI,ŠÜ ‹¢ì/V¨DGihòöñÌ*³˜<ž!—¥†>¥ês,Š|¼8, –=)bÌKÚŸFdò¬±(è0³Cs˜åc“CÀ˜Eí󞦧ûF'û7=Õwm B%:JA!tˆ\H¨ ð“G.õk&Ô®é ñâšž(ä·É®ú`Óa­á%è0³#{x•YL£8…Zžt¸Húq µ›_¨Zm~B%:JAs°\Vù˜Åì‹8…ZÕê)àÒÏüBTÿsû$(q›ìªï@ž>}¬_ cy¦f§fvÅÓ]åc“cº$K’~X² H¢Øß1P°¿?¡¥¡í#—U>f1yäB(Úµ‰Ôví6 ‰òÅ9—‚óykj¢C6¶×1 Eë*ÑQfwD×ÍîV>f1;~ ¢©‰ô¬ÇIA’ÝššB/¿PR$´ö Ña šì#—U>f1{äI*¨á^?ÊgÛë7s5<…°ÍET…h¨F´Êº­eŠÅÛcº«|+ ½z6)– |EÑÏ<:‰H^kÓz(Þ{rÆ+›T¢ÃtÌã–YLÏ € {dìoÿóë?~õõ¿7,/ñòZ`]òàÄAŠâ÷·ÀŸÜ¡áÌÖD¢ƒL´Tÿjo¢·ò1‹É!àLrŽ‚ž´Lf1{0ƒÒSæÁ]üÔeþÄ©ìàš’ŠúÕKÖ·²U¢£ìÀù]åc“#¿)‰Fö{öŽÃŽZÑ$•`[<:¹ ¬AaFã¨:ÑQ*šu0³É·ªh™;˜©ª¥Š>´y|•ĉ­‹… 0…ä ˆ OÉïö·Ze[ÈÖ‰3Åloò1‹¹Ñààa+dׇ=…ìû Á‹3b½ è]òÖëÆu¢£Tu@³ÉÇ,æhªVŠR¶ÏO)eÿ,±8Tñ/Þ[HÅoȃO¸ß[µÊv½‡Nt˜)¢5¼ÉÇ,&Gƒ=EaŠô¤µO> º¢ÙÐwjžEï]ã˨:ÑQ*JÞ< aù˜Åì ¡Tѧ,~ú¹·(éÂa(ŒÕc:'\Bƒ«XTÊø,ªNt˜’5¼ÉÇ,&‡ƒ½¸VQž4eáIÒ êå*rt”l+:ÑQ*zœS³UÑU>f1{4#îUÔÊ…OÏPË¢qôbm`ðaÑCÆ’¬ •è0S,æˆ0Ë·² ¹áü¶Æ¹>¨?íca(á,‹ní°—¯èƒõQ èîØ–b« «|Ìbòp&ˆÝõAõlm¾"¼ð´"S¬®‚Ûüë+9 ž{¦T¬Ó •è0;,æ`0ËÇ,&ƒC’ŽBïÚÚ¿/*qʾSÃl}×=˜; …è(õÉ>’Yå[YÄÙ#ŽB_hÖè(àÒ֌͋c©!ÄGAÞ¥b\ØV‰Ž²ÃàÌq`–YÌŽ;YªÐ¯Û?öÐxá*¼‹|/g‘ŠÃl@©D‡)i2fX>f1y4ã,V8Ëb…¿øb…¯±‚è‚ ®4+Ž*eÛ3«e‡Ñ›#Á,³˜ >žÝä‡'­ÅŠƒà½‹©hÜ3«¦¢`ϰ|Ìbòx&:*ªŸåks5¿ºpWAÕ÷ºŒ€*ûO¢"¸eª1¥e‡)˜Á,³˜wBÐï<¶®Äê§@b¼¢Óî'ÈÑzO':LE³y4Ãò1‹É£™ »ô‚Þ¥×A•çñŠê-Õ¯VŸ„†ñŠ£V'*ÑQ¦Ñ fùVan4Ø=&?ì9 NOmû7;ì5ŠWß5zg<\¡¦ hάò1‹¹Ã™ª“Y*èSîgÿ|/Æ‹O+2e¹70ù´ßQ ”q7@©DGÙaŽæH0ËÇ,&G‚“sxÉ?mO Ê{cGQß5¡ñAmè0%óH†å[YàÜ‘LÕI‘÷¦ðÐÞ}KÉß¼«Lõ'Ø¿•¼2Þ&ö.e+yÉUÓVÇHn÷öYĪmÖûu¢£l“9FÌò1‹Ù1â"zO¢~öÑØHºâštr#>ø`ŒM©D‡©(™Ç9,³˜<ΉEVÚônÃ6l*¹ç™‹%åÊ6s©a梄͇¹U¢£LñxÕÑÔY>f19Lœ²L9²Ùê„gXýQ0oŸÕ‰SÑbа|Ìbò€&e™t áê„Ï«?2¹åÿ¶· «?Jkç*ÑQ¦x\ánkŠ«|Ìbn 8¤"ŠŠ©f1y8ef-3‹øœY,›¢’Kr¤;6dG­2¾Ç­fŠh oò1‹É!a ËìZX~‡’Þ G-y#dÛª…Nt”Š7_˜ª(Ë·²Ð¾L¤¢bay}0쨅ç…嘩¦šx¸íÉŸ„ýµ·ZeÛQ«fŠd oò1‹É!a@‘æªiþ£WÐA—¶)¨¥/§·È€dD©DG©h æ ËÇ,fhÈ ¥hè-ˆž½EÍ-°x‘[À!—Ûë-JÕ)ãó:Ña¦XÌAa–YL Cí& 8½…V,,‡(»;-,§åD¦CÛ·Nt”Цhа|Ìbö€&ˆÁnÐ÷ 6z‹x¶Áârca«qƒß?ÛM5C >ÙvDéDG™"8sP˜åc“ƒÂ9Š4?ǧ·k@²XÝk t¹¾dcÕˆSÑdа|Ìbò€&G”*jXåÎé¹ÊÑEŸeGT UîP\tÆÓ:ÑQ¦˜½9(Ìò­,Üä p–y²^ð|tÿ¬@¢²Ïý‘¨Xµ=O[èD‡©(˜4,³˜= ñAª¨š 5z‹E3/Þ[‚øf-Ÿ·ß[@,1oщŽ2Eôæ 0ËÇ,&…sHTÎ{¨»¹…˜¶8¬-ëf19TL |é—ÖZjß$†g{U3J¤„`|¶[':JE£3gX¾UEËäá A–*jè-Nóâ½EÎ!qŒ•R‹·8h•íö(è0SÌÖ@ñ&³˜(¦ ¶GQxÒ^Z$q ƒD܆ÔéF!—¼õŒ·Nt”’&gÒ°|Ìbö&ˆ¥5 ÷GQ<Ûþ¨yï&yJ~[bN~ÿò¨[•2†¡T¢Ãì­áM>f19"LòÖ%é·.›Z€@•­ |'(Ê;çc±¾Èz‚ê(5=ÜZª©yÌÔJ=5œÛ;,q¿páKÎN$¸hoÕ)ÛÎÚT‡™"YãÂB@æ190œ‹È/ryÒvÚÏ\ºx—j çÁ¶]êÕQzšƒud#d“‡6¹ˆaŠîÒS L¡,·â·—MûSŒ[ʶƒÞ'¨3Åb  W49:\’è;)Ií;y,$å$Ùmˆ¶Ó‚Z8 ÆÕîTGé(Fó°fyLÖ”RGÕ°æ¡þZy™õ>òûÿøhª- FP/Ò,ˆUÚ¾hõ•6 íê±õ!§äŒ½‰Nu˜¥kèXÈ<&ÇŽ‹µÆ¢ï¾nh*az%Ë-œ%V2ÖQ•ê(¥dñl®<âìO¨EO•Ú’ð\ÉǼõpZ€ë"vØ–CMmgþQÊÒëgì2NeÅ™ãÇBBf29€\ŠLAÊÃ)ÈW?]=2 )ý³™À£ñÁÖSd‡ij2n„„ÌdöðFâ«EÇWJD~ûŸ_ÿñ«¯ÿý¾<ä«ÿüêË?ÿé«oîNùÅíµÑãR¦ü’Ç"–‹ÚŸÔoL¬¾©ØÍO‘d¥ÑyspYHÈLfF—kè‘.8<<\ùÌŸøŸû“$(ƒÒðhíOJ)'"'ÈÓT°|6 ™ÉÌ‘ÏA9‹ÐTý>ØCþä¿®®ß_½¡Å¡¸æ‹s(Ç›8y{JÕ¶ Æ‹ÓO‘e¦>˜ÃÏBBf27þ£ØïPFµ>w(îÎ"Aš6d+vó(¨~ %'ÈSÕÜ!öa ™É̱ÏAŸœPU}èý!òýÍÕu›?9ðÄ3ù“Y+&˜Si{%™ÜK̼9þ¥“e³!šãÑB•‰> ;‘ÍÆ lV?êsÚ½Ü# ‚tc„½*'¥@„äÍ0ì0]Å¡KÈLf…¢ …ôRÏCþåý§e»U£{IñâÒò™Öwvo¹ZT-%çƒqð ²£l´*d]%d&s£Ô1жìz)ÿ<±ž"ÜI(XÐÑ›¤LXŒ»€O¦©Ô!òa W&zª:‘¦– 5õ¡#ª7ùxóòã›FoD}ðR¼‰Oy¿_ ×âMÀA6ÞnrŠì(M©FÍ2“™1êªIœNˆIO÷€_NÆÍt+Ï×7î±o99Ev˜ªRÀg•™Lø$±,º>4¹“÷®ß½|ûæ7z”„—çQ&("?Iy·G >:@ˆÆ'§ÈŽ2SkŒZJÈL&Ǩ“X0“¾`ⱃíÒ›DìíMêÛö9Äb|äÙajZ¬)!3™=ð'“냺á‘}Ÿ •ÔO€²â#’ ŸÕDRð >â¨C¶=\§ÈŽ2¾œ­qf)!3™g/²ÐNøˆ{SÝSŽàV>€ÖNB';JOÑÙÇ2›„ÌdòXÄ®èúð”3´Ÿ; åLNbâY’šZ@†ÄgaÿZV+k¿¡“fh(K W&yvD9o³$ñ0ä¼{ñWþäg=y².sŸ";JÈÛ‡›„Ìdòð#djôРÇã?ë/} SumqÛ—ÄÝßô(&4Þ˜{Šì0cÄhlŒRBf¢"0óã±=›¾Ýô@" Òi»ß”û¤õã¢ùѶ }Šì(U-ìU•%d&ªCŸHUÅ6úðÐ'Q¸úéãÛ×W×_\”woÝ!‹ëÇÚv»4x‘+äPöBL„Uqèl+÷Pf±ä-ögB®|PýbÏc´PÐ åáE»÷÷ߊéŽì¶M»¦;Žïœ\‚\Œï’Ÿ¦“‡DPPªìC;wÕJ÷áÐì뿽ÿpïN¬û|ŽKgò9óÔ1j°ì=@Š ÍÉËÁQ'£Rf±T:Yì­ÌGÍÑç±ØL2‰Ñ·d·&1¥{s|é%B p{x•ò(õ±O`ÄB®|ÂäQ.2›Ñó<äe~¼º~õáý«­¹œ+±™ÇɸRhû¸Õw€™L‰¨K&£Rf°‡h¨‡ÁÞ É|ÔÜ`ƒ…$:«@ß'Ñ6ùQÓºÞ“‡wž$ŠÆÝº÷P¥²!v‰‹6!™Ïäq€L¾á¡.+ÝÇܼúþÍÕÇ4ø‡6/Å¿$ ’ŸÝÍXmÃ|JÆS ÷Pe¬ÑYcÛ?’ùLo£¬ÄàÞJ̤Lä0Ø¿s|çÇvé9ŒNy˜Ê¦.!Ñ&$ó™<$BY‘Á=™ÏV6þúÿÖ˜ÀàÙ*3ó8ï"y¿¡dØXŠ©êVó¿ÐÃÁ¨”GYkò]píMHæ39®¼p0Áït0wnX%A9l¦ÓêÆÛw^À%ã£$÷P¦²Ð'&b!™Ïä1Q²ã0´:˜¯ÿÔ:Þ+ÿPÿÛmùLpî¦þWId»#åÊ£lB€{rå£Àç±Ýã5M~ع)ø¾Ê?Ѷ§¨gå)dÌÆË‚ï¡“GH„â%jZüÝ_Ûë1D—·/ØEÛ„u}y÷¾à[m+™\¼L¥<ÊXwŒu’ùLn9Vôé°ÆÅÁ%ºó8˜â£/®G>£R¦³Ø'&b!W>yò˜¨„,u¶iÃã7¯ÿî‡^¦Ä \ó˜3ù´È¿{Íãªr¹ª³ídÌ=”GYì±ÑÃbo…d>“CÜAñ©÷³@RÞ†¡«“ÉDÅøðû=”‡©,ö ŒXHæ3y`DQ&ÞzÂ#.ú~|Óº¦žÒåÝÑ¢eÓ¸h+£°ûŽ–P7ãU]÷Pe­”ú@Ü,$ó™â.r¯^Ñ÷êí€ÉD[Y¡-‹éÙVFni‹¢YŒNy˜ÊR—˜h’ùLy²§è{r0¿>ø“/¯–¿5¡så1Óg‚‡bb¦ä¶´f9ÄãŠñû{(2á]îMHæ39Òrb÷NÌÜ9'/z°œ§€BMèƒëPœÑ)SÙÒ%PÚ„d>“J(f°m`æë¿½õ$Ÿƒ81“–^¿-µÇƉ™ªrËÂóNF¥<ÈbÁå.h÷&äÊæF»“÷Û½¼äõËÆ{*4 IÓYÀ³™cv=:ÎtÊ£tÖ»> É|挪b%©³êRþ‡¼Ì_>}WýÊÇ›¶©™äƒ¿ð¼†B"\Œ®¯Ä…6—sðÖ‡ï¡<Ì|sì{’ùÌ}'—7h¢>ì¼&|OÓYrØý˜ðñ'Wã{Â÷P¥²U±º¨, ¹òq“GIE”ä°éªðÿø/ß7OÑT¦ç:+Q É|&Š|–IMnJjn®_}÷òõ»7ïŒÇse5Ó8™e@U‘Æ@cè)ôè:Ó)3Xêƒu³Ìgn¬;9ÑÛ¼\÷yb×™LcÎÔÚL¸”ÄJ‡]3:åQ*[í¼‹Ê²Ìgò¸È™y·µ6|ÿæõ÷÷†—Ûí›a ¤—mÛ+iìr®ÚÇn¶Æ«Pf¼¥êÍB2ŸÉQï"@  ˆ•šÃY*5Å_Ðø.Ø=”Gé,Ä.1Ò&$ó™¦*\  p¦Se¯ÙuÁ¹7!W{Õ•Od¯² ìí¸¯4üyp³âÐCì‘Ó蔇©lêmB2ŸÙÃ"Ù Úš~óŸhõ.gë˜Ç» †iCÌBcá¿êZN:lÐ)2Ut] îMHæ37Ľ,‘ø‡xØygî£ñ´™aÏ1šúŸªû¥Ãœ¦Ny˜ÊBŸ€ˆ…\ù¤¹¢ª¥(U¶éÎÌ_^~zwÕÞÎìé¯ÌÄ %o'2}n»2SbX€Eò({%ßáÞ„d>“#ܱlsÕõaçB³{V¤äây0²šŒ4>²|åa* }¢"’ùÌU-ÝšU-kZhö×úkßÿÔ˜Ã$wͨˆ¦Ùú‡@mͪºaè² @§<ÊZKèƒh³ÌgrD;%QõOé©«|¤a+ûûŽc™ÙQïÐÞÅœ ³ЏUaRlªôgœGû*Ì ÊƒÌ5»ØÒB2ŸÉ!í^$1úþ÷ƒÿ )ŸeŸYö1âr¶¯ƒÊª”‡©,ö‹„Ìgò°(‚Ì»õ”ë3S´¿Vò‹ßÖXýLý¾¾ûð~}ú÷7¯®?Ü|øöÓ/¾þîåõÕëê}Þÿ׋ŸÞ|ütóm£ŠùžåúÝÛ¶,çŠÚAy”9ûÔöB®|ôËaó˜3è² :K#Àòg¹ÌuHrtÊÃt–úDM,$ó™ÊÅuP( mýÌ€MÝ9ºB6Ïœ <Ê^Cê{ !™Ïä¸7DJ@|ê€ (§­bÚ± ÇÃ2Ðhß p‚ò0•-]¢MÈ•¾ãn"•M2,JMkÞ_}úñÃõ]ýôñí‡ëÖ¦€ÊüâÖ E,¸]¡IšÖT½«ˆC{´½Ùj”G™mMÃû˜í*$ó™þ.²fSž:©)=;ËúæúÎsÂPìgNP¦²¥Kp´ É|&ŽR‘›Òv„æêúÕÇ·7ßüøáº9£qX·A*rB3Q[Ý&!t8Þ|‚ò(£M¹ ¾ É|&ÁsÜú›ëÃÎþæû2šÃÆ9üLHb‡cg'(RYp}B#’ùLåˆRe›ú›?^¿ÿöíëÖL&§ËkovX–K4Û;MíÍUßÀ»Ò£3@§<Ì\± ƽ É|&Ǹ£æõ­‰§=L¾ÇÃDgò0x˜顲åQ*›}§ h’ùLE/›YôŸöá²ÌÛ›è[ ÿþÏ„šIo7gR(Mçj@êëë°ÔìåaÖJ}nrå£OÍc­Déç¥ ÿ$v?õ,üLj/Ú^g5Ê£tCŸ ˆ…d>“EÄ éÍ9|v¿¿¾zýÿ|uý·FWCñò&i–&¹?ó8ŠØàj’O%vÉeTÊÃÌ–ú@Ü,$ó™âF!êÛ>w eIRÞºœ{ÎÑÄT_yŸú¿Jy”ÊïkwPÙUÈ•O˜<:B©²MW›?¼½zùêU£ƒÁryMÌ1÷3b[s¬YQî2F£Sf­¥¶ÍB2ŸÉ±m”Ø6êØöž²¤“@ËrGs¸Ÿ¨Ã Ny”Ò–Ø%*Ú„d>³GEIFEúaô‡\̧ï®Þ]5ïhÆt.¼lÚÍ ‚\?³ôŽ4¹œÃrŠà3ò ëE纀ݛÌgr°›Pì»%R÷ÝîÈiÄä&Ñ-ôœÜ\²…Ô£ÓL§s‚ò(cõ¾ Ô½ É|&‡º3É3ÚÙavg3€¨Îd1ºÖ³:“B¦Rê‘Ш”‡©,ô ‰XHæ3yH”Iv˜é>¿4x\.¯ƒ,òÛdƶ²[}ê0u©SeŽ!t°7!W>~r» ÷ >u™¨ºrg©º¤Pˆ Ãñ唇©lîô°Ìgò §`–*Û4 óêæU3 Vèòf`–SrÇÉm30KçYõVŠ.:åQÆCüš…d>“ã×%¬ÄØ}³–E4×ôìPN1øH¡‡Q)SYì±+Ÿ<{HeH›°¯¾ûúӇ믟p§¬ÄËÃÁª—A/ê,%4â`1Q‡[˜'(2Ùû€Ö,$ó™´y{vß^¾çNœéör^ ̱Ãz2ò0•Å> É|æŒ@Þ^†ÆÛË?¾yóñÇêb®Øïbà|×—'r1>FØ\ 4ž[^®G)_¥<Ê^!õÁ­YHæ37n½˜*ˆ^Ÿ*8íbÒÏ]L”ã¶»©kï@‰ÐáXÙ ÊÃT–úDE,$ó™;*ªŠ%ïëé1܃‰Ìí^²ß¶/û>¹3ù™i;È‘ É|掔ª–’PY¯B¾¹ï^U'óÛ×W×7mN§2†‹Kn«¶ˆäƶƵx™D‰\üL¥<Êd1÷¼YÈ•Ì yƒÏÛ"Ûú°s¿ÿ=}dpPÇ3àgà\¨‰T‡>eò(•%×%0Ú„d>“F>'©²Mëý?½ywõúå§«/^}lq1/n½?RÍ\üÖÚÖûC%’\¥Ë:åaöš»àÝ›Ìgr¼Û{w{¿s½ÿÝUeYb¿O "!ô¸Å|‚ò(¥-¾K\´ ¹òÑ7ÖM¤´AÆE¡iÁÿ»›ŸÞ½ÍYŒ—·×Ñ—˜„‹qm{ý æ½Ì:åaÖŠ]ðîMHæ37Þ Ñm³ÒõÙÐXY””Ëy²˜êÆsèÑk¦S¤²5¹è±Ìgò¨(:*Û´Aææ»—¯^5.ô‡è/oƒLrÞ®=;¥mƒ ””rè± S§<ÌZ© ²½ É|fG¶a›][VB<&K‚rÞÐêžÃ2Pй>F¥\ú7W‹£ùõÇÆ53 o‰_Н¡¢¸SV?!mc2–£Í=vûë”G.ø.0÷&$ó™æNI ‡}ˆOªÌ€  [È×sÑr†ªýÔ%­Q)SYè±Ìgöð(ÉðHŸC{pÀUã™åÊðòN“• –˜Áq}Ê~ïBc(=2ò(S=ž¡67ÕMHæ39Æ Q˜*èxIÛ&$< h¶lxô¡Çò0•Í]¢MHæ3y@)J•mÊdÞ}lõ.5y¹8ï’–)ºDâ£Ñ–»T][ÎFtñ×)2UŒ]ðíMHæ39¾ $ðm “1÷-/± ½gÑ¿Û1æ>ÞE£Ê¡ômËËêçrY ÐÃᨔYoqÐêf!™ÏäPwÍ„ÿ!v./»S!I™ÎãpŠ÷}63딇©lé#±Ìgò)S’*Û´¼ìÝÛ—ïÿÚè_äu׋ñ/TB›Éض¹¬†Mt,ôØ«Fy”±úÜìf!™Ïä`7¢Lhð© ècFÚšž}ÌÅÅœKå˜:åQ*\—h’ùL!Ê„†šV0ÿï7¿}ûºµé\Ì´;ÿ`¢,šÜ–ÐTõÃêº:4蔇Y/vÁ»7!™ÏäxwŽ¢! Ç wš™E‰&§t–MM}J=®™é”G©lô]b¤MHæ3yŒ”“ÌÁSÓ¢Ì?ÿۯ߿ywð­iMº¸F¬á³/¢©9‡¶F€Oê±ÌL§<Ìd© è½ ¹òÁÉAo’uÚ[§¹¯©™D¦¯—Ah±y{•Õ(RÙ:F«ÌgòÀˆd†Q§Ñvþ÷ý»¿¼zùê»ÖtyµôT\âƒÀõ4ÖfJ>uÙ˜©Sf±ÔèÞ„d>“Ý„¢ÛŒô¶ÖØY–”·n³ž;ÿk곇µò(•=Ž+tPÙUÈ•O˜=.B*ÛÔmvÕzµŒèò:ͼ“Ãæõä¶N³ªjÇß;XªBy˜¥–>(7 É|æF¹ãq/5?ìú§3˜èJ<5u ’òyeJ(.§c™:åa*›:D«Ìg*H•mJ]^~zÛæ]j–wy¹ dH‡.ÑõÄÆÜ…JN7enª*åQ¦J¾”ÍB2Ÿ¹¡ììÊvJ¦>ì<%sOõ%{çñ.Åù˜»ÔøUÊÃTúD,$ó™= r2 Ò÷‡¼Ëûïž0S¹^à1n›0¯ j;&S.:×㘌Ny”½–ÐÈf!W>~n ;;ˆÂÅèSyò˜(¤ UV=ôƒyýÝ«¯n~x•}Lðï¥ø˜´ìL8Yˆ®ÍÇ—RîÐ@v‚ò(ƒõ±¤-„d>³CÚ% СØu)çàÎÒ¥\ß¹O¡Çðå ÊÃTû„E,$ó™<,òE†E®©Kyõ1­.Æ]^rrD%¥íšz”ÑA¬*×ÅŨ”GÙkH=pm!$ó™×$íµ<5AYôÛt¼ƒË²ñå°J•Õ(SYê±Ìgò¨(™Æ”¦4æ§woß¾ùÔ8“‡n/ÌÃPðYVb5&1Ëz¼Ü¡s‚ò(sÐÖB2ŸÙam·u}f§·&4í\®ÄÎr?—Ùj8ÔìUV£°6 ¹òÑ+‘óXkÂmýF>$_{Œw÷x˜„t&CP¿¾öµþ”Gé,¸NAÑ*$ó™<(Jb­^}hÚùãSa É|&‹¢¸ÝZÔ°èÁ‰ËWŸ~úxÝ<ŮРq2j RcæírÉ'SÝå.@™Jy˜½RX›…d>“ÃÚ¬ açLÌ}i ijÌÄÔwž}‰Á~éå Ê£T–BŸ¸ˆ…d>“ÇEPªlÓLLõ)?´w“A¼¼¡˜åªTNÛP øÆ¡ªAÍa?³¹¹ª”‡™kék³ÌgrX;Ê¡˜¸w(æÎÔ% ÊIÙÞÔÃÔPt¸¯|‚ò(•-±OPÄB2ŸÉƒ¢(‡bbÛPÌí?úòÃë«WË/+ëËë)«·Ûúþúùhì)+Ñ/×µz­FyÑúcKD£]…\V_É2Ñf/¬ï"hºJ–s؆:^%Cï„Ôaùå ÊÃT6u 6!™Ïä¡QbLM d^~ÿé»ï[+þ9\Þú˜¶½‹õ¸¦õ1‹ºQÕ·F§<ÊZ½ëmoB2ŸÉ¡m@ •éÕ£¶ÉK ó@eÞ×h*ºò0•….1Ñ&äÊ'MJ¨L?ÀôƒùîÍëV˜Œ.&£XU%nÞrLVu‹b$¦:—Æã0‡#)æ`R€ãj©õ@Óúþªn¸ì'²_°|‚ò(k¡ ¨½ É|&µDóÎ:Ì}é æó,'«ï|90Ü¡£S¦²¹SL´ É|掉ªb©²Mu˜·oÞÿ×›÷ß~hÌa0_^ ¦j†Kbê¡­ãƒÃã"Ms{U)²×ûàÙ,$ó™Ï&'ÎmŽçµ-Ž!¿å0=Çø!õAÈTÊÃTûDE,$ó™<*"¹‰âÄ‘Œ‡\Ìÿóëýê?þôÅo~÷»Cþs˜„ΉËXs˜K‰¹‹ƒÑ(²VH}ðlrå'dzыiô;—_Þé%‹‚rØ–_Æ®&ç’{ Ä蔇©,uЉV!™Ïä1z™v‡¦å—7ŸŽT[s˜p®å—ßüî÷ÿñ¯ªŸYe‡³9ü«®²ª=·!Ltm»0ý²ß°GYF¥<Ê|sêƒq³ÌgnŒ;]ñÃΔæ>ÔŒò™Ê2r]Ê2*åa*[:I«+š! É|扪–Ь;èãg¢doÞ×?Æ6Sy^FV˜”ù^|}¾#Ë5ù‰]z•UÊ£¬5¹>˜6 É|æÆ´ÑÓ–ÀÔ‡ ÌŒ $å3%0¹¾ðÃj5{•Õ(SÙÔ)&Z…d>“ÇDž@ªlSóïÿþ›«Œ¬ÍÅ*ÞæbÈGeôؘà :Ä..F¥<Ê^Á÷Á´YHæ39¦Pæ0øÔ& Ê´å0]{•‘bÂ.KdTÊÃTúDE,$ó™<* (s}\ôÁ ÿ?ÿéß~×Xƒ ty) ·à‘Û;È)̲O“ºìXV)2Öã"ð.Æzr壯şÇX}Dêëš:ÉjV çÁÈÈ-]¼=ü‹Jy˜Êæ>! É|&‰|’YwjZâÿñÃ×Õ¯|ۚ¤Ë[ã|.üï–¹¿6Cî6ê`¯ åQöŠ¡¦ÍB2ŸÉ1í(Ë0qoæJ&R˜ϔ¯ {”L¥“ÇD® TÙ¦;1?þ×M»ƒñîòNÅøª"Ä·âë{§ÆS1 æ.›üUÊ£¬µ¤>ˆ6 É|&G´“á`ÒÇ ÚfaR8Ó, Å”ûaTÊÃT–:ÅD«Ìgò˜(…(U¶iæýÕ§eÚ²ñ˜2¦xy³05k­…iùr4ÎÂP*Ë0b{Õ(²×è ¨½ É|&µSÎÂ^—Å©V½Ê Ó™\ .Ð㘲Jy˜Ê–NQÑ*$ó™=*kôꃺFï!ó‡×…þÍÕo^ähö6ˆçmüœmïàpqªÅÛ äØeòR¥<Êt}î„o¯B®|`v|[v•Ž]ewªþYP]e¹£·©ÎÝ¥Ø#¡Ñ)RÙàºH›Ìgò)Ê®²¸§«ìÇ7ïo~ªùîuNß¼{óêúÃ͇o?}ñãñ_ø¢êò»ïõêÃûO×ÞÞ|“¡À_rò)½zõ­ýí7ù ÷ÅX|ás$øæ}ý!¿ùöeN]ôè"…oó‹•Ì«Oo[78W‘ÎUñ™öf@‚ š§ê+ilb«Ê \‡…Î:åa߆ÜMß„d>“£éàEò~gòtŸK‚rØ’§ÔÓÕ—ºœAÓ)RÙè»D`›+7yA$Oš’§êb>Þü­5a‚py Sp ‹Û*@àÚ¦ªo…2u€çtÊÃÌ»Àé›Ìgr8²€ÓA?㻞óŸÜz |O€.¤@žz Ð)RÚcµÎ^iYHæ3{X”Q*íŽ&ƒ‡R¦¿¾~óñí÷Jªä¿ðwR¥ð—ôm‚+B_àÛW¯Ò‹ÿúúÍêoou\xy­ ÕqÑ¡'p}ÐÖºYƒï€ô锇}¨ H¿ É|&é]’k<÷^"€{V8q‰ çŠ‚°Ì<ßÅmi”G©lÇû¨ì*$ó™<Ör Û9Û.¼þñ]ó)txŠ`q0YöÆ5ž"X6``éqLM§<ÌZK\ž…d>“ãòHÂÁ þÓžv0˺ܓ ‡«\gè\ ¨¸>‰‘Fy”ÎæØ)(Z…d>“E(PxÈÃü?üæëï¾¾º^ú*›FWCîò\ML’ø‚´ºšƒÞu$Õ)2[t}0sr5[} a"³M¢kõCÖm=rçÙçR†tpéö*«Q¦²©St´ É|fŽdúzúý§ùõÛOzù—Fƒpqƒ¤HK7Ëv¶16öÕ­ X¦Qe­ä:æ«ÌgrÀœ¢°VÒ¿-{rÑH@iËeº6&çb£R¦³Ð'(b!W>iò ˆR”:۔˼ºþÛÇOß·Âe——ÃøåÔO ñåhÌaj6ä!÷h$P)2×âû€Û,$ó™Ü>&süðÔ•Ñ2‡qå<9 .ô=æ|tÊÃTúDE,$ó™<*B'Ón=†{ÈÃ|ý·÷¯®¯þÚšÄø Ü# ˜$Í¥mct¥å"v©ø«”™kr¡¸ÍB2ŸÉÁm’Ú[¹ƒ’ɦœ)‡ÁP–¦s{•Õ(SÙÜ)(Z…d>“E$ë1ÔVùþ§Oß]½»jô0åë0ËBÏ"ê0ÔZ‡)%G×cWNy”¹úØÔf!™Ïä vÑWšõY×¶Ñ9Ÿggôò¾¨ƒ‡Ñ)SYìmB2ŸÉƒ¢œEÚsÓÎèïo–ÿC£‡ÉùòVFC!ðÂÃäÔ¶2ºê[IŽ:,\Ó)2׺€Ú›+}Ïÿ4æJ.l¦>ìô0÷5•-Û³Ïäb|Mâ]£Q¦³Ô%*Ú„d>sGEU±¼ÐY½îÁ¶å«®?½mó0•çåy\nbm(ÙrË¢ÍÃøÊØÃè”GYkL]@íMHæ39¨]H@'¶9¶õ’•ržÑÑ{ uX S¦²¥OPÄB®|hî »Mù¡igô«ë«×77[Q²ry“—¸,  ­™¬`Ûäe 1„Øc)Ny”¹&èjoB2Ÿ¹Aí»ÊŸœÃ€ M[Ósô2†ìëw²C©_§sGEU±d£Ï6?äb®o^^½ÿ®5‡¡ ÌaÈGÜzÉÈåÆ&eŸ]îáaTÊ£¬rP›…d>“ƒÚE¶+—½íÊwzɼ¤E»òâŠú¹˜„PRè‘Ũ”G)mv}Â"’ùÌUÍ’‰w[¿òÍõí—oʶ+×$ú³Ój¥±]9BÎ)§0™Jy˜µbP›…d>“ƒÚ^büÞBÌ=0YyÎT‡:Lߨ«¬Fy”Ê¢ï±Ìg*–Èa|[æ0Ó “U¦——Ä$ç]ò[!Æ·b°:**†úuÊÃÌ•ú Ú,äÊGž¦1WÌ^ăYßi;ޙÙ 1Ë!ÁÒãNy”ÊRè±Ìgî ¨j©ìôM…˜›ªÑ×ÍÇr¸¼B̲¡Ìó4y}®±Cõ“ƒ¹G£Rf®ÔÔf!™Ïä vÈÛü¸eÐ4C·µ1=bjöž]è’©”G©ì–°WYrå£'²3©l*«ƒž‡¾úáSóÌÊôòöÆzïùŒW}ж7fIÔ£]Y§<Ì\KL{’ùÌiSrú€èŽBL””·¡þØÑÃ$~9\×Ce5ʃT\ìmB2ŸÙƒ¢ ƒ¢Ð4ÔsóñMs¦f“—7Ô¿ä0n»pV3ݶ¡þe°«¤÷gtÊ£ÌÕ». ö&$ó™ÔŽ ˜ ·,WjçÙ²œÂRKèqâL§“GEQÜLªm•þŸ¯ÄPÄË+ó/Ý ;˜–¯F[™DL‡Kœö¦ªQeªG÷ÛÁTW!™Ï܈6E/¢Á¨ßµjƒÈb8D–”â{ìŒÑ)SYè±ÌgöˆÈˈH/=ä]ÞzW?/[=L¸<ˆ,8O$ÊüÑ5Bd!ûÀt(óë”G™k ]íMÈ•^…œÇ\½œ†ñ{§aîìŒÃ0þLÃ0)”Ný:åa*›;Eå³~8‘ÅN¤²rÆ· ÃÔ/âwWo›É.p¦Ïqû²ÕwÐ8 “¢s©:¬æªRe®Õ®º˜+ É|&G´«ÒüC<]«rÊé<Yt¹úõE•ò0•Å>A ¹òÑOO¤²Ù •Í¡¹Uù/õçlô1IÀ¿ãcR Ó†“¥D­>]è±ùR§<Ê`!ö´YHæ39¤ N@Ú Ú5–aÀŸ§[9-é:Ìô딇é,vŠ‹V!™Ïäq8”:ÛÔ­üÃÕõMõ.üÅu+S À¸u+S*mÝÊUß"`ê0Ô¯Se®9õÁµYHæ39®|1áb9Oê%“iLpçò0˾›>F¡$½â»#¥e„gj,«ªïJ—ŠŒJyÊfçû„D,äÊG¯qL¤²(ËH?öàtÿ›÷7ÍË„—×W¶¬'‹bË2Ac_YrC—Ù•ò0kÅ>è6 É|&G·k¯øa'fv_A†â™JþUó¡ÏlŒJy”ÊwvPÙUHæ3{L$·¶’¾ìæ!óǯþøéõÏèSkgÅ‹+û/º@zß“%OKy¡‹É*”‡™,õ¹YHæ39Ì(ÆÙP¿uØtS¹;Ó| K¬K£Q¥²!t ŒV!™ÏäŠzõ¡i¾¿ú”oÛ—”a¹ÀÿB"~^>3þ‰bÉ]jÿ*åaæZú Ú,$ó™Õ¦’Ó?ÄC¶›)ÎäaŠó]Αé”G©lŒ‚¢UHæ3yPT L¨ì²Ðe¿‡ywóòæ½ot0E@À—â`–W¶J9ÌÕµ8˜â ø#þ*åQÖš\'X{rµÖ29¬]‚˜f+AfkÛ‚Y†Wwm.ƒ˜b¢@™Jy˜Ê¦>1 É|f‰‚Œ‰‚=ä`þûÕõû«·ÿÒ>Y |)N&¹è·ñ˜r˜zhp2˺Š&t±X…ò(‹×Úf!™ÏÜÐv`7‹­vYLqáLY @YòõPYò0•…>q ¹òIsÇEUKI¨lhÊb~¬ÿæõ÷7ŸÚ\LåzqyL&¨3—ê;py äeÛVE2*åQöz¼jÔÁ^W!™Ïì¸vË0Q_äÞt‘Œ0Å3¹˜åö|—Ue*åa* ¢¢UHæ3wTTµTVõ¬ëÁŽå«*ÙÖJLºÄ]˜5×Í¢waÂry†z´,«”GY+†>°6 É|憵‹w" ô^ weIPö›vݶŒ!DèqòR§sÇDU±‚TYu+Å£6•µž¼,‡ÂÕ…y¨É-Å >®ÍÃ`È º¤0*åQæJ±®ÍB2Ÿ¹qíâ²DÉöÖúïé&+î\µ~L¹ôºT)SYì±Ìgò Èe‰’µÕú_}û×wm¾ª\ÜEVûfáb\kµŸ<×¥Ú¯Re¯%õAµYÈ•OœÕö “˜üÔ$å¬` =\ QMÚ»$S)SYê±Ìgò¨Èg™Ää¶$æí_^½üôÿkMbòå%1ŽÜv”¬~8“¢e“D£Qd®èRP›…d>“ƒÚ¹ˆ1é¬ï©:íaà´‡©Äδ9¦`L±Ë&L•ò0•-}‚"råCsEU±@ªlÓæ˜—¯xùñMkS=òå-I.TÉÝöæ©qyL©©ËLŒJy”½zèk³ÌgrX;”msm}Øy3æ¾$&:eø¹ƒ‹ŸiYb¯²:åa*[ºDE›Ìg*ÖÖe_šnÆÔŸåûÍc—•ëåŒ 5uËÛTL Ôv2BHÐe}ŒNy”½†Ü×Þ„d>“ãÚè`ç>ÿ;¥Qìy›~îY쇣Ë=¦btÊ£TöxËÖ^eYHæ3{T2*Ò/é=sÇDUK‹PY}_ƃK/oÂ7͘ÿÿìýko%É'¯_=°]ˆ+ƒ±/ðt·gëqî1fÑ«Ôî¨.+U·í5üÝÿ‘yLV‹GR†'>šÝ™vvY¤˜E&Éoç·‘,D\ÇoïÀ¶m$‹Ë´ íRá)²V4®œMBV>vr8;â–‡£–÷*0žSÞ ¡]+ü˜\ìrF¦­­K9†x’Œµ ÃB2™ò0•M]¢¢MHâ3yTO»CSæöûë?·òÇp–e—Kb\[¦è[ŠÖtØÛ/Se®>tÁ´7!‰Ïä˜vâe˜´· s%³‘‘fu˜e΢Ÿ)ñ}´=V’É”‡)-v ‹6!‰ÏäaQâ…˜ÔVˆùáæú݇÷.&a!ƙϓ˜ÔXˆ[þaB‡Q™ò(k ± ª½ I|&GµCæÊr[õŽ—™EzfkTÎ=ŒÏh\m12åa*›ûDE$$ñ™<* ™7*ËGÊŸ€“5ƒdQÚ´÷î_‚µhØ(À¶VeS—Ve™ò(cÐÔÞ„¬|âä 6Z ¢<ÅÝVèG—N’,¯¹ÇÖ~™ò(•Ó'$"!‰Ïä!:ÏUV ‰Ýóî]³AoÎÏ¿ï·-XËgÃ6úÌ~]›ÙÁXÊÃŒú Ú$$ñ™Ñ.¿!3Vxî62ké´ÅyËš~¬ ¾‹‡)RÚdûE$dåcfŠæÇÔ4Ìÿç·ïß¾¿jæÇt†ÃüÑ[똉mÃüEßSGI‹b®²MIÍ·­ir7…¥;¿”fÍLrÛ;0m) ZXn‚wï—)2Ö’wô1Ö*$ñ™ß¾kV¢‡mËþ§þÅ0Êv3ÞEÿåGcz$4"åa*û„D$då#¯AIeùÒV¹Eá1ÿrùñmùun_õî²u¦=¿îe\ÖûnÝËsK÷2,G2K\ãÕ‘³c”GÙ¬·€n.$ñ™è.ÙàÚôø!²rÇȦ­>Ú¯ìxᇹÑúzŸò0}Â".$ñ™:,ZËq}}ì Ù1÷ñÛ¯ñÕê:8å|?í>+0 ‹6°ññåãÀÎýææí—Ÿ®žèF¢)a¦z¶rŒò(³ ®–Í…$>ScÙES¶µËÃãÛ.¨¾p7ò‰ÜHìÒŸ|Œò0}…NaOü¬?¹ð™=ì ‘ëëc«.÷¸‘èÎÞ$g·ñòJ¼ov#‹^©¯ƒ9Fy”YFß¡æBŸÉjg˜qò‘š†lÄ™“¹ç‚~›Ø1ÊÃô5õ {î„$>“‡=ÎD®¯ŠnÄÙsw#Ɇòñа¹‘ÜîF½êjI”G™%„@4²ò‘7AÎc––:­\è<âFŽÏ²JÎÊxúû^ŽQ¦¯Ø+ì¹’øLöXËAX'‚°Ùˆ‹çîF"”òlÄ@³ i­åw0Kò(³L¡Ö\…$>“cÍÎ37âü7ò¨åÂÉÜHŒN÷ñ1ÊÃô5÷ {|pò°ÇyæFÖOžZ6ÎÞ`ðì–8×îFÀ‡Ø'(2KŒ½°æ;!‰ÏäX³ÁôwöðøýŸß>ÉÜÈ:Ow7’,èÏ¥£FyŒ¾FcL¯°çNHâ3yØã2ËF¼QÌF¼9ûlĸòÿÝÖ©å°=)z¥¿ÿåaf™zaÍwBŸÉ±f,qòÅÀ†ÚˆK'ËFW¿yŒò(}µ¶WØs'$ñ™=ìI¼%DnhµÒÙg#.¿M'ºØœ@—^Ç(3Kì„5ßéÍè3›¥>þþ„^› Zl¡W_7¶¼ó. –Dy”¾:×)ì©BŸÉÃ|öýÑ…^{@-¶¨ë<Ý:LiyGy%|o×N7²èUPK¢<Ì,±Ö\…$>“cÍÁ²è.ȱhCÃo°§jø×c…Ê1Ê£ôÕû^ac+T 7yØläúªØðÜÙ7ü†Þú­6LsÃoÑ+4]@-‰ò0³Ì°æ*$ñ™köÈ¢;jµ‘|ªÚ¸Ã’ÍúzŸò(} ¾WØs'$ñ™<ìñÈk#Y³6’Ͼ6‚Ål·lħæÚȪW]~%Ê£Ì2šNXs’øLŽ5Ž5k>âFòCÙH:Y6â“Å. ¿åaúz…=wBŸÉÞx6"ŸíiÌFðì³ ËMœÍhÏF½ê2Å.Qe–`{aÍwBŸÉ±æX6žläAP+ž, ѧ.Sìåaú{…=wBŸÙÞÀ²‘ò +º‘xöÙH0KYZ¾=› ¨%Pe–Éõš|ìäX³¬SËG­N-§êÔÈ9öµÊÃôz…=wBŸÉÃ,{ör;}#¨gß©åÐc[ïíZ‹^õµÊ£Ì]/¬ùNHâ39Öù{Ü5ÅþP6O6Å^Rñu£d}(Ó×Ô+ì¹²ò‘[¾gÒW–DÍ)öxöSìhÐZÃj#±}Š}Õ«> –@y”Yfß k¾’øLŽ5Gò‘(wh(±G{²lÁû> –@y˜¾¦^aÏÄgö°‡wF¹³°ÑH÷ÙÎÊ$o£å«CnÏFrˆ®Oï@yY.Hh'³¼’øLŽ5G>~wÞËF #ËÆûÝ´Z^8ú„}V3J”‡é+v {ªÄgö°‡·„ÙGüD7òͯõ{Nxó"¶«È>ß¡UR·1óû"‘îºR… v)…H”GY¡ å*$ñ™ZölÚÐû=Ó†­ÐòþTÓ†¸@—RˆDy˜¾æNQN’øLåx޹zsm,…„—iCW2Ñ´%Þ5O®zÕ¥"Qe–:AËUÈÊG®QÏc–ðwö€J¥HáTn\è³ÐW¢ñ#ÒP Y—ĞƤ¥ùµ‹¾ ”Géëa·@}½²ò‘‹aékð\_EÄ­Ñ,ÍÂçíF¼AoØ&FXW%´¹‘E¯º¬Ð’(3ËÔ Z¾’øL-ƒe§¬ÁЧ¬ú{Á™“¹Ä>{á%Ê£ô5Ú^aÏÄgö°ÇòìÙŠÙs£YÎ[Ÿ· 1ùÀ݈ ín¤èU—ŠºDy˜Yb/¬ùNHâ39Öœ s#Éìq#e#ÉžÌÇÝg/¼Dy”¾‚ëöÜ I|&{’®¯Šn$Ù7²¶937’ÛÝHÑ«>{á%ÊÃÌ2÷šï„$>“cÍÉs7â÷¸‘{µËÈ†ÍØ¾n$[Û§¿W¢—ï"l7s“;æFn7røÕßÿp}½þ»ï ÅßÕüÙßÌßö7û÷‹÷?ÿïE¡à¿ÿüöÇ×߸ýôª|H~¾ü7?ÖÿæòÇë¿)¿Íþíç¯ï^ÆÝïE·‡Æµï>ܼ»ütûéæm1½ÿñóÿ\ôçãå›ÿSÞôö£‡oýdy¼ÿ“ÿÓö#›7¤ûvùW?[ÞäSùÖ‘øúý›'øóÛ7Ÿ¾_¡Ëëòi)~³Y¾¯œËúWAzŸtúüwÚ¾Ûü |ö3ÌZ6Ó:ü»û?úßœùì‡ÉðèG¹ý›Ÿüì¢G{$$¸.*~ÚŠƒ>éËÇWù“~'Ñgèfù”GgõØ.{Ö®ÝË` '»­]ëÔn½5Êm}ÉQši×66MͬÒ±§a&ÕŒ\5Õ6¬bþTÖÄc_l¡VÄÛƒò,[©ö´þïUt;ö$’£,ÎÓÃâÜfqYŒ”§±8› -ÏÚzcYŒ½óÐ’>YÐ-‡I$‡©fÐSªtÄ`î8¥èeª)ט3¸¸¸û[¹¸øö¯·Ÿ®Þywqqõþ‹ß}{qÁ¡Wï~x{Ìo¬>ãËo~ó{þKl3 ñ\ü†1‘í\±vÏ •ŸÑ¾+#‘eœÞ ¶qÞIG Ä!†iŒÓ™­·{yØÓÛý`Áz»;%Î:íÝÿÉaªµCš*]eæiЦšÏjãæ3¤ ­t?¨ù÷f¹4¶Í.:ÃÛ¶Ÿæ 8íÍ5ÉQÖ>Uƒ»“ŽˆÕ¡i Îæm…TyÃÊ§Ž‹FvYåÜÙ8å^‰ä0ÕŒÚaJ•ŽÌ¦r\5ECjñ…V>;__C³Ø½Ùë üºMÕà$’£ .:m·JG &Gpmd®"‚ûÔ¼À2²à{ãIÞÛ¤¼…_"9L5A;L©Òƒ¹Ã”¢™©¦¼Þ¹­¸`NT\øÃ·ÿòÍoÿ]t ôG{šÖŸQr !8ZvYÞÊz7h_3œÏÞ)Ÿµ—HŽ2BðÚ n•ŽÌ ê:kYñÙîº@|¯Þ`8ÙîÅg\–ð)/HSͤºTéˆÁì¡‹å¡Ë£Ç†ÅzÃõ‡×—×W¯Þ_ß>V²ìñ¹¤Þ`NŽù ³»4ñp/LÓ’£ì1m·JWÈMœÙ#²ƒÅg•x*‘CïT#í½1Éaª‰ÚQL•ŽÌÅdVb°YmSÌBìÜ7Åz\ôa{%iÿ¦˜lS4º5‰ä( Ä  ìVéˆÁìÀ®åÍ!»òˆðPß’`]]ç B·æ ‘¦šY;n©ÒUr$0“jF®šzM¬ÅÑœý™`|tfôËfÿ™àŒ^{ÔR"9ÊsÔFz«tÄ`r¤×Å­ íì)H?29è^Θ´§*%’ÃT3«Ç-wÒƒ¹ã–¢CŽ«¦ZAºÐ:Ç‚´ À*.î.H[0&ÝŠƒHsÉ%êCEU<â09°ë,+ü•'þ¤B)õvëÅ8í‰7‰æ(í´F;V!ñˆÃìÁŠó\;Ÿ³.ò'Á » þÁ=B*á@t†™¾Ýíì²ÊTyæM¢9Ìæ’údQ8LŽßzÇ/×̦ÖÓ=‚µèŒòØ›Ds”v:«¯TñˆÃäñŠ÷Žkçc9‚Xˆ~wû—w×póêÍõõÓ=†÷ç—Cë‚eÕïöç6eP^)Òf“¨>&]Å«ÒÜ ®;É 1JÛ½=¸P²Û}¡Nk; t "ÍQÚy8H¤¿6#3³Ç3ÛµèåAœâBñëo~ñå—_û-×Ovkç|[[‹“ðl"Ú¹õòÚ¾ªÃa3„nÙA¤9ÌQ}(ºŠG&Gw}ây…ÜÅÒв´ÊÝ{›† hu+"ÍQÚ|‡U/ñ*7{ ƒ<¯À¦¼ân¡ÆŸo¿ÿôúãÛK~±o£Fa¼%ç³Q#…´µ×”ïÄþ$Ã'pÊçJDšÃ 4«CÁU<â07l‘u¼Ú#}.G܇¿ç>XWò–×^$ƒnÓ«Hs”~F¯¿óåN<â0wxc‘µ½–½¶×Bìdm¯§Å5Z¿MEXlè|=(•në«Hs”NµèÛa`&ˆO3®4ã¥}…Rÿ4#›Ê7DšÃ´3¨G1U<â0wSÔÈqí|fšñö#4$á“ (ʱÍ—¯Äî$Ã…l¼òPHs”y&«“xÄar¬8DVÉqO%ã^7”sÀ«e8è´¥£„áY9ÍiÓШ¾B¦ŠGfobâÚZͦëÖ»×/iF@ŸØ^ðöW3J¥›fˆ4GÙ!:m¼˜Ä«䛞óØaä]RqW—Ôý4# #Ìú¤ìÒÐÃS„ˆ)*×½EšÃ4´c8LËDÞ)í”Úá)"k…:_Oá‚qžÕ½#oŽz¢§X•J¹î-Òe‡ÙiÃ$q˜v{аËSÜŸÆæ)w2ŠÅµEÝÊ·Hs˜~&íH†Ä«äýïé'÷AÓO„?±d>;ÞDZüĪTºn‘æ ;D㵡a8L Ÿu:r:»aîü†Ÿ«/¬ûG¯F fÈ[5,™žV(6({‘æ(›³Aë%ñˆÃäXoÄÀ2x¹¿·aUGÌ®·GHåã”;fEšÃ´µã8L¯Dä¨|Ø·É#Ä,ÜG<³MN©d Û&'ìu)»ŒÊB¤9Ê]Ô†xI<â09Ä ÀLäÁò–”!uÕÆ¢àN9eiÓά¾2¼ŠG&_ 9®zëœ ß(¶E—,[Þ°»)/^Ey[¤9Êæ<¨¯×¬âUqr07ò;.Q¾ãòÔ&6%QH±ó޽–¿bŽY}ÁŸ@s”~£±xÄaòˆ%‚çúùœ…N?-J'óRlHÞd—å{Àv<=uJÂ8Ì6*oy‰³DPŸW"ùˆÅäˆn²Ì“}ÖÖî*’³Ý]…5h}О•‰ŽRÑhÕg²I¾ÊÂLÍ$›¸Š*6»&÷Òì )úÁLÉ4¬î0˜0«o‰•ˆ3Ť¿ˆ³ÊG,&G{S`·éRØsSâþöî-ø­à^ÞÂãòÑ!™è(«Ð|Äbö€&D®¢z·%Ü:röÞ¢uè·†×ä÷Ÿ—°ÎMrÊ#Ø"Ña¦ˆê3Ø$±˜úµåcÁ–!Àoá\Ö'ðnÁÖ­òbq‘è(MN= !ùˆÅÜMQ¥ÈUTñ¦oK¹¢ä—l_Glñ«V)#Q"Ña¦˜Õt’|ÄbrPy¡åL¨¡Œ¸!½6ŽÇi×,d¢£½z8Cò‹¹Ã™¢“ÀTDÍä­ÿ|ýá—×oÿßúῸøöÃͧ·ïÿtø_]}wùÃõ§}±ËË:»Ú·óËí­]׳=»jß¶$ÈÉgeO"e¨Ù¨Æ$_5Ô<9`ŒÆDÀ¸¥¦1öÏ;J†m×ÖU•ˆSÑ ì|Äbö`'2 µÅz(.Í)çžw$‡6òuäèóþ¼²A‡ÊW+D¢ƒL±8 uÀ˜ä#“ÆèxÞ!OÞöä]v\ÌùNÞ"ïbRÎŽ'¦¤Q=¤!ùˆÅä!Mv¬ÿ;{±ÿû‰ûeÿ×ÕÍû«ëå÷mØ1›ÙršsÙ1 ÄÈYäµ{mL…RåCH"ÑQVêœ:žLò‹ÉñäÌ ùySeVñèwËÂg‚²#‰SQÐßS^å#³G;¼ä‘-yìH<2¾$‡Óªž; hH<Š¥ˆÚ÷,$¢£LñpîWÙïä#“#Æ)ó.ø¼§¨qo K;Ðl5^IGNÙbRn¥‰SФq¥ÊG,&gÐð’†Ñ,i˜—’Æ’X$ðlö;áþ’†31áêpMQ&:ÊCÐÆ‹7ù* ?7^ì [6ëÍ3×’[F—/›í”Y8k‹Y×[ÈD‡©(ªŸX!ùˆÅÜáLQ%ÇUToßl!ö²oÐB ¶xù$ìß7묇¼nIC&:ÊcÐF‹7ùˆÅÜh±7Æ3S4Ï;wÄÈZÛ;³p1§;Ò'¦ Y=œ!ù* ùŒîL š¸‚ê €}?d.l™EÎûÀï´J9³‰Ž2EˆÚ€ð&±˜ö†m–òf×f©û™0º|³T§3 zïtk2Ña*šÕÃ’XÌÎg—Kyó²\êà-bÚZvÊ'aÿr)6 ‚²·‰Ž2ÅÚð&±˜öyà†{jU¸½Éý1@ò6*ãP"ÑQ*ŠF= !ùˆÅìM¶LE³^Õ¢{©Z@2y‰ ó¡ U‹ƒVéŽíÉD‡™bR‡„I>b17$ìï‡J»ú¡üƒË¥Nеì¥KÚ«e¢£T4[õ€†ä#s4E+«¨b?Tzé‡Z¼E2ù*†~(·4Nxíª…Ht˜)¢:(LòU²rOcŠÞ+ Z¹‘²aǹ·éÞCX.ý骨HtŒŠ‚1N= !ùˆÅÜMÑJà*ªç-Š’¾x‹Å[xg6<¤D» ÞÁgç•s ‘è0SDuP˜ä#“ƒÂv-£Òƒf¶tDY–äwóÙ‚V9·‰ŽRQëÕ’¯²Ç¦gRÑÀUT4¨6oáŒ}ñ À-­ÄÛ+^»ðöÎZdë`Vó>Bv˜9fýѧMBb294l-뢵r°ù™Ïøú/W??>te÷ R{è"»]PѓɎÒTçÕ§½™„ÄdöèÆñ\X^aóؼ÷­ƒÞÞ-cÞÇ|Ë×ÿûë/÷ï_ÿáþ¨wáºuݦ3õ.0ŸÞ+ŒÝ×øÚ1hïÉdG™iyK]Ìô !1™=öŽ-›.ïùÌ¡ÜËC<£Ìð€^«¦röM Ê4ަ©¡CèC“ÉC¬ÍÏ¥¦"?Ü^Ý4»ÇŽ÷u'ó^ÿÆX\9n¯$î_$RTL\cWe›•ÈŽ²Ù`õÇÃ7 ‰Éäh³s¬“Źǯm|æ]î×D'Ínt›ÏÑÇ`µOn!;LWc‡Hˆ$$&³GBŽGBòµÇüËûOËBªF÷âÝÙe+EGøbVï¬ßëOʘ˜¢W^MuŒì(Næj“°2±“ãÑ>°’‰{J&Üã(”¶ŠI§{åm[p^û"Ç1²ÃÔôÇÈ7 ‰ÉäaOÉ¥¸š>§lòÙ ï#»`|.>ЇÈÛlÇañÒ^qÐ!õ±q‘ì(ã×apœ$$&“ÏÞ²8ÎÛgmÃå>Âùþ>"”ˆH}wú1²ÃÔ4é‡2›„•‰ÜÚ4“š28Ë»Çà¬>‚òúúˆ™+ëÞ¡e›W½7 ©zòüøZi» ™ì({,¶—=c27¼l×äèAtrG܆½s_Ø£Ÿõ`QE:Fv˜%ýèc“˜Ì}ÍA¦Fòɧ–Ïz¡OõYŸ¶ú`m°Û7ÝNìû¦‡å¨Á]B¡hŒÇÈŽ2ÆÃm)Mcä1¸žÆ=Ö-r±äxùábĪ`· «Sña}áÉgåqïcd‡i*Úšz'ae’Ä9ÿ‰4Õ:®©MÝR·?¾þþÃí§WW«ï-?€=¿f)_´/0h Ìîf©¢Y6ÂrŒƒîU¾(²Õ¼1Õ´ÕŸI|Ä 9ó˜kðFx“‡EÀ÷€¼ÿà1óîö/ﮡÑÅœ_Ìg»½Ë—£)‰˜—»ÆÊÛr <ÊZíº‹SßZIHâ#Öôæ±ÖCK=<ÞLõps®ã”±7:¶¾óòID£].€ò(•u¦KT´ I|&Š¢ãy·Ü‰ò˜ƒùóÕo¯n~|ûúê¶5‘ñöì¼LD³|0¶w`wwa‘ÎHº»M <Ìd“6¬ý!+˜ÙN‘Å„IÞ%¿#‘‰Œ2l[±bW/ë.<}••(RYo»F›ÄgòÀ(Eà*ûØŽ,ÑËüÇ·_ýâãÛF“ÀŸƒñ˜m0Û(H ¡ÑÁ”ŒÈ(/Ïz€ò0kM=€m&$ñ™ØN¼ÈŸöùªÅ$VäïX‹YÞyN¾O#Q¥²ÁuЉª•=&âÕþÔVíÿþÓ§—íæüªý€åS¶öíЇ£ ([²æúÕþ#”‡™+vµ7!‰Ïä°6f®G®G´µ‘¡5§Êœ±!@F¤ YùÄÉ£Ì/håG/hëX~û¡ÍÃcÎ/‹1Þ~6ÖŸ±1‹±Þù¤¼ýëʃŒÕ•Э±V!‰Ïä˜6ò^eÜÛ«|o"†µ’!ëUîØJVÞyJÁ+/~€ò0•…>A I|&Š÷*c[¯òŸß¾_ºÉZ ýgجl|` KÊ;hkVNÆ™ÐeæåQæj}H› I|憴­ù;{ع8æ*L0Ù's6¸Ü¡Yùåa*›úE$$ñ™;( ‡SݤeM‹c*NÖšÄä3ÜóÙÆ’òRÓæ˜d–«*¡‹‹)²WúàÚ$$ñ™×†úËÃN˜ì^)&rÊJÖ$‹K(õw“¡“£ÚJæa'J†ä0N2³¨~t=&.P¥²`úÄD$$ñ™;&*Š¸Ê¶µ’ý×íëëF|:?Ì¡ ¬—,øØ’G•ÀôÈ`DÊì5uÁ´7!‰Ï䘶·À¬Õy$óî41ËIÌò×Ù$)RÙd;ÅDUHâ3{LäxL$/ÌÁ¼¿úôç·×«• ×óˆq1;CÃ~嘶‡¦¤É=†.eÊÃ컀ڛÄgrP;Xf¯Á>7‡Iœ2Þ7Ã.Æ!: ¶H&S¥²%×裲UHâ3yTlà*Û”ÃüòíÍÕŸ/¯¯—RL›— îüo²A¿•b‚iKdŠÎõóÉPf²¹ ®½ YùàܸvQž­Sv–bíÅãž$‘)ï8¥¸LrtPYò(•;S`T…$>“FŽ­Ó+ üÿåß¿üÍ¿þ¦±Ú¿öÜ™‹)Y à¶=&8h+Ƹ!§ë/Pf¯¹ ²½ I|&G¶£aQa4;Ê*ÆD{š†2—ÁyÓáœòʃTÖ›Ð'*"!+?yTÙÕ‰¢eM e_ÿù‡w)L´g×MèÑn‹ããR—iò/Þš”¬ëP‹‘)2ÖòËô0ÖMHâ39°x±?ì-ö?T‹ '*ö{k­Ïn¡6 I|&‡´Wùao•ÿ¡F28Q•ßÇT²ÆÐÅÃH”‡©,v Šª•Oš=(âU~h«ò¿¾ùëÇOÍU8¿:ÿ ’96[ëüÉÓ¥UY¦<Ê\!ô´IHâ39¤mùve»w»òg”ƒ=ÑvåòÎ1æ3—2åa*‹}‚"’øLY¾]Ù¶mW¾-}ã]£‡±ç·\&Ûå`—+— Ž9ŒLy”¹¦ØÓÞ„$>“cÚiýnÕyëá”Ì3Êy›|îy!¦èº Áwð02åa*›»E›Ägò (­;@éAümõ0·ß¶ïYgBÎÍÃ$k·‹Ë‡Ã¶yoLŸ 12åQæŠÐÔÞ„$>“ƒÚ‡ëïô †¯m(Ùê\OÔw`m#R¥²Ùô ŠHHâ3{PxP$ß}~JöÇò{6ú˜ÄŠŒgâc–¥Xf›‡)éo«YNiuh&“)3ØÔÖÞ„¬|`rX=3X”Ú´ÍìèþI|ŒµÙ÷h&“)RÙ`l§°¨ I|&‹0x®²MYÌW7·Å´f1ñ처ÅÃ,·”Ù‡£1‹ Ë­ÐÃÈ”‡™kêkoBŸÉamD¶cm´ÖšèÇ|ší—!Xm¥12åQ*k]Ÿ ˆ„¬|ììAQfC˜›¶_þöãëß~úmù;j>D† >/c–ªÝ¶š SÛÌJJîl‡z¿Ly˜Ébh›„$>³CÛëíza’C1¼còiª1ëu›=Ë2åQ*ë\ŸÀˆ„$>“FÉpxW>9ð˜—ù_W7ﯮÿé`ë—<'ãñ€[AÖ²Xƒ“Á’™.NF¤<Ìbst›„$>s£ÛѸ­©¬<µç0ÆŸ›‹Y-ívã2º5‘lp1¹dÉØc”_¦<Ì^SH›„$>sCÚ1¬•czÃצíýËvÀ“ä0`¬õFùeÊ£T6Ø.QÑ&$ñ™<* ÈÚR‚\3z´‹ìûë?_~l­ói†øÛÃ,7.ne˜e[L“‡[þazܸ”)3Wì‚ioBŸÉ1íà=3WyOÈ”,3Êa«sOã3×cÎR¦2™ò0cÍ] íMÈÊ'‡´£cÆbý‰2˜O.û¡z¨¬Dy”Ê‚ï‘Ägò(z–ÁDy à1ÿòöÝ»fÿýùå/Ë¿7BmcþÖc—û–2åaÆš» Ú›ÄgvD;°¡5wö)?pA¹Ûú”{¶‘•wžÁ¹þE¤YFÞŸÐüóãÓ.ÌDÖŠÜÙ„¥µ¼‹¾ ”‡ékêöÜ I|&{"oE޶"ïp#‘µŸ§ALˆl.?òŽãndÑ+õ¡–c”G™¥ój.$ñ™¡N¼¿&Éý5GÜÈ=Ä‹g#þ[+×}uÄëåaúŠ½Âž;!+9˜I_#××ǶVîÉF‚°Êû¬ÜHI>BNl429ßìF gýýÇÇ(2K:Ñ\Hâ39ís#NZ8âFüCm_îdn$• J½íëåaúŠ½Âž;!‰Ïäas‘ë«¢qÒEˆ³r#)X‡.lwÀœmw#‹^õµʣ̲¼£ŽfŸÉ±f4lòHCZ¨…ÖžÊ ¬÷Ý;è«@y˜¾æ^aÏÄgò°çЛIM?îp#ÅnÏÞÞmn$åØìF½êj ”G™e„^XóÄgr¬ù=>aŽþi †“¹‘¢ëj ”Gé+˜^aÏÄgö°‡Ñã£Cô{ÜH8{7âÐ×±MË£kw#ùPeéd–s œ¤^XsfEªÂfÇš5'x¼!øçÇgY7pJ§è^^xù® þ.–c”Gék²Âž*$ñ™<ìIÀ; ÓcÝÀ¹‘o~ý«ßsÝšBìÙô÷Æìy-$¶ö÷®jÔÅkH”‡Yaê-W!‰ÏäÐrvloxvßRùù“ú{³;Å!•õ…0I}FñåQúŠ®S”S…¬|ìäQNæÇ±³|»-ùÈÞžyòèƒ ÃÊÖµ&‹^éïR9Fy˜Yb'h¹ I|f‡–3ǰd ¼ÃÊæT.ÐeLD¢îÒèFÌÙcXÁ` ¬¢ŽØŒa­zÕ¥1K¢<Ì,s'h¹ I|&‡–sdnäÈ<óS³ËÈ‚½tr#èûô÷J”ék2¾WØs'$ñ™<ì9ŒöÓƒ¦³w#ÞdØ –WžáFŠ^õµÊ£ÌÒš^ÐòÄgrhÝ*Bxü~ãÏŸÖ˜•©²Xö@wÑWò0} ½Âž;!‰Ïäa&Âbzìxã7‚)»±Æ}v¸|ÌšÝÈÒMÔÔ(2Kg{aÍwBV>râ4f †µÝ—ÒØ_ãý©ÜÈr'½¨%P¦¯±WØs'$ñ™;ì)*š™¾Ê»ò›ÜH!&¬=/7â‚ys#`Ö«mmndÑ«> –@y”YzÛ k¾’øLŽ5g¶B Ì®ZÔF ¥S­ÐBt¹Ï´¡Dy˜¾B¯°çNÈÊG†‰¦Ñ×¢XŽë«Þ ­BììWh™ìSˆÀ>Í+´V½ê2m(Qe–Áõšï„$>scÍ`"w# ´‰±P:™ÉÖö™6”(ÓWèöÜ I|æ{Šbq7šnÎÞXtž%)‡cnävq#‡_ýý××ë¿û®PüMQÍŸýÍüýg³¿xÿóÿn×µ´ß^]Þ¼þþ_ß¿)_’›W?_þË…ýþíç¯ï¤¿ûEè/óÐðü݇›w—Ÿn?ݼ-¶ö?~þŸ‹Â|¼|óÊ«Ý~ôð1¢Ÿ,÷òúÏ~dsôcß.ÿêgË«{*ßúE"_¿ó$~ûæÓ÷k~y]¾%åÏo6"Ë•sYß=ýé}ÒéóßiûP?ð3ðÙÏ0óØléðïîÿèsæ³&K£ýåöo~ò³‹âüí‘bTQ(Žù†§ŒI;渎èOk,]ëk”ÜkàÑY¢…Òktš%²Þå>>‰ä(ÍÌê J•ŽLV,:ä¸jª… ±S…bD±/˜Ðê±À\>Gþîó3«颙Éa‡ÚEê*1˜º:]tÂfq~Ï`éñijPb ;%žÖ/›²•Uó>É1ªYâuuh¤JG fSË|ÊÿyõǼǽ«2 ÷mê4ž‹÷È<÷n÷Ô©ÍÊW1%’ÃL4kצ«tÄ`ê¢4”pÍÿ=ìié~(•@6­×)•pÖi_Ž‘HŽRMëµ›*1˜<°A—¸j>§{›o X”sk=› ˜ó†H.«ã^_àÀi¯Ï”HŽ28g´ ÌUºjpòÛ<9þ=ìi¨;~°²„Æw÷ëeÕ¼Or˜jí0¥JG &S g–IÈM¾€_º;'_° €–—‹i¯/ðË¡ÝVk‰ä(ƒóFÇ­ÒƒÉqÜÃn zqܧæ–‘]ÖWôõôÞ&åS`ÉaªµÃ”*]e&S²®šâøX[‰!;¢Ã¾ý—o~ûï¢K ?ÚÓ»°þŒ¢{ðl$¯§Ì÷õÀùìÕ-@K$Ga°ÚÐn•ŽLí"0håõ€O­:pÜ(u/A—Ì×åviä0ÕŒê nwÒƒÉCLŽ«æc%h±êpýáõåõÕ«÷×·;`¥”Ï1•HŸÁJ°»@Ñfíáä({ŒN}ŠúN:b09Ž›+1dùøXC‰!Çî% }ÖÅ•DšÃ”ÔKÔU<â0y “CâÚ©WeÈñüª Æ[ôlø/ûÝU†E‚Ñ…–Dš£l¼z͹ŠGfGsyò»’‡{ `¸IÀrµ=Bpë!)UíhÓΤÞOWÅ#“Ç+Àóx4Ø/A:ûɘ¥'ɱ„`ÿ€¥-~&+7ˆ4Ga Ú/‰W9Èw¦1Â%­ù;{Pª?à:˜ÙÙE$ƒëv]í¼Os˜v¢zSÅ#s0KZõS¯±o/.ÂÖ4×Wö×l‚’Ø)=H4G!õI£*q˜çEÃú˃èÐö>àºÕ¶óàCI’ÑÝC,Ò¦Y=€©âU8{ã-ÓN¹×¶ÑEx<•‹˜¸J½\bt··²Ž^îô«R)7H4GÙáa¶¾"ã07¾[¾‘Ù!îij½ŸH£›·@m)ÜwñÙ”ÔGyBN¢9L?³zSÅ#³G1˜™~ÊãB~"Ÿl+äÄ~›’Oæ'ÒþÅ¥Ò}i²Ck@õ­â‡ÉQߌ¬&‘ó³Ö@ò*uî¿S£$Ë <ý Ò¥Ö¨G1U<â0wSÔˆ·cgÅšDÎç·VÃÅlü†0Ûß¿VcóU.SK4‡]ê3m‡ÉQ^Yê`å¶ÇýKh¡û<œÍÉXå!‘æ(ítV?`¹8̰…d‰ƒÅÄÁ©‡y\B0ÓvD mØ=çŒ/ ºei‘æ0£Cõ é*^å&Gu-›=*{NW=0öP½]‚+_´ätk"ÍQÚéút8̰8ôөªZˆêPÕL.\´n{w» P·À Òft¨ à’xÄar×ftΈF×%8ƒý],Ëp´µó>ÍQÚ¼zÀRÅ«䶃™´3pí·C¶¹gí9º³Ý¼-.a…åö¹çpm€Õ4:‰æ0£ËÚh-‰G&GkO¼Á®‰·p¯æÌv²y³z“Šª—¨Gy¯žDs”~F¯²TñˆÃÜ!KQÉÄõSí.ú¢¡'»‹>sÍ9ãp»È ~ÿiôƒRév°Š4GÙ!õ—U<â09„{X3U¬ˆ.4 IëÉÅΩCŠÊ¬"ÍaÚÔ£˜*q˜;Š)jä¹vŠ¿m[êàÙ°sJ¢Cfûvwê€MPF“$š£Œ.Yu·ŠG&‡p]âhRÚƒ&=ІT(õG“JŽf•›UEšÃ´3ª,U<â0yÀâG“ÒsФϖe C–Ùž‘G`çÐÁ~0 ÑGT“$š£l:‚[Å«ìä®ßî“Ãa͇J}!˜î©åUVèjç}šÃ´ôã•;ñˆÃäñJ0ŽkçsS?÷Áœß6½Å#¬Sdú»ûR]Ù:ݾT‘æ(›ËN¾­â‡¹áÛâ¿Xæã³.¾!# ÛÅ7ìärù¤¡2l$ѦI=^©âU0{¼Y¼²î‘~Ð#¿{oÅefg¶ê´»ï½ycDåÅÝÍAêŒWßÜ]Å#“ãºU§ËƒÒ>V ý÷±–W)êÖ¦EšÃ´3©ß©â‡Éƒ›ÀjÓåAmkÑÏóÛÇl²¸]úÁ°«7Ëj Ý:´Hs”ÍÙ  ë’xÄavX7°A7'ï}zò>VÇR Ù’ ×)©(1fùhèÂL"ÍaŠê1K8L³¸À:%\TvsñeKƲ¸Ûùè6Gáüþ-«Ri…“h޲Ãò5ëa‡ÛH´;¢ÙóØaLl«Y”79?5w(–Ç opïj’=#û—ðaN”„Hs˜ ¢ú=é*q˜âÏfäÖd§½8Yᮊò^Vc\R¿ü#¥ŸÉ©/ë&ùˆÅìŒ\A—.A8ÕÒ¥¹±%»ýŽMÎ=õ¦ÃA«”ÿˆD‡™bV_áMò‹ÉaÞÄ·ó¥]ÛùJ&Rÿí|ÖåäÔ‰ŠDG)(zõ-Þ$±˜<˜I|A_ztA—øçë¼¼~ûÿÖÿÅÅ·n>½}ÿ§Ãøêê»Ë®?½z}ûô $ÙóÂv3?6 û7ú-:kw£²¡Þ':ÊP³Q¿çHòUCÍ“CÁù¶Ö B©ÿ —³úN?™è0 ê¡ÉG,&uBæ£ØÞº¸(¿ÚŸn.ß}uùéòââßÞ¾¾ùpûá»OÌÃ|yùúû«òÏ×?^ÝÜpûʽzóǧ;”Ïq†Û¥Äú£BÃm¡’ÞXå{s"ÑAöêQ?üHò‹É‘ä”yä—÷Œq?4‡‡Æuw(Þù’û);‘è0êÉWYÈÃm3)(‹xPÞ<ÓæPþ¿ø¥Œ_ñUŒøEø%|ýEþ'ÿå>Æü‹_†ìÿ^¼Mq<æ/æóÿ »|šx–>Ø xÂ݃àwÚª[H‘‰Ž2qkÕ‘j’XLŽT§Èᱸ{¨û*Åþð˜w1€ò0‡Lt˜‚Fý ©ÊG,f’ø®›$ïº9mR“àüP²%âG´SØ’yoh£dÑQöZþGß^ïä#“£Ú˜ÙÄ9ÊÓÇ |dÐt?‡’|ðº‹Id¢Ã4uˆxîä#³G<9r}là|J¾Ì/ÂékŸ¿Á}ýÅ?}éÜé—¿LÑ~e¿´`¡dv—Ê 4>d|,~gG)û}Pð•wžÈDG™xú@x•¯²ðsá%ãßbÆnOéßßÛe]ÇZþm//”c¶ Ür,¦¢¨&UùˆÅÜaR:´ÀÒÃsö°ÿô¤ŸÛ"¥óm9ö˜bÃ> ¬¬ÿÔ–ãƒViC`ÑQ¦ƒ>d]å#sCÖù°Äµ>ÈŽýX¡ÔýªŸ >AŽÊ‹Ht˜‚fõp†ä«,pîp¦h’ç úØê“=ËW_ý2&ûK÷Å?}ñ‹’½|õ:Ä/ì/ò/|þÒÿò«_8•Œ%›lÎ.cñ&¤§åK³û† -ñ|ÊÊBd¢£L¢:ÊMò‹¹Qîl|d&.ߣÞ_×Ï&tŸ¡/ïÚ9c•ëú"Ña šÕƒ$’XÌ$y$É­Õ] ywû—w×þf¹²Ão„SÙOã7ÐÙœü¶‹+·{®¾hXÉ‚•w6ÊDG™eu0›ä#sƒÙÙ:f–V® =y¿o`tý–¼¸^ÃõlˆN鉎RQ4ú¡M•XLÚX﹊¶.nüõ7¿øò˯¿ý–f+ãÜù"]1bÚð–å“°q£ ˜´»‡E¢ÃL1©ƒÎ$±˜tÆÌkóyWmþ¡‘È|‚Ú|ÈKĬí+$¢£4[ýp¦ÊG,ægŠ&E® íµùo¯.o^qqøƒ_|üxýöõênYfR~xaO9Ê¿¾sõ—‹‹õW7_¾ýeáUþx»ÊÿºW~ûæé•˜lÌ©ÐO“º$ÂruûKl(ÒÔV¹ì"fë¨jWù*‹49ªm‘A^÷@^÷RËÈfaQ«¾3ot7 ËD)h0N?Zªò‹¹£¥¢“<·–'5•è ±—VÖi¦m½p¶iÿ +9Œïkš¢Ht˜)¢:úLò‹ÉÑg †™"b19â츷p»¼Å½äd7gÑé4ny×RVn艎RPçõÙ*±˜<œqÜW8M_á^|ÅR)ÿ×oͿٵùŠœ¢vó¯Ht”)z£Ž8“|ÄbnÄ9; Ì­x0¨¡ù×-ÉÎ%‘Æ‚ò=+™è0 úÁL•XÌÌ8Ì81˜Yyóöæ!ÿôy3—sé>8û]YÚ©ƒÝLfgpwE$•µFå’ˆŽ2õ`Õg’XL8;VžÏGwï/”ú—çcrÚ£ó"Ña õƒ¥*±˜=Xbåùò0Yy>ì,Ïû3,Ïç 1"sF åùUmƒòDŠHt”­G§gWù* ;7žØ%Õ {£xDÜB- Ú½b"Ña úÑR•XÌ-Mb«Psz,1zºc(ÄÒ ˆ–Bñ¨ëb‚úV"Ë[ž ¢¥Ö«òº¦(eŠàôñì*±˜ÏöÌW”‡=¾â^yž\ü)|:ÈAD“ˆSФÌTù* ˜;˜)šÄ@4¯è+ ±_ -â6 QÞJ“¯À˜“Õ.ÎKDG™bòúxv•XLŽgûÀ@.ž5ƒbÓe·‹ºµr-¥Ä YHD‡©hÒgª|Äböp&D®¢Á\{¼E<ä4±·Xn†€[yþ°6w¯·XµJ»b1{°dx°$w^ŽóEqgy>Ax‹A{æR$:JE½Õhª|Äb¨Rä*ªØ'›9™Ù[ Í9³•Å[¼ÅªUÊE‘è0SD}L»ÊG,&Ç´#o-Ž»Z‹l‹¬·¸£·@Ÿµ·¹ˆDG©hpúM•XÌÐðæâ¨Ù\_š‹—A[‚ܰQ±¥¹¸hU0F»*"fŠYt®ò‹ÉAg¬DaO‰þþNaæ-ÖûaݽEXÚ,´ë"ÑQ*½~@Så#“4Yú òÄcnOU0ŸÙ[ø .²ÛYàsƒ·XµJ»n!eŠ`ôAá*_5E¹Ej"Sd7¸ó‘ÜOÞ*ÌŠèàÙa¢nUôœ<:m$J":LEƒ~@Så#³4¸ŠŠéo£·ðþÅ[$ã#X¶)lhð«Vi#QÑQ¦˜Œ>(\å#³ƒÂ|%îªrß[ˆb9YV¶èä+Ð8çµq(‘è0êá ÉWYÈéäL Ê«šc‹ñ¥Æ}r·Ž]s-5îE«‚6%eŠhÕ!a’XL §È á÷l è¶Ub~G_!+£P"Ña Õƒ’XLÌ”OWPÅ ô ^6Ð/˳bÚ¢ÛòVBÃz4˜²6 %eŠÙ©Â$±˜N†¥øÉb1{8cy8cßAOs‡i ï..®Þñ»o/.¾þöë_ÿû«7×ׯÞýðö˜[Y]Ê—ßüæ÷üWØJáñL&0‚ ÙzVÊÈû7Ç£³ÙhßÒ‰2P0^&&ùˆÅì01ò¢¢ÜÓõÔ.)ÇɲŒ^ĹdÕ±)‰è0MúAN•XLä?ö ò¹ÑÆ:F~Á¦ 8èòØuDH-ؔõoéŠDG™¢ ú0q•¯²ð“ÃÄhØYk”o¢4`Sh…Ó>ê¾õ¯ŒˆD‡)(vf_),&fp=DbnÔæ+Й_±Þ]÷¬C ×V ½¾ÂÇ!k×1$¢£L±$_ê¦Xå#³ÃÄÈabaâ–Y½Ä‚¶ný´lí=#"Ña*šõÙ*_e“‡3 ‘©h6Š•Œ_¼EÉ,ЃÙ:¤R‚o±j•v%C":Ê}Ô‡‰«|Äbn˜8żnåAümx wü H³U{Áp…ÔUPè0ÍúáL•XÌÎL\AEÏÖä+ŠŽ†_‘¼s>në S\Q¿Ý¾­Êg@D¢£L1€> \å#SÂiYÃöwöð¬ý…[f±:ÁŒV[UE%¢£T4ýp¦ÊG,¦gUŠ\EÕj…˜}©Yï¢Ev4*疚ŪUÚõm‰è0SLúp•XL çÄz¤Jʯ…Ce<Áëœö¤žHt”Š‚Õhª|Äbê€fQ%Ö#•Qq HÆ—- Ë%¶Ûª¶€´J»Â-fЍ Wù*‹45$\Â+ïXàæ÷ÌußË-‘ ¦?µ Ñgåm´"ÑQ šœ~8Så#S‡3‹NWPµ©îEG_¦º‹¯ˆ>lSÝå­¸†©î¢G)v…[":ÌQ®ò‹¹!á’s² y—¯¸×9ËV€dæ+zmÁ¼SŸÔ“ˆŽRPôúÁL•¯²pS3‹NòÔ÷Q_qâ;°ó¨S>™=Ó>Ÿ¤uHLô™á\Ü=uŒcU[íºDt˜­g}ĹÊG,fGœÁ³¸Pž Û}a°PJöÎ(yõÄE":JA³×–ª|ÄbêhiÑÉÄô±úÉÑŽ£N‹Y0ð÷<|šu›.nï Æý¾ ¢×.ÐKD™z:TþtM½ÊG,fdz [¥›åû>O]w…Œ¬ýA´¥sN}¤P":LAƒ~°Tå#SK‹&±™×,—‡ .öe‘îRp ΰ‘BÌ ‹tq‰ÁA»b19žm# ­|:÷©y +¸X8¯(~Îj/]‰SШÌTùˆÅÔÁÌ¢I¬ÛÐʽ‘m—5˜>{_aÑú€[ZaCƒ¯ÈÎަ)ŠDG™¢sêx6ÉWYØ©ñ좖a\Vžî}òA§ìa·¡\6÷ZW’s ”“rn!¦¤ Ð|Äbö€Æò€F6©'.¼ú_W7ﯮ—ßw÷Ö«E§7ˆê\¶^¹âJ¬c¾Ä쇨V…ÓžN‰Ž²RïÔÑh’XLŽFÛmô·<È£¿-iÇR2ê›v8cœ]§ÿT&:LA“v¬³ÉWYȈ‰4;® bsIcÚÁŽŸoÚ¢ÛÉòA0»ÓŽ¢U1åÙt™è(S ^-Þä#S£Å©|9XË¥³{&Hê v,@ëç+–>:Ýù™è0MÚÁÌ&±˜<˜qÎ0ujó# ±—ù‘ÕWXÏz‚Ù??â–\0*ϦËDG™âሌ®)VùˆÅÔh1”4ˆõ#îé ÷!*F7†Põò–ÚÊ**¦¢¨ÎTùˆÅÔáÌ¢•ÀUTñ. æ— ’eõºµÀn=•¢Á[,ZtQ(™è(S„¨oò‹É±b—Vìä¥BO¾ßÙ*o¶ò·‹¦ÓK^”]PÞ’(¦¤Y=¤!ùˆÅÔ!Í¢K¬îåÞöì›—8$ï3`ØŠ÷Àï´J‰‰Ž2Åê 0ÉWYÈíG™¢ck…ŽÔX(Ïî9÷B¢lrÑj#Q"ÑQ ŠF= !ùˆÅäÍ¡´Hj%þ¶¾Â˯H!šòÂöVÖfƒ½¾"Å”µ‘(‘è0SuP˜ä#³ƒÂ‰]zÖtºµŒ.2$ªÓµç:íÛ€2ÑQ*zAPUQ’¯²'ofRQ^X“W³5Ö-ð‰*™E6hˆ9-‡†÷{‹U«´‘(‘è0SLê 0ÉG,¦…K ™)úø¼K²Ÿ!QN€D• Æ 6%¤¤%òWiH>b1yHãÕ¹=(Ö¹=¼Ô¹—µöË¡ˆ­'ʇ†:÷A«”‘(‘è0SDuP˜ä#“ƒÂ.ðÊExÖˆ÷gþÂÅST.‚OY{åˆLt”’Z§Ô|Äbò ÆEV¹pò ac~_*‚Gkë‹ò •‹ƒV)£Q"Ña¦˜Õa’XL î–Ðó*Ÿù‹ü üÅ¢ï”g.D¢£”Ôyõ †ä#“5Xõ"ȇ ÚüEH/Õ‹Å_¤åî×öVbCõâ Uº£Þ2ÑQ¦xh¸è`Џ™¢Ük4‘):†G÷,<Š­3 ~C£:­3,ï:ûh”+Ý"Ña Ô’XÌÐx†E¯ˆE*,JôûüƒÖ]qgµò,Cžž6¸}§Bº:d¢£ì.u ˜ä#“cÀ!sÇŸ5ŒÇC4'p 1f£]Ô‰SШ¹Tù* kœGA£aŽ!EÇÍy:†ÌFï68†E…´+Ø"ÑQv­:ØKò‹ÉÁ^¬"áqOEâø5ŽB)ÇþŽ\I…•«×"Ña õ#—*±˜b19ª‘dòuÍ–ŒñŽ!›uƒ¯®‚ D‡)(èG.U>b1yä1pÅŒ!Û³t À;ŵ~¯cXTH¹&-ewÉëC¸U>b19„ ÈŽli¨1Äû;†#hï‰SФ¹TùˆÅì‘Kˆ\AÅü¦Ñ1,]žgè"[×OàNǰªvñY":Êî0èC¸U¾ÊÂO᳆çY3Çl̺›c(Z®>f-¦ ¨¹TùˆÅä‘ ð1k㆓YÏåKDGÙ]ún•XL áBÆ@(–‡=(ü¿1v?²ZÞ5B²ÚÅg‰è0Íú‘K•¯²ËJ3)hâ úØñ‰';†EGÃÙ9†à|ò”1”wàwŸ“8¨Ó.>KDÙ]6Q­ò‹É!\äã GVƒq ùŒÓ 2†Ý:t§ª Ña šõ#—*±˜:rYt’e ¨9Ú€'m˜Ë1X–1`lÈVÒ.>KDGÙ}·ÊG,&‡p‘Ï1à®9†‡ $<Á›’öŒ´Ht”‚:£¹|ÄböÈ…Ï1 æžáÃâ¶®Éòæ*¤\|‰³»¤á’|Äbr7[fwÙîéJz(cà÷çû9ôëòY]ˆŽRPoÕ#’XL¹d¸‚*v%ew~]IÅ1²U|ÙìïJ:¨rñY$:ÌîPÂ%ù*‹45„›Lâs i×ÃC]Iés `—vKåâ³Ht”‚3VWÐ*±˜¨rñY$:Êî’чp«|ÄbnןY@&oTkÉBêï|ˆëNU•ˆSР¹TùˆÅÜ‘KÑ$ÏTüm3†hÎÒ1ømw1»ß1¬*¤]|–ˆŽ²;´ún•XÌá†-S7)Š™z¿cÖ£]|–ˆSШ¹TùˆÅÜ‘KÑ$ÇT<^ØXcˆù,ƒMÀÌßìw « iŸ%¢£ì.;}·ÊWYع!\k ÈŽÜwÙ%Yëû¸AH°.ñÐUPè0ýÈ¥ÊG,æŽ\ìá¬=¨ ¸-:z–n`¼ÛÞÝ?àvP!íâ³DtŒÝecœ>„[å#sC¸Ö°eåaOñù®$kò ŠÏE×MÒ.>KD‡)hÒ\ª|•L¹äÅç¬Y|ÎgY|Žˆ¸½ƒÔP|^Tµ‹ÏÑQvg½>„[å#“C¸˜ÝÙ´Jz0cH'€’ ¨µöÑh‘è0Mú‘K•XL¹Øä¸‚êAI…ØYBI1Qຘ”´ªvñY":Êî\Їp«|Äbv×°¦$WDžz!š×ì ŠÏ¼ÚÅg‰è0EýÈ¥ÊG,æŽ\Š&y® zÅg³®®9CÇÆ0óo(>¯*¤]|–ˆŽ²;õ!Ü*±˜Âõlã@yPš|.”N0ùœ<jŸ%¢Ã4ëG.U>b1wäR4)pÕ›|¶ëUÓ3t Vö”wà&ŸWÒ.>KDGÙ]}·ÊWYÄÉ!\ÇKËÞ{ AIë­ëÞŽMpN»ø,¥ ÑèG.U>b1yäârä ªwÁzs~÷Çà·›ÏÖáþ{ Ò.>KD‡ÙèC¸U>b19„ë³;/Î-ž`À !¯-‡º *¥ `õ#—*_ea&\Ç'I­ôÜ ±³p‹¶â³‡†·E…@»ø,fwI­ò‹¹!Üåž Èä6ñ†®$¦¿cÈ>º¬]|–ˆŽRÐdõ#—*±˜‹DG)höê‘ ÉG,f\\à ªX|þ ‹ÏËäp vñù BÊÅg‘è »³Æ¨C¸$_µ»<9„ ³»h´¶«FÛÀ-Yo³Q.>‹D‡)hÐ\ª|ÄbòÈ%6h­â€[´g8àf—%8[!äýnR.>‹DGÙ5ê.ÉG,f‡pY›xyسã]IÖ¹þ+1’Í)xåâ³Ht˜‚FýÈ¥ÊWYÈW”gRÐÄTq%ÆÚ$r†ŽÁ³7gö¯ÄXU((ŸE¢£ìî súvG§óò±Oí¨rñY$:Êî¼Ó‡p«|Äbr7V|Žò8^CWRŒ'(>{‡ÑjŸ%¢Ãô#—*±˜=r‰ž+¨bñ9ÂyŸ p‹¡¡ø¼ªvñY":Êî‚ׇp«|Äbr<³;7;5d N%ùÖ»º *¦ I?r©ò‹É#ð‰+¨"”á,¡$ÈlÀ \”´ªvñY":ÊîÝáÆBÖäiìÎ@Úº’ÊÞ®¤ðÀ®$H'èJ 1GÔ.>KD‡)(êG.U>b1wäR4)pÕëJ2€gÙ•TÞávÚ ¡+iU!íâ³Dt”ÝAЇp«|Äbr7 È’¼ƒ¹!cH)öw ÑEkµ‹ÏÑa šõ#—*_esG.E“ØÎ–$ç7mCbÁË99`ni­bít ‹ 9íâ³Dt”Ý¥¨áVùˆÅän ¬¶·.äm¯1ØÈè²»‰K¾‡kð6Ù”·%ÉD‡©hÖŽ]6ùˆÅì±K®¢Š³Ï)žjöùßþË7¿ýwÑAÐíp‡ŸQrh#Ê-oųièßܼýñòÓÕcÞâN«tÓ™è(SDÐÆu7ùˆÅä¸.Zæ-Ðîñ¥èºïÉðΟ”+Ò2ÑQ šv8³ÉG,&gÐWPE_î ÷d Ñmà hvïɸS!ÝŠ´Lt˜Ý%m\w“XÌëÚdXE:É_‰†á†õÛÓÛ1E_§ UT":HA±ê‘ ÉG,&\’ᨼ°1‰°gX‘öÙ9ÖªywEzQ!4F_’‰³;ÔÆu7ù*‹49®› Ãu×9ÙöŒÁ§»uŽ/׌ú¸ô>zÝñ™è(=ÜéÖUÑ*±˜´\å#“CË9òL&êe2ñ™L.jntÇ.d¢£TÔ{ý8¨ÊG,&ƒr䙌ÚÉd8»L¦8™dUØshÈdVeÔà‰Ž²à`ôaê*±˜¦†ÄvîÙrïØ52²ìú vs19yå] 2Ña ô£ *±˜< t\Aw¬-Êgߌe¼ËÖF&ºv6cyãÍJDÓE¢£L1ZuÜšä#sãÖÎÚm–ª<b17ríŒ&:q4¬¡IÌNád²s¨\¿‰SѤUùˆÅäqñ<Ùöb²=ÚÉŸÎÍÉ”ø9%°,“YaͽNfQFåú½Ht”ç xWùˆÅ䀷óÛÊvçäSpOÍd‘ ›Ñõªß——MÔË$¢Ãõ£ *±˜< rÁsÕ[Ùî\<ÕÊöÉë÷ÔÖšîzß÷Öï}L¨½LE$:Ƚ‰ú¸u•XLŽ[;^¿w»ê÷÷J+ÜW°ò}?_‘MÌÚ˜—Dt˜‚fý`¦ÊG,ffxõÞ=Z½ßã+XÍý|}…3+8^…²¯Î{Ð.ÃKDG™¢}ø¹ÊWYÈ3ƒ™"/û]eøó V…ïæ+Bë´¡+‰è(uF?˜©ò‹Ùƒ^„wŠ‹ÝKþªÅî3û tË0ƒÙÞ /¦?ÝW ®s(º¦(fŠ "WùˆÅì(2[¹Rö *ÞÛÅ…œlîï+âRþW^è+¥ Þê3U¾ÊBÞn5“‚F® )îð†­I9[_Ö[¶8%óÅ)Oö1†àµ‹âÑa¦˜ôáà*±˜ö¼(îwÅ <«‰÷󸨶¶‚ DG)h°úÁL•XLÌx^÷–Äwø Ï Ùgë+–ëŒÁà–Wx^Ú~²¯€¢S ]Û–ˆ3EÔ‡ƒ«|Äbr8Øó¼ÂïÊ+î7PeN—-@ɼE°!8íê¶Ht”ŠF§Î|Äböp†g^3³ð/™Å²È$¬ʵd­RF¡D¢ÃL1«Â$±˜öl'cyxÖÅAžY°•Œ½2‹'£}VJ$:JAÁ«‡3$±˜=œÎ<º‘q¯`{Ï×WxãBf“žoV|²¯p&§¬ŒB‰DG™b2ê€0ÉWM1O{äa›¼m¸¡ºí³ïï+Ü!+£P"Ña ôƒ™*±˜=˜AÖÖíåЫÑWdxñ+Ìç‘ùŠšßí+R\!l]SˆŽ2E4ê€0ÉG,¦„!Åm·<ȃ¸G|…=>Æ·Ú ±Û_XÀVíú¶Ht˜ŠFýp¦ÊWY„©Ã™E•WQµ‰ ±—‰€KK˜¥íUË'¡aGâA«”g,D¢£L1[}@¸ÊG,&„Á²ò!ØgõÍò¡o°'X_‚¯]á‰SѨÐTùˆÅÔÍ¢J«¨bç,¸—ÎÙµf‘··¼ÓÐ9»hUÐ>V(dŠÁ8}H¸ÊG,&‡„#Ç¡â.ꡚE<Š3å) ‘è0ýp¦ÊG,&g"Ç¡Ž”Û|E|Á¡Ö»¶žÍ—·Ò„C--·Ú7E¢£LÑz}H¸ÊG,&‡„!°ò!È{Iš2‹p‚sP!ú´oŠD‡©hÒgª|ÄbòpBä*ªØ ñ¥ ’Ï! ÙzgÁ·tC­Z¥]á–ˆŽ2Eô!á*_eᧆ„K  ‡Š°‡º×;[~žÞ€¨µ?¬‹¿ˆÁåìB$:LIQ=¤!ùˆÅä!Mäk˜£¼†¹1»H/HTñˆÅgl»¡bl@¢Z¥\剎2ÅC£XSDÆbvP8³îÙ#ý[ QÉôïž`µnˆD‡)hVhH¾Ê'hJò0P›¯Hæ¥{dØNÆ:À†îÙÑFT®q‹DG™bˆê 0ÉG,&…ak7YÄv“†ªÅz¦ª»¯ÀàµogˆD‡)hÖfª|Äbö`&WPqÉ@#…þÅW$kýDmoeÍãöúŠdÓz¡QÕ%¢£L±|ØÕM±ÊG,&‡„“c+=“ßÓ={/¯0Œ¬ßª‡¦—¯XNuªçÑQ F?˜©ò‹Éƒ™äWP½ûâ…Ø©zgE/±Ï?hÕ³K®£cæÏ:eŸx¸bÙª ÚãÚ"Ñav—ô±ß*±˜ûu,Ÿr£ÖS—N6÷w ¸\¨ÓN"$¢£4YýÈ¥ÊG,&\¢ã½yòEËÆâ„?U1{*ÇÛ:‰ò¬ßï0 ÕžÍ‰³;Ôz«|•EšèÍ,cX»ÚÑ%Þç„æóv1[Ÿ´w‹DG©(:ýØ¥ÊG,&]Ð8®¢Š9š—y»º&Ì>û$4ÌÛ´J»n-fЍõVùˆÅäPoJì¼X’·ß>µÏ‰×­Ù €nµˆ’¥…¬/IDG)höúáL•¯²p³‡3)qÛF| ˯@ç²ã›<Ò ºïö);íÙl‘è0SÌúPo•XLõ¢cÃL(Ï{4Ô­Ñ÷¿• Æ:ã•!'‘è Æ«3$±˜<˜A﹂*ÞJÅðr+µø p6šÀ> ·RÁÜ a蚢@t”)Z£Žþ’|Äbrô7dÖBòž;ñ¡ÉlÓÿN˜’iOf‹D‡)hPfH>b1y0 ð1Šw*¢y¹S±æaëq Øp§lùÐiOf‹DG™¢³êp0ÉG,&‡ƒ³g•Â,™ ³9ôßâ6øÕë*¨@t˜‚Fý`¦ÊG,&f²g‰o–wß¶ùŠ^¶x@²1f>g—]ð)¢ö\¶Ht”)z§“|•…Î|?`Þµð! *³õ€Ý|…[¶¢*o‰SPÐfª|Äbö`†oÌšÛóËvÀC^ñÙÆ§Ü²\°Á(×¶E¢£L18}8¸ÊG,&‡ƒ30 j½Ü§“W¤`P.-‘´T :LA“~0Så«,`ö`&ñ`&)bP9½`P€6ûฯˆ-”7°žER5E‰è(SŒ^®ò‹Éá`ä›dtm5ôAá 6É‚÷Y}œB$:LA“~0Så#“3È7É¢æ&Y|Ù$»\4²fÉ5··Ò²IüRèЮmKDG™âaE¥²)ÞÉG,憃½q[ûúr4Q'¯ðÆ÷ßßÁD§½P$:LAQ?˜©ò‹¹ƒ™¢“ÀToGÑÑ—ý‚ 1ÙÞŠmØßQ>sh¬vm[":ÊSÔ‡ƒ«|Äbv8˜ïÌ»ö>P¯ðæ{!$“P»¶-¦ Y?˜©ò‹Ùƒ¶°<èí,Ä^öºÅ;°Áíܲ¢ñëZUS”ˆŽ2E}8¸ÊWYĹá`o¢g¦(o1lÉ+ ÿ,,µ_«]Û–ˆŽRÐlôƒ™*±˜;˜):™¸‚êÍâ}™Å´É[¶ýÉ›Ð0‹²AíÚ¶Dt˜)‚>\å#³ÃÁü>îºOqoý¯WÀ ú ÀXŒÚµm‰è -¿Š~0Så«,ÌÜÁLѤÀT± _nS¬¾"Y“¶žYl¹Mà8íÚ¶Dt˜)&}8¸ÊG,&‡ƒ-Û7^´êöûÆ–«]Úµm‰è(µV?˜©ò‹¹ƒ™¢“ÀT±^a_ö¯ó°ØÞJ˾qHÆXЮmKD‡™"êÃÁU>b19lÙ¾qowí¿W¯0Œì ö—wœz^!¥ Îé3U>b1{0ãy0óè¾ñ‹‹ò«ýéæòÝW—Ÿ./.þííë›·¾ûtqñíÕåÍëï/.ð‹¯ß¾^}ÂíÅÅÝßåúà ûòŸ¾ýëí§«wÿúþÍÕ_..Ö\Ý\\|ùö—…WùcSì¼ü¯õæíÍCþé›_ÿê÷\v;¸«{Ó>—¤äŒbˆÞÓŠ¼å‹³Å9`†Ú—Dt˜©g}¸¹ÊG,f‡›qƒʃ!<µ'—ù"“]_T^¯WŸ —ˆŽRPïõƒ¥*±˜b19ží óס"ÍÙÐ=qIƃú¢\‘è0êÁ ÉWY„Ùƒ¶E§<ª[å«,üܨ®;¬T¥ñÃqÄY„fCÊý}…wnÝ墪 Ña ŠúÑL•XÌÍMŠ\AE,¬m&0 {ñ%œÍÙ!»¹´îãßë+|ŒÑi—¨%¢ƒL1™ ôVùˆÅä@oäÀ¸ëŽÆCíLñw4’G\Q]ˆSЬÌTù* œ;˜)š¸‚*æñåŽÆ:¯MÄ–;©Ð0Q»l-eŠ6êc¿U>b19öØnôò°§lýÐÃp‚Ýè)DN»8!¦ Y?˜©ò‹Éƒ™Àv£µR¬Z‡—Ýè_a·F›òVZv£§€³v![":ÊèÃÁU>b19['åMî-yE8möQ{LB":JAý'º Zå#“3‘ÏñD9MoÌ+â µúŠÜnµíè[0¨ò.­Ó.nKD‡™bÒ‡ƒ«|Äbn8Ø^Ü»ŠÛÜ\*”N€AE,A§vm[":JAƒÕfª|Äbò`&ðÚvЬm‡—Úö² ¤d™Àú BSmlЮmKD‡™"êÃÁU¾Ê"ͳ;åaχò 8ÁÑõ‘:‰è(N?˜©ò‹Éƒàw4@ó޼ÜÑXzf]²ˆÛ”]l¹£‘½3Úµm‰è0SD}8¸ÊG,&‡ƒ#ßwwí»½W¯°Àè²…·KA²·(î>yíÌB":JEÁë‡3U¾ÊÂÍÎðyŸ¨¹ñ6¾l¼]P(Bb—4bËÆÛƒViW·%¢ÃL1ëÂU>b19 |ã-ìÚx{/³àÞØÊÛ~Þí)«¨Dt”Š&¯ÐTùˆÅä ð·ðèÎÛ=¹[@{¾Þ"„`q»ÑW> ¦Á[¬Z¥]ß–ˆŽ2E4úp•XÌ [¸»gPûÞÝ%î-‚ §ð)£ÑˆSÑ ÐTùˆÅäMp¼¬æÕ~æVÚ»ÿðêêÍùÕç|ùÍo~ÏÇmê;žÉÔ·w. Û5LÃÔ÷ªŒÚ…q‰è( ÎVK®ò‹É±ädØ!Ø$wÔ44Ü&Ûÿly¹.&møJ":LA£~Tå#“GAÉ$® Š‡`Ûqy¶ :·LëlÅÈ ‡`SÑí¸Dt)¢qúHr•¯²°“#ɇ­uõDÏöÔ&ªÏà+Hý’òz &å–[‘è0õp†ä#“‡3ž«¨ÎŒNH ™³KHB€;ö)±»’UQ¹¢.eÁÖ©Ð$±˜€.É*‹÷üžKL&$ÁuOHÐAó‰SФ‘|•L%ÏŠx)b19ŽŒ¼Â]àÕCSȰ«~¾b¹ì  ]ID‡)(ê3U>b1y0ƒºÂG¡«¾àt¾¾m‰Ùv[äÔ“}…3) rQ\$:ÊCÔG‘«|Äbr9…jžƒr%2ŒÊEq‘è0ÍúÁL•XÌÌp 51(|Á Š¯p.[Çò l \òÆ)ÅE¢£L1‚>\å«,âìppf-)?k³ˆád·IÜ^ç”üĪçÑQ ¦C0s'±˜<˜I™Ôòc›EžY/?¼°/ÿéÛ¿Þ~ºz÷¯ïß\ýåâbýÇÕÍÅÅ—oYx•?6ÆØå_½y{óúü„š­¯ð\N8!´,qIÈV—<µvLX2US—ˆ3uЇ›«|Äbr¸9{Ö+yä†HÃi¿ÌbÂn¾(@íÍ%"ÑQ Z¼†¾‚ÞÉWYÈí±)(_Ù™eÈxœ/ò¯þüöÍŽ\)‡SmK™È…h¬Ý¹²Ë ÎhQ[í‚‹Dt˜­'}<»ÊG,fdz3dzåÑü§‚hܱ°›3ŠËíF.‰è(E«-UùˆÅäÑò=o(ïyêŒnvKÎÈœjšeg„˺èL‡q¿3J9yí£ç"Ña¶Žú€y•XL˜'`8IÎãž:KÏ»ŠSÿ»"åÝ£>¸"¥ ÙéGKU>b1y´”€µ§$yvcWqz¹+)ÿXE'ņ»"ˆàPûºHt˜)f}À¼ÊG,æÌÐïïìAé^a¡ÔW<–< ´ï ‹D)h6^?˜©ò‹¹ƒ™¢I+¨Þ®ø`âË®x(¹” ··âvÅ—½öt‘è(S´FЮòUS”³ò‰LÑFfŠ2ⱿS,w‚¼¢h¹Õ¾ƒ.¦ A?˜©ò‹Ùƒ›™‚Ê›í}…{É+–M[ݶÏ1Ó’W”°;kßA‰Ž2Egôñæ*±˜o&YfŠIé^aXaŽÎ¾"cí;è"Ña Õƒ’¯²³3‰3òle£¯À—iEX¶ï[¤ÞÖòV aZ1›˜ƒöt‘è(SôV&ùˆÅäppæ]Åùy]ÅÈÉöÇ JÒæœöt‘è0êÁ ÉG,æfŠ&® š”yÁ  …eƇí‰ÏØ€AeëBÖ¾ƒ.eŠÁ©ÃÁ$±˜¶nëc)J÷ ƒõýïfSÒ¾ƒ.¦  ÌTùˆÅÜÁLÑ$–øZ¹ºÒæ+¬¹Wåÿ[m;XÛp¯0Û$kßA‰Ž2ÅÃyxeS¼“XL[ã˜)šgÝ+ä¾Âšþ¾¢ÄÇNûºHt˜‚&ý`¦ÊG,ff pÕ»VXtôåZᲈ7º ƒÊ × ³‹`´ï ‹DG™"}8¸ÊWYÈóy™bDfŠð¬k…ÜWœÀW,-Éʵm‘è0Eý`¦ÊG,ff€3 w«0¬KˆÏÞW`I$¶kÜË¡áVaö®|;”kÛ"ÑQ¦˜‚>\å#sÃÁ.„-l+{núã¾Â…úû Kú¬]Û–ˆSЬÌTù* œ;˜)šd˜‚ÆÇ.>ÝWbéÅW¬K"2un–·â±ÅW`²ÚWÐE¢£L£>\å#“ÃÁžç~W^±ÀLG ŠÄ"Øe@@YC%¢Ã44ëG3U>b1w4S4Éq UL,üKbqplÀÂ7%Å‹ƒöt‘è(SÌ WùˆÅäx°÷ž™¢|¤„ò¡ÿ}Ú°ÉÚÅm‰èƚݕôN>b1{4Ãv®•½û´a]Vþâ+rHk¡²¾×pŸ6G‹Nû–¹Ht˜)&}<¸ÊG,&ǃ=²Y'/™7%¹ÿ£ÉÚÇÌE¢£4ÔZýh¦ÊG,ff2fähmÎ"˜—g¬bá±áÆGŽè“ö1s‘è0SD}@¸ÊWY¤¹áà G¡ìê¡N(oOB…hµ«ÛÑQ êœ~4Så#³G3–ƒPV„²/ Ôê+Ý,„ BvÚ7ÉE¢ÃLõñà*±˜ ƹߒX„ØÍG†’Äi%‰ŽÒPïõ£™*_e!OÕ̤¡,õ=r_­1±ˆ/k>–C³Én‹àÖ|ädj%‰3ŬWùˆÅä€ppl}`pZëƒ;Áèv )j%‰ŽRÐàõ£™*±˜=šq+¨âèvð/£Û«¯ðvk… Á¶Œn'4^û(¹Ht”)F£WùˆÅäxpHlÚ)¤=m³'x‚¾Y´^ýz Ht˜†ýh¦ÊG,ffG3¨×7[ˆ½ôÍœEfåí-}³"j_%‰Ž2E°ú€p•XL;dÅC‡{Z¡Ø \>A+&í«ä"Ña õ£™*±˜<šq˜¸‚*¶B¹üÒ µúŠC¿¾•ÔÒ •­ ÚWÉE¢£L19}<¸ÊWYØÉñàèYñ0ú={>¡b8Áž\2æ¬]Ý–ˆSPÐfª|Äbò`&zà ª¸ç#†—=_¬º]Ëžœ ƒvu[":ÊÑéãÁU>b19 Û¢|Bº¡*ÚîûK0drrºÅm™è0MÚÁÌ&_e³3–íŒro£¯°/ûW_=m<-9FÞ¿?°hU ³nq[&:ʳ׆ƒ7ùˆÅäpp†AEyñhK^‘ºcPËe–è@·¸-¦ I;˜Ùä#³3ÀƒÙ³5úŠô‚A­¾x#TŒû1¨`¬Aãu‹Û2ÑA¦hMІƒ7ùˆÅìp0ßóávíùxàæv¡Ô}¢¼ë嬒nm[&:LAQ?˜©ò‹ÉƒÇ×|8Í5îeÍǺ—<:—û 쟰XŽjúºµm™è(S´QÞä#“ÃÁ¬äAó–F(HÝG·ƒqÖÍ$ª*¦¡Y?š©ò‹É£Hžk¨âè6àËè6¬Àža‰ÀþÑíånr^—…蚢@t”):Ðǃ«|•Eœ†ÀØ!ˆ ì Dw_‘,&Ýâ¶Lt”‚z£ÍTùˆÅìÑL`™/D1ómô1¾øŠµU>àÖk3Á^_áMù‹Ò-nËD‡™"èãÁU>b19œ ë_OfÏ4Þƒ‰E2ÝÇñÊËöËfm ˆŽÒÐ`õ£™*_e!74̤¡k¨â8^²/ãx«³ø¬º yÿ8^ѪdlÒ®nKD‡™bÒ„«|Äbr@,G¡äA PàNB•(9íê¶Dt”‚F«ÍTùˆÅäÑ 8B9MÊ¿€P • ÕX×B |LV»º-fЍWùˆÅäxpЬ=EµÑíÝG·ËË I»¼-¥¡àô£™*±˜<šIÀS_PÝNð2º½8 ÈœE ûG·ƒY÷ ]Þ–ˆ3ŬWùˆÅä€pò¬ƒ=yѵ5T,’Ïý}EôÁXíê¶Dt”‚&¯ÍTùˆÅìÑŒ\AÅ4¨ÑW÷â+–êv‰¶êvZ¹Ý¾ ¡vu[":ÊÑèãÁU¾jŠyr<8f†Ǽ§ºýК0'¨nÇœcÔ®nKD‡)hèÌÜÉG,&fbæÕm£YÝ6/Õí¥`ØJ¨ˆ-ÕmðÎ;íê¶Dt”)f£WùˆÅäx0Z¶¡Œ^7äèºï%/ï¢Aíâ¶Dt˜‚Fý`¦ÊWY„Ƀä5”+jm¾ÝË^òÕWXd#höï%/Z•Fíâ¶Dt)ºöë›â|Äbv88s88ïé„z¨¸ò ¡’7à´‹ÛÑa õƒ™*±˜<˜I<ñMrâÛè+ÌK#Ôâ+Àò ‹„-P üÚM¥kŠÑQ¦h>\å#“ÃÁXq{Å-Ûó ÃÈÆ­¶mºùŠ”“ò!U™è0ý`¦ÊG,&f0²`ãcµí‹‹ò«ýéæòÝW—Ÿ./.þííë›·¾ûtqq÷÷uqñååëï¯Ê?_ÿxus[|Âí+÷êÍr2ßüúW¿ç¿ÑV·]}Œè]öù­ïœ²…´èYüß.?~,™:t˜v\":Ê^×ÇŒ«|ÄbrÌØYÛ9»§¨êPl`tÝVÕ°¡—KA§>´'¦¢I?æ©ò‹Écgùº÷XYƒ¹ŽoÿzûéêwWï¿øÝ·Åe|¼ýëí«7×ׯÞýðö˜Y³”/¿ùÍï¹>ox&^$D0Ÿ­57ÐàErIo´KãÑQ&êƒ>š\å«,üähræVÞaÝKK¬åt7 ËÚN^Ä‹I»8.¦¢¨è|Äbò@'s++‚XѼ€XÅYX——Vªí·€X­R±D¢£Lñp¸ƒ):Æbr<9+ŽgyPý©’g0Âi+¯ Há–•CÚ»ÍE¢Ã”4«‡4$_e!_!šIIY<Ë‹ÏÚŠ9½Èa½nÀ‹96ÈZ¥ŒQ‰DG™bŒê˜2ÉG,&Ç”³cCY.Ñ<µñ6 §Ë–ö*‘;Ÿµ—ŠD‡©hViH>b1{HãxH#–y"Fõéÿþpuó׈*{wv•Co#Ï:,ßx"DuP6å.+‘è( PG‘I>b17Š l(òz<¢ÊŽÑeÑ\î•rx³´*(§"ÑQ*šŒzœCò‹¹ãœ¢JŽ«èckÏr"·ß_]_{·ß‹¾ùü¼ˆ±²o…ÙíE¼‰ÉjCW"Ña&šÔQd’XÌ"/À3Q·§\~º²žÑe±ÛrG­±Öxíã"ÑQ*z»ÑUÑ*±˜=Ðq<ÐñÏ)——_釗ß¶¸†õòåÔ¯‡íØýõro[Ï8éÚ¨@t˜¢:¸LòUinp9ZÖÒ­ÜÒ²<°Pê©äÛ1Deòž‘‡®õeÓ¡wÎä¬ÜY%¤ Þxý`¦ÊWY¸¹ƒ™¢I¼ùOÞäßX)7/ë !eŒÑniE@lXgè]ô ”׎ˆD‡™bÖG«|ÄbrÙæ­i%:ùOC^áLÿ=éÞ!Dí®*‘è(µ^?˜©ò‹¹ƒ™¢Iž+¨ÞžôèìËžôÅW`­«ª|ö¤{o³ËÊq‘è(S,š§nŠU>b19Nl+e¬×@4ÖŽD‹ý×z—+¥Ú *¦ A?˜©ò‹Ùƒ™ÄARÔ[gXˆ½¬3„„ÑEk ë ½¿Ûµ®kŠÑQ¦è­>ìÙ‚ú•Åäp°ó†…mþYó}<¯ðýWTù`ST/zKD‡)hÔfª|Äbò`ÆùÀTqºÏ…—é¾â+Àº˜¶Ò¶s Ó}>UíÚ¶Dt”)§Wù* ;7m`”{0¨Ö¤J'À ŠW¶Ú³"Ña úÁL•XLÌØè¹‚*bP^0(H¾¨8–W„ ªüͬ%JUS”ˆŽ2Åèôáà*±˜ËÂ6y„¤ƒrÐÿü’Ë5íÚ¶Dt˜‚&ý`¦ÊWYÀäÁŒc« ʃÞù¥bš/ç—Š¯€ö&=ºØp~ÉG´!h×¶%¢£L¼>\å#sÃÁÁ"[È`åÂG|Ex Êæä`ÃZCWUP‰è0MúÁL•XÌÌ,½ÿ\Ao€;ó’W,õ Æû ´ä`]À¢kŠÑQ¦˜‚>\å#“ÃÁa=+BbÙp¼èa<³Hy}Áº*¦¡¨ÍTùˆÅÜÑL l§Myí©-±_œE‘®-oe=J·×Y$ë¢Õ.nKDG™"F}<¸ÊG,&ǃ}f³N>‹³N ÅíÀ‚¶n¾¢8{—´‹ÛÑa šõ£™*±˜<šñl¨<ˆ@¾Âø_‘\^®ÂoM³C‹¯Hh‚vq[":Ê3èãÁU¾Ê"NއÀzCÜ3¸ýpbO0¹Ö Õ®nKDihñ¸úÑL•XLÍ߯5Tqr;Ä—Éí¥*dÞ5BËä6.ø»vu[":ÌA®ò‹¹áè¡P^.u6T·}:… ¼öM ‘è(µV?š©òUfòhÆ'ByùT›¯ðé„Àò f{+±„ åKgµ»ŠD‡™bRǃI>b1;œX×lé´€PØ¿ºÌ’A+ƒP"ÑQ ê¬z0Cò‹Éƒ™€ž+¨b×lÈ/Õm@ÐxžW¤†êv 9bÒ¾‡!fЍŽ“|Äbv<8ð‚EØS°¸7aÁ®í•ðd3Än×öxc´Q(‘è(õN?œ©ò‹ÉÃxÉB¾SߘYÄ—’ÅÁ[ÐÍ·å­ø†’ÅA«”{¡D¢ÃL1«Â$±˜ŽÀf·#ì™Ý~°d±ž]éZ¸„ʽP"ÑQ¼~ ñ¥}v¹§ê?Ë ¾¡}ö UÊé…Ht”)f¯ “|ÄbrXø½JïU6Ô-À÷ŸáNåU£WN.D¢Ã4©G4$±˜=¢qÀT±! üKC$ãa9-½½ÛЕ–;{Fy‘ Ht).“ê¦Xå«,üä¨0ð»2 ß•i©[öŸá.Ú”7 ŠD‡i(êG3U>b1{4ƒ<šAÅnÀ—nH6.ëNû"4Ìp§˜òz–U×¢£LñpÉAÙïä#“ƒÂžoô»6 >p};ú,L`m6Ú ”Dt˜‚fýh¦ÊWYàäь狽æ"Aÿ²HpõÁXBù–E‚ B€¤\µ‰Ž2Eõñà*±˜>Qëƒ|§„JІ»ðHÁ+7ÏŠD‡)hÖfª|Äbò`&ç ª8ÃÒË ÷Ráö&°A‹f¸S²ÆåæY‘è(Sô WùˆÅäxpâ+“|°²a7T ý¯o—^ùÒ)÷ΊDG)h0úÁL•XÌÌx†’¦ x};…—ëÛË‚rL‰õÎ&×p};¥åuj·%¢ÃL1éÃÁU>b19œ2ë]uF'¯Èý¸ŒÚ³"ÑQ ­~0Så#³3™3Y±sÍKçlñ>f ÛÁ„ ³ÅãX‡ÚÅm‰è0SD}8¸ÊWY¤Éáàd8eµ®o'{ K˜´kÛÑQ N?˜©ò‹ÙƒË1(yl©1¯p/,·M|ÆÀ>-T6€Ú›¡D¢ÃLõáà*±˜F¾þåÊ–F(Lý¸Sö9jo†‰ŽÒÐäõ£™*_eá&f0E®¡Š܈/ܰp#4 p§œœ×Þ %fŠY®ò‹Éñ`ä=QÞèÙBár¡¦³¯@c¢ÕÞ %¥ èÕ£’XÌÍD†’bQÒF_Ó‹¯HÁ­#ÜÛ[Y D;}.§yµ7C‰DG™b6êx0ÉG,&ǃ³aýëÙì™Æ{0±È¶ÿ8šd@{3”Ht˜†õh†ä#“G3%Uçª8Ž—íË8Þ’XÄ`ÆBanÇCk|ÐÞ %dŠ`¬: Lò‹Éaä ìG6“4tB¡ëB¡õ`³ru[$:LA£~4Så#“G3‡…<ô  Bùªø kXumUBN“µ/‰DG™¢uêx0ÉWYÈómó˜âaÕ =ˆAæSA(¾E0‡­Í¤ÛÁ¼ÜfÖ¾|$¦¢ Î|Äbòp&ûÄUT4¨ÆÌ"„o‘0ZtÌ[äÕ;ïõ`ç“TMQ":ÊSG„I>b19"ì2ƒ¡\ÞCÅ{Kƒß{³áPn9mÑÃ_D›LÒžß–‰SÒ¤ÒlòUòÙõ™”¸’j^Ê3/H¤„!A†íã~$êN«t‘(™è(Sô^Þä#sƒÂ`Øm0òm™§fÑzF8lĵ™¿‹¿ðh²ºh”Lt˜’&í f“XÌÔ]ò\IõúgÁÄ—þYHÞ9¶ü¢|ö÷Ï­Jfí«Ò5Eè(S AÞä#sÃ`ØÁ0òÁ€§V.#ë6TØuòËv_̺X”Lt˜‚¢z@Cò‹Ù‹LAÞ w!ö2à €€9noÅìŸáŽÙ[c”çòd¢£L1FmXx“XÌ ƒI†™bzÖ ·µœ.»d;y‹Œ>ho•‰SѬÎ|Äböp&ñp&éMqúp÷ܽEò#;à öOq—W‰.+oü‰Ž2EmPx“¯²ˆ“ƒÂÙwÎÏšâvŒlN½3 °¡x7ås2ÑQ šŒv8³ÉG,ægŠ&ñF yv©ÑW˜j½¬š»•—q? !®£àª¦(fŠ  oò‹Éak¶þÙòð¬þYŸ8Ý­v™ýêâ-œÏÆ%eo!¥¢hÕÃ’¯²0s‡3E•"WQ½Z°ö¥ƒR°.ƒ…͇æý´lÌÚ»e¢ÃL1iC›|ÄbnH8f`«Ú2ì©YÜ»gÁ3‹Ô½f0íÌB$:JA³UgH>b1w8St’íÍIqïìº~÷ì}EQ†Í6™—ãþšÅVéÖ·e¢ÃLµáM>b19 ìxfáve÷jÞqº,³èå-®gš**¤¢©äÚ*Jò‹¹Ã™¢J‘«¨bfá^2‹uó,r¬šoµd­ÒÝ&(fŠY&ùˆÅÜ0Ø,ÉO{DÝá>ëžµ¸Í=uëž-ï7©/”‰ŽRRëµCšM>b1yHc‘µaXÔ[Uˆ½,‰ZDž]€…ýK¢’5Áå½2ÑQ¦xˆ¬UM‘䫦˜'…÷n—¿¸¿$ê3‡áNâ0¼ N»t!¦¥A;ªÙä#“G5Ž; §é0Ü‹Ã( †C·¦(×à0,fÀäµKÝÇÈŽ2ÇÃåYMs䓹ñapÞ1ƒôuý—«p)Ã(‡­óÄôq6›!£ÛK{Œì0MÚá —°2 ³8ž8þ±Éî‹‹»¿™‹‹oÿzûéêw¿¾¾ýÕÕ_Þ¾þðþ¶ÄwðêÍõõ1óõÿþúËßýû×XÝÌ—ßüæ÷\³·IðÔÕÕˆNfŸ{QÊDLˆX·­slîûß.?~,‰ù•\Òëèg#;ÊZƒÕÆ‘¹„Ädr$Ù›moOy¿-ÇýÊýŒ„9ocÇâ ) ¶c‘ÉSÕ¨1 ‰Éä!·¬.çåã€{‹1¹Ñ±x‹çæX’[–m@üpX~§cÉË׳nMäÙQÖ6àÌ%$&³CÎwg…G»³D‡òÃíÕM³; ¬‰«¯;ùï¾ùõ?Ë%–»?ÙSaY~DmêÜ€­"ïyד½‹­ÓÆÁd²£l6}Ôz“°2‘7BÏc³>rL”?î]îurYÖ÷ëaÃÁl§¾ßòÊ£ÁZÝÂü1²Ãt;DB$!1™<òÀ0hÂÞ*®¥þ‚󃿼)d; >´À_%à6Vù\Ç1²£lƒ>X½IHL&«Cf 4!?¾øê‘ºŠã¤7óëèN`ʺ×c‘¦ª¹CèCV&8yèràªúØ,Ñ|¼½üø¶ÑDcÏÏ`Ž|t= ÛëNœõ&¦è•ËôÇÈŽ²Ñµ1j.!1™£‘ƒ_ò鸧Î$NvC¾:•èËÛ¶Ëêå™Äcd‡©iÖŽz¸„Ädö¨'räKn(xbÛð7¿þG´`C´ìùøˆdÙšÝvCX¤Cº÷cdІ¹„ÄdrØ9–rzÖd‰át±¿“ÉG“¶“ÉŽÒSkôc™MBb2y,Sry®§ÏY¸û¹“X·aŸÄIÌGÛ+1ûÇ ¡Îæ¤}-üÙaƸÎWk#—˜ˆý¬Ó# g‰8z1ßÑ,źo1ç5•O†»éˆÚÑ1²£4Õ¯gŠ´5µJHLÄøz&Me×'Qž‹¬úðíÕåÍëïÿõý›¢Ò7¯®VUÞ[…À%9·*DI€M¡ãºZm„)Û} s½rYìzDWÓb"$ñ£§yŒ6eVŽHò…ŸÝRÈ)o ìã^ï<-A•ò™ñ(RÙà´Ã¡ŸI|&ˆRŽ\e›šr}}ûÕå§ËgŒ¤£9Ugî<^ÆFÀNËšøv{™åœÑrHJ·Üýåa&›]“eBqËôD&XOn’÷^ì!t,‹IqëÉuÒ˜õ­[³L6YÝLæÊ£”6ú¡’øÌñN$wj<ægÞÝþåݵot1)ž_wnX¯ÛmíTÉïîÎ=¨[²Ö¬'­Õ­U¤<ÊZÁ˜.ÖJBVkÍb5akEd§¢Qvˆm‰Ì:¬ß?‘ç}N^¹pþåa*ºDE›Ägò¨³ã*+¦]OMdÚW  ËÓÏÅË`q3­@ÁuIæ~/ã|06$Ý;"Pe²ÉhÜ?’øLŽqN§ÒƒØŸsÜËÜ;@ÅFדÝZ^:®ÞyXn(YÝq(SÙØ%0Ú„¬|ÂäQâ{á’¼î1/su}{}ù¦5±áìLÌ)›´ ŠY68˜`[§4õ­U¢<ÊZÑö·™Ägnp;·µp•‡Ç[¸žº¥x®p"ãLpÊ{ sÇDE± SYÕ{ÌÁüx{û‡·m¦ðLçæ`йT‚gÜÞÅ&ã ¬'+õ­U¦<ÊZ³ë‚joBŸÉQíŒ tXç«­GÉy[çØk=Êá­;csˆ2™ò0¥….QÑ&$ñ™;**z \iÛ6Ñ_~úáæòúW—ïÿôCùëj­ûç|~ ƒ)±•)9í^ðxP¼hL—î²#”Ùm6¾ ½ I|æF¸“I<›y‰¬‡³`”Ù‰,èéj ¼vPÞüåa*›úÄG$$ñ™;>*ŠÅ³™Gïe=R”1­) ž]J“ÖC!lïÚRšh#Ú;edÊ£LÖ†.÷&då#/ÒžÆd!{VúÏrÕwGw˜Ïl” ÓÀüÝ;Oè GB#S¦²Ø%0Ú„$>sFE±xšJÿWï¿øÝ·ŸþïW7]üÌ«w?¼mÉhÂù5ļ •†}BڢǓíákDÊ£ ×….`÷&$ñ™춉…‡Vfwd4™SÞº=sO_³œÿ‰ÊƒüP¦²¹OxDBV>25“Ê®²M[!ßÝÞÞ¼þ¾1™±xžk!ÝÖa–,ì^ YÕ­8èf2åQÖêc¨{’øÌ ugÈ 3»·à^}†;ÖÐÕÁ”Ï£ó¨?y„ò0•Í}b"’øÌñÛÖ°e1-æüÊÿ5-K¶±`É„0ô”‘)²Ö]îMHâ39ÀíØv§òðÜ ÆsÊ[Ó³Ã,ftÉ*o´€ò(•¦OLDBŸÉc¢ÃészhÍ`>Þü¥ÕÃ8~)LpÖÙ­êŸÊc£‡AŸvh1“)3×ÔÜ&!‰Ïäà6D¶ @\uÜÃĦl^ϳòÎmìãaÊ£Tl§ ¨ I|把by®²â\×ãæí›ë«Æ¶2HæüŒ‰2°ï†mr0X¾¼àL#Sf­ØÑÞ„¬|äF­i¬5ù¸üÓzýåY™c”Nâ`0b9w(ÂÈ”G©l‰Öû¨l’øÌÅr\e› þ·—ï®ßþ±1ƒñp~Uþ`Jª»í++ß¶*Q·ò챯L¦<ÌZ± ¢½ I|&G´½e€Ã‘Å»;:ÊFæ; F†1GzLaÊ”G©,úN1Q²ò‘+q3©,‰dwø„)ÌO7—¯s˜Â5ž‹Yše#nMË~Ål[\LFô=š–eÊÃì5wÁ´7!‰Ïì˜6o$s{Éîm’ œòV†é¹S |F¤If™;Œ\Ê”‡©lìU!‰Ïìñåñm:sùéºÕ»0Ü÷\¼Ë’ºÐ­Å嘶s1K› ß#u)2ÕCg®¾©’•|xS`¦Zv¦.ážwIŒ´Ûr—zúLåwñ/"åaJ }B"’øÌ=å]®1y¹zÿ©µƒÌ_þb¼ǮŀiÊ_’oBì0Æ„ò(cõ®”Í„$>“CÙ1³)Ë#·mÚò0áùËòÎa)RwQYò0•M=‚"&dåsEép鉚¦,¿þÕ·_~¸i­ï—¯ëÙy˜er?l=Ê)bÓ˜e²6¬‹WõÍU¦<Ê\ƒïe3!‰ÏäXvɸ˜¹†—bêQ†hOâaÊ;É%ýòËÊÃT6u Š6!‰ÏäA°+­å¡éRÌ}z÷gïZL<¿K1fé $ßt)&Ù¢j.&ýÌÊ£¬5†x6’øLŽgÇÈ& ¢¼ÖfGs0ÌiŒCpÎè÷(¡sCÚËZTæ9ÌCc0ÉœäÚå²zÐv¹©|„ò0•Í}¢"’øLAæ9LnÊan/ß½¾níQNæür˜eÎ2²B?`cƒ./8gk•(²Öò›ô±Ö*då#‡XóXk4lh-ÊMoM›b ±“ ò—wî¤e™ò(•EÓ)&ªBŸÉc¢hyÚ-Ÿ“}ÌÁ¼¿úôç·×­ÊÑžå(ÿöi[¿M£üEᖰÜåÊÃìú€Ú$$ñ™ÔFÏ:•ÑïìT~h ýf†Ç`’+Åà{¸™ò(•ͶKT´ Yù˜É£"ô‘«ìŽNå?¿}û—òÏËwo üáÝÛ×7n?|÷éÕŸÿ…WE—ß}xÿÅëï?Ý|¸¾ýÃÒñG6„ׯ¿³o¾û¼2¯–ïì+ ãÞ—_òß]BˆÞx›ŒG÷\\2¯?]7cpή²) ¶=èšz¡mŽ~]ØÚác Pö1H]0óMHâ39fž E@cÇö¤¼­ëè¸'`Y8]´Ýèß8ByÊÚà v}•%!‰Ïä!Wù­™Êf1äz,E*>åãí_[3¤”ñÜ<Ì2Òä½Ý”—Ðæaro:lÓžÃb§Éa‚[€žÍÊ2åa*›úE$$ñ™=(bg’ÊC[ó—ÆFetp~ùK%RÞÖÑ  ù‹ 6¬Ýú¦*QeªºÚ›•ŸÐF ÛÜò°ódæ£0¸.à;Á(L(n,[èPƒ‘)SYì‘Ägò€ÈBà*Ût2óý§wåxÙèaJÊwvÆgƒ‰ç/±éffÑ7Xê‰j02åQæZ’Œ>æZ…$>sÚè Ë_Ö™»g!d‘S>MYpöØ©)S¦²¹SPT…¬|pò È›ÈU¶í¬ÙÇß_]7VùÑÛóËal ËÖ„-‡É9Œ_®¿v¸Ê|„ò su&ö´IHâ39 m-°€P>ÄÖ4 ƒëÐÞ)2o øõ5‘ò0•Í}‚"’øLYÇÓn¹Èù¤>²?–ß³5‹qçwzÆEÌ&°,Æ´ž ¾ü_ÛcF¦<Ê`¹vƒ­BŸÉ!mŸyH˜wžÏ|(‹ ÆŸ&‹ Ë=ìØaF¦³ÇD¼ÌïÛÊü¿ýøú·Ÿ~[þŽ>µ¦1þËý¢‡-ñ­åþ`1t¹ )Sf²ØÙ&!+Ÿ49²mÒ6¿Vv8{à8<ͳ\ˆ©O#Q¥²Áu ŒªÄgòÀÈ$à*Ûtà¬ø”ï.?¶¶+<¿ûf P–˜‡1Ðvß,„’‡B—‘ò0sÅ>È6 I|&G¶#2d;Ê{:ÛÚ•#≿~2 ɰµdSc?YQ·Ãr€ÖzŸò0kÍ`í*$ñ™Ö.‰/³V¹¿ºmâ2†­Úßuâ2–|=ôX­,S¥²àûÄD$$ñ™=& <&’ ?æ`þ×ÕÍû«ëj/÷Çp~å~aÛ®¼Ôls2–¾Û-e"åQ›Lh›„$>“CÛà™Å‚¼X·-‹¢,&.û»4-‹”‡©lè‘Ägò¸|à*۔ż¹ú±mt0Î/‹1Á¢‡-‹טÅÄ“Åýd"åQÖŠ¶ªMBŸÉQíY!&È9WÛÜe4[!¦ëÜerÎÇ›ÉdÊÃT6ö‰‰HHâ3yL2p•m*Ĭ=Ë­›É0šó+ÄØÄ™–…˜ä Ä.)ŒHy”¹f×Õ&!+yÎds^ˆ½…˜¶+b'JaRÀËEM}••(SYè‘Ägò x!Ú 1¯¿ûÓ»?5/¿D8ÃRL,¶äXÓZŠA‹Ît)ň”Ù«7®®MBŸÉqí䶃Nåaçå{(Yb”½°!°‡‹A4˜º¬&)SÙÔ'*"!+˜<*Jì¨Qyhº£üúú¯/?ýßF“|.&0Ž]&ÛvG¹è›O>uñ0åQæj}P›„$>“ƒÚ!°]µ!î<so´Ÿy˜u‡Î)øÜ£›L¤“E!rdWÞñèò˜7?^~|ۜĄx~7b<æ¢À¾m7bŠÂÅÐgƒ¿Hy”½ºÐÖ&!‰Ïä°6›bCØ9ÙÿPƒI€«;¸˜h—Ùt}••)SYìmBŸÉ£"6Ù©i²¿ü.?|lŸ‰Át~³ýMÞ\ ƶÙþè\ zÌöË”GÙ«]píMHâ39®Žèž»3pÊ[¤×³Ø½_°Ýd2åa*›»DE›Ägö¨Èñ¨È5Íö¿»}ýé»VÿâÏoªßx"«Ã m›êKîzø‘ò(c ÐÔÞ„¬|âì vâu˜´³s¯™ŒÄ$Üê0=Gb"¸dÁöHaDÊ£T6š>! I|&‰ò: 6Õaþô¦"Kx~U˜h­aG.K ×V…‰à—ÑÍ™Ly˜±BH{’øLig˪0Y^Ò–¿d§É_ øbÿ"Q¥²`û„D$dåc&‰²s\e›ª0·W¯¿ÿpû©ÑÃdwžE˜lûp´a"DM#—2åaæšú Ú$$ñ™Ñ>´ÔÕù$çq(š:L¶8öã02åQ*›lŸ ˆ„$>“EÆóUzr#ÍãÙ¯oZŒñgé`À°iãÌÒ e»@d"åaÖŠ}ðl’øÌg—@d›†)φñœ2ž"Ãäb—µd2åQ*‹®OLDBŸ¹c¢¢X«lÓ4ÌÍÇâ_B›ƒÉëEós0‘í½Ì&·ÍÂÄ¥¹Ü÷·”)³ÖÜÐ&!‰ÏÜ€v>\c£‡kÉèÏ+d{ Œ,ƒõ¹K#R¥²Ù÷‰‰HHâ3yLdØíïòд–ìÃõÕåÍý…ëù-%‹Ö䀸½ƒÐ¶”¬(\4ØcÜR¦<È^ƒ1}0m²Ú«¼Òb{µ™„ò‰ÃÊ,‡qÆ$‡c­è0n)S¦²¡KT´ I|&ŠlÞpÝ¢eâoûhæûë?77*¦Â$ñ?º‡)ŠA_¶åoamœßïaÀb:œËT7W‘ò(s=\Õ7W’øÌig9J&/¤Ú’eNyCÉrOãóRLêШ,S¦²±KP´ Yù„Ùƒ¢Èƒ¢Ø„’•$¦9ƒ±p~ Ù’Á¬Kqë;m È©K™_¦<ÊXíioBŸÉ!íÃÐ)=hf0ñDLÉÜcì±0F¦“‡D.ð Fž4{Ì¿¼}÷®Ù¿¸x~ù‹ñ΃ي0Î7æ/`=v™å—)2Vïº Ú›ÄgvDÛn=9åaçVå{ëb£ìNsÞ²¼ó Îõð/"åa* }B"’øLËë†òRÙÇüËõÇÿj­¿¸óÛ¨¼d/Ù±¿iÛ¨ àL=ê/2åQ¦|0›„$>“ƒÙÞ³PÐËÐ{[™pšì¢w]6ÅÈ”‡©lêU!‰Ï䑎«lS“ò\¿¹üØœ¿øp†]ÊÑØ¸]…)޶.å;}ëâa$Ê£Ìõp¯—¹næÈµÈyÌÕñ ¿Û[á¿×Df¹‹a%~ÛÓÇ IօС#S¦´Ø%,Ú„$>“‡EŽ×ø}kÿêúºÝÇœaßÅlƒÙ|Œk¬ñ}‹~%ÔÁ\Ê£ÌB@{’øÌ hc>ÌŸvf1ñ¡aþtša~´å›˜z¬T–)SÙÜ%,Ú„¬|pî°¨(æ—g™ó0?Ü~´¦u”?_³ d)ûl´å0h!™ÜcF¦<ÊXSìhoBŸÉíh·ÍNËJî}þe¹Ûù¹ƒ1œôf‡¦«ƒ)úozÜN–)ÓÙÜ'&"!‰ÏÜ1QQ¬Èu¶iÛååÇ·å×¹}ýýÕ»ËÆ<&ºó[zé— Ø6ÑŸ£iYz &;pz­ÿåQ6‹ÐÚæBŸÉ¡íÀŽ–‡Ç±²Ÿo$c…þ7ìWè?¼pÌY}ÚòåQúšM‡¸ˆ I|&‹2˜,ÈãÌÌÇs¿ýú_­®ƒ«l¼ŸwwqøÕ7¿þgÑwÔ?Ùá@ÖQ«¸$XÇXH ûÍÍÛ/?]=Ù½ROWŽQf–©zÍ…$>“£×!&f–ññÝÉ?Êä žÊ,+¹ÔûÅŽQ¤¯ÑØ^aÏÄgö°Xzà±ÅÉ{Ü๻ç3òÁÉr³Yô*t3Ë0‰Ybˆš Yù¤¹!êe#G:7d#1, Ñ'õưc”Gé«u½Âž;!‰ÏäaOdUÀ¢eŠÙHLgŸä å?„í•Äöl캎¬ƒY ”‡™%v¢¹Ägr :x6€äRGÜȽî/ž°›ãÝä+ÄŽQ¥¯Î÷ {|ÜäaOð„õMßïÉF‚=w7BL°ÝkÉÁ¹v7Rôª¨%Pf–¹Ö|'$ñ™kÇÌœV6þdÙHBú€ZåQúz(ꡯwBŸÉÃ`犖)f#àÏ> ¬eÓ(`Û³‘E¯ú€ZåQfL/¬ùNHâ39Ö3«Ä¬Us²Ú‚÷}@-ò0} ½Âž;!‰Ïìaaµ0е0g_ †üX¾Ø^YôJ}ªñåQfm/¬ùNHâ39Ö ¼Ä»Jìf#§+±çz7ð1ÊÃô5ö {î„$>“‡=ÀKì Yb‡—ûâFÛ~Ï(±/z¥>¸xŒò(³× k¾²ò‘wÍc–>3³ôùñÁ’Ÿßìe8ÙS •,/}BýÍÄÇ(ÓWèöT!‰ÏäaÏ‘ëëcC%¹‘o~ý+6&ø*‡s1~YʽOlÁP’¹.u‰ò(+L®´\…$>“CË)°ä#­ä#ÅS%¸@—ŠºDy˜¾¦NQN²òÉ£œY”“¢bò‘âÙ'~iÇmL¤ü‹ÖäcÕ«.u‰ò(³Dß Z®BŸÉ¡åäXcV’÷ 7”B’;Uc‚ ú‡·ŽQ¦¯©WØs'$ñ™=ìá G‚´F7âϾ1ËôÖlYÉ67f­zÕ¥¢.Qe–9t‚–«Ägrh9!w#¸Ç<˜àÉÜH2»TÔ%ÊÃô{…=wBŸÙþd!ÉÝón$¿¸‘˜ü6m˜R»YôªKE]¢<È,ÁÄ^ÐòÄgrhù°ž5&b9Y¼,wr#!õ‘(Ó×Ü+ì¹’øLößk ò6°F7bÎÞ,¥Ã+êø 7Rôª¨%Pe–zaÍwBV>qr¬­ÿ;{ˆJ :{ªl]î3&"Q¥¯Îô {î„$>“‡=h×W±–׿Fp™Ö>s7‚)ò£‹hb³Yôª¨%Pf–Ð k¾’øLŽ5càn$ìq#ZOæF²µ}ÆD$Ê£ôÕÛ^aÏ•™=ìá-!(·„4º‘øâF²1|Lý17r»¸‘ïþþ‡ëëõß}W(þ¦¨æÏþfþþ³¿Ù¿_¼ÿù·¸î¼úËÇë7W¯Ê—äçËõcý¯.¾þ›òëüçß~þúîmÜýbô—{è\ûîÃÍ»ËO·ŸnÞÛû?ÿÏE>^¾ù?åUo?zø8ÑO–Çû?ù?ýg?²¹Cú±o—õ³åU>•oýB‰¯ß¿y?¿}óéûµÍõòº|[ÊŸßlD–,ç²þ]ПÞ'>ÿ¶÷?Ÿý 3—Ͷÿîþþ7g>ûa²<úÑ_nÿæ'?»(Ò߉I FåY#â˜oº·1Yåoúp•>ˆ_ÇI¾åÅÙlÈÒúð¬Mf#›X‹m§¦p[ü±r_ŸDr”fŠ-hjf•ŽØÙUÿÎJk©ÁJìTK Äc_p¡W˜\¢«m•Àþ{g«颛Éa—r‹sŒ8Ã0‘ÅEÜ£ŒSI$‡©fÐŽkªtÄ`ò¸i…æúðœõliÍJK˜-øG÷1¿]±‚ÄWf>Ñdï¬nùZ"9Êà¬Õ†«t•™> }у8øÔšG™ÐôF™ü2 ®[À–HSͨ¦ÜIG fSpÕsÜF”i¹¸y”éÛùæ·ÿ.ÃLõöàLëÏhMÖ¢ÜÞÊzCpÐ"jOìH$G¡³ÚPo•ŽLõb`þå ì UŒÝýC‡AwÝ¥Dr˜j‚vèR¥« äMÙ3©&pÕTôOæf­B„Ñ»­ß ý~ç]XW-+Z Dr”z§óVéˆÁä8oæ"<î>«BÜÛŠÌzžÖ“°{žœ Î)7=I4‡é'¨7äUñˆÃäÑKà ú˜‹xzÛÓgã û+1ù³«LøpK7÷öõ<¹µ¯Ú‹4G™lðÚ0‰G&G€sdmëY^²ÞPœÈËkç‰ ²Kºum‘æ0íLê=yU<â0yÄ“yÄ“åˆçheû?¾ù®¯._¿¾yýPUû~#C>»:“¶q°åÛ`Ú†.t«Ù"ÍQFC—A'g‡ÉâlY§lv{:eïÕ0¸Ëp©»ËXZÍ”‹"ÍaÚ‰êM8ÌÐ8ϵó9Ͳ?ñ^ÀPÿÁ=‚7`·^›Åôí~À)/«i޲9ˆúÓNwâUòÒŠil.³%ÉÈ*Ÿ\µŒ®Ý²:ùð¸ÓÔO‰æ0ýÌêK8̱=r\?K#ž^º(Äò©J—¶­&m¥íò=`‰Ã«‹R£œ9H4GÙaŠêøp8LŽcŠgâoûÔEƼ–õ—ôš¡0`œò5G‘æ(í~¸¹¼ùëÏhœb²¸¸øòCùï?½úׯãÅEù¯_ýåÕ›ËO;Mx~Ž'¦°µä”wwïöp>f—u¡DšÃL;«#ÂU<â09"l:Uö S¸“=:åK¾­NI4Gi§êaQ¯rð³‡EއE¢S8žß~¸|·þÉõ|ùáý]Y!ÒetÔÁÚ*q˜¬•¢|V³¡”cÿRbR²hŽÒNgô–;ñˆÃäKŒžk§^)!ÂÙ•Rò&¢ Ìô÷—rÈVù"…Hs˜Í%u¬¶ŠW9ÈÔÙïþˆr÷Çþ«©…’ШìòzZY;š£´Ó[õx¥ŠGfWräÚ©¸Ì©V€Ì¼}¼( Ÿ‹È–‚å€Ï›rHŒ,›rH¼DF“¼n6!Ò¦Q;Š!ñˆÃÜQLQ#1᳦~’MàÉVîMì%ÐÄ +W#|xª—X•J7›i޲Ãlµ¡^8Lõ&¾…weµ¹bÿ-|åUTÞ˜!Ò¦ ÃTñ*‡8{ ÷ð¡b.‘ðd¹Ä<…ˆâsË–E­{ %Ÿ—t‘æ £+É«6ÐKâ‡É^î’ÖbVLÝ]B\¢åŬ"ÍaÚ Ú ‰G&X0q—4]B:?—|̉PÅö÷»k-ÝÚ´Hs”ÑY¯é’xÄanL7%¾W/íÚ«÷Кԯ^yÕ9gÝa8‘æ0íLêK8L°$¾W/=k¯ÞO\Bb‹õÎÆ%8ã¬Cfû»§á–ŸòAw>Z¤9Êè\ÐpI<â09€›#‹ÃrÜÓ®ôP–Ùüi7—€1*—DšÃ´õ–;ñˆÃäKŽÀµS±Y)éš•æq è}Ü>Nå„°Û%¸àu¤Eš£ŒÎGm´–Ä«ä1‰ŒÎ²8,Û=wIª%d×ý.iyÕ“²KhÓά°TñˆÃì‹M\;»KºÇ%¸ó»&ê˜Ì€£lv_Ë\Œr³ªHs”Ñ…¨ŽÖVñˆÃähmrl¿qrâ~ã†Åzë`Gg—à-€ÑsiŽÒÎhÔ–*^ÕÎcÜ.NÚ”³Ûï"¢‰Æ)WŸ%šÃŒÕÁÜ*q˜ÌEÜEÀñ`Âi]e]yÛÊ.B¢9J;Ñ©0U<â0{ÜEÀc.â¡;ÑWùxýáæêæ»›òßÝ,×kxçu,:EˆÞmshâ~$*&³®BWµRæ0+Íêèo¯rÀ¹Ñ_´†!QVçÞßÁ„ÖvßÁW^µú¦V‘æ(íÌ^?ÂI|Ská0y„c-C¢¬U;Wh߸òWŸ5Üw¯à‹àÁdåjµDs˜Íeuô·ŠGæFðú ÿ¶GZ¢9L;ƒz SÅ#sÇ0ExÞ Ïi´å x~yCÌb‚íÀþ¼½KF¹!ÑesΪã½U<â09Þëì™-Ç…õ_ÿåê‚„c”Ý6!í:9,™qVž}hSШ²TñˆÃä!‹sž+hë„ô×ÿûë/÷ï_ÿA¨];¶eÎ6…°Ñä}ìþ3º \zh޲GïÔÁÝ*q˜ÜeÃÓåaÏðô½± Œ.¿Þ üEŸ´gå$šÃôÔš*q˜< ±l|º<èO }¹õÉ{BØê6ì¿õpP*å‚„Ds”¯ùVñ*yü`;t™5’¸¼ç˜èÕèÙEß^PS^ªnÊ%j‰æ0íLêQL8LÅ8¶;¸è”Þ1ÑBìTÇDçÁš‚Ï%,ܺ–²Ó¡OÚÀ¸¼Žà)Hs”ÑE¯ï’xÄar|×EÖùêⳆ#“ÝÐ]ìãÀ€3IwŸHs˜v¢vÀBâUrµi&íäK|Nçë7×ï>¼ohyupv-¯Å/ƒ–n{awË+˜ÖÛªæ)Ðež‡›Ëºæy'q˜öÈp`/Énhy]wÿôÍ'ÀZ딇¯EšÃ´ÕC›*q˜<´ñ˜¸v>¶¡éâ¢üjº¹|÷Õå§Ë‹‹{ûúæÃí‡ï>1§òååëï¯Ê?_ÿxus[>ý·¯Ü«7|(ù¼æíó¶Ùé\jÞœñqs%>íÞìŒGÝš·Hs”±¦¨ “xÄarˆØ{Vóöò¶Úh*t_ ¶h¹r¯¬Hs˜vfõ@§ŠGfttä°ìÄ®$šss%h‹ÒlË7c÷*qp.f§[ iŽ2Vm™Ä#“ãÈÁ3c þYY‰‹¬–—¬`Dw’\ A¹J¤9JC«=55”Ä#“;ÝÒ-z»c‹Šžjwì¼;?\Êž5ÙÇŽ'Ã¥[ i3¤-“x•Ì-C`Gˆ ì:Bäg…R÷Œuº‡Hsv&cµƒ8ÌÄ5ò\;Ÿs„è³ÄB:»Ä!-Í?°•3ŠéïN0[‡ÊA¤9Ìæ’6`Lâ‡Éc`6Wö$Ö<BAê^ϰ&`ƨ›6ÈDG)¨uÚ!Ë&_e!Ÿq˜IC×Ðç$ŸÃINU™˜7o6ȼ¼’¸»PaMŒÖ){ ™è0+Dm0x“XLŽÛó_ö´Ñ>Tö^#”¾nÂÛèZ]7!¥ ÎiÇ1›|Äbö@ƱNZðÏé¤ý‰›`kñÏ%y°¶Ø»Ýð$°»iï4H×/ÈD‡™]ÖFu7ùˆÅä°nDÖKñY[d 'Ûý:‘a9˨ÛL+¥ Þk.›|ÄbòÀ%bà º£öŸ¯?üñòúíÿ[¿òß~¸ùôöýŸÿá««ï.¸þôêýõíÓ=Id=~çâILñ%i»{Š1íîª-:—löÊžD$:ÊPƒÑ7ùˆÅÜè/–dôïìA˜mA¢+vs%ƒîV(™è0 ê±ÉG,&uŠ 1 b¬ÓÖõ7øÅ/ düú‹¯bÄ/Â/áë/ò?ù/¿ðÉ.mÍ¿øeÈþï¯Ü«¯nÌ_Ìçÿv5Q%Öx.N(x0h¶¹À´æŠ;Pö”¯&ÉDG™x´Ú`ó&_e!¯ŸÈÄùÊè$/Íz*Ì•8ÙLF—:ù h³Cåñ™è0êQÉG,f’lä *‚rmmTëiá³_+‚å=ðÑ´Fæû:©î´Jwˆ\&:ÊÁª#Î$±˜qŽ‘™b”ψ?uŒÜ3²l½ïå+B Yy•Lt˜‚‚z0CòUqò`&²n¿¢VzÛÎ ±—mçË‘$„Û ªöo;¿Ó*epK$:Ê“SG¡I>b19 –[h÷€[÷ò ¾­ëaé4á!•o%ÉD‡©(¨‡3$±˜<œAÇÐ-t¡[;¼² Ìçë-¼A¶&©¼ƒû½ÅA«”3 ‘è(SD¯4“|Äbv Yà–ò³Ñm¨Jy3Dì´¢jÁPœö¤†Lt˜Š&õ€†ä#“4){®¢Ï™Õø©·0æTÞbÖ¶\Ððݶ ÷ï@¿S)å‚…Ht”æ Ž“|Äbr<8òÄ"îJ,î­AçýW®Ѽº[*i*¨Ht˜‚¢z,Cò‹Éc™ÈÓŠ¨™VÄ“¥¢Øç´*Ùqitf“Ù_ÉFc ¢î>™è »CÕÁ_’¯²“ƒ¿™;†ü<ĉ9†|Ç`õ«"Ña šÕ#’XL¹dîò£ŽaO7Uø:80¿_¤¯}þ"÷õÿô¥s_¤_þ2Eû•ýÒ‚=ÖMewuSew~ÝT&ÅeNa{M>(AЉŽ2qÕ!e’XÌ)ó3¯¸ëÌëCÃ!ØÿÌky×K¡\ó‰ŽRPg:IwòUÍ“IÈ/½â³.½þÅbLç’œd0¬*[ÞÁþS¯Eg‚ÍÚ‘è0»uô˜ä#“£ÇxrÏJNXëTfzµN-·öÔ Ht”‚z£¹TùˆÅä‘KN<9I''”„üùíûÛ¿”þáïj’òêχ?~õúÕ«/^xÿéæÃõí«òk}øáæõÕí æøÇÛ…ðúõwöÍw€WæUc^Yðÿpõþ‹nÿѾ~ãþø]Dß¼¹ÊÅ^ºö®áÄGN[ær&'>ÒrLÖ$–¹Ä†ÌÅ%oœîbv™è0ûOú¨u•XLŽZ#?…Ï;e9Y¼h;(—K”ô>ÑQ ¬~Uå#“GPȯDá£W¢öd.ìöÓ™Öß‹õ[‡Û¼ òSPO­¿côÑ‚rý]$:ÌQÅ®ò‹¹QìlX ˜(>yjÝrº'ðÑgÊSë"ÑQ~(Så#s‡2E“×P=O‘ ž½§ˆ%7tØ–W-žb©é+Ÿ ”‰³Ã¬5Wù* ùØÙDvÈî锇gè°ÈèF¶U¨WS/æårªvI^":JEÁë3U>b1{0WQ½EIÏýFÚ ·ùlüþ¾9+—GD¢Ãì0«£Ï$±˜}Άõn•‡=å‘{usžS8aáµ²£(ïºÄ…ÊM½"ÑQ š‚z,CòUòy¤‰Ôñ¬W±©·;٬଎Âó÷´¹¯¼’–AÁ¼ø\íé‘è(;D£Ž“|Äbn8[Ã…5Ϫ£'FÖnŽ¢×ºª¢[„¨*¨Dt˜‚ýH¦ÊG,&d¬eŽÂZEGaíËPùRѶIÁlr‹¯XµJ;©ˆŽ2ÅlÕq`’XÌ—¯ëu ò^ù#¾"Þ;‹œî¶ÛÐõŸr²Aý†‡Ht˜ŠFýp¦ÊG,ægŠ*E®¢ŠË £yYnX‡’·¹°ÕµܽÞbÕ*åÑ ‘è S,9¨:Lò‹É¡`Ç!(§5>˜]ÿñÁP”ֳР*¦  Îlò‹¹Ã™¢I,³pš”;ùr›Cò`¶w°¦/oݹr™è(»³^úÝä«,ÜäЯeiDyØ“FÜ«MpÈ)wßL„åx‘²‚JD‡)hÒŽ\6ùˆÅä‘‹eIDyÐK"ÊGñ%‰€TBÙä`ky² ID0è0+—'d¢£LÑymôw“XLŽþ:`¾ÂÉeCyÂA_aM¶F¹hc¿›|Äbnì7[`mêöàšF W7;ì4^ÞuÎt{žd¢ÃÕƒ’XLÌX@¦ é9ÆZÊNñT¾bÒž§”’s`6Ga#48 ½S®LÈDGÙaˆêÀ/ÉG,f~³c1[Ï ˜£ðlít7Gá!F£ @‰D‡)hÖdª|ÄbòHÆe^:Ëbé¬ÍQxãÏÝQàrs‰5Ǻõ¼û^G,&å%S2ÑQvA&ùˆÅä@°wÌQx·ÇQܸcdýæ(:MQ”wíÜÚÛ©« ÑQ F?’©ò‹É#ï€+¨¦£ðçî(Ð%—²Û*ÚÞ68 WbcÝeO2Ñav˜ÔQ`’¯²€ÉQ`ëÙØ«•g¯žzCƒCO!vÏ(\ Ñ*Ÿæ“‰ŽRÐdÕ#’XLÉØÀ{.‚ÞšÚBìTkj§u\vl„ºÜâ(2£\£‰³Ã¤“|ÄbrØ#ë9ô¸gÙÓƒÐÛÝÍQ€5ÚÇ–d¢£~$Så«,ì䑌ÇÀTqדÏg¿ë Kœàò=ù´×SQ)ðÙ+×(D¢ÃìÕ!`’XL>öä±×–]OÁ²­€f튮ûÊke¢£T4;ýX¦ÊG,&e‚ \E]Epgï*²³yÛõL‹«H9£Ü#+f‡Y&ùˆÅì pd-ˆ^¾èôÔ¾'Ö#ëaC€{õÈz“:ø$£ %7õê± ÉG,&e|ÌLAå¢_cN±tù}ly! +T¬Í ;}ÅA«”+Ú"ÑQ¦h:Lò‹ÉqàÀWȆ]+dÚ øÙn¾¬Ó®h‹D‡)hPfH>b1y0øÙ ¹@6œýÙ”—š¶gIEÃÙà­s€ÊI…Ht”:«Ž“|•…™‰;Šô¬]ãl{G` ÿ{mïðÖgõÁ;‘è0ú‘L•XÌÉ$î(ä1Á¶ã߯¼º¹-áö•Ûsɻ趰ù}뇷ֳñ¼Ì£=÷(Ä^VÍ.Î"„¸Õ40Äý«fW­Bí>)‘è(S,慎)"õI-,&‡ŒÁ²É °ÏÑcé8Ó=ýˆ6–ôN§‰SPPgH>b1w8St¸‚>gòâó,œ?¿,Â8à³Û`Âî,¢hPðF9‹‰Ž2»èÕáa’XLGKÅ]°Ô½Z7ó ñ°T,Î+ÃR"Ña šÔ’XL¸DKÅGa©õ‹ˆ§ª_ÌãbˆÞâ¶)06ÀK1†r ewÔá`’XLï[¹o½¡^ÙÀ1D Ê—)d¢Ãõ#—*±˜¢[å#“#º1°-F1@{ê6FãÖ¢ÞkŒŒ§Ýñ$¥ Ù¨G2$_UÐÔîämÿÊDÆì­vR!¦ A?’©ò‹É#™èø$Óœ¤ó'Û8qRá‚3‰·‹¶aàA«´“ ‰è(S«üVùˆÅäÀo¬2‘åG•£°ê@ÝWd´·qˆD‡)hÔfª|Äbò`&V™ÈòêÂ6_‘ãÉ6ŒO›T $^Âξa½x21`PN*D¢£ì09u ˜ä#“ÁÙ1ô)»=èÓCíNÙa÷¤"y[>{ÊI…Ht˜‚‚z$Cò‹Ù#¸‚*¢OÙ¿T*íÒýÆf(²m ÒrÍBûf¶Ht”)¢W‚I¾ÊBΘç1EÌ €Â¼€º7oÇ“ V1ì•T¤Êë`E¢Ã4é3U>b1y0ƒ9qU ²9÷SXþ·îL»älpÑzÐÞ+e‡Ù«Á$±˜ÎÈf™²¼ç§aç_ÆmèµW_lŠîðë*¨@t˜‚¢~$Så«,ä-z3)(‡GQ4§FGÁÖK_l0&&vR"¯¡È¾¾ØS¶Ú7²E¢ƒìΙ Žú’|ÄbjÔ׳•°—‡ç³óŒ.Kå—ÒL×Þyu× ¦¢¨»TùˆÅԱˢ•‰«èãWŠèÑ·½ýoþÂÅÅÕû/~÷íÅEù•~øxùñí«7×ׯÞýðö˜Y]È—ßüæ÷\¡·|#ž‰Aï\³½»ul‚°4öhÛ¨@t”Ú¨ WùˆÅܘ0¿aÂåaÏêX÷Àe¢ò¶à­Ûe"„ìÕ¯¢ŠD‡©hVtH>b1u¤³h%2 zËca½|îe‹dr†¼­ „àØ:Ù§¢Q­R.q‹DG™¢uT˜ä#S£ÂΔÿ÷wöð¬ËD60ºv[éa{-ÂMÔ.r‹DG©¨7ê ÉG,¦h­®¢j;=%=ÙNI  ÁäDÍ›ÎØÜ°Ð£¨&T®p‹D‡ÙaRÇ…I¾Ê¦Æ…×ÕÃg{¶Þ+\l‰E!…±b±ì#ðÚ5n‘è( V=š!ùˆÅäÑŒÝjk˃ڞÀ…ØÉöΛXupKWÜöV aUàªU \æ‰3Ť“|Äbr¨ØFÃL1îé½×å8ÙÍ]7_a—{<Ú *¥ Ñ©‡3$_eaggbà ªÖ;»|Ï}ràÃQûfy%¡¡q6cr˜•ËÞ"Ñavˆê`0ÉG,¦ƒKž™£p»ÖA_ñ±Pê¿â£¼ký! ‘è(×!’I|È¢°˜<’q9pUtþtë &uKz‰‰&,ÊûmÙ•³Ç ½ J$:̳:Lò‹Ùq``ýQN¾©±{l»PJý',r^bnå²¶Ht”‚&¯ÉTùˆÅì‘ $® j‹Žžû„EBÀ…­ÊÅýÑã³ò.(™è(;D£oò‹ÉQ`Ïiý®FÚ‡2 ï»;Šå]£Ý6Z™è0 Ú‘Ì&±˜<’ñ¼Öëí‚ZtôÜÅ:³½í8-¯¤aTQ©qÝŠ¶Lt”f« oòUfrØm}ˆåAîCl©h»°mÙéUÑŽÖZ4I·¢-¦¢Q=–!ùˆÅ䱌 ¼?/¨]I]ˆ½\I…bÌΰ´Âï¿’­G㜲·‰2Eo¬6¼ÉG,&Ç}d}ˆ>Š}ˆ ø“‡Ð=­°Ù„¨¼bV&:LAA=œ!ù* ù0îD ¬’æåeùi¤_‘ì‚G†­Vá6øŠU«tk2ÑQ¦h6¼ÉG,&‡‚­‹g{VÌÞ[GþY¯¬÷ý3‹%ð^G‘5UT$:LEA=œ!ùˆÅäáŒu™©¨|“©±ÿÉŸlÉìÄÞ"‚>²É »ÏìV),D¢£LÑyu<˜ä#“ãÁÒê¡‚EHÐ=³(ï:Yå½2Ña šÔÃ’XL΄丂*¢P! …š´`‘|ô¬µù4@PÞXmJ$:Ê‹7Õ¶C’XLŽ.®ÑÞÝAPAÁ½…7Î%«\®‰SPTdH>b1{$"WPµÝËö¶SíœÖQ„â%b1{$cyÊëÔV@-ÄN¶jVGá=xëXFaöïŠÞ† ÊÓw2ÑQv£: Lò‹ÉQàèYFe ¬zŠþ…-‰³òôLt”‚‚Ñdª|UAåC3)hä ª˜QÄpöEZnì°ŠöáŠò^Gálù9劶Ht˜‚:Lò‹É!àhXFÍžŒâ!èi­ê÷vÎf¯<}'¥ ÉèG2U>b1{$cXF­bFíKF]4i+f—(·ÅQ IÚÓw"Ñav˜ô!à*±˜öȇ›pÏšÀã‡ð ¥Oà(0 öôHt”‚¢íÉÜÉG,&d|f)¯—·4¶Éæ“- œÕQ”ôÒÓöiÿ†Àè}¯=}'f‡¨WùˆÅä0Xf‡`ŸUÌvœì=uÚXÞu !k×($¢£4;ýH¦ÊG,&dÀF® ŠÐ¸³‡ž‚ ,£Ó=k1h³%¢Ãì0ëCÀU¾ÊBŽÑ'²CÞõ»ºžªQÀ)ºž‚Ùk; ‰è  ÆëG2U>b1{$ûž@³ë ^ºž¬Å9l5 hêz )ù¤]Ì–ˆ³Ã¬WùˆÅì0_Àål»OkJiƒž:ÖŽKSPR¾O!¥ 6tˆdîä«,üä‘LL¼ÛBFr?»ŸZ~µ?Ý\¾ûêòÓåÅÅ¿½}}óáöÃwŸØ]Õ//_UþùúÇ«›Ûân_¹Woþø‡ùæ×¿ú=ÿ„5Éÿà·TcÄìÃÖG{èºó(O»¥ýºBI»è-e¯ÎèCÅU>b19T\ÒTØ%­¢7à ŠÞ1$c´‹ÞÑa ô#ž*±˜<âÄŠÞ€ŠEoÀ³/z›`Sb~ ¥è]r— |FU&:Ê uí°ÊG,&‡ŠMfvhÍž îð€£°¦ÿ·ëbÐ.zKD‡)hÔdª|ÄbòHÆò;¿V¾óÛ¸íÜý7úò²c_ƒ– nH>+Q•‰Ž²Ãàô¡â*±˜*N‘ATIÞ(×0˜—àÝQEÑÕΊD‡)(tˆd_8[XLÉ$`U’Û6G±v1ž·£ñókÛ)´tG•O^tÚEo‰è(;< ¥éÚa•¯²·îOd‡¼6íj£}zJ§h£]6Xí¢·Dt˜‚&ýH¦ÊG,fdxmÒl£M/m´9vÄ"5µÑ¢‰&j½%¢£ì¼>\å#“CÀɳÌ>y1³o8´–±Þm´˜LTŸà–ˆSPÔdª|•Eš=’ñÀTÜ›ßè(‚?•£˜yÑlÊ)³mÉ…_±h•v=[":ÊSÐG«|Äbry=wÕ³ê¤ÅSÔ³ËïÚKÉE¢Ã;3wò‹ÉƒäõlÔ¬gãK={I[­ÙêÙØTÏÎKíK»ž-e‡õQà*±˜ÆÀÐ'”·6 OO€>•ÌÙ9íz¶Dt˜‚fýH¦ÊG,fd"CŸŽ˜S££ˆg>Eð~Ã@Ê+ñ èS0Æ(׳E¢£ì0ƒ: Lò‹ÉQàl˜£8rðµ!£Èÿ{Û\Éq㉣_EëW»ëŽ|D"÷ÅFÈz˜q¬FòµìëÿpCA³)‰³Ù½$eÉãÐýì7ë -â²’È“ªž™]»Z"@Tà‡'ÛÞQ”wÕG.D¢4–ߥ‚F6rQX Éd¾e Ë}„uŽ"Û­; tÞMߨÅQä*Giw‚U×¢Ýì0©£À$ßÌBžvÇѱã”èÄã”Oè„ù%uG‘¬ÓÞö!í¥ Ö6ˆdä#ƒG2è86êDl´2£˜æ×7í(Rq–ï5>¡uŽÂz—¼r=[$ÚÍ“:Lò‹Á!à̇¸óª!î£E:AFa=ìŒ]YAí¥ ÎéG2³|3 ;x$“ùw~rˆ{MF‘¶žQ¤i3²«©9Öd6£KÊÅl‘h7;Du˜ä#ƒCÀ9°Œ"‡5űE'È(œq”‹Ù"Ñ^ ê~$3ËG,FdBà ª˜Qä¸ùŒbÚHί¦f_“Q8ðh”‹Ù"Ñnv˜õ!àY>b16lYEyXã(Žd…Ò)¤l”‹Ù"Ñ^ ¼~$3ËG,ÆŽdŠ&® zŽÂ»yGQ² ¬F‘s£(ñÌne”ªJD{Ùa4úð,±N¼˜V³ã±™»S³}É[´‡³E¢Ý4èG2³|ÄbìH¦hŸ¹Ó,f§Ó³Ç¥@·;¸Î–’WÕ³'­Bíz¶D´—)î/7è›".õl¿¾Ã˜¢µv»+kÆîŽ%»³½í}îÊ!Ê ú˜h7 ‚™ùˆÅØÁLÑIà ª7vWtôdcw£&!d¶»¼S1s˜`µëÙÑ^v˜¬> <ËG,ÆF­ÁÈ’{yk}™ÂšìÛ;ŠS㎺‚>&ÚMAA?’™å›YÈK¾FRÐÌ4‹n­}ʰuGác„D êÊ+I©ÂQDsÔ®gKD{Ù!:}x–X Ž[vE¦<¬qG3ŠxG½1A»ž-í¦  ÉÌò‹Á#˜£°rþS™QÄÍ;ŠÔZ°,£ðUŽ"Û€Úõl‰h/;Ì^žå#c£ÀÖ¯gËF)'»@À©•£ÀèA½CV"ÚMA“~$3ËG,d ðz6hÖ³ÓÉêÙã–)R §žË[‰5%íVi'ÑN¦&è£À³|ÄbpØ–T8£•T8{‚¤cJN;©ˆvSPÔffùˆÅàÁŒ3,©pò`¯pvóIÅt;7D–T䚤"ÛlA;©ˆö²CõQàY¾™…¼Ci;´lóZ .Ö\0:V¦°Øþ‚QÈÎ;Ðn’•ˆvSЬÉÌò‹Á#‹¼áõ.b›¿`4m2µË£ò5¨¸`2†d´›d%¢½ìÐE}x–X Ž›Ýýuz¡ˆçîçõì`Oà(SÖn’•ˆöRPoD2òÍ šdŒO\AÅß¶}ššÙ7î(¦ùËË+qq½£ˆ&”;dE¢ÝìÔQ`’X Ž»`Yf/·Ö¯ßøT(åæŽ¢¼ëà½r‡¬H´—‚£É|ÄbðHÆñ†‹§¾+¡§è¶î(¬ãYÂíÂÆµŽÂÚ˜’r‡¬H´›&u˜ä#£CÀ‰; ù·­€ž\:£°6cR®g‹D{)h´ú‘Ì,±=’IÜQÈ Ô*nÞQø`sPå(Ðz«\̉v³CT‡€I>b16lLZ §ò°zòEbt‘aO­ZŸÀ¹ IÑUQ‘h/§Ë|ÄbìXÆìûûéA|*Jz2ðiàÖ§‚Íl?  üi¯UÊm‘h7SÌê80É7³oRcŠ68†ùÞwEZ±Û&Ô8­(Ÿ9ŸQ¹¢-í¥ É«‡3$±;œ)šÄòÞ w×¥Áo~‘¬É™o·ÁV¬ò— 5劶H´›fu˜ä#ƒãÀÁ°Î’`Ö¬ò86Oì²Ê£YRcŠÚ‹dE¢½ƒ~$3Ë7³kÄ#)(pU\åìÉVy œTØËÚ'ësÅ6½Vi'Ñ^¦¸¿õÖÀ‘± |ö.¬š½;šT@û]²Á‚v›¬H´›‚ý`f–XŒÌðÙ» 9{N7{7hR1E ..KÇm¨¼›@L«Ý&+íd‡ÉX} x–XŒ [Ïk†^®V´Ézl?xWÞu²Úm²"Ñn õ#™Y>b1x$ã¼óré¯ÎQxÜüàÆ!,Eí}?èjG…†r›¬H´—Z§Ïò‹ÁQàÈ£–­Œ"žà0*@vI»MV$ÚMA¡A$ó ±<’‰ì0jyPÌ(â‡Ã¨Ó2ï— íXsu*‹[í6Y‘h/;t^žå›YÈâqì0d6xòšî§có»«­Eš6<*·ÉŠD»)hÒdfùˆÅà‘LȼáB¬tfëƒwhÁbdm²kŸðá ·ªJD{Ù¡÷ú0òÛå‹Á!à™£ˆ2Q“QÀ :F»ž-í¦ ¨ÉÌòÍ,ä¶Ó‘4qÕt°uG‘JVUþßRÌÞßÍZí(°¤}ÚÅl‰h/; Ažå#£CÀí|òqÍΧ#÷î ¥ö;ŸÊ»Î>h³%¢ÝD2ò‹Á#WPÅO>n~ç“Iéý®§P±ó) Þ)×(D¢½ì°ÐÚvHò‹Á!`àÈ[EFÐ~”"g‚U®QˆD»)hVdH>b1x$ÀF)@®¨Ô9 €ÍRIJwËÎ'£ɠŨ\£‰ö²Cu˜ä#ƒCÀ€ÜQÈ‚Ï]7nÙ¼8 ÓÌQdýF"Ñ^ šLƒH&óF…Åè‘LæŽ"¿ÄQ|õåÿÎ ýMü„è"Öyµe€1ZV¼†Äÿ¿{WþNžô 6$Ÿ•K"Ñnf—Ô_’ofƒ#¾`YIä}?Ï­]s¿àl{¿0z֞ʼnöRP´úË,±=p±9¿øþ²üç??ýôób°Ÿ»ßþ¿ >ý-:ÄßÚóÇ>â?ÿôc÷ó+÷êï—·æ'óþÿØW¯ÿºÂ¹°9\€È“×û 0ûTª&.ífâIL&ùˆÅà`rЬá=É™TÅ)¤4M·±Àç•'2D¢½4;ý i–of!ÕRPð\AÅ ©Ä*yÙÖA¬ì1B@ö5° $ ¨]íˆv³CÔ“gùˆÅà`rò¬ê˜üš} Ǫ)˜8ŠSÒ®vHD;)(× ’yXŒÉxà ª¸$…“íÕQ8î%W± $%Ÿv÷UíP"Úͳ>˜<ËG,“KÔÊì0¯qÇ2 4'p)Xo•'2D¢½ÔzýHf–XŒÉdî(²¢£@óÁQ äÖ8Š)ÚˆÚå‰h/;tF]žå#ƒ£Ë™Fí°bHÌÞ«í(Ð-×.‹KD»)hÐdfùˆÅà‘LÌ| A—TNdä´uGBI«Ì’QÄÝ©åÕŽ¦ª‘¶ D{Ùa‰¬ôíðA¾™…FÞðŽrÃ{ô„p‚ŒKê¬^'—ˆvSÐØ ’yX É`® šl>£(ÿ4qé§ÂP“QdïQ{g¹H´—îW¹ëÚá,±FÇÖ ¢ XW,Aß~½`y×ûZ¬²‚>&ÚMAA?’™å›YÈC8#)(ë¶@ùG¥£ð›_/ˆÉÃ%ž_‰­X/˜rδ‹ÙÑ^v><ËG,‡€³eE¶Z5ŠìÚgEÃ}ˆÊÅl‘h7õH†ä#ƒG2ÙWPÅŒ"»ÍgÁ:Ç»c³©È(Ð@À¬\̉ö²Cðê0ÉG,‡€yF!o†¨žrûŒbBÛsV.f‹D»)hRdH>b1x$ƒÈ3Ь™QäÍg1:Ç÷ÐbªÈ(Ðz¼r1[$ÚËSP‡€I>b18œsîáÔdñŽÂ–ØØ)³E¢Ýõ#™Y>b1x$³?Ej¥è(rܼ£§ Ë+ñUŽ"Ǭ}+O$ÚË1ªCÀ$ßÌ" {Ãx#8à(Â/E¡ÅOÛxÌp×XÑÄYä¬ÊY…H´›’fõh†ä#ƒG3Þð˜VÜùÞà7 xý»¿|õgg—7¿ýó×ggW—ßÞ–ëÕëëëWo~¸:äWv>哯þðï\¡—ý6q#ƒÛ8­½ËËúA·ëU^5¸ &–¼tkÝ2Ñ^&š£6B¼ÈG,ÆFˆaݳåaM÷ì‘¥RΰîÙFËCÊ»F4^ׇÈD;)h6F;ÐYä›T>%1‚²îÙòðT÷ìÙÙŸï.o‹¹¿¼»¿ºùîììãwïö‹D¾x{q~ýÞ>‘Ï//_ß}´[&R<ÌÍëËŸ^½>¿~ÎR~ŸS5àŽã["8~UÉÞqû\ßRhìj쪦+ífº  */ò‹±Aåz-;Üy®¾eŠßw.Ñ Âi3mç>io¦’‰öÒPkô£ŸY>b1xô³Ÿc¤‡§7SNP^ßÜ¿»ZŸŸ¸ÝžŸå'Þåh–õè%AY½Xª(ÛT÷Õ­œËD»YhÒÆ›ùˆÅØx³3l±”3«K©œJÍK•wMPÏO$¢½ÔÙA΃|Äbð ǰÅRî@HVU)õæKy‡lt`ú¬_,&E‹I·r.íf‡¨5/ò‹±±æ©u…rò¬õ•ó©k²½£H1fЭœËD{)¨wú‘Ì,±<’±Ès y}£° lݦ£(>Ͳ0Õ¹}è¼ÖQà´GN·r.íf‡YPžå›YÈš=޶°<¬Ú82ÝçLû „å]OçšµA)‰h/ ^?’™å#ƒG2Æó’œâ¢£›Ú@2«^Tl ,*….+ï4—‰v³Ã¬Ïò‹ÁÁaXFáä{³…‹'È(“QÞi.í¥ 14ˆdä›YÈõ€‘4qUÌ(\ÜzFQ4Á™˜Gá|MF‘åæ2Ñ^vXòpu;œå#ƒCÀŽMÙN©½RÂIg´EŽ.*ï4—‰vSРÉÌò‹Ñ#Çz¨Êÿ(: ÷aaL.á=9³~!X¢QÞ@(íe‡ÉªCÀ$±6&²Ì^nŽY¿ªÖÛ|ºoz×Y½J$ÚMA£z$Cò‹Á#cx·…|W°z²›ŸîÃì9ôds^?ÝÖYÊe¢½ì:Lò‹Á!`—Á)·[‰õ„£øì§ËßižeδwΆ¤¼…P&ÚMIA?š™å#ƒG3WR±ö gñÙÿþì“?ÿé³o§á§Ó˺ mÆ×ÿúÕÿ${ù­q»ŸÑò±ä›Ë-Œòq05~#U^H(íe’Ù«#Â$ßÌ ŽûÝ; ñRQ²ð>ŸÀg qÊ e¢Ý45lä#£6>r3àºÃ·ñ­÷˜s»Hz­£ðÁ‚òBB™h;ŒÆxuD˜ä#ƒ#Â|}ˆ[·>äXÉ‚/iæ(|ˆIy!¡L´›‚¢~$3Ë7³H£G2†gÀO®Yã(Ø>m:Š4áæ†eï­y¶£&9å…„2Ñ^vhƒ>"<ËG,G„}æI¾ÖVÚŸa-ïÚZ¯¼P&ÚMAQ?’™å#£G2ì kyPì– ΰZ_’Še”ógX‹J¥);ѶCh/;,)¸¾>ÈG,Gƒ]b¥ÃÓ‚Ï«FÙ¤64rnÚ”«Û"Ñn*šÕc’X Ë8>"êäÑÊ6¨|²Qíq è’ƒåtôôI¨˜ÖÞk•r[$ÚË=¨ãÀ$±ìkyPK+ÚßbÞu Ú³"Ñ^ Œz8Cò‹ÁÙÀn±–Í´âÃ-Ö)Xˉ=*n±•B@íÙ ‘h7;Lê80É7³€ÁqàÀn±–¥ËI.´¿ÅZÞu6Y{¶B$ÚKA£mÉ<ÈG,FdØ-Vw`¶¼ÒQ|¸Åj}ÂåsU^IÅ-VpË*W´E¢Ýì0©ãÀ$±¶9±[Ÿn™]E|ä(ÑEÖ/‹­\EÉœ­:þ$í¥¢àôc™Y¾™…;–)ªÄÏcmìt; óæ]…ñ¸ôøO߃Š.YW>F»ùI$ÚÍQžå#ƒãÀ1²æ§_Ôü”YXšŸR#GáK¼é´Á'‘h/MN=–!ùˆÅرLÑIÖüåñŸºœ"ÂÉšŸÆ-T¤àÑg6²CEÿ“Oå«—•ûŸD¢ÝL1«ãÀ$±ŽŽí؉òüÇsËÚÅúa¿X¢‹­ Û!…µWËŠD{))zõ€†ä#£4|ì'Êc?•þbZ?¸íÄ"C€Î¯ÄæõÎ"k“Uv"Ñ^v˜:Lò‹Á±àˆ¬XåÎÉç&‘‘ÍK±"6rÑøý®s]ˆvSРÍ|ÄbôhY±"ÊçcŸyïèíõåùÅÅíEÅÅ£˜á±>ÿº/aI:Ë×y‘Ä*ϼxTÂå´×µQh'µåƒ¯o£òÍ,ÌØ(±¾ŸVí'ÔåØIV` Ê]«›¬`‹š;åB†H´›ŠFõ8‡ä#ƒÇ9À7”ƒæ†r8݆òñ©˜Ð¢Yæó fIù^«”iE¢½LÑZu¨˜ä#ƒCÅTòš²÷£•‚ÌY¢µó>«Ü%í¦  Î|3‹8x8øiH+û£ò©ŠÞ㤃7Ì34«Ó()«×^%íewΩcÂ$±~—ä»”Ï-\ð,"Ù8†ƒö*(‘h7…‘˃|ÄbðÈ q­º½ýæî§7×þv Ž9ޝ¾üâß¹ {õå~Ä0RXÞA\p{ª‚ vs”H´—Yî·“éšå,±"N–Ý ØU_^0pœîRIl6Ç “ú%U‘h7Mú¡Í,±<´I6pû÷ž‘R|ùÕÇŸ|òÙ×_3Ân nÜvá§3x6ÇŒ«€ŸvZ¥\¬‰ö2Åô‘àY>b14l!,ʃ<«uÀ[ØÃS)¶õ£ÕÔE ¢öÔ…H´›Š¢z@Cò‹¡šI•9Š):¿/ïÓË֓N67ǤRˆ^¹?J$ÚMA³z8Cò‹¡Ã™I“"WP½õäÞ¸S­'tJhFêß,ïÀ°}äÏR4Îhoù‰ö²;ˆêX0ÉG,Ç‚3Ç‚³Œ?tbÅŠÝ"‰ÖŽ!ú€Ar‰öRÐdô#—Y¾YAóØ‘KÑ$6a‘ÓSgg¾»¼½;;»¿¼»¿ºùîììãwï>=¿??;ûâíÅùõÙÙ¿]]ܾ½{ûí=«küëÕÝ}ù»£ÿòê÷ŸÅòo~==ë¦ÿÛÝrÝý§?;+?wùÓ«×ç÷Ï÷Cåw?Õ@Ç8~¨ÄÈغós…‚é¶™ D»™9¨#Ë$±YÎŽͳ\ânÑœ pd¿àÊ­8RD4Y¹h.í¥ hJò‹Ñ%>ŽzàÙ38~(Ê»ŠñìÃcmþ•»´ÞzvZ)ÛõõóÞÛ¨<(íf¡Inžå#CÃÍÓÝ`нñÏß`ãÞäÅìÚ Œ# MÚG3D¢½”4[õ8‡ä#cÇ9E— SÒ,6yTâ\9ª&2êÀxD›£‡å•ì6Ó­,ˆìUJ¹|.íf‡¨Ž7“|Äbt¼9ff‡òÒög7[9FXùܵr©ø·¤¼‹J$ÚIEqêñ ÉG,FgXyyÐ;šQ¾‹'+Ÿê*ÂT/‡À¾µsL!9P®‹D»ÙaVG I¾™Ž@ûý°ãüàÖ¸ŠGy…gi…u‹«ð­²ŠlJöb”³ ‘h/µ^=š!ùˆÅàÑŒeèiyPtÖè´‚äÂtŽÑ±OB…·Øk•rb!ífŠY'&ùˆÅà81òk|¸êß±±pdÇøÔBð6ë¦2Ñ^ ê‚v8³È7³ðc‡3E“b1x$c3G£äÛ䕎Â|@£JNa£Áåˆkù ¬G£RvÞå%…2Ñ^¦60¼ÈG,F†#k7ÙusÕ·ÕN›£QyZʼnº• ™h7õ`†ä#£3ì"Xy¨Ý("U.ÀžÈW ƒ6%ŸC¶Ëy%oÛòL´)£s¨¼ë\&ÚËîÀ«£À$ßÌBnÇîw n•c82÷W(5w h|HÖë¢M2Ñn š´#—E>b1xäâ¸cpO:†§çþþtùæÝÙÙÿïÓÏø?ÍŸ ÿø“Ï?¿ÃWú·?¬ÉANæW«Rr,qëÝ ZŸ£ö]&™h/+.ÞXÛŠI>b16fìг»L(ÿ¶Ï½ ΫáìXA+7c³ÍY¹.í¦ ¨-òÍ,ÒØqPÑIÞ®!/}«s3îwö“œÜï>÷Á|’â'ëÜLù]`ãn§{U—Õ¹èV_n* Y•rí\&ÚËŠ1h#΋|ÄbpÄÙ+‰x9´­Èf|jÞtUÞ5fP^o%í¦ ¨Íò‹±ã ¢Iž+芦«¯ÿqwùÆ»³³O¾™¤W_~ñõ1?ò^Ï•÷¸¹ž«Æâ²ù{ú:¬î¹Bg¢5I9=‰ö2˵ÑçE>b18úìÛ:çÝšôäQy$3²~IOr#¿á¦š°6 &í¦ Y=°!ùˆÅèã<†òÌ­#·ÿxw_³v¤ðÝÜÕØ’O«uˆËÛõ¹‡³åÿ”WëÊD;™èȪ®‰Îò‹ÁêÀÇêñÀcíXÁ5oÇBBpÊ%v™h/µF?È™å#ƒ9ÍáÀða8pr9¡g®"T >h•nÕ]&ÚÍ“:ÚLòÍ,äýµ™bHÌå¥ñÏñÈlëÈ®%tN8mAW³µÊ‘h/uV?œ™å#£‡3‘] rÿÌŒãîûËë몌#°6’­d.‡eR°8×Õ»rq*±F£qHD»™hR“I>b1:˜lXï–7kz·˜;Çé.VçZyorå­í2Ñ^*Z¾ñÚ*JòÍ,ìàŽ7«¨b[¯·'k¿8ç(Á´]¾Yλ¼þPàƒV)ç"Ñn¦ˆê2ÉG,‡£s?³‡ T,÷oU÷MLÊ5‘h/ N=œ!ùˆÅàáLtÀTÜÛ\ç+"«Ãme³-Ÿ¤¥øwk%Ö¥>d‡Ê{ e¢Ýì.«ãÂ$±ÎŒ’ï=·øÍŽD³`QŽL [4Ê[ e¢½4zýÈe–XŒ¹EE¹ÌRéÌ©n1 DÏkÙ•À€¹"‰@í32Ñ^¦F&ùˆÅب°C»@Nåa äù àtC´vàbñÄ¢r!í¦¢A=œ!ùˆÅØáLQ¥ÀUTršJ8¼EòÙyXºjš Èi¯Uºªd¢½L1Yuô—ä›Y˜ÁÑßÄn¥•‡•¹ä”|ó£²%{v˜£r‘[$ÚMA£z8Cò‹±Ã™¢I,³H^1³H~{W^m*áråµ|×W®w*Êi„H´—Ý¡U‡zI>b18Ô l÷tyXsåõñÕ%Þy Ñl³¨œmôYyVO$ÚMIA=z!ùfqðè0q%}É¥×ÿuy{sy=ý¾MPÀÎNn¥ ʧ;Ëiõµ×…S݉ö²Òý-âVê‹ÁÁá”XY;¥5eí£96/kg|å-¸2Ñn Ú±Î"±<ÖI ¸‚>UÖ^±YäãÏ> ¿³1ÿù§hœY¹À*ᩪâ£nI8–±Àê"y6ÑÄÝ™U+–ˆv²â`¼6ª¼ÈG,ÆF•=Dvô@°Œd·8u]Ùc¯UÊè–L´—)Ú */ò‹ÁQå=xB¢g{nJÓe†ˆ¼EÈ`aú5UT$ÚMEQ=œ!ùˆÅàá Bä**¦PuÞbwuóÞÂÆ9~…»bÛJo±×*Ýö[™h/StQf^ä›YÈÓÕ™"ŸË@µ¹ l?—1a…q‡¿h*¨H´›‚fõp†ä#£‡3|.5ç2p{shBà˜gX?—ñ Bº{2Ñ^vWRï6v‡ŒÅàÀ1fî²Ve#›8†¢çN¹ÓV&ÚKAƒQ\H¾YAåQœ‘”;†¬XÙÀ”Ý'ð ü¬ù<§µ§9²ùPÙ(»”–ñ?Ä 7³SHåʆH´›ƒ:pLò‹Ñc~oVÝ´E„¹`÷ƹkŒ3!]°êÕ^*v$Ä$ƒ‡BÀOŽÃ“'ÇWxšÏðwñû1à§h>ý<­¼ÎQ~—ËÑ:ÏV¿XþŽŸ|‚¿ûôwŸ|üñJgã#žlïã°ÎÆØ˜q)òGp냲:&RíeÈÖêcÚ$ ñÓœ¡<ˆ8ó·{F7-‹lhænRtڽ˨vÓÒ¨‘€Äcì¨h“aZ*‡DÏ\ïUÉ»»Ü­ßíUø.×·²Û ½ÏaɂݭÖXëKŠK Ê7«Píe¥ÎécÖ$ ñ³Ögf¥òäÿú½+…Òbwö®ì^vƒîd‘j7…ñÎ, ñ=Þ žë¨Þaõòi<ÙaõQ3„‚1샰þªzÑ)tûüE×%ª½LÑ{}ÀšœyÈ;ÜÇ1EgYêáì‹RÇȺ%óh´TxzپăꉇDµ›Ž¦!Í, ñ<¤qŽ%ν$ñøòòþÇ··ûì§w×oo/o+ç¶—€øòeÈqI@œ©I@0ÛètWy ÚËZ÷—çµ­õA@â16*,,/d¯‚eÍü­.^YS2mc²¶O©vÓRÔ{HÀ™G<î±l@²¨ÖS…ú5)Èé&GníJ6²qú`ùã³³½Zi·v‰T{Yc1•FÖŒÇàÐò~k=¼è¼ 2ÔÊ›¥‰Í`«¢ð“v½]¤ÚMKQ?²!‰Çà‘cwŸËÃS÷MVøŒÝ8ø¶a«ì}y¿‹Ãp+FðåÔ+æ"Õ^¦QA&‰Çà²ãs·ªbþxz„ãV¬bžšW:§]ç©vÓÒ¬Ö€Äcô°†WÌÝ“óñ2øF†ÏÓŽ¿¥×ñªøó€ÉÊ7¯PíeŠ ô1dx Ž!{¶“µ<¼¬ÅŠ‘õ¬Ãª»€hPwkðª½tMƒ fx ÔxÏÜ…÷ŠîÂûÍ» LSav)‹{[å.’ƒè´»¨DªÝL1éÃÃ$àÌCÞ-2Œ)º„ËJ£ò Ü…?RÄp%Í=A#¦­ÑÎ/Dª½´4[ý †$c5E13ÓRy-~•Ã(ÄàC#EpÖ,«çKÒ•*|Æ^­´[©DªÝ¬1éÃÃ$ ñކ…oѬ|´ª1ZÇ /Cƒ»/m¼Fqs æ8DªôŒÓmHÀ™‡;¶)긞>56¸"͈vós,‰v)c„ì*\Æ^§´ëÞ"Õn¦ˆú1 H<ˆ;|XÖl÷=¶Ò$@ûí¾Ö€¨|%÷Õ^:jzX³H<k»|8ÝÐsád—EO±ÎI(]³²>EÃfùB\¿w¯CÊWqPífzY^$ƒÂÁ³H-ø5­´G«Ü!,†×¬Êmw—R´Û¢dª½´Ôyõ fxŒÄxÖJ‚b+m–Vƒa¹‹[,·¢vZõg )W¹eª½LÑu@xxŒ ?œL¡‡5e‹GTbdq©Z´Zªk}Ñm´Êð“Lµ›Žý †$ƒ51±Q>‰P ?ᇢÅtÈ0™ K¡;BEÑâA­”(™j/k V ^œy˜ÑÁ`Ïú¢¢Q_C v7¶Z#Pås:YQ×Qj7 ¢šY@â1zTxa-¼¤/ê«/¿øwNXXjók rb1myný,·õÑ êù„Dµ—åE«ý’€Äcpìwš’Öx‡GùëšÛ¾k¶¼l;AÌê:*Pí¦£Ð ‚™œyÄÁ#°Ì;€Uìš»ù®Ù)ZHË­ÚsE×lѩ䕻feª½Lœ>LÑ‘`ÃRû wO>{õ2ºÌ§UmFçv5xU-©vÓRÐjH@â1xP¬çZª¸}0¸“m€JÉ{Ïó‚©X@h£±P»Æ-RíeÉëÃÁ$ ñ~Õ ^vÕÉ1Ÿ¬¹Ä5óÑ¥„Ú“Ü2ÕnZšô#x Ù¿ëOÞuZ“dœî0ÓÀ>#”D“¯8‡XSæŽ ´wœËT{Y#}@˜$ƒÂÀwœÃ wœ³ƒÀñàVÓy²õí2ÕnZŠú‘ H°Ïðß[5‹Î-šQ½5J¤ÚËsÔ‡‰IÀ™G&ά5 ä[· @’ñíKè#õÖ(‘j7Íúq H¦¼\-o%øõÃ[c`7.®i2ÕnÖˆêHñ" ñ)N|yZµÎüq§-›ôN|Ÿy«QoïLŒêÈ”Lµ—–§×,Ñã¾Ð°Ï°åC‘e5;ͽƒPÝgˆT»YcVljg88NŒ|P åA©gwM%NOà3ùêÿÎ~Ëöú7u5¢“Yç^”‹óè"ë´Ú=8–gî3Ä\þÑåääÙ^Öš:¼Ì$$&ƒãËy÷Í¢Û8ìWBØXG†ØÞ¯d3-£Ð¾Òw€l7Mýh‘˜Œ}b]~Û§üÊÝ÷¯ß^üýÇ:R˜âÖü ”PÙyXfó.M^íO²5úyŠL¶“•¢ñêà3“pfâGŸ3ß&—å.ÎÃþäQ3÷'¬^ÙΟXkÍî宦Šd»ijjù„ÄdôÈÇòÈG¾Rû”?ùìû¯ïßÞ~ýýåõu­Oqak>%íZõâRAÉ»Œq­O±Þøà”û´íe©Ö«ƒÒLBb26(M^ªîÓ­=ì˲= }J  ²öiØd»i*6ˆ~H™I;ú)ú並>U{?;+¿Úw·ço>ú¼üáÝGÿõ'„ÿFŽæ£OË_ÀÍëËÛ³³{÷ÕÇÿßJÌ2|w+Æ[gí’µ”/ˆ©ñ0Á‡’ô©Û­D¶—ݺ Y/“Á1kfmå"íaóè¶Gd”ã²+6ó0.€‹Y=kÉvÓTl ‘„ÄdðXȆÌ4U>UõTÖòðGŸ¼}}yqWëU"lΫ`—œYÞO^%XLF Éö²U Ö$!1±Ž&.½ûåáéYÏ­­DÃf„Ûå-Á¹”AùdÔ²Ý457ˆHBb2xüc"˰ <µ3K®­\_ÔÖéY¥p+¾d: ã–.âhÔøW~4¨c`"Ù^ ZM“±ÑêèØŽ÷èž±ãýx†Â|‰c[Þ[ú’<ékª@¶—¦FÓ"ê™%$&ƒG=Žíy2ÿ§|ÉÅÝÅù»«JwâØ:ø¸t’]J*åsak܉·h´L ÛÍHS š$œ™Àè@uæ€×3Ö¿/©XÃ̯€ouì|ºtàLHúE"ÛKWÁ¶}f ‰Éà¡Í<ôyr ¼œœÜþýâºÚ¡˜ía]Ögï—>âh± ë Sò5‘d»ij€K“„Ädp\zÎÏòe‰Êü$Ÿ$?ÉÆ£ÑǺ$²½45¹¡Ï,áÌDî¤HS3ÏOddîÉù”û»ïo¨õ'Þl/A1&[çY‚‚U J6)}¼K"ÛÍJ±"=KHLÆF¤šG¹—ô°?y|p„QN§ñ'!¤µ‰l/ME×"ò™%$&cG>EŸ<×Ô*r}uó·«›oßV6#nΡìGìƒQçP’úƒŽ"Ùnfš[ÀÒ³„ÄdpXº(ÍÏìaå ã±&âàO1èM˜.ÊhkªH¶—¦fß ô! ‰ÉØ¡OÑ'¶ê!øºAÇó7×W­ÌO‚ßÜœc θ¥eµ¼[3ç8õ|G«Žw‰d;i6¦(M“ÁAéýÚ}zX9çø¨·Ë3Êy™sôí܉Oƒ¾;‘ÈvÓÔÐ ð! ‰ÉàÇÄ5µjÎñÇË¿ß×ä}ÞÜŒ#–¯¤3vñ'>ÕÌ8WìlÖ÷'Ù^VjmTš$œ™˜ÁQéxz"Ϲ­HO˜? OáOÒ´ÞP}‹H¶›¦Æ‘Ï,!1<ò ÈÓ¬JOþò®¶W8àær4¡d#¬¹+@Un’bÞí-V·ÐÇd{Y¨³ i’˜ŒHGÏ{…ýÚ^áG;XQf½Â­N(b“²×Ÿ—ÉvÓThõ„3yŸÛ@šÊ{…}]¯ðùÅýOïnúGmr²½náiýŠlÑWu X‹úµ‘l/3õ®"M“Ái°¬[d÷W×ÜΟ v0å3îÈvÓThú„ÄdðÐ, }@^¾úŒåÃ?Ü_]×NƃÛ^·0–%˜eß ˜šna€”¼ö­d{™ið 0i’˜ ŽIï‡pèAq›}L'ØfŸ!yD«Žv‰d»ijjúÌ“ÁCŸ˜"×Ôªmöwçoê‡O"no‰}L!+ÆGX¿Ä>›qZÀ®k¤Èö2ÒÔ!i&!1’޼·+®íí:¶h%ž ·+çKÐè”ó“d»i*ª>LBb2zàÃ{»b]o×þûÃíåëÿÏ—·µ¸WÜ`“úhp¹ºcE“פt)«/ð:@¶—µBT‡§™„3“08< ÀÖ"AzéâáÄ('$P÷+>O"• )ÈvÓÔÜ " ‰Éà$Ç5õéÅÂ_¹ÿ¿/p'¶·eØF¾t`ý–áIצázõ4E$ÛËHST§™„ÄdlpÚ¥°åa%êå~éN §¼X_«•+Ù@‰áÕwx ÛKSÑ4|HÂYSóØOѧÈ5µ õúòúî‹ËŸ®.ÞÞÜcr_)ŸÚíÁ_¾h‹]F]ò5ð€G êiŠH¶›µ‚:FÍ$$&ƒcÔYð—Q þV”çQαnm¿bmôÓAleM•ÉöÒÔlô# EBb2v4Ù×T¬ô+ŸžßŸ×û”òžüæ|ÊT¡O´ð¶¼ƒÖû”¢p1uŸ"“íf©I¨^$$&ƒÕÙ3è+‡—B_|Ad öÕlAä´m¢Ñ¾ |€l]c¬~ü³HHLFBøU~ÿnϯ¿8¿ùî‡òwµ®%lCÄiûtTÀ`6ø’&ƒr7ñ²ÝÌõ±êEBb26V Æ/æZ^š®XËH‡%_™ÖÚ6r-¼±A=aÉöÒUë„A$!1; *ê \W«–/ÿzU¹Ù vÛ6æO2°Ëêa0®&U)ªœötʲÝl4ëƒÕ‹„3yeÄ061³3[˜ÏleÓþÌVyá¹dD¨¼ŠåÙ^šê|‹Èg–˜ŒùåäIµ|ÈúIoruóýýý»ÚüÄlïÔVð.Ã)ˆëOmeÍTSN9@¶›•æ 5IHLÆ©Á:óY'Æ|UÓŽ`}8?‰6¸Ù‰H¶—¦úÐ ò! g&~ìȧè“aš:mW_ïO.nÿñîþæò¾2A±>mΡ¤¢*‰–ºiš»Æ¡ØˆÑ©×RD²½Ì4˜ø4IHLÆÆ§Á ¼ÖÖçL;‚aõù†eÚ®íµû¾d²Ý45´}f ‰Éà¡AwÕÕç¿{W½)²èóæà.@›r\ÞAUe~:ÀFîÉö²Ñh@Ò$!1’¶‰§'é¥é 0ʸ¤'íº½â´V¿./’í¦©±EÜ3KHL{,òô«Ò“¿îò“w·Wo®&A*—²î›KSÐa*î%,ïªÒ”mÒ>1€l/s×& ‰Éèèt\Ìuʰ^¸6ÒqÊxŠ4BÌÓö\eM•ÈvÓThÍ“±C ¢O¼âÅŠßóKeÁnÍ$‡1[`e”]×Ýjw2ù%«_F‘Èö2Òä[€Ó³„3yÍÉ0F .±èÏ¥•îäÈFûBlq'­6Ú—ž­³YßHd»ijjøÌ“±Ÿ¢Okj•;¹y;‡›s'èlp™uy•ÿ­q'9„¬ß5,’íe¤è[@Ó³„ÄdphÚñª¼[[•?ÒåU’¿“TåsJÉ©wy‰d»i*¶|f g&òqœ4•Wå]mUþòõÝ]e—Waº9´+a¶>.ËXÀUåÁX³;©k¥"Ù^VšCpš$$&ƒƒÓÞ1+õî¥é‰uœô’ŸØvâ4û£Þç%’í¦«Ø ö! ‰Éà±wëjU‚r~÷·»‹ï_Wºï7—¢$³ggRÀÛš¦«I¨^@Év2SkbXš$$&£ÃÒ†m·@³2E‰Ç (ö) DHQ¿€"’í¦©¹Eð3KHLÆ~Š>ñRŸ­JQîŠ"ßzW[A±›KQºeRÛÅ”«RØÝV·R‰l/+µÐ—& ‰Éà¸tˆË¸xé–¡€Sø“’•7DÉöÒTgZD>³„Ädìȧè“ãšZµåÍÝ·——¯ïþZÛâ`s«WÐæic)²/FÍê•’éX¯~(E&ÛÍNShš$œ™ÀàÐt° Hö¥£ò¬&Ü2*ß®&¦‰ uM•ÈöÒÔ¢R 4u–˜ŒûXû¸ªQù»‹ïÏon.¯kŠÛܬ<–ÿL†;S3+Ÿ¦“]¨ž¢ˆd»™ij€L“„Ädpd:FøÅøÒ]^Q†e´14s(©¤UAýBŠL¶—¦× ô! g&vðЧ×ÔºM^W7oÞTz“›mLh|4i©ÉÇP3Ú8õ¾:§^@Év³QlK“„ÄdlX¢aA_´/¼Xz-œ =Éq‚nÔ ("Ù^š]ƒ¸‡$$&£Ç=–Ç=öiÀ«üjßÝž¿ùèóò‡wýןþÛÙYù¦¾y{³ÿ³³³7W·oïÞ~{ÿÑÝ÷ç·—¯ÏήnþvvvõîþîÛZ¯c7Š¥’³d\ö}•¯J(æ¬Å„êû#e²Ýl9ëƒ×‹„Ädpð ³åÕêíû{‚õ,Îú˜QÝëÈd{i*xýøh‘˜ k0)U9Ì›»ë;o+Ý Øí%1)CQ –ÄäŠ$ÆkLòÚÅ2Ù^FšŒ>r½HHLG®=Ÿ{ôkçŒÑb'£÷&`Fõý,2ÙnšôŸEBb2xàãùÜ£¯›{¼û©¶^ï·7ô˜0¦ØJ_3ôX-ûµëõ2Ù^ŠV´^$œ™˜ÁAë’ËþÌVú’c©I 'ñ%%Šê`2Ùnš[D=³„Ädð¨'…À5µÊ—œÿpÿýVz“·çMbѲù”䫼 ¸hÔË+2Ù^6š­>h½HHL­!sø ¯œO9ÖOœÌ æS¼I6ïn|(kªD¶›¦B‹¸g–pfG{ {LÕ|ÊwÓ[ÿ{­?1››OÙùDzÀŠù”¢lÓH­>Ò%‘íd¥Î8}8z‘˜ G§Ì­4kf'ù$ÙI6 ‚öJ™l7M…‘Ï,!1<òI™g'ò‰¸§üÉ./o?½º«Ýñ…f› J`ÝÄ «”Ý.ÀÔ6Sl/3µ¾ =KHL¤wÃÚnâcã)Àº‰›õy#f«ž ˆd»ijjú„ÄdðÐx71Ôu? <Ö–â·×OŒ.ad+ˆjú‰½ƒÔý‰H¶—•ºÐ”& ‰Éà 4" ûWŽ;>¾4Ï æeÞѶó(ÁõÓ[2ÙnºŠ b’˜ û ²ÞwÌUoî~zsík”¼¹qÇäS4 äRÞAªwô~*$«_r”Éö2RàÒ$áÌ$ ŽK#¯ÇãÚzü£ pÊ âÕìö–÷²×¯Ç‹d»ijnú„ÄdôЇ×ã±®ÿæúüæ»Zo²½z$!1<òq¼LïêÊôs†R y¬B?ŽCA´ûÙ²ùT•ä§AIçÕK("Ù^fê]`š$$&ƒÓ>³°/˜•'¸¦0ñ G æGç}a“rVo#ÉvSUhûÌ“ÁcŸÀîö”‡ª£ó7ïÞ¼›~áJÌ&Ïk¥À /Ÿ+Îkm+ê¦?—"’íe¦Á7€¦I™‰šö‘C^ñ¥s(Ü) šô;‰E²Ý45µˆ}f ‰Éè±OäTA^7—÷ʼn|[y%¸pÝæ…å£ÂyùP…y¡/±«z E$ÛËL£oLÏ“Á‘éxŠUS”xŠM‰®£zŠ"’í¦ªØ ö! g&iðØ'Dž¢È MŸò(Ÿÿåþä‹/ÿôêÓ/¾¨IQâöRk¼õÌ£„P“¢”ð¬þZ/‘l/3…Л& ‰ÉàØ´qÌ£¿Ò£9ÙXˆÄ¡XtV­—H¶›¦bƒØ‡$$&ƒÇ>ÆóŽD_åPnÏïÞœßÔ6yùí¹“ì¦sÇ>UîÄM ÇêEy‘l/#M±0M“Áið¬(~eQþq‚â9é¥*ß®Ë §–Wõ‹ò2Ùnªš[D>³„ÄdðÈØ ºòPU•/þäüÝ•w•«ò6‡œ– ¸šª<‚3ÁªocÉö2S„È4IHLG¦#²öþˆ+åÕPb>ÅåF„˜œþn/‘l/MͦEì3KHL}"» Wªåÿ~y{W>ü•þ$æ Ê—(Óø%C‰©fPcƒ»ò"ÙnVšZàÒ³„3—ä ¾8C‰œô’¡Äverá ŠD¶“ªc[„>³„ÄdðÐg(ò Ÿ÷JùÕ¾»=óÑçåï>ú¯?!ü·³³ßOÿêÍåýG󦯳³«Ë—t~AÞ^Ö–¤Å,ï Ue-ˆ.꧈d»™njVÏ“ÁÁê¢5, +Çç §ÄxŠñyÌ&Y¯>>/’í¥©Öµˆ‡f g&vðx(ž_‡ªñù﾿zW;;ãöfçO%P^@°èkfç1lpn^$ÛÍH±V=KHLǪ/«¤µe•c Xò§˜uÄ\ÒÄÔÀd{iªs-ŸYBb2xà“xU%ÕUUþòõ¿þé“?üþ•m_iƒU•<]XvܧTUUÉ%ïýYG‘l73Í °j’˜ ŽU>ë×Î:[ïO2ê˜ ¦}Ä"Ù^šê}ƒÐ‡$$&ƒ‡>‘:ƺQÇw7·ïnîÞÕ&(œtôÀ°ÙùP5é˜mI½H¶—•Óª& ‰ÉàP5:ö¡SœtDŠIÇì¬qúÇæE²Ý45´ˆ|f ‰Éà‘ò†w”ÞŸò'_ž¿»úòë?TúôtÌv:‰²¼[3è¸S¶ ^?Éö²Òh Ò$áÌÄ ŽJ'^¥Ok«ôÇê' Oxe¼ÑŸœÉvÓÔØ"ò™%$&ƒG>‰éÓ3ŠôRýäêæö¦ò¤cJ,Ç£q﹓TUŽÏS·˜þIG‘l/#Û•& ‰Éà¨4&žž$ÍôO’žxS"k}w"‘í¦©Ð"ð™%œ™ÄÁL<=Áªô¤¸“òwX›àö²› ¦Ì²¨ÊN|°^ÿØ–H¶—‘&דž%$&ccÒYÌWVº“xØ@Î'q'%¬n°(R$ÛMS¡Eà3KHLÆ|Šr"ÓÔ\åN~ÿ‡ýâÿá÷uåøÂu{qª¬ÁòR•C)_B¯¿×K$ÛËLÑ·¥g ‰ÉØ 4š¸4a–‡—9FNq 8OER«>5/’í¦©©Eè3KHLÆ}Š>¦©òÕ…'wÙßLSóuùIá¹½Ç1°G4¡fÆ1£1»Ï²‘Jd{i-0éYBb26&Æ:f¤ö¥Ó'žQvËôI»%,9ûè¼¾;‘ÈvÓTløÌ“ÑË[5}rsÿ¦|ðÎký‰ÛÜø  /Ùɲ$²|ÞjÆOJ" ôñ.‰l'+&¶¥g g&alPmdAß®îö²™yÇIŸ Œ™ÚO´ŠL¶›ªfýÐg‘˜ úXvr¡‹„³¦æÑCËC[…w]]þP‹vY»9´ ›€P³d'¹í*š§ú&*íf¢ I/“Á!ig˜‰:£¸swNµ5ÜLB¯Y^&ÛKU½i÷Ì“ÁãgWÕªì䇟|sYéPœÝ^vâcŒl8m®ÊNvʦ]>‘Év³Ò¤J/“±Aé”õ`æôÒáøÀ('8Av2Íúì:“t5U$ÛKSƒmú„ÄdìЧè“ãšZwåîüòæûÊn᜶7_âÍdaŸ‹ŠÙø¢k!º v‰d»)6€¤IBb28$íýâNÐÅ£…Ú –­”7ž×ÏOD²½T5º‘IHLÆŽ|Š>9®ªuËVnß~[ßÞåÃöŠ7àÀ û`T9kK¤­žŸˆd»Yin€I“„3“v™£ù¥ÓŒ ïòÆï²»«×úþD"ÛKSÁ·}f ‰Éà¡Ë<ô‘×Ì=]ÿñîíÅßjý‰ÙÞôI„©Ig) 8¬˜>)Ê–\V¿,“íf¥¹*M“ÁQiÜJå!±Ú%Ÿ$AÙÍQ4p(Ù^ªšB‹Ðg–pfâ}|æ J®=|þúûëÊu…ë3”©Å(9öŨÊP‚Ç >€"“íe¦hZàÒ³„Ädl\ovk†¬ï*ÄNÑ/lËGQ@^&ÛMSC‹Øg–˜ û8Þ/ìêú…o®Ïë/·Áva¢7n™?qUíÂE׊[ÒÞ)“íe¤Ù¶€¥g ‰Éà°tà”°¶‚r 𠬀ÒðŠhÑéç'Ùnš[>³„ÄdðÀ'ðJ¨+ ¼þñM½; ¬Ÿ¤lƒCdŸ‹ªì|4êãŒ2ÙNF Ƶ@¥g ‰ÉبtÊ|Y}^»¬~éN€QfËê¡™;ñÞ´Ú×´d²Ý4>$!1;ð)ÊÉ;×,«ÿñêæî§òŸ?!|óæêâöíÝÛoï_ý¸ÿǯŠ¿y{óÛ‹·7÷·o¯ï¾™<ë_!Ø..¾µ¯¿ý^™W ŒyUŒã77åWü&8k1¿>wMßžÿõÛ‹³³BæâþºvR²tªÚÌ7_|õ忈kþ'+¼ÖîG´AB‚¥VP^IÍ^üI¯³ÑœÉöú Xßÿ& g&npüÖÀiNâƒ;²V^x Ô'ñE²ÝT55ˆ²HBb2v”Uô)pU­BÖþøîâ÷,A÷µó.»‰åCÖ‚Y®G•w`kà5LØ].W¶T‰l/Ku¾N“Á1ð˜Ø4~L/ÆgðZÄpxÍClÑŸ,’í¦©Ø"ü™%œ™¤ÁßÈΕ‡ªiü·×—ç•î$âææñSÉB­[ŽÕc„šy|åP?G‘Èö2R`à$!1žaàÑ¿tû¤5ŒtXÖONÉL‡€ÑORd²ÝtõCŸEBb2zèãyèã«öO^]~{{^=¿ëçÞ6æÐ/×¼0ºŠu”E÷&RÚ _d²½Œ6D}T|‘˜ŒŠ#ìðzÝaÝö0À-h6Ÿ§µ¼;ì[YS%²Ý45ë‡B‹„ÄdðPv7èAÌ®žr/åû÷ýeu·2° |+ KˆÓÚ6†íj‰kýI4&õb2Ù^VA©^$$&ƒ#ÕÏ¿„µó/ö½£ÌÆ_šõÄ·Z§~R&ÛKSÁ4ˆ|HBb2xäøøKX9þrùÆ»³³ßþáÇ«›Ú³í¿ õ.ðñ—P3þR´-'ðÚ f2ÙnfšôaêE™ S'`a_’Ûº‚JJ±}A%NKvѪ²¦Jd{ij²-BŸYBb2xè“vöJ¢û{–C©ô&)áæ¼‰7ÝóZÞÁn%üjo1믗Év³ÑÔ£& ‰Éàur î:p¹n˜2±æ˜f-_1¦õÓ‰l/ME×"î™%œ™ØÑãÇã¹—ò)¸ëâöïîïjá®ä7w­ˆq©Ï'[w¥lP}¥L¶›•bPš$$&ƒƒÒh™•ø¦¬ÈN˜?AOáO¦#OêÓ”2Ù^šš]‹Èg–˜ ùì½*=¬ËNüÉ×—7wWS¢Û\~’lÊ™¯CS•Ÿ`ýãõ2ÙnVš[€Ò³„ÄdlP:&»”Obr+Ë'þ°?)ÄN°=¬¼pÌúÇ!e²45ß"ò™%$&cG>EŸ×ÔúòÉÅ»êJÜeEs(CIeû`Ô”O '³«§êš©H¶—™ZÓ”& ‰ÉØ tÞzÒƒèþê† µ|’ŒóI}Á±L¶›ª†±IHLÆŽ}Š>E®ªb>õä>ÊûïêÊ´úds%¥÷.°d»CÈ×:”d§o¡z†"’íe¥Î6À¥I™‰—ÎÄ«<è!^ÙäS ^å¯\ToÉvÓÔØ ô! ‰Éà¡É,ô1ræÿ¬ Ê_ËïYéQLÞæe‚u»ëÎó;H5˜WrÞAÐÞH)“íe§Þ6@¦IBb262MðÌNå‰Ìªš|6ñ5ù4õ 4ð(Ùnš -bŸY™I=ö <ö U5ù»»wWו5”¢Ñ›«ÉC¶ÉçÈü‰¯©É£±Y%¥L¶—•×™& ‰ÉØÈtvlÑ_vò¢¿5—a¤ýRDi72ÆÛÝ·P[U²ÝT„>$!1<ôql½Cy¨Zq|óööÍùõÕVzç·WDW’º2}1jŠ(h0€ú¦H™l/3¾2M“Ñ‘i\Ö#‘Ùæ‰ŒÓ1ðúE"ÛMSS‹Øg–˜ ûX6~[”«êHäÕ›ò7T}Ó«pÝÞ•Hk¿¤(6U¬.Ú†ÖéOÉ‹d{™)„Ð4IHL‡¦]â) *^‰,ÔNÑç5]ŽÉ R‰l7UűÏ,!1<öqÈS¬JQ.¾ýîÍw·µ»í ×í¥(8mû[QÊ£*E )¡S/Ë‹d{™iŠ  i’pf"ƒ½Ã˜)æÝõå!•»ÒVì]a)Š1é)J޼ú•H™l7MÍ b’˜ ûÃË}òõÕ§Êß.oo.«¥dcÍæŠÓ:QÇ>¶Â¡LÚÔïDÊd{™)ÆÐ4IHL‡¦}bqŸO+7?¼2£Œ‹õåV%¹`Ð[m‡"“í¥©åC¦®©‹„³¦æ±CŸ¢œÀ5µjïðÝ÷—×õþÄãæ÷=0ÌCÅÞá¢{rÖ.ÒËd»-èÕ‹„Ädp Úó"½_[¤Ôô…Œ2«Ñc3÷âíî>»¶¦Šd;i*£-“Ñ!^£÷u5ú7w¿¸½¯õ.¬Ð‡s^Ö—ÏEüUt-&T¿“"“íf¤I¥^$$&ƒ£ÔM#—‡—f+À(û%[i¶v8EçÀƒö^/™l/Mµ¶AàC“ÁŸà€kjå•”ýœc¥C þTéÊ8Å–ÿÌËÜ|¶&?‰.F£>”"“íf¦¨R/“ÁQê}êü ߇­¬Ð‡´TšUèSô»ÝÉêª*‘í¥ªÎ5ˆ}HBb2zìÃNø”‡ª‚ÊëË¿²µþ·WN™ð–¢ì{QQN)º†°•Ô6Rl7#Í @j’pf"¢c¤˜ã²Ü¢<ˆ˜ÇaGî¢dð'HP øê‹‡e²½4Õû‘IHLÆŽ|Šrf¦©ò½¡§ÜÉw—Õí^…'l½šbsùÀ±5Äy7xºÖ»ìUOþÉv³ÙÜ£& ‰Éà5D¶ê䛓k²•ÈI/èslç^r²ÔË)"Ù^ªBƒ@ˆ$œ™ø±¡¢O‘«jÕ–¯‹ë¿^œßÿßÊt`‹[¾¢YîÒ–w*¶|¥d\ˆúéŠH¶—•–÷¤o¥$!1¥Ã6]€¼“¬nâì ®n¥"ªû‘l7M B’˜ŒúXúت-_?ܽ³¦Ö›Øímøò~Z‚»ìŒŒ¹bÃWÚm3VßÈ"“íe£` Ô$!1¡ÞŸF¦Å _1`ÃWšúŒ>ø%’í¦©±AÜC“ÁãžÈ®NÛ¾ëæçßTwÇ´¹ý^ÓÇàÌRJ‰±b¿×ƒª©ƒ]"Ù^6º¿^ØÄF‘1 ž6ðÿÌ^º%0ÊvAB;oÑjï‹”ÉvÓTh÷„Ädð¸'ÖäžlÕ6–·×—ç?ÜW;”d··%eg.rÅ6–¢m0mÃ×7Sl/3Eß’& g&òñÒÌ”WOÒË«'Ž“>Á”„Jh }uK&ÛMUS‹Øg–˜ŒûðêIª«žüXþÍÛîjÇQÒöÊ'èÚÀR”TU>AŒûcÚf*íe¦Ù7¥IBb28(-ëŽrBµb‹åˆ—[º‡m3—‚ƺhÕ (2ÙnºŠúÑÏ"áÌ$ ýDÇÁYy¹÷“”Ûë7ooj1/¿½öa—òz|´íÃEצ²¶C‘Év2Ò‡› êFú !1—ÆÀâ>”k²uõxŒKûp³zW]Ïq{P— ΄€ìƒQu¹’» îPD²Ý¬45À£I™‰ÜÔ8Ž•bæ!ŸRrAç½v{—L¶—¦Û ô! ‰Éà¡ò› Y¾¹ðd1þÎ}SïNÌö°.œu,?A¬ÁºœƒäÕ Ëd»ij€G“„Ädp<:#7Rù8Æšü„mÎyÉOšmFïôÛ…e²½T5º‘I83±ƒG>9óüD†æžÑÜuusY×Ûå1ÛËO|4¬x²ï YëP¼·1ë^"ÙnVŠ i’˜Œ IcfÇåaeñ$.ÅbKñ¤])Þƒqú›¼d²½4\ƒÐ‡$$&c‡>EŸøÎ9[U<ù_»K[Ó/Z»ÍËm®†‚.9‡ ä…ÙÔÔP<„òú.E"ÛÍPs`š$$&CÓÞØD.ezXéRC^±SÔã=<¬ÉÕÖTl/MM¾Eð3KHL†~&}Š\S«\Jù ¬LO,nΗL»V BXÞTù’d²EíCÀ2Ù^Ц(M“¡Aé¢.1 •G/kz» 1OáKÒ´¡Oß—Hd»ijhõ̓ѣϣ_µ¹ëÝÝù»joâ··¹«ä%`isWy¶bsWQµ’ú £L¶—îau}pf"oVÇF úŸÙÃÊÍ]QÎËæ®fkë1:3yDmMÉvÓÔØ î! ‰ÉàqÁÄ5µjs×ÛëËÊZü¤ÏÛÛÜ•1ååªSy©bsWQ5 ú[…e²}l4[jH“„Ädh@ÚOðùb£.­<ú{ ç*Úx‚Ü$¢­]"Ùnš â’pf{\r\S«Žþ~÷úªÚ›¸´½›¿6¡]Z‹¦¯EÅÍßUƒ66 cØèãib£À˜ ŽE;˜º•{ !]»þÂæÞ¤$â- ñ"Ùnš â’˜Œ÷8÷øª=wß_ÿXu9¿½5Á&¶²¼[±²([É}£zv"’íe¥E;ZX郄Ädp<Ú‹ù<¬¼!ÿ¸S˜]>àˆêˆü¸WSb[!Ë+‰7å‹ò9úK¼D²½¬Ö‡5IHL‡¨½ea w/…¿¸qpÿ‚ÁÆ Ÿ°ˆd»i*6…HBb2z(äx(äªà¯ò»üð®>cñn{NËë­cŒ ­”Ô0‘l/3 ±JMÎLÂà(u°ÌLƒ}qÆi·d,ÍÎþb6è­~AE$ÛMUsƒØ‡$$&ƒÇ>ÁWÕªŒåüõß‹?©ÎX‚;UÆ2ŽG vWËZÞ©IQöÚ¦îQD²½Ì4ÆH5IHLGªÍ²Í«<¬ÝæGj*æ˼²16i;™l/M£û,Κš}Là‰u˼nß]ÜÞ‡Ú†¯ííòÂòŸ¢cŸ‹ŠYù]Óv'2ÙnF ú8õ"!1§¼)3ÈM™+JôQÎKA³Ù©Æl,`làN$²½45ýÀg‘˜ ø”Šiª<0ü4âuñýÛÊ»ZÓí£Øé². Äû•U«ý‰ÍI7¤L¶›•&}\z‘˜ ŽKGÏZ¾¢éé_Ï(‡¥å«Ùî•\rA­ö®a™l/MEÛ ò! ‰Éà‘Oô¬ÖCUË×Åí?ÞÕ^þ˜n¯åËg=È帊–¯<‘À¬žŸˆd»Y)ê£Ò‹„ÄdtTš·|…µ-_Æ £Ì:¾L3âbt!hWäe²½4µü6úšJ“Á#ŸÀ;¾Â“_Où‹?~öñ§;ŸÁ5v)@SñÍ×ÿúÕÿ$z úGkZºv?£¶n%šeB»¼ÞÓõ‡Û«¿Ÿß_>Ã…ý‚´÷­Èd»fn€C“„34Ç0÷öƒÜÛ¿"%a.<œÀ…øˆ%TÔÞ·"“í¤©ÖøÁIHLvÀ;®©O5uU¸ðùƒ I.˜ ì aj\È.ãU_²"“íf˜¹öL“Á±çˆÕ—2ZVuyµÚ]‹ÏÑÇ`õq-‘l/]µ¡A¸CÎLüàáNDŽkåu¸ÖýåïÎÎnî___×¢Zys¨:—râ¨VªAµ¢O!ªŸ<‘Éö²Qg`Ï$!1{†Èš¸@> Y·fàM\EëË+WOID²Ý454ˆ|HBb2xä๦V5q½¹;¿»±•îÒæš¸’/rg¶bMWÜ} ÕÓ‘l/#õ¶ôL“¡¡g‡ÔÄ5=¬lâ ¿t'™QNK0—›¹“dC0ê…e²Ý456|HBb2tà3é;̓r3Ë“Ûé«““‰åöZ¸B‰8€¦°Ë;ˆ«[¸œÝ-šÕ‚?D¶—–àLÙF¹„Ädp C¡Ñ<]r?‚t±þ-´K רk÷¶3h¯>D¶›š‚vÐÃ%$&C=“fWÓÚz»P$A»ÔÙCS'1êâ4iºª±Œ‘¤¼¾È>)•)*ß\;tÀi[€Ã³„3“088ìÙ>Ñò 5"îÓIFÄ‹ÎÇÜÀGd»©inÊÌ“±C™¢OlDÜ'ÅqŸ6?"Ž>š%±ð±nD|§Tú‰…D¶—5ºØž%$&ƒcÞíµ^Nƒ* ß>œ¤7Æ€I¿[J"ÛKM½iÛZ^vÿÕ0²ìþk»f) Ó¶/õ± ‘l/5M¾AlC“ÑcÞ¯^tÿõ½f)Øù×­4K…fÙ˜WÞ¿÷úìf©½©Oaˆd»_n€ “„Ädplx¿ë—Ö¬Ft„‰ùˆÝ…ŸÖ>¢ØwtQ}tO&ÛKM1è‡2‹„3?x(ãø°“‡…ª|„Ëx"ñÍ×ÿúÕÿ$'ó?Z“Yì~F뢆KÆàÒ.åRÍrôµÒv2Ù^ö¸?uÚÄ1ŽìàkyXã6æ"ÆoíÁÏz°¨?'!“í¦FA?úX$$&ƒG‘d-zŸõhOöY.ÚÕ"›­ U÷XtJ»V&ÛÉÃþZWct ùXÝ@Æèù7]ŽŸ¨1ø¦cÊ`rÉ ’îgýånÊ´»ª©L¿’øˆ;Ò§À?îòrÛº{øðq/w`{të?îj5¸P®!¡ÜË*õÏRþBHâ38Úêb`™tïÅ<{Y“ctaÙfàÚ >óO¢.ès„r7…Úå_I|¯);¾ÈØÉ‹Œ+pÀRn³¦Œ.XgòR.p»ÅŠ’¹›üÈþW¿ùáúz÷gߊ(ªùÑ?ÍÏýÓþ|vó›ÿîÌ´oöö‡›×××Þ½*Ÿ’ßLÿê»ù_þùîOʯóÿüÍÅÃÛxøÅè/w_?ùöíí›óû»ûÛ«b{ÿã7ÿ1)лó×ÿ§¼êåG÷_'úÉòøø'ÿ§ïGH?öõôGM¯ò¹|ç/‘øìæõ³üxõúþû~~~]¾-åŸß.D¦,ç²û» ú˜tzÿwZ¾ÜG~Þûf.‹míÿìñþgÞûa²<úÑÏ—?ùÅÏNŠôÏ'‚’òiR®; ;}Óƒvžù ÜL_î¸å[žBpô-/~ÍRúÃÕ¦‰´®6Ù‡Ã,ŠŠ)‘즙¨´ÎÒƒ¡³ÕI‡WMµ=ô±Sí¡#ŒuÁ…Z¯šËy™Ê(†ÏÏ?¯ a§@º¸£D²—Åå€-,Î1bn7ŽÅy ?³‡5™è£]^–‘Íî1:¤í ¢öä¤D²›jfí0e–nf€ƒÇ)YœâóS9§xéêòæ·þúìŒgB¯ÞüpuÈqìœÆ'_ýáß¹&/ùi܈ã°!E¶ü<ø«G0º“”ÉNÖ™Lmë|ŽˆÁÏ8Ö–;tÓÚ#»G³´­³gKX¤ÝØð˜d7ÕÌÚ1Í,1<¦ )qÕ|É]]^óš”3œ¨æ5Ž/pƢǥ¶ ®õœ Ê’É^g!h܃tÄ@ÜK7ŽÁùY¤&÷;ðáˆ/ðì P+_S¯¸²j>&ÙK5ÑSféˆÁàaŠ™©¦|‡±Êø›óEìÄ îàwÍJ«|Ÿ ^ºsÉn—´!ÜY:b08„A¸qռ㣼€J15’÷Þ&å9‰d/ÕôV;L™¥#ƒ‡)q™qœÔã'í<Ù`üÀ,å5@ðK³mŒëgã}öÎêÖž%’ÝŒµQÝYº™AÕ–¡º»Öøú‚Ë¢k^}F­Ñݺ%‘쥚Á©·L?HG F]]ÜSÕg±àpýöâüúòÕÍõÝóS‰ÈNln%•ÀéY@öYX]›Æh³ò²F‰d7{Dmw–Ž Žã‚3?³1º|ö’ÆÀé²Ñ…ÐÆYØlÌnÜBµ&Ð쥞ѫקgñfnðP\àú)ZS]>Þ~È'’Ec¸€ÝÒÖuùÄ^©t‹"Ínv˜õ+Ñâ‡Á1Þ˜Y):æ•¢äƶ†œÊ«.¶®[iöÒNðê v³xÄað(&æÄµó%Õè_z Nå%IåëdØÎŽ1V¸ˆ©óF·&!Òìe„Éh#¿$qú…hY¨&OÛ­Þ÷>Q2wm‘ŒU.Kˆ4»igÐ`Ä#ƒ0#×Nµóæ…lþ¼¹5Þ˜!*ΛoA¹,!Òìe„hµÁ_8 ŽþzŽ6ùUh“ä"§ËЦԨ)Ƙ•k"ÍnúÕ{ìfñˆÃà!Œçh“×D›ü´©ø o¢`–·R6í•J¹ÕU¢Ù˳S_Ò5‹7s¯ÜŒc‡ Y>ŸV-ë}”J8F–Í5ZÝâKÊf•'DšÝ´Ô»ïfñˆÃàQLÊ,ÑM/ÚÑû /‘Ø’Þíz‰i²uW˜šßJÅ’Þ½RéNU‹4;Ù!§ú’xÄapÔ7Öæ”ä-ãq)6os*¯=êæ"ÍnÚ™Ô{ðfñfroé@Ú×ΗìÙx¿•)I€è¯¼•ÉbˆÆfú«[™¦!Ééö2‰4{ÙœõÚ /‰Gy‘7¾âªÆ×GyóؾñuZ[NÙ#H4»igRWfñˆÃàñ òÞW|²÷õù7ØÜjÁGËæäp}s«wVýª¬H³—͹ >Ž4‹GGt“a³©IÞY\1 ‘¦*Ccà¬ú1Y‘f7íDõxe8 ¯$ë¹vŠ]u•H’3'B’†q 覭ÉKÇL±}[7:ÝbvzŒ>%ôêGH<â08|‹ÀŒAk«¦æ[•|ù i¯UivÓά°<ˆGX×N½ÅJ˜¶·X)ë[²‡qõb%LBåõ¬"Í^6@ªÅ›9ÄÁ¡Zà ZaÕ‚ÖG»•0ºlCëN´ð aZtw´Š4{ég4Ú ‰GX€oi…'·´®H Ÿì2ÈÈçÝ饺éÐqÃ~"úäsÔõ"ÍnvÚ.‰Gp³av˜åfÛ 0)Ûæå…èKv¬<*-Ò쥠~Ù’Ä›9Œ}ÖrR#ǵS¯¼íöÊ i*93,)›Õå…ˆ]ÐÅ’DšÝl.i¸$qÀÍ‘ 4d¹½ý¹XRæd—>ÀÜÈ#dðÚ«øDš½´3Yõxe8Œ¯ÄÀµSqœ!ÇqHÞ³,o%¬gØ+•îØ›H³›¢6¦Kâ‡Á1]‡¬aÜášÉhw$op˜[ç )–ÄØè¢K"Í^Ú‰N;†!ñˆÃà1ŒÃȵó%“Ñïç N:PõëΦkpØ>%—üÚ¼!qVÙ#ˆ4»Ù\ÖFtI<â06¢ .mIÑä5mIGjÐ…Ró¶¤lS¶^7oiöÒÎìµã8Œ¯5ò\;_Ò–ôžGˆÖæ·µ*ÃçäÓRk(_‚ÕMJÙ…ýB&M”hv2ÁlŒ6˜KâÍ&˜Çs£aÀRyX,)5JØÚAøâŠÝ:Ü&í¦ŸAz–XŒÁ0l©<¼[zßGVBþº³†4mŠ6Àœ’ž;Þæ8ås 2Ñ^fgþÑ,±ÒÖ3³³ò^Îç&.0ºaÉÕ]£}ÝÞbÑlmÏ í¦¢Q½™Žä›Y„ÁCë‘©¨ìǪª…؇n%˜Î­ºlÝòVÜún%ïìÃÀ¤ît‘@´—):Û`¼èA>b16´‹,Hs/:j#£ë—[\66ò.@y$Z$ÚME£z@Cò‹Áã8ê_r<ôÞÂxøà-’·Ñ±ÛÒÑØ´Þ[x°YûL´—)î7?ªš"ÉG,‡}a¹…“3¡Š¢„³®9æô'ãD¢ÝÔÃ’X Î8Ö]Ôê©Ì‚û—ë·=¿¾úÏ݇ÿììë··÷W7ßíÿ˧—ßžÿp}¿êž\á7‡R¥dë»™.­F©ŠÎeƒÊžD$ÚËPƒW‡I>b188låÖäǪ–nåIv›y´1*‘h7Mê¡ÉG,u,°¬Ã¦—d¿¨p'Øœ_Àé²ÏS´1­ö èÌtS×ìD¢½Ì.uh˜ä›YøÁ¡aÇ‹† ‰g_‘cx”c'XšáQXrií‰ ™h7EõÐ…ä#ƒ‡.{LŽôJ±záàCõ’) á–›5Ñ…õÕ [²VŸ³nýâÙ^æAÿ°ã"!1 ™Oäg O|öÓåoŸ œr~lڗ岋EÇ•t"ÛMS³þ¡êE™ ŽÝ}Š\SŸ¤`ðÔ×ÿ¸»¿|ãÝÙÙß.oo.¯½{õúúúoùìöÉŸÿôÙ7;ÿòÉWà£Ú|ãÌVÒ Èn)‡¼~äb¯m ÄZ&ÛËLSÔ?¹HHLG‘=¯8z¹âxØ¡<§<£ì—ñ ßÌ¡øCGå]‡ÈvÓÔÜ ô! ‰ÉØ¡OÑ'Ï5õ©9 Ñ¡üpwy[ëN¢æDîdØy”œMËUœòõX=¯1©˜höýk™l/›EÐ?½HHLG–ù4m<0M{Ø»<îºrŒtf]WîוW} ÖêÖÒ‘í¥«Ù4ˆ„HBb2x$äøª“§PŸò/7÷ŵTº—akÙ ZŸ÷c¹´ºXâ¬7“']rˆl7Mê÷²™„Ädp<:𦬠֔Ú7e•·mÁù¬<,~ˆl5Ec¬úÙl&!1<ì ¼5+<Ùšu¬lò~A=l°ÑÊN‡A–Tôë­H‡tK$‡Èv3>T¿•Í$œ™¤±çèG´PéÈQ¡Ô|›ˆ+ªî£‹ÊeõCd{©©uú¡Ì"!1<”ñÈá,Ô[+âóÉÖŠ \Y1ÛÄæ}bHÕ3+ë¤VÚnC&ÛÍQ^擱áåÀ»±Âºn,ûà6~k~ÖƒEméÙ^jä¼~ô±H83qcGwL…—uLýb œ*ô¶úbò;q~%ÝRÁeïs^÷8Å!²ÝŒ1[ecäÎLP<È5Œ1Fp,yNäpùáñŠF™Ó6*>L/<ĸ»¤§¬©Ù^šº/ëjkê,!1ÓÀ4Õ;®©O«‹·?ܼ¾žº¥.wZ¼¶þ>Ÿ¨þ0¬ƒI»+eȾ«ï\`*y‡ŸŒ ºG(w³Ýœ•m÷B±r<ŽùFv3¯<<<ÀHó½ÑÎæíßzò! ò°ßʽ”6íÐèBÎ|üàÑQd‡ôŠš­ _|ÎùÅýOïnúGeÍ;²‹{©yOgXߌiu=c§p'Ÿ­|dïå^öMja¯‹ÄGÄ`DZ×äXŒ˜äC ‡Lú¥“a>&ù2nébœ™>‹Q7¡9B¹›Ê†&qÑ"$ñ<.J»m|ô bw²‹ùñêæî§òŸço^CøæÍÕÅíÛ»·ßÞ¿úqÿ/¼*ºüæíÍo/ÞÞÜß¾½¾ûŠ+ù+ÂÅÅ·öõ·ßÀ+ó*1¯,xŒßÜ”_ò›oÏ!Do|ñÖÝ·pvVÈ\ÜWO˜Ãñ›ó_ÅyeXfæbÚµ|¬÷_.x»Õê‘r¯ØØäc@Bqpœ$ŽÆÉ£Ï+Ð86ñ¾»Rþ`†ÞÞypûeGú*+Q±IȵI|¹9,‡U°Üëßœ¿»ªt0€§åÆq0Óþw¶†¼|7êP¸BËøÔÄÁˆ”{YkrÚú/„$>ƒƒèû¥2ôðô™ãÓ&S^.…4Žxç9Æ ºóñG(wSYh‘Ägð˜(ËÛ'žjüéþûË7—µ\´›ó0%%d=­åøÕFvúæwÎÝ9ù#”{™+ú&ù"äÌÇ ™£e½Å(ûú]:I S’Fë­Í-TV¢ÜMeS“ h’ø ¡ó\e«ÆæoïÎ/o¾¯t0èO56?ŽƒIÉfðŽ}7VÏÉïÕ-º£G(÷²Öì›æ‹ÄgtÀ<±ù¢F/l$`k ¨ºQÇÚÃ;/êŽÊ+¾ŽPØ&&"!g>ið˜(ñy«$Ï[=å`.nÿñîþî]m779?Í·LåÀåÀêÉù¾oL€Ô$“)w2WkBH{’ø i#_ö} z­ë‰Æ”NâaÊ;О¦9B¹›Êb“ h’ø ís9z¨Javæ¯å÷¬Íbp{YŒ3]0ìÓQ—Å„`¢w-Ú¡eʽ ÖÆ&¨ö"$ñÕΖµýd+¶ý¬èTc>&Omo§ð1Áúý­}••(wSÙÜ&,"!‰ÏàaQv¬v˜åãtOù˜?¾»øãýËßÑ}­—É ÞŠ—‰Ëçm)÷çÝòœ/“MÜ-Ó×7Y‰r/“uÐÙ^„$>ƒ#Û!3/òJ/óh>[]Íâe­.Þ¿óèƒØÂˈ”{©¬7m#’ø EÃ;TL•—ù_»¥ø¿«Oe¢Ùž“™ÊR\ 2+ –”È4q2"ån›š Û‹3Ýc‹…‹Wd§ŒÍ°…“Á©JmtWä¡ÜKeKÊÑFeg!‰ÏØqìwpÒCUOÙÅõ_/Îïÿo‡ã¶×S“µqYe ÆÔõ”}óÉ+¯;B¹›¹¦6è6 I|ÆF·Áì†-èAô‡+ 2ÜÀ0]ÝÂÃäTñÜ §L¦ÜKe£k‘3;zP–©¬Ücý俀×?wU;yY¸ ÑÓ¯ÛÅ”h9昋ٯw1ѹ›ÔcdÊÝ움ۋÄgtpx=V"eÇcŠ>žd0fºþTL¾R&SàšDE‹Äg쨨(¯Ç¤*¤ìÍÝÅý·µ•˜´9 ”Üv9/s¬ɦuXy·íAÝXEÊÝŒ57µ!‰Ïذ6XÃRkV¦0GŽH‚e/ZVbbù Zh1Ù/S%5n¢²$$ñ;$šà˜ÊÊ«3žò/ß½®Ï_¬„þþºýK ®¼èåz$˜\™¿€7°ÁTŒL¹—±¢i‚h/BŸÁmËv󗇕ë5AdQwšü‚!6ñ/ån*Ú„D$$ñ=$bwŠ–U-×¼»¼øþíÝ}­‡‘Ðß_·‡lý2Ø6ÔíÖŒMÜ-éÔ7W‰r/sͶ ¢½9ó‘s‚a̵|[Ø¢§WîÖt‡‹01€08ÐÂÃ$;í3m0#S±MPDBŸ±ƒ¢¢¥¼ý1®Ø­É²¿_ÜV:˜¢Ù›[~95,y°Ëæ˜ê–_Æ©Pm›@d"åNÖêŒmƒg“Ägl<JTò3{XY‚y”Â0ˆÌ‡Ó4+GL.6Ù#SÐ&&"!g>r«Ç@*ËÖ镇ªÌí»â_BeãÃöj0“ƒ iÁȼ«¬Á`òÞ·X~)Sîe­Öµ´IHâ38 íò’Á”‡•Ì£ Ãȼ1§ÁÈ2XŸ›d0"ån* mb"’ø 96ÀUª2˜·×—ç?ÜW—avCÛr1)ø„q¸‡•9L†h°Å,ŒL¹—½:ßÓ&!‰Ïà˜¶GžÃ f“O“À±%À‚³02ån*›šDE‹Ägð¨ÈgžÃäªæîûë«7øÃîváÆapT; ‹®è”ÄdNyiéÌ-]ŒÏh\‹Y™r7•Ím¢"’ø v]¼æûøãgúÕ—_ðä„õ¥Ø­x “#øeL?î2å¯àÂT©i`…å^VèL¬š I|ǪS`^£+¼Æ£Ì„ÕîS\¼F»Úýî…'ú{,Q¡Q”3 I|rRH\__â5v WYátD·ñÍ_}ù/¢ï˜ÿÉ ²û%/â#F»\¥œþ`ñ"¸½úûùýåsÝȤWêuúC”{™¥· i.$ñN¼NŸžQ§?R@án„Õè[»Dýý!ÊÝô5¶ {„$>£‡=¼DŸž,ѯq#¬ô¾Q7ÓîdùüJx%~­)zÕÃ’(÷2ËààÎ\Hâ38îœx]3ÉuÍšlOæF¦Ó¼êuøC”»é+´ {„$>£‡=|x7Éû•n·îF¦m>™í6.~¥Þ½ÒŸ©?D¹—YFß Z~ræã‡–Ñ07‚fIZ†Y+ËmÜH¶Ö·µÊÝô5µ {„$>ƒ‡=h™A«èFÐnÝ$k²ÉìÊWʇÜÈÝäFö¿úÍ××»?û¶PüCQÍþi~þèŸöç³›ßü÷ýÅ×—ç·ß—·uÿöâíõo¦¹°ÿþæâAú‡_„þ2÷µ¡oßÞ¾9¿¿»¿½*¶ö?~ó“¼;ýÊ«]~tÿ1¢Ÿ,òú÷~dqôc_OôÑôêžËwþ"‰Ïn^?‹ÀW¯ï¿ßáç×å[RþùíBdú r.»wOÿô1éôþï´|¨ü ¼÷3Ì<[ÚÿÙãý/μ÷Ãdiô£Ÿ/ò‹ŸçŸë”Çù]ªr³;¥T„û 9לÃÑ+Äèu1tb'ï³úéÏáˆþÐ$zLTz^Tz5Œ,6oرޚ¤»]"ÙM3“v±u–Ž ]e´1qÕT«²NÚyª*«‹® C•€ cLX"Ðò`usÎNtG$’,Œú™ÎY:b04’XtÂefqrøs ¨ÜøÔÚÄèrÔ…¼%’ÝTµÃ”Y:b0zœâyœ"GUO®Ëx{q~}ùêæúà}œ…U0á¶_·«H6¤ò_™«pv­«ˆ˜Ñé6pJ${Ù£U¿·9KG †F Ñg‹‹=îÖÚ×ç –‘uÐÝ.9YV>Ø'‘즚Y;Š™¥#ƒG1Ù9®šUËÇ/o~ûç¯ÏÎBöêÍW‡ÜÆ£©±‰ï²~Xw$S0œ,¶vv·tFGiöRNpÚ‘ ‰GÆUŠ®Oݦ;æÞ«FÃ6šl¥¬7qi\ Ư>:W(íÎ%‰f7›S¿ Iâ‡ÁÑÛ¬A$É‹x„G÷XzRûFÖ„Å¡k{f/íÜopÑÕÎñˆÃØñJQÈĵSkÏܤŸÛÛ3—-°3×åÄõ­¬è£Q>¯ Òìes¨~Ǒěmnì Ž¬cQ˜uO…;EFÖ/áb#P¾mAy ©H³›võxe8Œ¯…D¦¾êþÛC—Òw—·û+=ëš”Ân>ysMJÞ.KJË;°«¯ÀÙlÌn¿«¦yJ4{™gV?ÒH⇱!Ý`v=ˆ¿íêEÖ…RöÍÓ‰\~]å½ "ÍnÚÕC›Y¼™ƒ¼Òs$íÌL;åÔ¼`ÊBÿõ¯Ü#”TÒ†¥Þ̮ԺÒ#L—ÞtûVEšl.õ³Š$qÔµ‰§éEé„eÝI—|Â6jOrΡöqi‘f7ýŒÚ ‰GXlâ >•Pó ¿èP²¸¤ ;”¾þׯþø'Ñ5Ð?ZÓ£´û%7§ëIËtC°À‡g6)í•J7siö²C«~‘Ä#cC½Á± ‡ò°fÂáXiÚ± ‡F™CùÜ9¯<'Ò즠ÅxÄað(Ʊ!‡ò 7äPôTC¥å/Ÿ­û 6¯>Çé\öIyäM¤ÙËèœú=C8ŒõúäÙdQòkVº_º@F—™šêa-œ‚Ÿƒ+ÃI"Ínú™´C8Œ²=2L?ånººþÕ6¿úÓ¥”òâ#|rë7Hï5JwôM¤Ù˽úABoæ0ö)B YK«—׸?w_´ád›·´†’ö€ƒH³›v¢vC⇱C˜¢Fk§^K«Ï›kivñù”–´Á§Õ-­!£IÊA¤ÙËæ‚ú±A8 Žèî"=ˆAd’äCní ÆY{Y†@³›væ‹\öâÍpôx%D®¢-Õy„èNäFÍÊwÊy6üCYå l¶Ú‹»%š½L0ªŸ$ñˆÃà`np̃[Ó¤t,e¾y“RQô¬~2Y&ÚM?³zIšä#ƒG0-.j¥×§üöú”2{_z(C°«û”4H×+ÈD{™¨Ÿ\ä#cã¹ÅÐX‘Ï¿ì² Œ.»„lC#Ï€à󮢣©¢"Ñ^*šŒzšä#ƒ‡.Þq´SïöñDìd%‡»•¦‰ÑáòV*Î?h•îÜ´L´›)ª_ÿ[ä#ƒC»!ó,B)+²ˆhÚgÓÚª Ý×*í¥ hÕÃ’X ΄̲ˆ(¯‘­Ê"¢Ù\Æ;Ÿ‘e¸>‹Àl¬OÊY„H´›Ù¡6¾»È7³/Z dv‰…h»] õåàd—‚4´ò yZX¢CHD{)h 1ôôA>b1zàÂ'r‚<‘S—Cv¾p»9Dv9°ÖûÀUä;­ÒÎ!$¢ÝLÕ^’X ôF¾/®ÚÇwøØýD hÊý­ÆXõe2ÑN ZB>õæ:’ofáf"_É_´’ï¾"ƾ’ŸÖI³¼¿ÞW'åõ­2Ñ^*j½v8³ÈG,g‡D ‰VV'Œûà-v °q¹0ú o±Ó*å¡‘h/StF}4‰ä#ƒƒ¿1³ZvÌkjÙÇš`Á„ÖÕ ï†Ý–DÝ©h7 êá ÉG,gÀ°ÔÌS•l¶Èï_®ßþõüúê?wþ³³¯ßÞÞ_Ý|·ÿ/Ÿ^~{þÃõýªcÕ…{ÚZ=#yƒHUTfm=ÇlÖ¯‰ö2ToµáâE>b18\Ë;¢<“[³À)²-­8ù|0IÙ—ˆD»©hTvH>b1z°“"WQż#⇼R´6ŽRAEÞC Y;ï‰ö2ÅàÔc’ofaŒ!°¼‹òÇÊß—ÄÃ5ªû˜Sv Û%í¦¢ Ð|Äbð€"Ï<¢b-Ä=´LJ!¹Å[€¯ØÜ±×*Ý•2Ñ^¦:`Lò‹Ácà­(°j9ì±Z`Q[«å¦[º ™h7MÚáÌ"ßÌB>é3’‚²í°ðävX†R}þöæ~º:q_~û‹OÎ/¾¿|õúü~(ŶÇn”*"{gÙÍ:€Š#yjŬ›h"ÛË6Áë/_$$&ƒcÈ{ÄoÉ{î㳟.sø~ÙsQØÝ¬}p".n·NEWSE²Ý45éEY$$&ƒ:.òæ O{êlÑß.oo.¯÷‹ù‘Ïþ÷gŸüùOŸ}#\-rqi LÛp(S»wJlöÛíš4Ö:”¢m ¸H&ÛËLSP?6É$$&ƒÉÅÿ-fš’îv(ÊžQNËÌ”oæP|Dƒ.€uˆl7MÅ¡IHL}Rr\SÅuùO9”å^…;I¬|×ÖŒºn*íŠo¬+©ð.L´Nû’L¶—Í–Ä®ÍΓÁçÄ/«¦g\V}Ï»b¯CÊ›Híf| >_Î$$&ƒÏhY‡îiDëœÅ}„ƒö>b ]Tžê¦$G(÷RÙൡ_9óq£ÇBlð¨<<µ×y˜¯nî~*ÿyþæ5„oÞ\]ܾ½{ûíý«÷ÿ«¢ËoÞÞü¶¸ŸûÛ·×wß@Ìñ¯lßÚ×ß~¯Ì«Ƽ²à1~sS~Éo¾=‡} £’ñè¾…É}½¹¸¯nö†mâÝŠÿò!àþ VŸ‡ÝksðN}÷îÊÝ>»Qú’øˆpî0ƒ;”å“Ò+ú²"£ŒË@pl鿦›†ÎêVJŽPÑ7 ¹!‰ÏØ!WQ,ÏUö)`MÌ^ÿøæüÝUeVÎfk0€cˆ[ùnØ:SÜ¿OMŒH¹—µ‚ M¬•„$>bÊ1ŒµN]Ê?³‡• Ò#ä-pÊK‚ÔhNñáç3èŽ*¡ÜMeC›˜ˆ„$>cÇDE±WÙ ›/ùéþûË7—•)ŒõÛKa~±0Z[—”<ßH <ŒL¹—¹&« —ÿBHâ38bn!æVÞª±‚sŒrZñ –Ìï@»+àån*›E‹Ägô ˆí-U#ñ·ÿxwÿ×ò{Öú˜´Å™xƒ.2WÏÄï5.dS’fÝn°#”{,º&˜ù"äÌG>8>ŒÁ†ìÙ–Õ,ߢX±m… Çç°Ü¼mÔ?°çѯ}´êån* mÂ"’øŒ-åÈnxê®ècþ×níÊïªLá ›s26ÚØh|v«ÏåîUÑ'훹G(÷²ØìšÛ‹Ägl`;:`Qán­ì‹ ²Ä) +Z8™œÊgRù~ÉÊÝT6µ‰‹HÈ™ŒÅŠ\eŸÚ>/:™ó×?wU]îwÉmÎÅ`ðÓ@äò¢¯r1ѹ]Ðí€>B¹½N³ÈM íEHâ38´í,ÃÊœ¼PE¹ŸUcœk¾5rÿν÷Zä12ån*›šDE‹Ägô¨Èñ¨ÈUaeoî.î¿­õ/n{8@ÉÜ–@t¦'‹»Nå ›#”{« M€íEHâ36°ê=°èé°qGp2d§z[âd\²Ð¢L¦ÜMe±MHDBŸ±C¢€üp/>y¸Wô/ß½®Î_B6›Ë_K’ ì¨beþÞ”ŸÖ]øu„r/cu± ¨½I|Ƶc`'¶ÊÃÓ'¶Ž×úYþØB¥¦ù „é²Yÿ"Q¹MHDBŸ±C¢ò˲ÈðäÉ-Ñ¿Ü]^ì:ë2˜ÀNsmÄä”Jbë— &øÕ7~ô-šh°E#Rîe®š Ú‹3Ÿ88¢ŒcæjÄ൮¬06ÐÂÃ$; Ñ6è&“)÷RÙýß”¾Ê’Ägô Èð Èˆö4Bö÷‹ÛjcýæL CL^îuE¿‹w*ÌT¨¶M 2‘r7k…6x6 I|dz‹\¬ÕË]D+J0l‡æwVöï“‹Ö6¨òË”{©l´mb"ræ#²RYp\e«®Ü¾+þ%T:/õ¯üÚLÑÏL\}aeV7ï}‹‰K™r7kMmm’øŒ hÇÈVã—‡•»ÎŽad‘mÇoŠ‘e°>7É`DʽTl›˜ˆ„$>ƒÇD‘­É/UKÏÞ^_žÿp_ÝFã·ž¡±ÃòÖ/ÔŸnÚºÓ SY¦ÜÍ^± ¦MBŸÁ1íò;2{•øÃ.æÑùzÏ)ãIr0Ö–|I÷\äʽT6¹&QÑ"$ñ=*Ê«lÕPÿÝ÷×?V¯‰`¶7Ô!&ddë†úK¤”ònA§º¹Š”»™kn‚i/BŸÑ1휙¹ÊgžV”a2û˜¥š[z_Â+×¢QY¦ÜKeÑ7 Š!‰ÏèA‘áy·©ÚKV’˜ú Fª/þÚý :‡Ùg£n-È©I™_¦ÜËX³ii/BÎÆš‡´!° ä¶ê ™ç”O”ÁÜ}sZ¨¬D¹›Ê†6! I|‰ ®²UÌÕ›7Õþâóë÷C¸ó;ð•ù XØ¢QY¦ÜÉX­1MíEHâ38¢í-3V/ãï+ư¥dÞ-ó-—’•wža7o×@eÊÝT6¶ ‰Hșܭ>’ÊòÆùNÎSþåúÝßjKünsGï¦ð~‰ß¬>z¿Ó54)ú]㟶©Ê”{™ªµMÀìEHâ38˜ƒ’|P³®ÄŸð4%~´±¼ö›bdÊÝT66 ˆ!‰ÏàQJ‰«lU‰ÿ‡»wÖTú—„›«ï£ËÀ-õýuõ}´L“«02å^Æê\({’ø e'Ǫ/É¿´úbe¿T_LSÿ)Ó ú"SÐ&$"!‰Ïè!‘ç!‘¯ª¾œ¿»*¿ÎÝÅ÷—oÎkÝLØ^&¸àr`nÆÕaÀd9DýQ˜C”{Ù¬÷ m.$ñÑæmdðŒ6²ßžƒ1œ,žÀÇL/}Bý ÿ!ÊÝô55‹¸Ägð°x<ÙCvÈ}üñ³?ýêË/¸×`­av#^#O“{˘U­a;5J¢zóñ!ʽ¬0„85ræãÇ©1²HãÓà×ä‹ÕUì ê*ûŽÚx r7}ÅFQÎ,$ñ<Ê)Ÿw®¯O!_ǼÆ.áà*+ì,jâ6¾ùâ«/ÿEôó?Yá@v?¢q¹d.z âúÃíÕßÏï/ŸíFõW!¢ÜË,chHs!‰Ïà€4:¶5å£íÜÈ#€‹»NåFŠãöê”C”»éknö<9óÁÑÃÏ’åÍЕn„a²Ût#0×»¼C‹Õn¤è•þ Ê!ʽ̲d íÌrT)|ǹ‘?"ÏÍF,#›ÃcD ÉÖzõu”‡(wÓ×Ü*ìy’øŒöpÌeÌõé.âò—TX«‘H~&oÝϤf¤Ð Ó!?s7ù™ý¯~óÃõõîϾ-ÿPt÷£šŸ?ú§ýùìæ7ÿÝáÔ©wuùӻ뷷—¯Ê§æ7Ó¿únþW§¾û“òëüÇ?sñð6~1úÛߣ€ß¾½}s~w{UŒóüæ?& {wþúÿ”W½üèþëE?YÿäÿôïýÈâ/éǾžþè£éU>—ïü #ŸÝ¼~¯^ß¿ûÜž_—Oùç· ‘é ̹ìþ.èŸ>&Þÿ–/û‘Ÿ÷~†™Ëb|û?{ü£ÿ¥üíñ&Ó¤ý|ù“_üì¤Hÿ|"h½.t*PìòÑÛ`ÇýƒpDèà$;ëèc?=¬)°åƒ¶‰Ró›õÖ$Ý@É^šéÔoÎÒƒ¡ãI‡WÍ—ÔÒÞ 3 1/´°þÊ‹i%ªÈ¸¤MÎÚÕÅ´é¶øI$»Yœú>úY:b0tõ:;“àgö°&SŃ€çtQ½9ài}vÊ«z$’½TÓ«_'œ¥#ƒÇ)YœbäíWï%¥åWûîöüÍGSð{÷Ñý á¿ý~úWo.ï?úlŸ Ýž]ÞüöÏ_—„•¥G¯ÞüpuÈ›ž`3€ò@’D²—Éê¥#CWµK„±\þijYÏM-,#›|kÜÓ“”×&H$»©¦ú-ÂY:b0x c!3ÕLâôBej‘à‚i¦7¼¼’]w˺J™g§~qM Hö²@ý½ñ³t3ƒ±Æ—€Á;ÏÉÑçŠý  z2l¾¢ôä¦ðG·¯B"ÙM;Õo ÎÒƒÁC—ý5xz¨º—óâQ¡I•·w5£ ni6vÆ­¾šã§¶?Ýþ ‰d/óÔß ?KG G†ó?³‡5ýÝÇŠŽÁÂ<‡Á(ãTÉnª©~#p–nf0öqÀIWÍ—´ró I9…vŸ_»/H’_|AI%Vû‚ìòÙ‰d/ƒÓ_Þ>KG †mFfp2&öÜšC™œÖ(“ÏÉ[ݶD²›jªŸó›¥#£‡)ÆqÕ|ê(Ú ”É™|*”éëýê’a¦ù­Á™v?£äŠƒg%íÌîŸ=hšn¨EÝš¶D²—ê¯^Ÿ¥#ƒC½¸Hküñ*„KÍýC§=*‘즚ê×øféˆÁà¡‹KÜ?È¿m¥H'ó£V!´ 4³ÜÖ;‡ ŠRÞø/‘ìeú{ÓgéˆÁØ8oÉç`³|ñfÅ–LÇ(çÅ?´êy*!¥ööe‘f7ýT?¦G⇱£—¢FŽ+èÓw•ŸÛöôÞ8ÈêÊDùU¶wnÙdk—MÿÓÇcõ¹eëBܨš¬@³“É6X•NâÍÆ^’žw¬vèWm xH±â„gøo«‰ ˜rjå‘ ‰f7íT¿G⇱#ž¢F¬Ö?¹#@^áÿöâüúòÕÍõÝóËžmØJù"äà­ Ë;°ë›d§ Êãw"Í^&©¿ýœÄ#ƒÃÄ>±j¶ƪþ#wؼš]^5¯ì0$š½´Ó©Ã#ñfíû Þ¤‰k纭üùê/v7+Ï/.n/žÚð —Û«x‡E=–¹ ¿~¿Mƒö˜žD³›Qª/4'ñˆÃàȱ7–åÔyÿl—ñ¨u9Ù%«ÇV£Þ‚Õ]&#Òì¥^ý¾‰GFhLäÚ)þÔÕ5¼u§ªk \÷!X‚D¦ÒFöë,vJ¥›Xˆ4»Ù¡úJr8Œ »ÀÛdê6ÙcHThß&[^uFåÓ,"Í^ÚÔïÔ‘xÄað&ðNÙ Ø)6Ø)k¼ÏMM„õ²Îäd•[¡DšÝlN}Ý8‰GGÉ/Éæd·òÖX§Ü %Òì¥Qý²‰GFWøTvxÑTö/<‚Ô¬÷ëöè'<,IBàSØÏô(÷?‰4»Ùœúæpoæ0öÎðlsXlÎæøôÇß<ãˆãD©ùG7AéIy [¢ÙK;Aý‰GÆŽWŠy®Ol|¶G°ÌÖqp9íŽBêjçcšÝ´Sý€‰GFbŒçÚù’Äá—^šy‰q2‡’É`˜í¯Ï|ù¹¬\o–hö2ºlÕñÛY<â08~ ¿¿}væÀ}Bjï|Ñrå;í"Ínê©~Ä#ƒG,Àû¬Aî³®*/ìv§m LÂò3ëAXï‚ »õš6'ÑìdsÎ8uw8Œ àº˜Ø —˜Ä¨±b;SD×K ³SöÍnÚ êË,q<`‰‰AQnÞ¨Ë"ÆXRÚí`;8â®s%–²ñ \„–hö²CëÕ1ÝY¼™ƒ<„<Ž&Væ+kU& Úwª†Œ1*—$šÝÔ3é1â‡Áƒ˜WO½NÕÛëT Þ€gCÑ)¬ïTE}ŒrZ¢ÙËæœWpgñˆÃàn²,qHòBòŠòBr®¹GˆLV./H4»i'ª,³x3ùôàHÚɇ$'áu‰Cr§J†q 8h ;Mš ¬v »ó7Êg‰f/£óA¿Å#ƒã·‰oúÆU›¾f ÈV}7;T°Wö Ínê‰êË,qz»Œ´¡_FÔç•÷p‹4»]R¿Ö8‹Gp3oóÈr›GM}!Clî|€ ¼ˆ[¤ÙK=Ñ©G,³x3;xÄ’íüÍ îü­ó »£6ó ÁXÈl=Ò~Î:ŸLBåEÛ"ÍnF‡êÇ¥gñˆÃàn¶,MÈöE·¬gtÝ’'XßÈ)„Ý}eýhöÒÏÉ©ëçƒxÄaô˜Åò˜ÅV]g¸¼ù퟿>;+¿ÒïÎß]MG^½ùáêy| ®¼¦%©ˆÛp h¬‹ô)›ÞYŸT„T>ˆº£ "ÍnšÕñÞY<â06Þë ë )O×#Þ»0ú8¯pŒ4ÛDÐèĨh£vEB¢ÙIC½ñú!΃xÄaì§(%p ­­HÌÇBçEQ—Êl¶2Q>[!¦enÿq\Y™ˆwY‹¦=J4{Ù£5êØï,qû–]hŒòÎ)Ç£ƒÔ9Ý%Ë·®û„Eå”C¤ÙM?ƒvDC⇱#š¢G|¤_žÌ©šfIñv+Ø. ļ$q÷I\ç'†  ë'Dš½ìÐYm<˜Ä›9È‘Ð0vè z·¡ÒÙPoró vÀ¨¾€O¤ÙM;£vC⇱£˜¢‰k§ÚÌtÑÏíÍLû4A¸¼ƒ´k ÙF§ÜÓ$ÒìesûãÚª67‹Gƃ½‰ÈlNîÔ}ö²¥Ìèk7Ïm|B´)ùiìBQ?EšÝô´#oæGX€c¡òݪ̡û°º»‰¸~uwœ–x¡®Ÿiö²Ãà´_8 ŽøZÇü„•oÀTdÖ7Ÿ£ŽEÕAù œH³›v‚vCâ‡Á£ë×Χ¼ÄÙÙŸï.oïÎÎî/ïî¯n¾;;ûøÝ»OÏïÏÏÎþøöüÍîOþíêâöíÝÛoïYýû“·oÿvuYþËo<;+zùÓ«×ç÷+œŽõ§r:ãd"Á™ä–ëåS²z.;–t0(_žiö²áèµ1b8Œ{›"³á´f.[(yG`”q©%ºmÜ ø9ë¶ÓŠ4»©hÒ‚H<â0z”2SQ|Épö/ý©’‘/¾úò_ä\ä៬IE¦ÑÚè”bL™¹ H«3‘½Fé¶×Š4{áþ’•¾:Æat”Øó†_SÃx´¿ã=7a‚mï&R01‚n6"Ò즡¨ÉxÄaðHÆx^Çðz“xEEO5‰72fåCp´«zz+.®ö{¥Òí£iö²Ãµ±coæÇŽ÷n•§8†Y¹Ð¼Ú0NÓºÚ)Ñì¦Y;Ž!ñˆÃàqŒã^½ÈK¼_íva{Õnƒé=—àÜêjwBÞéV1Dš½l£6NLâ‡ÁqbgXÃÉž]íf©ƒ³¬ÚÝ*sÈ.kw@‰4{ég6êË,Þ¬ŸyôˆÅ:®ŸŠÕng?T»§jwÆÌ0&gÖW»÷J¥[‹iv³CÐzI<â06Ðk3›§8tCõ€Ÿ‡3‡B [g9ú¨}”T¤ÙI;ƒ1ÚQ ‰GÆŽbÎÓÃK¦)ÞËì{6’9ãMt¸¼>:ñ¼Ì!G@§ìDšÝl.icº$qÓ b18¨ëuˆø$vˆ¬?.Q(¥ö+bmB›´wÄJD{)¨sú«ÄgùˆÅàqŒOž+¨X«rÍör‡Æ28ÉïÖ-®ò ¤¼%V$ÚÍì²þæðY¾™…¼ ³s¬¹Õ»5Í­tp¿à›òÑ–èG{Ÿ“H´—‚z¯¿@f–XŒ¸8¸ø§Z[ÙPÄ¿\¿ýëùõÕî¾ògg_¿½ÝTLÿåÓËoϸ¾us}·Â“°™ ­xDÈÆð¼]}©hҹ䲲'‰v3Ô¬¾¼“ä#cƒ¿>dæIB^ãIŽQÑ´÷$`‚IFw^[&ÚKACPuH¾™…<Ô ™y’hÔ.ØZ[ô v:溼\\ïŠõÓD"Ñ^fúFN’XŒŽÿF¶’3Èk*§¡½_ˆ¼öÒq‘h7 ê ÉG,F\À0'«ëm ° £[ªFïB^îù°Ó°•Ž!B6¨¼K\$ÚËîÀª#¾$±ñX<†âW¢b b·n²µccµ[^e¢Ý4êG.³|ÄbðÈ%"k­ˆòØÆó–w|ñöâüZ^Ýñ¯Ww÷åïîauÇÃÓ«ßëöxÄ7çrJTiù€ö~!ÀJ—“ëW^F.íeÑÉ©ƒÉ$±LŽ…zQ^Ný\Œ 9Ù¥}¶Ñ2òò®‹¢+¯ñ‰vSPЉfùˆÅè1Qà1‘œ9=óÒ·×oÞÞ¬?€ä#;û»™HfÚV¶”9¢_Ýlë!cAÎ’ˆö²Pôú(ò,ßÌ Ž";\.W–ñråÍncnŸµ$œzÖ"í¦ I?Æ™å#ƒÇ8#WP±÷” ys÷Ó›k;9ç—AK¼7S‰6G>Þ½ëb[ë7&èF¹<.íe–Ùë£Ì³|Äbp”ø oT”Ç!·¿Ç]ÞuNꩇD´›‚bƒÀæA¾™E<°ÌÈ/9Éý¾_€ŒÛó `r˜‘‘é¤õ¹½Ý­§U5;‰h'³‹&èƒÌ³|ÄbpøçÏŸ[OŒlZºÞS#¿ÌC§¾¦‚ŠD»)(ª.$±=pà Z{RU¨U@ò'ªU ¼úwÃÒI±â”ê^«”s‘h/S´Q&ùˆÅàèpŠ,‡HqMq¬b^R©æ9Dy×)$åB$ÚMA³z0Cò‹Áƒ™,‡Hð’â¾"žÈWŒ“DØà,O"RXŸD$q׎¥jwÑ^vç@ó%ùˆÅà˜oâgf’|f¦f}` lv¶Ñú@Î$íÍP2Ñ^*êzìBò‹Ñc\EÓˆ>¤PôLBæ,\E±×*åÆ[‘h7SLêH/É7³säqLø‚gÎô\€Ér²ÂŒ’¾¯@£|îH&ÚMA£~83ËG,gr \A}EÆ“ùŠQïeDŸÞ”¡ÂQdsP>x$íd‡Óž5m;$ùˆÅè@¯á•³p:6W‡vÁ›ZU­§£ÈQ»!í¦  É|3 yÓðH Ê+V³aO…7œTÄ4@Z¨”S…¯(ZÚ+ÊE¢½LÑ:uè—ä#cC¿Ó¥ÝŸÙƒRRQ(µO*Ê»Ž» Ê ú˜h7ý`f–XŒÌM \Aõ’Š`N@œT°õ±ÁÔ OÅë&뵓 ‰h/;t^&ùˆÅØ@p0À…¼LôÙUlî)àž"O·ß´5T ÚMCSƒPæA>b1z(ÜSÈ~­ÒS¤Í{ŠèÁË+‰5ž"DIy"[$ÚË}P‡I>b16 ŒñÌxÎøÙUmFÖÚöŽ"DH <-í¦ ¨ÊÌò‹ÑC“¸‚ŠC •ŽÂ†­;Šœ‚¥ÍBSbws­£ˆQƉö²ÃõaàY¾™EÖ±”Â:µ”b×OÑÚSDç¼öxH´›†fýPf–X ÊX¸†*¦Öo>¥ð_±ƒµëSŠ’çyç•[Ÿd¢½ì0Fmx‘XŒgžRä5)ű*…5ÍSŠé]CPn}’‰öRP0Ú¡Ì"߬ yðPÆdžRdÅ”b·ªbÛŽ¢x†d .ï×§E¥rBåÖ'™h7;m x‘XŒ[d›ËÚ‹Ûþð¨ÅÔüâvùjêŽB"ÚKA“ÑdfùˆÅØ‘LÑ$ÃTnâ~ÞaÕ?¾=³ûé´êï?ûÓõëOÎ/¾¿|¸®ZqPµüzÛ»á1†°Ô9,ÆÕ7¼‹R–H¹sJ&ÚÍ’“6мÈG,G‘]\\MyXãjŽ•9„ö9I†}¥¬ ‰öRP´ú±Ð,±;*šÄàU'wlÔå$NåÆÍI\Lt„mz%×ç$Ö¸•;§d¢ÝìµAäE>b18ˆì; \ã(WŽ‘Í‹£p…5Þ'§[—‰öRÐìÔ#’XŒÉdî(äu:•Ž"oÞQ”bYJ1½’Tå(²5ÊS2Ñnv˜ÕAd’of!z²Co™ú5÷µÍí¹Äé.¶]£É½`§ÃñÚð•H´“Š&ãõc™Y>b1z,ã#Wѧ.l¯qÁÊU <¹¢1lwTpÎWx‹Vi§Ñn¦˜Õ‘d’XŒ$—ÕÏÁËgš*jâžíòl…?Ù€%ÒN+$¢½Ôýpf–of!HAÙyßò ¢eu¾ÂCþà+Єüž¯ð»–Òµ¾b§Uº¶2Ñ^¦èŒ:Lò‹Á¡`o33E'.\xn­Â0²nIï[•ÅË»Fº¶2Ñn ôƒ™Y>b1z0ãvZ¥½âC$ÚËKÐÄ—…ÅàHo4 qŠf ât¬DM{À©¼ë€Ú­¯"Ñn ŠúÁÌ,±=˜aWUʃ"àíö'D“wåÑpÊë'ç=8í•"Ñ^v‡Qè%ùˆÅà@oLÜ1¤5ŽáqŸ+pº‹g˜ú~›¸ï1 òæq™h7Íê± ÉG,F]w IÓ5à‡©ˆ rŠˆa©[G¨˜ŠØk•ryB$ÚË÷'˜¢c,GcfM`Öt4-\ƒißÒä}öÆ)·ºŠD;i(£Ï|Äbðxøz|×ãWµº‚Ý^«kFÜCdþë;šü7€ò„H´›Ù%u¨—ä›YÈ»öÆ1»XÝ:ÈÀôs‡«y0´O#Jz\‚`eÏ í¥¢ûåϪ*Jò‹Ác—€¬\ä+•-Mø¡r½¯\»Ä0'¨¨\ïµ*´0Å0ˆ)&u°—ä#ƒƒ½€l¸ä3ƒ»a³ˆ’ëw9‰D{)¨sêá É7³°ƒ‡3WЧ†«ÙjدÿqwùÆ»³³O¾qƺôêË/¾^‘eä¼µ,crÀñ§}ëĺ,#€7F{)‡H´›Y¢:Lò‹Á‘àĻғܕ^?¥)Žmí8¦ËmFy+‡H´—†z§ÙÌò‹Á#›ä@š‚VÁO)‹c~ÝŽ!8¸¬àH.­w ùa“¬ªÙID»™]VG}I>b1:êË; Aî4¬ho‚èšû…hœ×¾ž-í¥ Á«G.$±øÈ6Îî¯j­ƒ§ÒÔÿÊU"Ñ^&ŠNf&ùˆÅà03òÆ*Tk¬Â4VM›ºBÐN8$¢Ýô£œY>b1x”ƒ¼±êÀäáóê _¼½8¿–« º|óîííùí?>úýDóæòþ£Ï Í»‡ªÈ¿}ýûû—¯ÿÿ¼úôã?­Èh0Ÿê,Æ8ž§hT6l¥-V´f¥h=hßë‰ö2ì­«ö,±wÎÈÓ¹‘ìÙé ;˜”³0v¥íz¢M }°[$ÚMC“~l4ËG,2?|àZå3Ó—7wßß¿¹®É^òæ²Àhã{ÙKªÈ^bÊVû”·H´“…fôÑèY>b18ÀfwÄÙÝçvq±â:¦¥pÙª¸ž0X—”ŠD»)(ê9³|Äbð !qÍzåLáC¹$åñË!ÆXQ.™´ µó ‰h/S´QŒžå›Y„±ÁèhX¹¤<¬É7ŽÜg&œ ÝÀ ßˆ%í¦ Y?˜™å#c3Óþ® O¥Ï÷EGý©|Å_}ù/²«xø'k<Åô#Z7ø¬sÙáòJxEäÙŽ"›}+—ªJD{Ù¡‹úˆó,±qæUK”íðÙ›IÙÚ;Šl~Y]"ÚKA½ÑdfùfÍcG2E“XK9ÊýÅ•IE8Ù^’QZo‘0\ÅR’’—¸ÝM];ˆv³CÐLJgùˆÅØøp4Ù°€Mžx|nF8Y|l„êŽ1yíŒB"ÚKAƒiÉ<ÈG,ÆŽdŠ&® Ov-`\Ÿß|·¾~­±[«_$_„v–7lâã™õ 4~šÑ5P‘h7Mêð0ÉG,Ɔ‡£õ <\Dxøù5pæClXfrm+'‚&GõAt‘h/V=Ê!ùˆÅàQŽ –éh‡’ê`)„@gcÙFrÎ/¥îh]^Ÿm 5~wÕIÕ%¢ÝìÕáa’XŒCdÁ¬Yeu¤ÖMZ°áVµnô#(wêŠD{)(8ý`f–X ÌÈLAÓK6Yý²~‘àTŽbàZ7–¸!Vˆ©ÂWì´J;¯ˆv3ŬŽ“|3 ¹pS,îŒÅlùekÝB×™ÅY¸fÎ"ù•£D¢½44yýhf–X ÍXv¦¨•¢³pædÎbجCŽËIðh±ÆS¤ˆ µ³ ‰h7;Ìê1ÉG,‡ˆmb5 +ãeë×SJí×SeãLÖ^8"í¥ ûB¯ª‚’|3 ¹¿a$ \AõÖS•¯â‡õT‚ Y±ÂBÅzªi×hwЊD{™b6êH0ÉG,G‚C³ÉfÅÄ^!%lªÖuÑã³2%í¦¡A;šYä#ƒG3Ž÷x;¹Ç»2«ð§šåÙYL;ï÷—_Ö9‹­Ò… d¢}LÑcµÑàE>b16в]†h×ì2„G¾9]vïy k¢‹Ê÷ýd¢ÝT4jÇ3‹|Äbìx¦¨Rä*ª¸Ë݇]† fŒ– ç™õ» ´J†’‰ö2Eë´áàE>b18ìùì“_5sq4µðí‡.¦— àu 2Ñn êñ ÉG,ÆŽgŠ&1 Ô+]b†.¡|ÅÐE´vÜСd¢½ìÐymb1z(òŠò —U”¯â‡¬ÐAJlÃ`ôUYÅN«´³ ‰h/S,AtS ŒÅèp0;mS^tä×+Ø¥‚fI…ǰóIÊ ú˜h7Eý`f–of‘fòŠš¼ ¤²^‘Ou”oؤŒõ–ÍV¸Ž"„X()Û¡D´—† Ïò‹±‘àè3›Ãóù…sx Ý`b{OBƨ;Ê-í¦¡¨ÊÌò‹ÁC™`XÚŒâÞn¤`ÛžÂÚü>ü„ë§ð¢Ö:å»á2Ñ^v£> <ËG,F‡ë0ñòëgoDFÙÁVemcÞí¶ÕTQ‘h7ÍêÁ ÉG,Ff¯¥É)P%…'Û#8.•b2ƒYÞ ¬_%ø Uº¢d¢½L@ &ùˆÅàXpð¬hä‹ÏÎ+ §»ÄlÎ+E—ƒIY‰öÒÐdÔã’X ϸ†*ŽW„pªñ ÑM¬sj‰D±L\ §àVo~š;o”7?ÉD»Ù]RG~I¾™ŒŽüF>ÿ âüës—ÌúÈèÂÒLâúŽÞYõÅO2Ñ^*ŠV=x!ùˆÅàÁ‹cÇUʃx\¥²8‘„ ÛË#rñ&9öI°ëóˆPþ–vëj5MQ$ÚÍ“:úKò‹ÑÑßÄzJBzÑî'›ÙBÀ2z›­ôˆÑDã´;dE¢½”4;õ†ä›YØÁCšXHð©•ǶÍþ¯éëõôûV¬œÝÕr¶µr8t “ V';… Ê¥n‘h7+Eut˜ä#ƒ£ÃѱF”Ï“¯?ø£7Í©ò®ƒW^Z.í¤ Ö8õX‡ä#ƒÇ:%Õà ú’òÅW_~ñï\EY¬³¿Pþ3&XÞ]}JµüŒ))¶E¢ÝÌ.«Á$±6²«G6®™À R `tMàA#Ï…‹Ê€”H´—ŠZ¯º|ÄbìÐ¥¨»{t``°n^ÛÂÉFð¤¦íљ孄Š)¼½V)¶E¢½LÑul˜ä#ƒcÃXòé×çRÞF8.î›F—+b &GíLB$ÚMIƒzHCò‹±Cš¢K¬ûäÎÂgRW—ßÞ–«‚˜¶†F%g»dàquÖ±×6å¬C$ÚËD½UÇŒI¾™…3Ë0ãò ¿èÖjft]buf^d:§\Ö‰vSѨê|ÄbôPÇy®¢Šepð'+ƒ;y3_(¶¢^hЮ‹D{Ùa°ê¸0ÉG,Ç…·Ã$Ûá³'/Yo£ÂÚŽ"†Œòâ‘h7ýXf–of!c’#)hâ *‘Ö9ŠäÃÆ:Àå\ÛôJv[VÖ: 0`µw ŠD{Ùá¾x¦k‡³|Äbl˜8BæØT~6ÅŒÐ0dª•£;m°ÐVPh7ýHf–XŒÉ†K˜©tfó«cŒ2Þ°¢ˆ1e&Ú÷,d¢½ì¼>><ËG,LJcæ­PòXï³W”3ÿcLûŒbCMÚ ‰h7M "™ùˆÅà‘Lä‘L”#™JèÉœl’{TG1ÝiãK?"VŒq§ä“³ÚU ‰h/;LAžå#ƒCÀ‰륗 ëYVìN¬íÄ6«u§¢z•B"ÚMEQ?–™å#ƒÇ2‰ë%Ía½tºa½Q]E˜Näqð©fR/¡)ô”£D¢½ì£><Ë7³[²Cä®"¯qÇVΦœÚçhƒò‰<‘h7Íú±Ì,±=–ÉÜQdEGfëŽGŒ¬œ°ÊQ:í "Ñ^vXtEßä#ƒƒÀXµ0š•³ñH•"¦Ø¼JÖõ*…H´“‚:cÔ#’oVPÎHAÛ8“âÆÙ˜N¶qvài‹ìÊg0²Ñ¼X±tv¯UÊI…H´›)‚:Lò‹Áq`Ì,©ÈfMRqìæQfÕÂV7Ðgµ "Ñ^ jz0Cò‹Áƒ™l‡lD;óMåÏv cÊÚŽB"Úͳ><Ë7³ÀÁ` ¬RaM¥âq÷#Û߯Ë&¤¬½çC$ÚKAƒWdH>b1x$ƒ‘U*0*V*0~¨T”ä2Ú̯Z””s½¯Øk•2ú$ífŠY&ùˆÅè@0oCÌrbú”Sû!íl¢3ÚUm‘h/A=˜!ùf~ð`&ó¶‹,·]T&iëCÚ»¤"³m³9V içi¥öe<‘h/;£Ž“|Äbt˜¯!ÇUkÈÍÞ¡o_¦È>E°ÚI…D´›‚ýHf–X É _CŽ/ZCþˤ¸¢ Éãl^®¡­¨TìµJ;©ˆö2ÅdÕ`’XŒ _†?/ò¾¸çV*¼ctãr(Æ7º}>BÎVwüN&ÚME£v8³ÈG,ÆgŠ*9®¢âo[å- ±üÁ[$ïœqÙ'Á¬ö{­rº[=d¢½LqU뛢3ŒÅØh0”°‚™¢ÑàgCPÓ] ±Õ°6xpÉî¦@™h7í€f‘XŒиÈUT<çXé-¦8fÛ b°~I,ÀX_á*Êw/DÝÄB&ÚË÷í?Êvø ßÌBΚ²Cv±Œ|±ò¹‰2²¸ÌU`3GÅÙ«; h7Mú±Ì,±=–AÏTo®Lþ0¬íSpÈrŠ´~¨|2&+·@ÉD;Ù¡7^ ^ä#ƒƒÁ™/b;0¹ûì(`VÈvʶ:Ž!…A·[V&ÚMEQ=–!ùfò Â0* †-•-zKe ±Çñ Ùd2UX§¯@Å^Ù­Ò]í!íeŠ6¨ƒÁ$± ¶ž¥6¼(­à” í×B@Ùê¶AÉD»©(ª4$±; )ªä¹Š*&6n=±H>Fë¼c߃ŠÄ" ÖèÞª‰ö²CÕ‘`’X Ž[Ëê†VÝ}n±‚!PÖ™æTÀPyZ[&ÚMA³~,3ËG,Fe,pÕkƒ*:ºùimf:ì¾¼³¾ª¨T >‚rU[$ÚË=¨#Á$± ¶‰;ŠUk=Ž•*,žÀQdëƒò´¶L´—‚£ÉÌò‹Ñ#™Ä…âZ¢£›wåkåã×N¯¤b­GQ©0ý-iÛ¡@´›&}x–ofcãÀÃÒþ4ÝE[á(Ü‘R…Ý ~·.UÄœCŠÊ9…H´—ŠF«Ë|ÄbìX¦¨Rä*ª×þd1ž¬ýiàREùÿ£[v{ÿYѵ×*å¶H´›)&u˜ä#ƒãÀžÍk—‡Õfi…góÚ­ÒŠ©q2jVˆD{)(8õp†ä›YȈÎH š¸‚êÍkÝü¼v)ãr×|żvQ©¢TÊç*d¢ÝìÕq`’X ŽûÌ…|6怣˜ÂÑCÛLóÍÓË•{eE¢½449õP†ä#£‡2™{Ьè)‚Ù¼§@ Þ…¥WÖc§°n¿êAÕ%¢Ýì0«Á$±öžÁ^Þ´~øÚ; ëôgµE¢½½~(3ËG,Feë”õA±SÖ‡“uÊŽê(¬ÍѰ¡ ï*ÚdÁf»«ÈêÚ¡@´—f£“|ÄblÛ°SÖ8Š# ÈKÔz G‘cˆº+ d¢Ý44ˆdä#ƒG2mȇ oȯÌ(üæbQ‡å¤[ã(\ÌÊ%m‘h'; ÆêcÀ³|3 38"wq£8Ž=Á <…“³rE[$ÚMC£~(3ËG,Fe€{ yýH¥§€Í{ Þ;” !Ôx ¿Û•¯l‡Ñ^vh­><ËG,FÇ€ ›¼óvÍäÝ£9m^ζízLÅ7›µ±'‰h7ýPf–of!)¨åe4«8wçÝÖçîФè /g›Š¹;ð˜²öˆ¶H´—:§Ïò‹Á1àÈÇš¢ÜSÑ÷]hï(‚3Iù¦‘L´›‚‚~$3ËG,d¢cE”OõÕ9Šè6ŸQc²eãÑÔd!îg2tíP Ú˽×Ç€gùˆÅè0²Œ"ä5űjvÈ©=ôbŠê…D´›‚&ýHf–X ÉÞ˜䯼JGa¶žQ¤ãÔϾ5EIQö€¶H´—† Ïò‹Á!àÈç_£<ÿZS¤ˆx‚"EtÞª§ÑnŠú¡Ì,±<”‰ÈS ù·­ôø!¥°åYßS„š”¢{ԞЉö²Ãõ1àY¾™EŽ¥1¾l= #ORDDÐÞù$í¦ ¹A(ó ±=”‰ž+¨fJ›O)r‰ -ö5¨I)Jrf­v5["ÚˋѨÛá,±^͆UÕì£)ØxŠ¢ØN{é“H´—†&£ÊÌòÍ*ošHCy94ËÙ°ùrö´Ð$Ö! Uåìd#ír¶D´›‚><ËG,²í€Nž%î5mVÎv¹ývÀ’:cP¾¦-í¥ hôC™Y>b1x(㸂*ntyóÛ]Ê {r©b; ”´Ä¢v9["ÚÍ“><ËG,Ç€a7 NâW£{JƵÏ(Æ¢éê ú˜h/ͶA$ó ±<’))ÏÏL­D¤¬ÎQ$·î(¦®§ÈN£î­u i_щv³CÔÇ€gùˆÅà0ð½k ï]{nß“3ŒnZ¬pzm\E.ñ¦×vÑN*ÓefùˆÅè±Lb‡Þ!‰›Ž+Á§©}cÛ®"cö–œb®p9¥¤}U$Úͳ><Ë7³³åqì°äŸ,dsk\Å£œÂ3²~ñ¾™£ÈƨçÑ^ j½~,3ËG,e’gŽ"yEG‘üæ… )R£æôJl…£HfšP®RˆD»ÙaVI>b18 U)@¾âúÜéìÄȲ‹“©‘£HÞÄ Ýø$í¥ .¨G2$ßÌB^9’‚WPÅ*Ä“U)>Lá‚Cd‡QÁW*öZ¥œTˆD{™¢7ê80ÉG,Çߨ“ä:ÏÅŸ'‹'ð>Ø ¼n\$ÚMAƒ~03ËG,f® âo[™T°ã)[M*RFdëÆÓnÇØjG‘ìn·® D{Ùa±};|X Ž§Ì…¼ýÙíÀé.žÂ†V®¢D^ûÞH´›ŠFýXf–XŒËð¦‹$géu®Íæ]EöùiÔ„5®"xˆA¹ùI$ÚË£SÇI>b18ì"+T¸¸¦P4?9X ­šŸL-~Êã"Ñn ú±Ì,±<–qÀ  NV¨2.%‡K­Â…šZ÷0Ž)îtÐÚZűFÙlM{_1é¹ö¹;‘h7MúÁÌ,±<˜É¸‚*Ö*²ÝúDÅn“,»  ˜k  ö‹PuíP ÚË“×ÇgùˆÅà80&–T`zQ£,sˆ'H*Ðå•»ŸD¢Ýõ#™Y¾™…¼êk E–T *&ˆ’ŠÉW@°n©U Ô$“Vi_¼‰ö2E ú@ð,±ÆÈj×Ô*5@••^,ÑMkMšø Ä!k¯ ‰vSRThH>b1z@WRÍjl¾ZamÌ–j†ŠjÅ^¥”׊D{ÙaŽê`0ÉG,ƒ³g“°Y^ûÜÄ"°¹Šb1x,ƒ|DåÑÊœ‚]{ߪ£˜ñb…ŽÂP€‰v³Ã¤Ž“|3  NÆÅŸÙCÒ©j'ã}{GaÃtšG]Aí¥ ÎêG2³|ÄbìH¦èdf êÅ•ÇUŽ¢ƒŽ"¦”`y%6U8 WÂa« >‰D»ÙaRI>b18œÙ¶dä5lë«Ú…´wå#g­òL…H´—‚z§ÉÌòÍ,䓸Ã(hÑ$ÇTz*Ķ=•l =åèÉ%£òœ¶H´›¢><ËG,Ɔ€“‰ÜQÈ@YMF§p)BPž©‰öRÐàD2ò‹±#™´Ç‡éAÓQÀÖEqvZCľ5ŽÂûd´*D¢Ýì0ëCÀ³|Äblxúe™Ê'О}ÌÈ3ºyñͪÙ>d¯Ž=ID{ihôú¡Ì,±=”ÉÜSȵ÷JO‘7ï)l΀y ¬ñÁ8О¨‰ö²C0úð,±†Ì÷:gy¯ós»dùFœ+l¶Ñ#‡©3H;©ˆvSÑ ÌÌò‹±ƒ™¢J‘«¨XG«l|B·qWhq¹Ó9½ð5®ögVuíP ÚË“ÕGgùfòXé0v˜l`I…/BŸ‘KNÑêî]ަœÚŽB"ÚMA£~,3ËG,ÆŽeŠ&9® Š9…›Ï)a™ÿÚ} jrŠèýîš® D{Ùañ§úvø ±¶Î2;tkrŠcõlërû2Eô)eíz¶D´›‚‚~$3Ë7³ˆ£G2¼3ÏÊy•ŽÂo=£HMLËÝ»dmMFQrTçµëÙÑ^v˜><ËG,-rG!oK¨¨g[<£ã½zF!í¦  ÉÌò‹Ñ#äŽ5EÞ¼£À˜­g²6Õ8 €°»3 k‡ÑNv˜Œ×‡€gùˆÅà°ólöÕɵÍŽ"<ÚåÁȆeA kå(’7å•T"ÚMA“~$3ËG,ÆŽdŠNWPÅ.|8fè‚u»];ó[q;÷Z¥]Ñ–ˆö2EôQàY>b18 ì‹Ù|X3v÷¸÷‰•´“ggÅÚ•´&ý>Y‰h7Eýxf–XŒÏµd“w»óZy…&ï¦Uã €ò¾fò.å¸[¢k‡Ñ^vè¢><Ë7³¯:d‡–•´½|R£¢¤íÝ JÚ茶£ˆvSЬÌÌò‹Ñƒ縂*–´½ûPÒFˆfI*Ê× ¦¤°G±tíP ÚË}Ô‚gùˆÅà@°OÜQàË*X©Âã F«ŸÓ‰öÒÐ`ôC™Y¾YCóè¡ rO!O²Vz ܼ§È>û÷<Ë7³G ²CàŽ^¶Ú#'¼¸Š©U»¯@gAyb[&ÚKG³ÕffùˆÅèÁ p_š¾"mÞW`tÖÎ`ùôJb¯˜0vÐN*$¢Ýì0é£À³|Äbp›¥yëÙË=ÙØ~–¢¼kÜ N)+èc¢4§ÌÌòÍ,ìàÁ ð±PÇB+ѧ¸õY ,ÿ ‘5_1Ka³3Æh'Ñnvˆú(ð,±.æÏìáEè“ãd—”¢YãSvåÿ鞪‰öRPëô#™Y>b1x$ƒ.rUÌ(ÐÈ(JF±kâŸ_‰­É(r =¼ö(…D´›f}x–X ŽcäŽ"¾ }âž"žÂSdŸœò(‘h/ ÝŸ”VÖÐùˆÅè¡Läž"jz غ§@c¼ã³*<…3Ñš¤åŠ«FE¥Êÿår¶H´—F«“|ÄbtYJòVÅÔæ¤Áyår¶H´›‚BƒPæA¾™E<”Aä)EÖL)òÖSŠÝxvdg*0Õ¤.쯷©Ú¡D´—‚SÇ€I>b18œyßS^Õ÷ô8¥lœ"óÛb­æ)\F½¢-í¦£ ÌÌò‹Áƒ™Ì[Ÿ²fëSÞ|ëS 1Y:Ø9½’šÖ§¢RÁi_¦‰ö²ÃäõaàY>b18 ì,óNNøŠø(©`㎥ö¶Õ8…Ù¡ö2‘h7Mêá ÉG,gœe®âÀ^æÊ­Oîd®bàxE!’aÓwÎTx‹½V)CP"Ñ^¦ˆA &ùˆÅØPðtÖægö .`{~±"0ÂSì:»‹ÐÊ]ÄhœQ.l‹D»é(ªG4$±;¢™.jpÍjîbÚÀþ!³H&-ÓwhvûSÖúŠË—N…‰ö²Ã’Ð6°Ã½|3‹06<ècv(/ yv¹]€ö™E9)j‹D»©hVgH>b1z8Ž«¨ÞšÀBìdkÇÍ,И”¨ks÷I¨Ø¸×*åÉ ‘hSôfÿ¥l`ŠÀXŒ£µð3{}Û³3‹Äèº%fkU±à#å¼B$ÚKC­QgH¾YCóàñŒÝ ¬Óƒ˜Õ9 ëÒÖóŠiIo\Ú Ðî®›­öÉíîëÚ¡@´›‚:Lò‹±á`4lU`yxÙNYA±]Í ¨Ü4󨬢Ñ^*êŒ~03ËG,f [Xô:fÑl~Y šäc^¡ÐÔ, ÉOgßµíP ÚÍ“:Lò‹Á¡`2 Ù⚃F (æ)lâ5uGQÂ!¯Ü%í¥ ÞêÇ2³|ÄbðXÆFÏTï ÑþäÛ¦E LŠŽ} *…É™k¯‰v³CÔ‚gùˆÅè@° ,`“ÃËgo ´Œ®e]P­†+Bù_Ю‰öRÑàôc™Y>b1x,c /§É+p+s û¡aÖ˜Ù5íœ+Z ŠBe«½€\$Úͳ> <Ë7³ÀÁaàý’!zxY¡‚%.Í%êžcԞ׉öÒÐè3ò‹ÁƒX¡ÂÉ{Hê<¿ä»QO­ fy%®¦P‘}€¨]Ò–ˆv³Ã¬Ïò‹ÁQ`gúä¬úäì Ч­QO)$¢½‚~(3Ë7³ƒƒÔz® ŠèÓnJcÛŽÂ@^v›î¾èS4Æì–¢jÚ¡H´—&£Ž“|ÄbpØwi£8¶U¶ZŠã>•‹§ôdÓŽ-@²K‹lÊ;$z­£pà¼öé;‘h/;´^žå#ƒCÀh‡h³rvpíûž¢K˜¬r9[$ÚMCQ?”™å›Y¤±C™¢I¬ïé@?o]J6?  }É"–"E¨Ð.4ŠNi—³%¢½ìÐ} x–X Ž{dålŸµúž|nß÷}N{’ˆvSPÔefùˆÅࡌϞ+¨b5{· mÓŽ]6 —m²S¿l£È>hŸ¾‰ö²Cõ1àY>b18øxvX5ž}ìô]!µxŠfåìâŽÔG)D¢Ý447eä#ƒ‡2ÏgÍùìða>Ûø0…ìsPã)BĬ}úN$ÚËèƒÀ³|Äbl=_Ôéå UÏí{â)EŒPÛQ„4epÚ *í¥ Ñè‡2³|ÄbðPÆ/gƒf9;m½œ&DGËL§WkÊÙÑ… }úN$ÚÍ“><Ë7³5{; ¼A6¬j=†=…|GKò¦}ÌH$ÚKAÁêG2³|ÄbðH&ðÙË*3Š ²Ð9¶okW³%¢½49ýHf–of!w0Œ¤ ¼ŠDpôÿßÞ»6WrÜhÂE«O»뎼!¹6ÂkËcÇz,…åYc8¡ Øl‰¯Én.I]¼ý÷7«ÈBA&ÉJ"Of¸ZÖHsØ"@ðàV™Q„¸wG1Hl‡lÉ5+E„ò—v5["ÚÍQ^ä#ƒCÀXFrí½"£8BF“Í^»š-í¥ èô#™E>b1x$!rUÌ(vŸQ í =¯É(’³Fû’¶H´›f}x‘X CâŽB>ª\Ó Ò†mO‘| IyÛ¸H´—†f¯Ê,ò‹ÑC™Ä=…ÜÎ[é)p÷žÂ;\é‘Ä*O1:íj¶D´“:cô1àE>b18 –aO`·`OªÙÈȺÕ±•£˜ö0dmG!í¦ A?”Yä#£‡2–aOà±'p»Çž²Á3ì L ö4ýZ¢v5["ÚË­ÕÇ€ùòÚqì0æ(¢Ùâ(ŸÐfdÙ†„fý±Ù¦˜µ±'‰h7ýHf‘X ÉD¾â8Ê+ŽëÅ ºìý€v*içõä+r¯˜µJ» -íeŠÎêÃÀ‹|Äbp8zÖª½Øªþbø ,[ú§âãƒ)Ηb›8 46 öm‘h7-ê É·°€Ñ#Ÿ¸–Šëf*†t?e_™Eò%¹À5³ˆ¶{‹{•R.VˆD{Ù¡wêP0ÉG,Ɔ‚£c™Eù°%³ðO9‹èXnÑÌYdc­ÍÊ-P2ÑnJµCšU>b1vHù•xà€J•³ˆîxÙŨÎÂLõÕµW6ÚŠÔbR©{¸]Ùíe‡ÁkÃÁ«|Äbp8ͺ‚­|W°½†2.pÊyE¢ŒkTÞÎa:Æ£<¬-í¦¦I;¦Yå#cÇ4E™€«©ÓÔåÈÎøîÔ]XÀÛu´"Í;T6º‹{•Ò-oËD{Ùá}·h; ŒÅà pJì˜v’A^ZÞNŒ,®F˜š9 rÒ­ZÈD»)(ªÇ3$±<žI‰ÒNòmú:G‘¤µÇ»rhLNÑ3G·ŸÒ.*•,å¼B$ÚË#hƒÁ«| ¹|;DÏÊ p+ÊÛVGѨ¼==kЭ‰vSÐÜ ’yX É gŽ師2£{w)¥)Z^«èjEÑ)ŸtkÛ2Ñ^v˜@&ùˆÅØ@0¦Àª†)l9RñhXÛF€ÁO­\EHÓ´¹¶Š D{©h‰ùôUôA¾EEóà±L†‘&Ð;SQˆíýLEq>ಆhz$~û™ŠÀ¸luǵe¢Ýì0êƒÀ‹|Äbt8óœ"¿*§`³Ù¬9E£ÙŠò¬=Ĥ\Ô‰öRÐlôc™E>b1x,ƒ™åYUªsÙì>§ÙbMNƒr”L´›&}x‘X cd9Æ-9Å£*£›V+œÒ‹6®"eŸ”—ÊÊD;©¨7V?–Yä#£Ç2‰÷]$ÅœÓîs %šå®*r 0Ù%åÓw2Ñnvˆê00ÉG,‡?,–äÃb/½‘ú3øÉa{ø ¬÷Úƒx2Ñ^*jz4Cò‹Á£™äxÏ…¼²ª~òvç®­Oà˜«Hóã­®Â:åÛw2Ñnv˜Õa`’oa!/LÇ3°¬"ë² ݸf“u·q.†)«¨D´—Š:¯Í,ò‹Á£™YV‘£bV‘ãî³ ëƒ3¬R‘CMVá0{å›F2Ñnv˜Õ`’X —8‚Ù!nq*Že93WÑ,«ð%R>V!í¥¢>èG3‹| ?z4“¹«Èš®"ïÞUdëcbÓÚ9Õ¸Šân‚ò± ™h/; F&ùˆÅà@pö €Êò¸àKûŸxQÛ¯Fت¨ ÓØj; ‰h7 ú±Ì"±=–áÜYîä®taïðS .ÿ¬R‘] ü²ò± ™h/;«/ò‹±aàlX£lùðªœYÖ'ÛÌQ€Åd•»ŸD¢Ýô#™E>b1v$S4É2Ul“-ÄvŸQ”|2›u¢"›š6Y(:”UÈD{Ùatú ð"±.jb˜n*i?±‚¼P:BFh´%¢Ý4êG2‹|ÄbôH†´Ë½Œ¢¼÷žQ`ù?gsUíh“Q¾U!íe‡ÉëCÀ‹| 76œ rG!ovxiF‘8ÙÕQ´Zæ1€~ç“D´›‚&ýHf‘XŒÉ w¨é(òÞEÊå×or\Iªrè@ùV…L´—Þï P¶ÃùˆÅàpÌ|ÿxÞ²žXæ‘Ìj„­–y”g£zF!í¦ Ø ’yoa!ß“IAùêñ¬¸z|¾$½oGQ^O!\Ÿ/n_=ž!4ʇ*d¢½ì0}x‘X [6¡]>¼jB{íÍŽMh7k-wT>“*í¦ ¨É,ò‹±#™¢“ë„vQ+½ íBl÷Ú>d0«£È¶fBÐúyÇ ªJD;Ùa0 /ò‹Á!`Ë&´Ë‡WÍRXF– h7Ë(Ð&õùl‘h7Íú‘Ì"±=’aóÙåƒb1Û~œÏžŽY±¡»l«æ³q:·ª]Ì–ˆö²Cõ!àE>b18ìsνªë‰9 çá(ÐëÏQHD{)¨3 "™ùˆÅà‘ŒóÌQ8¯è(œß½£˜öȺ¸³­qÓÆIíË"Ñnv˜ô!àE¾…EÎ6°b¶ ¯š£àEÀöŽ"‡â–µÛc%¢½Ô[ýHf‘X ÉØÀ±Qyê£2£€½³Ñ´Ö¬ŽÂúŠbv4Ó2åb¶H´›&u˜ä#ƒCÀyFñºÙlžQäöEyÖA}ݸH´—‚§É| ;x$ã2Ï('³ ±Ýg!xcÖFÙÕLfG“ i_¦‰v³CT‡€I>b18ì"Ë(œÜT_Q£p±}FQžõ´ÊL]Aí¥ àD2ò‹Ñ#™¸‚*f.í>£˜ÂZ¶í);¨É(l°^û.…H´›fu˜ä#ƒCÀžÜùMwOeÞÁQØÁ(³E¢½4zýHf‘X Éx>pç5îüîî¦]O`Í(|ÍÀ]t&¢ö] ‘h/;LF&ùˆÅè°]ç(ʇ-s—3²®ýEtÖä \̉vSРÉ,ò‹Á#ky[žÕ›£(:ºû9 ›‹Š±;k*æ(¢KΣr1[$ÚËÑêCÀ‹| 38ìùd¶ß4™ýz œ¬€ÿª; DõEã"Ñn "™ùˆÅà‘Œç“Ù^s2ÛœÌÆh=Ÿ£ð5“ÙÓ|vÚÅl‰h/;ÌV^ä#ƒCÀXFáaKFñ¨ë‰;Š(¡¶£ð¼ÑÎ($¢Ý4êG2‹| =’aGSÊÅŒÂǽghLÎkFáCMFLù>íb¶D´“‚qúð"±z › §§2ŠàŽà(‚Íè•ÛcE¢Ý4êG2‹|ÄbðH&pè)hBOá#ôT24nÍ(Bô"æ¬]Ì–ˆö²Cëõ!àE>b18wa‹£xTÌæŽBêQWw>i·ÇJD»)hjÉ<ÈG,Fdøü ïÁ¯t°{Gc¾f<øGsž²JD{Ù¡ úð"±ÆãO새Cpብ€1­Fج˜ S@¤ =ID»)(êG2‹|ÄbìH¦h»¬“øÓÖ-Œ)íÜQLw“³X àvGÓ!v¯ =‰D{ÙaI¼µíä[X„Á!`0,£óª®'ÃÈÚ5£hu ƒÅˆÊÅl‘h7Íê‘ ÉG,ÆŽdŠN&® Ïe''¿—““/ÿvûçÏÿÃÉÉÅùõùùÍí›·——O9’Ïÿðû¿pb&~Dt!Û¼‡’ã°%T„¼¶Ë†Ì2Œ=½¾.¿³çüF.fµÇ*D¢½Ì2€:"Lò‹ÑáY¢/¯ Þ¾u<Ïs‡ŒœsÚc"Ñ^ F=°!ù̓6wé9ªD¢p÷ †)ÿËi­m‡X‘`”é£öX…H´›FuD˜ä#ƒ#‘ÇoQŽß*µ£m¿Ñc²ô¤=V!í¥ Ñ4ˆdä#ƒG2ѲÑ*nôˆöãF€HS`SR•+6zä{í’…H´›&uD˜ä#c#ÂxÀ›Æ*ïLœ.›Ônuò.#š ÊmP"Ñ^*š¬~,³ÈG,e€V€æ`|¬(öžÝF…šÁй¡Ì(VˆD»Ù!ªcÂ$±æƒ°i°â©QmˆíGµ§\9hßF‰öRPtú±Ì"±=–რ9X»¬H³å{Ç¡b°ÂšòWÊÊåíT»YbÖ†™€ æ×'óë“-³Iº(¦ë+¦‡í‚·ºYŪ½t4{íp† H<g’aT2ŠT2»‡ æfl¼"âvjÒ©äCÒ­j Úͳ6Ì$££Á¬/1ÀÌ*Fñ¢tWLß]`FåsÚ¨vÒÑhB‹æAÀ…‡=¤Ië¨" q÷0”M1ÐÉ„é‘Äí0TÑ)ëó¼%D×%ª½LÑm@˜ H<G„“gî"ÉãƒÛe».Ö‰šöt—G·¼}€j7 BšE@â1xH“|à:ªè.Rؽ»ðÁ`PÉU¹ W¨ÝŨö2Egµaa& ñŽ|~;nšß~ê^„æ…‹ùacTÞôq€j7…!Í" ñ<¤‰|„;jŽpÇ#Ü.=œXIÅ÷¤SÉÌç/”MQ Ú˽k€ /ÑqáÈÜEŠ¯Ú Å³‹twQ¢Cå}¨vÓÑØ"¤yx Ò”—×QEw‘ÒîÝE6Ù8¶ñ#A•»ð¢U/uKT{™bð páEÀ…‡N™»‹üªíPÌ] 9†»ð>'«{ïÕn:š„4‹€Äcô†·c$¹£Î] ùè.‚ ÅKXå.‚±ÔKÝÕ^¦¾.¼H<ÆÆ…-7E{À¸ {xõ‡EÖÕhõÇô°Ë‹O¿3J¢ÚMG±AH³¸ð÷ÇÑQdQåÃsQ''ÿv{~s{rrw~{wñþ›““_^_ÿúôîôää÷ÎN/ONþõâìæÃí‡wwlQÈo/nïÊ/oúo~ Oo~÷”ÿüË飱núÛM#ðó¿ýÉIùæóß¼=½{¹‹²x´n,Ñ;msL:>)"„LC§ o¿zÙJk,”7kÔ®ˆT{™{ úØ3 HX1–=ä’Ì?ú$`t§4îÁð •O²àA{\üÕnJŠúq Hš,ï°®"ïÀlAù¤øªÝl4é£Ï$ ñ}Ζ…tY¬ˆnmòš)å#¤8íØÒî ©öÒQëZÄ:.<ì౎ÏFЇ¤—v8ãöžvxg²ó,í@_“vdHFù°øªÝL`Ì‹€ÄcpŒÙ9æ.œÛâ.ÃT†ÓÍí !¾Ä ÚžPí¥¤ÎéÇ4$ ñ<¦q¸’>ç/ļãíwW·ïî¶U9æ÷èΪv<kÝY¿=ÛðÑ*¯d?@µ›ef}™$#ÈË_‹eÎDË|éÀzZíÎLœv×h%»Æw¦š°¶ŽJT{é¨÷ú! H°’£—Ž_œpD†P•±V:šAT~ʨzÊ!Qí¦¦¡A`³HH«™Øî÷YE7-"1ì…P³Ï*øò—U/vKT»™bl /ÁágþÄ>l96õdzîM•§‚Q¯vKT{)©7 bšE@â1rL3ëeâJªumjVÓÝ_› àîQ呸škSÁgDõ}¹"Õn¦˜ Ë€Äcpd8VHŒòLJEõ"ÚpwŒËêërEª½t4Ø1Í" ñ=¦±lGg´¢EUº ›öî.,8yE£`ûÚê.¬ËQ»z!RífЍ “€Äcp`8Fî.äå¾UéE:‚¿(O;•è+écª½”œ~LCÑcšÄý…Uú‹´w®„vf£¦Guþ"á\ R6Ej7SÌúÈ0 ¸ðÀ‘‘á)šà—@Ï^:{ÙdÚW/r@õ)@‘j/¾ELó ñ<¦Ó€Ó¼p½úÛ÷·§×ûÕ!­Ý{Ù¯žÑfÇ€*ÖfûÒ!¾òN F}ˆO¤ÚÍH³>dLÑ!c¾M.ÉÛä^ŠS¹O¥5 sÍI,!³ÓÆ©Dª½t4…ÁÎ"àÂÃì$ã¹ŽŠµ·º¼#Y!ÞÙWÞaBˆü `œ.lÎ;’É >Ä'RíeŠhô!cx 'Þðžä†÷ãT.°ËNÉ3šÝvŠÉ&‹Ú>C¤ÚMQƒ~\CÁãšÄû5’ܯQé3Âî}Fù?Ùšäj|FL€6hò‰T{™b¶ú°1 H<‡Á²…‡óñ©ûŒGKÕ3#ëÖNÛÜÎ]d0êS"Õn: úq H<kJFÄu´jááVuvó·ë;ïjÀ*vdf/`UÊí¹_»¬ŠˆÙ©¯Î©v²Òlœ>¢LÁe´ QFù,Ü‹³vŸÝZ%ovŸ#Y°^}hC¤ÚMI£~¸CÁÃä—Q®é×eèŽV%ø>‡ iÊAÖ§bj åèóý•Uk©ö²Fëõ±cpááFÇŽùÄm’'n+úpS^M±Y_†‡.~]•¨vÓѤÖ€Äcð°&eŽUeE¬ ÍÞ±ªˆŽoIXƒUaˆÎ v®Hµ—):¯“€ÄcpØçÙú þ´‡2 û„¿@.oêû‹mÒîévSRlÓ,.<Òà1 &¨¢ÜÚþÒÆª·7§?T@Uˆ°;¨*CÉ=ò UáÜß¶ª*¿»œÔ:Dª½lôþÖ˜².Áe lƒ8Š[3ÐGp$%"Eõ‘j7%ÅÑÎ" ñ=Ú¶ÁAÜà_™xL«swx )a}ÍT$ÙÚÔ׊T{™b}Ô˜$ƒ£ÆÙ±Ä#»×%¬´‘½k_ÚȾGêMU"ÕnJšõƒx Ô”ô‹)©<Rç/²‡¥T\x·–6²5.#›œv/®Hµ—5Þ¿)[ã" ñ6æ3€éu3€]68mÈkâ3ì¼/[{å­Lµ—–F£جÁ›Ä§Ó³S€|FJ»¿¨c’JPqQÚI«´‹2Õn¦˜ÔqãUÀ…‡¬Üã˜bFæ02¾î»›óê0ZÝŽ-OÛFÔ¾À$Sí¥¤ÉªG5«€Äcð¨&cäJúüÔxùѾ¹9½º¿+ŠýÕéÙ·ÓYسïÏon‹_¸}ãÞ¼ýú)Góó›äYºðO^ëk=†¼Êiû ¹µÎ†y–ªÉŠT»™lR‡‘W‰Çà0rvz#ë.59VëÈìdškUì(Š>-hTñ©öÒÒû–Te-]\xÈíØ#i)ëÌQñöFŽ{¿½‘¦•ë¶Ã*no”PÅ$4ÊÈ•Lµ›)¢:޼ H<ÆÆ‘­ñk"R>¼.ÉŽf³¹¹ÕÞkKî¤Þ—+Sí¥¦÷H¿²š.±ã𢙑«ékXÝ~{~yY38­¾Þ]§UŒ¾8³>W‘}83£²•ŠT»YiÖ˜I@â16ÀlMÊÌJqÓJ’G•sÃèbjj9cõ/sÈTû(i0÷oQm%µì2ÇÄcôˆ=WÒçF<Ú£ZÖ0Ðv/¨VJÖ§u'û4\ZãWbí^™j/“- É>Hx¯ŽW‰T{Ycpú3 H<‡˜-®Ã¼vÞÕ]?b8Ùܾ Rv ê9†Hµ›ŽFýÀ†$ƒ6ë¨Ø)Xç1lvGòã@PÞÅlÖ&ÝäúíTÉKµ/ÊT{™^1}Ó[$#ÅSðÀ݃Ûä/Bä)óíRŠ …d•µT¤ÚMK“~CÁƒÇ„Ótîhbä”-¢µkÜq—ñâ”â^­´Ë"Õ^Öƒ>$LÁ!aË|+'ø/½Ü15•1Ê‘Áçv³&~Ù6i¯D”©vÓTTnV‰ÇàÑdš*on¨L,âÑ6“ŒZ¼˜–Ùù°âP6T¬%yÐ)åDC¦Ú˨£Â«€ 08*ì#s^F$*6ZŸÚ¯Ðž6 vž!Sí¦¤Y=²Y$ƒG6>2áåñuþ§Ýû‹Mž×K,ªüE²É[å$C¦ÚËÔ1áU@â18&ì=›ßðáu:£؉ŽV«M•8dª½´4ý¨†\´4ÕϵTïFGy;íFÇÀÀTð>8Ç|†¯8Óñ VÊä2ÕnÖÕaâU@â18Lì- ÷öU«=Ï1Üj‹¾Y’a1;õUV2ÕNZjÑlH@â1zdÃÎUN=ëŠ>Ãí~õaçxG­7«]1øiU»²)ŠT»™bÒLJI@â18> ë¨ òÎÔíg %lIygÔ0Dª½tÔZý †$ƒ5Á®£Ší´Áî})á+|û\ÑK[t*yõCã2Õn¦ˆúð0 H<‡‡­c˜”õ[0©øT³”õ “jÕ,åByØó©[U-©öÒÒûa5]-%‰ÇàAõžk©"&eÃGLjJ1ÐÇÈêÞ®“ºW+í:†Hµ›5f}„˜\xÈ« Ç±ÆÀ[ƒÜºøâ€æû§šy 1ª—¾Eª½ôÔ{ý؆$ƒÇ6Yl²Þ\;_¢Øuš‘ #ÂzÁɆT±·èTJÔ]†Dµ›)f}€˜$ƒÄw-¹kñ¥e ŽJ±}ÔÍP©±üC»ð-Rí¥£!4kòZÙt”]+D ­Ò]ļww‘R0žMx‡¹t«»ˆ&—(¯‘©ö2E0ú1 H¼ H<LJŒJò`Ô‹ײöÚ”×*F«îZo!G§Ý'%Sí¥¤÷~”•tx ֤칒>WÄ89)?Ú77§W¿>½;=9ù׋³›·Þݱ;à¿:=ûö¼üûïñ—¿1Åo|ö‹_à/Âoâg¿ÈÿËÿê¾d5%€úåoBáýƽùþüÆüh~þWxóöë§ÜÓçøý_V!Ð9÷?û±&€ié{Û°êÈ 5=¨«vqD¤ÚÍÊSØypáG†'嬷%…WÍ’sO¾½'rÓò"õäE¤ÚKGƒÕ—H@â1z¸x¸ÏÍ‘oñD¿þõo Ù߸_ü¯ÏrñD.þúXì÷ö—ù—>ÿÊÿæ×¿t‡<‘Ý䉣²ÿäž(MC ~ííJ>m÷DÞµ7aÉT»YyÒG´I@â18¢ùøo”Çkfcb!`3_ä}õ^`™j/-§/‘€ ¹’1’–F®¥Šu—¸ÒR-›SPSz™ÕJû¹Lµ›5¢>¬MÁam Ìg ÜWPQzAv(¡YéÅG× ±K¤ÚKGK*¬¯£‹€Äcð¸Cä:ªè1>zŒ˜0£w¡¯ò³Z)ÏÊT»YcÖGµI@â18ª‰­gGy™|Eo¦öëÙËÃö6gõC¢ÚKG“oÕ,Ñ£š¸Ž*®gGÜûzö”]ŒÁ3w+Ö³Ê>h/5‘©ö2E4úÐ3 H<‡ž#_1åC/]ÏÎ{»Âz»|TO0$ªÝt44i‰Çà!M ¼·+höv…½]Ó„zDä½]®¦·+L«.´—³ËT{Yc¶ú1 ¸ð0ƒÄÙ³#û- Æ#HÊp²«)6+b´ï?ÉT»é(èG5$ ñ<ªÉ>p}.ÁØPP?ûþüæ¶x†Û7nSu<óÅ ;©Ž›˜—:²c™ÈK«ãÁÙ”Ô‡ØEªLÖ—Mßd‰Çà(rN,ÉiK"ò·âwh3cˆ=”¬/©×:DªÝ´46~0zðƒ,ɨ˜ŠdÜû;NF€µ›*Ǫ<ÄDõ!v‘j/S´ND&‰Çà r6¬}^UòŠv*vX0³ ŸÍ –÷Þ´ƒ^=‘¨vÓÒØ ¬Y$£‡5†‡5Fq…{¶G[á>¨ÃHlä7?0WìoÐ)íþ[‘j/St^F&‰ÇØ0²3,v+¶lâ}<”ÈRŒB+#Å€0íÐVS‰j75M âšE@â1v\S´ ¸šê-ãu&ï~¯÷ÆÙuw»3©b¯Ñš´{©Dª½Lч0ò" ñFv†ǡ×aRŒ,+Ž·ZÅ[vqÈ^Ý]HT»é(6ˆj‰ÇèQMàQͳÅqVÒøáâýíåß?büêj)y¼ùáþßœ½yó‹³ïïn>\Þ¾)?Ö‡ïnÎÎo¿Šáëù ãÙÙ;ûöÝWñy“¢1oJ(ŽðÕùû_|wû ={ë¾~èàíÛó|rRŒáìîÒ»7o//ß\}wqÈmÍ.ëWŸñ.ኌAS·5NéÄ„†2?ÅKò/-€‰9fíÄF¤ÚëpåQ÷@.<ä–ö^Ö°W€|Fkû‰‘Bé-¿P"°yAŒ²Ž T»éhÖ¥H@â1z(e×Q½–ßòjüØòk­Iȼ…©iù…ò÷ â蚢Dµ—)èCÒ$ ñ’vÖ²¬ÆÚWe5Ì]XGpÓ¾§½›K¤ÚKGK,ÝBGï\t4ÒXv5­|Ы³b{¯³Oý¾ÑÑBy$¦¦ÎÅͤ¨Ý˜%RífŠQ&‰Çàx´ Ü]„-îâqÙ„û 8†¿˜Ðƒ¨Ý—%Rí¥¤É4ˆi‰Çè1 pšþ>ú ‹&ráëüE¼/Ö+›¢@µ›)&}@š$cÒ624êÐQ÷þM %l_4—ôÑ(‰j/EÛ"¦yxŒÓe \GÐãG4*ç„!¯m¼±‚ì3ª» ‰j7SÄÀð" ñö†En^> W“^xÓþ@úô´QA¯Hµ—’f× ¦Y$cÇ4E™€+©bO–·»ïÉšüÅÚHjœË5=Y0u&8í±‘j7SÌ áEÀ…Ž ß÷ˆÒñ§}qõ"2º¸¶Ó·ûˆÉ þõB‘j'- ÆëG5$ ñ<ªqÈZ2œÜCVç0æ+»_Y£Ëtïvz*ó¬ÑVŸq¯VÚ R"ÕnÖ˜õÑax Ž;ï˜5ÊÛñ¶¯,qs ­õÊô`ô!)‘j/µA?®!~ô¸Æó¸Fþiå>Þ/ÿvûçÏÿÃÉÉÕí·wW—oî._¾˜¤(±œ'ÿ³w׆kÐ[žcu_Ú]‹Á:£Þ.%Ríe˜ÎècÅ$ ñ+vžø× „Äè²)ÐlG"F hÀEªÝ´4è‡8$ ñ<Äñ| Ä+îH,Äv_O)Ø´n`/ádM¼èFõ•º"Õ^¦è­>XLÁÁbÇÁb'ƒÅ‹Iœ³þÆIÙµ*‘j7-…aÍ" ñ<¬q&3-µÏÝÜ‚PÙ¸w‡Q+iØœ*FN®ÔÎ0Dª½L18}°˜$ƒƒÅ>óêb~Õ‰ZXɳú hå.r ÆÌEªÝt4ê5$ ñ<¨ñ™¹‹`ÝE0»wSâx”Ç:w¨Ñ\¤ÚËÁë#Å$àÂà Ž{vá©|xÕ¸·ã€;ñäZRÁ"BðÊ-S2ÕnZšÔƒšU@â1zPÃn<•Šßþx7ž®€CŒ1Ø5Åð5gžÂ4ŠV9Å©ö²ÆèÕááU@â18>LÁña°¬ßìëæøYŽà.¦ › Ü#%Sí¤£`Lƒfx Ò€c¨)ÈCêuîÜѦøuh¬A³^w`*FøŠN•מöŸLµ›)¦Ðð"àÂ# ‡Ì³‹¼%»x¼ã»°Só[’lUv¶¨ªz©[¢ÚËÑ5À…‰Çà¸pJÜ]àwñ(»p¬x‘Øyš†½QÙæœÕ†Dµ›–ÆAÍ" ñ=¨Aî0PÓaäÝ;Œìtþƒ½ªF“zõB¢Ú˳o€ /Ñ‘aÃ6-DùhÇ‹7HeF×®†8·q3­}wO¦ÚMK“~XCÁÚhxK† ñVÖ/Øöý: ˆÙò r¨pѤ<ï>R6Ej'S,oG}l˜$ƒcÃèY†A Âp@ª¼9<ª/©©vÓQÔjH@â1xPƒÁsUÌ/vŸ_àŒ28öB¨É/¢´)‘j/S´  “€ ¹€<)Z–_ Ý’_<îŽbùº£äÎyk´ Þ"ÕnZš5‹€Äcô †o­Ay´°Òa¸½ç8õ϶@ MU~QHyí«I2Õ^¦è@&‰ÇàØ0&î0d`¢b=-âê/šÕ/’w!;ívZ‘j/õF?¨!Í£5‰» yýz¥»À£¹‹‘÷¸¹“s}*±ÆcÜ«•vG­Hµ›5F}p˜$ƒƒÃÙ°nÅ,/Ÿ«è¨ÍÛ#Råa—ŸX;Á©öÒÑ`ô£x Õd¸Ž*žÀÈv÷Û@²˜Ùæšm É—_’zG­Hµ›)&}p˜$ƒƒÃÒOìCÞà.àÝ;³S˃6»²—"¸hÔ ‰j/½_ ¬¬£‹€Äcð­Å×bV.d—½vœ`€ÏÖÄ\ã1fµRO0$ªÝ¬õÑaxŒ{c×£|PJ0 ¥c$bR¯`ˆT{éht ¢šE@â1vTS”)pÕK0¼q»O00Ø×ý´Þ˜ª#Y´êR"Õn¦˜ Ã‹€ y#Ó0¦è2²mÑÅmÑ5;Ís^±áv;Í1Ũ3I¤ÚKK“×jH@â1vPS“õñå,öñU"R9~L1RÉÚ2†µ†‘gØa«ÏÈÁ9£Þ&%RífY&‰Çèø0_ÿ™åõŸ/n“â>#á7˜LÔ>œ$Sí¥¥Å”µµtpááGl"¯bÈS†•>#}<ä]ÎÜ&Ke¨È3¦“-qÎU­Q¤Ú˳Q‰W‰ÇØ ±7ɳ”?‰]î/†¥2£Ëî 4k­ëŒþ,†Lµ›–õÈfxŒÙÅL\KÅr[%0…açÀÔ¼ØÜѽ·òH"Ô8 É rC¦ÚÉÓ=<ªmŠÁ1bk˜Ã°f‹Ã˜¦¹ÿa;£ËZP\;Á%}!Pí¦¤Ð ªY$ƒG5Ö$®¤ŠþÂÚþ"ZÏ@)or•¿ðÎE§\È©ö2EëÔ!âU@â16Dì [UëͦUµ ž¾Ù®Zߪò 6„ ÚˤdªÝ´46ˆj‰ÇàQÞ¡¸¬¶Ûý²Úâ0ìz¼§<’šeµ0U¿æ-SíeŠÎëãÃ$àÂÃ{-‹Ýâ–kÞ àt×kÞ­†÷ÊÓNÁ&í"†Hµ›’¦QÍ" ñ<ª±¸’êóö6í˜÷ þË¿cðn}$PqÉÊÿ²óʳÞ2Õ^¦è}lxx Ž [Ï +W?_^Á°QìF¶¡•ÓÈÙ$ý*†Hµ›¦¢~dC.<äê45°$ÃÊçž*F8Z’1påÛ¦y½Ðê­«É3fµ ÊÝR2Õ^Ö‚>FL±1b—ù9³,Ÿ3{éÒZg2Ê•2fÈ«‰ß(RŽ!(òÉT»i*ªG8«€Äcì§(g⚪WÍ(šº÷jF å! ²[WQÍxÐ)åê·Lµ—)¨ãÄ«€ÄcpœØ±¥=åÖdã18ÅËPΈœÚ›BdªÝÔ4«Ç6«€ÄcìØ¦hË4œ¼i·.Óp¸÷ršl^l½‹iFÄè‚Õ^,%SíeŠ1ª#Å«€Äcp¤Ø…ÌL^wL‰‘eeÅVíRåa{çµÇødª½t4™QÍ" ñ=ªÏuToÕyy7î~Õ¹5åëb©òB¨Xu³ ´ç1dªÝL1©cÄ«€ 88Fì[ÁàœˆL¼xîÛ0º~-+N™H‡‘ŒÍqÖÔR™j/-½ßE¯ª¥«€Äcô fFÖIµÄŸ¶ÒaxøXÉ@g=°kJÞÍûÌ6úŒd|öê÷ZeªÝ¬1©ãë€Äcl|Ø{†—[–>¥lb„ÃjŒ¶Õ>ÂdCpê=S2Õ^jšzh³ ¸ð/N ¤¦5öù ·°û¸p:Á7mjXç2¼«ØGø Vʉ†Lµ›5¢:D¼ H<‡ˆ=»©T>l9‘ñ¸m*²>[Ï*ÅV¶ÉY‹Æj{ ‘j'=EãôƒxŒܰ«JåƒÞ™Œ¢¨ÏdÄ”¸`˜×¨9¬TÔ*z£}é[¦Úͳ:R¼ H<GŠ}d‰¿—»ô_œjÄÈšm}Z¾Åت×1µ'Àeª½õ¾!ZUQW‰ÇèáMâá|¬Òm¤üÑm·íÏ’y÷ÜF·q¯VÚ› eª½¬Ñu¼xx ŽÛÌ÷1ä-գ̈́Éò2¸a3l«Bx¶1ã•ë2ÕnzÔÛU@â1xxã ƒ¨œQ„¨œ9D5j!æ2,VàSÙNKq½2>%SíeŠÞª£Å«€ 38Zx!Fô.ÛüŠ–GÉÖ"Ûƒ³þõôúºüöžw(Þ{0Úû©íe¦)èÍW ‰Éàà2d¶ÅäÖ°ÃåÉq@Èì¤_«q@ÌÁNáªò†ªd»é*6~HBb2xð9p]}îªßÉIùѾ¹9½úä7å‹·Ÿü×1þ·““òV½úðþþk''Wg7n?¼»ûäöÛÓ›ó·''ÿç_þ}þG­Ó1vwN§ä³`1¬¿tN'ä䃾ÓÉö2dõ²;“pa"_Àǯh8@}Øéº?ÁNžëñÓ˜ÛÓ«Ë‹¯+ýIòywþ$» ëâJÎTø°&€vEþÙ^FšA®f“±áj‘£bòªÕ ¨˜g”óŠŠùvîħ€ÚKví¤©Ù˜‘I¸hj<ò‰ÈQ1Ùù=çN~8ÿþîôú¢6?ÉûÅ0¸é¶>ƒTŠAðÎf}"‘íf¥±vM“Á±kà÷á÷æOM“0ü¢`;’’ö¶“d{iª5-"ŸEBb2xäü¦àÍÖÏù“?_ŸUú` B÷âK šhºjø¡Á—û’õ+ö"Ùnš€Ö$!1´FÇ®¸¡¯¸mÈMQök M«û˜£IÙƒö0»L¶—¦Þ¯¾SÖT’˜ õ cíèÅÎöç|ÉéÙÝ×7?þ­Ò¡ Co÷âPŠ)¯{´©Â¡Dƒ÷—-´ÍT ÛÍL±"M“Áiä['PnÚRνžêå‘l/M ¾Eì³HHL}×ÔçN¢ËMÅçßßÜ]ÖVãY=p7îÄEH‘U㓯q'ÑZõ“·Èv3ÒÜ“& ‰Éؘt0vŤˇ-ÅÓfŽCþ¤Pãø“€Éè'(Ù^ª ¡Eä³H¸0ñcG>EŸWÕç;Šòþüî»»‹ËÛ:ŒÛ_¿0:ç"ðò LM¿pŒÅio‘?@¶—™–ÇÔÂL$$&ƒ#Ó92!Ëçµ*û…s Çð(©$Ú‹äí¦ª¡Eð³HHLÆ~Š>±‚|–‹“/è>»¬íïÊiw5y´¾¤±«?ñ÷]±›ýÉt§]¿_X$ÛËH“mK/“ÁqéìX %Ë‹cêú…³_+(íú»":ÌNð’ÈvÓThù,“Ñ#Ç#WUA9;ýú¢$)µþÄï±€bÉkI>Ûí”òB &ísºÈö²Rtú ZW ‰Éذtùq=ƒ¢¸koK~âéd›;”òÄSt^{žñÙnª,Ÿ' ‰ÉØ¡OÑÎÄUU¼’ðlåÇ»«Ûw•¥htØ›CAc¬ƒõ>{05%å<ߨֶRl/+-t +}pa"RÃX©Ãá¹Ã%>w[ÞÚCçÑèû‰l7MM-BŸEBb2vèS”“JÉžõ'gW§ï½«B±;ÌP‚ ž5 ‡\•¡”˜(Mpº¶™ dû˜)ãõ—Ö¯“±aéàÂÚ8S>lœB.¸–£8X КvYŠGkrP®Ë ÛM]±AüC.LäVÜ‘Ô53u…ªQ”Â÷ô‡ÊÅÁþæPrQŒ@Ary~ûʤj!¡Qw)"Ù^6jƒ:4Í$$&cCÓß± îØm(¢8N¹}×ðôÀ“>æ%’í¦©Ø ø! ‰ÉèÁáÁ©ëž¼ÉùµþÄî°m8;¸b^6oo.ÊVþöAy åÙ^VZžS+]$$&ƒ#Ó.s+ͯNQ˜CñÆáä .ê§'Ùnªš[„>‹„ÄdôЇ݀+ÊU7)_;ƒRî/9AkÁñäk’“`Búy‘l/ õ±,M“±aé`•9-< þé‘F`”ãº?¯Ñ‘Æé»”Õ“‘l/M-JÕ@S ‰Éàa,¶ñ¹sð‡ ò7§ïk'PlÄÝù“œ¦åÓf}!×ø“âŠçó]ÊV*‘íf¥© M.L䙎q¬Ô#øòóWŸ«ŸXF;¯ûÓôc+—K¤ª_=ÉöRV°-‚ŸEBb2xðã³çÊúÜéßK†¿¾øPéP‚1ûs(h¢a ŠG[ãP¢N{HþÙn6š`Ò$!1“ö¼ ï·䟪žx8Ør.N[?A‘ÈöÒÔèZ„>‹„ ;zèÃkñ¾®ÿÃÅûoïî®k¯Vã‹ 6¬#ò¾ªƥꀗH¶›•bHš$$&ƒCÒ%Î[­4„W'(Ì¡„ŽàPÀ× =ÉöRÕû»gÚªºHHL}Š®rU­JOÎnþv}W=ÔX˜î/CÁò¿õ•6½1j2°€ó$‹¶™ d»™inL“„Ädt`Ú23µvãPã£#(Ì¡X¶ò¨¡Cq£W^\€l/MEß"öY$$&ƒÇ>ÖòbŸ­šiüæºú¤VÑçÝM4&4αÃÁšš‰ÆòBÌѨã]"Ù^6šMLš$$&ƒcÒ˜BÚXjk}(~µùÖúòÄÁçÊ+¼í¦ª¡Eà³HHL|€­Ã.ª*ò_Ï ÊõÍÅÕÅ$Hmipw¥yt‹G]û†!Ö”æÀ&ý¾a‘l'sµ÷‹vÕÍõAÂ…‰<Ó;¹z–§€ß˜§‘æc]aþöìÛÓ÷ïÏkw¯Ääçõ¡¬q8VäcÎ~vKÚf*íe¦ `i’pa‡¥SâJzu†8é5C Í$!1<öI‰g(©*Cù×ýõù÷¿üâwµ) î0EAŸ»ÿ›bMŠRÒKˆ¨^CÉö2Ó i’˜ŒLû0?…僼{ì°GÃ¥‹Çp(aRrõQ‘l/M-/þšºH¸hj;ö)ú並ŠÝ †å¯®*o¡„˜äM¾úýçøÑ¥,²Á¯Ìߢã\"ÂTyc§Qæ |³s)N½ "’íf²±JM“ÁQê ¬ì™áµýÃÖ0Òqm žòšFîeê²sNÉöÒU4 !’˜ŒõL\W7t§rûcù÷¿ºº8»ùpûáÝÝ›îÿøÍ7o/®/¿»ý*B†¯ã´xäìì}ûî+ûƾIј76z„¯Þ—í«äÞ¥³¯ßa´ÎÁÙéÉÉ¿¼½ø¢|{e”ãþº’Sò.±"M5]É÷ú«î¤D²Ý ?5€¾IBb26ô fŽ®éƒøÓÖu%Ã<àÓ¼J“Kð“zÕ_$ÛKU³mO‘„ÄdìxªèSàª*zÔŸù¨ò£}sszõÉoÊo?ù¯ÅCý·““òR½úðþþk''ä±>¹ýöôæüíÉÉÅû¿žœÜ]\ßݾ«s;`¬Ý›ÛA“œw46n¦K¸5nŠ¿ÒßR)’ífËØ' ‰Éàøx6¬y9[Åæå’(¡×,GêgFÙNšêŒk -“±¤¢O<‹—·=¼]¿ÿ¦ü'µÃ0Ùí¯yÙ9÷'¦¦y9GrRo Év³ÒÜ' &86<x#_$«šÕ/Äð(þ$ãõ³‰l/Mµ¾Eä³HHLÆŽ|Š>ñ,F.>çO.®¾ùîÕlÚ ½7R"ŽòOš/Ï Tå'%ѫ޻,’íf¥¹¾HHLÇÃ1²þŒ·è?ÚQ™åä[Ÿ¶?q&˜ Y»1@&ÛKS]Ð|V &~ìȧ('ˤ1UmÑÿÿnÏn.ª‡õ1ín‹>Údq/Ï*¶è»¹åY}—˜L¶—•z£]¯“Á±kXÔgƒèýêò ®}~â ›ø‰l7M ú‘Ï*!1;ò™¦u˜¦Ê›Ïžó'W·Wwµå °7w’0ƒY‡ÅË3˜×oov'à]Pï[–Éö2Ò`õAéUBb26(=-ÏdFºµjÿDù¤;ÜU8Ú¨wÉd»i*´| ‰Éè/ÚÛíwòîüìòâü}e~2­ÜCñ.§´î:SS/ږѨ/§”Éö2Ó’â·0Ó ‰É਴ÍÜLet®.?qæ(ùI. ¯¾›R&ÛMSc‹Ðg‘˜Œúd–Ÿ8ù:Å an¯?|¸|óöæû ‡RÌ{w½ÇÁ/¿¬ÊPr¶ÎkPd²½Ì4ú°ô"áÂÄKómb¸u›X|¢Á ±LÌY‹EçÕ/‘l7MM B’˜Œú}⥾ºebç×çç7µs*¸ÃebS-²/¬Y&v¯lê Ã2Ù^Vš|Xš$$&ƒÃÒÞ¯óÏ僈zÔ%(>˜cø_RBõ1™l7MÅ‘I¸0IcG>E9#×Tñ§}¾€ryëm%ÞåƒÐaòÏîN Z“ÖôÄϽë›Ý‰Ç‚ö b™l/#ÅЖ& ‰Éà°´CŽ"ÈÛ¤6PØl~¡¶¶Ã´›Í/b°Úg#e²Ýt„>$!1<ôqÙq]­ZýruûíÝUmðË{ßý’`z¬@ï°b÷‹7Ö˜¤¾ªR&ÛËf3è£Ô«„Ädp”Ú#OWP3]ÉGHW|IÈ3ª%–ÉvÓÔ¬ ­“Á#!<]‘缞Ý}üc%ôU´y¹J(Ù¬ÐøT‘«EË~~ j[¨@¶“…zõêUBb26@ Ž÷»­½ÃfQxmþ½ÃÓ´gåe²½4õ¾ÍI[S ‰ÉàQã½Ã®®wøô»»oÿ_m¢²ÃÖagã=ä°<ƒšÖáéM F}á—L¶›&}xz•pa‡§Cbñ^ÁôºÌ$`8†7I6;õÖa™l/Mu¶EܳHHL{²&÷7džó&ßÝNOýûJ0íΟ—’_'!Ì'L7û“Ñd}¤K"ÛÍJ“>:½JHLG§/̇­…ù§FQÂ1 óÞd“bоÉ"“í¥©Þµˆ| &vôȇæC]aþ‹óó›__ÜÖŽ¢„ý•æÑ!¦´Þ!._¬»l4h¢z‚"’íf¦Ø& ‰Éà€48f¦ ÷9oY›Ï6ƒ_3Ûl%±wmPï–ÉöÒÕà?$!1<øÏR/|?_šÿñêÒW:ðûËPrž"ä5C[“¡¸<·Àª©D¶›‘æ¨4IHLFF¥!g$‡2ØèPÜ¡ ÷1æOÚ¹o=è·Ëd{i*ø¡IHLF}f}2LS_àNÄ ÷¿›þÓ÷çwŸ|öãõ凛ó›ò¥Ï¾üö⪪H?ÿ$»s2å0Om/Ï ÊÉ”œØd§ÝP,“íeºÑ4«IBb28XÈŠôZJ·ÜQ‰Œt^«ô±—ñ1{ý*½H¶›ª†ñIHLFއfídUz”{ߟMZ.OßS™³`Þ_•¾‘÷|aª©Ò–ìǨç,"Ù^6šl¬š$\˜˜Á±j X@ù² œòºà«Ùaâ⯣џN‘ÉvÓThø„ÄdôÀ‡w'¢Üøœ7ùñêòòâî¼ÖŸÀîö{áTJBÖõ…¾b¿—Ö£>ï(“íe¥÷‰›¶•.“Áê¡þÄ>¼:=aeúŽÑDmQñ¬ïP$²ÝT56}HÂ… údÏÒ“ªÒ“·ßž]ŸÝ~+]JûKQ°$®×ÇìjR”h3€~YE$ÛËNº>HHLF«‹~¤Ìêô)o,«9®©U+#ߟß'òîªÎ¡®ÇZ9ŒCÁò³)Eö¨Ù9ÝZÉú%‘l/3õИ^$$&cÓѲÓåÃÆ+óOUå£õþMôÔS‘l/U ¦AìC.ª*×ÏFRÕÌTÕW™ÿÍŸ¿ø·_ýþzóëßÿ¾Â£X¿»;óÓ•ù¨qµ<[qg¾h[.¿@õE$ÛÍLchš$$&cCÓѰ>¯òacå‰m,Ñ¥Í -:«?…"’í¥©`Ä>$!1<ö1ž'Óum^7§·W§ïk”öx•8íKyU=^è\š/o*©D¶›‘¦À4IHLƦ£M¨Yï•õQÔQ$ÛËL­m€U“„Ädp¬Ú[†U8ÄT×öåÝ1Ž:fƒ©A±H¶›¦BƒÐ‡$$&£‡>އ>r èÙ],ïo®ßß^W&(Þío‹Ï!…ðŠÞÔìbÉ6Ü7#+[©D¶—•Þ¨µ­t‘˜ŒUG0ö'öÁ+^`ò1гÆéŸàÉvSÕØ"ôY$$&ƒ‡>`€«ªØ¢øœCùÃéõžü¢Ò¡ƒp÷âP\¶&‡ñ Ù×8”IÙ‚zE$ÛËJ½oK“„ ¹=e+ ,=¬ZˆWˆp¼ÑÉvÓÔÔ"ôY$$&ƒ‡>!²Ð'D1ôy¶€rñþæýMm…A¸;r'ÖàÚõB®r' æñ{m#Èö2ÒàÀÒ$!1–àù ¨æ'p”üÄ›ô¯Î‹d»©*¶ˆ| &iðÈ€ç'P•ŸR~‡µéIÜ_z’sÌÖúIy£Õø¬·úõ‰l/#…Е^$$&ƒ£Ò.ñ±yÿlÕªÈèðS)9·¥¿*R$ÛMS±Eä³HHL|\âS)²ó{Îüî‹ßþþ‹_~ñ»Ê‚¼ÃŽ¥Ø×mêåÄš±”’óú›½D²½Ì´øÚfú !1•ŽE}1¼vp>0ʰZ_»û9)9¹º¦Jd»ijnú,“ÁCŸØà|„ªÁù·ï§ÁùÊü$ÂîÆæ“-jaìZ¾fl>£1&껉l/#M±(½HHL¥#¯ÇÇ­õø'nmb+ÜÕnKΜ×w'Ù^šŠ¦Eà³HHLF|x9>Ö•ãßß]•Þi­?Ùa9>±nMO ®ŸsŒIï’Èv³ÒÔ”^$\˜ÄÁA阹•æ×¦' ïJæ{‡ƒ16YÐö'2Ù^šš­~ä³JHLF|2KO’©JO®n/®¾©^ë•Ìþò“œBÈlþ$bE~ŒDõµ^2ÙnVšôQéUBb26*=]fû‰}Ø8 OÜžÝjëü$˜„^ÿ°L¶“¦Fãô#ŸUÂ…‰<{4’¦²}AQnF{Ο|÷ãÝ·çWç• WbÚ߀¼sEýÖþ.ˆP1 ÿ lÚx—L¶›•¢>(½JHL¥1±vaL¯mfåDh_> Swv £´5U$ÛKS­kù„ÄdìȧèCf«Ú…onOÏß[™ž î®]¸¸“lŒ_ÓŒíÂE×Ì7µT ÛÍH³>(½JHL¥Ñ{f¤Ó:'­ñx öp—5ÙxýôD$ÛKSoø„ÄdôÀÇóÀNjϳãñ7ÞÕ—ã1„½ù“ä,N+×g0ßåÛìO¬-¶zz"’íe¥Þ4¥IBb28( úrzõø‰ç¤PÖO}zúE"ÛMUC‹Ðg‘˜ úd~Á'Ë|ž¯Ÿüpûá쯕%ãþêñh<æPr¬¨ÇeK.«Ÿm”Éö²Ò¢µ°Ò &flT:fǾìÇã³?Âx|yàSßk"í¦©Ð"ôY$$&£‡>ž‡>¾ï:½=}ûíeí¯yóΊ )Ì0Ëò lâ<õ†a™l/3Û–^$$&cÃÒɸÕLËÅùBíòÁ–·¢þD£L¶›ªÆ±Ï"áÂÆŽ}Š>WÕºŽáËÓjÄ+Í•„}ù“ˆS'¬ë3°U ˜`ÔËd{it-péEBb28.·af± sÀ<¼RNǼ`:®Ÿ Hd»ijlù,“±#Ÿ¢OžkªXë{vžñ‡«WPŒÙ›;I½ãýÂiîŠØìN¢£>"“íe¤É·@¥ ‰Éبt2‰§'[ ( ò‘S^³“ØÌxï§›?Úš*’í¦©©AàC“±Ÿ¢O<;ÙR?ùáâýíåß?büêêâìæÃí‡wwo~¸ÿã7E¯>¼ÿÅÙ‡÷w7.o¿ŠáëlggïìÛw_Å7æMŠÆ¼)ÆðÕûò#~œµ˜ßžº¯Ó»Ó¯ßœ2gw—µ³-É­6óÕï?ÿÿˆkù“ ^kþµ[h3Ï„ªJ5E¯³1ꥑl¯†8IHLÆÀ“µëA²ò"ÿªRMš{]›kåy—hA}tR$ÛMS±AE“Áƒ,ë×Ôç ™Ð¯Ïþx÷Çò º«w)Œ÷w_8øàºޥ¼3*î "&Ì›•-U"ÛËR34€ÀIÂ…I/ ÚtÒÖmaŽØstm k‡®ùéFŒ~ù_$ÛMSs‹èg‘˜Œýåä8pݶ°—ç§ggµÓø;ܧ6C¶?Õl +º6!Äú)ŠD¶“‘& p’˜Œ 'gYàçìÆmÆÐ5ki·‚ÛS—@‡aZr¦ž¤Èd{éª5ú¡Ï*᢫yìЧ¨gäºZµÏøâüÝÍií<~Qéc­33.³våäLÅvã¢{Ó¢díu/2ÙnFõAñUBb28(î 3£»žÏ/ÄÖn€fãù2ú¹1ZYS%²½4ÕýPh•˜Œ EÏ5µª ¼ÿ¾=¯íVN.í¯ ë˜?ŠvcBP_&“íf¥I©^%$&£#Õ‘×Tä¥LºËX;€M+\ЬÀ£uê×¼d²½4ÕÛ‘IHL|lâ5¹yá ?¹;¿òîää‡?ÄðÃÅûÚ‚JÚ_A!'ËŠô6VTжå½v™L¶›™¢>L½JHLƆ©“öyظðåQ‚âåhÛT¦7“öô‹L¶—¦×"ôY$$&ƒ‡>žÆ.¶-|á¥Ò›ø¸¿u/–__I>T¬{™T-ë_–Év³ÑÜ£& &88Fí ƒ»¼Ýw=±>¬[á®f-_0ýõÓ‰l/Mß"îY$$&£Ç=–Ç=¶ î:»ùÛõÝm-ÜåÝîà.tÆ»N¿”÷EÜ•²Aõu”2ÙnVš€Ò$!1”†Yi0¯ÍN˜? öë(ÐÅ×n÷’ÉöÒÔZD>‹„ ?xäLâšZµŽòËó÷·¿¬Îvù ÚlW¸¥ø“\•Ÿ DýcÃ2Ù^VšL Pz‘˜Œ JCœ/{Ðñ8ìOÂaRˆáQü fýk^2ÙnšZD>‹„Ädìȧè¿$ïöÚuvý]íùo÷çPb‰gЬÏ`nÝêPb.o¬x‰d{™)Ú 4IHL¥£c€×l0Z JôǼ¦gI}½±L¶›¦BƒÐ‡$$&c‡>EŸ<×Ô*Àëæî»»‹ËÛÊ%†^85©"{_Ô^…DÒ?ç%“íe¥Ù5€¥IBb28,]2ªŸØ‡óOP áÜ0LS Ôû…E²Ý456ˆ|HBb2xälÏ]Q®ªùƹ€òuù9+=ÊŒ_ïË£D´öþ5¶<ƒT1âXÔÍ»ÙkÛ©@¶“¢ñ €i’paâ¦!°bóAŽWu sްÞJÈTœ¢¾G‘ÈvÓÔÔ"öY$$&£Ç>Ç>òn‡ç<ÊííõÅÙem `wûK›3®#ó |ÅV¯¢]6ë/¤”Éö²RëÓ$!1˜Nɱ1ä${¿ ˆ›˜O~-`¶˜/a»Gµ5U ÛMS±AäC.LÒà‘Oò†iª¼èõÙuùn®N//þ_¥CI ÄÝ‹CIÉÞoû[žÁ¼p³CqhþH£H¶—™ºÐ˜& ‰ÉèÀ4²A±ˆ¯ÝÁÂK(Ù!AÁLnàP$²Ý4[„>‹„ÄdðÐ'bäšZµåìÝ7WßÜT¯!ŽùX+X†q(“òHëJL5;W0¤„N½†"’íe¦ Ó$!1™™·bæ'"ŸØ™À¬'"Û4fpÑ«ô’ÉvÓÔÜ ô! ‰Éࡎ͚ª‘=¿y^¿×ÌþND"–ÔV‡°âDä¬mAý¤—L¶—™†Ø˜& ‰ÉàÀ4:Ö:ƒnãÊ“["‘õX¶Û™\0…“¶K‘ÉöÒU0úÁÏ*!1<øAv»|¨šC¹ýöü²Þ£ ßáŠ3Ѱ9´s(EÙü´<[ßJ²Ý¬4éCÓ«„ “8:4XóLÑ–Wå‘QÆqÆfþÄÛùz®¶¦Šd{iê}뿲¦’„ÄdðØ§¼Î¹¦Vµ _Ý~vsW[BÉ»ëN&O«V{]Tt O[ ª¯±—Év3Ò¤L¯“Áé’ϲ /½6Aa[!×ü¤ÙVÈÎEµ×®Èd{ijr ’pa"¯…ISyz’ªÒ“‹óû9”Úü÷—ŸdÄìÙšaŒ5ù 8˜®±ë›©@¶›™¢>0½JHL¦3›“Ÿ&sôÆó1æä§W˜8‰l/ME× ô! ‰Éà¡Ofsòåö9ùåˆýù÷…l¥;É;œ’ŸoѲ¯\3%_t­¤¿VîÉv3ÒÜ”& ‰Éà tàK†ÃÖ%Ã𨀒i¶exÂé9”|ˆê‹!e²½t5û¡IHL}_36®~p(ßÝž×·x…£íöÊV˜Î¤µœjÖ?¨ž:þ%’íd³Ù˜ 5IHLƩњµ…­¼„lCºŒ²]Ñghç]òtÒ^½œ"’í¦©¡A$D“±#¡¢œ‘kj] ñå×g§wÿ·Î½Þ]q*Ù ?Š‚&Wt§d\ý|E$ÛËJËûNßJIÂ…‰¬÷ãXéýqäåƒÜž¶¡žâå¸n¬hÖAœRŒ PÝŸˆd»i*4ˆ|HBb2xäc¢ãšºíÊe+×ÖTz÷wb+M{gÖ‘åmQqb+ÍUõ‰y™l/u¶DM“±!j460•Úª ,hœ;B1§; úØ—H¶›¦ÆqI¸0ÑãËãyWÞ³Õù««Zè«°„½y“XrÖÌj)hæ q«7¹W5u¬K$ÛËF½k€O“„Ädl|-Càµ"£Wd ÙEù©õÑjïó’ÉvÓÔØ î! ‰Éàq…Ì45Vmˆüpy~úÝ]µC±qw "S1coh^»<ƒP± ²h[tYìÉö2Óà@Ò$!1’v¼xâ^]J½J¸0 ƒ£Ô.ó00oÜ@üTuÞ›µõ²Yu­1彨î]D²Ý45ëGB«„ÄdìH¨èÓ •Uˆ¯nÏîÞUf+Þìoý0DïÓº-òauéVobss†©m£Ù^6š@¥^%$&ƒ£Ô8ü%_ñ««Î»xøkê(õV}ÔQ&ÛKSÑ4ˆ{HÂESåHb$MåqÜKðœ7¹¼þk-òwˆ|%3a/ë3È%KóF*e •Èv³Ð¨P¯“ÁjŸy¼'OeÖ•R|>ÂØ<Ú\2ñ¬]J‘ÉöÒÔlZD=‹„Ädð¨ÇçÀ5µ ÷úóåÛÓëêÒ|0û››÷ÆBXçÑc ÒåJ삺?Év³ÒÔ& ‰ÉØè4úÀ">/ãrU§Q¦KGð'%tÞk÷zÉdûhj4Æ6ˆ|HBb2zä<ò‘/D<[š¿u_U»ûƒºŠ…°î±Gïk .çŠcRß:,“íf¤ØŽ& ‰ÉàptÌHƒ<*½!=ANyMOšmFï¦ó×êîD$ÛKS­kø„ÄdðÀ'„À5µ*=ùáâýÅûóÚF¯ûKO¬G“ãÚè|Mzâ½æ#Õ­T"ÛÍJs@š$\˜È憱R€´¦'åÃÆôÄ.Äà1 ñ>§¿ÔK&ÛKSoù„Ädìȧè“aš*7¥=çOþ÷|hkúAë\Já»»ejÏɸ¦(±&Eñ1ø¨x‰d»jn€K“„Ädp\:Y–¢$«XA™W£7G¼| ´~o—H¶—¦úÐ"øY$\˜ø±ƒŸ¢OkjUŠR~•éIr»KOб3Ûâ•LUz’L¶¨}X&ÛËBƒi€I“„ÄdpL:FV=‰òI°ºêILǨžøTܵúVH™l7M -¢žEBb2xÔÙÄTùP•ž\ßž^×z“˜v—™$ëòzeÚ®PåMRHêS2Ù^6 ¶$½HHL‡¤£c}ÂQÞ³¡O81Ê^¸p§îMÀc:Ø%’í¦©Ð î! ‰Éèqãq«êþpy^]Š~€Îò-^ÑÖt ƒ³QðL¶—Þ¿GÕmôABb26 )z†Ä×^lä8W²GÈMMlÐÙ%’í¦©±AÜC“ÁãžòrãšZuå›·ÕÞ$¥ýk `,°¹“÷OT-¶±Ñ8†&ß‹& &r 5ŽBb{[AnCÛ°q…yÀxomlQˆÉvÓÔÔ î! ‰Éàq ãšZµ¯þöÛËê±.Àým¬·É€·Ž½/*6ÖeËyöJÚV*íe¥èàÑ$!1FvoZ?öÊì„a]… ßúþ$™cguM•ÈvÓTlù„ ¹©o M–iêTóÙîOв¾½ü¦:AÁˆ»s(fêìbC®q(ÉyÔ_Ù%’íe¦94€¤IBb28$–Á]ó$«Š'‘Qf0±™CÁ`!è'("ÙnšŠ B’˜ŒúXúØ*¸«ü,ß]×g(èö‡x>„µ~‚¦ñÂBkÞý¥m¦ÙNfj 4@¥IBb28* 3Ól^›¡°‹¿Ù®J³‹¿åGFoõë'"Ùnšš„>$!1<ôÉ–e(ÙVe(§o¿/î¤:CÉvwJD°žÏÆc®ÉPîµMÝ¡ˆd{™© €i’˜ŒL{ÖÎ2@wØ¡ÀS%”p„#Ù˜ò”“¶C‘ÉöÒTgôCŸUBb2xèžûäcÏ9”›ë³›»P[A »»Ò˜,ŸØh<¸Š+º¦íNd²ÝŒ4éãÒ«„ yšc#ͼΙå:çÀ+0Êyínv¥1["¨îD"ÛKS½Õ|V ‰ÉàOÆÈ5µª[øöüìÛÕ7µrÞ_¿p(é‰c7äï÷nö'6'ýM2ÙnVšôaéUBb26,[o©fãÅ[ªU7O ±uö«Ùª•\rAV{³°L¶—¦× ò! &vìȧè“çš*–úž­Èßüíºúèo6A˜§ú'÷'Îù×úIy_Ø 2½1«ç'"ÙnVŠú¨ô*!1•æ^yk‡×£ŽaÃ(³/ÓÌŸ8‚vA^&ÛKSÁ5ˆ|HBb2väSô‰×OžíðzÎ_üñ³_þzöœÃZ‰MýÅW_þöó?þIôôG[Ž0Îߣ…pÙ׳ñ™·t}qsñýéÝù \HѯA{½ŠL¶›aæ84IHLÆÆ¡³u,гîµ#Œ†Qöö.ÄÚëUd²½45úÁIHLÆvŠr&®©Ïõtmw!EcÃG’ÐGˆÞ­OÅB ™3^õ*2Ù^†y¿»LÛ0 ‰ÉØØs6‰£Z¸ÕzT%a—â µÖjw)>ƒ‡`õq-‘l7] Â’˜ îä¸nõîί¼;9y÷öò²ÕÊ»CµÐY?-¡gï‹T |  ~àD&ÛËFÑ6ÀžIÂ…‰{¶X '_®Úª’mD¶›šFí ‡KHLÆzŠf2LÖ;“}A±D(’x·î’ MÄW¿ÿüÿ"×HþdK‰dú­5ÁÑØ5ñóó¶ )•nŸÖ!²½¬ÑzmÔ™KHLG2œÀåç7;>g1§1ß;‚ÓH%0ÕÍ?‘í¦¦©Iló !1<¶qÙq5}n­ã§árþè4€ ¿MïSç4rå²ú!²½¬Ñmp™KHL—— .pjêÜiÄ£8l-ÝÎÞCd»©)¶ˆm ‰Éè±MäN#j:¸{§‘ø”{'Ô9Y©ôá)‰l/kô  !s &al9{Vì(ž/v¼žb•Ž–N£8å¬OId»©inÛ,“ÁcÏ*åÃs•Ž N#°ÆN†ñvº³»>_^ÒØâ4&¥Ò‡§$²½¬1@ °x‘˜ŒƒeÖâpV<5¯ ?‚ÓðÑ£><%‘í¥¦`šÄ6.jšGm€—Þ@,½UÖ4X_à>FÄ`Л°>’àëœÆ¤Tºƒƒ‡Èv³ÆØ,^$$&ƒƒÅÝ'-ž¿Ëþ²L#°¬–N#`Lº‡ÈöRÓhšÄ6“Ác›àYBäBae¦ÁVîìÓi”zË3`±Âixc¬±Ês‘ífI,^%$&£ƒÅžeÎoÉ4m+á5 „L£?_þé‹ á!6_™8=mk¦ëIêj*‘í¥¦èZÄ6‹„ÄdðØ&DÏÕô¹Ñò-™F–EïÊi”¡MvÝkUÞ ¶Êi8Sbdíî)™l7kÌú`ñ*áÂD^1=Ž5Þ_™ Ï‘zø Ï4¬;†Óp6õî)™l/5;El³HHLmœáM~ò–ùÊLƒ]@Û§Ó@ë“eç>²Í±ÎiLJ¥ŸiHd»YcÖ‹W ‰Éà`qäNã´]QÓˆGrÞ:õî)™l'5õ&4‰m$\˜øÁc›ÈFÔtq÷N#o ßVµN#xP/„Ëd{Y£5-ÀâEBb28X ‰í%…ôüöO_Ô=Gq¨^—ÉvSÓÐ$¶y˜ Û²Ò`ívÁiâÞ„`2}í:)•~!\"ÛËm/“ÁÁâè™Óˆ~‹Óx2ÓÇq%·ýB¸D¶›šB“ØæABb2xls1(:vï4¢KÓ"ûõ‘¸J§Q”*6¨id{Y£wMÀâ ‰Éà`qŒÜiÄ-Nc {t¯FûØÓ!²Ýô46 n$$&£7‰{¤é5Òî½$ç-ŸŠPé5&¥jPÔÈö²ÆûÞï&Öˆ+yôakÞÌr3cEûÔ|;èN#»ä5²ÝÔ45 n$$&ƒ7àY—„ç6N¿‹éã/¾>=ûkùÝ>¸ °UØý"CôÑf·ÈÁÕ,2ôƘ·*©D¶—‘‚o"/“ÁAäÄo°%ù[l5¿¨Úûo“W¾òtˆl75Å!Ï"áÂ$ ò$>f”ä1£º$ù H2ÆQWOy$¶.™•J¿Ö!‘íe1´‘ ‰Éà rî4^p¥ü…°UŠÇñ.Cƒ©?‰l7=Å&Á̓„Ädôà&r¯Q}£\òq÷^Ãdcc\8RÅaòY©‚g´­Q ÛË´‘ ‰Éà r2lqC2[6>ÕV•Ì6–§ Á&}ØJ"ÛMMs“àæABb2zpÃ[Æ“Ü2^é4ìî7¢àõ5Õˆ¹f“áƒRio2”Éö²FŒ-@äEBb28ˆœøúÛ¤¶þ6cýmyÚ%@R>ôwˆl/5ͦIló !1=¶áëoÓ³ëo__ëÀÝoÅ\‰O% U[qt­A­C ÛÍHSùAÂ…IDF^7ÇMuó'a+2žÕFÆóqFÆ&ý.*‰l/5õ¾Ipó !1=¸á#ãYsd<·6þ¬‹*WŽŒOJ…ú#ãÙ^ÖL px‘˜ —H‹YcV꽵Ƙãx¢òQd\"ÛMOC“àæABb2tp3éyéÃs^ãääá7sròåßnïί¼;99»ùÛõwoÞ^^¾Ø«LÌ>zëØ§Œ•^eR:ýÞ\‰l/kÛ=~pabG1³S˜ÅS/í͵ÌY±.ÛЩ$ë´YId»©)4 ~$$&ƒ?ȃ”ƒŸgÊå×g§wÿw“S™49ìÝ©”0+Š BS™”®AUD ÛËZ£m‚6?HHL†F›K  ëð-ËÈÇ©€o°Q"ÛMMc“ØçAÂ… ûLúÄ3P÷&b»ÏDŒhr\‰¯ÌDŠR5X‰(‘íeÉ5A›$$&C£ÍEAw›–¯?Æ· £Ë¶¯·ë·²Ñù¬¿ÝJ$ÛMOcƒà†$$&£7Ƚƫ¶¯ó~«‰>oþ¹û­ÐzW¡[Ÿß¶þâ~«{RŸ Éö2>ô Àe’˜ .—Ô“÷± ÜÇòÒ ˆ¬'Slï#Bòà@}”\&ÛMM“~,³JHL†Že&}r\MÅŸ¶ª'wî8ŠøêËß~þÇ?É™ÅòG[R‹ù{´¼ÆtR‡ÝèÀ9Ýš[<¨•¶ÛÉö²ÇôáãUBb24|luî'öA´Çgª¿°_ëÁ¢þ¨…L¶›¡~ô±JHL†Ž>&͉\Dx«*ô·Þëµ>*^ X ¶å‘ÌÇ…¶¿ÓgÒn¢•Év2F0Z£cLÄÌv cþN—Ïï&~þ3­oÕ'¾'þì{˜­¬†uÿµÇßú_œùÙ7“ÙÑ·þfýÊ?|ï¤F&NˆÊh¡@±Ó =9¯ýBŽèý"àWðeú°%08<·_(Mm•m1Bë­QŽ8$’Ý43eeÍ\¤#âjŸ‘T3rÕ|MŒñ³ŽƒI;× £mÇ_l -”¢Šò&*‹YŸAdQÅËŠG³éf‹É^çÕ3ÅE:b0t–XtÂ{fq²ë:à à)glsgc4º3Énª©žw.ÒƒÑã”u xúð\OógŽÕ³<Ž3ˆÖZ¤õ^å8Øì &Òz‘Hö²¸¾…Å!c n¬Çâ‚eì–³G™ed]û¾dc’QtHvSͬŽh?HG S‚³L5Z/òDl÷½ÈÓÒdÖ ÁTô"GgƒòðŠ@²—Â|1GÕ¤[ÈעƱ@‡yµ@—EWö3çðÙç«O$ .§ÖÉ‚‹S'Ÿ²v>&ÙK;£Ñ]éˆÁà¡‹Ëžk§˜Ú<7yz}Q~œÛ³oϯNŸš‚üìß?ûÕ¿ý鳯fGò«Ï¿øËúcx³‚ i'™L˜ÇzÚµ¼(ìÖÌÂO]kºC,ÉnæµÝE:b08°À°ðM>ÈU36GÖÈsøŒò½D²—j&«×,Ò- ÌàqM€ÀUó5g­x_C¡…ÿä¾½ç×.©Üf_½³ºÕg‰d7ƒKÚ¸î"1×uܸM¾À?•EÁdõ«êÉ^ª‰V=LÉüšza0x˜â¸/pоÀíÏ sˆ þ·Ý”øNû–ˆD²›Á¡6¬»HG ‡uÁ1_îUyåd…Qa]_¢Ã [~–HöRÍì´Ã”E:b0x˜RÞW\5ÕÎÝNÝ‚G;Q8îb²>³bÓbÆÍE‡É§(ŸH—Hv3¬ ë.ÒƒÁa]ÈŒPÞÂWQ‘ˆ­ýCqAsÏ¡ªj>&ÙI5ÑxíÐe‘ŽŒº€ãªùšöôåF­Ho0²š„íìÉ̺@’D²—Z£Ü.Ò-(¯Çï»bèÖ³µÊÑ‘™ŸY[Åc£ÞUÀ*{‘f7å ê½t‹xÄaðÐ%dÖ/rý¼Ò?˜£«7@Sƒ1¬i ·ß«½W*Ý®%‘f/;tF}¤h8 Žé²ÎA±ŠÒ3`n]n°%CSŸw“hvÓNÐaH¼…ƒ¼\y$í®¢-=×·tùáìôòüÍûËÛ—$æ{pû*H$Êÿà üæô`´g $š½LÒ[õ±£E<â08ðë3I綤îFbdÙ£ÔÆaoŸ,(oÚ’hvÓNÐgH<â0x8ãoÃöŠi…óÓŠ©}Æ ²´ÂÙíiEùù¤½”]¢Ù˃SŸGZÄ#ƒÃ¿‘§ñuip²kZ¼Dy‹ÎòšÚ)Ñì¦Q;†!ñˆÃà1LäiE|6­Øà%"Köë%¦ó¨~=© ‘§/ž˜Ã˜µ×ëJ4{Ù!xý©¤ñˆÃà p2,ZKöù¡¹OׯY.‘ljžKä­U™“hvÓΤÃ,â‡Ác˜d=×Îç†æ6x‰äÌG/‘,ÏÆ´ÊÛÀn÷“R9å\B¢ÙËcPŸ¬^Ä[8È»cƱÃlíÙ³p/-dF6 kn´'"Š;VÎ%DšÝ´µc8 ÃÜC¤bve.ÓG/vÚÔgÖ^§8÷$!1=ð <ð‘óþçÜÉw·ç7ÕÙ‰g«£Ûº“Qw§ ‹˜SbÞe®Boõ.åµ@ß»ˆd»ÙlÔǨW ‰Éàu`Ûyˇ×&+žS>BûpQõ˜æ+êÊš*‘í¥©Á6ˆƒHÂ…‰< lSo<0dù¼w¹¶¦Ò¹„°»\K‹ÈjóÁÕä*%éɨ¼­ñÙn6šôêUBb28Bíxû°ÛÚ>üT·—?Fûð¼.Äèç*"Ù^š ¶AÜC“ÁãÇÛ‡ÝÆöáorquUŸªì¯w­/ÿ0¬2_Ó;ŒÆNA¶v§—L¶›¢><½JHL‡§Á±ˆäNçºÜü*óh¹_7¬«©"Ù^š~ܳJHL{À±Êü+ÐÏRÎîÞUzð»+Ë£ /4Ÿf+¼‰5Î9£¼ûñÙn6šõÑéUBb28:xY>l-Ë?UG ¬,ß,7)áܧh£‡Èv³QÔFž¹„ “48òlCžç¼öo²º÷ºe¼inMOœÓNL‘í¥¦Ùi=\Bb2xÐc\äj*=/@·&Tëó?üžOµ³%rv>"¢ 9²ŽÆ†Qˆò-¬Cd»jCË\Bb26´œŒ]ëèɸçëèOÀWž‘u+žÜhKÊü´!Ì^X[M²ÔÔß"”Y$\˜¸±C™ÄC™t ”y¡øyå#Í¢ÿcûà®N’$œvÏ®>£¼¶WÎ¥B]˜êÙnÖ˜µ¡d.!1JN&p§[œÆ#ŒŠ; 8ŽÓ˜*KºW‡ÈöRSë›Ä6“ÑcàN4ìÞidŸ!®êÓ}š:§1)•îJÆCd{Y£3Úˆ1—˜ŒŽó ü‚ O·ëZN6?Nò8draãÙnjšÄ6“±c›¢OÀÕô¹2ù§ÁÆ:öé4Ð$Œe >å±ÅiLJ¥Û£{ˆl/kô¶ 6ü !1N†í„/¶8ÇÝUœì‘œxhO d»©)4‰m$$&cÇ6EŸ€«iUoÕó‡u%Ÿ’÷îS’ñÞÛu5üt> Ò§€ Ð+l/c ® –ü áÂÄŽ%[ÇÐ+ë_…^FÖ7Ÿ,OÛFç³òž¬Cd»©ilú„ÄdðÐÇzÇÕô5èÕÏÊâ…–üüs—ÅKÞ &®¸S[hEYü^‡tÇË‘íe|÷—Òš_dLƆŽc޼7>߈ûéáã!¬u*§ÐÞG„äÁiï*9D¶›š&ýPf•paÇeŠ>ñ.Üô\î‹}D¡•Žä#Fž´9ºÀ–ðfÀŠÔâA­´Ý†L¶—=F¯¯“±Áãé ‹ÙäcðÏÔ8~a¾ÖƒEýŽX™l75JúÑÇ*!1;ú˜•¸=·ÑpCèáX¯õQá"[ïM5T¨z§Ï:¥Ý!+“íeŒi.é71F·2ñbp=Ž1:¶·|ØòN‡§ßé˜r4Ùe˜ÔPU“ž ÜM™æ5HšÊôBÐIŸ×'½—»³»¹£)¯÷À`ž|èå~;½Üïô÷ß]^Î_{W(~Q4ó“¿›Ÿ>ù»ýéäý§ÿÝ̓³·ßßïs,vþéô_Þÿñ÷OÏDø)èyr½ûpsuzw{wsQìì|ú“²\Ÿ¾ýÏò\×o½QÐw–¿óúŸ}Ëê‘èÛ¾œ¾ôÉôÜ^Êwy‰ÏÞ¿}.ÞÞ};á§—å=Rþüf%2½ì8—ùÁÓŸ>&~þ3­/Ñ'¾'þì{˜i¬vtÿµÇßú_œùÙ7“•Ñ·þfýÊ?|ï¤5ŸµäÇOÿó?ÿrÚï pgrr-3.1.0.2/grr/config/grr-response-test/test_data/repolist.out000066400000000000000000000013711273104013200244440ustar00rootroot00000000000000Configuration file /etc/yum/pluginconf.d/rhnplugin.conf not found Unable to find configuration file for plugin rhnplugin Not loading "rhnplugin" plugin, as it is disabled Loading "security" plugin Config time: 0.114 Yum Version: 12.1.43 Setting up Package Sacks pkgsack time: 0.281 Repo-id : rhel Repo-name : rhel repo Repo-revision: 1 Repo-updated : Sun Mar 15 08:51:32 Repo-pkgs : 12 Repo-size : 8 GB Repo-baseurl : http://rhel/repo Repo-expire : 1200 second(s) (last: Mon Apr 1 20:30:02 2016) Repo-id : rhel Repo-name : rhel repo Repo-revision: 1 Repo-updated : Sun Mar 15 08:51:32 Repo-pkgs : 12 Repo-size : 8 GB Repo-baseurl : http://rhel/repo Repo-expire : 1200 second(s) (last: Mon Apr 1 20:30:02 2016) repolist: 16,276 grr-3.1.0.2/grr/config/grr-response-test/test_data/searching/000077500000000000000000000000001273104013200240135ustar00rootroot00000000000000grr-3.1.0.2/grr/config/grr-response-test/test_data/searching/auth.log000066400000000000000000000014021273104013200254540ustar00rootroot00000000000000Jan 26 19:35:30 myhost.log.mydomain.com sshd[1059]: Postponed keyboard-interactive/pam for dearjohn from 10.10.122.1 port 49567 ssh2 [preauth] Jan 26 19:35:30 myhost.log.mydomain.com sshd[1059]: Accepted keyboard-interactive/pam for dearjohn from 10.10.122.1 port 49567 ssh2 Jan 26 19:35:30 myhost.log.mydomain.com sshd[1059]: pam_unix(ssh:session): session opened for user dearjohn by (uid=0) AWS 26 20:01:38 myhost.log.mydomain.com sshd[1059]: pam_unix(ssh:session): session closed for user dearjohn Wrong line format.... should not be here. Dec 24 20:35:30 myhost.log.mydomain.com pam_unix is increasing it's presence in the near future Jan 03 08:35:14 myhost.log.mydomain.com sshd[1059]: pam_unix(ssh:session): session opened for another grateful user in the future grr-3.1.0.2/grr/config/grr-response-test/test_data/searching/dpkg.log000066400000000000000000000011501273104013200254400ustar00rootroot000000000000002012-01-02 03:31:36 startup packages configure 2012-01-02 03:32:08 startup packages configure 2012-01-02 03:32:17 update-alternatives: run with --set gl_conf /usr/lib/nvidia-current/ld.so.conf 2012-01-02 22:00:20 startup archives install 2012-01-02 22:00:20 upgrade libbde-dev 20111012-1 20111012-1 2012-01-02 22:00:20 status half-configured libbde-dev 20111012-1 2012-01-02 22:00:20 status unpacked libbde-dev 20111012-1 2012-01-02 22:00:20 status half-installed libbde-dev 20111012-1 2012-01-02 22:00:20 status triggers-pending man-db 2.5.7-2ubuntu1 2012-01-02 22:00:20 status half-installed libbde-dev 20111012-1 grr-3.1.0.2/grr/config/grr-response-test/test_data/searching/dpkg_false.log000066400000000000000000000011601273104013200266130ustar00rootroot000000000000002012-01-02 03:31:36 notavalidstatus packages configure 2012-01-02 03:32:08 startup packages configure 2012-01-02 03:32:17 update-alternatives: run with --set gl_conf /usr/lib/nvidia-current/ld.so.conf 2012-01-02 22:00:20 startup archives install 2012-01-02 22:00:20 upgrade libbde-dev 20111012-1 20111012-1 2012-01-02 22:00:20 status half-configured libbde-dev 20111012-1 2012-01-02 22:00:20 status unpacked libbde-dev 20111012-1 2012-01-02 22:00:20 status half-installed libbde-dev 20111012-1 2012-01-02 22:00:20 status triggers-pending man-db 2.5.7-2ubuntu1 2012-01-02 22:00:20 status half-installed libbde-dev 20111012-1 grr-3.1.0.2/grr/config/grr-response-test/test_data/syslog000066400000000000000000000015331273104013200233150ustar00rootroot00000000000000Jan 22 07:52:33 myhostname.myhost.com client[30840]: INFO No new content. Jan 22 07:52:33 myhostname.myhost.com client[30840]: INFO No change in [/etc/netgroup]. Done Jan 22 07:53:01 myhostname.myhost.com CRON[31051]: (root) CMD (touch /var/run/crond.somecheck) Jan 22 07:54:01 myhostname.myhost.com CRON[31068]: (root) CMD (touch /var/run/crond.somecheck) Jan 22 07:54:01 myhostname.myhost.com CRON[31067]: (root) CMD (/sbin/status.mycheck) Jan 22 07:54:32 myhostname.myhost.com Job `cron.daily' terminated MMM 22 07:54:32 myhostname.myhost.com anacron[29782]: Normal exit (1 job run) Dec 18 17:54:32 myhostname.myhost.com anacron[1234]: No true exit can exist (124 job run) Mar 23 23:01:18 myhostname.myhost.com somrandomexe[1915]: This syslog message is brought to you by me (and not the other guy) Mar 23 Wrong line that should not be able to get through grr-3.1.0.2/grr/config/grr-response-test/test_data/syslog_compress.gz000066400000000000000000000002141273104013200256420ustar00rootroot00000000000000‹1Ð_Osyslog_compressóJÌS02R00·25²26VÈ­ÌÈ/.ÉKÌMÕƒ0õ’ós’s2SóJ¢ ,L b­<ýÜüüòòRË’óóJ€rz\^”˜”œ‘˜—žª™§­ŸZ’¬Ÿ—Z’^”_Z«§à’Ÿ—ÊÌ fß§grr-3.1.0.2/grr/config/grr-response-test/test_data/syslog_false.gz000066400000000000000000000001371273104013200251050ustar00rootroot00000000000000‹VÈ_OsóõõU02R00·25±26RÈ­ÌÈ/.ÉKÌMÕƒ0õ’ósó“‹òó¢,Í-Œb­üò‹rsR+2K4 ²ò“ŠJó4¹k/?Ngrr-3.1.0.2/grr/config/grr-response-test/test_data/system_profiler.xml000066400000000000000000000215431273104013200260250ustar00rootroot00000000000000 _SPCommandLineArguments /usr/sbin/system_profiler -nospawn -xml SPHardwareDataType -detailLevel full _SPCompletionInterval 0.019903957843780518 _SPResponseTime 0.1744999885559082 _dataType SPHardwareDataType _detailLevel -2 _items SMC_version_system 2.3f36 _name hardware_overview boot_rom_version MBP101.00EE.B02 cpu_type Intel Core i7 current_processor_speed 2.3 GHz l2_cache_core 256 KB l3_cache 6 MB machine_model MacBookPro10,1 machine_name MacBook Pro number_processors 4 packages 1 physical_memory 16 GB platform_UUID 9F62B993-49C3-5D76-ABCE-766794EDB2CD serial_number C02JQ0F5F6L9 _parentDataType SPRootDataType _properties LOM_revision _order 85 Lightshow_version _order 83 _suppressLocalization YES MMM_state _order 70 SMC_version_other _order 82 SMC_version_riser _order 81 SMC_version_system _order 80 _suppressLocalization YES apple_rom_info _order 53 boot_rom_release_date _order 52 boot_rom_vendor _order 50 boot_rom_version _order 51 bus_speed _order 45 cores_per_package _order 24 cpu_interconnect_speed _order 46 cpu_type _order 15 current_processor_speed _order 17 l2_cache _order 26 l2_cache_core _order 26 l2_cache_share _order 26 l2_cache_size _order 26 l3_cache _order 27 l3_cache_processor _order 27 l3_cache_size _order 27 machine_model _order 11 machine_name _order 10 maximum_processor_speed _order 19 minimum_processor_speed _order 18 number_cpus _order 20 number_processors _order 22 packages _order 20 physical_memory _order 40 platform_UUID _detailLevel 0 _order 98 platform_cpu_features _order 30 platform_cpu_htt _order 28 platform_cpu_vendor _order 12 platform_manufacturer _order 4 platform_product_name _order 2 platform_version _order 6 riser_serial_number _detailLevel 0 _order 92 sales_order_number _detailLevel 0 _order 95 serial_number _detailLevel 0 _order 90 volumes _detailLevel 0 _timeStamp 2014-12-04T22:16:22Z _versionInfo com.apple.SystemProfiler.SPPlatformReporter 1441 grr-3.1.0.2/grr/config/grr-response-test/test_data/tcpip.sig000066400000000000000000000177541273104013200237110ustar00rootroot000000000000004d85c0745b*4d8b40100fb78380000000418d4e02458b48084d8b00488d9424800000006689442420e8*eb33*4d8b40100fb78380000000488d942480000000458b48084d8b00b9170000006689442420e8*eb08*f083431001488b742458488d442450488d15*120048894424484c89742440488d4424604889442438488d842480000000*2430488944242841b9110000004c8bc6498bcd4c89742420e8*008bf83d0301000074*4883ec58488b412048895424384889442420488b4128488d4c2420ff90c000000084c00f84*488b4424384883c458c3*0fb7c183f8020f85*4183f80d0f84*33c0c3*488bcbe8*000085c00f85d1000000*8b430c48ff4310ff448318*488b5c2430488b6c2438488b742440488b7c24484883c420415cc3*4c8bc78bd5488bcbe8*000085c00f85a8000000*394308762f*8d4eff4c8be70fafcd4c2be1*8b4308488b0bffc80fafc5482bc8493bcc7310*8bd6488bcbe8*0000837b080077dd*488bcbe8*000085c00f8562ffffff*8bd6488bcbe8*0700*85c00f8550ffffff*488b0b483bcf0f8344ffffff*ff430cff4308488d04294889038b430c3bc60f83*8b430cc744831800000000ebbd*ff430848893bc7430c0000000048c7431001000000c7431801000000e928ffffff*8bd6488bcbe8*0700*85c00f85*ff430c8b430cff430848893b3bc60f82f7feffff*2bc689430ce9*488d15*0041b90100000041b8170000c033c9e8*ff9090488bd84885c00f84*488d15*00488bc8e8*ff488bc3e9*b802000000e9*24980000000f8d*488b842480000000e9*3bc10f8d*488b842480000000e9*443b*0f85*488b842480000000e9*80fa450f85*488b842480000000e9*488b542420488b4c2470458b*ff488b542428488b4c2470488b12458b*8bd8e8*ff3bd80f86*488b842480000000e9*488b842480000000e9*28030000e9*b8010000c0e9*33d2488b*ff15*ba01000000*83fd*33c0e9*33d2488bcbe8*ff33c0e9*33c0e9*33d2488bcfe8*ff33c0e9*488bd3498bc9e8*ff4885c00f84*488bf0*488d15*00488bcee8*ff90e9*488b0748837840007522*488d15*0041b90100000041b8250200c033c9e8*ff488bd8e9*faff*f083401801e9*faff*488d15*00488bcde8*ff90e9*fbff*488d4c2438ff15*00488b4c243833d24c8bd848c1e8204869c040420f0048f7f14c8bc048c1e220418bc349c1e0204869c040420f004803c233d248f7f14903c0e9*c6431000e9*488b0d*00488d05*00483bc87424*80792903721e*f6412c807418*488b49184c8d05*00ba100000004c8bcfe8*32c0e9*c1ea03e9*c1e803e9*f6412c800f84*488b49184c8d05*00ba110000004c8bcfe8*0090e9*488d8c249001000033d241b8b0010000e8*ff4533db0fba6318094c899c24600100004c899c24680100004c899c24700100004c899c24780100004c899c24800100007211*488bcbe8*fdff4885c00f85*488bcbe8*00488b9320010000c744243022000000488b4a10448bd8488d84245001000048898c24580100000fb74a0a488b9328010000898c2450010000488d4a58488944243848898c24480100008b4a30488d842440010000c7442440230000004889442448c744245000000000898c24400100004885ed740e*488b4510488b0848894c2458eb09*48c744245800000000*c7442460070000004885ed740b*486345184889442468eb09*48c744246800000000*0fb74322c744247003000000c784248000000002000000488944247848634310c78424900000000f00000048898424880000004885ed7412*488b45084883c0104889842498000000eb0c*48c784249800000000000000*33d2c78424a0000000200000004c899c24a8000000448d42084c8d0d*486344143083f8230f87c6010000*418b8c81*4903c9ffe1*4883c2104983e8010f851efeffff*488d8424b0000000488d942490010000488bcb6689*2430010000c7842434010000080000004889842438010000e8*004c8d9c24600100004c8d8424900100004c895c2428488d9424300100004533c90fb7*48c744242000000000e8*ff90e9*4889bc241003000033ff488d842480000000488d8c248000000033d241b8900000004c89bc24d00200004889442470897c2454448d7f01897c245066897c2468c744246c09000000e8*ff4885db7405*448b1beb03*448bdf*488b4510418b5c2408c784249000000003000000410fcb41b8b001000044899c2498000000488b088b01498b4c2428c7842480000000030000000fc84489bc24a0000000c78424b000000004000000898424880000000fb64518c78424c000000003000000888424a8000000488b4508899c24c80000004883c010c78424d00000000300000048898424b80000008b842430030000898424d80000008b410cc78424f000000003000000898424f80000008b4110488d8c2410010000898424080100008bc7c78424000100000300000038842438030000c78424e000000003000000410f45c733d2898424e8000000e8*ff8b84244003000089842438010000418b46144c8d8c2410010000898424e80100008b8424580300004c8d4424688944245c488d442454418bd74889442448488d44246033c94889442440488d442450899c24580100004889442438488d442458897c243048894424284489ac245c010000c7842410010000040300004889742420897c245848897c2460e8*3d01100000753b*44847c24507407*bf02000000eb2d*488b5424604c8d842410010000418bcf48895424288b5424544c8bce89542420488d542468418bffe8*4c8bbc24d00200008bc7488bbc2410030000e9*faff*498bcce8*fdff488bf04885c00f85cf030000*0fb6942408040000498bcce8*00488b4d104c63942418040000488b11488b8c24e0030000448bd80fb78424e803000048894c2458410fb7cd488944247848894c2468488b4d08488d41104889542448c74424400000000048898424880000008b4108488b4928488984249800000033c04183fa010f95c0c744245001000000c74424600300000083c00d33d2c744247004000000898424a00000008b842400040000c78424800000000f00000048898424a80000008b410cc78424900000001200000048898424d80000008b4110c78424b0000000210000004c899424b8000000c78424c0000000200000004c899c24c800000048898424e8000000c78424d000000010000000c78424e000000011000000448d420b4c8d0d*486344144083f8230f87c9010000*418b8c81*004903c9ffe1*4883c2104983e8010f851bfeffff*448b8c24f8030000448b8424f0030000488d8424f00000004889442438488d8424d0010000418bd24889442428498bcc66895c24304c897c2420c74424340b000000e8*004c8d9c24a00100004c8d8424d0010000488d5424304c895c24284d8bce0fb7cb48c744242000000000e8*ff85c0780d*81bc24a001000001100000753b*f68424bc010000017407*b803010000eb2a*488d8424a00100004c8d8424d0010000488d5424304533c90fb7cb4889442420e8*00b8220000c0*4885f60f84*8bc6e9*488bc8488b05*00498bd048c1e109488d4c0140ff15*008b9b*020000488b15*004869db6801000048031d*00b101e9*fcff*ba01000000e9*fcff*32c0e9*32c0e9*894c2420488b48184c8d05*00ba0a0000004c8bcde8*0090e9*f6412c800f84*488b49184c8d05*00ba0b0000004c8bcde8*0090e9*41bbffff0000e9*488b49184c8d05*00ba0c0000004c8bcde8*0090e9*428d049500000000e9*488bc2e9*0fb605*003c047308*84c00f85*fdff*48ba8400000008080080488515*000f84*fdff*488b05*004823c2483b05*000f85*8b4d7048899c24b80000004889b424c8000000c1e9044889bc24980000004c89ac249000000083e1014c89b4248800000041bd170000000f95c283f9017505*418bddeb08*488b45180fb75814*85c9410f95c683f9017409*488b4518440fb76814*4c8b4520488b4d1833c0894424688944246c0fb7456e48896c2460458b48084d8b40106689442420e8*000fb7cb488bf0e8*ff4c8b4520440fb74d6c488b4d184d8b00410fb6d60fb6f8e8*00410fb7cd488bd8e8*ff488b0d*0048896c245044897c244844897c244044897c243848897424304c8d442460488d15*440fb6c8897c242848895c2420e8*004c8bb424880000004c8bac2490000000488bbc2498000000488bb424c8000000488b9c24b8000000e9*fdff*4d85ed750c*4c8dab70ffffffe9*448bc041c1e81c4183f8017f09*448b8b78ffffffeb21*4183f80e7c0c*488b8b70ffffff448b09eb0f*468b8c83*0200004181e1ffffff0f*4183f8017f06*418b4d08eb1c*4183f80e7c08*498b4d008b09eb0e*438b8c85*02000081e1ffffff0f*443bc90f84*498bcce8*ff4533e4e9*8b8b78ffffffe9*488b8b70ffffff8b09e9*418b9424*0100003993*0000000f83*498bcce8*ff90e9*f6412c800f84*0fb64310488b4918ba140000004803c04c8bcd450fb604c7400fb6c744894424284c8d05*0089442420e8*0090e9*488bcde8*008bc88b03480fafc848c1f914e8*000fb615*003ac2448bd20fb6c8440f42d141fec9*410fb6c14803c0453a14c70f86*41fec9ebea*f6402c800f84*44896c2428894c2420488b48184c8d05*00ba150000004c8bcde8*0090e9*488d8c2490000000e8*004885c00f8514010000*488b05*00488d15*00483bc20f84d4000000*807829030f82ca000000*f6402c800f84c0000000*4c8b45208b4570488b4d18458b48084d8b4010c1e80483e0010f95c285c00fb7456e6689442420400f95c6e8*0fb7084889442430e8*ff4c8b4520440fb74d6c4d8b00488b4d18440fb6d86644895c2438400fb6d60f28442430660f7f442440e8*0048894424300fb708e8*ff488b0d*004c8d05*00488b4918440fb6d8488d4424406644895c24384889442428488d4424300f28442430660f7f442430ba160000004c8bcd4889442420e8*488b85*020000483b5838750e*488bcde8*0090e9*488bcde8*0090e9*488b0d*00440fb6b42490000000488d15*00488bf8483bca7446*807929057240*f6412c80743a*488b4918410fb6c6ba170000004803c0450fb60cc70fb6431044894c24284803c04c8bcd450fb604c744894424204c8d05*00e8*488bcbe8*48897b204488731044896b1844896314408873118937e9*4c39ab580100000f84*fdff*488d8c246002000033d241b8b0010000e8*ff4533db488d8c24f0010000458d436833d24c899c24700100004c899c24780100004c899c24800100004c899c2488010000e8*ff4533db0fba6318094c899c24c00100004c899c24c80100004c899c24d00100004c899c24d80100004c899c24e00100007214*488bcbe8*ff4c8be84885c00f85*040000*488bcb48899c24780100004889ac24800100004489a42488010000e8*00488b9320010000488b4a10448bd8488d8424b001000048898c24b80100000fb74a0a488b9328010000898c24b0010000488d4a58488944243848898c24a80100008b4a30488d8424a0010000c744243022000000c7442440230000004889442448898c24a0010000c74424500000000048 grr-3.1.0.2/grr/config/grr-response-test/test_data/test.plist000066400000000000000000000002511273104013200241020ustar00rootroot00000000000000bplist00ÓTdateWnested1Wnumbers3ÑXnested11Ó Vkey111Wdata113Vkey112Xvalue111DÞ­¾ïXvalue112£Q2Q3$-09@GOV_dmqsuwgrr-3.1.0.2/grr/config/grr-response-test/test_data/test_img.dd000066400000000000000000567000001273104013200242040ustar00rootroot00000000000000à.U<Ñ €ñ‰WNÂ#GQSï´lèONí €8/*pb²Lެ]ŠDŸµµ³ÞŽü"HÚŸ•ÕHy»ìØKM<U   |   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØKMØKMØKMíA²#GQ­#GQ­#GQ€0ÚlèOØKMÚlèO%ÀA0ØKMØKMØKM !"#$íAß±NÉÙKMÉÙKM&£ì2íAÚKMÚKMÚKM'£ì2íAüÙKMúÙKMúÙKM(£ì2¤5á±NÉÙKMÉÙKM)*+,£ì2¤5úÙKMúÙKMúÙKM-./0£ì2¤5ÚKMÚKMÚKM1234£ì2íA]ÓP~ÃRN~ÃRN5³QL‚íA^ÓPkèOkèO6´QL‚íAcÓPl²Nl²N7µQL‚íAdÓPx²Nx²N8¶QL‚íAì ÓPá ÓPá ÓP9·QL‚íAÄ¡ÓP²N²N:¸QL‚íAÅ¡ÓP›²N›²N;¹QL‚íAÅ¡ÓPö²Nö²N<ºQL‚€H!>µ²N»²Nµ²Nˆ=>»QL‚íAÆ¡ÓPŲNŲN?¼QL‚íAììàNÓ²NÓ²N@½QL‚€H!5 ϲNÓ²NϲNˆABCD¾QL‚  ¡~ÃRN~ÃRN~ÃRNØFGHIJKLMNOPQRS¥}Ù¤)ö²Nö²Nö²NEÀQL‚¤8ΡÓPíàNÖìàNž23456789:;<=>·¾ãíAkèOkèOkèOÆn0íA0kèO/kèO/kèO‚Çn0íAêlèOðlèOðlèOƒÈn0  ðlèOðlèOðlèORP     Ϲ>°€ 6¡ÓP)¡ÓPæžÓPæçèéêëìíîïðñòÝ´})€°6¡ÓP+¡ÓPàžÓPZïðñòóôõö÷øùúûÞ´})€²ì ÓP@¡ÓP|žÓP\ !"#$%&'(ß´})€Kì ÓP@¡ÓP|žÓP(JKLMNOPQRSTUVà´})€Ž%ì ÓP@¡ÓP}žÓP–^_`abcdefghijá´})€Ì_ì ÓP@¡ÓP}žÓP2©ª«¬­®¯°±²³´µâ´})¤¶#GQ¶#GQ¶#GQ¹±_º€FOgŸÓP%¡ÓPžÓP%¡ÓP* ¡´})€9ÇüžÓP%¡ÓPÆžÓP%¡ÓPf)*+,-./012345¢´})€tá ¡ÓP%¡ÓPÍžÓP%¡ÓPt\]^_`abcdefgh£´})€€XgŸÓP%¡ÓP}žÓP%¡ÓP0–—˜™š›œžŸ ¡¢¤´})€}cøžÓP%¡ÓPƒžÓP%¡ÓP4®¯°±²³´µ¶·¸¹º¥´})€@ŸgŸÓP%¡ÓPËžÓP%¡ÓPÒÈÉÊËÌÍÎÏÐÑÒÓÔ¦´})€4 ŸÓP%¡ÓPÊžÓP%¡ÓPб²³´µ¶·¸¹º»¼½§´})€³SøžÓP%¡ÓP¶žÓP%¡ÓP,ö÷øùúûüýþÿ¨´})€4—øžÓP%¡ÓPÌžÓP%¡ÓPN  ©´})€X½ŸÓP%¡ÓPÌžÓP%¡ÓPb³´µ¶·¸¹º»¼½¾¿ª´})€­[þžÓP%¡ÓP˜žÓP%¡ÓP0äåæçèéêëìíîïð«´})€øžÓP%¡ÓPžÓP%¡ÓPüýþÿ­´})€DŸÓP%¡ÓP¸žÓP%¡ÓP®´})€ŸÓP%¡ÓPàžÓP%¡ÓP¯´})€gŸÓP%¡ÓP}žÓP%¡ÓP°´})€gŸÓP%¡ÓP…žÓP%¡ÓP±´})€øžÓP%¡ÓPÉžÓP%¡ÓP²´})€øžÓP%¡ÓPÍžÓP%¡ÓP³´})€øžÓP%¡ÓPƒžÓP%¡ÓP´´})€øžÓP%¡ÓP”žÓP%¡ÓPµ´})€øžÓP%¡ÓPÇžÓP%¡ÓP¶´})€gŸÓP%¡ÓP—žÓP%¡ÓP·´})€ŸÓP%¡ÓPËžÓP%¡ÓP¸´})€DŸÓP%¡ÓPÊžÓP%¡ÓP¹´})€;ŸÓP%¡ÓP»žÓP%¡ÓPº´})€ÿžÓP%¡ÓPËžÓP%¡ÓP»´})€ŸÓP%¡ÓPšžÓP%¡ÓP¼´})€ÿžÓP%¡ÓPƒžÓP%¡ÓP½´})€øžÓP%¡ÓP¶žÓP%¡ÓP¾´})€ ŸÓP%¡ÓPºžÓP%¡ÓP¿´})€gŸÓP%¡ÓPËžÓP%¡ÓPÀ´})€gŸÓP%¡ÓP}žÓP%¡ÓPÁ´})€úžÓP%¡ÓPÌžÓP%¡ÓP´})€pgŸÓP%¡ÓPàžÓP%¡ÓPô})€øžÓP%¡ÓP}žÓP%¡ÓPÄ´})€úžÓP%¡ÓPÆžÓP%¡ÓPÅ´})€ŸÓP%¡ÓPΞÓP%¡ÓPÆ´})€ ŸÓP%¡ÓP}žÓP%¡ÓPÇ´})€ ŸÓP%¡ÓPÊžÓP%¡ÓPÈ´})€0ŸÓP%¡ÓPÉžÓP%¡ÓPÉ´})€gŸÓP%¡ÓP…žÓP%¡ÓPÊ´})€ŸÓP%¡ÓPËžÓP%¡ÓPË´})€EŸÓP%¡ÓPæžÓP%¡ÓPÌ´})€&ŸÓP%¡ÓP|žÓP%¡ÓPÍ´})€øžÓP%¡ÓP”žÓP%¡ÓPδ})€gŸÓP%¡ÓPËžÓP%¡ÓPÏ´})€øžÓP%¡ÓPÇžÓP%¡ÓPд})€;ŸÓP%¡ÓP–žÓP%¡ÓPÑ´})€0ŸÓP%¡ÓP‹žÓP%¡ÓPÒ´})€gŸÓP%¡ÓP„žÓP%¡ÓPÓ´})€øžÓP%¡ÓP|žÓP%¡ÓPÔ´})€AŸÓP%¡ÓPÉžÓP%¡ÓPÕ´})€AŸÓP%¡ÓPƒžÓP%¡ÓPÖ´})€AŸÓP%¡ÓPÅžÓP%¡ÓP×´})€AŸÓP%¡ÓPàžÓP%¡ÓPØ´})€ì ÓPì ÓPì ÓPì ÓPÜ´}) . ..  lost+found Test Directory $×יןד ןד ש ×קד×0%入乡éšä¿— 海外春节别样过法 home‚\ glob_test .ô.. . ..è numbers.txt . ..è ×יןד.txt . ..è入乡éšä¿—.txt1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000  . .. testÜ image2.img . ..!.mozillaØ.config . ..è google-chrome . ..èDefault . .. Extensions HistoryÄCache . ..è nlbjncdgjeocebhnmkbbbdekmmmcbfjd . ..è2.1.3_0 . .. manifest.json(_locales.#testfile.txt¨ testfile.txt{ "background_page": "background.html", "content_scripts": [ { "js": [ "sniff_common.js", "doc_start.js" ], "matches": [ "http://*/*", "https://*/*" ], "run_at": "document_start" }, { "js": [ "sniff_common.js", "feed_finder.js" ], "matches": [ "http://*/*", "https://*/*" ] } ], "default_locale": "en", "description": "__MSG_rss_subscription_description__", "icons": { "128": "feed-icon-128x128.png" }, "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD9WxY2FweiM38uzRRx3RRgb7fboUR77ehEKcTwJ/ZdZ21mcasL1xGmNMB73mMDfqHVrm1P1dXM8W8smXdvgd89djAeUSspnglJlV59zJYkzVHQzDgX7wOyzzy4oH5JmyHfXas2DD2/Hnu1QQvCkUQDHdHmIUuByG/RZ1x36EQ07QIDAQAB", "name": "__MSG_rss_subscription_name__", "options_page": "options.html", "page_action": { "default_icon": "feed-icon-16x16.png", "default_title": "__MSG_rss_subscription_default_title__", "popup": "popup.html" }, "permissions": [ "tabs", "http://*/*", "https://*/*" ], "update_url": "http://clients2.google.com/service/update2/crx", "version": "2.1.3" }  . ..èen . ..è messages.json{ "rss_subscription_action_title": { "message": "Click to subscribe..." }, "rss_subscription_add_reader": { "message": "Add..." }, "rss_subscription_always_use": { "message": "Always use this reader to subscribe to feeds." }, "rss_subscription_always_use_default": { "message": "Always use my default reader when subscribing to feeds." }, "rss_subscription_close_button": { "message": "Close" }, "rss_subscription_default": { "message": "(default)" }, "rss_subscription_default_title": { "message": "Subscribe to this feed" }, "rss_subscription_description": { "message": "Adds one-click subscription to your toolbar." }, "rss_subscription_edit_dialog_title": { "message": "Edit feed reader" }, "rss_subscription_edit_reader": { "message": "Edit..." }, "rss_subscription_error_fetching": { "message": "Error fetching feed." }, "rss_subscription_feed_description": { "message": "Description:" }, "rss_subscription_feed_for": { "message": "Feed for $1", "placeholders": { "1": { "content": "$1" } } }, "rss_subscription_feed_link": { "message": "Feed" }, "rss_subscription_feed_preview": { "message": "Feed preview" }, "rss_subscription_feed_preview_count": { "message": "Number of feeds to show on the preview page:" }, "rss_subscription_feed_url": { "message": "URL:" }, "rss_subscription_feed_url_assist": { "message": "Insert %s in the URL where the feed url should appear." }, "rss_subscription_make_default_reader": { "message": "Make default" }, "rss_subscription_manage_label": { "message": "Manage..." }, "rss_subscription_name": { "message": "RSS Subscription Extension (by Google)" }, "rss_subscription_no_entries": { "message": "This feed contains no entries." }, "rss_subscription_no_localstorage": { "message": "LocalStorage must be enabled for changing options." }, "rss_subscription_not_valid_feed": { "message": "Not a valid feed." }, "rss_subscription_one_entry_required": { "message": "There must be at least one entry in this list" }, "rss_subscription_options": { "message": "RSS Subscription options" }, "rss_subscription_remove_confirm": { "message": "Are you sure you want to remove '$1'?", "placeholders": { "1": { "content": "$1" } } }, "rss_subscription_remove_confirmation": { "message": "Are you sure you want to remove $1", "placeholders": { "1": { "content": "$1" } } }, "rss_subscription_remove_reader": { "message": "Remove..." }, "rss_subscription_reset_list": { "message": "Reset list..." }, "rss_subscription_reset_list_confirm": { "message": "Are you sure you want to undo any changes you have made to this list?" }, "rss_subscription_save_button": { "message": "Save" }, "rss_subscription_subscribe_button": { "message": "Subscribe Now" }, "rss_subscription_subscribe_using": { "message": "Subscribe to this feed using:" }, "rss_subscription_unknown_feed_name": { "message": "Unknown feed name" } } This should be downloaded automatically. @èÊ3 @“—:N¤—:N'Sï.:NNí €8Oa0çE¾J˜ˆÕ—ÂëZµMÈE‚±Pæ­]ïr¯.:NÊ3ÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.:N.:N.:NíAH! —:NŸ—:NŸ—:Nˆ€0.:N.:N.:NÀA0.:N.:N.:N H!F:NŸ—:NH:Nˆ–ÚæKèAH!›—:NŸ—:NŸ—:NˆètÇSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQR . .. $ lost+founda.txt Ähometxt .ô..yay . .. èa.txtTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./01SQLite format 3@ ö.ûö$ " ¤òÔ¤.A/early_expiration_threshold12945429317090490;last_compatible_version16 version20 ¹¹ØôAearly_expiration_threshold;last_compatible_version versionûöñìçâÝØÓÎÉÄ¿ºµ°«¦¡œ—’60.-,*)(&%$"!      z³™@éœÛz_ y5http://www.java.com/inc/BrowserRedirect1.jsp?locale=enBrowserRedirect1.jsp.Í2ß5 5%http://www.java.com/www.java.com.Í2ß 9Chttp://www.google.com/search?ie=UTF-8&oe=UTF-8&sourceid=navclient&gfns=1&q=java+pluginjava plugin - Google Search.Ìæ“ÀK a%https://www.mozilla.com/en-US/plugincheck/Plugin Check.ËJ—U y!http://dfptools.doubleclick.net/web-console/applet.jspapplet.jsp.Éë£@W e9http://dfptools.doubleclick.net/web-console/Administration Console.É%Fk Ghttp://www.symantec.com/de/de/business/products/index.jspSymantec Data Loss Prevention-þé-0ýÀ* ‚=http://www.symantec.com/de/de/business/solutions/solutiondetail.jsp?solid=sol_info_risk_comp&solfid=sol_data_loss_preventionRedirect index.html Page-þé-0ýÀK W/http://start.ubuntu.com/10.04/Google/Ubuntu Start Page-þé-0ýÀ T€©AÂ*T4 K http://www.google.ch/blank.html.ƒŸ¤_0 7http://www.google.ch/Google.ƒŸ¢H¨1 9http://www.google.com/Google.ƒŸ¢H¨P ƒ http://fls.doubleclick.net/activityi;src=2542116;type=clien612;cat=chromn1;ord=1;num=3835704319644.719;~oref=http%3A%2F%2Ftools.google.com%2Fchrome%2Fintl%2Fen%2Fwelcome.html?&_dc_ck=try.ƒŸ.#•} [ http://fls.doubleclick.net/activityi;src=2542116;type=clien612;cat=chromn1;ord=1;num=3835704319644.719?.ƒŸ.#•f sIhttp://tools.google.com/chrome/intl/en/welcome.htmlGet started with Google Chrome.ƒŸ$KžY k7http://code.google.com/p/chrome-screen-capture/chrome-screen-capture.ùB ©@z !Ahttps://chrome.google.com/webstore/detail/cpngackimfmofbokmjmljamhdncknpmgScreen Capture (by Google).ùA»Ç€~ #Ghttps://chrome.google.com/webstore/detail/ackpfhlmgjdjlohhjmbacaajbmkkklnp#Tab Expose - Chrome Web Store.¿ô¦€ Œ§É Œ khttp://en.softsia.com/soft-cats-download-1.htmlBest Soft Cats Downloads: SoftCats Free - CatsSoft Reviews.ƒ¤Ž×9 ‚Ehttp://www.google.ch/search?hl=de&q=funnycats.exe&oq=funnycats.exe&aq=f&aqi=&aql=&gs_sm=e&gs_upl=1945l7105l0l25l23l5l5l2l0l156l1190l7.6funnycats.exe - Google-Suche.ƒ¡&«²[ ‚I[http://www.google.ch/search?hl=de&q=really+really+funny+cats&oq=really+really+funny+cats&aq=f&aqi=&aql=&gs_sm=e&gs_upl=4112l7623l0l24l21l0l14l14l0l146l639l5.2really really funny cats - Google-Suche.ƒ ±€‘p ?http://www.google.ch/search?sourceid=chrome&ie=UTF-8&q=funny+catsfunny cats - Google-Suche.ƒ 4/ãd ƒ1http://www.google.ch/#hl=de&source=hp&biw=1257&bih=1414&q=grr&oq=grr&aq=f&aqi=g1g-s1g2g-s6&aql=&gs_sm=e&gs_upl=1084l1497l0l3l3l0l0l0l0l185l461l1.2&bav=on.2,or.r_gc.r_pw.&fp=e9e21f84998f5a4grr - Google-Suche.ƒŸÕHi FF‡7 ŽO http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=15&slotname=2362198502&w=468&lmt=1306132510&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&dt=1306139710333&bpp=3&shv=r20110512&jsv=r20110506&prev_slotnames=6851072109%2C4758889056%2C8331150399&correlator=1306139710364&frm=0&adk=3316004872&ga_vid=331534367.1306139711&ga_sid=1306139711&ga_hid=15156107&ga_fc=0&u_tz=120&u_his=1&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1451&ref=http%3A%2F%2Fwww.google.ch%2Fsearch%3Fhl%3Dde%26q%3Dfunnycats.exe%26oq%3Dfunnycats.exe%26aq%3Df%26aqi%3D%26aql%3D%26gs_sm%3De%26gs_upl%3D1945l7105l0l25l23l5l5l2l0l156l1190l7.6&fu=0&ifi=4&dtd=427&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame4&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¤”mŽ zz‡ g http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=90&slotname=6851072109&w=728&lmt=1306132510&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&dt=1306139710279&bpp=10&shv=r20110512&jsv=r20110506&correlator=1306139710364&frm=0&adk=491424018&ga_vid=331534367.1306139711&ga_sid=1306139711&ga_hid=15156107&ga_fc=0&u_tz=120&u_his=1&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1451&ref=http%3A%2F%2Fwww.google.ch%2Fsearch%3Fhl%3Dde%26q%3Dfunnycats.exe%26oq%3Dfunnycats.exe%26aq%3Df%26aqi%3D%26aql%3D%26gs_sm%3De%26gs_upl%3D1945l7105l0l25l23l5l5l2l0l156l1190l7.6&fu=0&ifi=1&dtd=372&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame1&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¤’+° SS‡* Ž5 http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=90&slotname=8331150399&w=200&lmt=1306132510&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&dt=1306139710321&bpp=8&shv=r20110512&jsv=r20110506&prev_slotnames=6851072109%2C4758889056&correlator=1306139710364&frm=0&adk=2524821587&ga_vid=331534367.1306139711&ga_sid=1306139711&ga_hid=15156107&ga_fc=0&u_tz=120&u_his=1&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1451&ref=http%3A%2F%2Fwww.google.ch%2Fsearch%3Fhl%3Dde%26q%3Dfunnycats.exe%26oq%3Dfunnycats.exe%26aq%3Df%26aqi%3D%26aql%3D%26gs_sm%3De%26gs_upl%3D1945l7105l0l25l23l5l5l2l0l156l1190l7.6&fu=0&ifi=3&dtd=384&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame3&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¤öù __‡ Ž http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=280&slotname=4758889056&w=336&lmt=1306132510&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&dt=1306139710317&bpp=4&shv=r20110512&jsv=r20110506&prev_slotnames=6851072109&correlator=1306139710364&frm=0&adk=2755568142&ga_vid=331534367.1306139711&ga_sid=1306139711&ga_hid=15156107&ga_fc=0&u_tz=120&u_his=1&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1451&ref=http%3A%2F%2Fwww.google.ch%2Fsearch%3Fhl%3Dde%26q%3Dfunnycats.exe%26oq%3Dfunnycats.exe%26aq%3Df%26aqi%3D%26aql%3D%26gs_sm%3De%26gs_upl%3D1945l7105l0l25l23l5l5l2l0l156l1190l7.6&fu=0&ifi=2&dtd=363&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame2&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¤’ 77‡F Žm http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=600&slotname=9004213189&w=160&lmt=1306132511&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&dt=1306139710337&bpp=5&shv=r20110512&jsv=r20110506&prev_slotnames=6851072109%2C4758889056%2C8331150399%2C2362198502&correlator=1306139710364&frm=0&adk=2218770476&ga_vid=331534367.1306139711&ga_sid=1306139711&ga_hid=15156107&ga_fc=0&u_tz=120&u_his=1&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1451&ref=http%3A%2F%2Fwww.google.ch%2Fsearch%3Fhl%3Dde%26q%3Dfunnycats.exe%26oq%3Dfunnycats.exe%26aq%3Df%26aqi%3D%26aql%3D%26gs_sm%3De%26gs_upl%3D1945l7105l0l25l23l5l5l2l0l156l1190l7.6&fu=0&ifi=5&dtd=1446&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame5&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¤•è ?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€ I†3 ŒG http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=15&slotname=5520569487&w=468&lmt=1306132523&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FFun-Cats-Screensaver-download-sk6t.htm&dt=1306139723081&bpp=8&shv=r20110512&jsv=r20110506&prev_slotnames=6717989103&correlator=1306139723052&frm=0&adk=2899817075&ga_vid=1106494855.1306139723&ga_sid=1306139723&ga_hid=310523222&ga_fc=0&u_tz=120&u_his=2&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1451&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=2&dtd=57&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame2&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¤xZ.4 Ohttp://en.softsia.com/Fun-Cats-Screensaver-download-sk6t.htmFun Cats Screensaver 1.0 Free download - Fun cats screensaver will show you how fun a cat can be..ƒ¤t¸¤ xäxj [ihttp://en.softsia.com/download-sk6t.htmDownload Fun Cats Screensaver. funcats_scr.exe.ƒ¢âTɆ Œ http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=90&slotname=6717989103&w=728&lmt=1306132523&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FFun-Cats-Screensaver-download-sk6t.htm&dt=1306139723045&bpp=4&shv=r20110512&jsv=r20110506&correlator=1306139723052&frm=0&adk=3975326057&ga_vid=1106494855.1306139723&ga_sid=1306139723&ga_hid=310523222&ga_fc=0&u_tz=120&u_his=2&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1451&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=1&dtd=26&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame1&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¤xåh ëë†! Œ http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=90&slotname=3808192216&w=728&lmt=1306132525&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fdownload-sk6t.htm&dt=1306139725464&bpp=11&shv=r20110512&jsv=r20110506&correlator=1306139725485&frm=0&adk=4138530256&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=134103612&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1451&ref=http%3A%2F%2Fen.softsia.com%2FFun-Cats-Screensaver-download-sk6t.htm&fu=0&ifi=1&dtd=33&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame1&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¢ê(V Åņ8" ŒQ http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=280&slotname=6190345064&w=336&lmt=1306132525&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fdownload-sk6t.htm&dt=1306139725531&bpp=4&shv=r20110512&jsv=r20110506&prev_slotnames=3808192216%2C6190345064&correlator=1306139725485&frm=0&adk=124017538&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=134103612&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1451&ref=http%3A%2F%2Fen.softsia.com%2FFun-Cats-Screensaver-download-sk6t.htm&fu=0&ifi=3&dtd=18&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame3&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¢ëÝé QÒQ$ _ http://en.softsia.com/get.php?url=http%3A%2F%2Ffatloss4idiotsx.com%2Fdownload%2Ffuncats%2Ffuncats_scr.exe.ƒ¢ýOm†+# Œ7 http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=280&slotname=6190345064&w=336&lmt=1306132525&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fdownload-sk6t.htm&dt=1306139725505&bpp=4&shv=r20110512&jsv=r20110506&prev_slotnames=3808192216&correlator=1306139725485&frm=0&adk=124017538&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=134103612&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1451&ref=http%3A%2F%2Fen.softsia.com%2FFun-Cats-Screensaver-download-sk6t.htm&fu=0&ifi=2&dtd=17&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame2&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¢ìâ ¼¼†A% Œc http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=600&slotname=0203846796&w=160&lmt=1306132552&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FFun-Cats-Screensaver-download-sk6t.htm&dt=1306139752065&bpp=4&shv=r20110512&jsv=r20110506&prev_slotnames=6717989103%2C5520569487&correlator=1306139751836&frm=0&adk=668835015&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1083788595&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1404&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=3&dtd=18&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame3&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¤|21 ¯¯†N& Œ} http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=600&slotname=0203846796&w=160&lmt=1306132552&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FFun-Cats-Screensaver-download-sk6t.htm&dt=1306139752089&bpp=5&shv=r20110512&jsv=r20110506&prev_slotnames=6717989103%2C5520569487%2C0203846796&correlator=1306139751836&frm=0&adk=668835015&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1083788595&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1404&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=4&dtd=40&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame4&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¤~á #\#†6( ŒM http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=15&slotname=5520569487&w=468&lmt=1306132557&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FCats-Photo-Screensaver-download-fvty.htm&dt=1306139757904&bpp=5&shv=r20110512&jsv=r20110506&prev_slotnames=6717989103&correlator=1306139757813&frm=0&adk=2899817075&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1439309887&ga_fc=1&u_tz=120&u_his=2&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1404&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=2&dtd=21&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame2&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¤Öÿ&!' %http://en.softsia.com/Cats-Photo-Screensaver-download-fvty.htmCats Photo Screensaver 1.0 Free download - Enjoy the variety of cat species..ƒ¤Ð#Ç áá†) Œ http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=90&slotname=6717989103&w=728&lmt=1306132557&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FCats-Photo-Screensaver-download-fvty.htm&dt=1306139757796&bpp=5&shv=r20110512&jsv=r20110506&correlator=1306139757813&frm=0&adk=3975326057&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1439309887&ga_fc=1&u_tz=120&u_his=2&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1404&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=1&dtd=53&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame1&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¤×Õ ºº†C* Œg http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=600&slotname=0203846796&w=160&lmt=1306132558&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FCats-Photo-Screensaver-download-fvty.htm&dt=1306139758054&bpp=6&shv=r20110512&jsv=r20110506&prev_slotnames=6717989103%2C5520569487&correlator=1306139757813&frm=0&adk=668835015&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1439309887&ga_fc=1&u_tz=120&u_his=2&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1404&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=3&dtd=92&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame3&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¤ØÑf ?­?l, [mhttp://en.softsia.com/download-fvty.htmDownload Cats Photo Screensaver. Cats%20Demo.exe.ƒ¥€N†P+  http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=600&slotname=0203846796&w=160&lmt=1306132558&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FCats-Photo-Screensaver-download-fvty.htm&dt=1306139758150&bpp=5&shv=r20110512&jsv=r20110506&prev_slotnames=6717989103%2C5520569487%2C0203846796&correlator=1306139757813&frm=0&adk=668835015&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1439309887&ga_fc=1&u_tz=120&u_his=2&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1404&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=4&dtd=17&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame4&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¤ÙŸ µµ†H- Œq http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=280&slotname=6190345064&w=336&lmt=1306132561&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fdownload-fvty.htm&dt=1306139761304&bpp=5&shv=r20110512&jsv=r20110506&prev_slotnames=3808192216%2C6190345064&correlator=1306139761239&frm=0&adk=124017538&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1586020085&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1404&eid=36813005&ref=http%3A%2F%2Fen.softsia.com%2FCats-Photo-Screensaver-download-fvty.htm&fu=0&ifi=3&dtd=19&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame3&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¥ éR ÛÛ†". Œ% http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=90&slotname=3808192216&w=728&lmt=1306132561&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fdownload-fvty.htm&dt=1306139761213&bpp=13&shv=r20110512&jsv=r20110506&correlator=1306139761239&frm=0&adk=4138530256&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1586020085&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1404&eid=36813005&ref=http%3A%2F%2Fen.softsia.com%2FCats-Photo-Screensaver-download-fvty.htm&fu=0&ifi=1&dtd=60&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame1&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¥ I OÂOq0 C http://en.softsia.com/get.php?url=http%3A%2F%2Fwww.photoscreensavers.us%2FCats%2520Demo.exe.ƒ¥öô†;/ ŒW http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=280&slotname=6190345064&w=336&lmt=1306132561&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fdownload-fvty.htm&dt=1306139761279&bpp=3&shv=r20110512&jsv=r20110506&prev_slotnames=3808192216&correlator=1306139761239&frm=0&adk=124017538&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1586020085&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1404&eid=36813005&ref=http%3A%2F%2Fen.softsia.com%2FCats-Photo-Screensaver-download-fvty.htm&fu=0&ifi=2&dtd=18&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame2&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.ƒ¥ iÑ U ù}òU6 3ohttps://chrome.google.com/webstore/detail/mfjkgbjaikamkkojmakjclmkianficch?hl=en-USDownload Assistant (by Google) - Chrome Web Store.ƒ©Å^5 chttps://chrome.google.com/webstore?hl=en-US&category=ext%2F15-by-googleExtensions › by Google - Chrome Web Store.ƒ©^®¯z4 U https://accounts.youtube.com/accounts/CheckConnection?pmpo=https%3A%2F%2Fwww.google.com&v=1871234717.ƒ¨FÁ]‚3 ƒc+https://www.google.com/accounts/ServiceLogin?service=chromewebstore&passive=true&continue=https://chrome.google.com/webstore/startbounce?continue%3Dhttps://chrome.google.com/webstore/detail/pjkljhegncpnkpknbcohdijeoejaedia?hl%253Den-USGoogle Accounts.ƒ¨DWð2 3=https://chrome.google.com/webstore/detail/pjkljhegncpnkpknbcohdijeoejaedia?hl=en-USGmail - Chrome Web Store.ƒ¨uŠín1 cihttps://chrome.google.com/webstore?hl=en-USChrome Web Store - Apps, Extensions and Themes.ƒ¨€¦K bb7 5ohttps://chrome.google.com/webstore/detail/mfjkgbjaikamkkojmakjclmkianficch?hl=en-US#Download Assistant (by Google) - Chrome Web Store.ƒª"° ûû$ $TæÌ²˜~dJ0üâÈ®”z`F*ôÚÀ¦ŒrX>$ ðÖ¼¢ˆnT$!.ƒ¢ê(V0# .ƒ¢âTÉ 0".ƒ¢ÆãS0!.ƒ¢ÄNX0 .ƒ¢²ö—0.ƒ¢°§0.ƒ¢ š*0.ƒ¢ ôŠ0.ƒ¢ƒ30.ƒ¢ù0.ƒ¡óúS0.ƒ¡&«²`.ƒ ±€‘`.ƒ 4/ã0.ƒŸÕHi`.ƒŸ¤_0.ƒŸ¢H¨ .ƒŸ¢H¨.ƒŸ.#• .ƒŸ.#• .ƒŸ$Kž0 .ùB ©@0 .ùA»Ç€0  .¿ô¦€0  .Í2ß0 .Í2ß0 .Ìæ“À0 .ËJ—0.Éë£@0.É%F0-þé-0ýÀ0-þé-0ýÀ0.ùAo|@0.¿óÇ[@0.Ⱥv@0-þé-0ýÀ0 !¦æÌ²˜~dJ0üâÈ®”z`F,øÞĪv\B(ôÚÀ¦E7.ƒª"° D`D6.ƒ©Å^C0C5.ƒ©^®¯B0B1.ƒ¨€¦K1A2.ƒ¨uŠí=1@4.ƒ¨FÁ]0?3.ƒ¨DWð>`>2.ƒ¨!ùQ=0=1.ƒ§ ž0<0.ƒ¥öô0;/.ƒ¥ iÑ0:..ƒ¥ I09-.ƒ¥ éR08,.ƒ¥€N307+.ƒ¤ÙŸ06*.ƒ¤ØÑf05).ƒ¤×Õ04(.ƒ¤Öÿ&03'.ƒ¤Ð#Ç-02.ƒ¤•è 01.ƒ¤”mŽ00.ƒ¤’+°0/.ƒ¤’0..ƒ¤öù0-.ƒ¤Ž×1,&.ƒ¤~á0+%.ƒ¤|210*.ƒ¤xåh0).ƒ¤xZ.0(.ƒ¤t¸¤1'$.ƒ¢ýOm0&#.ƒ¢ìâ0%".ƒ¢ëÝé0 ¦úôîèâÜÖÐÊľ¸²¬¦      ‡ãª‡!''funnycats.exefunnycats.exe7==really really funny catsreally really funny cats!!funny catsfunny cats FF­ÖðÇ7e-tablemetametaCREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY,value LONGVARCHAR)';indexsqlite_autoindex_meta_1meta‚„tableurlsurlsCREATE TABLE urls(id INTEGER PRIMARY KEY,url LONGVARCHAR,title LONGVARCHAR,visit_count INTEGER DEFAULT 0 NOT NULL,typed_count INTEGER DEFAULT 0 NOT NULL,last_visit_time INTEGER NOT NULL,hidden INTEGER DEFAULT 0 NOT NULL,favicon_id INTEGER DEFAULT 0 NOT NULL)TƒtablevisitsvisitsCREATE TABLE visits(id INTEGER PRIMARY KEY,url INTEGER NOT NULL,visit_time INTEGER NOT NULL,from_visit INTEGER,transition INTEGER DEFAULT 0 NOT NULL,segment_id INTEGER,is_indexed BOOLEAN)n%%tablevisit_sourcevisit_source CREATE TABLE visit_source(id INTEGER PRIMARY KEY,source INTEGER NOT NULL)F55‚/tablekeyword_search_termskeyword_search_terms!CREATE TABLE keyword_search_terms (keyword_id INTEGER NOT NULL,url_id INTEGER NOT NULL,lower_term LONGVARCHAR NOT NULL,term LONGVARCHAR NOT NULL) %‹%dQk/home/john/Downloads/Cats Demo.exehttp://www.photoscreensavers.us/Cats%20Demo.exeMÚuøøs U/home/john/Downloads/funcats_scr.exehttp://fatloss4idiotsx.com/download/funcats/funcats_scr.exeMÚRF{F{ ˆ"ÝU¦vƒ;tabledownloadsdownloads#CREATE TABLE downloads (id INTEGER PRIMARY KEY,full_path LONGVARCHAR NOT NULL,url LONGVARCHAR NOT NULL,start_time INTEGER NOT NULL,received_bytes INTEGER NOT NULL,total_bytes INTEGER NOT NULL,state INTEGER NOT NULL)‚tablesegmentssegments%CREATE TABLE segments (id INTEGER PRIMARY KEY,name VARCHAR,url_id INTEGER NON NULL,pres_index INTEGER DEFAULT -1 NOT NULL)8 ''‚/tablesegment_usagesegment_usage&CREATE TABLE segment_usage (id INTEGER PRIMARY KEY,segment_id INTEGER NOT NULL,time_slot INTEGER NOT NULL,visit_count INTEGER DEFAULT 0 NOT NULL)v %%/tablepresentationpresentation'CREATE TABLE presentation(url_id INTEGER PRIMARY KEY,pres_index INTEGER NOT NULL)O -gindexvisits_url_indexvisits(CREATE INDEX visits_url_index ON visits (url)X /windexvisits_from_indexvisits)CREATE INDEX visits_from_index ON visits (from_visit) åå1http://google.com/ÿ ïï.zÂnØ  EbúôîèâÜÖÐÊľ¸²¬¦ š”Žˆ‚|vpjdò^ÚXàRìLæFÔ@: 4.("þøÎȼ¶°ª¤ž˜’tŒz†€nhb7E6D5C1B2A4@3?2>1=0</;.:-9,8+7*6)5(4'3210/.-&,%+*)($'#&"%!$ #"!          EbúôîèâÜÖÐÊľ¸²¬¦ šŽ‚vd^XRLF:4(" þøòìæàÚÔȼ¶ª¤ž˜’€t”ˆ|pj@.ΰŒz†nhbDECDBCB=A@>?=>=<;:9387654-3210/.-,+*)('&%$ #"!      ï,ï+ .ƒ¢âTÉ# "FFS`mz‡”¡®»ÈÕâïü #0=JWdq~‹˜¥²¿ÌÙæó -þé-0ýÀ -þé-0ýÀ -þé-0ýÀ .Ⱥv@ .É%F .Éë£@ .ËJ— .Ìæ“À .Í2ß .Í2ß .¿óÇ[@ .¿ô¦€ .ùAo|@ .ùA»Ç€ .ùB ©@ .ƒŸ$Kž .ƒŸ.#• .ƒŸ.#• .ƒŸ¢H¨ .ƒŸ¢H¨ .ƒŸ¤_ .ƒŸÕHi .ƒ 4/ã .ƒ ±€‘ .ƒ¡&«² .ƒ¡óúS .ƒ¢ù .ƒ¢ƒ3 .ƒ¢ ôŠ .ƒ¢ š* .ƒ¢°§ .ƒ¢²ö— .ƒ¢ÄNX! .ƒ¢ÆãS" "FS`mz‡”¡®»ÈÕâïü #0=JWdq~‹˜¥²¿ÌÙæóF .ƒª"° E .ƒ¢ê(V$ .ƒ¢ëÝé% .ƒ¢ìâ& .ƒ¢ýOm' .ƒ¤t¸¤( .ƒ¤xZ.) .ƒ¤xåh* .ƒ¤|21+ .ƒ¤~á, .ƒ¤Ž×- .ƒ¤öù. .ƒ¤’/ .ƒ¤’+°0 .ƒ¤”mŽ1 .ƒ¤•è 2 .ƒ¤Ð#Ç3 .ƒ¤Öÿ&4 .ƒ¤×Õ5 .ƒ¤ØÑf6 .ƒ¤ÙŸ7 .ƒ¥€N8 .ƒ¥ éR9 .ƒ¥ I: .ƒ¥ iÑ; .ƒ¥öô< .ƒ§ ž= .ƒ¨!ùQ> .ƒ¨DWð? .ƒ¨FÁ]@ .ƒ¨uŠíA .ƒ¨€¦KB .ƒ©^®¯C .ƒ©Å^D éé1http://google.com/ “uįh“C5indexkeyword_search_terms_index2keyword_search_termsNCREATE INDEX keyword_search_terms_index2 ON keyword_search_terms (url_id)X /windexvisits_time_indexvisits*CREATE INDEX visits_time_index ON visits (visit_time)M'eindexsegments_namesegments-CREATE INDEX segments_name ON segments(name)S+mindexsegments_url_idsegments/CREATE INDEX segments_url_id ON segments(url_id)Q';indexsegment_usage_time_slot_segment_idsegment_usage0CREATE INDEX segment_usage_time_slot_segment_id ON segment_usage(time_slot, segment_id)n7' indexsegments_usage_seg_idsegment_usage1CREATE INDEX segments_usage_seg_id ON segment_usage(segment_id)G)_indexurls_url_indexurls2CREATE INDEX urls_url_index ON urls (url)C5?indexkeyword_search_terms_index1keyword_search_termsMCREATE INDEX keyword_search_terms_index1 ON keyword_search_terms (keyword_id, lower_term) úú ññ.zÂnØ úú6÷KÅTD÷EX3https://chrome.google.com/webstore/detail/mfjkgbjaikamkkojmakjclmkianficch?hl=en-US67†rghttp://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=90&slotn63‡&ŽOhttp://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=15&slotn5@Fhttp://www.google.ch/search?sourceid=chrome&ie=UTF-8&q=funny+cats4†=Œ}http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=600&slotB PP„µð4v¢Î=žÒ“3khttp://code.google.com/p/chrome-screen-capture/ 0ehttp://dfptools.doubleclick.net/web-console/:yhttp://dfptools.doubleclick.net/web-console/applet.jspC http://en.softsia.com/Cats-Photo-Screensaver-download-fvty.htm'Ahttp://en.softsia.com/Fun-Cats-Screensaver-download-sk6t.htm+[http://en.softsia.com/download-fvty.htm,+[http://en.softsia.com/download-sk6t.htm n_http://en.softsia.com/get.php?url=http%3A%2F%2Ffatloss4idiotsx.com%2Fdownload%2Ffuncats%2Ffuncats_scr.exe$`Chttp://en.softsia.com/get.php?url=http%3A%2F%2Fwww.photoscreensavers.us%2FCats%2520Demo.exe03khttp://en.softsia.com/soft-cats-download-1.html?ƒhttp://fls.doubleclick.net/activityi;src=2542116;type=clien612;cat=chromn1;ord=1;num=3835704319644.719;~oref=http%3A%2F%2Ftools.google.com%2Fchrome%2Fintl%2Fen%2Fwelcome.html?&_dc_ck=tryl[http://fls.doubleclick.net/activityi;src=2542116;type=clien612;cat=chromn1;ord=1;num=3835704319644.719? ˜˜rßL¹&“†"ŒGhttp://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=15&slotn;†%ŒMhttp://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=15&slotnC‡ Žhttp://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=280&slot9†Œ7http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=280&slot?†'ŒQhttp://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=280&slot>†*ŒWhttp://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=280&slotJ†7Œqhttp://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=280&slotH†0Œchttp://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=600&slotAame=2362198502&w=468&lmt=1306132510&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&dt=1306139710333&bpp=3&shv=r20110512&jsv=r20110506&prev_slotnames=6851072109%2C4758889056%2C8331150399&correlator=1306139710364&frm=0&adk=3316004872&ga_vid=331534367.1306139711&ga_sid=1306139711&ga_hid=15156107&ga_fc=0&u_tz=120&u_his=1&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1451&ref=http%3A%2F%2Fwww.google.ch%2Fsearch%3Fhl%3Dde%26q%3Dfunnycats.exe%26oq%3Dfunnycats.exe%26aq%3Df%26aqi%3D%26aql%3D%26gs_sm%3De%26gs_upl%3D1945l7105l0l25l23l5l5l2l0l156l1190l7.6&fu=0&ifi=4&dtd=427&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame4&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMeame=6851072109&w=728&lmt=1306132510&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&dt=1306139710279&bpp=10&shv=r20110512&jsv=r20110506&correlator=1306139710364&frm=0&adk=491424018&ga_vid=331534367.1306139711&ga_sid=1306139711&ga_hid=15156107&ga_fc=0&u_tz=120&u_his=1&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1451&ref=http%3A%2F%2Fwww.google.ch%2Fsearch%3Fhl%3Dde%26q%3Dfunnycats.exe%26oq%3Dfunnycats.exe%26aq%3Df%26aqi%3D%26aql%3D%26gs_sm%3De%26gs_upl%3D1945l7105l0l25l23l5l5l2l0l156l1190l7.6&fu=0&ifi=1&dtd=372&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame1&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe rßL¹&“†2Œghttp://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=600&slotF†?http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=600&slotG‡5Žmhttp://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=600&slot:†Œhttp://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=90&slotn=†Œ%http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=90&slotnI†Œhttp://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=90&slotn<† Œhttp://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=90&slotnDame=8331150399&w=200&lmt=1306132510&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&dt=1306139710321&bpp=8&shv=r20110512&jsv=r20110506&prev_slotnames=6851072109%2C4758889056&correlator=1306139710364&frm=0&adk=2524821587&ga_vid=331534367.1306139711&ga_sid=1306139711&ga_hid=15156107&ga_fc=0&u_tz=120&u_his=1&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1451&ref=http%3A%2F%2Fwww.google.ch%2Fsearch%3Fhl%3Dde%26q%3Dfunnycats.exe%26oq%3Dfunnycats.exe%26aq%3Df%26aqi%3D%26aql%3D%26gs_sm%3De%26gs_upl%3D1945l7105l0l25l23l5l5l2l0l156l1190l7.6&fu=0&ifi=3&dtd=384&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame3&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMename=4758889056&w=336&lmt=1306132510&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&dt=1306139710317&bpp=4&shv=r20110512&jsv=r20110506&prev_slotnames=6851072109&correlator=1306139710364&frm=0&adk=2755568142&ga_vid=331534367.1306139711&ga_sid=1306139711&ga_hid=15156107&ga_fc=0&u_tz=120&u_his=1&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1451&ref=http%3A%2F%2Fwww.google.ch%2Fsearch%3Fhl%3Dde%26q%3Dfunnycats.exe%26oq%3Dfunnycats.exe%26aq%3Df%26aqi%3D%26aql%3D%26gs_sm%3De%26gs_upl%3D1945l7105l0l25l23l5l5l2l0l156l1190l7.6&fu=0&ifi=2&dtd=363&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame2&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMename=9004213189&w=160&lmt=1306132511&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&dt=1306139710337&bpp=5&shv=r20110512&jsv=r20110506&prev_slotnames=6851072109%2C4758889056%2C8331150399%2C2362198502&correlator=1306139710364&frm=0&adk=2218770476&ga_vid=331534367.1306139711&ga_sid=1306139711&ga_hid=15156107&ga_fc=0&u_tz=120&u_his=1&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1451&ref=http%3A%2F%2Fwww.google.ch%2Fsearch%3Fhl%3Dde%26q%3Dfunnycats.exe%26oq%3Dfunnycats.exe%26aq%3Df%26aqi%3D%26aql%3D%26gs_sm%3De%26gs_upl%3D1945l7105l0l25l23l5l5l2l0l156l1190l7.6&fu=0&ifi=5&dtd=1446&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame5&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMeame=5520569487&w=468&lmt=1306132523&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FFun-Cats-Screensaver-download-sk6t.htm&dt=1306139723081&bpp=8&shv=r20110512&jsv=r20110506&prev_slotnames=6717989103&correlator=1306139723052&frm=0&adk=2899817075&ga_vid=1106494855.1306139723&ga_sid=1306139723&ga_hid=310523222&ga_fc=0&u_tz=120&u_his=2&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1451&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=2&dtd=57&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame2&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMeame=6717989103&w=728&lmt=1306132523&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FFun-Cats-Screensaver-download-sk6t.htm&dt=1306139723045&bpp=4&shv=r20110512&jsv=r20110506&correlator=1306139723052&frm=0&adk=3975326057&ga_vid=1106494855.1306139723&ga_sid=1306139723&ga_hid=310523222&ga_fc=0&u_tz=120&u_his=2&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1451&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=1&dtd=26&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame1&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMeame=3808192216&w=728&lmt=1306132525&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fdownload-sk6t.htm&dt=1306139725464&bpp=11&shv=r20110512&jsv=r20110506&correlator=1306139725485&frm=0&adk=4138530256&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=134103612&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1451&ref=http%3A%2F%2Fen.softsia.com%2FFun-Cats-Screensaver-download-sk6t.htm&fu=0&ifi=1&dtd=33&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame1&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe!name=6190345064&w=336&lmt=1306132525&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fdownload-sk6t.htm&dt=1306139725531&bpp=4&shv=r20110512&jsv=r20110506&prev_slotnames=3808192216%2C6190345064&correlator=1306139725485&frm=0&adk=124017538&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=134103612&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1451&ref=http%3A%2F%2Fen.softsia.com%2FFun-Cats-Screensaver-download-sk6t.htm&fu=0&ifi=3&dtd=18&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame3&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe"name=6190345064&w=336&lmt=1306132525&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fdownload-sk6t.htm&dt=1306139725505&bpp=4&shv=r20110512&jsv=r20110506&prev_slotnames=3808192216&correlator=1306139725485&frm=0&adk=124017538&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=134103612&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1451&ref=http%3A%2F%2Fen.softsia.com%2FFun-Cats-Screensaver-download-sk6t.htm&fu=0&ifi=2&dtd=17&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame2&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe# ýýj”Ìæ©Í[‡Ž5http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-9802682967243697&output=html&h=90&slotn8)Whttp://start.ubuntu.com/10.04/Google/7shttp://tools.google.com/chrome/intl/en/welcome.html 7http://www.google.ch/Aƒhttp://www.google.ch/#hl=de&source=hp&biw=1257&bih=1414&q=grr&oq=grr&aq=f&aqi=g1g-s1g2g-s6&aql=&gs_sm=e&gs_upl=1084l1497l0l3l3l0l0l0l0l185l461l1.2&bav=on.2,or.r_gc.r_pw.&fp=e9e21f84998f5a4#Khttp://www.google.ch/blank.html ‚http://www.google.ch/search?hl=de&q=funnycats.exe&oq=funnycats.exe&aq=f&aqi=&aql=&gs_sm=e&gs_upl=1945l7105l0l25l23l5l5l2l0l156l1190l7.6#‚Ihttp://www.google.ch/search?hl=de&q=really+really+funny+cats&oq=really+really+funny+cats&aq=f&aqi=&aql=&gs_sm=e&gs_upl=4112l7623l0l24l21l0l14l14l0l146l639l5.2name=0203846796&w=160&lmt=1306132552&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FFun-Cats-Screensaver-download-sk6t.htm&dt=1306139752065&bpp=4&shv=r20110512&jsv=r20110506&prev_slotnames=6717989103%2C5520569487&correlator=1306139751836&frm=0&adk=668835015&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1083788595&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1404&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=3&dtd=18&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame3&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe%name=0203846796&w=160&lmt=1306132552&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FFun-Cats-Screensaver-download-sk6t.htm&dt=1306139752089&bpp=5&shv=r20110512&jsv=r20110506&prev_slotnames=6717989103%2C5520569487%2C0203846796&correlator=1306139751836&frm=0&adk=668835015&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1083788595&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1404&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=4&dtd=40&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame4&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe&ame=5520569487&w=468&lmt=1306132557&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FCats-Photo-Screensaver-download-fvty.htm&dt=1306139757904&bpp=5&shv=r20110512&jsv=r20110506&prev_slotnames=6717989103&correlator=1306139757813&frm=0&adk=2899817075&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1439309887&ga_fc=1&u_tz=120&u_his=2&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1404&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=2&dtd=21&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame2&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe(ame=6717989103&w=728&lmt=1306132557&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FCats-Photo-Screensaver-download-fvty.htm&dt=1306139757796&bpp=5&shv=r20110512&jsv=r20110506&correlator=1306139757813&frm=0&adk=3975326057&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1439309887&ga_fc=1&u_tz=120&u_his=2&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1404&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=1&dtd=53&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame1&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe) ii„àù4rõ_°9http://www.google.com/[9http://www.google.com/search?ie=UTF-8&oe=UTF-8&sourceid=navclient&gfns=1&q=java+plugin5http://www.java.com/:yhttp://www.java.com/inc/BrowserRedirect1.jsp?locale=en =http://www.symantec.com/de/de/business/products/index.jsp‚http://www.symantec.com/de/de/business/solutions/solutiondetail.jsp?solid=sol_info_risk_comp&solfid=sol_data_loss_preventioniUhttps://accounts.youtube.com/accounts/CheckConnection?pmpo=https%3A%2F%2Fwww.google.com&v=18712347174P#https://chrome.google.com/webstore/detail/ackpfhlmgjdjlohhjmbacaajbmkkklnp# O!https://chrome.google.com/webstore/detail/cpngackimfmofbokmjmljamhdncknpmg name=0203846796&w=160&lmt=1306132558&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FCats-Photo-Screensaver-download-fvty.htm&dt=1306139758054&bpp=6&shv=r20110512&jsv=r20110506&prev_slotnames=6717989103%2C5520569487&correlator=1306139757813&frm=0&adk=668835015&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1439309887&ga_fc=1&u_tz=120&u_his=2&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1404&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=3&dtd=92&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame3&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe*name=0203846796&w=160&lmt=1306132558&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2FCats-Photo-Screensaver-download-fvty.htm&dt=1306139758150&bpp=5&shv=r20110512&jsv=r20110506&prev_slotnames=6717989103%2C5520569487%2C0203846796&correlator=1306139757813&frm=0&adk=668835015&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1439309887&ga_fc=1&u_tz=120&u_his=2&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1242&bih=1404&ref=http%3A%2F%2Fen.softsia.com%2Fsoft-cats-download-1.html&fu=0&ifi=4&dtd=17&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame4&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe+name=6190345064&w=336&lmt=1306132561&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fdownload-fvty.htm&dt=1306139761304&bpp=5&shv=r20110512&jsv=r20110506&prev_slotnames=3808192216%2C6190345064&correlator=1306139761239&frm=0&adk=124017538&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1586020085&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1404&eid=36813005&ref=http%3A%2F%2Fen.softsia.com%2FCats-Photo-Screensaver-download-fvty.htm&fu=0&ifi=3&dtd=19&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame3&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe-ame=3808192216&w=728&lmt=1306132561&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fdownload-fvty.htm&dt=1306139761213&bpp=13&shv=r20110512&jsv=r20110506&correlator=1306139761239&frm=0&adk=4138530256&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1586020085&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1404&eid=36813005&ref=http%3A%2F%2Fen.softsia.com%2FCats-Photo-Screensaver-download-fvty.htm&fu=0&ifi=1&dtd=60&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame1&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe.name=6190345064&w=336&lmt=1306132561&flash=10.3.181&url=http%3A%2F%2Fen.softsia.com%2Fdownload-fvty.htm&dt=1306139761279&bpp=3&shv=r20110512&jsv=r20110506&prev_slotnames=3808192216&correlator=1306139761239&frm=0&adk=124017538&ga_vid=2003771680.1306139725&ga_sid=1306139725&ga_hid=1586020085&ga_fc=1&u_tz=120&u_his=3&u_java=1&u_h=1600&u_w=2560&u_ah=1600&u_aw=2560&u_cd=24&u_nplug=10&u_nmime=45&biw=1257&bih=1404&eid=36813005&ref=http%3A%2F%2Fen.softsia.com%2FCats-Photo-Screensaver-download-fvty.htm&fu=0&ifi=2&dtd=18&gcv=gcm_8b3e97d1045ac48216d6355dac344a85.js#id=google_ads_frame2&parent=http%3A%2F%2Fen.softsia.com&rpctoken=adsense_rpc_key&_methods=expand%2Ccollapse%2C_ready%2C_close%2C_open%2C_resizeMe/ 44ŽçdÑY5https://chrome.google.com/webstore/detail/mfjkgbjaikamkkojmakjclmkianficch?hl=en-US#7X3https://chrome.google.com/webstore/detail/pjkljhegncpnkpknbcohdijeoejaedia?hl=en-US2/chttps://chrome.google.com/webstore?hl=en-US1Lhttps://chrome.google.com/webstore?hl=en-US&category=ext%2F15-by-google5pƒchttps://www.google.com/accounts/ServiceLogin?service=chromewebstore&passive=true&continue=https://cL.ahttps://www.mozilla.com/en-US/plugincheck/hrome.google.com/webstore/startbounce?continue%3Dhttps://chrome.google.com/webstore/detail/pjkljhegncpnkpknbcohdijeoejaedia?hl%253Den-US3 ¼ï¼Ð'funnycats.exe=really really funny cats!funny cats îúôî! . .."èfirefox" .! ..#èadts404t.default# ." ..$è places.sqliteãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçéêëìíîïðñòóôõö÷øùúûüýþÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ \ ] ^ _ ` 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 { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ \ ] ^ _ ` 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 { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ \ ] ^ _ ` 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 { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ \ ] ^ _ ` 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 { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ \ ] ^ _ ` 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 { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ       !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãä . ..%data_12b&data_02a'f_000001(f_000002)f_000003*˜f_000004f_000006f_000014f_000024ðf_00003af_000008f_0000090f_000031 f_00002ff_00001ef_000037€f_000038 f_00001af_000013@f_00001fdata_2f_000003f_000011f_000029f_00003cf_00000cf_000016 f_000027f_0000180f_000032 f_00002ef_000021pf_000035 f_00001cf_00000af_00001d0f_000020data_3f_000004f_000039hindexf_000005f_0000258f_00003df_0000070f_00002d f_000028f_00000f@f_000030data_1f_000002f_000015¨f_000034Pf_000026@f_0000170f_000012 f_00000ef_000001Hf_00002cf_00000b(f_000023data_0ÃÊÁ ÿÿÿÿÿÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà'ð(C   DµþéUç/.ja·Ø¥‚Uç/.3ΡÞvOyhttp://tools.google.com/chrome/intl/en/welcome.html2Y颰‡Uç/.:b ²ÁÂaØ^https://www.google.com/intl/en/chrome/browser/welcome.htmlÊÄé„Uç/.¦‡Uç/.ŒHTTP/1.1 301 Moved PermanentlyLocation: https://www.google.com/intl/en/chrome/browser/welcome.htmlContent-Type: text/html; charset=UTF-8Content-Encoding: gzipDate: Thu, 20 Dec 2012 23:25:46 GMTExpires: Thu, 20 Dec 2012 23:25:46 GMTCache-Control: private, max-age=0X-Content-Type-Options: nosniffX-Frame-Options: SAMEORIGINX-XSS-Protection: 1; mode=blockContent-Length: 193Server: GSEh³)Ú˜“ã@™ÇØ­\¹É@74.125.237.129Pþ3ÂüY¼Uç/.N `² ¡ŠŽÕhttps://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700&subset=latin8#xž¼Uç/.Fb K²€¥J½ahttps://www.google.com/intl/en/chrome/assets/common/css/chrome.min.css“¥ºå¼Uç/.5f ÿ²±2è‹https://www.google.com/js/gweb/analytics/autotrack.js¶TšàÀUç/.Dj ² ²€ e*ûhttps://www.google.com/intl/en/chrome/assets/common/js/chrome.min.js‹ÅÒÏo‚0ð»Eoh2„ /Fg`þNÔ9.»"ŒÒ2Zt¸ì$ÓyP/šx|ß×¼×~Ò–O }"ð]ொCœ@°D€ã&4w=ÆsŒ @h{xŸnP¸ ¸4Y.3–B` =\ýŸÚ¿ µ»ÃF™‹»²o­ 3µÍ­¶~3U—±ˆÙ|XßP߯·/ÞÁ«BY µfå§Òº*ˆrdPž9&²o\Nò8º·ÇV'a/±2KÔxN½Éü–$ê9ÅáòÄ?9ì]3œŒ¹3íY‹%iè³¶©³g‡Ü¦qæˆÇu`Ïí#;k§¤uÇ_ŸÜ›ZÊDïÊ¡Öw‰Ø‘œ*–›iÑæ$Ã/€èw³D•–模›Uç/.&Þ d:P² ÃÍL‚https://ssl.google-analytics.com/ga.jsTâöÓ¹¥›Uç/.M. P ²$³+X¼https://www.google.com/intl/en/chrome/assets/common/images/chrome_logo_2x.pngYƒšÊ¿›Uç/.1& 0²¢U/lhttps://ssl.gstatic.com/images/icons/gplus-16.pngü¡‰ À›Uç/.Z. Ž%²€Ü<Ãáhttps://www.google.com/intl/en/chrome/assets/common/images/browser-ss/windows8-welcome.pngóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíî~óì_ ¦À›Uç/.U. Ì_(²€½ñ³https://www.google.com/intl/en/chrome/assets/common/images/browser-ss/browser-mac.pngVÊ P Á›Uç/.U. ,²ÁúR^«https://www.google.com/intl/en/chrome/assets/common/images/browser-ss/browser-win.png·g.¾ bÁ›Uç/.W. &4²Âèå@ähttps://www.google.com/intl/en/chrome/assets/common/images/browser-ss/browser-linux.pngÆÞ-ú ¬Á›Uç/.QJ ² ±âM'‰https://www.google.com/tools/dlpage/res/chrome/images/chrome_throbber_fast_16.gifïñ:ŸUç/.4b '78²ÃEþhttps://www.google.com/chrome/intl/en/eula_text.htmlB?·¦>ÏŸUç/.n¦ LXH³€ÕoµÎhttps://themes.googleusercontent.com/static/fonts/opensans/v6/MTP_ySUJH_bn48VBG8sNSnhCUOGz7vYGh680lGh-uXM.woffËRGv½ÏŸUç/.n¦ ÜXD³€#­uÅhttps://themes.googleusercontent.com/static/fonts/opensans/v6/k3k702ZOKiLJc3WVjuplzHhCUOGz7vYGh680lGh-uXM.woffÎ*üo4ПUç/.n¦ ÄU@³€oŠdáhttps://themes.googleusercontent.com/static/fonts/opensans/v6/cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff¸'f¤’ПUç/.n¦ €XL³€Ý+Qwhttps://themes.googleusercontent.com/static/fonts/opensans/v6/DXI1ORHCpsQm3Vp6mXoaTXhCUOGz7vYGh680lGh-uXM.woffus\ÑПUç/.Q. =<² ¡›þöùhttps://www.google.com/intl/en/chrome/assets/common/images/content/close-icon.pngq\‹£ç¼£Uç/.a> `³ ùé‡https://fls.doubleclick.net/activityi;src=2542116;type=clien612;cat=chrom0;ord=5046558191534.132?m9ÎNÍ£Uç/.H. …X²(£iÕ(áhttps://www.google.com/intl/en/chrome/assets/common/images/pin-large.png‰PNG  IHDR‘h6ÖIDAT(Sc¸ëmIb¸ãeqÃÓü&ntÖɈÎ9ÕU2Üò°»S?éãñ“ßÞýý®¼ªô¾ænD§ €Âg ì«nf ¯.½ù¾©ä†‡ÉåÀÀ§{å~j¾îfr†N:èO9êE.¹š0üÿþ¡ŸÑ%£‹@äûî%PöóëËözp‚³Üv58çE·–ÝJ]yÊÓÈÀ@ O%è¶×;eBçZv¬˜|ÄZŽ€"0¶Ãÿ¿ÿ¿­Ï:a£s Œ.̸ðÿ×¥»ÁP.Pä•P²Úh3|ýä~z»¨èl°ëÙÊ ŸÞÜ{Vm{ÐJŽöYjUìµÐ8`© D '‚ãnÎ[òb×ÞÏï€âß_ÔÛí5S߃„v™ªADá°¹úÕ&ÁOÞüÿ÷ÿã0'b8`¢ºÕPy‹¡îÙ/þÿüÿÿÇÝ¥N`ìˆá|ÛÔGû<Û¸ìÁšeO>ø È÷/»B·è+nDEÀ\†¯{{¹©¯Ó•_BZ‡º·~ÿÒs7Y,‚@5 'LäWiË"£Í…knq8š8„˰OWn­¶Ìùðëÿ7]ލ‚P5›;“žc`k¨IEND®B`‚{Wâeµ£Uç/.%FR"\³Â- Ì8https://apis.google.com/js/plusone.js‰PNG  IHDRžÉU¤9PLTEïïïäääåååáááãããæææîîîçççìììíííèèèéééëëëêêê¾ßg¿IDATÓmIr1 e;þÿØFsq‚cWˆâZÝ€Þ²šç-«)ËoY ÇÿPY4öT‹’-k„:´åž‘ 3ðê‹Ê?T{jñ¢lnxžŽ”„Ûå÷la7-χAIS‘µ0Û;“­GçéµùrW×€ä½aÌÚ¶)ù¸X1bÛLƒs»^¡.sUÇBÆ‹_Xu6(¤œhà³}®­¨¦P«­ó³—Б«Ü8î4;’ô8)Î/;ÅëN Þ{IEND®B`‚¶+i/6\øUç/.œÎ }cd³ €âþ‰Zhttps://apis.google.com/_/scs/apps-static/_/js/k=oz.gapi.en_GB.BOmT4jHwEjI.O/m=plusone/am=iQ/rt=j/d=1/rs=AItRSTNKpybvmz_X1I0ZiHvBFFO4eAUqMw/cb=gapi.loaded_0üm›mr»þUç/.º6¡j’Tzhttp://www.google.com/&«›c©Uç/.Ü® #T²' ?pàxhttps://ssl.google-analytics.com/__utm.gif?utmwv=5.3.8&utms=1&utmn=1337492677&utmhn=www.google.com&utmcs=UTF-8&utmsr=1920x1080&utmsc=24-bit&utmul=en-us&utmje=1&utmfl=11.5%20r31&utmdt=Getting%20Started&utmhid=1167063197&utmr=-&utmp=%2Fintl%2Fen%2Fchrome%2Fbrowser%2Fwelcome.html&utmac=UA-26908291-1&utmcc=__utma%3D173272373.1804799589.1356045950.1356045950.1356045950.1%3B%2B__utmz%3D173272373.1356045950.1.1.utmcsr%3D(direct)%7Cutmccn%3D(direct)%7Cutmcmd%3D(none)%3B&utmu=qKC~GIF89a€ÿÿÿÿ,D;‰PNG  IHDR*&² LIDATXýØ[HQÀñJ¥&3“Ô\ïy«aIDºmIàK Z^ÒÂ0ÍÔ¼bÙ#ÛŠ èeA² ¡‚55G3ËR›6[}_|ʇŇðEøúÎÉ­eÙ=sÙøÁa™3þ™Ë™A8o=œqÇ#“ιc+Å1„’ r ðBBfdxèÁ3&4@¡^d@þ 5Ý·óÈ‚@*õ[è³GXtÝï'$:3뺷kÚŒÀOŽéºçî´ 9¯94çΟuh Íî´ XeÝœc»H‘±‚¹M¡Y·mf¬„6œ+™‹Tß«Üî[ß%¬v6õÁÊÊ EÆJæ"Õ—Ÿ3Þ@‰ŒKVX^^¦ÈXá|Qu¨píÈÙuy2š!½ÞJ%WöÀÒÒEÆÎßÉ>d_ÇSšyu ä¤6Àââ"²¯ã©M¿2 rRúaaa ÙWîXi-#S ±†\T #e£hÎuKmŸ9;ZÇ ©î$^xKÅUtÃÜÜEÆÎßÉ>d_ÙcÕ÷Û}Dº;Š6ÑД¶¯V Õo`vv–"c%s“+,/†ù(„KjùbFÀ*®ê5Øl6ŠŒ•ÌMÌ­hVJdr Í㬠5V˜œœ¤È˜ynÃð/•‘Ä>úDÇE,bëG!漕"cÖyqEº5„¦ÐÐí Ÿ~S+j9›ïQç:]÷©?ò.^×OŸz×Eu[íX/=Åï|¬!2ûß:êYó‘G=D>Q³ý¿/]7÷WUDõ(æhYòlDe Yä#8÷ÍÓ{5¼êƒ€ÔØZÜ£&’<4™(ˆó´yû;7" %¶œT)è+”à+‡$!`±¹è©’Hòñï3%tÃÙa‚G9aL‘ù«_FLq¬¡N¡gD9x²±èÅëÙÓå_:rBʇj¸ -ëÿ›–Sîåìé[Eá‰ÑJŸ¸ ?ÜÚåay‰×r5‡®/{/ p )|eg h(T:hA@DÔ¬^bŸ]W2h@|âyßê=ȶ¼:”X[<`A‚Ú?°Ð5§ø@F=Ùä[ö'@IEND®B`‚š×÷¬"ÑøUç/.½b h³ïHÃhttps://fls.doubleclick.net/activityi;src=2542116;type=clien612;cat=chrom0;ord=5046558191534.132;~oref=https%3A%2F%2Fwww.google.com%2Fintl%2Fen%2Fchrome%2Fbrowser%2Fwelcome.html?&_dc_ck=try"Pyu*`ýUç/.d* —Sl² €³Ââîhttps://ssl.gstatic.com/s2/oz/images/stars/po/Publisher/sprite4-a67f741843ffc4220554c34bd01bb0bb.pngSP߉³ýUç/.ÅÞ òx²9¢´l+>https://2542116.fls.doubleclick.net/activityi;src=2542116;type=clien612;cat=chrom0;ord=5046558191534.132;~oref=https%3A%2F%2Fwww.google.com%2Fintl%2Fen%2Fchrome%2Fbrowser%2Fwelcome.html?&_dc_ck=tryB 6"Vç/.ŸÎ ?Tt³ €eŒ1[https://plusone.google.com/_/scs/apps-static/_/js/k=oz.plusone.en.xyTNpGMQOy4.O/m=p1b,p1p/am=MA/rt=j/d=1/rs=AItRSTP3npIpwPCNG0k58xsVLKEl27uFRg/cb=gapi.loaded_1W±¨·á!Vç/.ÈÎ Jp³ €¦þÞ~https://plusone.google.com/_/scs/apps-static/_/js/k=oz.gapi.en_GB.BOmT4jHwEjI.O/m=googleapis_client,iframes_styles_bubble_internal/am=iQ/rt=j/d=1/rs=AItRSTNKpybvmz_X1I0ZiHvBFFO4eAUqMw/cb=gapi.loaded_0¶xüÿUç/.æàVç/.vHTTP/1.1 302 FoundLocation: http://www.google.com.au/Cache-Control: privateContent-Type: text/html; charset=UTF-8P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."Date: Thu, 20 Dec 2012 23:25:54 GMTServer: gwsContent-Length: 222X-XSS-Protection: 1; mode=blockX-Frame-Options: SAMEORIGINëAŽ$Æ~ó½–JægÓ|î74.125.237.147P%z ú }éVç/.žçi@¡ €yMMšhttp://www.google.com.au/‹ÿíVmOÛ0þί8ò¡Hh©›–·–¦¨¤Ý¨Ô7FT!›ÔàØÁq[úïg§ÀŠD™Æ4¤iËûr9ûîžçIâúzk„£aÆ:á0<=ìvp\„Î*B­°Ga¯ [Å’¡Â"cšI9Bí¾ÎXë´†Ðl6+Î*E©b~Ev«-Ä¥Ìh‘hâ4êÖcFŠI£®™æ´QGOóÂ{-É2=çÔw®qt+9Ä$—ªÚfN±¢B›ÝÖ]¾Hs $n¤‚áy\ÆJ&ÔGfJqlÍoÌÔ i¥DÀukõ,R,Õ ç©I¥éƒF·xŠ^§±†6¡¾~´šaó6ÑÚ+ˆódW‘Sª2Óÿ#àCµêU½²··¿"ŠcOl>8T8«ÂLý Ö6¨²2&†ìä×Ê8ޝ)·q£Ûä>^ŸÇÇãÉä¨ZnöV.šb>±E–ömû—— Ûx-0ùd©ÈÏ…=*a‘“Œª)‹hVŒd‚,˜ Y‹·™{)‹Ï&aÓ'1–¥ÏkLp&è¾]Â’Æ”Åcí;ž3Fô8·žô#¡ÊÍïjBÚU€¹ ~w­è™jt#ì¿o'é~d4NÌw¾‹}jÐÅ‚˜‡0\¼ å’çm˜¹5€þ „Þ Õù<‚ð¨sÃÎy» >4û#8kŽ^¼*/@{Ìâ¦ìò"S¦iB à ä¬÷ ;-ß+•+»^Áü´ Ê8ÊÞN!â̬77;åÝ­Âû[Õ%B«2«×¥aÉÿ ‚–¥µ¤7ô‚ƵœÇ¶ o ÏÇ¿·n÷ÚÍ¿ŸÝí½Ré 0·?œÝ_)èwÙEöäeaöˆöùÁ” (øþ!*ÝVç/.5¾ ¥ |²€²}-¿Âhttps://www.googleadservices.com/pagead/conversion.jsÿ*"ÝVç/.pò 挲Z¡W https://segment-pixel.invitemedia.com/pixel?pixelID=102371&partnerID=216&clientID=6274&key=segment&returnType=jsÝ×ÅÎ#§ÝVç/.pò æ²\¡Š https://segment-pixel.invitemedia.com/pixel?pixelID=105800&partnerID=216&clientID=6275&key=segment&returnType=js÷}™¬&`¨ Vç/.#fL¡ˆ1_http://www.google.com.au/blank.htmlšÑ}Vç/.øÎ Vç/.iHTTP/1.1 200 OKDate: Thu, 20 Dec 2012 23:25:54 GMTExpires: -1Cache-Control: private, max-age=0Content-Type: text/html; charset=UTF-8P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."Content-Encoding: gzipServer: gwsX-XSS-Protection: 1; mode=blockX-Frame-Options: SAMEORIGIN 74.125.237.87PSNW¸(Ï- Vç/.ݾ\ŒX¡€MÍÔ8http://www.google.com.au/xjs/_/js/s/c,sb,cr,vm,cdos,jsa,sf,tbpr,tbui,rsn,ob,mb,lc,hv,cfm,klc,kat,esp,erh,bihu,amcl,kp,lu,m,shb,sfa,hsm,j,p,pcc,csi/rt=j/ver=3w99aWPP0po.en_US./d=1/sv=1/rs=AItRSTPrAylXrfkOPyRRY-YioThBMqxW2AhÃï$2 Vç/.M „³*‹https://www.googleadservices.com/pagead/conversion/991916218/?random=1356045956276&cv=7&fst=1356045956276&num=1&fmt=3&value=0&label=YjmqCPbXgQIQuuH92AM&bg=666666&hl=en&guid=ON&u_h=1080&u_w=1920&u_ah=1051&u_aw=1920&u_cd=24&u_his=1&u_tz=60&u_java=true&u_nplug=8&u_nmime=11&ref=https%3A//www.google.com/intl/en/chrome/browser/welcome.html&url=https%3A//2542116.fls.doubleclick.net/activityi%3Bsrc%3D2542116%3Btype%3Dclien612%3Bcat%3Dchrom0%3Bord%3D5046558191534.132%3B%7Eoref%3Dhttps%253A%252F%252Fwww.google.com%252Fintl%252Fen%252Fchrome%252Fbrowser%252Fwelcome.html%3F%26_dc_ck%3Dtry&frm=2a••©'à, Vç/./j_N¡Á°¥¸]http://www.google.com.au/images/srpr/logo3w.png7Òp%s; Vç/.M ˆ³¼ëShttps://www.googleadservices.com/pagead/conversion/991916218/?random=1356045956280&cv=7&fst=1356045956276&num=2&fmt=3&value=0&label=quiECP7lgQIQuuH92AM&bg=666666&hl=en&guid=ON&u_h=1080&u_w=1920&u_ah=1051&u_aw=1920&u_cd=24&u_his=1&u_tz=60&u_java=true&u_nplug=8&u_nmime=11&ref=https%3A//www.google.com/intl/en/chrome/browser/welcome.html&url=https%3A//2542116.fls.doubleclick.net/activityi%3Bsrc%3D2542116%3Btype%3Dclien612%3Bcat%3Dchrom0%3Bord%3D5046558191534.132%3B%7Eoref%3Dhttps%253A%252F%252Fwww.google.com%252Fintl%252Fen%252Fchrome%252Fbrowser%252Fwelcome.html%3F%26_dc_ck%3Dtry&frm=2Gd,+œVç/.p œ³ œ+þhttps://cm.g.doubleclick.net/pixel?google_sc&google_nid=invitemedia&google_cm&google_hm=hEuDLPRjTmqpNOyZ8JKfWQ==b1% Vç/.â Vç/.4HTTP/1.1 200 OKContent-Type: text/htmlLast-Modified: Mon, 02 Apr 2012 02:13:37 GMTDate: Mon, 17 Dec 2012 12:51:25 GMTExpires: Tue, 17 Dec 2013 12:51:25 GMTX-Content-Type-Options: nosniffServer: sffeContent-Length: 0X-XSS-Protection: 1; mode=blockCache-Control: public, max-age=31536000Age: 297270 74.125.237.87Pf(ýVç/.I»Vç/.5HTTP/1.1 200 OKContent-Type: image/pngLast-Modified: Mon, 02 Apr 2012 02:13:37 GMTDate: Sat, 15 Dec 2012 11:17:03 GMTExpires: Sun, 23 Dec 2012 11:17:03 GMTX-Content-Type-Options: nosniffServer: sffeContent-Length: 7007X-XSS-Protection: 1; mode=blockCache-Control: public, max-age=691200Age: 475732 74.125.237.87PIN¤Â)?‡Vç/.‰”³òÔrhttps://googleads.g.doubleclick.net/pagead/viewthroughconversion/991916218/?random=1356045956276&cv=7&fst=1356045956276&num=1&fmt=3&value=0&label=YjmqCPbXgQIQuuH92AM&bg=666666&hl=en&guid=ON&u_h=1080&u_w=1920&u_ah=1051&u_aw=1920&u_cd=24&u_his=1&u_tz=60&u_java=true&u_nplug=8&u_nmime=11&ref=https%3A//www.google.com/intl/en/chrome/browser/welcome.html&url=https%3A//2542116.fls.doubleclick.net/activityi%3Bsrc%3D2542116%3Btype%3Dclien612%3Bcat%3Dchrom0%3Bord%3D5046558191534.132%3B~oref%3Dhttps%253A%252F%252Fwww.google.com%252Fintl%252Fen%252Fchrome%252Fbrowser%252Fwelcome.html%3F%26_dc_ck%3Dtry&frm=2&ctc_id=CAIVAgAAAB0CAAAA&ct_cookie_present=false0†O?9æ;eVç/.0jÏ.ˆ¡Ây4¼http://ssl.gstatic.com/gb/images/k1_a31af7ac.pngdx›a*yVç/.‰˜³A²*/https://googleads.g.doubleclick.net/pagead/viewthroughconversion/991916218/?random=1356045956280&cv=7&fst=1356045956276&num=2&fmt=3&value=0&label=quiECP7lgQIQuuH92AM&bg=666666&hl=en&guid=ON&u_h=1080&u_w=1920&u_ah=1051&u_aw=1920&u_cd=24&u_his=1&u_tz=60&u_java=true&u_nplug=8&u_nmime=11&ref=https%3A//www.google.com/intl/en/chrome/browser/welcome.html&url=https%3A//2542116.fls.doubleclick.net/activityi%3Bsrc%3D2542116%3Btype%3Dclien612%3Bcat%3Dchrom0%3Bord%3D5046558191534.132%3B~oref%3Dhttps%253A%252F%252Fwww.google.com%252Fintl%252Fen%252Fchrome%252Fbrowser%252Fwelcome.html%3F%26_dc_ck%3Dtry&frm=2&ctc_id=CAIVAgAAAB0CAAAA&ct_cookie_present=falseÜ·«cA]òvVç/.còk ²ój‚http://www.google.com.au/gen_204?atyp=i&ct=1&cad=1&rsm=6&ei=gp7TUNmFLbCbmQX7yYCwCg&zx=1356045963273º¹ýVç/.,Vç/.{HTTP/1.1 200 OKVary: Accept-EncodingContent-Encoding: gzipContent-Type: text/javascript; charset=UTF-8Last-Modified: Tue, 18 Dec 2012 18:58:43 GMTDate: Tue, 18 Dec 2012 23:08:13 GMTExpires: Wed, 18 Dec 2013 23:08:13 GMTX-Content-Type-Options: nosniffServer: sffeContent-Length: 167004X-XSS-Protection: 1; mode=blockCache-Control: public, max-age=31536000Age: 173862uÞg^>ꀱˆð7 74.125.237.87PmakePixelRequest("https://cm.g.doubleclick.net/pixel?google_sc&google_nid=invitemedia&google_cm&google_hm=hEuDLPRjTmqpNOyZ8JKfWQ==","image");makePixelRequest("https://ad.yieldmanager.com/pixel?id=1775162&t=2","image"); function makePixelRequest(pixelURL,pixelType){ if(pixelType == "javascript") { document.write(' """, allow_script=True) help_template = Template(""" {% if this.context_help_url %}

{% endif %} """) # pylint: disable=redefined-builtin def __init__(self, id=None, state=None, renderer_name=None, **kwargs): self.state = state or kwargs self.id = id self.unique = GetNextId() self.renderer_name = renderer_name or self.__class__.__name__ # pylint: enable=redefined-builtin def CallJavascript(self, response, method, **kwargs): """Inserts javascript call into the response. Args: response: Response object where the code will be written. method: Javascript method to be executed. For example, "SomeRenderer.Layout". For details on how to register these methods, please see gui/static/javascript/renderers.js. **kwargs: Dictionary arguments that will be passed to the javascript functions in JSON-encoded 'state' argument. self.unique and self.id are included into 'state' by default. Returns: Response object. """ js_state = self.state.copy() js_state.update(dict(unique=self.unique, id=self.id, renderer=self.__class__.__name__)) # Since JSON can only represent strings, we must force inputs to a string # here. js_state.update(StringifyJSON(kwargs)) if "." not in method: method = "%s.%s" % (self.__class__.__name__, method) js_state_json = JsonDumpForScriptContext(js_state) self.RenderFromTemplate(self.js_call_template, response, method=method, js_state_json=js_state_json) return response def RenderAjax(self, request, response): """Responds to an AJAX request. Args: request: The request object. response: A HttpResponse object which can be filled in. Returns: JSON encoded parameters as expected by the javascript widget. """ if request and self.id is None: self.id = request.REQ.get("id", hash(self)) return response def Layout(self, request, response): """Outputs HTML to be inserted into the DOM in order to layout this widget. Args: request: The request object. response: A HttpResponse object which can be filled in. Returns: HTML to insert into the DOM. """ if request and self.id is None: self.id = request.REQ.get("id", hash(self)) # Make the encoded state available for our template. self.state_json = JsonDumpForScriptContext(self.state) return response def RenderFromTemplate(self, template_obj, response, **kwargs): """A helper function to render output from a template. Args: template_obj: The template object to use. response: A HttpResponse object **kwargs: Arguments to be expanded into the template. Returns: the same response object we got. Raises: RuntimeError: if the template is not an instance of Template. """ kwargs["this"] = self context = template.Context(kwargs) if not isinstance(template_obj, Template): raise RuntimeError("template must be an instance of Template") response.write(template_obj.render(context)) return response def FormatFromTemplate(self, template_obj, **kwargs): """Return a safe formatted unicode object using a template.""" kwargs["this"] = self return template_obj.render(template.Context(kwargs)).encode("utf8") def FormatFromString(self, string, content_type="text/html", **kwargs): """Returns a http response from a dynamically compiled template.""" result = http.HttpResponse(content_type=content_type) template_obj = Template(string) return self.RenderFromTemplate(template_obj, result, **kwargs) @classmethod def CheckAccess(cls, request): """Checks if the user is allowed to view this renderer. Args: request: A request object. Raises: access_control.UnauthorizedAccess if the user is not permitted. """ @property def javascript_path(self): return "static/javascript/%s.js" % ( self.classes[self.renderer].__module__.split(".")[-1]) # This will register all classes into this modules's namespace regardless of # where they are defined. This allows us to decouple the place of definition of # a class (which might be in a plugin) from its use which will reference this # module. Renderer.classes = globals() class UserLabelCheckMixin(object): """Checks the user has a label or deny access to this renderer.""" # This should be overridden in the mixed class. AUTHORIZED_LABELS = [] @classmethod def CheckAccess(cls, request): """If the user is not in the AUTHORIZED_LABELS, reject this renderer.""" user_managers.CheckUserForLabels(request.token.username, cls.AUTHORIZED_LABELS, token=request.token) class ErrorHandler(Renderer): """An error handler decorator which can be applied on individual methods.""" def __init__(self, status_code=503, **kwargs): super(ErrorHandler, self).__init__(**kwargs) self.status_code = status_code def __call__(self, func): @functools.wraps(func) def Decorated(*args, **kwargs): try: return func(*args, **kwargs) except Exception as e: # pylint: disable=broad-except logging.exception(utils.SmartUnicode(e)) response = http.HttpResponse() response = self.CallJavascript(response, "ErrorHandler.Layout", error=utils.SmartUnicode(e), backtrace=traceback.format_exc()) response.status_code = 500 return response return Decorated class TemplateRenderer(Renderer): """A simple renderer for fixed templates. The parameter 'this' is passed to the template as our reference. """ # These post parameters will be automatically imported into the state. post_parameters = [] # Derived classes should set this template layout_template = Template("") ajax_template = Template("") def Layout(self, request, response, apply_template=None): """Render the layout from the template.""" for parameter in self.post_parameters: value = request.REQ.get(parameter) if value is not None: self.state[parameter] = value response = super(TemplateRenderer, self).Layout(request, response) if apply_template is None: apply_template = self.layout_template canary_mode = getattr(request, "canary_mode", False) return self.RenderFromTemplate(apply_template, response, this=self, id=self.id, unique=self.unique, renderer=self.__class__.__name__, canary_mode=canary_mode) def RenderAjax(self, request, response): return TemplateRenderer.Layout(self, request, response, apply_template=self.ajax_template) def RawHTML(self, request=None, method=None, **kwargs): """This returns raw HTML, after sanitization by Layout().""" if method is None: method = self.Layout result = http.HttpResponse(content_type="text/html") method(request, result, **kwargs) return result.content def __str__(self): return self.RawHTML() class AngularDirectiveRendererBase(TemplateRenderer): """Renderers specified Angular directive with given parameters.""" __abstract = True # pylint: disable=g-bad-name directive = None directive_args = None def Layout(self, request, response, **kwargs): if self.directive is None: raise ValueError("'directive' attribute has to be specified.") self.directive_args = self.directive_args or {} response = super(AngularDirectiveRendererBase, self).Layout(request, response, **kwargs) return self.CallJavascript(response, "AngularDirectiveRenderer.Layout", directive=self.directive, directive_args=self.directive_args) class AngularDirectiveRenderer(AngularDirectiveRendererBase): """Renderers specified Angular directive as div.""" layout_template = Template("""
""") class AngularSpanDirectiveRenderer(AngularDirectiveRendererBase): """Renderers specified Angular directive as span.""" layout_template = Template(""" """) class EscapingRenderer(TemplateRenderer): """A simple renderer to escape a string.""" layout_template = Template("{{this.to_escape|escape}}") def __init__(self, to_escape, **kwargs): self.to_escape = to_escape super(EscapingRenderer, self).__init__(**kwargs) class TableColumn(object): """A column holds a bunch of cell values which are RDFValue instances.""" width = None def __init__(self, name, header=None, renderer=None, sortable=False, width=None): """Constructor. Args: name: The name of this column.The name of this column normally shown in the column header. header: (Optional) If exists, we call its Layout() method to render the column headers. renderer: The RDFValueRenderer that should be used in this column. Default is None - meaning it will be automatically calculated. sortable: Should this column be sortable. width: The ratio (in percent) of this column relative to the table width. """ self.name = name self.header = header self.width = width self.renderer = renderer self.sortable = sortable # This stores all Elements on this column. The column may be # sparse. self.rows = {} def LayoutHeader(self, request, response): if self.header is not None: try: self.header.Layout(request, response) except AttributeError: response.write(utils.SmartStr(self.header)) else: response.write(utils.SmartStr(self.name)) def GetElement(self, index): return self.rows[index] def AddElement(self, index, element): self.rows[index] = element def RenderRow(self, index, request, row_options=None): """Render the data stored at the specific index.""" value = self.rows.get(index) if value is None: return "" if row_options is not None: row_options["row_id"] = index if self.renderer: renderer = self.renderer(value) result = renderer.RawHTML(request) else: result = utils.SmartStr(value) return result class TableRenderer(TemplateRenderer): """A renderer for tables. In order to have a table rendered, it is only needed to subclass this class in a plugin. Requests to the URL table/classname are then handled by this class. """ fixed_columns = False show_total_count = False custom_class = "" # We receive change path events from this queue event_queue = "tree_select" table_options = {} message = "" def __init__(self, **kwargs): # A list of columns self.columns = [] self.column_dict = {} self.row_classes_dict = {} # Number of rows self.size = 0 self.message = "" # Make a copy of the table options so they can be mutated. self.table_options = copy.deepcopy(self.table_options) self.table_options["iDisplayLength"] = 50 self.table_options["aLengthMenu"] = [10, 50, 100, 200, 1000] super(TableRenderer, self).__init__(**kwargs) def AddColumn(self, column): self.columns.append(column) self.column_dict[utils.SmartUnicode(column.name)] = column def AddRow(self, row_dict=None, row_index=None, **kwargs): """Adds a new row to the table. Args: row_dict: a dict of values for this row. Keys are column names, and values are strings. row_index: If specified we add to this index. **kwargs: column names and values for this row. """ if row_index is None: row_index = self.size if row_dict is not None: kwargs.update(row_dict) for k, v in kwargs.iteritems(): try: self.column_dict[k].AddElement(row_index, v) except KeyError: pass self.size = max(self.size, row_index + 1) def AddRowFromFd(self, index, fd): """Adds the row from an AFF4 object.""" for column in self.columns: # This sets AttributeColumns directly from their fd. try: column.AddRowFromFd(index, fd) except AttributeError: pass self.size = max(self.size, index + 1) def GetCell(self, row_index, column_name): """Gets the value of a Cell.""" if row_index is None: row_index = self.size try: return self.column_dict[column_name].GetElement(row_index) except KeyError: pass def SetRowClass(self, row_index, value): if row_index is None: row_index = self.size self.row_classes_dict[row_index] = value def AddCell(self, row_index, column_name, value): if row_index is None: row_index = self.size try: self.column_dict[column_name].AddElement(row_index, value) except KeyError: pass self.size = max(self.size, row_index + 1) # The following should be safe: {{this.headers}} comes from the column's # LayoutHeader(). layout_template = Template("""
{% for column in this.columns %} {% if column.width %} {% else %} {% endif %} {% endfor %} {{ this.headers|safe }} {{this.table_contents|safe}}
""") + TemplateRenderer.help_template # Renders the inside of the tbody. ajax_template = Template(""" {% for row, row_options in this.rows %} {% for cell in row %} {{cell|safe}} {% endfor %} {% endfor %} {% if this.additional_rows %} Loading... {% endif %} """) def Layout(self, request, response): """Outputs HTML to be compatible with the DataTable interface. Args: request: The request object. response: A HttpResponse object which can be filled in. Returns: HTML to insert into the DOM. """ self.table_options = copy.deepcopy(self.table_options) self.table_options.setdefault("aoColumnDefs", []).append( {"bSortable": False, "aTargets": [i for i, c in enumerate(self.columns) if not c.sortable]}) self.table_options["sTableId"] = GetNextId() # Make up the headers by interpolating the column headers headers = StringIO.StringIO() for i in self.columns: opts = "" if i.sortable: opts += "sortable=1 " # Ask each column to draw itself headers.write("" % opts) i.LayoutHeader(request, headers) headers.write("") self.headers = headers.getvalue() # Populate the table with the initial view. tmp = http.HttpResponse(content_type="text/html") delegate_renderer = self.__class__(id=self.id, state=self.state.copy()) self.table_contents = delegate_renderer.RenderAjax(request, tmp).content response = super(TableRenderer, self).Layout(request, response) return self.CallJavascript(response, "TableRenderer.Layout", renderer=self.__class__.__name__, table_state=self.state, message=self.message) def BuildTable(self, start_row, end_row, request): """Populate the table between the start and end rows. This should normally be overridden by derived classes. Args: start_row: The initial row to populate. end_row: The final row to populate. request: The request object. """ def RenderAjax(self, request, response): """Responds to an AJAX request. Args: request: The request object. response: A HttpResponse object which can be filled in. Returns: JSON encoded parameters as expected by the javascript widget. """ start_row = int(request.REQ.get("start_row", 0)) limit_row = int(request.REQ.get("length", 50)) # The limit_row is merely a suggestion for the BuildTable method, but if # the BuildTable method wants to render more we can render more here. self.additional_rows = self.BuildTable(start_row, limit_row + start_row, request) end_row = min(start_row + limit_row, self.size) self.rows = [] for index in xrange(start_row, end_row): row_options = {} try: row_options["class"] = self.row_classes_dict[index] except KeyError: pass row = [] for c in self.columns: row.append(utils.SmartStr(c.RenderRow(index, request, row_options))) self.rows.append((row, row_options.items())) if self.additional_rows is None: self.additional_rows = self.size > end_row # If we did not write any additional rows in this round trip we ensure the # table does not try to fetch more rows. This is a safety check in case # BuildTable does not set the correct size and end row. Without this check # the browser will spin trying to fill the table. if not self.rows: self.additional_rows = False response = super(TableRenderer, self).Layout( request, response, apply_template=self.ajax_template) return self.CallJavascript(response, "TableRenderer.RenderAjax", message=self.message) def Download(self, request, _): """Export the table in CSV. This streams the entire table (after suitable filtering). Args: request: The request object. Returns: A streaming response object. """ self.BuildTable(0, MAX_ROW_LIMIT, request) def RemoveTags(string): """Very simple for now - remove any html from output.""" return re.sub("(?ims)<[^>]+>", "", utils.SmartStr(string)).strip() def Generator(): """Generates the CSV for streaming.""" fd = StringIO.StringIO() writer = csv.writer(fd) # Write the headers writer.writerow([c.name for c in self.columns]) # Send 1000 rows at a time for i in xrange(0, self.size): if i % 1000 == 0: # Flush the buffer yield fd.getvalue() fd.truncate(size=0) writer.writerow([RemoveTags(c.RenderRow(i, request)) for c in self.columns]) # The last chunk yield fd.getvalue() response = http.StreamingHttpResponse(streaming_content=Generator(), content_type="binary/x-csv") # This must be a string. response["Content-Disposition"] = ("attachment; filename=table.csv") return response class TreeRenderer(TemplateRenderer): """An abstract Renderer to support a navigation tree.""" publish_select_queue = "tree_select" layout_template = Template("""
""") hidden_branches = [] # Branches to hide in the tree. def Layout(self, request, response): response = super(TreeRenderer, self).Layout(request, response) return self.CallJavascript(response, "TreeRenderer.Layout", renderer=self.__class__.__name__, publish_select_queue=self.publish_select_queue, tree_state=self.state) def RenderAjax(self, request, response): """Render the tree leafs for the tree path.""" response = super(TreeRenderer, self).RenderAjax(request, response) self.message = "" result = [] self._elements = [] self._element_index = set() path = request.REQ.get("path", "") # All derived classes to populate the branch self.RenderBranch(path, request) for name, friendly_name, icon, behaviour in self._elements: if name: fullpath = os.path.join(path, name) if fullpath in self.hidden_branches: continue data = dict(text=friendly_name, li_attr=dict(id=DeriveIDFromPath(fullpath), path=fullpath)) if behaviour == "branch": data["children"] = True else: data["icon"] = icon result.append(data) # If this is a completely empty tree we have to return at least something # or the tree will load forever. if not result and path == "/": result.append(dict(text=path, li_attr=dict(id=DeriveIDFromPath(path), path=path))) return JsonResponse(result) def AddElement(self, name, behaviour="branch", icon=None, friendly_name=None): """This should be called by the RenderBranch method to prepare the tree.""" if icon is None: icon = behaviour if friendly_name is None: friendly_name = name self._elements.append((name, friendly_name, icon, behaviour)) self._element_index.add(name) def __contains__(self, other): return other in self._element_index def RenderBranch(self, path, request): """A generator of branch elements. Should be overridden by derived classes. This method is called once to render the branch. It is expected to call AddElement() repeatadly to build the tree. Args: path: The path to list in the tree. request: The request object. """ class TabLayout(TemplateRenderer): """This renderer creates a set of tabs containing other renderers.""" # The hash component that will be used to remember which tab we have open. # If set to None, currently selected tab name won't be preserved. tab_hash = "tab" # The name of the delegated renderer that will be used by default (None is the # first one). selected = None names = [] delegated_renderers = [] # Note that we do not use jquery-ui tabs here because there is no way to hook # a post rendering function so we can resize the canvas. We implement our own # tabs here from scratch. layout_template = Template("""
""") + TemplateRenderer.help_template def __init__(self, *args, **kwargs): super(TabLayout, self).__init__(*args, **kwargs) # This can be overriden by child classes. self.disabled = [] def Layout(self, request, response, apply_template=None): """Render the content of the tab or the container tabset.""" if not self.selected: self.selected = self.delegated_renderers[0] self.indexes = [(self.delegated_renderers[i], self.names[i]) for i in range(len(self.names))] response = super(TabLayout, self).Layout(request, response, apply_template) return self.CallJavascript(response, "TabLayout.Layout", disabled=self.disabled, tab_layout_state=self.state, tab_hash=self.tab_hash, selected_tab=self.selected) class Splitter(TemplateRenderer): """A renderer to achieve a three paned view with a splitter. There is a left pane dividing the screen into half horizontally, and top and bottom panes dividing the right pane into two. This should be subclassed and the below renderers should be provided: left_renderer will show on the left. top_right_renderer will show on the top right. bottom_right_renderer will show on the bottom right. """ # Override with the names of the renderers to use in the # constructor. left_renderer = "" top_right_renderer = "" bottom_right_renderer = "" # Override to change minimum allowed width of the left pane. min_left_pane_width = 0 max_left_pane_width = 3000 # This ensures that many Splitters can be placed in the same page by # making ids unique. layout_template = Template("""
{{this.left_pane|safe}}
{{this.top_right_pane|safe}}
{{this.bottom_right_pane|safe}}
""") def Layout(self, request, response): """Layout.""" self.id = request.REQ.get("id", hash(self)) # Pre-render the top and bottom layout contents to avoid extra round trips. self.left_pane = self.classes[self.left_renderer](id="%s_leftPane" % self.id).RawHTML(request) self.top_right_pane = self.classes[self.top_right_renderer]( id="%s_rightTopPane" % self.id).RawHTML(request) self.bottom_right_pane = self.classes[self.bottom_right_renderer]( id="%s_rightBottomPane" % self.id).RawHTML(request) response = super(Splitter, self).Layout(request, response) return self.CallJavascript(response, "Splitter.Layout", min_left_pane_width=self.min_left_pane_width, max_left_pane_width=self.max_left_pane_width) class Splitter2Way(TemplateRenderer): """A two way top/bottom Splitter.""" top_renderer = "" bottom_renderer = "" layout_template = Template("""
{{this.top_pane|safe}}
{{this.bottom_pane|safe}}
""") + TemplateRenderer.help_template def Layout(self, request, response): """Layout.""" self.id = self.id or request.REQ.get("id", hash(self)) # Pre-render the top and bottom layout contents to avoid extra round trips. self.top_pane = self.classes[self.top_renderer]( id="%s_topPane" % self.id, state=self.state.copy()).RawHTML(request) self.bottom_pane = self.classes[self.bottom_renderer]( id="%s_bottomPane" % self.id, state=self.state.copy()).RawHTML(request) response = super(Splitter2Way, self).Layout(request, response) return self.CallJavascript(response, "Splitter2Way.Layout") class Splitter2WayVertical(TemplateRenderer): """A two way left/right Splitter.""" left_renderer = "" right_renderer = "" # Override to change minimum allowed width of the left pane. min_left_pane_width = 0 max_left_pane_width = 3000 layout_template = Template("""
{{this.left_pane|safe}}
{{this.right_pane|safe}}
""") + TemplateRenderer.help_template def Layout(self, request, response): """Layout.""" self.id = self.id or request.REQ.get("id", hash(self)) # Pre-render the top and bottom layout contents to avoid extra round trips. self.left_pane = self.classes[self.left_renderer]( id="%s_leftPane" % self.id, state=self.state.copy()).RawHTML(request) self.right_pane = self.classes[self.right_renderer]( id="%s_rightPane" % self.id, state=self.state.copy()).RawHTML(request) response = super(Splitter2WayVertical, self).Layout(request, response) return self.CallJavascript(response, "Splitter2WayVertical.Layout", min_left_pane_width=self.min_left_pane_width, max_left_pane_width=self.max_left_pane_width) def DeriveIDFromPath(path): """Transforms path into something that can be used as a HTML DOM ID. This transformation never needs to be reversed so it needs the following properties: - A filename must always have a unique DOM id. - The dom id should be similar to the filename for simple ASCII filenames. - Invalid characters in DOM Ids should be transformed to valid ones. Args: path: A fully qualified path. Returns: A string suitable for including in a DOM id. """ # This regex selects invalid characters invalid_chars = re.compile("[^a-zA-Z0-9]") components = path.split("/") return "_" + "-".join([invalid_chars.sub(lambda x: "_%02X" % ord(x.group(0)), x) for x in components if x]) class ErrorRenderer(TemplateRenderer): """Render Exceptions.""" def Layout(self, request, response): response = self.CallJavascript(response, "ErrorRenderer.Layout", value=request.REQ.get("value", "")) class EmptyRenderer(TemplateRenderer): """A do nothing renderer.""" layout_template = Template("") class ConfirmationDialogRenderer(TemplateRenderer): """Renderer used to render confirmation dialogs.""" # If this is True, the container div won't have "modal-dialog" class. This is # useful when we want to render the dialog inside existing modal dialog, # because having 2 nested divs both having "modal-dialog" class confuses # Bootstrap. inner_dialog_only = False header = None cancel_button_title = "Close" proceed_button_title = "Proceed" # If check_access_subject is not None, ConfirmationDialogRenderer will first # do an Ajax call to a CheckAccess renderer to obtain proper token and only # then will do an update. check_access_subject = None # This is supplied by subclasses. Contents of this template are rendered # between
tags and when 'Proceed' button is pressed, # contents of the form get sent with the AJAX request and therefore # can be accessed through request.REQ from RenderAjax method. content_template = Template("") layout_template = Template("""
""") @property def rendered_content(self): return self.FormatFromTemplate(self.content_template, unique=self.unique) def Layout(self, request, response): super(ConfirmationDialogRenderer, self).Layout(request, response) return self.CallJavascript( response, "ConfirmationDialogRenderer.Layout", check_access_subject=utils.SmartStr(self.check_access_subject or "")) class ImageDownloadRenderer(TemplateRenderer): """Baseclass for renderers which simply transfer an image graphic.""" content_type = "image/png" def Content(self, request, response): _ = request, response return "" def Download(self, request, response): response = http.HttpResponse(content=self.Content(request, response), content_type=self.content_type) return response def JsonDumpForScriptContext(dump_object): """Dump an object to json, encoding safely for code when error // happens. We handle this here. $(document.body).append(data); data = { message: grr._lastError, traceback: grr._lastBacktrace }; } } else { var data = {message: 'Server Error', traceback: jqXHR.responseText}; } if (!on_error) { if (jsonData) { grr.publish('grr_error', { message: data.message, traceBack: data.traceBack }); } } else { on_error(data); } } }, success: function(data, status, jqXHR) { if (grr.GetFromAjaxQueue(inflight_key) === jqXHR) { // Remove the lock for this domId grr.RemoveFromAjaxQueue(inflight_key); // Load the new table DOM on_success(data); } } }); // Create a lock on this domId to prevent another ajax call while // this one is inflight. grr.PushToAjaxQueue(inflight_key, xhr); }; /** * Function to update a dom node via an AJAX call to a renderer. Please note * that if on_success handler is specified, AJAX response is not htmled into * the container div. * * This is similar to the grr.layout() method but it calls the RenderAjax method * and is suitable to repeatedly being applied to the same element. * * @param {string} renderer The rernderer name to call via ajax. * @param {string} domId The element which will host the html. * @param {Object=} opt_state A data object which will be serialiased into the * AJAX request (as query parameters). * @param {Function=} on_success If provided this function will be called on * completion. * @param {string} inflight_key The key to use for the inflight queue. If null, * we use the domId. * @param {Function=} on_error If provided this function will be called on * errors. * @param {string} method_name If provided we call this method (default * RenderAjax). */ grr.update = function(renderer, domId, opt_state, on_success, inflight_key, on_error, method_name) { if (!on_success) { on_success = function(data) { $('#' + domId).html(data); grr.publish('on_renderer_load', domId); }; } grr._update(renderer, domId, opt_state, on_success, inflight_key, on_error, method_name || 'RenderAjax'); }; /** * Lays out a GRR object by rendering the object into a div. Please note that * layout() always puts received html into a container div, no matter if * on_success handler is specified or not. * * @param {string} renderer The renderer name to call via ajax. * @param {string} domId The element which will host the html. * @param {Object=} opt_state A data object which will be serialiased into * the AJAX request (as query parameters). * @param {Function=} on_success If provided this function will be called on * completion. */ grr.layout = function(renderer, domId, opt_state, on_success) { success_handler = function(data) { $('#' + domId).html(data); grr.publish('on_renderer_load', domId); if (on_success) { on_success(domId); } }; $('#' + domId).html("

Loading...

"); grr._update(renderer, domId, opt_state, success_handler, '#' + domId, null, 'Layout'); }; /** * Create the popup menu dialog. * * @param {string} renderer The renderer used to render the element. * @param {string} domId The element we attach the events to. * @param {string} openerId The id of the element acting as an opener. * @param {Object=} opt_options dialog options. */ grr.dialog = function(renderer, domId, openerId, opt_options) { // Create the dialog $('#' + openerId).click(function() { var dialog = $('#' + domId); if (dialog.is(':visible')) { dialog.modal('hide'); } else { grr.layout(renderer, domId); dialog.modal('show'); } return false; }); }; /** * Sumbits a form to a renderer. * * @param {string} renderer The renderer to submit to. * @param {string} formId The form to submit. * @param {string} resultId The renderer will render to this div. * @param {string=} opt_state Optional state to merge with the form (default * grr.state). * @param {Function=} opt_refreshMethod Optional method for refresh (default * grr.layout). * @return {boolean} false. */ grr.submit = function(renderer, formId, resultId, opt_state, opt_refreshMethod) { var new_state = {}; var method = opt_refreshMethod || grr.layout; var state = opt_state || grr.state; /* Also support any select tags */ $('#' + formId + ' input, select').each(function() { var name = this.name; var value = $(this).val(); if (name && value) { if (this.type == 'checkbox') { // Check boxes need to be read like this. value = $(this).attr('checked') ? 'true' : 'false'; // Multiple checkboxes can be concatenated to the same name. if (!(name in new_state)) { new_state[name] = value; } else { new_state[name] += ',' + value; } } else { new_state[name] = value; } } }); /* Merge the global state into the form. */ $.extend(new_state, state || grr.state); // Now send this to the renderer and put the result on result_id method(renderer, resultId, new_state); return false; }; /** * Updates the form from an object. * * @param {string} formId The form to update. * @param {Object=} state Optional state to merge with the form (default * grr.state). */ grr.update_form = function(formId, state) { $('#' + formId + ' input, select').each(function() { if (state[this.name]) { // Make sure the change event is fired after the value changed. $(this).val(state[this.name]).change(); } }); }; /** * Parses the location bar's #hash value into an object. * * @param {Object=} hash Optional hash to be parsed. If not passed, * window.location.hash will be parsed instead. * @return {Object} an associative array of encoded values. */ grr.parseHashState = function(hash) { if (!hash) { hash = window.location.hash; } if (hash.indexOf('#') == 0) { hash = hash.substr(1); } var result = {}; var parts = hash.split('&'); for (var i = 0; i < parts.length; i++) { var kv = parts[i].split('='); if (kv[0] && kv[1]) { result[kv[0]] = decodeURIComponent(kv[1].replace(/\+/g, ' ') || ''); } } return result; }; /** * Install the navigation actions on all items in the navigator. */ grr.installNavigationActions = function() { $('#navigator li a[grrtarget]').each(function() { var renderer = $(this).attr('grrtarget'); $(this).click(function() { grr.layout(renderer, 'main'); grr.publish('hash_state', 'main', renderer); // Clear all the other selected links $('#navigator li').removeClass('active'); // Make this element selected $(this).parent().addClass('active'); return false; }); }); }; /** * Load the main content pane from the hash provided. * * @param {string=} opt_hash to load from. If null, use the current window hash. */ grr.loadFromHash = function(opt_hash) { if (opt_hash) { window.location.hash = opt_hash; } }; /** * Store the state of the foreman form. * * @param {Object} state of the foreman form. * */ grr.foreman = {regex_rules: 0, action_rules: 0}; /** * Adds another condition stanza to the Foreman rule form. * * @param {Object} defaults value filled in from the server filling in the js * template. */ grr.foreman.add_condition = function(defaults) { defaults.rule_number = grr.foreman.regex_rules; $('#addRuleTemplate').tmpl(defaults).appendTo('#ForemanFormRuleBody'); grr.foreman.regex_rules += 1; }; /** * Adds another action stansa to the Foreman rule form. * * @param {Object} defaults value filled in from the server filling in the js * template. */ grr.foreman.add_action = function(defaults) { defaults.rule_number = grr.foreman.action_rules; $('#addActionTemplate').tmpl(defaults).appendTo('#ForemanFormActionBody'); grr.foreman.action_rules += 1; }; /** * This is the hexview object. */ grr.hexview = {}; /** * Builds the hexview HTML inside the dom. * * @param {string} domId the id of the node to build this inside. * @param {number} width The number of columns to have in the hexview. * @param {number} height The number of rows to have in the hexview. * */ grr.hexview.BuildTable = function(domId, width, height) { var table = $($('#HexTableTemplate').html()); // Insert the offset headers var layout = ''; for (var i = 0; i < width; i++) { layout += ('' + grr.hexview.ZeroPad(i.toString(16), 2) + ''); } $(layout).insertAfter(table.find('#offset')); // Insert the offset column var layout = ''; for (var i = 0; i < height; i++) { layout += ('' + '0x00000000'); } $(layout).appendTo(table.find('#offset_area table')); // Insert the cells var layout = ''; var count = 0; for (var i = 0; i < height; i++) { layout += ''; for (var j = 0; j < width; j++) { layout += ('  '); count += 1; } layout += '/'; } table.find('#hex_area').attr('colspan', width); $(layout).insertAfter(table.find('#hex_area table')); // Insert printable data var layout = ''; var count = 0; for (var i = 0; i < height; i++) { layout += ''; for (var j = 0; j < width; j++) { layout += (' '); count += 1; } layout += '/'; } $(layout).insertAfter(table.find('#data_area table')); $('#' + domId).html(table); }; /** * A utility function to zero pad strings. * @param {string} string_value the string to interpolate. * @param {number} limit is the total width of the string. * @return {string} An interporlated string. */ grr.hexview.ZeroPad = function(string_value, limit) { while (string_value.length < limit) { string_value = '0' + string_value; } return string_value; }; /** * Populate the hexviewer table with data. * @param {number} offset is the initial offset of the array. * @param {number} width is the number of cells in each row. * @param {Array} values is an array of values to go into each cell of the view. */ grr.hexview._Populate = function(offset, width, values) { // Update the offsets. $('[id^=offset_value_]').each(function(index, element) { var string_value = (offset + index * width).toString(16); $(element).text('0x' + grr.hexview.ZeroPad(string_value, 8)); }); // Clear cells $('[id^=cell_]').html('  '); // Update the cells for (var i = 0; i < values.length; i++) { var value = parseInt(values[i]); var string_value = value.toString(16); $('#cell_' + i).text(grr.hexview.ZeroPad(string_value, 2)); } // Clear data $('[id^=data_value_]').html(' '); // Update the data for (var i = 0; i < values.length; i++) { var value = parseInt(values[i]); var string_value = '.'; if (value > 31 && value < 128) { string_value = String.fromCharCode(value); } $('#data_value_' + i).text(string_value); } }; /** * A helper function to create the slider. * @param {string} renderer The renderer which will be used to interact with the * hexview. * @param {string} domId will receive the new widget. * @param {number} total_size is the total size of the file (for maximum * slider). * @param {number} width is the number of bytes in each row. (The height is * auto detected). * @param {number} height The total number of rows in this hex viewer. * @param {Object} state The state that will be passed to our renderer. */ grr.hexview._makeSlider = function(renderer, domId, total_size, width, height, state) { // Make the slider var slider = $('#slider'); // Round the total size to the next row var total_size = Math.floor(total_size / width + 1) * width; slider.parent('td').attr('rowspan', height); slider.slider({ orientation: 'vertical', min: 0, step: width, value: total_size, max: total_size, change: function(event, ui) { state.offset = total_size - ui.value; state.hex_row_count = height; grr.update(renderer, domId, state, function(data) { // Fill in the table with the data that came back. grr.hexview._Populate(data.offset, width, data.values); }); } }).slider('option', 'value', total_size); // Make the slider take up the full height. slider.height(slider.parent('td').height()); // Bind the mouse wheel on the actual table. $('#hex_area').bind('mousewheel DOMMouseScroll', function(e) { var delta = 0; var element = $('#slider'); var value; value = element.slider('option', 'value'); step = total_size / 100; if (e.wheelDelta) { delta = -e.wheelDelta; } if (e.detail) { delta = e.detail * 40; } value -= delta / 8 * step; if (value > total_size) { value = total_size; } if (value < 0) { value = 0; } element.slider('option', 'value', value); return false; }); }; /** * Builds a hex viewer widget inside the specified domId. * @param {string} renderer The renderer which will be used to interact with the * hexview. * @param {string} domId will receive the new widget. * @param {number} width is the number of bytes in each row. (The height is * auto detected). * @param {Object} state is the state we use for send to our renderer. */ grr.hexview.HexViewer = function(renderer, domId, width, state) { var header_height = $('#hex_header').outerHeight(); if (!header_height) { // First build a small table to see how many rows we can fit. grr.hexview.BuildTable(domId, width, 0); header_height = $('#hex_header').outerHeight(); } var view_port_height = $('#' + domId).height(); // Ensure a minimum of 2 rows. var height = Math.max(Math.floor(view_port_height / header_height), 2); state.hex_row_count = height; // Ask for these many rows from the server. grr.update(renderer, domId, state, function(data) { // Now fill as many rows as we can in the view port. grr.hexview.BuildTable(domId, width, state.hex_row_count); //Fill in the table with the data that came back. grr.hexview._Populate(data.offset, width, data.values); grr.hexview._makeSlider(renderer, domId, data.total_size, width, height, state); }); }; /** * This is the textview object. */ grr.textview = {}; /** * A helper function to create the slider. * @param {string} renderer The renderer which will be used to interact with the * textview. * @param {string} domId will receive the new widget. * @param {number} total_size is the total size of the file (for maximum * slider). * @param {Object} state is the state we use for send to our renderer. */ grr.textview._makeSlider = function(renderer, domId, total_size, state) { // Make the slider var slider = $('#text_viewer_slider'); slider.slider({ orientation: 'horizontal', min: 0, range: true, max: total_size, change: function(event, ui) { grr.textview.Update(renderer, domId, state); }, slide: function(event, ui) { var offset = $(this).slider('values', 0); var size = $(this).slider('values', 1) - offset; $('#text_viewer_offset').val(offset); $('#text_viewer_data_size').val(size); } }).slider('option', 'values', [0, 20000]); }; /** * Issue a request to update content based on current state. * @param {string} renderer The renderer which will be used to interact with the * textview. * @param {string} domId will receive the new widget. * @param {Object} state is the state we use for send to our renderer. */ grr.textview.Update = function(renderer, domId, state) { var state = $.extend({ offset: $('#text_viewer_offset').val(), text_encoding: $('#text_encoding').val(), data_size: $('#text_viewer_data_size').val() }, state); grr.update(renderer, domId, state, function(data) { $('#text_viewer_data').html(data); total_size = parseInt($('#text_viewer_data_content').attr('total_size')); $('#text_viewer_slider').slider('option', 'max', total_size); }); }; /** * Builds a text viewer widget inside the specified domId. * @param {string} renderer The renderer which will be used to interact with the * textview. * @param {string} domId will receive the new widget. * @param {string} default_codec codec to set as default for the widget. * @param {Object} state is the state we use for send to our renderer. */ grr.textview.TextViewer = function(renderer, domId, default_codec, state) { // Create a slider, we don't know how big it should be yet. var default_size = 20000; $('#text_viewer_data_size').val(default_size); $('#text_viewer_offset').val(0); $('#text_encoding option[value=' + default_codec + ']').attr( 'selected', 'selected'); grr.update(renderer, domId, state, function(data) { $('#text_viewer_data').html(data); var total_size = $('#text_viewer_data_content').attr('total_size'); total_size = parseInt(total_size); grr.textview._makeSlider(renderer, domId, total_size, state); var new_size = Math.min(default_size, total_size); $('#text_viewer_data_size').val(new_size); // Add handlers for if someone updates the values manually. $('#text_encoding').change(function() { grr.textview.Update(renderer, domId, state); }); $('#text_viewer_offset').change(function() { $('#text_viewer_slider').slider('values', 0, $(this).val()); }); $('#text_viewer_data_size').change(function() { var offset = $('#text_viewer_slider').slider('values', 0); $('#text_viewer_slider').slider('values', 1, $(this).val() + offset); }); $('#text_viewer_slider').slider('values', 1, new_size); }); }; /** * This is the queue of ajax requests which are currently in flight. If another * query occurs for this same domId, it is canceled until the first request * returns. This makes it safe to fire off ajax requests based on events, since * there can be many requests in flight for the same element. * */ grr.inFlightQueue = {}; //TODO(user): kept for compatibility with legacy JS code. Remove later. /** * Broadcasts an event on the Angular rootScope. * @param eventName {string} The event name * @param data {Object} The event data */ grr.broadcastAngularEvent = function(eventName, data){ if (grr.angularInjector) { var $rootScope = grr.angularInjector.get('$rootScope'); $rootScope.$broadcast(eventName, data); } }; /** * Push an ajax request to the inflight queue so we can display the spinner icon * until this request has completed. * @param {string} element The key to use for this entry. * @param {Object} value The value to store in the queue. * */ grr.PushToAjaxQueue = function(element, value) { grr.inFlightQueue[element] = value; grr.broadcastAngularEvent('grrLoadingStartedEvent', element); }; /** * Remove an ajax request from the inflight queue so we can stop displaying the * spinner icon. * @param {string} element The key to delete from the queue. * */ grr.RemoveFromAjaxQueue = function(element) { delete grr.inFlightQueue[element]; grr.broadcastAngularEvent('grrLoadingFinishedEvent', element); }; /** * Check if there is an outstanding ajax request in the inflight queue. * @param {string} element The key to retrieve from the queue. * @return {Object} The value stored in the queue for key . */ grr.GetFromAjaxQueue = function(element) { return grr.inFlightQueue[element]; }; /** * Add onclick and onchange handlers to an input form field to handle the None * or Auto automatic value. This is used in the Start new flows UI. * @param {Object} node The node to apply the handlers to. */ grr.formNoneHandler = function(node) { // If its the auto value we disable the input. var disabled_color = 'rgb(200, 200, 200)'; var value = node.val(); if (value.toLowerCase() == 'none' || value == 'Auto' || value == '') { node.css('color', disabled_color); node.val('Auto'); } node.focusin(function() { if ($(this).css('color') == disabled_color) { node.css('color', ''); $(this).val(''); } }); node.focusout(function() { var value = $(this).val(); if (value.toLowerCase() == 'none' || value == 'Auto' || value == '') { node.css('color', disabled_color); $(this).val('Auto'); } }); }; /** * Take a file upload form and send the file to the server. * @param {string} renderer Path to the Ajax server handler. * @param {string} formId The input form with the file parameter. * @param {string} progressId Div to write progress to. * @param {function} successHandler Function to call on success. * @param {function} errorHandler Function to call on error. * @param {Object} state is the state we use for send to our renderer. */ grr.uploadHandler = function(renderer, formId, progressId, successHandler, errorHandler, state) { var formData = new FormData($('#' + formId)[0]); // Include our state in the form post. $.each(state, function(key, val) { formData.append(key, val); }); $('#' + progressId).progressbar(); var progressHandlingFunction = function(e) { if (e.lengthComputable) { $('#' + progressId).progressbar('value', (e.loaded / e.total) * 100); } }; $.ajax({ url: 'render/RenderAjax/' + renderer, type: 'POST', xhr: function() { var myXhr = $.ajaxSettings.xhr(); if (myXhr.upload) { // Special html5 handler for upload progress. myXhr.upload.addEventListener('progress', progressHandlingFunction, false); } return myXhr; }, success: successHandler, error: errorHandler, data: formData, //Tell JQuery not to process data or worry about content-type. cache: false, contentType: false, processData: false }); }; /** * Attach a download file handler to the click of a node. * @param {string} clickNode DomID that we will attach the handler to. * @param {Object} state is the state we use for send to our renderer. * @param {boolean} safe_extension should the downloaded file have .noexec * added. * @param {string} url URL to post to. * @param {string} target The target for the form, defaults to "_blank". */ grr.downloadHandler = function(clickNode, state, safe_extension, url, target) { // Create a temporary form to post to the download page with. clickNode.find('form').remove(); // remove any previous hidden forms. if (target == null) { target = '_blank'; } var tmpform = $('
').appendTo(clickNode); tmpform.attr({action: url, method: 'post'}); $.each(state, function(key, val) { $('').attr({name: key, value: val}).appendTo(tmpform); }); var csrf = grr.getCookie('csrftoken'); $('').val(csrf).appendTo(tmpform); if (safe_extension) { var safe_ext = $(''); safe_ext.val(safe_extension).appendTo(tmpform); } clickNode.unbind('click').click(function() { tmpform.submit(); }); clickNode.bind('download', function() { tmpform.submit(); }); }; /** * Determine if a method is safe to add CSRF token to. * As per https://docs.djangoproject.com/en/1.4/ref/contrib/csrf/#using-csrf * @param {string} method Method the request uses. * @return {boolean} whether or not the method is safe from csrf. **/ grr.csrfSafeMethod = function(method) { // these HTTP methods do not require CSRF protection. return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); }; /** * Helper function to retrieve the value of a cookie, in lieu of an extra * dependency on jquery.cookie. * @param {string} name The cookie we want the value for. * @return {string} value of the cookie. */ grr.getCookie = function(name) { var cookieValue = null; if (document.cookie && document.cookie != '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = jQuery.trim(cookies[i]); // Does this cookie string begin with the name we want? if (cookie.substring(0, name.length + 1) == (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; }; /** * Set a tooltip on the search box. * @param {string} clickNode DomID that we will attach the tooltip to. */ grr.enableSearchHelp = function(clickNode) { var help_content = 'Search by hostname, username, id or MAC
' + 'Limit scope using mac: host: label: fqdn: ip: or user:
e.g.' + ' user:sham
Regex is supported
e.g. test1[2-5].*\.' + 'example.com$'; var popover_opts = {'placement': 'bottom', 'title': help_content, 'container': 'body', 'trigger': 'hover', 'html': true }; $(clickNode).tooltip(popover_opts).click(function(e) { e.preventDefault(); }); }; /** * Pushes the state from the Javascript state dict to html tags. * @param {string} domId of the widget which will receive the state. * @param {Object} state The state to push. */ grr.pushState = function(domId, state) { keys = Object.keys(state); attrs = {}; for (var i = 0; i < keys.length; i++) { attrs['state-' + keys[i]] = state[keys[i]]; } $('#' + domId).attr(attrs); }; /** Initialize the grr object */ grr.init(); /** * Initialize Angular GRR app. AngularJS has no problems coexisting with * existing set of GRR renderers. */ var grrUiApp = angular.module('grrUi', ['ngCookies', 'grrUi.appController', 'grrUiLocal.local']); grrUiApp.config(function($httpProvider, $interpolateProvider, $rootScopeProvider) { // Set templating braces to be '{$' and '$}' to avoid conflicts with Django // templates. $interpolateProvider.startSymbol('{$'); $interpolateProvider.endSymbol('$}'); // Ensuring that Django plays nicely with Angular-initiated requests // (see http://www.daveoncode.com/2013/10/17/how-to- // make-angularjs-and-django-play-nice-together/). $httpProvider.defaults.headers.post[ 'Content-Type'] = 'application/x-www-form-urlencoded'; $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; // We use recursive data model generation when rendering forms. Therefore // have to increase the digestTtl limit to 50. $rootScopeProvider.digestTtl(50); }); grrUiApp.run(function($injector, $http, $cookies, grrReflectionService) { grr.angularInjector = $injector; // Ensure CSRF token is in place for Angular-initiated HTTP requests. $http.defaults.headers.post['X-CSRFToken'] = $cookies.get('csrftoken'); $http.defaults.headers.delete = { 'X-CSRFToken': $cookies.get('csrftoken') }; // Call reflection service as soon as possible in the app lifetime to cache // the values. "ACLToken" is picked up here as an arbitrary name. // grrReflectionService loads all RDFValues definitions on first request // and then caches them. grrReflectionService.getRDFValueDescriptor('ACLToken'); }); /** * TODO(user): Remove when dependency on jQuery-migrate is removed. */ jQuery.migrateMute = true; /** * Hardcoding jsTree themes folder so that it works correctly when used * from a JS bundle file. */ $.jstree._themes = '/static/third-party/jstree/themes/'; grr-3.1.0.2/grr/gui/static/javascript/grr_test.js000066400000000000000000000124571273104013200216510ustar00rootroot00000000000000/* Copyright 2011 Google Inc. All Rights Reserved. */ /** * @fileoverview Tests for GRR frontend. */ /** * Make sure that the jQuery ajax handler refuses to work if the server does not * use XSSI protections. */ function testXSSIprotection() { grr.init(); // This should be ok var result = jQuery.parseJSON(')]}\n[]'); assertEquals(result.length, 0); // This should fail try { jQuery.parseJSON('hello'); } catch (e) { return; } fail('No Exception thrown by parseJSON'); } /** * Check that publish/subscribe mechanism works. We publish one event and check * that two subscribers are notified. */ function testSubscribePublish() { grr.init(); var success = false; var success2 = false; return; // Make a div to hang the callbacks on $('#test').append('
Hello
'); // Subscribe to the event grr.subscribe('testqueue_sp', function(value, event, data) { assertEquals(value, 'value'); assertEquals(event, 'event'); assertEquals(data, 'data'); success = true; }, 'testSubscribePublish'); // Subscribe again to the event grr.subscribe('testqueue_sp', function(value, event, data) { assertEquals(value, 'value'); assertEquals(event, 'event'); assertEquals(data, 'data'); success2 = true; }, 'testSubscribePublish'); // Now publish the event grr.publish('testqueue_sp', 'value', 'event', 'data'); assertTrue(success); assertTrue(success2); // Remove the node from the DOM $('#test').html(''); success = false; // Test that now events do not fire grr.publish('testqueue_sp', 'value', 'event', 'data'); assertFalse(success); } /** * Check that the grr.layout function updates a dom element from a renderer. */ function testLayout() { var renderer = 'TestRenderer'; var domId = 'test'; var state = {id: domId}; // Mock out the ajax call $.ajax = function(options) { assertEquals(options.url, 'render/Layout/TestRenderer'); assertEquals(options.data.id, domId); // Just call the success callback directly: options.success('foobar'); }; // Make the call grr.layout(renderer, domId, state); // Check that the dom was updated var node = $('#test'); assertEquals(node.html(), 'foobar'); } /** * Check that the tree widget refreshes from a renderer and publishes selection * events. */ function testTree() { var state = {}; var renderer = 'TestRenderer'; var domId = 'test'; var tree_created = false; var select_handler = false; var path_selected = false; grr.init(); grr.bind_dict = {}; // Mock jstree $.fn.jstree = function(opts) { assertEquals(opts.json_data.ajax.url, 'render/RenderAjax/TestRenderer'); tree_created = true; }; // Check that the select event was bound. Save the handler so we can call it // directly later. $.fn.bind = function(event, handler) { grr.bind_dict[event] = handler; }; // Set up a subscriber for tree selection grr.subscribe('testqueue_t', function(value, event, data) { assertEquals(value, '/test/test'); path_selected = true; }, 'body'); // Make the tree grr.grrTree(renderer, domId, 'testqueue_t', state); // data emulates a dom element. NOTE- we rely on the server to set a path // attribute for each element - can we do this automatically in javascript? var data = {}; data.args = {}; data.inst = {}; data.inst.get_path = function(obj) { return ['test', 'test']; }; data.rslt = {}; // Mock a select event grr.bind_dict['select_node.jstree']('event', data); // Check that the tree was created and selection worked. assertTrue(tree_created); assertTrue(path_selected); } /** * Check that previously set timers are cleared. */ function testDelayedSubscribe() { var timer_ids = {}; var _setTimeout = window.setTimeout; var _clearTimeout = window.clearTimeout; var timer_cleared = false; var time_delay = 500; var subscribe_called = false; grr.init(); // We subscribe this function grr.delayedSubscribe('testqueue_ds', time_delay, 'unique_id', function(value, event, data) { assertEquals(value, 'value'); assertEquals(event, 'event'); assertEquals(data, 'data'); subscribe_called = true; }); // Below we simulate an event, then a short time later another event (before // the delay). The first event should be cleared and the second should fire. window.setTimeout = function(handle, delay) { return 'First'; }; // This should not be called first time window.clearTimeout = null; // First event published - should schedule the first timer grr.publish('testqueue_ds', 'value', 'event', 'data'); // Handler should not be called yet assertFalse(subscribe_called); // Second event published should clear the first timer, set a second timer, // and directly call it. window.setTimeout = function(timer, delay) { assertEquals(delay, time_delay * 1000); // Just call the handler right away if (timer) { timer(); } return 'Second'; }; window.clearTimeout = function(timer) { assertEquals(timer, 'First'); timer_cleared = true; }; grr.publish('testqueue_ds', 'value', 'event', 'data'); // Check everything assertTrue(timer_cleared); assertTrue(subscribe_called); // Restore the mocks window.setTimeout = _setTimeout; window.clearTimeout = _clearTimeout; } grr-3.1.0.2/grr/gui/static/javascript/plugins/000077500000000000000000000000001273104013200211325ustar00rootroot00000000000000grr-3.1.0.2/grr/gui/static/javascript/plugins/acl_manager.js000066400000000000000000000073631273104013200237320ustar00rootroot00000000000000var grr = window.grr || {}; grr.Renderer('UnauthorizedRenderer', { Layout: function(state) { var subject = state.subject; var message = state.message; grr.publish('unauthorized', subject, message); grr.publish('grr_messages', { message: message }); } }); grr.Renderer('ACLDialog', { Layout: function(state) { $('#acl_dialog_submit').click(function(event) { $('#acl_form form').submit(); }); grr.subscribe('unauthorized', function(subject, message) { if (subject) { grr.layout('CheckAccess', 'acl_form', {subject: subject}); } }, 'acl_dialog'); } }); grr.Renderer('GrantAccess', { Layout: function(state) { var unique = state.unique; var renderer = state.renderer; var acl = state.acl; var details_renderer = state.details_renderer; $('#' + unique + '_approve').click(function() { grr.update(renderer, unique + '_container', { acl: acl }); }); grr.layout(details_renderer, 'details_' + unique, { acl: acl }); }, RefreshFromHash: function(state) { var renderer = state.renderer; var id = state.id; var hashState = grr.parseHashState(); hashState.source = 'hash'; grr.layout(renderer, id, hashState); } }); grr.Renderer('CheckAccess', { Layout: function(state) { var unique = state.unique; var subject = state.subject; var refresh_after_form_submit = state.refresh_after_form_submit; var approval_renderer = state.approval_renderer; $('#acl_form_' + unique).submit(function(event) { var reason = $('#acl_recent_reasons').val(); if (reason == 'new_reason') { reason = $('#acl_reason').val(); } if ($.trim(reason) == '') { $('#acl_reason_warning').show(); event.preventDefault(); return; } var state = { subject: subject, approver: $('#acl_approver').val(), reason: reason }; if ($('#acl_keepalive').is(':checked')) { state['keepalive'] = 'yesplease'; } if ($('#acl_cc_approval').is(':checked')) { state['cc_approval'] = 'yesplease'; } // When we complete the request refresh to the main screen. grr.layout(approval_renderer, 'acl_server_message', state, function() { if (refresh_after_form_submit) { window.location = '/'; } else { $('#acl_dialog').modal('hide'); } }); event.preventDefault(); }); $('#acl_recent_reasons').change(function() { if ($('#acl_recent_reasons').val() == 'new_reason') { $('#acl_reason').attr('disabled', false); } else { $('#acl_reason').attr('disabled', true); } }); if ($('#acl_dialog[aria-hidden=false]').size() == 0) { $('#acl_dialog').detach().appendTo('body'); // TODO(user): cleanup a bit. We use update_on_show attribute in // NewHunt wizard to avoid reloading the modal when it's hidden and shown // again because ACL dialog interrupted the UI flow. var openedModal = $('.modal[aria-hidden=false]'); openedModal.attr('update_on_show', 'false'); openedModal.modal('hide'); // Also handle AngularJS modals. $('.modal-dialog[ng-class]').each(function() { $(this).scope().$parent.$dismiss(); }); // Allow the user to request access through the dialog. $('#acl_dialog').modal('toggle'); } }, AccessOk: function(state) { var reason = state.reason; var silent = state.silent; grr.publish('hash_state', 'reason', reason); grr.state.reason = reason; if (!silent) { grr.publish('client_selection', grr.state.client_id); } } }); grr-3.1.0.2/grr/gui/static/javascript/plugins/artifact_view.js000066400000000000000000000315031273104013200243210ustar00rootroot00000000000000var grr = window.grr || {}; /** * Namespace for artifacts. */ grr.artifact_view = {}; grr.Renderer('ArtifactRDFValueRenderer', { Layout: function(state) { var unique = state.unique; var artifact_str = state.artifact_str; var description_element = unique + '_artifact_description'; var artifact_obj = JSON.parse(artifact_str); grr.artifact_view.renderArtifactFromObject(artifact_obj, description_element); // Remove heading to clean up display. $('div[name=artifact_name]').hide(); } }); grr.Renderer('ArtifactManagerToolbar', { Layout: function(state) { var unique = state.unique; $('#upload_dialog_' + unique).on('show.bs.modal', function() { grr.layout('ArtifactJsonUploadView', 'upload_dialog_body_' + unique); }); $('#delete_confirm_dialog_' + unique).on('show.bs.modal', function() { grr.layout('DeleteArtifactsConfirmationDialog', 'delete_confirm_dialog_' + unique); }); } }); grr.Renderer('ArtifactListRenderer', { Layout: function(state) { // Populate the artifact manager. var selected_list_element = state.prefix; var artifact_list_element = state.unique + '_artifact_list'; var os_filter_element = state.unique + '_os_filter'; var search_element = state.unique + '_search'; var description_element = state.unique + '_artifact_description'; var artifact_div = $('#' + state.unique + '_artifact_renderer'); var artifact_data = artifact_div.data(); artifact_data.selected_list_element = selected_list_element; artifact_data.artifact_list_element = artifact_list_element; artifact_data.description_element = description_element; artifact_data.os_filter_element = os_filter_element; artifact_data.search_element = search_element; artifact_data.artifacts = state.artifacts; artifact_data.labels = state.labels; // Add all artifacts to list to start. $.each(state.artifacts, function(artifact_name, value) { grr.artifact_view.artifact_manager.add(artifact_div, artifact_name); }); // Add all OS options to os filter. state.supported_os.push('All'); $.each(state.supported_os, function(artifact_name, value) { grr.artifact_view.list_manager.add(os_filter_element, value); }); grr.artifact_view.updateFilter(artifact_div); // Search Handler. $('#' + state.unique + '_search').keyup(function() { grr.artifact_view.updateFilter(artifact_div); }); $('#' + os_filter_element).change(function() { grr.artifact_view.updateFilter(artifact_div); }); // Artifact Handlers // Add on doubleclick. $('#' + artifact_list_element).dblclick(function() { grr.artifact_view.artifact_manager.add_selected(artifact_div, [this.value]); grr.forms.selectOnChange('#' + selected_list_element); }); // Add all. $('#' + state.unique + '_artifact_add_all').click(function() { var all_opts = $('#' + artifact_list_element + ' option'); var all_opts_vals = []; all_opts.each(function(index, value) { all_opts_vals.push(value.value); }); grr.artifact_view.artifact_manager.add_selected(artifact_div, all_opts_vals); grr.forms.selectOnChange('#' + selected_list_element); }); // Add. $('#' + state.unique + '_artifact_add').click(function() { var selected = $('#' + artifact_list_element).val(); grr.artifact_view.artifact_manager.add_selected(artifact_div, selected); grr.forms.selectOnChange('#' + selected_list_element); }); // Render Artifact information on select. $('#' + artifact_div.data('description_element')).hide(0); var select_elements = $('#' + artifact_list_element + ',#' + selected_list_element); select_elements.on('change select', function() { grr.artifact_view.renderArtifactFromDom(artifact_div, this.value, description_element); }); // Select List Handlers // Remove on doubleclick. $('#' + selected_list_element).dblclick(function() { grr.artifact_view.artifact_manager.remove_from_selection(artifact_div, this.value); }); // Remove. $('#' + state.unique + '_select_remove').click(function() { var selected = $('#' + selected_list_element).val(); grr.artifact_view.artifact_manager.remove_from_selection(artifact_div, selected); grr.forms.selectOnChange('#' + selected_list_element); }); // Clear. $('#' + state.unique + '_select_clear').click(function() { grr.artifact_view.artifact_manager.clear(artifact_div); grr.forms.selectOnChange('#' + selected_list_element); }); } }); /** * Update list of artifacts based on filter options. * * @param {object} artifact_div The div containing the artifact renderer. * */ grr.artifact_view.updateFilter = function(artifact_div) { var search_string = $('#' + artifact_div.data('search_element')).val(); var os_filter = $('#' + artifact_div.data('os_filter_element')).val(); grr.artifact_view.artifact_manager.filter(artifact_div, search_string, os_filter); }; /** * Renders an artifact into an element from an initialized artifact dom. * * @param {object} artifact_div The div containing the artifact renderer. * @param {string} artifact_name name of artifact * @param {string} element to write artifact into. */ grr.artifact_view.renderArtifactFromDom = function(artifact_div, artifact_name, element) { artifact = artifact_div.data('artifacts')[artifact_name]; if (! artifact) { return; } $('#' + artifact_div.data('description_element')).show(0); grr.artifact_view.renderArtifactFromObject(artifact, element); }; /** * Renders an artifact into an element. * * @param {object} artifact An object containing the artifact. * @param {string} element to write artifact into. */ grr.artifact_view.renderArtifactFromObject = function(artifact, element) { $('#' + element + ' div[name=artifact_name]').text(artifact.name); $('#' + element + ' div[name=artifact_labels]').text(artifact.labels); var desc_element = $('#' + element + ' div[name=artifact_description]'); // Set text from description, but allow for newlines. var description = desc_element.text(artifact.doc).html(); description = description.replace(/\n/g, '
'); desc_element.html(description); $('#' + element + ' div[name=artifact_conditions]').text(artifact.conditions); $('#' + element + ' div[name=artifact_dependencies]').text(artifact.dependencies); $('#' + element + ' div[name=artifact_supported_os]').text(artifact.supported_os); $('#' + element + ' div[name=artifact_output_type]').text(artifact.output_type); var links_element = $('#' + element + ' div[name=artifact_links]'); links_element.html(''); if (artifact.urls.length > 0) { $.each(artifact.urls, function(index, link) { var link_html = ('' + link + '
'); links_element.append(link_html); }); } var processor_element = '#' + element + ' table[name=artifact_processors]'; $(processor_element + ' tr').remove(); if (artifact.processors && artifact.processors.length > 0) { $.each(artifact.processors, function(index, processor) { processor_row = 'Parser' + processor.name + ''; processor_row += 'Output types' + processor.output_types + ''; processor_row += 'Description' + processor.doc + ''; processor_row += ''; $(processor_element).append(processor_row); }); } else { $(processor_element).append('None'); } var source_element = '#' + element + ' table[name=artifact_sources]'; $(source_element + ' tr').remove(); if (artifact.sources.length > 0) { $.each(artifact.sources, function(index, source) { source_row = 'Type' + source.type + ''; $.each(source.attributes, function(name, value) { if ($.isArray(value)) { value = value.join('
'); } source_row += 'arg:' + name + '' + value + ''; }); source_row += ''; $(source_element).append(source_row); }); } else { $(source_element).append('None'); } $('#' + element + ' td:first-child').addClass('proto_key'); $('#' + element + ' td:nth-child(2)').addClass('proto_value'); }; /** * Select List Manager object for handling a multi-select box. */ grr.artifact_view.list_manager = {}; /** * Add an element to the list. * * @param {string} domId The id of the select element to add to. * @param {string} value The primary value for the object. * @param {object} value_object Object to associate with the value. * */ grr.artifact_view.list_manager.add = function(domId, value, value_object) { var data = $('#' + domId).data(); if (!(value in data)) { var row = ''; $('#' + domId).append(row); data[value] = value_object; } }; /** * Remove an element from the list. * * @param {string} domId The id of the select element to remove from. * @param {string} value The primary value for the object to remove. * */ grr.artifact_view.list_manager.remove = function(domId, value) { if (value) { $('#' + domId + ' option[value=' + value + ']').remove(); $('#' + domId).removeData(value); } }; /** * Clear the list. * * @param {string} domId The id of the select element to update to. * */ grr.artifact_view.list_manager.clear = function(domId) { $('#' + domId).html(''); $('#' + domId).removeData(); }; /** * Artifact Manager helper object and functions. */ grr.artifact_view.artifact_manager = {}; /** * Add an element to the artifact list. * * @param {object} artifact_div The div containing the artifact renderer. * @param {string} artifact_name The name of the artifact. * */ grr.artifact_view.artifact_manager.add = function(artifact_div, artifact_name) { var artifact_list = artifact_div.data('artifact_list_element'); grr.artifact_view.list_manager.add(artifact_list, artifact_name, [artifact_div.data('artifacts')[artifact_name].description]); }; /** * Add artifacts to the selected list. * * @param {object} artifact_div The div containing the artifact renderer. * @param {string} artifact_names The names of the artifacts to add. * */ grr.artifact_view.artifact_manager.add_selected = function(artifact_div, artifact_names) { $.each(artifact_names, function(index, artifact_name) { var artifact = artifact_div.data('artifacts')[artifact_name]; if (artifact) { grr.artifact_view.list_manager.add( artifact_div.data('selected_list_element'), artifact_name, [artifact.doc]); } }); }; /** * Remove artifact from the selected list. * * @param {object} artifact_div The div containing the artifact renderer. * @param {string} artifact_name The name of the artifact to remove. * */ grr.artifact_view.artifact_manager.remove_from_selection = function( artifact_div, artifact_name) { grr.artifact_view.list_manager.remove( artifact_div.data('selected_list_element'), artifact_name); }; /** * Clear the selected artifact list. * * @param {object} artifact_div The div containing the artifact renderer. * */ grr.artifact_view.artifact_manager.clear = function(artifact_div) { grr.artifact_view.list_manager.clear( artifact_div.data('selected_list_element')); }; /** * Filter artifact list by search string. * * @param {object} artifact_div The div containing the artifact renderer. * @param {string} search_string String to search artifact properties for. * @param {string} os The OS to limit to, if Any, do no filtering. * */ grr.artifact_view.artifact_manager.filter = function(artifact_div, search_string, os) { var artifact_list = artifact_div.data('artifact_list_element'); grr.artifact_view.list_manager.clear(artifact_list); var artifact_temp = []; var search_string = search_string.toLowerCase(); $.each(artifact_div.data('artifacts'), function(artifact_name, artifact) { // Filter based on supported_os. if ((artifact.supported_os.length == 0) || ($.inArray(os, artifact.supported_os) >= 0)) { // Filter based on search string. if (artifact.doc.toLowerCase().search(search_string) != -1 || artifact_name.toLowerCase().search(search_string) != -1) { artifact_temp.push(artifact_name); } $.each(artifact.labels, function(index, label_name) { if (label_name.toLowerCase().search(search_string) != -1) { artifact_temp.push(artifact_name); return false; } }); } }); // Now sort and add them. artifact_temp.sort(); $.each(artifact_temp, function(index, artifact_name) { grr.artifact_view.artifact_manager.add(artifact_div, artifact_name); }); }; grr-3.1.0.2/grr/gui/static/javascript/plugins/configuration_view.js000066400000000000000000000011431273104013200253700ustar00rootroot00000000000000var grr = window.grr || {}; grr.Renderer('ConfigFileTableToolbar', { Layout: function(state) { var unique = state.unique; grr.subscribe('file_select', function(aff4_path, age) { var state = {aff4_path: aff4_path}; grr.downloadHandler($('#' + unique + '_download'), state, safe_extension = true, '/render/Download/DownloadView'); }, 'toolbar_' + unique); $('#upload_dialog_' + unique).on('show.bs.modal', function() { grr.layout('ConfigBinaryUploadView', 'upload_dialog_body_' + unique); }); } }); grr-3.1.0.2/grr/gui/static/javascript/plugins/container_viewer.js000066400000000000000000000034021273104013200250320ustar00rootroot00000000000000var grr = window.grr || {}; grr.Renderer('ContainerFileTable', { Layout: function(state) { var id = state.id; var unique = state.unique; var renderer = state.renderer; var container = state.container; //Receive the selection event and emit a path grr.subscribe('select_table_' + id, function(node) { if (node) { var element = node.find('span[aff4_path]'); if (element) { grr.publish('file_select', element.attr('aff4_path')); } } }, unique); // Redraw the table if the query changes grr.subscribe('query_changed', function(query) { grr.layout(renderer, id, { container: container, query: query }); }, unique); } }); grr.Renderer('ContainerToolbar', { Layout: function(state) { var unique = state.unique; $('#export').button().click(function() { $('input#csrfmiddlewaretoken').val(grr.getCookie('csrftoken')); $('input#csv_query').val($('input#query').val()); $('input#csv_reason').val(grr.state.reason); $('#csv_' + unique).submit(); }); grr.subscribe('tree_select', function(path) { $('input#query').val("subject startswith '" + path.replace("'", "\\'") + "/'"); $('#form_' + unique).submit(); }, 'form_' + unique); $('#form_' + unique).submit(function() { query = $('input#query').val(); grr.publish('query_changed', query); return false; }); } }); grr.Renderer('ContainerViewer', { Layout: function(state) { var unique = state.unique; var id = state.id; grr.state.container = grr.hash.container; grr.state.query = grr.hash.query || ''; grr.layout('ContainerToolbar', 'toolbar_' + id); grr.layout('ContainerViewerSplitter', unique); } }); grr-3.1.0.2/grr/gui/static/javascript/plugins/crash_view.js000066400000000000000000000000341273104013200236170ustar00rootroot00000000000000var grr = window.grr || {}; grr-3.1.0.2/grr/gui/static/javascript/plugins/cron_view.js000066400000000000000000000012751273104013200234700ustar00rootroot00000000000000var grr = window.grr || {}; grr.Renderer('CronJobView', { Layout: function(state) { var unique = state.unique; var detailsPanel = $('#FlowDetails_' + unique); var detailsPanelClose = $('#FlowDetailsClose_' + unique); detailsPanelClose.click(function() { detailsPanel.addClass('hide'); }); grr.subscribe('flow_table_select', function(flow_id) { var selectedRow = $('#CronJobView_' + unique + ' tr.row_selected'); detailsPanel.css('top', selectedRow.position().top + 'px'); detailsPanel.removeClass('hide'); grr.layout('ShowFlowInformation', 'FlowDetailsContent_' + unique, {flow: flow_id}); }, unique); } }); grr-3.1.0.2/grr/gui/static/javascript/plugins/fileview.js000066400000000000000000000235351273104013200233120ustar00rootroot00000000000000var grr = window.grr || {}; grr.Renderer('AbstractFileTable', { TableSelection: function(state) { var unique = state.unique; var id = state.id; var renderer = state.renderer; var client_id = state.client_id; //Receive the selection event and emit a path grr.subscribe('select_table_' + id, function(node) { if (node) { var aff4_path = node.find('span[aff4_path]').attr('aff4_path'); var age = node.find('span[age]').attr('age'); grr.publish('file_select', aff4_path, age); } }, unique); grr.subscribe('double_click_table_' + id, function(node) { var is_directory = node.find('img.directory').length > 0; if (is_directory) { var aff4_path = node.find('span[aff4_path]').attr('aff4_path'); var tree_node_id = node.find('span[tree_node_id]').attr('tree_node_id'); grr.publish('update_file_tree', tree_node_id); } }, unique); // Allow the age to be updated for a basename. grr.subscribe('update_age', function(aff4_path, age, age_string) { var cell = $(unique + " span[aff4_path='" + aff4_path + "']") .parents('tr') .find('span[age]'); cell.attr('age', age).text(age_string); grr.publish('file_select', aff4_path, age); }, unique); }, TableVersionDialog: function(state) { var unique = state.unique; grr.subscribe('file_version_select', function(aff4_path) { var layout_state = $.extend({ aff4_path: aff4_path }, grr.state); grr.layout('VersionSelectorDialog', 'version_selector_dialog_' + unique, layout_state); $('#version_selector_dialog_' + unique).modal('show'); }, unique); }, TreeEvent: function(state) { var unique = state.unique; var id = state.id; var renderer = state.renderer; var client_id = state.client_id; grr.subscribe('tree_select', function(aff4_path, selected_id, update_hash) { // Replace ourselves with a new table. grr.layout(renderer, id, { client_id: client_id, aff4_path: aff4_path }); grr.state.tree_path = aff4_path; }, unique); // Allow the table content to be restored from the hash. $("span[aff4_path='" + grr.hash.aff4_path + "']").click(); }, RenderAjax: function(state) { var unique = state.unique; $('img.version-selector').unbind('click').click(function(event) { var aff4_path = $(this).parents('tr').find('span[aff4_path]').attr('aff4_path'); grr.publish('file_version_select', aff4_path); event.stopPropagation(); }); }, Layout: function(state) { grr.ExecuteRenderer('AbstractFileTable.TableSelection', state); grr.ExecuteRenderer('AbstractFileTable.TableVersionDialog', state); grr.ExecuteRenderer('AbstractFileTable.TreeEvent', state); } }); grr.Renderer('FileSystemTree', { Layout: function(state) { var unique = state.unique; var id = state.id; grr.subscribe('update_file_tree', function(tree_node_id) { grr.openTree($('#' + unique), tree_node_id); }, unique); } }); grr.Renderer('Toolbar', { Layout: function(state) { var unique = state.unique; var aff4_path = state.aff4_path; var refresh_id = '#refresh_' + unique; $(refresh_id).click(function() { $(refresh_id).attr('disabled', 'disabled'); grr.layout('UpdateAttribute', 'refresh_action', { aff4_path: aff4_path, attribute: 'CONTAINS' }); }); $('#recursive_refresh_dialog_' + unique).on('show.bs.modal', function() { grr.layout('RecursiveRefreshDialog', 'recursive_refresh_dialog_' + unique, {aff4_path: aff4_path}); }).on('hidden.bs.modal', function() { $(this).html(''); }); $('#rweowned').click(function() { grr.layout('RWeOwned', 'rweowned_dialog'); }); grr.dialog('RWeOwned', 'rweowned_dialog', 'rweowned', { width: '500px', height: 'auto', title: 'Is this machine pwned?' }); // When the attribute is updated, refresh the views grr.subscribe('AttributeUpdated', function(path, attribute) { $(refresh_id).attr('disabled', null); if (attribute == 'CONTAINS') { // Update the table grr.publish('tree_select', path); grr.publish('file_select', path); } }, 'refresh_' + unique); function ListenToBreadcrumbClick(path, fullpath, fullpath_id, path_index) { $('#path_' + path_index).click(function() { grr.publish('tree_select', fullpath); grr.publish('file_select', fullpath); }); } for (var i = 0; i < state.paths.length; ++i) { ListenToBreadcrumbClick(state.paths[i][0], state.paths[i][1], state.paths[i][2], state.paths[i][3]); } } }); grr.Renderer('UpdateAttribute', { Layout: function(state) { grr.poll( 'UpdateAttribute', state.id, function(data) { if (data) { grr.publish('AttributeUpdated', state.aff4_path, state.attribute_to_refresh); return false; } else { return true; } }, state.poll_time, { aff4_path: state.aff4_path, flow_urn: state.flow_urn, attribute_to_update: state.attribute_to_update }, 'json'); } }); grr.Renderer('CertificateRenderer', { Layout: function(state) { $('#certificate_viewer_' + state.unique).click(function() { $(this).find('ins').toggleClass('ui-icon-plus ui-icon-minus'); $(this).find('.contents').toggle(); }).click(); } }); grr.Renderer('DownloadView', { Layout: function(state) { var unique = state.unique; var id = state.id; var renderer = state.renderer; var aff4_path = state.aff4_path; var reason = state.reason; var file_exists = state.file_exists; var age_int = state.age_int; var button = $('#' + unique).button(); var download_button = $('#' + unique + '_2').button(); button.click(function(event) { $('#' + unique).attr('disabled', 'disabled'); grr.layout('UpdateAttribute', unique + '_action', { attribute: 'aff4:content', aff4_type: 'VFSFile', aff4_path: aff4_path, reason: reason, client_id: grr.state.client_id }); event.preventDefault(); }); // When the attribute is updated, refresh the views grr.subscribe('AttributeUpdated', function(path, attribute) { if (attribute == 'aff4:content') { // Update the download screen grr.layout(renderer, id, { aff4_path: path, reason: reason }); } }, unique + '_action'); if (file_exists) { // Attach a handler to the Download button. var file_state = { aff4_path: aff4_path, reason: reason, client_id: grr.state.client_id, age: age_int }; grr.downloadHandler(download_button, file_state, false, '/render/Download/DownloadView'); } } }); grr.Renderer('UploadView', { Layout: function(state) { var unique = state.unique; var upload_handler = state.upload_handler; var upload_state = state.upload_state; var u_button = $('#' + unique + '_upload_button').button(); var u_file = $('#' + unique + '_file'); upload_state.tree_path = grr.state.tree_path; u_button.click(function(event) { grr.uploadHandler( upload_handler, unique + '_form', unique + '_upload_progress', function(dat) { $('#' + unique + '_upload_results').text(dat); }, function(jqxhr, dat, error_val) { var data = jqxhr.responseText; data = $.parseJSON(data.substring(4, data.length)); $('#' + unique + '_upload_results').text(data.msg); }, upload_state ); return false; }); } }); grr.Renderer('AFF4Stats', { Layout: function(state) { var historical_renderer = state.historical_renderer; var historical_renderer_state = state.historical_renderer_state; $('.attribute_opener').click(function() { var jthis = $(this); var ins = jthis.children('ins'); var value = jthis.next('td'); var historical = value.children('.historical_view'); var historical_id = historical.attr('id'); if (ins.hasClass('ui-icon-plus')) { ins.removeClass('ui-icon-plus').addClass('ui-icon-minus'); historical.show(); historical_renderer_state.attribute = jthis.attr('attribute'); grr.layout(historical_renderer, historical_id, historical_renderer_state); value.children('.default_view').hide(); } else { ins.removeClass('ui-icon-minus').addClass('ui-icon-plus'); value.children('.default_view').show(); historical.html('').hide(); } }); } }); grr.Renderer('AFF4ObjectRenderer', { Layout: function(state) { var unique = state.unique; var id = state.id; var event_queue = state.event_queue; var renderer = state.renderer; grr.subscribe(event_queue, function(aff4_path, age) { grr.layout(renderer, id, {aff4_path: aff4_path, age: age}); }, unique); } }); grr.Renderer('VersionSelectorDialog', { Layout: function(state) { var unique = state.unique; var id = state.id; var aff4_path = state.aff4_path; // Receive the selection event and update the age of this aff4 object grr.subscribe('select_table_' + id, function(node) { if (node) { var age = node.find('span[age]').attr('age'); var age_string = node.find('span[age]').text(); grr.publish('update_age', aff4_path, age, age_string); $('.version-selector-dialog').modal('hide'); } }, unique); } }); grr-3.1.0.2/grr/gui/static/javascript/plugins/fileview_widgets.js000066400000000000000000000014711273104013200250330ustar00rootroot00000000000000var grr = window.grr || {}; grr.Renderer('HexView', { Layout: function(state) { var unique = state.unique; var renderer = state.renderer; var table_width = state.table_width; var aff4_path = state.aff4_path; var age = state.age; $('#' + unique).resize(function() { grr.hexview.HexViewer(renderer, unique, table_width, {aff4_path: aff4_path, age: age }); }); $('#' + unique).resize(); } }); grr.Renderer('TextView', { Layout: function(state) { var unique = state.unique; var renderer = state.renderer; var default_codec = state.default_codec; var aff4_path = state.aff4_path; var age = state.age; grr.textview.TextViewer(renderer, unique, default_codec, {aff4_path: aff4_path, age: age }); } }); grr-3.1.0.2/grr/gui/static/javascript/plugins/flow_management.js000066400000000000000000000143741273104013200246440ustar00rootroot00000000000000var grr = window.grr || {}; /** * Namespace for the glob completer. */ grr.glob_completer = {}; /** * A filter function which matches the start of the completion list. * * @param {Array} completions the completion list * @param {string} term is the term to match. * * @return {Array} a list of matches. */ grr.glob_completer.filter = function(completions, term) { var matcher = new RegExp('^' + $.ui.autocomplete.escapeRegex(term), 'i'); return $.grep(completions, function(value) { return matcher.test(value.label || value.value || value); }); }; /** * Build a completer on top of a text input. * * @param {string|Element} element is the DOM id of the text input field or the * DOM element itself. * @param {Array} completions are possible completions for %% sequences. */ grr.glob_completer.Completer = function(element, completions) { if (angular.isString(element)) { element = $('#' + element); } element.bind('keydown', function(event) { if (event.keyCode === $.ui.keyCode.TAB && $(this).data('ui-autocomplete').menu.active) { event.preventDefault(); } }).autocomplete({ minLength: 0, source: function(request, response) { var terms = request.term.split(/%%/); if (terms.length % 2) { response([]); } else { response(grr.glob_completer.filter(completions, terms.pop())); } }, focus: function() { // prevent value inserted on focus return false; }, select: function(event, ui) { var terms = this.value.split(/%%/); // remove the current input terms.pop(); // add the selected item terms.push(ui.item.value); terms.push(''); this.value = terms.join('%%'); // Angular code has to be notificed of the change. $(this).change(); if ($(this).attr('id')) { grr.forms.inputOnChange(this); } return false; } }).wrap(''); }; grr.Renderer('GlobExpressionFormRenderer', { Layout: function(state) { grr.glob_completer.Completer(state.prefix, state.completions); } }); grr.Renderer('FlowManagementTabs', { Layout: function(state) { var unique = state.unique; grr.subscribe('flow_select', function(path) { $('#' + unique).data().state.flow_path = path; $('#' + unique + ' li.active a').click(); }, unique); } }); grr.Renderer('SemanticProtoFlowForm', { Layout: function(state) { var unique = state.unique; var renderer = state.renderer; var id = state.id; $('#submit_' + unique).click(function() { var state = {}; $.extend(state, $('#form_' + unique).data(), grr.state); grr.update(renderer, 'contents_' + unique, state); return false; }); grr.subscribe('flow_select', function(path) { grr.layout(renderer, id, { flow_path: path, client_id: grr.state.client_id, reason: grr.state.reason }); }, unique); }, RenderAjax: function(state) { var dom_node = state.dom_node; var unique = state.unique; var renderer = state.renderer; var id = state.id; $('#' + dom_node + ' .FormBody').html(''); grr.subscribe('flow_select', function(path) { grr.layout(renderer, id, { flow_path: path, client_id: grr.state.client_id, reason: grr.state.reason }); }, unique); }, RenderAjaxError: function(state) { grr.publish('grr_messages', { message: state.error, traceBack: state.error }); } }); grr.Renderer('FlowTabView', { Layout: function(state) { var unique = state.unique; var id = state.id; var renderer = state.renderer; grr.subscribe('flow_table_select', function(path) { grr.layout(renderer, id, {flow: path, client_id: grr.state.client_id}); }, 'tab_contents_' + unique); } }); grr.Renderer('ListFlowsTable', { Layout: function(state) { var unique = state.unique; var id = state.id; var selection_publish_queue = state.selection_publish_queue; $('#cancel_flow_' + unique).click(function() { // Find all selected rows and cancel them. $('#table_' + id).find('tr.row_selected div[flow_id]') .each(function() { var flow_id = $(this).attr('flow_id'); var flow_div_id = $(this).attr('id'); /* Cancel the flow, and then reset the icon. */ grr.layout( 'FlowFormCancelAction', flow_div_id, {flow_id: flow_id}, function() { $('#table_' + id).trigger('refresh'); }); }); }); //Receive the selection event and emit a session_id grr.subscribe('select_table_' + id, function(node) { if (node) { flow = node.find('div[flow_id]').attr('flow_id'); if (flow) { grr.publish(selection_publish_queue, flow); } } }, unique); // Update the flow view from the hash. if (grr.hash.flow) { // This is needed for cases when flow list and flow information are // rendered as parts of the same renderer. In that case the // ShowFlowInformation renderer won't be able to react on the // click because it subscribes for the flow_table_select event after // the code below is executed. grr.subscribe('on_renderer_load', function(rendererId) { // on_renderer_load is called for renderers loaded through // grr.layout and grr.update. No 'on_renderer_load' message will be // published for renderers that are renderered as part of other // renderers. Therefore we check here if we belong to the loaded // renderer's tree. if (unique == rendererId || $('#' + unique).parents('#' + rendererId).length > 0) { $('div[flow_id="' + grr.hash.flow + '"]').parents('tr').click(); } }, unique); } } }); grr.Renderer('FlowPBRenderer', { RenderBacktrace: function() { var name = state.name; $('#hidden_pre_' + name).click(function() { $(this).find('ins').toggleClass('ui-icon-plus ui-icon-minus'); $(this).find('.contents').toggle(); }).click(); } }); grr.Renderer('FlowNotificationRenderer', { Layout: function(state) { var unique = state.unique; $('#' + unique).click(function() { grr.loadFromHash($(this).attr('target_hash')); }); } }); grr-3.1.0.2/grr/gui/static/javascript/plugins/foreman.js000066400000000000000000000000341273104013200231140ustar00rootroot00000000000000var grr = window.grr || {}; grr-3.1.0.2/grr/gui/static/javascript/plugins/forms.js000066400000000000000000000207611273104013200226240ustar00rootroot00000000000000var grr = window.grr || {}; /** * Namespace for forms. */ grr.forms = {}; /** * An onchange function which updates the FormData container. * * @param {Object} element an input element. */ grr.forms.inputOnChange = function(element) { var jthis = $(element); var json_store = jthis.closest('.FormData').data(); json_store[jthis.attr('id')] = jthis.val(); jthis.removeClass('unset'); }; /** * Change handler function for checkboxes which updates the FormData container. * * @param {Object} element an input element. */ grr.forms.checkboxOnChange = function(element) { var jthis = $(element); var json_store = jthis.closest('.FormData').data(); json_store[jthis.attr('id')] = jthis.is(':checked'); jthis.removeClass('unset'); }; /** * Change handler function for select box which updates the FormData container. * * In this setup we want everything in the list box to be considered a value * not just the ones that are selected. Additionally this has be to called * manually, because the onchange only fires on selection, not addition to the * list. * * @param {Object} element an input element. */ grr.forms.selectOnChange = function(element) { var jthis = $(element); var json_store = jthis.closest('.FormData').data(); var all_opts = $(element + ' option'); var all_opts_vals = {}; all_opts.each(function(index, value) { json_store[jthis.attr('id') + '-' + index] = value.value; }); jthis.removeClass('unset'); }; /** * Remove all elements starting with the prefix from an input's FormData * container. * * @param {Object} element an input element. * @param {string} prefix All data members with this prefix will be cleared. */ grr.forms.clearPrefix = function(element, prefix) { var form_data = $(element).closest('.FormData'); if (form_data) { $.each(form_data.data(), function(k, v) { if (k == prefix || k.substring(0, prefix.length + 1) == prefix + '-') { form_data.removeData(k); } }); } }; grr.Renderer('EmbeddedProtoFormRenderer', { Layout: function(state) { $('#' + state.unique).click(function() { var jthis = $(this); if (jthis.hasClass('glyphicon-plus')) { jthis.removeClass('glyphicon-plus').addClass('glyphicon-minus'); var jcontent = $('#content_' + state.unique); // Load content from the server if needed. if (!jcontent.hasClass('Fetched')) { grr.update(state.renderer, 'content_' + state.unique, jthis.data()); } jcontent.show(); } else { // Flip the opener and remove the form. jthis.removeClass('glyphicon-minus').addClass('glyphicon-plus'); $('#content_' + state.unique).hide(); } }); }, RenderAjax: function(state) { // Mark the content as already fetched so we do not need to fetch again. $(state.id).addClass('Fetched'); } }); grr.Renderer('RepeatedFieldFormRenderer', { Layout: function(state) { var unique = state.unique; $('button#add_' + unique).click(function(event) { var count = $(this).data('count'); var new_id = 'content_' + unique + '_' + count; // Store the total count of members in the form. $(this).closest('.FormData').data()[state.prefix + '_count'] = count + 1; $(this).data('count', count + 1); $('#content_' + unique).append('
'); grr.update(state.renderer, new_id, { 'index': count, 'prefix': state.prefix, 'owner': state.owner, 'field': state.field}); event.preventDefault(); }); }, RenderAjax: function(state) { var unique = state.unique; $('button#remove_' + unique).click(function(event) { var form_id = '#' + unique; var data = $('#' + unique).data(); grr.forms.clearPrefix(this, data.prefix + '-' + data.index); $(this).remove(); $(form_id).remove(); }); } }); grr.Renderer('StringTypeFormRenderer', { Layout: function(state) { var value = state.value; var default_value = state.default; if (value != null) { $('input#' + state.prefix).val(value).change(); } else if (default_value != null) { $('input#' + state.prefix).val(default_value); } } }); grr.Renderer('EnumFormRenderer', { Layout: function(state) { var value = state.value; var default_value = state.default; if (value != null) { $('select#' + state.prefix).val(value).change(); } else if (default_value != null) { $('select#' + state.prefix).val(default_value); } } }); grr.Renderer('ProtoBoolFormRenderer', { Layout: function(state) { var value = state.value; var default_value = state.default; if (value != null) { $('input#' + state.prefix).prop( 'checked', value != null).val(value).change(); } else if (default_value) { $('input#' + state.prefix).prop( 'checked', default_value).val(default_value); } } }); grr.Renderer('OptionFormRenderer', { Layout: function(state) { var optionControl = $('#' + state.prefix + '-option'); optionControl.on('change', function() { grr.forms.inputOnChange(this); var data = $.extend({}, $(this).closest('.FormData').data()); data['prefix'] = state.prefix; grr.update(state.renderer, state.unique + '-option-form', data); // First time the form appears, trigger the change event on the selector // to make the default choice appear. }); if (state.default_item_type) { optionControl.val(state.default_item_type); } optionControl.trigger('change'); } }); grr.Renderer('MultiFormRenderer', { Layout: function(state) { var unique = state.unique; var option = state.option || 'option'; // This button is pressed when we want a new form. var addButton = $('#AddButton' + unique); addButton.bind('addItem', function(event, defaultItemType) { var data = $(this).closest('.FormData').data(); var count = data[option + '_count'] || 1; var new_id = unique + '_' + count; data.item = count; data['default_item_type'] = defaultItemType; data[option + '_count'] = count + 1; var new_div = $('
'); new_div.insertBefore(this); grr.layout(state.renderer, new_id, data); }); addButton.click(function() { addButton.trigger('addItem'); }); if (state.add_one_default) { // If "add_one_default" argument is true, first time we show the button // click it to make at least one option available. addButton.click(); } }, LayoutItem: function(state) { var unique = state.unique; var option = state.option || 'option'; // This button is pressed when current form is removed. var removeButton = $('#RemoveButton' + unique); removeButton.click(function() { var item = $(this).parent().data('item'); grr.forms.clearPrefix(this, option + '_' + item); }); } }); grr.Renderer('SemanticProtoFormRenderer', { Layout: function(state) { var unique = state.unique; $('#advanced_label_' + unique).click(function() { var advancedControls = $('#advanced_controls_' + unique); if (advancedControls.hasClass('hide')) { advancedControls.removeClass('hide'); } else { advancedControls.addClass('hide'); } var icon = $('#' + unique + ' .advanced-icon:last'); if ($('#advanced_controls_' + unique).is(':visible')) { icon.removeClass('glyphicon-chevron-right').addClass( 'glyphicon-chevron-down'); } else { icon.removeClass('glyphicon-chevron-down').addClass( 'glyphicon-chevron-right'); } }); $('#' + unique + ' i.advanced-icon').click(function() { $('#advanced_label_' + unique).trigger('click'); }); } }); grr.Renderer('RDFDatetimeFormRenderer', { Layout: function(state) { $('#' + state.prefix + '_picker').datepicker({ showAnim: '', changeMonth: true, changeYear: true, showOn: 'button', buttonImage: 'static/images/clock.png', buttonImageOnly: true, altField: '#' + state.prefix, onSelect: function(dateText, inst) { $('#' + state.prefix).trigger('change'); } }); } }); grr.Renderer('MultiSelectListRenderer', { Layout: function(state) { var prefix = state.prefix; // Height hack as CSS isn't handled properly for multiselect. var multiselect_height = parseInt($('#' + prefix + ' option').length) * 15; $('#' + prefix).css('height', multiselect_height); } }); grr-3.1.0.2/grr/gui/static/javascript/plugins/hunt_view.js000066400000000000000000000114751273104013200235100ustar00rootroot00000000000000var grr = window.grr || {}; grr.Renderer('ManageHunts', { Layout: function(state) { // If hunt_id in hash, click that row. if (grr.hash.hunt_id) { var basename = grr.hash.hunt_id.split('/').reverse()[0]; $("table.HuntTable td:contains('" + basename + "')").click(); } } }); grr.Renderer('HuntViewTabs', { Layout: function(state) { var unique = state.unique; // When the hunt id is selected, redraw the tabs below. grr.subscribe('file_select', function(hunt_id) { grr.layout('HuntViewTabs', 'main_bottomPane', {hunt_id: hunt_id}); }, unique); } }); grr.Renderer('HuntClientTableRenderer', { Layout: function(state) { var unique = state.unique; var hunt_hash = state.hunt_hash; if (!grr.state.hunt_id) { // Refresh the page with the hunt_id from the hash. grr.state.hunt_id = grr.hash.hunt_id; } // Add click handler to the backlink. $('#backlink_' + unique).click(function() { // clean up our state before we jump back to the hunt. delete grr.state.client_id; grr.loadFromHash(hunt_hash); }); $('#' + unique + '_select').change(function() { grr.state.completion_status = $('#' + unique + '_select').val(); grr.layout('HuntClientTableRenderer', 'main_topPane', grr.state); }); } }); grr.Renderer('HuntOverviewRenderer', { RenderAjax: function(state) { var unique = state.unique; var subject = state.subject; var hunt_id = state.hunt_id; // We execute CheckAccess renderer with silent=true. Therefore it searches // for an approval and sets correct reason if approval is found. When // CheckAccess completes, we execute HuntViewRunHunt renderer, which // tries to run an actual hunt. If the approval wasn't found on CheckAccess // stage, it will fail due to unauthorized access and proper ACLDialog will // be displayed. grr.layout('CheckAccess', 'RunHuntResult_' + unique, {silent: true, subject: subject}, function() { grr.layout('HuntViewRunHunt', 'RunHuntResult_' + unique, { hunt_id: hunt_id }); }); } }); grr.Renderer('HuntClientViewTabs', { Layout: function(state) { var unique = state.unique; var hunt_id = state.hunt_id; // When the hunt id is selected, redraw the tabs below. grr.subscribe('file_select', function(client_id) { grr.layout('HuntClientViewTabs', 'main_bottomPane', { hunt_client: client_id, hunt_id: hunt_id }); }, unique); } }); grr.Renderer('HuntClientGraphRenderer', { Layout: function(state) { var unique = state.unique; var hunt_id = state.hunt_id; var button = $('#' + unique).button(); var handlerState = {hunt_id: hunt_id}; grr.downloadHandler(button, handlerState, false, '/render/Download/HuntClientCompletionGraphRenderer'); } }); grr.Renderer('HuntStatsRenderer', { Layout: function(state) { var unique = state.unique; var user_cpu_json_data = state.user_cpu_json_data; var system_cpu_json_data = state.system_cpu_json_data; var network_bytes_sent_json_data = state.network_bytes_sent_json_data; $('#performers_' + unique + " a[client_id!='']").click(function() { client_id = $(this).attr('client_id'); grr.state.client_id = client_id; grr.publish('hash_state', 'c', client_id); // Clear the authorization for new clients. grr.publish('hash_state', 'reason', ''); grr.state.reason = ''; grr.publish('hash_state', 'main', null); grr.publish('client_selection', client_id); }); function formatTimeTick(tick) { if (Math.abs(Math.floor(tick) - tick) > 1e-7) { return tick.toFixed(1); } else { return Math.floor(tick); } } function formatBytesTick(tick) { if (tick < 1024) { return tick + 'B'; } else { return Math.round(tick / 1024) + 'K'; } } function plotStats(statName, jsonString, formatTickFn) { var srcData = $.parseJSON(jsonString); var data = []; var ticks = []; for (var i = 0; i < srcData.length; ++i) { data.push([i, srcData[i][1]]); ticks.push([i + 0.5, formatTickFn(srcData[i][0])]); } $.plot('#' + statName + '_' + unique, [data], { series: { bars: { show: true, lineWidth: 1 } }, xaxis: { tickLength: 0, ticks: ticks }, yaxis: { minTickSize: 1, tickDecimals: 0 } }); } plotStats('user_cpu', user_cpu_json_data, formatTimeTick); plotStats('system_cpu', system_cpu_json_data, formatTimeTick); plotStats('network_bytes_sent', network_bytes_sent_json_data, formatBytesTick); } }); grr-3.1.0.2/grr/gui/static/javascript/plugins/inspect_view.js000066400000000000000000000056201273104013200241720ustar00rootroot00000000000000var grr = window.grr || {}; grr.Renderer('RequestTable', { Layout: function(state) { var unique = state.unique; var id = state.id; //Receive the selection event and emit a path grr.subscribe('select_table_' + id, function(node) { if (node) { var task_id = node.find('span[rdfvalue]').attr('rdfvalue'); grr.publish('request_table_select', task_id); } }, unique); } }); grr.Renderer('RequestTabs', { Layout: function(state) { var unique = state.unique; grr.subscribe('request_table_select', function(task_id) { $('#' + unique).data().state.task_id = task_id; $('#' + unique + ' li.active a').click(); }, unique); } }); grr.Renderer('ClientLoadView', { Layout: function(state) { var unique = state.unique; var user_cpu_data = state.user_cpu_data; var system_cpu_data = state.system_cpu_data; var read_bytes_data = state.read_bytes_data; var write_bytes_data = state.write_bytes_data; var read_count_data = state.read_count_data; var write_count_data = state.write_count_data; var detailsPanel = $('#FlowDetails_' + unique); var detailsPanelClose = $('#FlowDetailsClose_' + unique); detailsPanelClose.click(function() { detailsPanel.addClass('hide'); }); $('#' + unique + ' a.flow_details_link').click(function(event) { var flowUrn = $(this).attr('flow_urn'); detailsPanel.css('top', $(this).position().top + 'px'); detailsPanel.removeClass('hide'); grr.layout('ShowFlowInformation', 'FlowDetailsContent_' + unique, {flow: flowUrn}); event.preventDefault(); }); $.plot('#client_cpu_' + unique, [{ label: 'User', data: user_cpu_data }, { label: 'System', data: system_cpu_data }], { xaxis: { mode: 'time', axisLabel: 'Time' }, yaxis: { axisLabel: 'CPU load' } }); $.plot('#client_io_bytes_' + unique, [{ label: 'Read', data: read_bytes_data }, { label: 'Write', data: write_bytes_data }], { xaxis: { mode: 'time', axisLabel: 'Time' }, yaxis: { axisLabel: 'Bytes' } }); $.plot('#client_io_count_' + unique, [{ label: 'Read', data: read_count_data }, { label: 'Write', data: write_count_data }], { xaxis: { mode: 'time', axisLabel: 'Time' }, yaxis: { axisLabel: 'Number of operations' } }); } }); grr-3.1.0.2/grr/gui/static/javascript/plugins/new_hunt.js000066400000000000000000000014031273104013200233150ustar00rootroot00000000000000var grr = window.grr || {}; grr.Renderer('HuntInformation', { Layout: function(state) { var unique = state.unique; var renderer = state.renderer; $('#' + unique).closest('.WizardPage').on('show', function() { grr.update(renderer, unique, $('#' + unique).closest('.FormData').data()); }); } }); grr.Renderer('HuntConfigureOutputPlugins', { Layout: function(state) { var unique = state.unique; var defaultOutputPlugin = state.default_output_plugin; if (defaultOutputPlugin) { $('#AddButton' + unique).trigger('addItem', [defaultOutputPlugin]); } } }); grr.Renderer('AFF4ObjectLabelNameFormRenderer', { Layout: function(state) { var prefix = state.prefix; grr.forms.inputOnChange($('#' + prefix)); } }); grr-3.1.0.2/grr/gui/static/javascript/plugins/notifications.js000066400000000000000000000041711273104013200243440ustar00rootroot00000000000000var grr = window.grr || {}; grr.Renderer('NotificationBar', { Layout: function(state) { grr.subscribe('NotificationCount', function(number) { var button; if (parseInt(number) > 0) { button = $('#notification_button').removeClass('btn-info'); button = $('#notification_button').addClass('btn-danger'); } else { button = $('#notification_button').addClass('btn-info'); button = $('#notification_button').removeClass('btn-danger'); } button.text(number); }, 'notification_button'); grr.poll('NotificationCount', 'notification_button', function(data) { if (data) { grr.publish('NotificationCount', data.number); } return true; }, 60000, grr.state, 'json'); $('#notification_dialog').detach().appendTo('body'); $('#user_settings_dialog').detach().appendTo('body'); $('#notification_dialog').on('show.bs.modal', function() { grr.layout('ViewNotifications', 'notification_dialog_body'); grr.publish('NotificationCount', 0); }); $('#user_settings_dialog').on('show.bs.modal', function() { grr.layout('UserSettingsDialog', 'user_settings_dialog'); }).on('hidden.bs.modal', function() { $(this).html(''); }); } }); grr.Renderer('UserSettingsDialog', { RenderAjax: function(state) { document.location.reload(true); } }); grr.Renderer('ViewNotifications', { Layout: function(state) { //Receive the selection event and emit a path grr.subscribe('select_table_' + state['id'], function(node) { if (node) { var element = node.find('a'); if (element) { if (element.attr('notification_type') == 'DownloadFile') { var parsedHash = grr.parseHashState(element.attr('target_hash')); var fileState = { aff4_path: parsedHash['aff4_path']}; grr.downloadHandler(element, fileState, false, '/render/Download/DownloadView'); element.trigger('download'); } else { grr.loadFromHash(element.attr('target_hash')); } } } }, state['unique']); } }); grr-3.1.0.2/grr/gui/static/javascript/plugins/rekall_viewer.js000066400000000000000000000000001273104013200243110ustar00rootroot00000000000000grr-3.1.0.2/grr/gui/static/javascript/plugins/reports_view.js000066400000000000000000000003761273104013200242260ustar00rootroot00000000000000var grr = window.grr || {}; grr.Renderer('ReportNameRenderer', { Layout: function(state) { var prefix = state.prefix; // Force a state update as the default should be usable. Cleaner way? grr.forms.inputOnChange($('#' + prefix)); } }); grr-3.1.0.2/grr/gui/static/javascript/plugins/searchclient.js000066400000000000000000000112531273104013200241360ustar00rootroot00000000000000var grr = window.grr || {}; /** * Namespace for the glob completer. */ grr.labels_completer = {}; /** * A filter function which matches the start of the completion list. * * @param {Array} completions the completion list * @param {string} term is the term to match. * * @return {Array} a list of matches. */ grr.labels_completer.filter = function(completions, term) { var matcher = new RegExp('^' + $.ui.autocomplete.escapeRegex(term), 'i'); return $.grep(completions, function(value) { return matcher.test(value.label || value.value || value); }); }; /** * Build a completer on top of a text input. * * @param {string|Element} element is the DOM id of the text input field or the * DOM element itself. * @param {Array} completions are possible completions. * @param {string} split_term is the term which triggers the completion. */ grr.labels_completer.Completer = function(element, completions, split_term) { if (angular.isString(element)) { element = $('#' + element); } element.bind('keydown', function(event) { if (event.keyCode === $.ui.keyCode.TAB && $(this).data('ui-autocomplete').menu.active) { event.preventDefault(); } }).bind('focus', function(event) { if (!split_term) { $(this).autocomplete('search'); } }).autocomplete({ minLength: 0, source: function(request, response) { if (split_term) { var terms = request.term.split(split_term); if (terms.length % 2) { response([]); } else { response(grr.labels_completer.filter(completions, terms.pop())); } } else { terms = grr.labels_completer.filter(completions, request.term); if ($.inArray(request.term, terms) != -1) { response([]); } else { response(terms); } } }, focus: function() { // prevent value inserted on focus return false; }, select: function(event, ui) { var terms = this.value.split(split_term); // remove the current input terms.pop(); // add the selected item terms.push(ui.item.value); this.value = terms.join('label:'); // Angular code has to be notificed of the change. $(this).change(); // Id will only be set in legacy code. if ($(this).attr('id')) { grr.forms.inputOnChange(this); } event.preventDefault(); return false; } }); }; grr.Renderer('ContentView', { Layout: function(state) { var global_notification_poll_time = state.global_notification_poll_time; grr.canary_mode = state.canary_mode; if (grr.hash.c) { grr.state.client_id = grr.hash.c; } grr.poll('GlobalNotificationBar', 'global-notification', function(data) { // success handler $('#global-notification').html(data); $('#global-notification button.close').click(function() { var notification_hash = $(this).attr('notification-hash'); grr.update('GlobalNotificationBar', null, {notification_hash: notification_hash}); $(this).closest('.alert').alert('close'); }); return true; }, global_notification_poll_time, {}); } }); grr.Renderer('Navigator', { Layout: function(state) { var unique = state.unique; var id = state.id; var renderer = state.renderer; var poll_time = state.poll_time; var client_id = state.client_id; grr.installNavigationActions('nav_' + unique); if (!grr.hash.main) { $('a[grrtarget=HostInformation]').click(); } else { $('a[grrtarget=' + grr.hash.main + ']').click(); } grr.poll('StatusRenderer', 'infoline_' + unique, function(data) { $('#infoline_' + unique).html(data); return true; }, poll_time, grr.state, null, function() { $('#infoline_' + unique).html('Client status not available.'); }); // Reload the navigator when a new client is selected. grr.subscribe('client_selection', function() { grr.layout(renderer, id); }, unique); // Reload the navigator when a new hunt is selected. grr.subscribe('hunt_selection', function() { grr.layout(renderer, id); }, unique); if (grr.hash.c && grr.hash.c != client_id) { grr.publish('client_selection', grr.hash.c); } } }); grr.Renderer('FrontPage', { Layout: function(state) { // Update main's state from the hash if (grr.hash.main) { $.extend(grr.state, grr.hash); grr.layout(grr.hash.main, 'main'); } else { grr.layout('UserDashboard', 'main'); } } });grr-3.1.0.2/grr/gui/static/javascript/plugins/semantic.js000066400000000000000000000027011273104013200232730ustar00rootroot00000000000000var grr = window.grr || {}; grr.Renderer('ClientURNRenderer', { Layout: function(state) { var unique = state.unique; $('#ClientInfoButton_' + unique).click(function(event) { $('#ClientInfo_' + unique).modal(); event.preventDefault(); }); $('#ClientInfo_' + unique).on('show.bs.modal', function() { grr.update(state.renderer, 'ClientInfoContent_' + unique, {urn: state.urn}); }); } }); grr.Renderer('KeyValueFormRenderer', { Layout: function(state) { var unique = state.unique; $('#' + unique).find('a[data-type]').on('click', function() { var jthis = $(this); var target = jthis.closest('ul').data('name'); var json_store = jthis.closest('.FormData').data(); var value = jthis.data('type'); json_store[target] = value; jthis.closest('div').find('button span.Type').text(value); }); } }); grr.Renderer('RDFValueArrayRenderer', { Layout: function(state) { var unique = state.unique; var next_start = state.next_start; var cache_urn = state.cache_urn; var array_length = state.array_length; $('#' + unique + ' a').click(function() { grr.layout('RDFValueArrayRenderer', unique, { start: next_start, cache: cache_urn, length: array_length }); }); } }); grr.Renderer('AES128KeyFormRenderer', { Layout: function(state) { var prefix = state.prefix; $('#' + prefix).change(); } }); grr-3.1.0.2/grr/gui/static/javascript/plugins/server_load_view.js000066400000000000000000000016261273104013200250340ustar00rootroot00000000000000var grr = window.grr || {}; grr.Renderer('ScalarGraphRenderer', { Layout: function(state) { var unique = state.unique; var graph = state.graph; var data = []; for (var serieName in graph.series) { var serie = graph.series[serieName]; data.push({label: serie.title, data: serie.data}); } var config = { xaxis: { mode: 'time', axisLabel: 'Time' }, yaxis: { axisLabel: graph.yAxisLabel } }; $.plot('#' + graph.name + '_' + unique, data, config); } }); grr.Renderer('ServerLoadView', { Layout: function(state) { var unique = state.unique; var id = state.id; var renderer = state.renderer; var graphs = state.graphs; $('#durations_' + unique + ' button').click(function() { grr.layout(renderer, id, { duration: $(this).attr('name') }); }); } }); grr-3.1.0.2/grr/gui/static/javascript/plugins/statistics.js000066400000000000000000000122421273104013200236630ustar00rootroot00000000000000/** * @fileoverview Rendering javascript for statistics.py. */ var grr = window.grr || {}; grr.Renderer('ReportRenderer', { Layout: function(state) { var unique = state.unique; var id = state.id; var renderer = state.renderer; grr.subscribe('tree_select', function(path) { grr.state.path = path; $('#' + id).html('Loading…'); grr.layout(renderer, id); }, unique); } }); grr.Renderer('AFF4ClientStats', { Layout: function(state) { var unique = state.unique; var id = state.id; var graphs = state.graphs; specs = {}; options = {}; plot = {}; selectTab = function(tabid) { for (var i = 0; i < graphs.length; ++i) { graph = graphs[i]; $('#' + unique + '_' + graph.id)[0].style.display = 'none'; $('#' + unique + '_' + graph.id + '_a').removeClass('selected'); } $('#' + unique + '_' + tabid)[0].style.display = 'block'; $('#' + unique + '_click').text(''); $('#' + unique + '_' + tabid + '_a').addClass('selected'); $('#' + unique + '_' + tabid)[0].style.visibility = 'hidden'; $('#' + id).resize(); p = plot[tabid]; p.resize(); p.setupGrid(); p.draw(); $('#' + unique + '_' + tabid)[0].style.visibility = 'visible'; }; for (var i = 0; i < graphs.length; ++i) { graph = graphs[i]; specs[graph.id] = []; for (var j = 0; j < graph.series.length; ++j) { stats = graph.series[j]; specs[graph.id].push({ label: stats.label, data: stats.data }); } options[graph.id] = { xaxis: {mode: 'time', timeformat: '%y/%m/%d - %H:%M:%S'}, lines: {show: true}, points: {show: true}, zoom: {interactive: true}, pan: {interactive: true}, grid: {clickable: true, autohighlight: true} }; var placeholder = $('#' + unique + '_' + graph.id); plot[graph.id] = $.plot(placeholder, specs[graph.id], options[graph.id]); placeholder.bind('plotclick', function(event, pos, item) { if (item) { var date = new Date(item.datapoint[0]); var msg = graph.click_text; msg = msg.replace('%date', date.toString()); msg = msg.replace('%value', item.datapoint[1]); $('#' + unique + '_click').text(msg); } }); } selectTab('cpu'); } }); grr.Renderer('PieChart', { Layout: function(state) { var unique = state.unique; $('#graph_' + unique).resize(function() { $('#graph_' + unique).html(''); $.plot($('#graph_' + unique), state.data, { series: { pie: { show: true, label: { show: true, radius: 0.5, formatter: function(label, series) { return ('
' + label + '
' + Math.round(series.percent) + '%
'); }, background: { opacity: 0.8 } } } }, grid: { hoverable: true, clickable: true } }); }); $('#graph_' + unique).bind('plothover', function(event, pos, obj) { if (obj) { percent = parseFloat(obj.series.percent).toFixed(2); $('#hover_' + unique).html('' + obj.series.label + ' ' + obj.series.data[0][1] + ' (' + percent + '%)'); } }); $('#graph_' + unique).resize(); } }); grr.Renderer('LastActiveReport', { Layout: function(state) { var unique = state.unique; var options = { xaxis: {mode: 'time', timeformat: '%y/%m/%d'}, lines: {show: true}, points: {show: true}, zoom: {interactive: true}, pan: {interactive: true}, grid: {clickable: true, autohighlight: true} }; var placeholder = $('#' + unique); var plot = $.plot(placeholder, state.graphs, options); placeholder.bind('plotclick', function(event, pos, item) { if (item) { var date = new Date(item.datapoint[0]); $('#' + unique + '_click').text('On ' + date.toDateString() + ', there were ' + item.datapoint[1] + ' ' + item.series.label + ' systems.'); } }); } }); grr.Renderer('CustomXAxisChart', { Layout: function(state) { var unique = state.unique; $.plot($('#graph_' + unique), state.data, { series: { bars: { show: true, barWidth: 0.2 }, background: { opacity: 0.8 } }, xaxis: { min: 0, ticks: state.xaxis_ticks }, grid: { hoverable: true, clickable: true } }); $('#graph_' + unique).bind('plothover', function(event, pos, obj) { if (obj) { $('#hover_' + unique).html( ' ' + state.xaxis_ticks[obj.seriesIndex][1] + ': ' + obj.datapoint[1] + '' + ''); } }); } }); grr-3.1.0.2/grr/gui/static/javascript/plugins/timeline_view.js000066400000000000000000000042011273104013200243250ustar00rootroot00000000000000var grr = window.grr || {}; grr.Renderer('TimelineMain', { Layout: function(state) { var unique = state.unique; var id = state.id; var query_state = { container: grr.hash.container, query: grr.hash.query || '' }; grr.layout('TimelineToolbar', 'toolbar_' + id, query_state); grr.layout('TimelineViewerSplitter', unique, query_state); } }); grr.Renderer('TimelineToolbar', { Layout: function(state) { var unique = state.unique; var container = state.container; var reason = state.reason; var query_state = {query: $('input#container_query').val(), container: container, reason: reason, client_id: grr.state.client_id }; grr.downloadHandler($('#export_' + unique), state, true, '/render/Download/EventTable'); $('#form_' + unique).submit(function() { var query = $('input#container_query').val(); grr.publish('query_changed', query); grr.publish('hash_state', 'query', query); return false; }); } }); grr.Renderer('EventTable', { Layout: function(state) { var unique = state.unique; var id = state.id; var container = state.container; var renderer = state.renderer; grr.subscribe('query_changed', function(query) { grr.layout(renderer, id, { container: container, query: query }); }, unique); grr.subscribe('select_table_' + id, function(node) { var event_id = node.find('td').first().text(); grr.publish('event_select', event_id); }, unique); } }); grr.Renderer('EventViewTabs', { Layout: function(state) { var unique = state.unique; var id = state.id; var event_queue = state.event_queue; var container = state.container; var renderer = state.renderer; // Listen to the event change events and switch to the first tab. grr.subscribe(event_queue, function(event) { grr.publish('hash_state', 'event', event); grr.layout(renderer, id, { event: event, container: container }); }, 'tab_contents_' + unique); } }); grr-3.1.0.2/grr/gui/static/javascript/plugins/usage.js000066400000000000000000000017501273104013200225770ustar00rootroot00000000000000var grr = window.grr || {}; grr.Renderer('StackChart', { Layout: function(state) { var unique = state.unique; var specs = state.specs; $('#' + unique).resize(function() { $('#' + unique).html(''); $.plot($('#' + unique), specs, { series: { stack: true, bars: { show: true, barWidth: 0.6 }, label: { show: true, radius: 0.5 }, background: { opacity: 0.8 } }, grid: { hoverable: true, clickable: true } }); }); $('#' + unique).bind('plothover', function(event, pos, obj) { if (obj) { grr.test_obj = obj; $('#hover').html( ' ' + obj.series.label + ': ' + (obj.datapoint[1] - obj.datapoint[2]) + ''); } }); $('#' + unique).resize(); } }); grr-3.1.0.2/grr/gui/static/javascript/plugins/wizards.js000066400000000000000000000061251273104013200231570ustar00rootroot00000000000000var grr = window.grr || {}; grr.Renderer('WizardRenderer', { Layout: function(state) { var unique = state.unique; // Also show error messages on the wizard dialog since we are hiding the // main page. grr.subscribe('grr_messages', function(notification) { if (notification && notification.message) { $('#footer_message_' + unique).text( notification.message).show().delay(5000).fadeOut('fast'); } }, 'footer_message_' + unique); var update_buttons = function() { var data = $('#Wizard_' + unique).data(); if (data.current >= data.max_page) { // At the last step we hide all buttons except the finish. $('button.Next').hide(); $('button.Back').hide(); $('button.Finish').show().attr('disabled', null); } else { $('button.Next').show().attr('disabled', null); $('button.Finish').hide(); } if (data.current > 0 && data.current < data.max_page) { $('button.Back').show().attr('disabled', null); } else { $('button.Back').hide(); } }; var show_page = function(old_page_number, new_page_number) { var wizard = $('#Wizard_' + unique); var old_page = wizard.find('#Page_' + old_page_number); old_page.hide(); $('#Page_' + new_page_number).show().trigger('show'); wizard.data('current', new_page_number); }; var validate_transition = function(old_page_number, new_page_number) { var wizard_id = '#Wizard_' + unique; var wizard = $(wizard_id); var old_page = wizard.find('#Page_' + old_page_number); grr.update(old_page.data('renderer'), wizard_id, wizard.data(), function(data) { // Advance to the next page show_page(old_page_number, new_page_number); update_buttons(); }, old_page_number, function(data) { // Error occured: publish the error and re-enable the button. grr.publish('grr_messages', { message: data.message }); update_buttons(); }, 'Validate'); }; $('button.Next').click(function() { if ($(this).attr('disabled')) return; var wizard = $('#Wizard_' + unique); var current = wizard.data('current'); // Moving forward is only allowed if the validation succeeds. $(this).attr('disabled', 1); validate_transition(current, current + 1); }); $('button.Back').click(function() { if ($(this).attr('disabled')) return; var wizard = $('#Wizard_' + unique); var current = wizard.data('current'); // Moving back is always allowed. show_page(current, current - 1); update_buttons(); }); $('.Wizard .WizardPage').hide(); $('#Page_0').show(); } }); grr.Renderer('HuntConfigureFlow', { Layout: function(state) { var id = state.id; grr.subscribe('flow_select', function(path) { var pane_id = id + '_rightPane'; // Record the flow in the form data. $('#' + pane_id).closest('.FormData').data('flow_path', path); grr.layout('HuntFlowForm', pane_id, { flow_path: path }); }, id); } }); grr-3.1.0.2/grr/gui/static/javascript/renderers.js000066400000000000000000000250621273104013200220050ustar00rootroot00000000000000var grr = window.grr || {}; /** * Namespace for renderers. */ grr.renderers = grr.renderers || {}; /** * Registers javascript methods for the particular renderer. * * @param {string} name Name of the renderer. * @param {Object} spec Dictionary of functions - i.e. javascript methods * corresponding to to the renderer. */ grr.Renderer = function(name, spec) { grr.renderers[name] = spec; }; /** * Exception that is thrown when a particular renderer is not found. * * @param {string} renderer Name of the renderer. * @constructor */ grr.NoSuchRendererException = function(renderer) { this.description = 'No renderer with name: ' + renderer; this.renderer = renderer; }; /** * Executes given method of a given renderer, passing 'state' as an argument. * @param {string} objMethod Renderer and its' method to be called. I.e. "SomeRenderer.Layout" or "SomeOtherRenderer.RenderAjax". * @param {Object} state Dictionary that is passed as a single argument to the corresponding renderer's function. */ grr.ExecuteRenderer = function(objMethod, state) { var parts = objMethod.split('.'); var renderer = parts[0]; var method = parts[1]; var rendererObj = grr.renderers[renderer]; if (!rendererObj) { grr.log('No such renderer: ' + renderer); throw new grr.NoSuchRendererException(renderer); } if (rendererObj[method]) { rendererObj[method](state); } }; grr.Renderer('ConfirmationDialogRenderer', { Layout: function(state) { var unique = state.unique; // Present system messages in the dialog box for easy viewing. grr.subscribe('grr_messages', function(notification) { if (notification && notification.message) { $('#footer_message_' + unique).text( notification.message).show().delay(5000).fadeOut('fast'); } }, 'footer_message_' + unique); $('#proceed_' + unique).click(function() { var jthis = $(this); var data = $.extend({}, grr.state, state, jthis.closest('.FormData').data()); var submit_function = function() { grr.update( state.renderer, 'results_' + unique, data, function(result) { $('#results_' + unique).html(result); jthis.hide(); }, null, function(data) { jthis.attr('disabled', false); grr.publish('grr_messages', { message: data.message }); }); }; jthis.attr('disabled', true); if (state.check_access_subject) { // We execute CheckAccess renderer with silent=true. Therefore it // searches for an approval and sets correct reason if approval is // found. When CheckAccess completes, we execute specified renderer, // which. If the approval wasn't found on CheckAccess stage, it will // fail due to unauthorized access and proper ACLDialog will be // displayed. grr.layout('CheckAccess', 'check_access_results_' + unique, { silent: true, subject: state.check_access_subject }, submit_function); } else { submit_function(); } }); } }); /** * Stores last error reported by ErrorHandler renderer. */ grr._lastError = null; /** * Stores last error backtrace reported by ErrorHandler renderer. */ grr._lastBacktrace = null; grr.Renderer('ErrorHandler', { Layout: function(state) { var error = state.error; var backtrace = state.backtrace; grr._lastError = error; grr._lastBacktrace = backtrace; grr.publish('grr_messages', { message: error, traceBack: backtrace }); } }); grr.Renderer('TableRenderer', { Layout: function(state) { var unique = state.unique; var id = state.id; var renderer = state.renderer; var table_state = state.table_state; var message = state.message; grr.table.newTable(renderer, 'table_' + id, unique, table_state); grr.publish('grr_messages', { message: message }); $('#table_' + id).attr(table_state); }, RenderAjax: function(state) { var id = state.id; var message = state.message; var table = $('#' + id); grr.publish('grr_messages', { message: message }); } }); grr.Renderer('TreeRenderer', { Layout: function(state) { var unique = state.unique; var renderer = state.renderer; var publish_select_queue = state.publish_select_queue; var tree_state = state.tree_state; grr.grrTree(renderer, unique, publish_select_queue, tree_state); } }); grr.Renderer('TabLayout', { Layout: function(state) { var unique = state.unique; var disabled = state.disabled; var tab_layout_state = state.tab_layout_state; var tab_hash = state.tab_hash; var selected_tab = state.selected_tab; // Disable the tabs which need to be disabled. $('li').removeClass('disabled'); $('li a').removeClass('disabled'); for (var i = 0; i < disabled.length; ++i) { $('li[renderer=' + disabled[i] + ']').addClass('disabled'); $('li a[renderer=' + disabled[i] + ']').addClass('disabled'); } // Store the state of this widget. $('#' + unique).data().state = tab_layout_state; grr.pushState(unique, tab_layout_state); // Add click handlers to switch tabs. $('#' + unique + ' li a').click(function(e) { e.preventDefault(); if ($(this).hasClass('disabled')) return false; var renderer = this.attributes['renderer'].value; // Make a new div to accept the content of the tab rather than drawing // directly on the content area. This prevents spurious drawings due to // latent ajax calls. content_area = $('#tab_contents_' + unique); content_area.html('
'); update_area = $('#' + renderer + '_' + unique); // We append the state of this widget which is stored on the unique // element. grr.layout(renderer, renderer + '_' + unique, $('#' + unique).data().state); // Clear previously selected tab. $('#' + unique).find('li').removeClass('active'); // Select the new one. $(this).parent().addClass('active'); }); // Find first enabled tab (the default selection). var enabledTabs = $.map( $('#' + unique + ' > li:not(.disabled)'), function(val) { return $(val).attr('renderer'); }); // Select the first tab at first. if (tab_hash) { var selected = grr.hash[tab_hash] || selected_tab; } else { var selected = selected_tab; } if (enabledTabs.indexOf(selected) == -1) { selected = enabledTabs.length > 0 ? enabledTabs[0] : null; } if (selected) { $($('#' + unique + " li a[renderer='" + selected + "']")).click(); } } }); grr.Renderer('Splitter', { Layout: function(state) { var id = state.id; var min_left_pane_width = state.min_left_pane_width; var max_left_pane_width = state.max_left_pane_width; $('#' + id) .splitter({ minAsize: min_left_pane_width, maxAsize: max_left_pane_width, splitVertical: true, A: $('#' + id + '_leftPane'), B: $('#' + id + '_rightPane'), animSpeed: 50, closeableto: 0}); $('#' + id + '_rightSplitterContainer') .splitter({ splitHorizontal: true, A: $('#' + id + '_rightTopPane'), B: $('#' + id + '_rightBottomPane'), animSpeed: 50, closeableto: 100}); // Triggering resize event here to ensure that splitters will position // themselves correctly. $('#' + id).resize(); } }); grr.Renderer('Splitter2Way', { Layout: function(state) { var id = state.id; $('#' + id) .splitter({ splitHorizontal: true, A: $('#' + id + '_topPane'), B: $('#' + id + '_bottomPane'), animSpeed: 50, closeableto: 100}); } }); grr.Renderer('Splitter2WayVertical', { Layout: function(state) { var id = state.id; var min_left_pane_width = state.min_left_pane_width; var max_left_pane_width = state.max_left_pane_width; $('#' + id) .splitter({ minAsize: min_left_pane_width, maxAsize: max_left_pane_width, splitVertical: true, A: $('#' + id + '_leftPane'), B: $('#' + id + '_rightPane'), animSpeed: 50, closeableto: 0}); } }); grr.Renderer('ErrorRenderer', { Layout: function(state) { var value = state.value; grr.publish('messages', value); } }); // There should be only one injector instance per app, otherwise // Angular services which are meant to be singletos, will be created // multiple times. var getAngularInjector = function() { if (!grr.angularInjector) { grr.angularInjector = angular.injector(['ng', 'grrUi']); } return grr.angularInjector; }; grr.Renderer('AngularDirectiveRenderer', { // Compiles Angular code within a div with current unique id. Used by // AngularTestRenderer. Compile: function(state) { var unique = state.unique; var template = $('#' + unique); var injector = getAngularInjector(); var $compile = injector.get('$compile'); var $rootScope = injector.get('$rootScope'); var linkFn = $compile(template); var element = linkFn($rootScope); }, Layout: function(state) { var unique = state.unique; var directive = state.directive; var directive_args = state.directive_args; var injector = getAngularInjector(); var $compile = injector.get('$compile'); var $rootScope = injector.get('$rootScope'); var isolatedScope = $rootScope.$new(true, $rootScope); var template = $(document.createElement(directive)); if (angular.isDefined(directive_args)) { var index = 0; for (var key in directive_args) { var value = directive_args[key]; var valueName = 'var' + index.toString(); isolatedScope[valueName] = value; template.attr(key, valueName); ++index; } } var templateFn = $compile(template); templateFn(isolatedScope, function(cloned) { var parent = $('#' + unique); parent.append(cloned); }); // When parent item goes away destroy the scope. Otherwise we'll have a // leak. In Angular-only application Angular handles this itself // (TODO: double check that it does), but here, because we remove DOM // elements outside of normal Angular workflow, we have to delete // the scope manually. var poll = function() { setTimeout(function() { if ($('#' + unique).length == 0) { isolatedScope.$destroy(); } else { poll(); } }, 1000); }; poll(); } }); grr-3.1.0.2/grr/gui/static/third-party/000077500000000000000000000000001273104013200175525ustar00rootroot00000000000000grr-3.1.0.2/grr/gui/static/third-party/bootstrap/000077500000000000000000000000001273104013200215675ustar00rootroot00000000000000grr-3.1.0.2/grr/gui/static/third-party/jstree/000077500000000000000000000000001273104013200210465ustar00rootroot00000000000000grr-3.1.0.2/grr/gui/static/third-party/jstree/themes/000077500000000000000000000000001273104013200223335ustar00rootroot00000000000000grr-3.1.0.2/grr/gui/static/third-party/jstree/themes/default/000077500000000000000000000000001273104013200237575ustar00rootroot00000000000000grr-3.1.0.2/grr/gui/static/third-party/jstree/themes/default/32px.png000066400000000000000000000060611273104013200252640ustar00rootroot00000000000000‰PNG  IHDR@`[•[PLTEZ¡U`©999…eG  â¬k~~~¥¥¦¥¥¥¹[¢Ubª¨§©ùùùÁ¦[ߟe^ uw|‡¥q¾÷©©§¥¥¥X¸.±ÿýÿ² vw|/$…É--Á!!*‡,U¯=tÇM«Y+š ¨烃­ï““|¥õóõa¹AË õ““fºIaŠÏktÁY›Ûz^±JÕoÒpìggÔIIµçYYêcc´êÚ¾°W8üøò¤¤¤á«iÿÿÿììí&&&þüýÞcúîáUW[¨§©$›øçÖýöÕ\cpöõöýøíñòñßßàéèèûòéàÈ÷íÆ˜™˜¡ŒU5¯6°ñòñÓÓÔðÒ·óÜ»ôÝÆéמɳ{·¡gÎÀ’Ý̧FmC€‚‰ððï6®÷åÔ¥¹¥úîàêëëšægÎãÃáââtv{-£2«ûòè]Ä*/¦}×H·ñŒÏö¯Z®BüûûÒèëìíÒçÆ9°çççöãÐãí©Ë¢@·5—‚ØM³ïˆO¿ÕÔÕý÷믯ãJ½÷êÙ²è‘ÅÀ"–xÔBåååòôòÝÞÞÔÕÖÊÂÔÇ Þ€‘ÖphÌ1^­F'ž`Ç,#ŠÕÓÕÿ˜˜ÙöàÊñþffýøìû‹‹*‰nÂK¸Ì½œãnÖøºìïì{ÇZùóä¯Ü™ŽËmw¾Zq»W¸°ÅµÖÖÙÿ´´Ýýwwø&&ñÖºð==ëQÄeÄ7‡ÒaˆÓb‰Õ`¨ßЬðxoÎ8Éϸ°Í­÷íÞ¶b¹Cö11ÞÌ©ÿ««ƒ–‡ º¤Q£:ÌÕ¾‹Ïl¢Ø‡†¾n?¢«™U•ã^œÕ{¢éo¿Ñµ;Ž4½ñ•1)¹¼–—±Ÿ,”R¾ÿÞÞÿÉÉÿ||ÝΩ°Ã¶ËÙ÷œYèuuu˜vœœPx‘¤¼«ªì{°¹Ž¨®ˆl÷ÖbítRNSý.ZA& ý€þÿ[þ5"þþþ\Gù9ýé¬ELö¡ýûnÿýüÙÙ¬„`ÝíØ´é«ÝœúÙƒúèóúÕ"éÕë¯èÐòÐWûùÒj“ýÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùµfŒTóIDATxÚíœyXÓfÇ Úz (sιM&ê¯î¾ïã[ÂhËQž®PYJ[ÀQ"¨(8FA‰ˆ ž SйMqŠ×œ^›îtºÛ9w;Ý}ßï›´L~IYB'Æ÷4<Ï›¼i>|“¼oøJÕµŒ rû馻¿?I $$$$ Äj¸Ï€h$¿ù ¹¹¹Ù*0v}ï^±±½zéc{ëõv¨‹Ök÷aý¥ùHIÉQ`õVí¡iV´Óç9„Çc¡Áv¯¦c‡õ°@£1O`vŽò¨/¤) ɳX,^ (hò¶É3gΜŒ€RÚR½bË’_A))Æ \%GP߉ud$L߉ ô¯‰m˜Á²3°BLX_곚ÒÇ_>¾m†Ø÷¦³H`õÊ%+^_y°‹\$n§/#CbõæÀþä¤HFÿ± ì”)l!"P`áöIŸ×”––ÖÔl/öóþÖƒ[PTõ‡›_{åÕU¡ ÀŒ”Ü4¬OX` ¤e0Á$+2úm°Z­SF i(pǼO'!6ÏÛQØ·CsÔÅKߘ·ñHõÆ'KJ^þà},0§0CF½”=Àñ™d%PFÿXà2d…†h.Üùfé“߬ø¸vÑœ—ÊÞ^”™™9· ü9f#qÙ|3ÆK=@/›'~|Øþê_¸ïnG—ïF§°,åÖ–<]RR;§rt ÿ>©›S9mÚ´¹M4,0ÃÉ t"Æ% ÁK hÿzÖêpì^†²œÀ²üüÊÊÊüüü2ð&²ëëéÓ§O:uC¸=òçÎrfcn·{|°®2‡"2ú׳‡cþjB+ ¤ú$%%=…¾’Ê(H ýÕ3¸uÃ&p{­*'‰sg§¸ÝéééRhVW Œþ9Ø!º—ÀC’|„À_=S_¿áGx{.ljĹsÄvÁ8P–@•\«—¯žï°Âå‰!!}ÐGHÈ.p mq8þ8q|òÇíºðwvnnzNJzºôvë™eáA“1PËO5ð@œêYY¶aS‹±§0ˆ ð Æ®7cúâ‡f’&h#Æs(6ÿ¼Fâá4=m"H $I ù©$@H $ $H; á IlÐn0zp oÚÛHÞO‘9/5/Ϥ¼&ºlm0€ƒm}ÁóˆâÅi6Ôî¯5b}ªE>ùe~2M>½i}ºT?m}B\Ÿ¢`=åAŸ„b=©EŸfd=m)éÉŒ'¦ÖÑÒýä`?0`À€ 0`À€ 0`À€ 0`À€ 8.¸_ŠEp×4#{àΉdæÀ½S­»'ƒ÷O÷µ~ ¡Ûø‰”}“àÚóÞÀ,»1nüŸà£_îTàØá»ÊÞ3 0`À€ p°:ÆÀ7 0`À€ç‡ â… ÓÆ ć›j‰7™nº4Þ„x¼”‡xI-ñÒ–R¸Ä´tÖµœì§ 0`À€ 0`À€ì­‚€ 0`À€üÈýº§: x8‡ç_‚?äïb?e‘ØX#ö–ˆ]óOÑÀùc4pþ Üü;öÓ¿—_ƒô´¬üû§?¼—¿1Zìüó÷¯å÷?§k¿qàÑÀ? 84ØÎ~ZÏ€S´o0`À€ 0`À€ Ø øS4ðdÛ<º+€ 0`À€ 0`À€ 0`À€=‚×Ç.ò N€cWÀvÀ«› 0àðàü¦¬[6ÎùñZqÙåa“àóßn×í mñëÃÁÿe\¾­U—]6®L2=¸êÛÃöÀ•iµWm›×.Ôß¿j{ظ2uúàªÃÆÀ•ÉâWí¶®MŽ¿Þ„Í&¸~1ÀÞ•ûw³nYüP¼U‰!pÛbÒ¥#vÀÛ®I)¶Öñةᚄbk]˽®I'EOëÎbø9úÒ7ÿO2Z*ßì`Õ¾†÷´.Çû«öu8.âQº™ÅÚrKS1­ÂÍ;Ö&¯©¨eÙf% àãÃ"EñºúGúäð¨OI|²ú¥uvxXL« [Û,Ä»Ž?Wv<ÎŒZ^ÆÛ§Ë¸š_˜/Çãb>eÂ,žóù£ó´þHRpA!õ°x­+¾á._¹p÷'†oØ8xìî-=¦ 0`ÀÁŒ[J¿ŠùIEND®B`‚grr-3.1.0.2/grr/gui/static/third-party/jstree/themes/default/throbber.gif000066400000000000000000000032701273104013200262570ustar00rootroot00000000000000GIF89aóÿÿÿðððŠŠŠàààFFFzzzXXX$$$¬¬¬¾¾¾œœœ666hhh!ÿ NETSCAPE2.0!þCreated with ajaxload.info!ù ,qHè;uj0І1P›4HЈÁ¨ £`+œI1ƒÍq|¦Ì@×P¸p@\ á8â4‚Q¢®QZº^­ŠÂ-¨ gË8) fl °9£C‘` äO Tp%#‡ c% U!ù ,pHhyµÎ9Ȉ1 K²Iƒá€Í*Ûƒ,ŒAlÁ ÇÅ`Èh•  ø|&@ÂsÒHBv¢DŒÃãÁ­~½†UåM^à)àÄH6?Æ xMl< L&‚kljŠ('K'!ù ,rH(µÎ9ÞN²ICs€âa(Û0F& pP”$‚@à0 ãî±8 (ZF (‰Â ˜(† èiDNÎÔ1¹:Hd%£M ñÀÈ2 £ °ö×x2GOyo 0Oyrn;bq'1b'!ù ,pH(cµÎ9JñÊ& ŽQNÀ,J¨5PÂ3„Â…`0 ‹J'õ;)—ä£ðl¸_@ÁH$v¦ÇbÑ ]àM+ê  g@Ï ˜Í§)áþêv1[oƒz ;„|zM1n&&&!ù ,fHh)µÎ9N†ñÊ& † ¹}@A†Œ±Pu, è\+™ÐI 4EÈÀ|ž Êq ؜ɱä] ÚMkI±7JêÙŠÕH”!íõ8¨ÂÈeÜçs†¾êyVn‚y†&„ƒ!ù ,xH¨RµÎRBñÃ&…' RrÕð ë°T(É2—‚c‡ dŒ&08¯ÏÀ³ éÀg0‚`»ÕlÄâAa~6£Ü¦K¦!êË~M }B€Ab©pž$ÁSÑ®I€±Jž½ËÃÁ¨†Ç™°ŠC¡’p ŒA±Hˆ4zY *‰f!ù ,oHh¸têË{ÕÔà¢6 aWba£(¥â¥5ÐßU‰ìò@ ÀNA;4‹Br™‰Ô$På(®ÜEðHTC!@80YQ¡ÀÂcà’L z YSY>Z g t!ù ,sHh¸tjµÆý˜(ž6 Àa$_Šˆ! †_^5ÔFB²«X …æ8ˆ²ZX©Uý(¬I@Ñ« †Žñ’(Ì.AàQX%(¡ÅQê,!DM ˆS‡ a[ 0;grr-3.1.0.2/grr/gui/static/third-party/third-party.bundle.css000066400000000000000000006772241273104013200240250ustar00rootroot00000000000000/* third_party/javascript/jstree/themes/default/style.css */ /* jsTree default theme */ .jstree-node, .jstree-children, .jstree-container-ul { display: block; margin: 0; padding: 0; list-style-type: none; list-style-image: none; } .jstree-node { white-space: nowrap; } .jstree-anchor { display: inline-block; color: black; white-space: nowrap; padding: 0 4px 0 1px; margin: 0; vertical-align: top; } .jstree-anchor:focus { outline: 0; } .jstree-anchor, .jstree-anchor:link, .jstree-anchor:visited, .jstree-anchor:hover, .jstree-anchor:active { text-decoration: none; color: inherit; } .jstree-icon { display: inline-block; text-decoration: none; margin: 0; padding: 0; vertical-align: top; text-align: center; } .jstree-icon:empty { display: inline-block; text-decoration: none; margin: 0; padding: 0; vertical-align: top; text-align: center; } .jstree-ocl { cursor: pointer; } .jstree-leaf > .jstree-ocl { cursor: default; } .jstree .jstree-open > .jstree-children { display: block; } .jstree .jstree-closed > .jstree-children, .jstree .jstree-leaf > .jstree-children { display: none; } .jstree-anchor > .jstree-themeicon { margin-right: 2px; } .jstree-no-icons .jstree-themeicon, .jstree-anchor > .jstree-themeicon-hidden { display: none; } .jstree-hidden, .jstree-node.jstree-hidden { display: none; } .jstree-rtl .jstree-anchor { padding: 0 1px 0 4px; } .jstree-rtl .jstree-anchor > .jstree-themeicon { margin-left: 2px; margin-right: 0; } .jstree-rtl .jstree-node { margin-left: 0; } .jstree-rtl .jstree-container-ul > .jstree-node { margin-right: 0; } .jstree-wholerow-ul { position: relative; display: inline-block; min-width: 100%; } .jstree-wholerow-ul .jstree-leaf > .jstree-ocl { cursor: pointer; } .jstree-wholerow-ul .jstree-anchor, .jstree-wholerow-ul .jstree-icon { position: relative; } .jstree-wholerow-ul .jstree-wholerow { width: 100%; cursor: pointer; position: absolute; left: 0; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .vakata-context { display: none; } .vakata-context, .vakata-context ul { margin: 0; padding: 2px; position: absolute; background: #f5f5f5; border: 1px solid #979797; box-shadow: 2px 2px 2px #999999; } .vakata-context ul { list-style: none; left: 100%; margin-top: -2.7em; margin-left: -4px; } .vakata-context .vakata-context-right ul { left: auto; right: 100%; margin-left: auto; margin-right: -4px; } .vakata-context li { list-style: none; } .vakata-context li > a { display: block; padding: 0 2em 0 2em; text-decoration: none; width: auto; color: black; white-space: nowrap; line-height: 2.4em; text-shadow: 1px 1px 0 white; border-radius: 1px; } .vakata-context li > a:hover { position: relative; background-color: #e8eff7; box-shadow: 0 0 2px #0a6aa1; } .vakata-context li > a.vakata-context-parent { background-image: url("../images/third-party/data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAIORI4JlrqN1oMSnmmZDQUAOw=="); background-position: right center; background-repeat: no-repeat; } .vakata-context li > a:focus { outline: 0; } .vakata-context .vakata-context-hover > a { position: relative; background-color: #e8eff7; box-shadow: 0 0 2px #0a6aa1; } .vakata-context .vakata-context-separator > a, .vakata-context .vakata-context-separator > a:hover { background: white; border: 0; border-top: 1px solid #e2e3e3; height: 1px; min-height: 1px; max-height: 1px; padding: 0; margin: 0 0 0 2.4em; border-left: 1px solid #e0e0e0; text-shadow: 0 0 0 transparent; box-shadow: 0 0 0 transparent; border-radius: 0; } .vakata-context .vakata-contextmenu-disabled a, .vakata-context .vakata-contextmenu-disabled a:hover { color: silver; background-color: transparent; border: 0; box-shadow: 0 0 0; } .vakata-context li > a > i { text-decoration: none; display: inline-block; width: 2.4em; height: 2.4em; background: transparent; margin: 0 0 0 -2em; vertical-align: top; text-align: center; line-height: 2.4em; } .vakata-context li > a > i:empty { width: 2.4em; line-height: 2.4em; } .vakata-context li > a .vakata-contextmenu-sep { display: inline-block; width: 1px; height: 2.4em; background: white; margin: 0 0.5em 0 0; border-left: 1px solid #e2e3e3; } .vakata-context .vakata-contextmenu-shortcut { font-size: 0.8em; color: silver; opacity: 0.5; display: none; } .vakata-context-rtl ul { left: auto; right: 100%; margin-left: auto; margin-right: -4px; } .vakata-context-rtl li > a.vakata-context-parent { background-image: url("../images/third-party/data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAINjI+AC7rWHIsPtmoxLAA7"); background-position: left center; background-repeat: no-repeat; } .vakata-context-rtl .vakata-context-separator > a { margin: 0 2.4em 0 0; border-left: 0; border-right: 1px solid #e2e3e3; } .vakata-context-rtl .vakata-context-left ul { right: auto; left: 100%; margin-left: -4px; margin-right: auto; } .vakata-context-rtl li > a > i { margin: 0 -2em 0 0; } .vakata-context-rtl li > a .vakata-contextmenu-sep { margin: 0 0 0 0.5em; border-left-color: white; background: #e2e3e3; } #jstree-marker { position: absolute; top: 0; left: 0; margin: -5px 0 0 0; padding: 0; border-right: 0; border-top: 5px solid transparent; border-bottom: 5px solid transparent; border-left: 5px solid; width: 0; height: 0; font-size: 0; line-height: 0; } #jstree-dnd { line-height: 16px; margin: 0; padding: 4px; } #jstree-dnd .jstree-icon, #jstree-dnd .jstree-copy { display: inline-block; text-decoration: none; margin: 0 2px 0 0; padding: 0; width: 16px; height: 16px; } #jstree-dnd .jstree-ok { background: green; } #jstree-dnd .jstree-er { background: red; } #jstree-dnd .jstree-copy { margin: 0 2px 0 2px; } .jstree-default .jstree-node, .jstree-default .jstree-icon { background-repeat: no-repeat; background-color: transparent; } .jstree-default .jstree-anchor, .jstree-default .jstree-wholerow { transition: background-color 0.15s, box-shadow 0.15s; } .jstree-default .jstree-hovered { background: #e7f4f9; border-radius: 2px; box-shadow: inset 0 0 1px #cccccc; } .jstree-default .jstree-context { background: #e7f4f9; border-radius: 2px; box-shadow: inset 0 0 1px #cccccc; } .jstree-default .jstree-clicked { background: #beebff; border-radius: 2px; box-shadow: inset 0 0 1px #999999; } .jstree-default .jstree-no-icons .jstree-anchor > .jstree-themeicon { display: none; } .jstree-default .jstree-disabled { background: transparent; color: #666666; } .jstree-default .jstree-disabled.jstree-hovered { background: transparent; box-shadow: none; } .jstree-default .jstree-disabled.jstree-clicked { background: #efefef; } .jstree-default .jstree-disabled > .jstree-icon { opacity: 0.8; filter: url("../images/third-party/data:image/svg+xml;utf8,#jstree-grayscale"); /* Firefox 10+ */ filter: gray; /* IE6-9 */ -webkit-filter: grayscale(100%); /* Chrome 19+ & Safari 6+ */ } .jstree-default .jstree-search { font-style: italic; color: #8b0000; font-weight: bold; } .jstree-default .jstree-no-checkboxes .jstree-checkbox { display: none !important; } .jstree-default.jstree-checkbox-no-clicked .jstree-clicked { background: transparent; box-shadow: none; } .jstree-default.jstree-checkbox-no-clicked .jstree-clicked.jstree-hovered { background: #e7f4f9; } .jstree-default.jstree-checkbox-no-clicked > .jstree-wholerow-ul .jstree-wholerow-clicked { background: transparent; } .jstree-default.jstree-checkbox-no-clicked > .jstree-wholerow-ul .jstree-wholerow-clicked.jstree-wholerow-hovered { background: #e7f4f9; } .jstree-default > .jstree-striped { min-width: 100%; display: inline-block; background: url("../images/third-party/data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB/qqA+AAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlMNAMM9s3UAAAAXSURBVHjajcEBAQAAAIKg/H/aCQZ70AUBjAATb6YPDgAAAABJRU5ErkJggg==") left top repeat; } .jstree-default > .jstree-wholerow-ul .jstree-hovered, .jstree-default > .jstree-wholerow-ul .jstree-clicked { background: transparent; box-shadow: none; border-radius: 0; } .jstree-default .jstree-wholerow { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; } .jstree-default .jstree-wholerow-hovered { background: #e7f4f9; } .jstree-default .jstree-wholerow-clicked { background: #beebff; background: -webkit-linear-gradient(top, #beebff 0%, #a8e4ff 100%); background: linear-gradient(to bottom, #beebff 0%, #a8e4ff 100%); } .jstree-default .jstree-node { min-height: 24px; line-height: 24px; margin-left: 24px; min-width: 24px; } .jstree-default .jstree-anchor { line-height: 24px; height: 24px; } .jstree-default .jstree-icon { width: 24px; height: 24px; line-height: 24px; } .jstree-default .jstree-icon:empty { width: 24px; height: 24px; line-height: 24px; } .jstree-default.jstree-rtl .jstree-node { margin-right: 24px; } .jstree-default .jstree-wholerow { height: 24px; } .jstree-default .jstree-node, .jstree-default .jstree-icon { background-image: url("../images/third-party/32px.png"); } .jstree-default .jstree-node { background-position: -292px -4px; background-repeat: repeat-y; } .jstree-default .jstree-last { background: transparent; } .jstree-default .jstree-open > .jstree-ocl { background-position: -132px -4px; } .jstree-default .jstree-closed > .jstree-ocl { background-position: -100px -4px; } .jstree-default .jstree-leaf > .jstree-ocl { background-position: -68px -4px; } .jstree-default .jstree-themeicon { background-position: -260px -4px; } .jstree-default > .jstree-no-dots .jstree-node, .jstree-default > .jstree-no-dots .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default > .jstree-no-dots .jstree-open > .jstree-ocl { background-position: -36px -4px; } .jstree-default > .jstree-no-dots .jstree-closed > .jstree-ocl { background-position: -4px -4px; } .jstree-default .jstree-disabled { background: transparent; } .jstree-default .jstree-disabled.jstree-hovered { background: transparent; } .jstree-default .jstree-disabled.jstree-clicked { background: #efefef; } .jstree-default .jstree-checkbox { background-position: -164px -4px; } .jstree-default .jstree-checkbox:hover { background-position: -164px -36px; } .jstree-default.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox, .jstree-default .jstree-checked > .jstree-checkbox { background-position: -228px -4px; } .jstree-default.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover, .jstree-default .jstree-checked > .jstree-checkbox:hover { background-position: -228px -36px; } .jstree-default .jstree-anchor > .jstree-undetermined { background-position: -196px -4px; } .jstree-default .jstree-anchor > .jstree-undetermined:hover { background-position: -196px -36px; } .jstree-default .jstree-checkbox-disabled { opacity: 0.8; filter: url("../images/third-party/data:image/svg+xml;utf8,#jstree-grayscale"); /* Firefox 10+ */ filter: gray; /* IE6-9 */ -webkit-filter: grayscale(100%); /* Chrome 19+ & Safari 6+ */ } .jstree-default > .jstree-striped { background-size: auto 48px; } .jstree-default.jstree-rtl .jstree-node { background-image: url("../images/third-party/data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); background-position: 100% 1px; background-repeat: repeat-y; } .jstree-default.jstree-rtl .jstree-last { background: transparent; } .jstree-default.jstree-rtl .jstree-open > .jstree-ocl { background-position: -132px -36px; } .jstree-default.jstree-rtl .jstree-closed > .jstree-ocl { background-position: -100px -36px; } .jstree-default.jstree-rtl .jstree-leaf > .jstree-ocl { background-position: -68px -36px; } .jstree-default.jstree-rtl > .jstree-no-dots .jstree-node, .jstree-default.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl { background-position: -36px -36px; } .jstree-default.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl { background-position: -4px -36px; } .jstree-default .jstree-themeicon-custom { background-color: transparent; background-image: none; background-position: 0 0; } .jstree-default > .jstree-container-ul .jstree-loading > .jstree-ocl { background: url("../images/third-party/throbber.gif") center center no-repeat; } .jstree-default .jstree-file { background: url("../images/third-party/32px.png") -100px -68px no-repeat; } .jstree-default .jstree-folder { background: url("../images/third-party/32px.png") -260px -4px no-repeat; } .jstree-default > .jstree-container-ul > .jstree-node { margin-left: 0; margin-right: 0; } #jstree-dnd.jstree-default { line-height: 24px; padding: 0 4px; } #jstree-dnd.jstree-default .jstree-ok, #jstree-dnd.jstree-default .jstree-er { background-image: url("../images/third-party/32px.png"); background-repeat: no-repeat; background-color: transparent; } #jstree-dnd.jstree-default i { background: transparent; width: 24px; height: 24px; line-height: 24px; } #jstree-dnd.jstree-default .jstree-ok { background-position: -4px -68px; } #jstree-dnd.jstree-default .jstree-er { background-position: -36px -68px; } .jstree-default.jstree-rtl .jstree-node { background-image: url("../images/third-party/data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); } .jstree-default.jstree-rtl .jstree-last { background: transparent; } .jstree-default-small .jstree-node { min-height: 18px; line-height: 18px; margin-left: 18px; min-width: 18px; } .jstree-default-small .jstree-anchor { line-height: 18px; height: 18px; } .jstree-default-small .jstree-icon { width: 18px; height: 18px; line-height: 18px; } .jstree-default-small .jstree-icon:empty { width: 18px; height: 18px; line-height: 18px; } .jstree-default-small.jstree-rtl .jstree-node { margin-right: 18px; } .jstree-default-small .jstree-wholerow { height: 18px; } .jstree-default-small .jstree-node, .jstree-default-small .jstree-icon { background-image: url("../images/third-party/32px.png"); } .jstree-default-small .jstree-node { background-position: -295px -7px; background-repeat: repeat-y; } .jstree-default-small .jstree-last { background: transparent; } .jstree-default-small .jstree-open > .jstree-ocl { background-position: -135px -7px; } .jstree-default-small .jstree-closed > .jstree-ocl { background-position: -103px -7px; } .jstree-default-small .jstree-leaf > .jstree-ocl { background-position: -71px -7px; } .jstree-default-small .jstree-themeicon { background-position: -263px -7px; } .jstree-default-small > .jstree-no-dots .jstree-node, .jstree-default-small > .jstree-no-dots .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default-small > .jstree-no-dots .jstree-open > .jstree-ocl { background-position: -39px -7px; } .jstree-default-small > .jstree-no-dots .jstree-closed > .jstree-ocl { background-position: -7px -7px; } .jstree-default-small .jstree-disabled { background: transparent; } .jstree-default-small .jstree-disabled.jstree-hovered { background: transparent; } .jstree-default-small .jstree-disabled.jstree-clicked { background: #efefef; } .jstree-default-small .jstree-checkbox { background-position: -167px -7px; } .jstree-default-small .jstree-checkbox:hover { background-position: -167px -39px; } .jstree-default-small.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox, .jstree-default-small .jstree-checked > .jstree-checkbox { background-position: -231px -7px; } .jstree-default-small.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover, .jstree-default-small .jstree-checked > .jstree-checkbox:hover { background-position: -231px -39px; } .jstree-default-small .jstree-anchor > .jstree-undetermined { background-position: -199px -7px; } .jstree-default-small .jstree-anchor > .jstree-undetermined:hover { background-position: -199px -39px; } .jstree-default-small .jstree-checkbox-disabled { opacity: 0.8; filter: url("../images/third-party/data:image/svg+xml;utf8,#jstree-grayscale"); /* Firefox 10+ */ filter: gray; /* IE6-9 */ -webkit-filter: grayscale(100%); /* Chrome 19+ & Safari 6+ */ } .jstree-default-small > .jstree-striped { background-size: auto 36px; } .jstree-default-small.jstree-rtl .jstree-node { background-image: url("../images/third-party/data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); background-position: 100% 1px; background-repeat: repeat-y; } .jstree-default-small.jstree-rtl .jstree-last { background: transparent; } .jstree-default-small.jstree-rtl .jstree-open > .jstree-ocl { background-position: -135px -39px; } .jstree-default-small.jstree-rtl .jstree-closed > .jstree-ocl { background-position: -103px -39px; } .jstree-default-small.jstree-rtl .jstree-leaf > .jstree-ocl { background-position: -71px -39px; } .jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-node, .jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl { background-position: -39px -39px; } .jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl { background-position: -7px -39px; } .jstree-default-small .jstree-themeicon-custom { background-color: transparent; background-image: none; background-position: 0 0; } .jstree-default-small > .jstree-container-ul .jstree-loading > .jstree-ocl { background: url("../images/third-party/throbber.gif") center center no-repeat; } .jstree-default-small .jstree-file { background: url("../images/third-party/32px.png") -103px -71px no-repeat; } .jstree-default-small .jstree-folder { background: url("../images/third-party/32px.png") -263px -7px no-repeat; } .jstree-default-small > .jstree-container-ul > .jstree-node { margin-left: 0; margin-right: 0; } #jstree-dnd.jstree-default-small { line-height: 18px; padding: 0 4px; } #jstree-dnd.jstree-default-small .jstree-ok, #jstree-dnd.jstree-default-small .jstree-er { background-image: url("../images/third-party/32px.png"); background-repeat: no-repeat; background-color: transparent; } #jstree-dnd.jstree-default-small i { background: transparent; width: 18px; height: 18px; line-height: 18px; } #jstree-dnd.jstree-default-small .jstree-ok { background-position: -7px -71px; } #jstree-dnd.jstree-default-small .jstree-er { background-position: -39px -71px; } .jstree-default-small.jstree-rtl .jstree-node { background-image: url("../images/third-party/data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg=="); } .jstree-default-small.jstree-rtl .jstree-last { background: transparent; } .jstree-default-large .jstree-node { min-height: 32px; line-height: 32px; margin-left: 32px; min-width: 32px; } .jstree-default-large .jstree-anchor { line-height: 32px; height: 32px; } .jstree-default-large .jstree-icon { width: 32px; height: 32px; line-height: 32px; } .jstree-default-large .jstree-icon:empty { width: 32px; height: 32px; line-height: 32px; } .jstree-default-large.jstree-rtl .jstree-node { margin-right: 32px; } .jstree-default-large .jstree-wholerow { height: 32px; } .jstree-default-large .jstree-node, .jstree-default-large .jstree-icon { background-image: url("../images/third-party/32px.png"); } .jstree-default-large .jstree-node { background-position: -288px 0px; background-repeat: repeat-y; } .jstree-default-large .jstree-last { background: transparent; } .jstree-default-large .jstree-open > .jstree-ocl { background-position: -128px 0px; } .jstree-default-large .jstree-closed > .jstree-ocl { background-position: -96px 0px; } .jstree-default-large .jstree-leaf > .jstree-ocl { background-position: -64px 0px; } .jstree-default-large .jstree-themeicon { background-position: -256px 0px; } .jstree-default-large > .jstree-no-dots .jstree-node, .jstree-default-large > .jstree-no-dots .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default-large > .jstree-no-dots .jstree-open > .jstree-ocl { background-position: -32px 0px; } .jstree-default-large > .jstree-no-dots .jstree-closed > .jstree-ocl { background-position: 0px 0px; } .jstree-default-large .jstree-disabled { background: transparent; } .jstree-default-large .jstree-disabled.jstree-hovered { background: transparent; } .jstree-default-large .jstree-disabled.jstree-clicked { background: #efefef; } .jstree-default-large .jstree-checkbox { background-position: -160px 0px; } .jstree-default-large .jstree-checkbox:hover { background-position: -160px -32px; } .jstree-default-large.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox, .jstree-default-large .jstree-checked > .jstree-checkbox { background-position: -224px 0px; } .jstree-default-large.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover, .jstree-default-large .jstree-checked > .jstree-checkbox:hover { background-position: -224px -32px; } .jstree-default-large .jstree-anchor > .jstree-undetermined { background-position: -192px 0px; } .jstree-default-large .jstree-anchor > .jstree-undetermined:hover { background-position: -192px -32px; } .jstree-default-large .jstree-checkbox-disabled { opacity: 0.8; filter: url("../images/third-party/data:image/svg+xml;utf8,#jstree-grayscale"); /* Firefox 10+ */ filter: gray; /* IE6-9 */ -webkit-filter: grayscale(100%); /* Chrome 19+ & Safari 6+ */ } .jstree-default-large > .jstree-striped { background-size: auto 64px; } .jstree-default-large.jstree-rtl .jstree-node { background-image: url("../images/third-party/data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); background-position: 100% 1px; background-repeat: repeat-y; } .jstree-default-large.jstree-rtl .jstree-last { background: transparent; } .jstree-default-large.jstree-rtl .jstree-open > .jstree-ocl { background-position: -128px -32px; } .jstree-default-large.jstree-rtl .jstree-closed > .jstree-ocl { background-position: -96px -32px; } .jstree-default-large.jstree-rtl .jstree-leaf > .jstree-ocl { background-position: -64px -32px; } .jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-node, .jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl { background-position: -32px -32px; } .jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl { background-position: 0px -32px; } .jstree-default-large .jstree-themeicon-custom { background-color: transparent; background-image: none; background-position: 0 0; } .jstree-default-large > .jstree-container-ul .jstree-loading > .jstree-ocl { background: url("../images/third-party/throbber.gif") center center no-repeat; } .jstree-default-large .jstree-file { background: url("../images/third-party/32px.png") -96px -64px no-repeat; } .jstree-default-large .jstree-folder { background: url("../images/third-party/32px.png") -256px 0px no-repeat; } .jstree-default-large > .jstree-container-ul > .jstree-node { margin-left: 0; margin-right: 0; } #jstree-dnd.jstree-default-large { line-height: 32px; padding: 0 4px; } #jstree-dnd.jstree-default-large .jstree-ok, #jstree-dnd.jstree-default-large .jstree-er { background-image: url("../images/third-party/32px.png"); background-repeat: no-repeat; background-color: transparent; } #jstree-dnd.jstree-default-large i { background: transparent; width: 32px; height: 32px; line-height: 32px; } #jstree-dnd.jstree-default-large .jstree-ok { background-position: 0px -64px; } #jstree-dnd.jstree-default-large .jstree-er { background-position: -32px -64px; } .jstree-default-large.jstree-rtl .jstree-node { background-image: url("../images/third-party/data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg=="); } .jstree-default-large.jstree-rtl .jstree-last { background: transparent; } @media (max-width: 768px) { #jstree-dnd.jstree-dnd-responsive { line-height: 40px; font-weight: bold; font-size: 1.1em; text-shadow: 1px 1px white; } #jstree-dnd.jstree-dnd-responsive > i { background: transparent; width: 40px; height: 40px; } #jstree-dnd.jstree-dnd-responsive > .jstree-ok { background-image: url("../images/third-party/40px.png"); background-position: 0 -200px; background-size: 120px 240px; } #jstree-dnd.jstree-dnd-responsive > .jstree-er { background-image: url("../images/third-party/40px.png"); background-position: -40px -200px; background-size: 120px 240px; } #jstree-marker.jstree-dnd-responsive { border-left-width: 10px; border-top-width: 10px; border-bottom-width: 10px; margin-top: -10px; } } @media (max-width: 768px) { .jstree-default-responsive { /* .jstree-open > .jstree-ocl, .jstree-closed > .jstree-ocl { border-radius:20px; background-color:white; } */ } .jstree-default-responsive .jstree-icon { background-image: url("../images/third-party/40px.png"); } .jstree-default-responsive .jstree-node, .jstree-default-responsive .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default-responsive .jstree-node { min-height: 40px; line-height: 40px; margin-left: 40px; min-width: 40px; white-space: nowrap; } .jstree-default-responsive .jstree-anchor { line-height: 40px; height: 40px; } .jstree-default-responsive .jstree-icon, .jstree-default-responsive .jstree-icon:empty { width: 40px; height: 40px; line-height: 40px; } .jstree-default-responsive > .jstree-container-ul > .jstree-node { margin-left: 0; } .jstree-default-responsive.jstree-rtl .jstree-node { margin-left: 0; margin-right: 40px; background: transparent; } .jstree-default-responsive.jstree-rtl .jstree-container-ul > .jstree-node { margin-right: 0; } .jstree-default-responsive .jstree-ocl, .jstree-default-responsive .jstree-themeicon, .jstree-default-responsive .jstree-checkbox { background-size: 120px 240px; } .jstree-default-responsive .jstree-leaf > .jstree-ocl, .jstree-default-responsive.jstree-rtl .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default-responsive .jstree-open > .jstree-ocl { background-position: 0 0px !important; } .jstree-default-responsive .jstree-closed > .jstree-ocl { background-position: 0 -40px !important; } .jstree-default-responsive.jstree-rtl .jstree-closed > .jstree-ocl { background-position: -40px 0px !important; } .jstree-default-responsive .jstree-themeicon { background-position: -40px -40px; } .jstree-default-responsive .jstree-checkbox, .jstree-default-responsive .jstree-checkbox:hover { background-position: -40px -80px; } .jstree-default-responsive.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox, .jstree-default-responsive.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover, .jstree-default-responsive .jstree-checked > .jstree-checkbox, .jstree-default-responsive .jstree-checked > .jstree-checkbox:hover { background-position: 0 -80px; } .jstree-default-responsive .jstree-anchor > .jstree-undetermined, .jstree-default-responsive .jstree-anchor > .jstree-undetermined:hover { background-position: 0 -120px; } .jstree-default-responsive .jstree-anchor { font-weight: bold; font-size: 1.1em; text-shadow: 1px 1px white; } .jstree-default-responsive > .jstree-striped { background: transparent; } .jstree-default-responsive .jstree-wholerow { border-top: 1px solid rgba(255, 255, 255, 0.7); border-bottom: 1px solid rgba(64, 64, 64, 0.2); background: #ebebeb; height: 40px; } .jstree-default-responsive .jstree-wholerow-hovered { background: #e7f4f9; } .jstree-default-responsive .jstree-wholerow-clicked { background: #beebff; } .jstree-default-responsive .jstree-children .jstree-last > .jstree-wholerow { box-shadow: inset 0 -6px 3px -5px #666666; } .jstree-default-responsive .jstree-children .jstree-open > .jstree-wholerow { box-shadow: inset 0 6px 3px -5px #666666; border-top: 0; } .jstree-default-responsive .jstree-children .jstree-open + .jstree-open { box-shadow: none; } .jstree-default-responsive .jstree-node, .jstree-default-responsive .jstree-icon, .jstree-default-responsive .jstree-node > .jstree-ocl, .jstree-default-responsive .jstree-themeicon, .jstree-default-responsive .jstree-checkbox { background-image: url("../images/third-party/40px.png"); background-size: 120px 240px; } .jstree-default-responsive .jstree-node { background-position: -80px 0; background-repeat: repeat-y; } .jstree-default-responsive .jstree-last { background: transparent; } .jstree-default-responsive .jstree-leaf > .jstree-ocl { background-position: -40px -120px; } .jstree-default-responsive .jstree-last > .jstree-ocl { background-position: -40px -160px; } .jstree-default-responsive .jstree-themeicon-custom { background-color: transparent; background-image: none; background-position: 0 0; } .jstree-default-responsive .jstree-file { background: url("../images/third-party/40px.png") 0 -160px no-repeat; background-size: 120px 240px; } .jstree-default-responsive .jstree-folder { background: url("../images/third-party/40px.png") -40px -40px no-repeat; background-size: 120px 240px; } .jstree-default-responsive > .jstree-container-ul > .jstree-node { margin-left: 0; margin-right: 0; } } /* third_party/javascript/jquery_splitter/splitter.css */ .splitbarV { float : left; width : 6px; height : 100%; line-height : 0px; font-size : 0px; border-left : solid 1px #9cbdff; border-right : solid 1px #9cbdff; background : #cbe1fb url(/static/images/panev.gif) 0% 50% } .splitbarH { height : 6px; text-align : left; line-height : 0px; font-size : 0px; border-top : solid 1px #9cbdff; border-bottom : solid 1px #9cbdff; background : #cbe1fb url(/static/images/paneh.gif) 50% 0% } .splitbuttonV { margin-top : -41px; margin-left : -4px; top : 50%; position : relative; height : 83px; width : 10px; background : transparent url(/static/images/panevc.gif) 10px 50% } .splitbuttonV.invert { margin-left : 0px; background : transparent url(/static/images/panevc.gif) 0px 50% } .splitbuttonH { margin-left : -41px; left : 50%; position : relative; height : 10px !important; width : 83px; background : transparent url(/static/images/panehc.gif) 50% 0px } .splitbuttonH.invert { margin-top : -4px; background : transparent url(/static/images/panehc.gif) 50% -10px } /* third_party/javascript/jquery_timeentry/jquery.timeentry.css */ /* timeEntry styles */ .timeEntry_control { vertical-align: middle; margin-left: 2px; } * html .timeEntry_control { /* IE only */ margin-top: -4px; } /* grr/gui/bootstrap_grr_css-bundle.css */ /* grr/gui/bootstrap_grr_less.css */ /* The MIT License (MIT) Copyright (c) 2011-2015 Twitter, Inc Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* Required attribution per LICENSE. The ! syntax allows this comment to * survive minification by lessc. */ /*! * Bootstrap v3.3.4 (http://getbootstrap.com) * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ /* Required attribution per LICENSE. The ! syntax allows this comment to * survive minification by lessc. */ /*! * Bootstrap v3.3.4 (http://getbootstrap.com) * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ /*! normalize.css v3.0.2 | MIT License | git.io/normalize */ html { font-family: sans-serif; -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%; } body { margin: 0; } article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, nav, section, summary { display: block; } audio, canvas, progress, video { display: inline-block; vertical-align: baseline; } audio:not([controls]) { display: none; height: 0; } [hidden], template { display: none; } a { background-color: transparent; } a:active, a:hover { outline: 0; } abbr[title] { border-bottom: 1px dotted; } b, strong { font-weight: bold; } dfn { font-style: italic; } h1 { font-size: 2em; margin: 0.67em 0; } mark { background: #ff0; color: #000; } small { font-size: 80%; } sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } sup { top: -0.5em; } sub { bottom: -0.25em; } img { border: 0; } svg:not(:root) { overflow: hidden; } figure { margin: 1em 40px; } hr { -moz-box-sizing: content-box; box-sizing: content-box; height: 0; } pre { overflow: auto; } code, kbd, pre, samp { font-family: monospace, monospace; font-size: 1em; } button, input, optgroup, select, textarea { color: inherit; font: inherit; margin: 0; } button { overflow: visible; } button, select { text-transform: none; } button, html input[type="button"], input[type="reset"], input[type="submit"] { -webkit-appearance: button; cursor: pointer; } button[disabled], html input[disabled] { cursor: default; } button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; } input { line-height: normal; } input[type="checkbox"], input[type="radio"] { box-sizing: border-box; padding: 0; } input[type="number"]::-webkit-inner-spin-button, input[type="number"]::-webkit-outer-spin-button { height: auto; } input[type="search"] { -webkit-appearance: textfield; -moz-box-sizing: content-box; -webkit-box-sizing: content-box; box-sizing: content-box; } input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } legend { border: 0; padding: 0; } textarea { overflow: auto; } optgroup { font-weight: bold; } table { border-collapse: collapse; border-spacing: 0; } td, th { padding: 0; } /*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ @media print { *, *:before, *:after { background: transparent !important; color: #000 !important; box-shadow: none !important; text-shadow: none !important; } a, a:visited { text-decoration: underline; } a[href]:after { content: " (" attr(href) ")"; } abbr[title]:after { content: " (" attr(title) ")"; } a[href^="#"]:after, a[href^="javascript:"]:after { content: ""; } pre, blockquote { border: 1px solid #999; page-break-inside: avoid; } thead { display: table-header-group; } tr, img { page-break-inside: avoid; } img { max-width: 100% !important; } p, h2, h3 { orphans: 3; widows: 3; } h2, h3 { page-break-after: avoid; } select { background: #fff !important; } .navbar { display: none; } .btn > .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px solid #000; } .table { border-collapse: collapse !important; } .table td, .table th { background-color: #fff !important; } .table-bordered th, .table-bordered td { border: 1px solid #ddd !important; } } @font-face { font-family: 'Glyphicons Halflings'; src: url('/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.eot'); src: url('/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.woff') format('woff'), url('/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('/static/third-party/bootstrap/fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); } .glyphicon { position: relative; top: 1px; display: inline-block; font-family: 'Glyphicons Halflings'; font-style: normal; font-weight: normal; line-height: 1; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .glyphicon-asterisk:before { content: "\2a"; } .glyphicon-plus:before { content: "\2b"; } .glyphicon-euro:before, .glyphicon-eur:before { content: "\20ac"; } .glyphicon-minus:before { content: "\2212"; } .glyphicon-cloud:before { content: "\2601"; } .glyphicon-envelope:before { content: "\2709"; } .glyphicon-pencil:before { content: "\270f"; } .glyphicon-glass:before { content: "\e001"; } .glyphicon-music:before { content: "\e002"; } .glyphicon-search:before { content: "\e003"; } .glyphicon-heart:before { content: "\e005"; } .glyphicon-star:before { content: "\e006"; } .glyphicon-star-empty:before { content: "\e007"; } .glyphicon-user:before { content: "\e008"; } .glyphicon-film:before { content: "\e009"; } .glyphicon-th-large:before { content: "\e010"; } .glyphicon-th:before { content: "\e011"; } .glyphicon-th-list:before { content: "\e012"; } .glyphicon-ok:before { content: "\e013"; } .glyphicon-remove:before { content: "\e014"; } .glyphicon-zoom-in:before { content: "\e015"; } .glyphicon-zoom-out:before { content: "\e016"; } .glyphicon-off:before { content: "\e017"; } .glyphicon-signal:before { content: "\e018"; } .glyphicon-cog:before { content: "\e019"; } .glyphicon-trash:before { content: "\e020"; } .glyphicon-home:before { content: "\e021"; } .glyphicon-file:before { content: "\e022"; } .glyphicon-time:before { content: "\e023"; } .glyphicon-road:before { content: "\e024"; } .glyphicon-download-alt:before { content: "\e025"; } .glyphicon-download:before { content: "\e026"; } .glyphicon-upload:before { content: "\e027"; } .glyphicon-inbox:before { content: "\e028"; } .glyphicon-play-circle:before { content: "\e029"; } .glyphicon-repeat:before { content: "\e030"; } .glyphicon-refresh:before { content: "\e031"; } .glyphicon-list-alt:before { content: "\e032"; } .glyphicon-lock:before { content: "\e033"; } .glyphicon-flag:before { content: "\e034"; } .glyphicon-headphones:before { content: "\e035"; } .glyphicon-volume-off:before { content: "\e036"; } .glyphicon-volume-down:before { content: "\e037"; } .glyphicon-volume-up:before { content: "\e038"; } .glyphicon-qrcode:before { content: "\e039"; } .glyphicon-barcode:before { content: "\e040"; } .glyphicon-tag:before { content: "\e041"; } .glyphicon-tags:before { content: "\e042"; } .glyphicon-book:before { content: "\e043"; } .glyphicon-bookmark:before { content: "\e044"; } .glyphicon-print:before { content: "\e045"; } .glyphicon-camera:before { content: "\e046"; } .glyphicon-font:before { content: "\e047"; } .glyphicon-bold:before { content: "\e048"; } .glyphicon-italic:before { content: "\e049"; } .glyphicon-text-height:before { content: "\e050"; } .glyphicon-text-width:before { content: "\e051"; } .glyphicon-align-left:before { content: "\e052"; } .glyphicon-align-center:before { content: "\e053"; } .glyphicon-align-right:before { content: "\e054"; } .glyphicon-align-justify:before { content: "\e055"; } .glyphicon-list:before { content: "\e056"; } .glyphicon-indent-left:before { content: "\e057"; } .glyphicon-indent-right:before { content: "\e058"; } .glyphicon-facetime-video:before { content: "\e059"; } .glyphicon-picture:before { content: "\e060"; } .glyphicon-map-marker:before { content: "\e062"; } .glyphicon-adjust:before { content: "\e063"; } .glyphicon-tint:before { content: "\e064"; } .glyphicon-edit:before { content: "\e065"; } .glyphicon-share:before { content: "\e066"; } .glyphicon-check:before { content: "\e067"; } .glyphicon-move:before { content: "\e068"; } .glyphicon-step-backward:before { content: "\e069"; } .glyphicon-fast-backward:before { content: "\e070"; } .glyphicon-backward:before { content: "\e071"; } .glyphicon-play:before { content: "\e072"; } .glyphicon-pause:before { content: "\e073"; } .glyphicon-stop:before { content: "\e074"; } .glyphicon-forward:before { content: "\e075"; } .glyphicon-fast-forward:before { content: "\e076"; } .glyphicon-step-forward:before { content: "\e077"; } .glyphicon-eject:before { content: "\e078"; } .glyphicon-chevron-left:before { content: "\e079"; } .glyphicon-chevron-right:before { content: "\e080"; } .glyphicon-plus-sign:before { content: "\e081"; } .glyphicon-minus-sign:before { content: "\e082"; } .glyphicon-remove-sign:before { content: "\e083"; } .glyphicon-ok-sign:before { content: "\e084"; } .glyphicon-question-sign:before { content: "\e085"; } .glyphicon-info-sign:before { content: "\e086"; } .glyphicon-screenshot:before { content: "\e087"; } .glyphicon-remove-circle:before { content: "\e088"; } .glyphicon-ok-circle:before { content: "\e089"; } .glyphicon-ban-circle:before { content: "\e090"; } .glyphicon-arrow-left:before { content: "\e091"; } .glyphicon-arrow-right:before { content: "\e092"; } .glyphicon-arrow-up:before { content: "\e093"; } .glyphicon-arrow-down:before { content: "\e094"; } .glyphicon-share-alt:before { content: "\e095"; } .glyphicon-resize-full:before { content: "\e096"; } .glyphicon-resize-small:before { content: "\e097"; } .glyphicon-exclamation-sign:before { content: "\e101"; } .glyphicon-gift:before { content: "\e102"; } .glyphicon-leaf:before { content: "\e103"; } .glyphicon-fire:before { content: "\e104"; } .glyphicon-eye-open:before { content: "\e105"; } .glyphicon-eye-close:before { content: "\e106"; } .glyphicon-warning-sign:before { content: "\e107"; } .glyphicon-plane:before { content: "\e108"; } .glyphicon-calendar:before { content: "\e109"; } .glyphicon-random:before { content: "\e110"; } .glyphicon-comment:before { content: "\e111"; } .glyphicon-magnet:before { content: "\e112"; } .glyphicon-chevron-up:before { content: "\e113"; } .glyphicon-chevron-down:before { content: "\e114"; } .glyphicon-retweet:before { content: "\e115"; } .glyphicon-shopping-cart:before { content: "\e116"; } .glyphicon-folder-close:before { content: "\e117"; } .glyphicon-folder-open:before { content: "\e118"; } .glyphicon-resize-vertical:before { content: "\e119"; } .glyphicon-resize-horizontal:before { content: "\e120"; } .glyphicon-hdd:before { content: "\e121"; } .glyphicon-bullhorn:before { content: "\e122"; } .glyphicon-bell:before { content: "\e123"; } .glyphicon-certificate:before { content: "\e124"; } .glyphicon-thumbs-up:before { content: "\e125"; } .glyphicon-thumbs-down:before { content: "\e126"; } .glyphicon-hand-right:before { content: "\e127"; } .glyphicon-hand-left:before { content: "\e128"; } .glyphicon-hand-up:before { content: "\e129"; } .glyphicon-hand-down:before { content: "\e130"; } .glyphicon-circle-arrow-right:before { content: "\e131"; } .glyphicon-circle-arrow-left:before { content: "\e132"; } .glyphicon-circle-arrow-up:before { content: "\e133"; } .glyphicon-circle-arrow-down:before { content: "\e134"; } .glyphicon-globe:before { content: "\e135"; } .glyphicon-wrench:before { content: "\e136"; } .glyphicon-tasks:before { content: "\e137"; } .glyphicon-filter:before { content: "\e138"; } .glyphicon-briefcase:before { content: "\e139"; } .glyphicon-fullscreen:before { content: "\e140"; } .glyphicon-dashboard:before { content: "\e141"; } .glyphicon-paperclip:before { content: "\e142"; } .glyphicon-heart-empty:before { content: "\e143"; } .glyphicon-link:before { content: "\e144"; } .glyphicon-phone:before { content: "\e145"; } .glyphicon-pushpin:before { content: "\e146"; } .glyphicon-usd:before { content: "\e148"; } .glyphicon-gbp:before { content: "\e149"; } .glyphicon-sort:before { content: "\e150"; } .glyphicon-sort-by-alphabet:before { content: "\e151"; } .glyphicon-sort-by-alphabet-alt:before { content: "\e152"; } .glyphicon-sort-by-order:before { content: "\e153"; } .glyphicon-sort-by-order-alt:before { content: "\e154"; } .glyphicon-sort-by-attributes:before { content: "\e155"; } .glyphicon-sort-by-attributes-alt:before { content: "\e156"; } .glyphicon-unchecked:before { content: "\e157"; } .glyphicon-expand:before { content: "\e158"; } .glyphicon-collapse-down:before { content: "\e159"; } .glyphicon-collapse-up:before { content: "\e160"; } .glyphicon-log-in:before { content: "\e161"; } .glyphicon-flash:before { content: "\e162"; } .glyphicon-log-out:before { content: "\e163"; } .glyphicon-new-window:before { content: "\e164"; } .glyphicon-record:before { content: "\e165"; } .glyphicon-save:before { content: "\e166"; } .glyphicon-open:before { content: "\e167"; } .glyphicon-saved:before { content: "\e168"; } .glyphicon-import:before { content: "\e169"; } .glyphicon-export:before { content: "\e170"; } .glyphicon-send:before { content: "\e171"; } .glyphicon-floppy-disk:before { content: "\e172"; } .glyphicon-floppy-saved:before { content: "\e173"; } .glyphicon-floppy-remove:before { content: "\e174"; } .glyphicon-floppy-save:before { content: "\e175"; } .glyphicon-floppy-open:before { content: "\e176"; } .glyphicon-credit-card:before { content: "\e177"; } .glyphicon-transfer:before { content: "\e178"; } .glyphicon-cutlery:before { content: "\e179"; } .glyphicon-header:before { content: "\e180"; } .glyphicon-compressed:before { content: "\e181"; } .glyphicon-earphone:before { content: "\e182"; } .glyphicon-phone-alt:before { content: "\e183"; } .glyphicon-tower:before { content: "\e184"; } .glyphicon-stats:before { content: "\e185"; } .glyphicon-sd-video:before { content: "\e186"; } .glyphicon-hd-video:before { content: "\e187"; } .glyphicon-subtitles:before { content: "\e188"; } .glyphicon-sound-stereo:before { content: "\e189"; } .glyphicon-sound-dolby:before { content: "\e190"; } .glyphicon-sound-5-1:before { content: "\e191"; } .glyphicon-sound-6-1:before { content: "\e192"; } .glyphicon-sound-7-1:before { content: "\e193"; } .glyphicon-copyright-mark:before { content: "\e194"; } .glyphicon-registration-mark:before { content: "\e195"; } .glyphicon-cloud-download:before { content: "\e197"; } .glyphicon-cloud-upload:before { content: "\e198"; } .glyphicon-tree-conifer:before { content: "\e199"; } .glyphicon-tree-deciduous:before { content: "\e200"; } .glyphicon-cd:before { content: "\e201"; } .glyphicon-save-file:before { content: "\e202"; } .glyphicon-open-file:before { content: "\e203"; } .glyphicon-level-up:before { content: "\e204"; } .glyphicon-copy:before { content: "\e205"; } .glyphicon-paste:before { content: "\e206"; } .glyphicon-alert:before { content: "\e209"; } .glyphicon-equalizer:before { content: "\e210"; } .glyphicon-king:before { content: "\e211"; } .glyphicon-queen:before { content: "\e212"; } .glyphicon-pawn:before { content: "\e213"; } .glyphicon-bishop:before { content: "\e214"; } .glyphicon-knight:before { content: "\e215"; } .glyphicon-baby-formula:before { content: "\e216"; } .glyphicon-tent:before { content: "\26fa"; } .glyphicon-blackboard:before { content: "\e218"; } .glyphicon-bed:before { content: "\e219"; } .glyphicon-apple:before { content: "\f8ff"; } .glyphicon-erase:before { content: "\e221"; } .glyphicon-hourglass:before { content: "\231b"; } .glyphicon-lamp:before { content: "\e223"; } .glyphicon-duplicate:before { content: "\e224"; } .glyphicon-piggy-bank:before { content: "\e225"; } .glyphicon-scissors:before { content: "\e226"; } .glyphicon-bitcoin:before { content: "\e227"; } .glyphicon-btc:before { content: "\e227"; } .glyphicon-xbt:before { content: "\e227"; } .glyphicon-yen:before { content: "\00a5"; } .glyphicon-jpy:before { content: "\00a5"; } .glyphicon-ruble:before { content: "\20bd"; } .glyphicon-rub:before { content: "\20bd"; } .glyphicon-scale:before { content: "\e230"; } .glyphicon-ice-lolly:before { content: "\e231"; } .glyphicon-ice-lolly-tasted:before { content: "\e232"; } .glyphicon-education:before { content: "\e233"; } .glyphicon-option-horizontal:before { content: "\e234"; } .glyphicon-option-vertical:before { content: "\e235"; } .glyphicon-menu-hamburger:before { content: "\e236"; } .glyphicon-modal-window:before { content: "\e237"; } .glyphicon-oil:before { content: "\e238"; } .glyphicon-grain:before { content: "\e239"; } .glyphicon-sunglasses:before { content: "\e240"; } .glyphicon-text-size:before { content: "\e241"; } .glyphicon-text-color:before { content: "\e242"; } .glyphicon-text-background:before { content: "\e243"; } .glyphicon-object-align-top:before { content: "\e244"; } .glyphicon-object-align-bottom:before { content: "\e245"; } .glyphicon-object-align-horizontal:before { content: "\e246"; } .glyphicon-object-align-left:before { content: "\e247"; } .glyphicon-object-align-vertical:before { content: "\e248"; } .glyphicon-object-align-right:before { content: "\e249"; } .glyphicon-triangle-right:before { content: "\e250"; } .glyphicon-triangle-left:before { content: "\e251"; } .glyphicon-triangle-bottom:before { content: "\e252"; } .glyphicon-triangle-top:before { content: "\e253"; } .glyphicon-console:before { content: "\e254"; } .glyphicon-superscript:before { content: "\e255"; } .glyphicon-subscript:before { content: "\e256"; } .glyphicon-menu-left:before { content: "\e257"; } .glyphicon-menu-right:before { content: "\e258"; } .glyphicon-menu-down:before { content: "\e259"; } .glyphicon-menu-up:before { content: "\e260"; } * { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } *:before, *:after { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } html { font-size: 10px; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } body { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 13px; line-height: 1.31; color: #333333; background-color: #ffffff; } input, button, select, textarea { font-family: inherit; font-size: inherit; line-height: inherit; } a { color: #337ab7; text-decoration: none; } a:hover, a:focus { color: #23527c; text-decoration: underline; } a:focus { outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } figure { margin: 0; } img { vertical-align: middle; } .img-responsive, .thumbnail > img, .thumbnail a > img, .carousel-inner > .item > img, .carousel-inner > .item > a > img { display: block; max-width: 100%; height: auto; } .img-rounded { border-radius: 6px; } .img-thumbnail { padding: 4px; line-height: 1.31; background-color: #ffffff; border: 1px solid #dddddd; border-radius: 4px; -webkit-transition: all 0.2s ease-in-out; -o-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; display: inline-block; max-width: 100%; height: auto; } .img-circle { border-radius: 50%; } hr { margin-top: 17px; margin-bottom: 17px; border: 0; border-top: 1px solid #eeeeee; } .sr-only { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; } .sr-only-focusable:active, .sr-only-focusable:focus { position: static; width: auto; height: auto; margin: 0; overflow: visible; clip: auto; } [role="button"] { cursor: pointer; } h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { font-family: inherit; font-weight: 500; line-height: 1.1; color: inherit; } h1 small, h2 small, h3 small, h4 small, h5 small, h6 small, .h1 small, .h2 small, .h3 small, .h4 small, .h5 small, .h6 small, h1 .small, h2 .small, h3 .small, h4 .small, h5 .small, h6 .small, .h1 .small, .h2 .small, .h3 .small, .h4 .small, .h5 .small, .h6 .small { font-weight: normal; line-height: 1; color: #777777; } h1, .h1, h2, .h2, h3, .h3 { margin-top: 17px; margin-bottom: 8.5px; } h1 small, .h1 small, h2 small, .h2 small, h3 small, .h3 small, h1 .small, .h1 .small, h2 .small, .h2 .small, h3 .small, .h3 .small { font-size: 65%; } h4, .h4, h5, .h5, h6, .h6 { margin-top: 8.5px; margin-bottom: 8.5px; } h4 small, .h4 small, h5 small, .h5 small, h6 small, .h6 small, h4 .small, .h4 .small, h5 .small, .h5 .small, h6 .small, .h6 .small { font-size: 75%; } h1, .h1 { font-size: 33px; } h2, .h2 { font-size: 27px; } h3, .h3 { font-size: 23px; } h4, .h4 { font-size: 17px; } h5, .h5 { font-size: 13px; } h6, .h6 { font-size: 12px; } p { margin: 0 0 8.5px; } .lead { margin-bottom: 17px; font-size: 14px; font-weight: 300; line-height: 1.4; } @media (min-width: 768px) { .lead { font-size: 19.5px; } } small, .small { font-size: 92%; } mark, .mark { background-color: #fcf8e3; padding: .2em; } .text-left { text-align: left; } .text-right { text-align: right; } .text-center { text-align: center; } .text-justify { text-align: justify; } .text-nowrap { white-space: nowrap; } .text-lowercase { text-transform: lowercase; } .text-uppercase { text-transform: uppercase; } .text-capitalize { text-transform: capitalize; } .text-muted { color: #777777; } .text-primary { color: #337ab7; } a.text-primary:hover { color: #286090; } .text-success { color: #3c763d; } a.text-success:hover { color: #2b542c; } .text-info { color: #31708f; } a.text-info:hover { color: #245269; } .text-warning { color: #8a6d3b; } a.text-warning:hover { color: #66512c; } .text-danger { color: #a94442; } a.text-danger:hover { color: #843534; } .bg-primary { color: #fff; background-color: #337ab7; } a.bg-primary:hover { background-color: #286090; } .bg-success { background-color: #dff0d8; } a.bg-success:hover { background-color: #c1e2b3; } .bg-info { background-color: #d9edf7; } a.bg-info:hover { background-color: #afd9ee; } .bg-warning { background-color: #fcf8e3; } a.bg-warning:hover { background-color: #f7ecb5; } .bg-danger { background-color: #f2dede; } a.bg-danger:hover { background-color: #e4b9b9; } .page-header { padding-bottom: 7.5px; margin: 34px 0 17px; border-bottom: 1px solid #eeeeee; } ul, ol { margin-top: 0; margin-bottom: 8.5px; } ul ul, ol ul, ul ol, ol ol { margin-bottom: 0; } .list-unstyled { padding-left: 0; list-style: none; } .list-inline { padding-left: 0; list-style: none; margin-left: -5px; } .list-inline > li { display: inline-block; padding-left: 5px; padding-right: 5px; } dl { margin-top: 0; margin-bottom: 17px; } dt, dd { line-height: 1.31; } dt { font-weight: bold; } dd { margin-left: 0; } @media (min-width: 768px) { .dl-horizontal dt { float: left; width: 160px; clear: left; text-align: right; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .dl-horizontal dd { margin-left: 180px; } } abbr[title], abbr[data-original-title] { cursor: help; border-bottom: 1px dotted #777777; } .initialism { font-size: 90%; text-transform: uppercase; } blockquote { padding: 8.5px 17px; margin: 0 0 17px; font-size: 16.25px; border-left: 5px solid #eeeeee; } blockquote p:last-child, blockquote ul:last-child, blockquote ol:last-child { margin-bottom: 0; } blockquote footer, blockquote small, blockquote .small { display: block; font-size: 80%; line-height: 1.31; color: #777777; } blockquote footer:before, blockquote small:before, blockquote .small:before { content: '\2014 \00A0'; } .blockquote-reverse, blockquote.pull-right { padding-right: 15px; padding-left: 0; border-right: 5px solid #eeeeee; border-left: 0; text-align: right; } .blockquote-reverse footer:before, blockquote.pull-right footer:before, .blockquote-reverse small:before, blockquote.pull-right small:before, .blockquote-reverse .small:before, blockquote.pull-right .small:before { content: ''; } .blockquote-reverse footer:after, blockquote.pull-right footer:after, .blockquote-reverse small:after, blockquote.pull-right small:after, .blockquote-reverse .small:after, blockquote.pull-right .small:after { content: '\00A0 \2014'; } address { margin-bottom: 17px; font-style: normal; line-height: 1.31; } code, kbd, pre, samp { font-family: Menlo, Monaco, Consolas, "Courier New", monospace; } code { padding: 2px 4px; font-size: 90%; color: #c7254e; background-color: #f9f2f4; border-radius: 4px; } kbd { padding: 2px 4px; font-size: 90%; color: #ffffff; background-color: #333333; border-radius: 3px; box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); } kbd kbd { padding: 0; font-size: 100%; font-weight: bold; box-shadow: none; } pre { display: block; padding: 8px; margin: 0 0 8.5px; font-size: 12px; line-height: 1.31; word-break: break-all; word-wrap: break-word; color: #333333; background-color: #f5f5f5; border: 1px solid #cccccc; border-radius: 4px; } pre code { padding: 0; font-size: inherit; color: inherit; white-space: pre-wrap; background-color: transparent; border-radius: 0; } .pre-scrollable { max-height: 340px; overflow-y: scroll; } .container { margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px; } @media (min-width: 768px) { .container { width: 750px; } } @media (min-width: 992px) { .container { width: 970px; } } @media (min-width: 1200px) { .container { width: 1170px; } } .container-fluid { margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px; } .row { margin-left: -15px; margin-right: -15px; } .col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { position: relative; min-height: 1px; padding-left: 15px; padding-right: 15px; } .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { float: left; } .col-xs-12 { width: 100%; } .col-xs-11 { width: 91.66666667%; } .col-xs-10 { width: 83.33333333%; } .col-xs-9 { width: 75%; } .col-xs-8 { width: 66.66666667%; } .col-xs-7 { width: 58.33333333%; } .col-xs-6 { width: 50%; } .col-xs-5 { width: 41.66666667%; } .col-xs-4 { width: 33.33333333%; } .col-xs-3 { width: 25%; } .col-xs-2 { width: 16.66666667%; } .col-xs-1 { width: 8.33333333%; } .col-xs-pull-12 { right: 100%; } .col-xs-pull-11 { right: 91.66666667%; } .col-xs-pull-10 { right: 83.33333333%; } .col-xs-pull-9 { right: 75%; } .col-xs-pull-8 { right: 66.66666667%; } .col-xs-pull-7 { right: 58.33333333%; } .col-xs-pull-6 { right: 50%; } .col-xs-pull-5 { right: 41.66666667%; } .col-xs-pull-4 { right: 33.33333333%; } .col-xs-pull-3 { right: 25%; } .col-xs-pull-2 { right: 16.66666667%; } .col-xs-pull-1 { right: 8.33333333%; } .col-xs-pull-0 { right: auto; } .col-xs-push-12 { left: 100%; } .col-xs-push-11 { left: 91.66666667%; } .col-xs-push-10 { left: 83.33333333%; } .col-xs-push-9 { left: 75%; } .col-xs-push-8 { left: 66.66666667%; } .col-xs-push-7 { left: 58.33333333%; } .col-xs-push-6 { left: 50%; } .col-xs-push-5 { left: 41.66666667%; } .col-xs-push-4 { left: 33.33333333%; } .col-xs-push-3 { left: 25%; } .col-xs-push-2 { left: 16.66666667%; } .col-xs-push-1 { left: 8.33333333%; } .col-xs-push-0 { left: auto; } .col-xs-offset-12 { margin-left: 100%; } .col-xs-offset-11 { margin-left: 91.66666667%; } .col-xs-offset-10 { margin-left: 83.33333333%; } .col-xs-offset-9 { margin-left: 75%; } .col-xs-offset-8 { margin-left: 66.66666667%; } .col-xs-offset-7 { margin-left: 58.33333333%; } .col-xs-offset-6 { margin-left: 50%; } .col-xs-offset-5 { margin-left: 41.66666667%; } .col-xs-offset-4 { margin-left: 33.33333333%; } .col-xs-offset-3 { margin-left: 25%; } .col-xs-offset-2 { margin-left: 16.66666667%; } .col-xs-offset-1 { margin-left: 8.33333333%; } .col-xs-offset-0 { margin-left: 0%; } @media (min-width: 768px) { .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { float: left; } .col-sm-12 { width: 100%; } .col-sm-11 { width: 91.66666667%; } .col-sm-10 { width: 83.33333333%; } .col-sm-9 { width: 75%; } .col-sm-8 { width: 66.66666667%; } .col-sm-7 { width: 58.33333333%; } .col-sm-6 { width: 50%; } .col-sm-5 { width: 41.66666667%; } .col-sm-4 { width: 33.33333333%; } .col-sm-3 { width: 25%; } .col-sm-2 { width: 16.66666667%; } .col-sm-1 { width: 8.33333333%; } .col-sm-pull-12 { right: 100%; } .col-sm-pull-11 { right: 91.66666667%; } .col-sm-pull-10 { right: 83.33333333%; } .col-sm-pull-9 { right: 75%; } .col-sm-pull-8 { right: 66.66666667%; } .col-sm-pull-7 { right: 58.33333333%; } .col-sm-pull-6 { right: 50%; } .col-sm-pull-5 { right: 41.66666667%; } .col-sm-pull-4 { right: 33.33333333%; } .col-sm-pull-3 { right: 25%; } .col-sm-pull-2 { right: 16.66666667%; } .col-sm-pull-1 { right: 8.33333333%; } .col-sm-pull-0 { right: auto; } .col-sm-push-12 { left: 100%; } .col-sm-push-11 { left: 91.66666667%; } .col-sm-push-10 { left: 83.33333333%; } .col-sm-push-9 { left: 75%; } .col-sm-push-8 { left: 66.66666667%; } .col-sm-push-7 { left: 58.33333333%; } .col-sm-push-6 { left: 50%; } .col-sm-push-5 { left: 41.66666667%; } .col-sm-push-4 { left: 33.33333333%; } .col-sm-push-3 { left: 25%; } .col-sm-push-2 { left: 16.66666667%; } .col-sm-push-1 { left: 8.33333333%; } .col-sm-push-0 { left: auto; } .col-sm-offset-12 { margin-left: 100%; } .col-sm-offset-11 { margin-left: 91.66666667%; } .col-sm-offset-10 { margin-left: 83.33333333%; } .col-sm-offset-9 { margin-left: 75%; } .col-sm-offset-8 { margin-left: 66.66666667%; } .col-sm-offset-7 { margin-left: 58.33333333%; } .col-sm-offset-6 { margin-left: 50%; } .col-sm-offset-5 { margin-left: 41.66666667%; } .col-sm-offset-4 { margin-left: 33.33333333%; } .col-sm-offset-3 { margin-left: 25%; } .col-sm-offset-2 { margin-left: 16.66666667%; } .col-sm-offset-1 { margin-left: 8.33333333%; } .col-sm-offset-0 { margin-left: 0%; } } @media (min-width: 992px) { .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { float: left; } .col-md-12 { width: 100%; } .col-md-11 { width: 91.66666667%; } .col-md-10 { width: 83.33333333%; } .col-md-9 { width: 75%; } .col-md-8 { width: 66.66666667%; } .col-md-7 { width: 58.33333333%; } .col-md-6 { width: 50%; } .col-md-5 { width: 41.66666667%; } .col-md-4 { width: 33.33333333%; } .col-md-3 { width: 25%; } .col-md-2 { width: 16.66666667%; } .col-md-1 { width: 8.33333333%; } .col-md-pull-12 { right: 100%; } .col-md-pull-11 { right: 91.66666667%; } .col-md-pull-10 { right: 83.33333333%; } .col-md-pull-9 { right: 75%; } .col-md-pull-8 { right: 66.66666667%; } .col-md-pull-7 { right: 58.33333333%; } .col-md-pull-6 { right: 50%; } .col-md-pull-5 { right: 41.66666667%; } .col-md-pull-4 { right: 33.33333333%; } .col-md-pull-3 { right: 25%; } .col-md-pull-2 { right: 16.66666667%; } .col-md-pull-1 { right: 8.33333333%; } .col-md-pull-0 { right: auto; } .col-md-push-12 { left: 100%; } .col-md-push-11 { left: 91.66666667%; } .col-md-push-10 { left: 83.33333333%; } .col-md-push-9 { left: 75%; } .col-md-push-8 { left: 66.66666667%; } .col-md-push-7 { left: 58.33333333%; } .col-md-push-6 { left: 50%; } .col-md-push-5 { left: 41.66666667%; } .col-md-push-4 { left: 33.33333333%; } .col-md-push-3 { left: 25%; } .col-md-push-2 { left: 16.66666667%; } .col-md-push-1 { left: 8.33333333%; } .col-md-push-0 { left: auto; } .col-md-offset-12 { margin-left: 100%; } .col-md-offset-11 { margin-left: 91.66666667%; } .col-md-offset-10 { margin-left: 83.33333333%; } .col-md-offset-9 { margin-left: 75%; } .col-md-offset-8 { margin-left: 66.66666667%; } .col-md-offset-7 { margin-left: 58.33333333%; } .col-md-offset-6 { margin-left: 50%; } .col-md-offset-5 { margin-left: 41.66666667%; } .col-md-offset-4 { margin-left: 33.33333333%; } .col-md-offset-3 { margin-left: 25%; } .col-md-offset-2 { margin-left: 16.66666667%; } .col-md-offset-1 { margin-left: 8.33333333%; } .col-md-offset-0 { margin-left: 0%; } } @media (min-width: 1200px) { .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { float: left; } .col-lg-12 { width: 100%; } .col-lg-11 { width: 91.66666667%; } .col-lg-10 { width: 83.33333333%; } .col-lg-9 { width: 75%; } .col-lg-8 { width: 66.66666667%; } .col-lg-7 { width: 58.33333333%; } .col-lg-6 { width: 50%; } .col-lg-5 { width: 41.66666667%; } .col-lg-4 { width: 33.33333333%; } .col-lg-3 { width: 25%; } .col-lg-2 { width: 16.66666667%; } .col-lg-1 { width: 8.33333333%; } .col-lg-pull-12 { right: 100%; } .col-lg-pull-11 { right: 91.66666667%; } .col-lg-pull-10 { right: 83.33333333%; } .col-lg-pull-9 { right: 75%; } .col-lg-pull-8 { right: 66.66666667%; } .col-lg-pull-7 { right: 58.33333333%; } .col-lg-pull-6 { right: 50%; } .col-lg-pull-5 { right: 41.66666667%; } .col-lg-pull-4 { right: 33.33333333%; } .col-lg-pull-3 { right: 25%; } .col-lg-pull-2 { right: 16.66666667%; } .col-lg-pull-1 { right: 8.33333333%; } .col-lg-pull-0 { right: auto; } .col-lg-push-12 { left: 100%; } .col-lg-push-11 { left: 91.66666667%; } .col-lg-push-10 { left: 83.33333333%; } .col-lg-push-9 { left: 75%; } .col-lg-push-8 { left: 66.66666667%; } .col-lg-push-7 { left: 58.33333333%; } .col-lg-push-6 { left: 50%; } .col-lg-push-5 { left: 41.66666667%; } .col-lg-push-4 { left: 33.33333333%; } .col-lg-push-3 { left: 25%; } .col-lg-push-2 { left: 16.66666667%; } .col-lg-push-1 { left: 8.33333333%; } .col-lg-push-0 { left: auto; } .col-lg-offset-12 { margin-left: 100%; } .col-lg-offset-11 { margin-left: 91.66666667%; } .col-lg-offset-10 { margin-left: 83.33333333%; } .col-lg-offset-9 { margin-left: 75%; } .col-lg-offset-8 { margin-left: 66.66666667%; } .col-lg-offset-7 { margin-left: 58.33333333%; } .col-lg-offset-6 { margin-left: 50%; } .col-lg-offset-5 { margin-left: 41.66666667%; } .col-lg-offset-4 { margin-left: 33.33333333%; } .col-lg-offset-3 { margin-left: 25%; } .col-lg-offset-2 { margin-left: 16.66666667%; } .col-lg-offset-1 { margin-left: 8.33333333%; } .col-lg-offset-0 { margin-left: 0%; } } table { background-color: transparent; } caption { padding-top: 8px; padding-bottom: 8px; color: #777777; text-align: left; } th { text-align: left; } .table { width: 100%; max-width: 100%; margin-bottom: 17px; } .table > thead > tr > th, .table > tbody > tr > th, .table > tfoot > tr > th, .table > thead > tr > td, .table > tbody > tr > td, .table > tfoot > tr > td { padding: 8px; line-height: 1.31; vertical-align: top; border-top: 1px solid #dddddd; } .table > thead > tr > th { vertical-align: bottom; border-bottom: 2px solid #dddddd; } .table > caption + thead > tr:first-child > th, .table > colgroup + thead > tr:first-child > th, .table > thead:first-child > tr:first-child > th, .table > caption + thead > tr:first-child > td, .table > colgroup + thead > tr:first-child > td, .table > thead:first-child > tr:first-child > td { border-top: 0; } .table > tbody + tbody { border-top: 2px solid #dddddd; } .table .table { background-color: #ffffff; } .table-condensed > thead > tr > th, .table-condensed > tbody > tr > th, .table-condensed > tfoot > tr > th, .table-condensed > thead > tr > td, .table-condensed > tbody > tr > td, .table-condensed > tfoot > tr > td { padding: 5px; } .table-bordered { border: 1px solid #dddddd; } .table-bordered > thead > tr > th, .table-bordered > tbody > tr > th, .table-bordered > tfoot > tr > th, .table-bordered > thead > tr > td, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > td { border: 1px solid #dddddd; } .table-bordered > thead > tr > th, .table-bordered > thead > tr > td { border-bottom-width: 2px; } .table-striped > tbody > tr:nth-of-type(odd) { background-color: #f9f9f9; } .table-hover > tbody > tr:hover { background-color: #f5f5f5; } table col[class*="col-"] { position: static; float: none; display: table-column; } table td[class*="col-"], table th[class*="col-"] { position: static; float: none; display: table-cell; } .table > thead > tr > td.active, .table > tbody > tr > td.active, .table > tfoot > tr > td.active, .table > thead > tr > th.active, .table > tbody > tr > th.active, .table > tfoot > tr > th.active, .table > thead > tr.active > td, .table > tbody > tr.active > td, .table > tfoot > tr.active > td, .table > thead > tr.active > th, .table > tbody > tr.active > th, .table > tfoot > tr.active > th { background-color: #f5f5f5; } .table-hover > tbody > tr > td.active:hover, .table-hover > tbody > tr > th.active:hover, .table-hover > tbody > tr.active:hover > td, .table-hover > tbody > tr:hover > .active, .table-hover > tbody > tr.active:hover > th { background-color: #e8e8e8; } .table > thead > tr > td.success, .table > tbody > tr > td.success, .table > tfoot > tr > td.success, .table > thead > tr > th.success, .table > tbody > tr > th.success, .table > tfoot > tr > th.success, .table > thead > tr.success > td, .table > tbody > tr.success > td, .table > tfoot > tr.success > td, .table > thead > tr.success > th, .table > tbody > tr.success > th, .table > tfoot > tr.success > th { background-color: #dff0d8; } .table-hover > tbody > tr > td.success:hover, .table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td, .table-hover > tbody > tr:hover > .success, .table-hover > tbody > tr.success:hover > th { background-color: #d0e9c6; } .table > thead > tr > td.info, .table > tbody > tr > td.info, .table > tfoot > tr > td.info, .table > thead > tr > th.info, .table > tbody > tr > th.info, .table > tfoot > tr > th.info, .table > thead > tr.info > td, .table > tbody > tr.info > td, .table > tfoot > tr.info > td, .table > thead > tr.info > th, .table > tbody > tr.info > th, .table > tfoot > tr.info > th { background-color: #d9edf7; } .table-hover > tbody > tr > td.info:hover, .table-hover > tbody > tr > th.info:hover, .table-hover > tbody > tr.info:hover > td, .table-hover > tbody > tr:hover > .info, .table-hover > tbody > tr.info:hover > th { background-color: #c4e3f3; } .table > thead > tr > td.warning, .table > tbody > tr > td.warning, .table > tfoot > tr > td.warning, .table > thead > tr > th.warning, .table > tbody > tr > th.warning, .table > tfoot > tr > th.warning, .table > thead > tr.warning > td, .table > tbody > tr.warning > td, .table > tfoot > tr.warning > td, .table > thead > tr.warning > th, .table > tbody > tr.warning > th, .table > tfoot > tr.warning > th { background-color: #fcf8e3; } .table-hover > tbody > tr > td.warning:hover, .table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td, .table-hover > tbody > tr:hover > .warning, .table-hover > tbody > tr.warning:hover > th { background-color: #faf2cc; } .table > thead > tr > td.danger, .table > tbody > tr > td.danger, .table > tfoot > tr > td.danger, .table > thead > tr > th.danger, .table > tbody > tr > th.danger, .table > tfoot > tr > th.danger, .table > thead > tr.danger > td, .table > tbody > tr.danger > td, .table > tfoot > tr.danger > td, .table > thead > tr.danger > th, .table > tbody > tr.danger > th, .table > tfoot > tr.danger > th { background-color: #f2dede; } .table-hover > tbody > tr > td.danger:hover, .table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td, .table-hover > tbody > tr:hover > .danger, .table-hover > tbody > tr.danger:hover > th { background-color: #ebcccc; } .table-responsive { overflow-x: auto; min-height: 0.01%; } @media screen and (max-width: 767px) { .table-responsive { width: 100%; margin-bottom: 12.75px; overflow-y: hidden; -ms-overflow-style: -ms-autohiding-scrollbar; border: 1px solid #dddddd; } .table-responsive > .table { margin-bottom: 0; } .table-responsive > .table > thead > tr > th, .table-responsive > .table > tbody > tr > th, .table-responsive > .table > tfoot > tr > th, .table-responsive > .table > thead > tr > td, .table-responsive > .table > tbody > tr > td, .table-responsive > .table > tfoot > tr > td { white-space: nowrap; } .table-responsive > .table-bordered { border: 0; } .table-responsive > .table-bordered > thead > tr > th:first-child, .table-responsive > .table-bordered > tbody > tr > th:first-child, .table-responsive > .table-bordered > tfoot > tr > th:first-child, .table-responsive > .table-bordered > thead > tr > td:first-child, .table-responsive > .table-bordered > tbody > tr > td:first-child, .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .table-responsive > .table-bordered > thead > tr > th:last-child, .table-responsive > .table-bordered > tbody > tr > th:last-child, .table-responsive > .table-bordered > tfoot > tr > th:last-child, .table-responsive > .table-bordered > thead > tr > td:last-child, .table-responsive > .table-bordered > tbody > tr > td:last-child, .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .table-responsive > .table-bordered > tbody > tr:last-child > th, .table-responsive > .table-bordered > tfoot > tr:last-child > th, .table-responsive > .table-bordered > tbody > tr:last-child > td, .table-responsive > .table-bordered > tfoot > tr:last-child > td { border-bottom: 0; } } fieldset { padding: 0; margin: 0; border: 0; min-width: 0; } legend { display: block; width: 100%; padding: 0; margin-bottom: 17px; font-size: 19.5px; line-height: inherit; color: #333333; border: 0; border-bottom: 1px solid #e5e5e5; } label { display: inline-block; max-width: 100%; margin-bottom: 5px; font-weight: bold; } input[type="search"] { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } input[type="radio"], input[type="checkbox"] { margin: 4px 0 0; margin-top: 1px \9; line-height: normal; } input[type="file"] { display: block; } input[type="range"] { display: block; width: 100%; } select[multiple], select[size] { height: auto; } input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus { outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } output { display: block; padding-top: 6px; font-size: 13px; line-height: 1.31; color: #555555; } .form-control { display: block; width: 100%; height: 29px; padding: 5px 12px; font-size: 13px; line-height: 1.31; color: #555555; background-color: #ffffff; background-image: none; border: 1px solid #cccccc; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; } .form-control:focus { border-color: #66afe9; outline: 0; -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); } .form-control::-moz-placeholder { color: #999999; opacity: 1; } .form-control:-ms-input-placeholder { color: #999999; } .form-control::-webkit-input-placeholder { color: #999999; } .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { background-color: #eeeeee; opacity: 1; } .form-control[disabled], fieldset[disabled] .form-control { cursor: not-allowed; } textarea.form-control { height: auto; } input[type="search"] { -webkit-appearance: none; } @media screen and (-webkit-min-device-pixel-ratio: 0) { input[type="date"], input[type="time"], input[type="datetime-local"], input[type="month"] { line-height: 29px; } input[type="date"].input-sm, input[type="time"].input-sm, input[type="datetime-local"].input-sm, input[type="month"].input-sm, .input-group-sm input[type="date"], .input-group-sm input[type="time"], .input-group-sm input[type="datetime-local"], .input-group-sm input[type="month"] { line-height: 30px; } input[type="date"].input-lg, input[type="time"].input-lg, input[type="datetime-local"].input-lg, input[type="month"].input-lg, .input-group-lg input[type="date"], .input-group-lg input[type="time"], .input-group-lg input[type="datetime-local"], .input-group-lg input[type="month"] { line-height: 45px; } } .form-group { margin-bottom: 15px; } .radio, .checkbox { position: relative; display: block; margin-top: 10px; margin-bottom: 10px; } .radio label, .checkbox label { min-height: 17px; padding-left: 20px; margin-bottom: 0; font-weight: normal; cursor: pointer; } .radio input[type="radio"], .radio-inline input[type="radio"], .checkbox input[type="checkbox"], .checkbox-inline input[type="checkbox"] { position: absolute; margin-left: -20px; margin-top: 4px \9; } .radio + .radio, .checkbox + .checkbox { margin-top: -5px; } .radio-inline, .checkbox-inline { position: relative; display: inline-block; padding-left: 20px; margin-bottom: 0; vertical-align: middle; font-weight: normal; cursor: pointer; } .radio-inline + .radio-inline, .checkbox-inline + .checkbox-inline { margin-top: 0; margin-left: 10px; } input[type="radio"][disabled], input[type="checkbox"][disabled], input[type="radio"].disabled, input[type="checkbox"].disabled, fieldset[disabled] input[type="radio"], fieldset[disabled] input[type="checkbox"] { cursor: not-allowed; } .radio-inline.disabled, .checkbox-inline.disabled, fieldset[disabled] .radio-inline, fieldset[disabled] .checkbox-inline { cursor: not-allowed; } .radio.disabled label, .checkbox.disabled label, fieldset[disabled] .radio label, fieldset[disabled] .checkbox label { cursor: not-allowed; } .form-control-static { padding-top: 6px; padding-bottom: 6px; margin-bottom: 0; min-height: 30px; } .form-control-static.input-lg, .form-control-static.input-sm { padding-left: 0; padding-right: 0; } .input-sm { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.input-sm { height: 30px; line-height: 30px; } textarea.input-sm, select[multiple].input-sm { height: auto; } .form-group-sm .form-control { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.form-group-sm .form-control { height: 30px; line-height: 30px; } textarea.form-group-sm .form-control, select[multiple].form-group-sm .form-control { height: auto; } .form-group-sm .form-control-static { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; min-height: 29px; } .input-lg { height: 45px; padding: 10px 16px; font-size: 17px; line-height: 1.3333333; border-radius: 6px; } select.input-lg { height: 45px; line-height: 45px; } textarea.input-lg, select[multiple].input-lg { height: auto; } .form-group-lg .form-control { height: 45px; padding: 10px 16px; font-size: 17px; line-height: 1.3333333; border-radius: 6px; } select.form-group-lg .form-control { height: 45px; line-height: 45px; } textarea.form-group-lg .form-control, select[multiple].form-group-lg .form-control { height: auto; } .form-group-lg .form-control-static { height: 45px; padding: 10px 16px; font-size: 17px; line-height: 1.3333333; min-height: 34px; } .has-feedback { position: relative; } .has-feedback .form-control { padding-right: 36.25px; } .form-control-feedback { position: absolute; top: 0; right: 0; z-index: 2; display: block; width: 29px; height: 29px; line-height: 29px; text-align: center; pointer-events: none; } .input-lg + .form-control-feedback { width: 45px; height: 45px; line-height: 45px; } .input-sm + .form-control-feedback { width: 30px; height: 30px; line-height: 30px; } .has-success .help-block, .has-success .control-label, .has-success .radio, .has-success .checkbox, .has-success .radio-inline, .has-success .checkbox-inline, .has-success.radio label, .has-success.checkbox label, .has-success.radio-inline label, .has-success.checkbox-inline label { color: #3c763d; } .has-success .form-control { border-color: #3c763d; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-success .form-control:focus { border-color: #2b542c; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; } .has-success .input-group-addon { color: #3c763d; border-color: #3c763d; background-color: #dff0d8; } .has-success .form-control-feedback { color: #3c763d; } .has-warning .help-block, .has-warning .control-label, .has-warning .radio, .has-warning .checkbox, .has-warning .radio-inline, .has-warning .checkbox-inline, .has-warning.radio label, .has-warning.checkbox label, .has-warning.radio-inline label, .has-warning.checkbox-inline label { color: #8a6d3b; } .has-warning .form-control { border-color: #8a6d3b; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-warning .form-control:focus { border-color: #66512c; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; } .has-warning .input-group-addon { color: #8a6d3b; border-color: #8a6d3b; background-color: #fcf8e3; } .has-warning .form-control-feedback { color: #8a6d3b; } .has-error .help-block, .has-error .control-label, .has-error .radio, .has-error .checkbox, .has-error .radio-inline, .has-error .checkbox-inline, .has-error.radio label, .has-error.checkbox label, .has-error.radio-inline label, .has-error.checkbox-inline label { color: #a94442; } .has-error .form-control { border-color: #a94442; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-error .form-control:focus { border-color: #843534; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; } .has-error .input-group-addon { color: #a94442; border-color: #a94442; background-color: #f2dede; } .has-error .form-control-feedback { color: #a94442; } .has-feedback label ~ .form-control-feedback { top: 22px; } .has-feedback label.sr-only ~ .form-control-feedback { top: 0; } .help-block { display: block; margin-top: 5px; margin-bottom: 10px; color: #737373; } @media (min-width: 768px) { .form-inline .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .form-inline .form-control { display: inline-block; width: auto; vertical-align: middle; } .form-inline .form-control-static { display: inline-block; } .form-inline .input-group { display: inline-table; vertical-align: middle; } .form-inline .input-group .input-group-addon, .form-inline .input-group .input-group-btn, .form-inline .input-group .form-control { width: auto; } .form-inline .input-group > .form-control { width: 100%; } .form-inline .control-label { margin-bottom: 0; vertical-align: middle; } .form-inline .radio, .form-inline .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; vertical-align: middle; } .form-inline .radio label, .form-inline .checkbox label { padding-left: 0; } .form-inline .radio input[type="radio"], .form-inline .checkbox input[type="checkbox"] { position: relative; margin-left: 0; } .form-inline .has-feedback .form-control-feedback { top: 0; } } .form-horizontal .radio, .form-horizontal .checkbox, .form-horizontal .radio-inline, .form-horizontal .checkbox-inline { margin-top: 0; margin-bottom: 0; padding-top: 6px; } .form-horizontal .radio, .form-horizontal .checkbox { min-height: 23px; } .form-horizontal .form-group { margin-left: -15px; margin-right: -15px; } @media (min-width: 768px) { .form-horizontal .control-label { text-align: right; margin-bottom: 0; padding-top: 6px; } } .form-horizontal .has-feedback .form-control-feedback { right: 15px; } @media (min-width: 768px) { .form-horizontal .form-group-lg .control-label { padding-top: 14.333333px; } } @media (min-width: 768px) { .form-horizontal .form-group-sm .control-label { padding-top: 6px; } } .btn { display: inline-block; margin-bottom: 0; font-weight: normal; text-align: center; vertical-align: middle; touch-action: manipulation; cursor: pointer; background-image: none; border: 1px solid transparent; white-space: nowrap; padding: 5px 12px; font-size: 13px; line-height: 1.31; border-radius: 4px; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .btn:focus, .btn:active:focus, .btn.active:focus, .btn.focus, .btn:active.focus, .btn.active.focus { outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } .btn:hover, .btn:focus, .btn.focus { color: #333333; text-decoration: none; } .btn:active, .btn.active { outline: 0; background-image: none; -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn.disabled, .btn[disabled], fieldset[disabled] .btn { cursor: not-allowed; pointer-events: none; opacity: 0.65; filter: alpha(opacity=65); -webkit-box-shadow: none; box-shadow: none; } .btn-default { color: #333333; background-color: #ffffff; border-color: #cccccc; } .btn-default:hover, .btn-default:focus, .btn-default.focus, .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { color: #333333; background-color: #e6e6e6; border-color: #adadad; } .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { background-image: none; } .btn-default.disabled, .btn-default[disabled], fieldset[disabled] .btn-default, .btn-default.disabled:hover, .btn-default[disabled]:hover, fieldset[disabled] .btn-default:hover, .btn-default.disabled:focus, .btn-default[disabled]:focus, fieldset[disabled] .btn-default:focus, .btn-default.disabled.focus, .btn-default[disabled].focus, fieldset[disabled] .btn-default.focus, .btn-default.disabled:active, .btn-default[disabled]:active, fieldset[disabled] .btn-default:active, .btn-default.disabled.active, .btn-default[disabled].active, fieldset[disabled] .btn-default.active { background-color: #ffffff; border-color: #cccccc; } .btn-default .badge { color: #ffffff; background-color: #333333; } .btn-primary { color: #ffffff; background-color: #337ab7; border-color: #2e6da4; } .btn-primary:hover, .btn-primary:focus, .btn-primary.focus, .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { color: #ffffff; background-color: #286090; border-color: #204d74; } .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { background-image: none; } .btn-primary.disabled, .btn-primary[disabled], fieldset[disabled] .btn-primary, .btn-primary.disabled:hover, .btn-primary[disabled]:hover, fieldset[disabled] .btn-primary:hover, .btn-primary.disabled:focus, .btn-primary[disabled]:focus, fieldset[disabled] .btn-primary:focus, .btn-primary.disabled.focus, .btn-primary[disabled].focus, fieldset[disabled] .btn-primary.focus, .btn-primary.disabled:active, .btn-primary[disabled]:active, fieldset[disabled] .btn-primary:active, .btn-primary.disabled.active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary.active { background-color: #337ab7; border-color: #2e6da4; } .btn-primary .badge { color: #337ab7; background-color: #ffffff; } .btn-success { color: #ffffff; background-color: #5cb85c; border-color: #4cae4c; } .btn-success:hover, .btn-success:focus, .btn-success.focus, .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { color: #ffffff; background-color: #449d44; border-color: #398439; } .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { background-image: none; } .btn-success.disabled, .btn-success[disabled], fieldset[disabled] .btn-success, .btn-success.disabled:hover, .btn-success[disabled]:hover, fieldset[disabled] .btn-success:hover, .btn-success.disabled:focus, .btn-success[disabled]:focus, fieldset[disabled] .btn-success:focus, .btn-success.disabled.focus, .btn-success[disabled].focus, fieldset[disabled] .btn-success.focus, .btn-success.disabled:active, .btn-success[disabled]:active, fieldset[disabled] .btn-success:active, .btn-success.disabled.active, .btn-success[disabled].active, fieldset[disabled] .btn-success.active { background-color: #5cb85c; border-color: #4cae4c; } .btn-success .badge { color: #5cb85c; background-color: #ffffff; } .btn-info { color: #ffffff; background-color: #5bc0de; border-color: #46b8da; } .btn-info:hover, .btn-info:focus, .btn-info.focus, .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { color: #ffffff; background-color: #31b0d5; border-color: #269abc; } .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { background-image: none; } .btn-info.disabled, .btn-info[disabled], fieldset[disabled] .btn-info, .btn-info.disabled:hover, .btn-info[disabled]:hover, fieldset[disabled] .btn-info:hover, .btn-info.disabled:focus, .btn-info[disabled]:focus, fieldset[disabled] .btn-info:focus, .btn-info.disabled.focus, .btn-info[disabled].focus, fieldset[disabled] .btn-info.focus, .btn-info.disabled:active, .btn-info[disabled]:active, fieldset[disabled] .btn-info:active, .btn-info.disabled.active, .btn-info[disabled].active, fieldset[disabled] .btn-info.active { background-color: #5bc0de; border-color: #46b8da; } .btn-info .badge { color: #5bc0de; background-color: #ffffff; } .btn-warning { color: #ffffff; background-color: #f0ad4e; border-color: #eea236; } .btn-warning:hover, .btn-warning:focus, .btn-warning.focus, .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { color: #ffffff; background-color: #ec971f; border-color: #d58512; } .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { background-image: none; } .btn-warning.disabled, .btn-warning[disabled], fieldset[disabled] .btn-warning, .btn-warning.disabled:hover, .btn-warning[disabled]:hover, fieldset[disabled] .btn-warning:hover, .btn-warning.disabled:focus, .btn-warning[disabled]:focus, fieldset[disabled] .btn-warning:focus, .btn-warning.disabled.focus, .btn-warning[disabled].focus, fieldset[disabled] .btn-warning.focus, .btn-warning.disabled:active, .btn-warning[disabled]:active, fieldset[disabled] .btn-warning:active, .btn-warning.disabled.active, .btn-warning[disabled].active, fieldset[disabled] .btn-warning.active { background-color: #f0ad4e; border-color: #eea236; } .btn-warning .badge { color: #f0ad4e; background-color: #ffffff; } .btn-danger { color: #ffffff; background-color: #d9534f; border-color: #d43f3a; } .btn-danger:hover, .btn-danger:focus, .btn-danger.focus, .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { color: #ffffff; background-color: #c9302c; border-color: #ac2925; } .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { background-image: none; } .btn-danger.disabled, .btn-danger[disabled], fieldset[disabled] .btn-danger, .btn-danger.disabled:hover, .btn-danger[disabled]:hover, fieldset[disabled] .btn-danger:hover, .btn-danger.disabled:focus, .btn-danger[disabled]:focus, fieldset[disabled] .btn-danger:focus, .btn-danger.disabled.focus, .btn-danger[disabled].focus, fieldset[disabled] .btn-danger.focus, .btn-danger.disabled:active, .btn-danger[disabled]:active, fieldset[disabled] .btn-danger:active, .btn-danger.disabled.active, .btn-danger[disabled].active, fieldset[disabled] .btn-danger.active { background-color: #d9534f; border-color: #d43f3a; } .btn-danger .badge { color: #d9534f; background-color: #ffffff; } .btn-link { color: #337ab7; font-weight: normal; border-radius: 0; } .btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled], fieldset[disabled] .btn-link { background-color: transparent; -webkit-box-shadow: none; box-shadow: none; } .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active { border-color: transparent; } .btn-link:hover, .btn-link:focus { color: #23527c; text-decoration: underline; background-color: transparent; } .btn-link[disabled]:hover, fieldset[disabled] .btn-link:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:focus { color: #777777; text-decoration: none; } .btn-lg, .btn-group-lg > .btn { padding: 10px 16px; font-size: 17px; line-height: 1.3333333; border-radius: 6px; } .btn-sm, .btn-group-sm > .btn { padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-xs, .btn-group-xs > .btn { padding: 1px 5px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-block { display: block; width: 100%; } .btn-block + .btn-block { margin-top: 5px; } input[type="submit"].btn-block, input[type="reset"].btn-block, input[type="button"].btn-block { width: 100%; } .fade { opacity: 0; -webkit-transition: opacity 0.15s linear; -o-transition: opacity 0.15s linear; transition: opacity 0.15s linear; } .fade.in { opacity: 1; } .collapse { display: none; } .collapse.in { display: block; } tr.collapse.in { display: table-row; } tbody.collapse.in { display: table-row-group; } .collapsing { position: relative; height: 0; overflow: hidden; -webkit-transition-property: height, visibility; transition-property: height, visibility; -webkit-transition-duration: 0.35s; transition-duration: 0.35s; -webkit-transition-timing-function: ease; transition-timing-function: ease; } .caret { display: inline-block; width: 0; height: 0; margin-left: 2px; vertical-align: middle; border-top: 4px dashed; border-right: 4px solid transparent; border-left: 4px solid transparent; } .dropup, .dropdown { position: relative; } .dropdown-toggle:focus { outline: 0; } .dropdown-menu { position: absolute; top: 100%; left: 0; z-index: 1000; display: none; float: left; min-width: 160px; padding: 5px 0; margin: 2px 0 0; list-style: none; font-size: 13px; text-align: left; background-color: #ffffff; border: 1px solid #cccccc; border: 1px solid rgba(0, 0, 0, 0.15); border-radius: 4px; -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); background-clip: padding-box; } .dropdown-menu.pull-right { right: 0; left: auto; } .dropdown-menu .divider { height: 1px; margin: 7.5px 0; overflow: hidden; background-color: #e5e5e5; } .dropdown-menu > li > a { display: block; padding: 3px 20px; clear: both; font-weight: normal; line-height: 1.31; color: #333333; white-space: nowrap; } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { text-decoration: none; color: #262626; background-color: #f5f5f5; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { color: #ffffff; text-decoration: none; outline: 0; background-color: #337ab7; } .dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { color: #777777; } .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { text-decoration: none; background-color: transparent; background-image: none; filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); cursor: not-allowed; } .open > .dropdown-menu { display: block; } .open > a { outline: 0; } .dropdown-menu-right { left: auto; right: 0; } .dropdown-menu-left { left: 0; right: auto; } .dropdown-header { display: block; padding: 3px 20px; font-size: 12px; line-height: 1.31; color: #777777; white-space: nowrap; } .dropdown-backdrop { position: fixed; left: 0; right: 0; bottom: 0; top: 0; z-index: 990; } .pull-right > .dropdown-menu { right: 0; left: auto; } .dropup .caret, .navbar-fixed-bottom .dropdown .caret { border-top: 0; border-bottom: 4px solid; content: ""; } .dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu { top: auto; bottom: 100%; margin-bottom: 2px; } @media (min-width: 768px) { .navbar-right .dropdown-menu { left: auto; right: 0; } .navbar-right .dropdown-menu-left { left: 0; right: auto; } } .btn-group, .btn-group-vertical { position: relative; display: inline-block; vertical-align: middle; } .btn-group > .btn, .btn-group-vertical > .btn { position: relative; float: left; } .btn-group > .btn:hover, .btn-group-vertical > .btn:hover, .btn-group > .btn:focus, .btn-group-vertical > .btn:focus, .btn-group > .btn:active, .btn-group-vertical > .btn:active, .btn-group > .btn.active, .btn-group-vertical > .btn.active { z-index: 2; } .btn-group .btn + .btn, .btn-group .btn + .btn-group, .btn-group .btn-group + .btn, .btn-group .btn-group + .btn-group { margin-left: -1px; } .btn-toolbar { margin-left: -5px; } .btn-toolbar .btn-group, .btn-toolbar .input-group { float: left; } .btn-toolbar > .btn, .btn-toolbar > .btn-group, .btn-toolbar > .input-group { margin-left: 5px; } .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { border-radius: 0; } .btn-group > .btn:first-child { margin-left: 0; } .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { border-bottom-right-radius: 0; border-top-right-radius: 0; } .btn-group > .btn:last-child:not(:first-child), .btn-group > .dropdown-toggle:not(:first-child) { border-bottom-left-radius: 0; border-top-left-radius: 0; } .btn-group > .btn-group { float: left; } .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { border-bottom-right-radius: 0; border-top-right-radius: 0; } .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { border-bottom-left-radius: 0; border-top-left-radius: 0; } .btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { outline: 0; } .btn-group > .btn + .dropdown-toggle { padding-left: 8px; padding-right: 8px; } .btn-group > .btn-lg + .dropdown-toggle { padding-left: 12px; padding-right: 12px; } .btn-group.open .dropdown-toggle { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn-group.open .dropdown-toggle.btn-link { -webkit-box-shadow: none; box-shadow: none; } .btn .caret { margin-left: 0; } .btn-lg .caret { border-width: 5px 5px 0; border-bottom-width: 0; } .dropup .btn-lg .caret { border-width: 0 5px 5px; } .btn-group-vertical > .btn, .btn-group-vertical > .btn-group, .btn-group-vertical > .btn-group > .btn { display: block; float: none; width: 100%; max-width: 100%; } .btn-group-vertical > .btn-group > .btn { float: none; } .btn-group-vertical > .btn + .btn, .btn-group-vertical > .btn + .btn-group, .btn-group-vertical > .btn-group + .btn, .btn-group-vertical > .btn-group + .btn-group { margin-top: -1px; margin-left: 0; } .btn-group-vertical > .btn:not(:first-child):not(:last-child) { border-radius: 0; } .btn-group-vertical > .btn:first-child:not(:last-child) { border-top-right-radius: 4px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn:last-child:not(:first-child) { border-bottom-left-radius: 4px; border-top-right-radius: 0; border-top-left-radius: 0; } .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { border-top-right-radius: 0; border-top-left-radius: 0; } .btn-group-justified { display: table; width: 100%; table-layout: fixed; border-collapse: separate; } .btn-group-justified > .btn, .btn-group-justified > .btn-group { float: none; display: table-cell; width: 1%; } .btn-group-justified > .btn-group .btn { width: 100%; } .btn-group-justified > .btn-group .dropdown-menu { left: auto; } [data-toggle="buttons"] > .btn input[type="radio"], [data-toggle="buttons"] > .btn-group > .btn input[type="radio"], [data-toggle="buttons"] > .btn input[type="checkbox"], [data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { position: absolute; clip: rect(0, 0, 0, 0); pointer-events: none; } .input-group { position: relative; display: table; border-collapse: separate; } .input-group[class*="col-"] { float: none; padding-left: 0; padding-right: 0; } .input-group .form-control { position: relative; z-index: 2; float: left; width: 100%; margin-bottom: 0; } .input-group-lg > .form-control, .input-group-lg > .input-group-addon, .input-group-lg > .input-group-btn > .btn { height: 45px; padding: 10px 16px; font-size: 17px; line-height: 1.3333333; border-radius: 6px; } select.input-group-lg > .form-control, select.input-group-lg > .input-group-addon, select.input-group-lg > .input-group-btn > .btn { height: 45px; line-height: 45px; } textarea.input-group-lg > .form-control, textarea.input-group-lg > .input-group-addon, textarea.input-group-lg > .input-group-btn > .btn, select[multiple].input-group-lg > .form-control, select[multiple].input-group-lg > .input-group-addon, select[multiple].input-group-lg > .input-group-btn > .btn { height: auto; } .input-group-sm > .form-control, .input-group-sm > .input-group-addon, .input-group-sm > .input-group-btn > .btn { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.input-group-sm > .form-control, select.input-group-sm > .input-group-addon, select.input-group-sm > .input-group-btn > .btn { height: 30px; line-height: 30px; } textarea.input-group-sm > .form-control, textarea.input-group-sm > .input-group-addon, textarea.input-group-sm > .input-group-btn > .btn, select[multiple].input-group-sm > .form-control, select[multiple].input-group-sm > .input-group-addon, select[multiple].input-group-sm > .input-group-btn > .btn { height: auto; } .input-group-addon, .input-group-btn, .input-group .form-control { display: table-cell; } .input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child), .input-group .form-control:not(:first-child):not(:last-child) { border-radius: 0; } .input-group-addon, .input-group-btn { width: 1%; white-space: nowrap; vertical-align: middle; } .input-group-addon { padding: 5px 12px; font-size: 13px; font-weight: normal; line-height: 1; color: #555555; text-align: center; background-color: #eeeeee; border: 1px solid #cccccc; border-radius: 4px; } .input-group-addon.input-sm { padding: 5px 10px; font-size: 12px; border-radius: 3px; } .input-group-addon.input-lg { padding: 10px 16px; font-size: 17px; border-radius: 6px; } .input-group-addon input[type="radio"], .input-group-addon input[type="checkbox"] { margin-top: 0; } .input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group > .btn, .input-group-btn:first-child > .dropdown-toggle, .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), .input-group-btn:last-child > .btn-group:not(:last-child) > .btn { border-bottom-right-radius: 0; border-top-right-radius: 0; } .input-group-addon:first-child { border-right: 0; } .input-group .form-control:last-child, .input-group-addon:last-child, .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group > .btn, .input-group-btn:last-child > .dropdown-toggle, .input-group-btn:first-child > .btn:not(:first-child), .input-group-btn:first-child > .btn-group:not(:first-child) > .btn { border-bottom-left-radius: 0; border-top-left-radius: 0; } .input-group-addon:last-child { border-left: 0; } .input-group-btn { position: relative; font-size: 0; white-space: nowrap; } .input-group-btn > .btn { position: relative; } .input-group-btn > .btn + .btn { margin-left: -1px; } .input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active { z-index: 2; } .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group { margin-right: -1px; } .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group { margin-left: -1px; } .nav { margin-bottom: 0; padding-left: 0; list-style: none; } .nav > li { position: relative; display: block; } .nav > li > a { position: relative; display: block; padding: 10px 15px; } .nav > li > a:hover, .nav > li > a:focus { text-decoration: none; background-color: #eeeeee; } .nav > li.disabled > a { color: #777777; } .nav > li.disabled > a:hover, .nav > li.disabled > a:focus { color: #777777; text-decoration: none; background-color: transparent; cursor: not-allowed; } .nav .open > a, .nav .open > a:hover, .nav .open > a:focus { background-color: #eeeeee; border-color: #337ab7; } .nav .nav-divider { height: 1px; margin: 7.5px 0; overflow: hidden; background-color: #e5e5e5; } .nav > li > a > img { max-width: none; } .nav-tabs { border-bottom: 1px solid #dddddd; } .nav-tabs > li { float: left; margin-bottom: -1px; } .nav-tabs > li > a { margin-right: 2px; line-height: 1.31; border: 1px solid transparent; border-radius: 4px 4px 0 0; } .nav-tabs > li > a:hover { border-color: #eeeeee #eeeeee #dddddd; } .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { color: #555555; background-color: #ffffff; border: 1px solid #dddddd; border-bottom-color: transparent; cursor: default; } .nav-tabs.nav-justified { width: 100%; border-bottom: 0; } .nav-tabs.nav-justified > li { float: none; } .nav-tabs.nav-justified > li > a { text-align: center; margin-bottom: 5px; } .nav-tabs.nav-justified > .dropdown .dropdown-menu { top: auto; left: auto; } @media (min-width: 768px) { .nav-tabs.nav-justified > li { display: table-cell; width: 1%; } .nav-tabs.nav-justified > li > a { margin-bottom: 0; } } .nav-tabs.nav-justified > li > a { margin-right: 0; border-radius: 4px; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { border: 1px solid #dddddd; } @media (min-width: 768px) { .nav-tabs.nav-justified > li > a { border-bottom: 1px solid #dddddd; border-radius: 4px 4px 0 0; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { border-bottom-color: #ffffff; } } .nav-pills > li { float: left; } .nav-pills > li > a { border-radius: 4px; } .nav-pills > li + li { margin-left: 2px; } .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { color: #ffffff; background-color: #337ab7; } .nav-stacked > li { float: none; } .nav-stacked > li + li { margin-top: 2px; margin-left: 0; } .nav-justified { width: 100%; } .nav-justified > li { float: none; } .nav-justified > li > a { text-align: center; margin-bottom: 5px; } .nav-justified > .dropdown .dropdown-menu { top: auto; left: auto; } @media (min-width: 768px) { .nav-justified > li { display: table-cell; width: 1%; } .nav-justified > li > a { margin-bottom: 0; } } .nav-tabs-justified { border-bottom: 0; } .nav-tabs-justified > li > a { margin-right: 0; border-radius: 4px; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { border: 1px solid #dddddd; } @media (min-width: 768px) { .nav-tabs-justified > li > a { border-bottom: 1px solid #dddddd; border-radius: 4px 4px 0 0; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { border-bottom-color: #ffffff; } } .tab-content > .tab-pane { display: none; } .tab-content > .active { display: block; } .nav-tabs .dropdown-menu { margin-top: -1px; border-top-right-radius: 0; border-top-left-radius: 0; } .navbar { position: relative; min-height: 40px; margin-bottom: 17px; border: 1px solid transparent; } @media (min-width: 768px) { .navbar { border-radius: 4px; } } @media (min-width: 768px) { .navbar-header { float: left; } } .navbar-collapse { overflow-x: visible; padding-right: 15px; padding-left: 15px; border-top: 1px solid transparent; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); -webkit-overflow-scrolling: touch; } .navbar-collapse.in { overflow-y: auto; } @media (min-width: 768px) { .navbar-collapse { width: auto; border-top: 0; box-shadow: none; } .navbar-collapse.collapse { display: block !important; height: auto !important; padding-bottom: 0; overflow: visible !important; } .navbar-collapse.in { overflow-y: visible; } .navbar-fixed-top .navbar-collapse, .navbar-static-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { padding-left: 0; padding-right: 0; } } .navbar-fixed-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { max-height: 340px; } @media (max-device-width: 480px) and (orientation: landscape) { .navbar-fixed-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { max-height: 200px; } } .container > .navbar-header, .container-fluid > .navbar-header, .container > .navbar-collapse, .container-fluid > .navbar-collapse { margin-right: -15px; margin-left: -15px; } @media (min-width: 768px) { .container > .navbar-header, .container-fluid > .navbar-header, .container > .navbar-collapse, .container-fluid > .navbar-collapse { margin-right: 0; margin-left: 0; } } .navbar-static-top { z-index: 1000; border-width: 0 0 1px; } @media (min-width: 768px) { .navbar-static-top { border-radius: 0; } } .navbar-fixed-top, .navbar-fixed-bottom { position: fixed; right: 0; left: 0; z-index: 1030; } @media (min-width: 768px) { .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } } .navbar-fixed-top { top: 0; border-width: 0 0 1px; } .navbar-fixed-bottom { bottom: 0; margin-bottom: 0; border-width: 1px 0 0; } .navbar-brand { float: left; padding: 11.5px 15px; font-size: 17px; line-height: 17px; height: 40px; } .navbar-brand:hover, .navbar-brand:focus { text-decoration: none; } .navbar-brand > img { display: block; } @media (min-width: 768px) { .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand { margin-left: -15px; } } .navbar-toggle { position: relative; float: right; margin-right: 15px; padding: 9px 10px; margin-top: 3px; margin-bottom: 3px; background-color: transparent; background-image: none; border: 1px solid transparent; border-radius: 4px; } .navbar-toggle:focus { outline: 0; } .navbar-toggle .icon-bar { display: block; width: 22px; height: 2px; border-radius: 1px; } .navbar-toggle .icon-bar + .icon-bar { margin-top: 4px; } @media (min-width: 768px) { .navbar-toggle { display: none; } } .navbar-nav { margin: 5.75px -15px; } .navbar-nav > li > a { padding-top: 10px; padding-bottom: 10px; line-height: 17px; } @media (max-width: 767px) { .navbar-nav .open .dropdown-menu { position: static; float: none; width: auto; margin-top: 0; background-color: transparent; border: 0; box-shadow: none; } .navbar-nav .open .dropdown-menu > li > a, .navbar-nav .open .dropdown-menu .dropdown-header { padding: 5px 15px 5px 25px; } .navbar-nav .open .dropdown-menu > li > a { line-height: 17px; } .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus { background-image: none; } } @media (min-width: 768px) { .navbar-nav { float: left; margin: 0; } .navbar-nav > li { float: left; } .navbar-nav > li > a { padding-top: 11.5px; padding-bottom: 11.5px; } } .navbar-form { margin-left: -15px; margin-right: -15px; padding: 10px 15px; border-top: 1px solid transparent; border-bottom: 1px solid transparent; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); margin-top: 5.5px; margin-bottom: 5.5px; } @media (min-width: 768px) { .navbar-form .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .navbar-form .form-control { display: inline-block; width: auto; vertical-align: middle; } .navbar-form .form-control-static { display: inline-block; } .navbar-form .input-group { display: inline-table; vertical-align: middle; } .navbar-form .input-group .input-group-addon, .navbar-form .input-group .input-group-btn, .navbar-form .input-group .form-control { width: auto; } .navbar-form .input-group > .form-control { width: 100%; } .navbar-form .control-label { margin-bottom: 0; vertical-align: middle; } .navbar-form .radio, .navbar-form .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; vertical-align: middle; } .navbar-form .radio label, .navbar-form .checkbox label { padding-left: 0; } .navbar-form .radio input[type="radio"], .navbar-form .checkbox input[type="checkbox"] { position: relative; margin-left: 0; } .navbar-form .has-feedback .form-control-feedback { top: 0; } } @media (max-width: 767px) { .navbar-form .form-group { margin-bottom: 5px; } .navbar-form .form-group:last-child { margin-bottom: 0; } } @media (min-width: 768px) { .navbar-form { width: auto; border: 0; margin-left: 0; margin-right: 0; padding-top: 0; padding-bottom: 0; -webkit-box-shadow: none; box-shadow: none; } } .navbar-nav > li > .dropdown-menu { margin-top: 0; border-top-right-radius: 0; border-top-left-radius: 0; } .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { margin-bottom: 0; border-top-right-radius: 4px; border-top-left-radius: 4px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .navbar-btn { margin-top: 5.5px; margin-bottom: 5.5px; } .navbar-btn.btn-sm { margin-top: 5px; margin-bottom: 5px; } .navbar-btn.btn-xs { margin-top: 9px; margin-bottom: 9px; } .navbar-text { margin-top: 11.5px; margin-bottom: 11.5px; } @media (min-width: 768px) { .navbar-text { float: left; margin-left: 15px; margin-right: 15px; } } @media (min-width: 768px) { .navbar-left { float: left !important; } .navbar-right { float: right !important; margin-right: -15px; } .navbar-right ~ .navbar-right { margin-right: 0; } } .navbar-default { background-color: #f8f8f8; border-color: #e7e7e7; } .navbar-default .navbar-brand { color: #777777; } .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { color: #5e5e5e; background-color: transparent; } .navbar-default .navbar-text { color: #777777; } .navbar-default .navbar-nav > li > a { color: #777777; } .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { color: #333333; background-color: transparent; } .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { color: #555555; background-color: #e7e7e7; } .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { color: #cccccc; background-color: transparent; } .navbar-default .navbar-toggle { border-color: #dddddd; } .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { background-color: #dddddd; } .navbar-default .navbar-toggle .icon-bar { background-color: #888888; } .navbar-default .navbar-collapse, .navbar-default .navbar-form { border-color: #e7e7e7; } .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { background-color: #e7e7e7; color: #555555; } @media (max-width: 767px) { .navbar-default .navbar-nav .open .dropdown-menu > li > a { color: #777777; } .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { color: #333333; background-color: transparent; } .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { color: #555555; background-color: #e7e7e7; } .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #cccccc; background-color: transparent; } } .navbar-default .navbar-link { color: #777777; } .navbar-default .navbar-link:hover { color: #333333; } .navbar-default .btn-link { color: #777777; } .navbar-default .btn-link:hover, .navbar-default .btn-link:focus { color: #333333; } .navbar-default .btn-link[disabled]:hover, fieldset[disabled] .navbar-default .btn-link:hover, .navbar-default .btn-link[disabled]:focus, fieldset[disabled] .navbar-default .btn-link:focus { color: #cccccc; } .navbar-inverse { background-color: #222222; border-color: #080808; } .navbar-inverse .navbar-brand { color: #9d9d9d; } .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-text { color: #9d9d9d; } .navbar-inverse .navbar-nav > li > a { color: #9d9d9d; } .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { color: #ffffff; background-color: #080808; } .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { color: #444444; background-color: transparent; } .navbar-inverse .navbar-toggle { border-color: #333333; } .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { background-color: #333333; } .navbar-inverse .navbar-toggle .icon-bar { background-color: #ffffff; } .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { border-color: #101010; } .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { background-color: #080808; color: #ffffff; } @media (max-width: 767px) { .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { border-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu .divider { background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { color: #9d9d9d; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { color: #ffffff; background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #444444; background-color: transparent; } } .navbar-inverse .navbar-link { color: #9d9d9d; } .navbar-inverse .navbar-link:hover { color: #ffffff; } .navbar-inverse .btn-link { color: #9d9d9d; } .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { color: #ffffff; } .navbar-inverse .btn-link[disabled]:hover, fieldset[disabled] .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link[disabled]:focus, fieldset[disabled] .navbar-inverse .btn-link:focus { color: #444444; } .breadcrumb { padding: 8px 15px; margin-bottom: 17px; list-style: none; background-color: #f5f5f5; border-radius: 4px; } .breadcrumb > li { display: inline-block; } .breadcrumb > li + li:before { content: ">\00a0"; padding: 0 5px; color: #cccccc; } .breadcrumb > .active { color: #777777; } .pagination { display: inline-block; padding-left: 0; margin: 17px 0; border-radius: 4px; } .pagination > li { display: inline; } .pagination > li > a, .pagination > li > span { position: relative; float: left; padding: 5px 12px; line-height: 1.31; text-decoration: none; color: #337ab7; background-color: #ffffff; border: 1px solid #dddddd; margin-left: -1px; } .pagination > li:first-child > a, .pagination > li:first-child > span { margin-left: 0; border-bottom-left-radius: 4px; border-top-left-radius: 4px; } .pagination > li:last-child > a, .pagination > li:last-child > span { border-bottom-right-radius: 4px; border-top-right-radius: 4px; } .pagination > li > a:hover, .pagination > li > span:hover, .pagination > li > a:focus, .pagination > li > span:focus { color: #23527c; background-color: #eeeeee; border-color: #dddddd; } .pagination > .active > a, .pagination > .active > span, .pagination > .active > a:hover, .pagination > .active > span:hover, .pagination > .active > a:focus, .pagination > .active > span:focus { z-index: 2; color: #ffffff; background-color: #337ab7; border-color: #337ab7; cursor: default; } .pagination > .disabled > span, .pagination > .disabled > span:hover, .pagination > .disabled > span:focus, .pagination > .disabled > a, .pagination > .disabled > a:hover, .pagination > .disabled > a:focus { color: #777777; background-color: #ffffff; border-color: #dddddd; cursor: not-allowed; } .pagination-lg > li > a, .pagination-lg > li > span { padding: 10px 16px; font-size: 17px; } .pagination-lg > li:first-child > a, .pagination-lg > li:first-child > span { border-bottom-left-radius: 6px; border-top-left-radius: 6px; } .pagination-lg > li:last-child > a, .pagination-lg > li:last-child > span { border-bottom-right-radius: 6px; border-top-right-radius: 6px; } .pagination-sm > li > a, .pagination-sm > li > span { padding: 5px 10px; font-size: 12px; } .pagination-sm > li:first-child > a, .pagination-sm > li:first-child > span { border-bottom-left-radius: 3px; border-top-left-radius: 3px; } .pagination-sm > li:last-child > a, .pagination-sm > li:last-child > span { border-bottom-right-radius: 3px; border-top-right-radius: 3px; } .pager { padding-left: 0; margin: 17px 0; list-style: none; text-align: center; } .pager li { display: inline; } .pager li > a, .pager li > span { display: inline-block; padding: 5px 14px; background-color: #ffffff; border: 1px solid #dddddd; border-radius: 15px; } .pager li > a:hover, .pager li > a:focus { text-decoration: none; background-color: #eeeeee; } .pager .next > a, .pager .next > span { float: right; } .pager .previous > a, .pager .previous > span { float: left; } .pager .disabled > a, .pager .disabled > a:hover, .pager .disabled > a:focus, .pager .disabled > span { color: #777777; background-color: #ffffff; cursor: not-allowed; } .label { display: inline; padding: .2em .6em .3em; font-size: 75%; font-weight: bold; line-height: 1; color: #ffffff; text-align: center; white-space: nowrap; vertical-align: baseline; border-radius: .25em; } a.label:hover, a.label:focus { color: #ffffff; text-decoration: none; cursor: pointer; } .label:empty { display: none; } .btn .label { position: relative; top: -1px; } .label-default { background-color: #777777; } .label-default[href]:hover, .label-default[href]:focus { background-color: #5e5e5e; } .label-primary { background-color: #337ab7; } .label-primary[href]:hover, .label-primary[href]:focus { background-color: #286090; } .label-success { background-color: #5cb85c; } .label-success[href]:hover, .label-success[href]:focus { background-color: #449d44; } .label-info { background-color: #5bc0de; } .label-info[href]:hover, .label-info[href]:focus { background-color: #31b0d5; } .label-warning { background-color: #f0ad4e; } .label-warning[href]:hover, .label-warning[href]:focus { background-color: #ec971f; } .label-danger { background-color: #d9534f; } .label-danger[href]:hover, .label-danger[href]:focus { background-color: #c9302c; } .badge { display: inline-block; min-width: 10px; padding: 3px 7px; font-size: 12px; font-weight: bold; color: #ffffff; line-height: 1; vertical-align: baseline; white-space: nowrap; text-align: center; background-color: #777777; border-radius: 10px; } .badge:empty { display: none; } .btn .badge { position: relative; top: -1px; } .btn-xs .badge, .btn-group-xs > .btn .badge { top: 0; padding: 1px 5px; } a.badge:hover, a.badge:focus { color: #ffffff; text-decoration: none; cursor: pointer; } .list-group-item.active > .badge, .nav-pills > .active > a > .badge { color: #337ab7; background-color: #ffffff; } .list-group-item > .badge { float: right; } .list-group-item > .badge + .badge { margin-right: 5px; } .nav-pills > li > a > .badge { margin-left: 3px; } .jumbotron { padding: 30px 15px; margin-bottom: 30px; color: inherit; background-color: #eeeeee; } .jumbotron h1, .jumbotron .h1 { color: inherit; } .jumbotron p { margin-bottom: 15px; font-size: 20px; font-weight: 200; } .jumbotron > hr { border-top-color: #d5d5d5; } .container .jumbotron, .container-fluid .jumbotron { border-radius: 6px; } .jumbotron .container { max-width: 100%; } @media screen and (min-width: 768px) { .jumbotron { padding: 48px 0; } .container .jumbotron, .container-fluid .jumbotron { padding-left: 60px; padding-right: 60px; } .jumbotron h1, .jumbotron .h1 { font-size: 58.5px; } } .thumbnail { display: block; padding: 4px; margin-bottom: 17px; line-height: 1.31; background-color: #ffffff; border: 1px solid #dddddd; border-radius: 4px; -webkit-transition: border 0.2s ease-in-out; -o-transition: border 0.2s ease-in-out; transition: border 0.2s ease-in-out; } .thumbnail > img, .thumbnail a > img { margin-left: auto; margin-right: auto; } a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active { border-color: #337ab7; } .thumbnail .caption { padding: 9px; color: #333333; } .alert { padding: 15px; margin-bottom: 17px; border: 1px solid transparent; border-radius: 4px; } .alert h4 { margin-top: 0; color: inherit; } .alert .alert-link { font-weight: bold; } .alert > p, .alert > ul { margin-bottom: 0; } .alert > p + p { margin-top: 5px; } .alert-dismissable, .alert-dismissible { padding-right: 35px; } .alert-dismissable .close, .alert-dismissible .close { position: relative; top: -2px; right: -21px; color: inherit; } .alert-success { background-color: #dff0d8; border-color: #d6e9c6; color: #3c763d; } .alert-success hr { border-top-color: #c9e2b3; } .alert-success .alert-link { color: #2b542c; } .alert-info { background-color: #d9edf7; border-color: #bce8f1; color: #31708f; } .alert-info hr { border-top-color: #a6e1ec; } .alert-info .alert-link { color: #245269; } .alert-warning { background-color: #fcf8e3; border-color: #faebcc; color: #8a6d3b; } .alert-warning hr { border-top-color: #f7e1b5; } .alert-warning .alert-link { color: #66512c; } .alert-danger { background-color: #f2dede; border-color: #ebccd1; color: #a94442; } .alert-danger hr { border-top-color: #e4b9c0; } .alert-danger .alert-link { color: #843534; } @-webkit-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } .progress { overflow: hidden; height: 17px; margin-bottom: 17px; background-color: #f5f5f5; border-radius: 4px; -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); } .progress-bar { float: left; width: 0%; height: 100%; font-size: 12px; line-height: 17px; color: #ffffff; text-align: center; background-color: #337ab7; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); -webkit-transition: width 0.6s ease; -o-transition: width 0.6s ease; transition: width 0.6s ease; } .progress-striped .progress-bar, .progress-bar-striped { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-size: 40px 40px; } .progress.active .progress-bar, .progress-bar.active { -webkit-animation: progress-bar-stripes 2s linear infinite; -o-animation: progress-bar-stripes 2s linear infinite; animation: progress-bar-stripes 2s linear infinite; } .progress-bar-success { background-color: #5cb85c; } .progress-striped .progress-bar-success { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-info { background-color: #5bc0de; } .progress-striped .progress-bar-info { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-warning { background-color: #f0ad4e; } .progress-striped .progress-bar-warning { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-danger { background-color: #d9534f; } .progress-striped .progress-bar-danger { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .media { margin-top: 15px; } .media:first-child { margin-top: 0; } .media, .media-body { zoom: 1; overflow: hidden; } .media-body { width: 10000px; } .media-object { display: block; } .media-right, .media > .pull-right { padding-left: 10px; } .media-left, .media > .pull-left { padding-right: 10px; } .media-left, .media-right, .media-body { display: table-cell; vertical-align: top; } .media-middle { vertical-align: middle; } .media-bottom { vertical-align: bottom; } .media-heading { margin-top: 0; margin-bottom: 5px; } .media-list { padding-left: 0; list-style: none; } .list-group { margin-bottom: 20px; padding-left: 0; } .list-group-item { position: relative; display: block; padding: 10px 15px; margin-bottom: -1px; background-color: #ffffff; border: 1px solid #dddddd; } .list-group-item:first-child { border-top-right-radius: 4px; border-top-left-radius: 4px; } .list-group-item:last-child { margin-bottom: 0; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; } a.list-group-item { color: #555555; } a.list-group-item .list-group-item-heading { color: #333333; } a.list-group-item:hover, a.list-group-item:focus { text-decoration: none; color: #555555; background-color: #f5f5f5; } .list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus { background-color: #eeeeee; color: #777777; cursor: not-allowed; } .list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading { color: inherit; } .list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text { color: #777777; } .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { z-index: 2; color: #ffffff; background-color: #337ab7; border-color: #337ab7; } .list-group-item.active .list-group-item-heading, .list-group-item.active:hover .list-group-item-heading, .list-group-item.active:focus .list-group-item-heading, .list-group-item.active .list-group-item-heading > small, .list-group-item.active:hover .list-group-item-heading > small, .list-group-item.active:focus .list-group-item-heading > small, .list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading > .small { color: inherit; } .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text { color: #c7ddef; } .list-group-item-success { color: #3c763d; background-color: #dff0d8; } a.list-group-item-success { color: #3c763d; } a.list-group-item-success .list-group-item-heading { color: inherit; } a.list-group-item-success:hover, a.list-group-item-success:focus { color: #3c763d; background-color: #d0e9c6; } a.list-group-item-success.active, a.list-group-item-success.active:hover, a.list-group-item-success.active:focus { color: #fff; background-color: #3c763d; border-color: #3c763d; } .list-group-item-info { color: #31708f; background-color: #d9edf7; } a.list-group-item-info { color: #31708f; } a.list-group-item-info .list-group-item-heading { color: inherit; } a.list-group-item-info:hover, a.list-group-item-info:focus { color: #31708f; background-color: #c4e3f3; } a.list-group-item-info.active, a.list-group-item-info.active:hover, a.list-group-item-info.active:focus { color: #fff; background-color: #31708f; border-color: #31708f; } .list-group-item-warning { color: #8a6d3b; background-color: #fcf8e3; } a.list-group-item-warning { color: #8a6d3b; } a.list-group-item-warning .list-group-item-heading { color: inherit; } a.list-group-item-warning:hover, a.list-group-item-warning:focus { color: #8a6d3b; background-color: #faf2cc; } a.list-group-item-warning.active, a.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus { color: #fff; background-color: #8a6d3b; border-color: #8a6d3b; } .list-group-item-danger { color: #a94442; background-color: #f2dede; } a.list-group-item-danger { color: #a94442; } a.list-group-item-danger .list-group-item-heading { color: inherit; } a.list-group-item-danger:hover, a.list-group-item-danger:focus { color: #a94442; background-color: #ebcccc; } a.list-group-item-danger.active, a.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus { color: #fff; background-color: #a94442; border-color: #a94442; } .list-group-item-heading { margin-top: 0; margin-bottom: 5px; } .list-group-item-text { margin-bottom: 0; line-height: 1.3; } .panel { margin-bottom: 17px; background-color: #ffffff; border: 1px solid transparent; border-radius: 4px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); } .panel-body { padding: 15px; } .panel-heading { padding: 10px 15px; border-bottom: 1px solid transparent; border-top-right-radius: 3px; border-top-left-radius: 3px; } .panel-heading > .dropdown .dropdown-toggle { color: inherit; } .panel-title { margin-top: 0; margin-bottom: 0; font-size: 15px; color: inherit; } .panel-title > a, .panel-title > small, .panel-title > .small, .panel-title > small > a, .panel-title > .small > a { color: inherit; } .panel-footer { padding: 10px 15px; background-color: #f5f5f5; border-top: 1px solid #dddddd; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .list-group, .panel > .panel-collapse > .list-group { margin-bottom: 0; } .panel > .list-group .list-group-item, .panel > .panel-collapse > .list-group .list-group-item { border-width: 1px 0; border-radius: 0; } .panel > .list-group:first-child .list-group-item:first-child, .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { border-top: 0; border-top-right-radius: 3px; border-top-left-radius: 3px; } .panel > .list-group:last-child .list-group-item:last-child, .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { border-bottom: 0; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel-heading + .list-group .list-group-item:first-child { border-top-width: 0; } .list-group + .panel-footer { border-top-width: 0; } .panel > .table, .panel > .table-responsive > .table, .panel > .panel-collapse > .table { margin-bottom: 0; } .panel > .table caption, .panel > .table-responsive > .table caption, .panel > .panel-collapse > .table caption { padding-left: 15px; padding-right: 15px; } .panel > .table:first-child, .panel > .table-responsive:first-child > .table:first-child { border-top-right-radius: 3px; border-top-left-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { border-top-left-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { border-top-right-radius: 3px; } .panel > .table:last-child, .panel > .table-responsive:last-child > .table:last-child { border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { border-bottom-right-radius: 3px; } .panel > .panel-body + .table, .panel > .panel-body + .table-responsive, .panel > .table + .panel-body, .panel > .table-responsive + .panel-body { border-top: 1px solid #dddddd; } .panel > .table > tbody:first-child > tr:first-child th, .panel > .table > tbody:first-child > tr:first-child td { border-top: 0; } .panel > .table-bordered, .panel > .table-responsive > .table-bordered { border: 0; } .panel > .table-bordered > thead > tr > th:first-child, .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, .panel > .table-bordered > tbody > tr > th:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, .panel > .table-bordered > tfoot > tr > th:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, .panel > .table-bordered > thead > tr > td:first-child, .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, .panel > .table-bordered > tbody > tr > td:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, .panel > .table-bordered > tfoot > tr > td:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .panel > .table-bordered > thead > tr > th:last-child, .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, .panel > .table-bordered > tbody > tr > th:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, .panel > .table-bordered > tfoot > tr > th:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, .panel > .table-bordered > thead > tr > td:last-child, .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, .panel > .table-bordered > tbody > tr > td:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, .panel > .table-bordered > tfoot > tr > td:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .panel > .table-bordered > thead > tr:first-child > td, .panel > .table-responsive > .table-bordered > thead > tr:first-child > td, .panel > .table-bordered > tbody > tr:first-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, .panel > .table-bordered > thead > tr:first-child > th, .panel > .table-responsive > .table-bordered > thead > tr:first-child > th, .panel > .table-bordered > tbody > tr:first-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { border-bottom: 0; } .panel > .table-bordered > tbody > tr:last-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, .panel > .table-bordered > tfoot > tr:last-child > td, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, .panel > .table-bordered > tbody > tr:last-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, .panel > .table-bordered > tfoot > tr:last-child > th, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { border-bottom: 0; } .panel > .table-responsive { border: 0; margin-bottom: 0; } .panel-group { margin-bottom: 17px; } .panel-group .panel { margin-bottom: 0; border-radius: 4px; } .panel-group .panel + .panel { margin-top: 5px; } .panel-group .panel-heading { border-bottom: 0; } .panel-group .panel-heading + .panel-collapse > .panel-body, .panel-group .panel-heading + .panel-collapse > .list-group { border-top: 1px solid #dddddd; } .panel-group .panel-footer { border-top: 0; } .panel-group .panel-footer + .panel-collapse .panel-body { border-bottom: 1px solid #dddddd; } .panel-default { border-color: #dddddd; } .panel-default > .panel-heading { color: #333333; background-color: #f5f5f5; border-color: #dddddd; } .panel-default > .panel-heading + .panel-collapse > .panel-body { border-top-color: #dddddd; } .panel-default > .panel-heading .badge { color: #f5f5f5; background-color: #333333; } .panel-default > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #dddddd; } .panel-primary { border-color: #337ab7; } .panel-primary > .panel-heading { color: #ffffff; background-color: #337ab7; border-color: #337ab7; } .panel-primary > .panel-heading + .panel-collapse > .panel-body { border-top-color: #337ab7; } .panel-primary > .panel-heading .badge { color: #337ab7; background-color: #ffffff; } .panel-primary > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #337ab7; } .panel-success { border-color: #d6e9c6; } .panel-success > .panel-heading { color: #3c763d; background-color: #dff0d8; border-color: #d6e9c6; } .panel-success > .panel-heading + .panel-collapse > .panel-body { border-top-color: #d6e9c6; } .panel-success > .panel-heading .badge { color: #dff0d8; background-color: #3c763d; } .panel-success > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #d6e9c6; } .panel-info { border-color: #bce8f1; } .panel-info > .panel-heading { color: #31708f; background-color: #d9edf7; border-color: #bce8f1; } .panel-info > .panel-heading + .panel-collapse > .panel-body { border-top-color: #bce8f1; } .panel-info > .panel-heading .badge { color: #d9edf7; background-color: #31708f; } .panel-info > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #bce8f1; } .panel-warning { border-color: #faebcc; } .panel-warning > .panel-heading { color: #8a6d3b; background-color: #fcf8e3; border-color: #faebcc; } .panel-warning > .panel-heading + .panel-collapse > .panel-body { border-top-color: #faebcc; } .panel-warning > .panel-heading .badge { color: #fcf8e3; background-color: #8a6d3b; } .panel-warning > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #faebcc; } .panel-danger { border-color: #ebccd1; } .panel-danger > .panel-heading { color: #a94442; background-color: #f2dede; border-color: #ebccd1; } .panel-danger > .panel-heading + .panel-collapse > .panel-body { border-top-color: #ebccd1; } .panel-danger > .panel-heading .badge { color: #f2dede; background-color: #a94442; } .panel-danger > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #ebccd1; } .embed-responsive { position: relative; display: block; height: 0; padding: 0; overflow: hidden; } .embed-responsive .embed-responsive-item, .embed-responsive iframe, .embed-responsive embed, .embed-responsive object, .embed-responsive video { position: absolute; top: 0; left: 0; bottom: 0; height: 100%; width: 100%; border: 0; } .embed-responsive-16by9 { padding-bottom: 56.25%; } .embed-responsive-4by3 { padding-bottom: 75%; } .well { min-height: 20px; padding: 19px; margin-bottom: 20px; background-color: #f5f5f5; border: 1px solid #e3e3e3; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); } .well blockquote { border-color: #ddd; border-color: rgba(0, 0, 0, 0.15); } .well-lg { padding: 24px; border-radius: 6px; } .well-sm { padding: 9px; border-radius: 3px; } .close { float: right; font-size: 19.5px; font-weight: bold; line-height: 1; color: #000000; text-shadow: 0 1px 0 #ffffff; opacity: 0.2; filter: alpha(opacity=20); } .close:hover, .close:focus { color: #000000; text-decoration: none; cursor: pointer; opacity: 0.5; filter: alpha(opacity=50); } button.close { padding: 0; cursor: pointer; background: transparent; border: 0; -webkit-appearance: none; } .modal-open { overflow: hidden; } .modal { display: none; overflow: hidden; position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1050; -webkit-overflow-scrolling: touch; outline: 0; } .modal.fade .modal-dialog { -webkit-transform: translate(0, -25%); -ms-transform: translate(0, -25%); -o-transform: translate(0, -25%); transform: translate(0, -25%); -webkit-transition: -webkit-transform 0.3s ease-out; -moz-transition: -moz-transform 0.3s ease-out; -o-transition: -o-transform 0.3s ease-out; transition: transform 0.3s ease-out; } .modal.in .modal-dialog { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); -o-transform: translate(0, 0); transform: translate(0, 0); } .modal-open .modal { overflow-x: hidden; overflow-y: auto; } .modal-dialog { position: relative; width: auto; margin: 10px; } .modal-content { position: relative; background-color: #ffffff; border: 1px solid #999999; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); background-clip: padding-box; outline: 0; } .modal-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040; background-color: #000000; } .modal-backdrop.fade { opacity: 0; filter: alpha(opacity=0); } .modal-backdrop.in { opacity: 0.5; filter: alpha(opacity=50); } .modal-header { padding: 15px; border-bottom: 1px solid #e5e5e5; min-height: 16.31px; } .modal-header .close { margin-top: -2px; } .modal-title { margin: 0; line-height: 1.31; } .modal-body { position: relative; padding: 15px; } .modal-footer { padding: 15px; text-align: right; border-top: 1px solid #e5e5e5; } .modal-footer .btn + .btn { margin-left: 5px; margin-bottom: 0; } .modal-footer .btn-group .btn + .btn { margin-left: -1px; } .modal-footer .btn-block + .btn-block { margin-left: 0; } .modal-scrollbar-measure { position: absolute; top: -9999px; width: 50px; height: 50px; overflow: scroll; } @media (min-width: 768px) { .modal-dialog { width: 600px; margin: 30px auto; } .modal-content { -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); } .modal-sm { width: 300px; } } @media (min-width: 992px) { .modal-lg { width: 900px; } } .tooltip { position: absolute; z-index: 1070; display: block; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 12px; font-weight: normal; line-height: 1.4; opacity: 0; filter: alpha(opacity=0); } .tooltip.in { opacity: 0.9; filter: alpha(opacity=90); } .tooltip.top { margin-top: -3px; padding: 5px 0; } .tooltip.right { margin-left: 3px; padding: 0 5px; } .tooltip.bottom { margin-top: 3px; padding: 5px 0; } .tooltip.left { margin-left: -3px; padding: 0 5px; } .tooltip-inner { max-width: 200px; padding: 3px 8px; color: #ffffff; text-align: center; text-decoration: none; background-color: #000000; border-radius: 4px; } .tooltip-arrow { position: absolute; width: 0; height: 0; border-color: transparent; border-style: solid; } .tooltip.top .tooltip-arrow { bottom: 0; left: 50%; margin-left: -5px; border-width: 5px 5px 0; border-top-color: #000000; } .tooltip.top-left .tooltip-arrow { bottom: 0; right: 5px; margin-bottom: -5px; border-width: 5px 5px 0; border-top-color: #000000; } .tooltip.top-right .tooltip-arrow { bottom: 0; left: 5px; margin-bottom: -5px; border-width: 5px 5px 0; border-top-color: #000000; } .tooltip.right .tooltip-arrow { top: 50%; left: 0; margin-top: -5px; border-width: 5px 5px 5px 0; border-right-color: #000000; } .tooltip.left .tooltip-arrow { top: 50%; right: 0; margin-top: -5px; border-width: 5px 0 5px 5px; border-left-color: #000000; } .tooltip.bottom .tooltip-arrow { top: 0; left: 50%; margin-left: -5px; border-width: 0 5px 5px; border-bottom-color: #000000; } .tooltip.bottom-left .tooltip-arrow { top: 0; right: 5px; margin-top: -5px; border-width: 0 5px 5px; border-bottom-color: #000000; } .tooltip.bottom-right .tooltip-arrow { top: 0; left: 5px; margin-top: -5px; border-width: 0 5px 5px; border-bottom-color: #000000; } .popover { position: absolute; top: 0; left: 0; z-index: 1060; display: none; max-width: 276px; padding: 1px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 13px; font-weight: normal; line-height: 1.31; text-align: left; background-color: #ffffff; background-clip: padding-box; border: 1px solid #cccccc; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); white-space: normal; } .popover.top { margin-top: -10px; } .popover.right { margin-left: 10px; } .popover.bottom { margin-top: 10px; } .popover.left { margin-left: -10px; } .popover-title { margin: 0; padding: 8px 14px; font-size: 13px; background-color: #f7f7f7; border-bottom: 1px solid #ebebeb; border-radius: 5px 5px 0 0; } .popover-content { padding: 9px 14px; } .popover > .arrow, .popover > .arrow:after { position: absolute; display: block; width: 0; height: 0; border-color: transparent; border-style: solid; } .popover > .arrow { border-width: 11px; } .popover > .arrow:after { border-width: 10px; content: ""; } .popover.top > .arrow { left: 50%; margin-left: -11px; border-bottom-width: 0; border-top-color: #999999; border-top-color: rgba(0, 0, 0, 0.25); bottom: -11px; } .popover.top > .arrow:after { content: " "; bottom: 1px; margin-left: -10px; border-bottom-width: 0; border-top-color: #ffffff; } .popover.right > .arrow { top: 50%; left: -11px; margin-top: -11px; border-left-width: 0; border-right-color: #999999; border-right-color: rgba(0, 0, 0, 0.25); } .popover.right > .arrow:after { content: " "; left: 1px; bottom: -10px; border-left-width: 0; border-right-color: #ffffff; } .popover.bottom > .arrow { left: 50%; margin-left: -11px; border-top-width: 0; border-bottom-color: #999999; border-bottom-color: rgba(0, 0, 0, 0.25); top: -11px; } .popover.bottom > .arrow:after { content: " "; top: 1px; margin-left: -10px; border-top-width: 0; border-bottom-color: #ffffff; } .popover.left > .arrow { top: 50%; right: -11px; margin-top: -11px; border-right-width: 0; border-left-color: #999999; border-left-color: rgba(0, 0, 0, 0.25); } .popover.left > .arrow:after { content: " "; right: 1px; border-right-width: 0; border-left-color: #ffffff; bottom: -10px; } .carousel { position: relative; } .carousel-inner { position: relative; overflow: hidden; width: 100%; } .carousel-inner > .item { display: none; position: relative; -webkit-transition: 0.6s ease-in-out left; -o-transition: 0.6s ease-in-out left; transition: 0.6s ease-in-out left; } .carousel-inner > .item > img, .carousel-inner > .item > a > img { line-height: 1; } @media all and (transform-3d), (-webkit-transform-3d) { .carousel-inner > .item { -webkit-transition: -webkit-transform 0.6s ease-in-out; -moz-transition: -moz-transform 0.6s ease-in-out; -o-transition: -o-transform 0.6s ease-in-out; transition: transform 0.6s ease-in-out; -webkit-backface-visibility: hidden; -moz-backface-visibility: hidden; backface-visibility: hidden; -webkit-perspective: 1000; -moz-perspective: 1000; perspective: 1000; } .carousel-inner > .item.next, .carousel-inner > .item.active.right { -webkit-transform: translate3d(100%, 0, 0); transform: translate3d(100%, 0, 0); left: 0; } .carousel-inner > .item.prev, .carousel-inner > .item.active.left { -webkit-transform: translate3d(-100%, 0, 0); transform: translate3d(-100%, 0, 0); left: 0; } .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); left: 0; } } .carousel-inner > .active, .carousel-inner > .next, .carousel-inner > .prev { display: block; } .carousel-inner > .active { left: 0; } .carousel-inner > .next, .carousel-inner > .prev { position: absolute; top: 0; width: 100%; } .carousel-inner > .next { left: 100%; } .carousel-inner > .prev { left: -100%; } .carousel-inner > .next.left, .carousel-inner > .prev.right { left: 0; } .carousel-inner > .active.left { left: -100%; } .carousel-inner > .active.right { left: 100%; } .carousel-control { position: absolute; top: 0; left: 0; bottom: 0; width: 15%; opacity: 0.5; filter: alpha(opacity=50); font-size: 20px; color: #ffffff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } .carousel-control.left { background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); } .carousel-control.right { left: auto; right: 0; background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); } .carousel-control:hover, .carousel-control:focus { outline: 0; color: #ffffff; text-decoration: none; opacity: 0.9; filter: alpha(opacity=90); } .carousel-control .icon-prev, .carousel-control .icon-next, .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right { position: absolute; top: 50%; z-index: 5; display: inline-block; } .carousel-control .icon-prev, .carousel-control .glyphicon-chevron-left { left: 50%; margin-left: -10px; } .carousel-control .icon-next, .carousel-control .glyphicon-chevron-right { right: 50%; margin-right: -10px; } .carousel-control .icon-prev, .carousel-control .icon-next { width: 20px; height: 20px; margin-top: -10px; line-height: 1; font-family: serif; } .carousel-control .icon-prev:before { content: '\2039'; } .carousel-control .icon-next:before { content: '\203a'; } .carousel-indicators { position: absolute; bottom: 10px; left: 50%; z-index: 15; width: 60%; margin-left: -30%; padding-left: 0; list-style: none; text-align: center; } .carousel-indicators li { display: inline-block; width: 10px; height: 10px; margin: 1px; text-indent: -999px; border: 1px solid #ffffff; border-radius: 10px; cursor: pointer; background-color: #000 \9; background-color: rgba(0, 0, 0, 0); } .carousel-indicators .active { margin: 0; width: 12px; height: 12px; background-color: #ffffff; } .carousel-caption { position: absolute; left: 15%; right: 15%; bottom: 20px; z-index: 10; padding-top: 20px; padding-bottom: 20px; color: #ffffff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } .carousel-caption .btn { text-shadow: none; } @media screen and (min-width: 768px) { .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right, .carousel-control .icon-prev, .carousel-control .icon-next { width: 30px; height: 30px; margin-top: -15px; font-size: 30px; } .carousel-control .glyphicon-chevron-left, .carousel-control .icon-prev { margin-left: -15px; } .carousel-control .glyphicon-chevron-right, .carousel-control .icon-next { margin-right: -15px; } .carousel-caption { left: 20%; right: 20%; padding-bottom: 30px; } .carousel-indicators { bottom: 20px; } } .clearfix:before, .clearfix:after, .dl-horizontal dd:before, .dl-horizontal dd:after, .container:before, .container:after, .container-fluid:before, .container-fluid:after, .row:before, .row:after, .form-horizontal .form-group:before, .form-horizontal .form-group:after, .btn-toolbar:before, .btn-toolbar:after, .btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after, .nav:before, .nav:after, .navbar:before, .navbar:after, .navbar-header:before, .navbar-header:after, .navbar-collapse:before, .navbar-collapse:after, .pager:before, .pager:after, .panel-body:before, .panel-body:after, .modal-footer:before, .modal-footer:after { content: " "; display: table; } .clearfix:after, .dl-horizontal dd:after, .container:after, .container-fluid:after, .row:after, .form-horizontal .form-group:after, .btn-toolbar:after, .btn-group-vertical > .btn-group:after, .nav:after, .navbar:after, .navbar-header:after, .navbar-collapse:after, .pager:after, .panel-body:after, .modal-footer:after { clear: both; } .center-block { display: block; margin-left: auto; margin-right: auto; } .pull-right { float: right !important; } .pull-left { float: left !important; } .hide { display: none !important; } .show { display: block !important; } .invisible { visibility: hidden; } .text-hide { font: 0/0 a; color: transparent; text-shadow: none; background-color: transparent; border: 0; } .hidden { display: none !important; } .affix { position: fixed; } @-ms-viewport { width: device-width; } .visible-xs, .visible-sm, .visible-md, .visible-lg { display: none !important; } .visible-xs-block, .visible-xs-inline, .visible-xs-inline-block, .visible-sm-block, .visible-sm-inline, .visible-sm-inline-block, .visible-md-block, .visible-md-inline, .visible-md-inline-block, .visible-lg-block, .visible-lg-inline, .visible-lg-inline-block { display: none !important; } @media (max-width: 767px) { .visible-xs { display: block !important; } table.visible-xs { display: table; } tr.visible-xs { display: table-row !important; } th.visible-xs, td.visible-xs { display: table-cell !important; } } @media (max-width: 767px) { .visible-xs-block { display: block !important; } } @media (max-width: 767px) { .visible-xs-inline { display: inline !important; } } @media (max-width: 767px) { .visible-xs-inline-block { display: inline-block !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm { display: block !important; } table.visible-sm { display: table; } tr.visible-sm { display: table-row !important; } th.visible-sm, td.visible-sm { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-block { display: block !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-inline { display: inline !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-inline-block { display: inline-block !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md { display: block !important; } table.visible-md { display: table; } tr.visible-md { display: table-row !important; } th.visible-md, td.visible-md { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-block { display: block !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-inline { display: inline !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-inline-block { display: inline-block !important; } } @media (min-width: 1200px) { .visible-lg { display: block !important; } table.visible-lg { display: table; } tr.visible-lg { display: table-row !important; } th.visible-lg, td.visible-lg { display: table-cell !important; } } @media (min-width: 1200px) { .visible-lg-block { display: block !important; } } @media (min-width: 1200px) { .visible-lg-inline { display: inline !important; } } @media (min-width: 1200px) { .visible-lg-inline-block { display: inline-block !important; } } @media (max-width: 767px) { .hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-lg { display: none !important; } } .visible-print { display: none !important; } @media print { .visible-print { display: block !important; } table.visible-print { display: table; } tr.visible-print { display: table-row !important; } th.visible-print, td.visible-print { display: table-cell !important; } } .visible-print-block { display: none !important; } @media print { .visible-print-block { display: block !important; } } .visible-print-inline { display: none !important; } @media print { .visible-print-inline { display: inline !important; } } .visible-print-inline-block { display: none !important; } @media print { .visible-print-inline-block { display: inline-block !important; } } @media print { .hidden-print { display: none !important; } } .alert-error { background-color: #f2dede; border-color: #ebccd1; color: #a94442; background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); border-color: #dca7a7; } .alert-error hr { border-top-color: #e4b9c0; } .alert-error .alert-link { color: #843534; } .btn-default, .btn-primary, .btn-success, .btn-info, .btn-warning, .btn-danger { text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); } .btn-default:active, .btn-primary:active, .btn-success:active, .btn-info:active, .btn-warning:active, .btn-danger:active, .btn-default.active, .btn-primary.active, .btn-success.active, .btn-info.active, .btn-warning.active, .btn-danger.active { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn-default .badge, .btn-primary .badge, .btn-success .badge, .btn-info .badge, .btn-warning .badge, .btn-danger .badge { text-shadow: none; } .btn:active, .btn.active { background-image: none; } .btn-default { background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%); background-image: -o-linear-gradient(top, #ffffff 0%, #e0e0e0 100%); background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #dbdbdb; text-shadow: 0 1px 0 #fff; border-color: #ccc; } .btn-default:hover, .btn-default:focus { background-color: #e0e0e0; background-position: 0 -15px; } .btn-default:active, .btn-default.active { background-color: #e0e0e0; border-color: #dbdbdb; } .btn-default.disabled, .btn-default:disabled, .btn-default[disabled] { background-color: #e0e0e0; background-image: none; } .btn-primary { background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%); background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #245580; } .btn-primary:hover, .btn-primary:focus { background-color: #265a88; background-position: 0 -15px; } .btn-primary:active, .btn-primary.active { background-color: #265a88; border-color: #245580; } .btn-primary.disabled, .btn-primary:disabled, .btn-primary[disabled] { background-color: #265a88; background-image: none; } .btn-success { background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #3e8f3e; } .btn-success:hover, .btn-success:focus { background-color: #419641; background-position: 0 -15px; } .btn-success:active, .btn-success.active { background-color: #419641; border-color: #3e8f3e; } .btn-success.disabled, .btn-success:disabled, .btn-success[disabled] { background-color: #419641; background-image: none; } .btn-info { background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #28a4c9; } .btn-info:hover, .btn-info:focus { background-color: #2aabd2; background-position: 0 -15px; } .btn-info:active, .btn-info.active { background-color: #2aabd2; border-color: #28a4c9; } .btn-info.disabled, .btn-info:disabled, .btn-info[disabled] { background-color: #2aabd2; background-image: none; } .btn-warning { background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #e38d13; } .btn-warning:hover, .btn-warning:focus { background-color: #eb9316; background-position: 0 -15px; } .btn-warning:active, .btn-warning.active { background-color: #eb9316; border-color: #e38d13; } .btn-warning.disabled, .btn-warning:disabled, .btn-warning[disabled] { background-color: #eb9316; background-image: none; } .btn-danger { background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #b92c28; } .btn-danger:hover, .btn-danger:focus { background-color: #c12e2a; background-position: 0 -15px; } .btn-danger:active, .btn-danger.active { background-color: #c12e2a; border-color: #b92c28; } .btn-danger.disabled, .btn-danger:disabled, .btn-danger[disabled] { background-color: #c12e2a; background-image: none; } .thumbnail, .img-thumbnail { -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); background-color: #e8e8e8; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); background-color: #2e6da4; } .navbar-default { background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); border-radius: 4px; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); } .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .active > a { background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075); box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075); } .navbar-brand, .navbar-nav > li > a { text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); } .navbar-inverse { background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%); background-image: -o-linear-gradient(top, #3c3c3c 0%, #222222 100%); background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); } .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .active > a { background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25); box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25); } .navbar-inverse .navbar-brand, .navbar-inverse .navbar-nav > li > a { text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } .navbar-static-top, .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } @media (max-width: 767px) { .navbar .navbar-nav .open .dropdown-menu > .active > a, .navbar .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar .navbar-nav .open .dropdown-menu > .active > a:focus { color: #fff; background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); } } .alert { text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2); -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); } .alert-success { background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); border-color: #b2dba1; } .alert-info { background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); border-color: #9acfea; } .alert-warning { background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); border-color: #f5e79e; } .alert-danger { background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); border-color: #dca7a7; } .progress { background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); } .progress-bar { background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%); background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0); } .progress-bar-success { background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); } .progress-bar-info { background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); } .progress-bar-warning { background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); } .progress-bar-danger { background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); } .progress-bar-striped { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .list-group { border-radius: 4px; -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); } .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { text-shadow: 0 -1px 0 #286090; background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%); background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0); border-color: #2b669a; } .list-group-item.active .badge, .list-group-item.active:hover .badge, .list-group-item.active:focus .badge { text-shadow: none; } .panel { -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); } .panel-default > .panel-heading { background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); } .panel-primary > .panel-heading { background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); } .panel-success > .panel-heading { background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); } .panel-info > .panel-heading { background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); } .panel-warning > .panel-heading { background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); } .panel-danger > .panel-heading { background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); } .well { background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); border-color: #dcdcdc; -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); } /* third_party/javascript/angular_ui_select/select.css */ /* @license The MIT License (MIT) Copyright (c) 2013-2014 AngularUI Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* Style when highlighting a search. */ .ui-select-highlight { font-weight: bold; } .ui-select-offscreen { clip: rect(0 0 0 0) !important; width: 1px !important; height: 1px !important; border: 0 !important; margin: 0 !important; padding: 0 !important; overflow: hidden !important; position: absolute !important; outline: 0 !important; left: 0px !important; top: 0px !important; } .ui-select-choices-row:hover { background-color: #f5f5f5; } /* Select2 theme */ /* Mark invalid Select2 */ .ng-dirty.ng-invalid > a.select2-choice { border-color: #D44950; } .select2-result-single { padding-left: 0; } .select2-locked > .select2-search-choice-close{ display:none; } .select-locked > .ui-select-match-close{ display:none; } body > .select2-container.open { z-index: 9999; /* The z-index Select2 applies to the select2-drop */ } /* Handle up direction Select2 */ .ui-select-container[theme="select2"].direction-up .ui-select-match { border-radius: 4px; /* FIXME hardcoded value :-/ */ border-top-left-radius: 0; border-top-right-radius: 0; } .ui-select-container[theme="select2"].direction-up .ui-select-dropdown { border-radius: 4px; /* FIXME hardcoded value :-/ */ border-bottom-left-radius: 0; border-bottom-right-radius: 0; border-top-width: 1px; /* FIXME hardcoded value :-/ */ border-top-style: solid; box-shadow: 0 -4px 8px rgba(0, 0, 0, 0.25); margin-top: -4px; /* FIXME hardcoded value :-/ */ } .ui-select-container[theme="select2"].direction-up .ui-select-dropdown .select2-search { margin-top: 4px; /* FIXME hardcoded value :-/ */ } .ui-select-container[theme="select2"].direction-up.select2-dropdown-open .ui-select-match { border-bottom-color: #5897fb; } /* Selectize theme */ /* Helper class to show styles when focus */ .selectize-input.selectize-focus{ border-color: #007FBB !important; } /* Fix input width for Selectize theme */ .selectize-control > .selectize-input > input { width: 100%; } /* Fix dropdown width for Selectize theme */ .selectize-control > .selectize-dropdown { width: 100%; } /* Mark invalid Selectize */ .ng-dirty.ng-invalid > div.selectize-input { border-color: #D44950; } /* Handle up direction Selectize */ .ui-select-container[theme="selectize"].direction-up .ui-select-dropdown { box-shadow: 0 -4px 8px rgba(0, 0, 0, 0.25); margin-top: -2px; /* FIXME hardcoded value :-/ */ } /* Bootstrap theme */ /* Helper class to show styles when focus */ .btn-default-focus { color: #333; background-color: #EBEBEB; border-color: #ADADAD; text-decoration: none; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); } .ui-select-bootstrap .ui-select-toggle { position: relative; } .ui-select-bootstrap .ui-select-toggle > .caret { position: absolute; height: 10px; top: 50%; right: 10px; margin-top: -2px; } /* Fix Bootstrap dropdown position when inside a input-group */ .input-group > .ui-select-bootstrap.dropdown { /* Instead of relative */ position: static; } .input-group > .ui-select-bootstrap > input.ui-select-search.form-control { border-radius: 4px; /* FIXME hardcoded value :-/ */ border-top-right-radius: 0; border-bottom-right-radius: 0; } .input-group > .ui-select-bootstrap > input.ui-select-search.form-control.direction-up { border-radius: 4px !important; /* FIXME hardcoded value :-/ */ border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; } .ui-select-bootstrap > .ui-select-match > .btn{ /* Instead of center because of .btn */ text-align: left !important; } .ui-select-bootstrap > .ui-select-match > .caret { position: absolute; top: 45%; right: 15px; } /* See Scrollable Menu with Bootstrap 3 http://stackoverflow.com/questions/19227496 */ .ui-select-bootstrap > .ui-select-choices { width: 100%; height: auto; max-height: 200px; overflow-x: hidden; margin-top: -1px; } body > .ui-select-bootstrap.open { z-index: 1000; /* Standard Bootstrap dropdown z-index */ } .ui-select-multiple.ui-select-bootstrap { height: auto; padding: 3px 3px 0 3px; } .ui-select-multiple.ui-select-bootstrap input.ui-select-search { background-color: transparent !important; /* To prevent double background when disabled */ border: none; outline: none; height: 1.666666em; margin-bottom: 3px; } .ui-select-multiple.ui-select-bootstrap .ui-select-match .close { font-size: 1.6em; line-height: 0.75; } .ui-select-multiple.ui-select-bootstrap .ui-select-match-item { outline: 0; margin: 0 3px 3px 0; } .ui-select-multiple .ui-select-match-item { position: relative; } .ui-select-multiple .ui-select-match-item.dropping-before:before { content: ""; position: absolute; top: 0; right: 100%; height: 100%; margin-right: 2px; border-left: 1px solid #428bca; } .ui-select-multiple .ui-select-match-item.dropping-after:after { content: ""; position: absolute; top: 0; left: 100%; height: 100%; margin-left: 2px; border-right: 1px solid #428bca; } .ui-select-bootstrap .ui-select-choices-row>a { display: block; padding: 3px 20px; clear: both; font-weight: 400; line-height: 1.42857143; color: #333; white-space: nowrap; } .ui-select-bootstrap .ui-select-choices-row>a:hover, .ui-select-bootstrap .ui-select-choices-row>a:focus { text-decoration: none; color: #262626; background-color: #f5f5f5; } .ui-select-bootstrap .ui-select-choices-row.active>a { color: #fff; text-decoration: none; outline: 0; background-color: #428bca; } .ui-select-bootstrap .ui-select-choices-row.disabled>a, .ui-select-bootstrap .ui-select-choices-row.active.disabled>a { color: #777; cursor: not-allowed; background-color: #fff; } /* fix hide/show angular animation */ .ui-select-match.ng-hide-add, .ui-select-search.ng-hide-add { display: none !important; } /* Mark invalid Bootstrap */ .ui-select-bootstrap.ng-dirty.ng-invalid > button.btn.ui-select-match { border-color: #D44950; } /* Handle up direction Bootstrap */ .ui-select-container[theme="bootstrap"].direction-up .ui-select-dropdown { box-shadow: 0 -4px 8px rgba(0, 0, 0, 0.25); } /* third_party/css/font_awesome/v4_2_0/font-awesome.css */ /*! * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ /* FONT PATH * -------------------------- */ @font-face { font-family: 'FontAwesome'; src: url('fontawesome-webfont.eot?v=4.2.0'); src: url('fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'), url('fontawesome-webfont.woff?v=4.2.0') format('woff'), url('fontawesome-webfont.ttf?v=4.2.0') format('truetype'), url('fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg'); font-weight: normal; font-style: normal; } .fa { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } /* makes the font 33% larger relative to the icon container */ .fa-lg { font-size: 1.33333333em; line-height: 0.75em; vertical-align: -15%; } .fa-2x { font-size: 2em; } .fa-3x { font-size: 3em; } .fa-4x { font-size: 4em; } .fa-5x { font-size: 5em; } .fa-fw { width: 1.28571429em; text-align: center; } .fa-ul { padding-left: 0; margin-left: 2.14285714em; list-style-type: none; } .fa-ul > li { position: relative; } .fa-li { position: absolute; left: -2.14285714em; width: 2.14285714em; top: 0.14285714em; text-align: center; } .fa-li.fa-lg { left: -1.85714286em; } .fa-border { padding: .2em .25em .15em; border: solid 0.08em #eeeeee; border-radius: .1em; } .pull-right { float: right; } .pull-left { float: left; } .fa.pull-left { margin-right: .3em; } .fa.pull-right { margin-left: .3em; } .fa-spin { -webkit-animation: fa-spin 2s infinite linear; animation: fa-spin 2s infinite linear; } @-webkit-keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } @keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } .fa-rotate-90 { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); -webkit-transform: rotate(90deg); -ms-transform: rotate(90deg); transform: rotate(90deg); } .fa-rotate-180 { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); -webkit-transform: rotate(180deg); -ms-transform: rotate(180deg); transform: rotate(180deg); } .fa-rotate-270 { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); -webkit-transform: rotate(270deg); -ms-transform: rotate(270deg); transform: rotate(270deg); } .fa-flip-horizontal { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); -webkit-transform: scale(-1, 1); -ms-transform: scale(-1, 1); transform: scale(-1, 1); } .fa-flip-vertical { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); -webkit-transform: scale(1, -1); -ms-transform: scale(1, -1); transform: scale(1, -1); } :root .fa-rotate-90, :root .fa-rotate-180, :root .fa-rotate-270, :root .fa-flip-horizontal, :root .fa-flip-vertical { filter: none; } .fa-stack { position: relative; display: inline-block; width: 2em; height: 2em; line-height: 2em; vertical-align: middle; } .fa-stack-1x, .fa-stack-2x { position: absolute; left: 0; width: 100%; text-align: center; } .fa-stack-1x { line-height: inherit; } .fa-stack-2x { font-size: 2em; } .fa-inverse { color: #ffffff; } /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen readers do not read off random characters that represent icons */ .fa-glass:before { content: "\f000"; } .fa-music:before { content: "\f001"; } .fa-search:before { content: "\f002"; } .fa-envelope-o:before { content: "\f003"; } .fa-heart:before { content: "\f004"; } .fa-star:before { content: "\f005"; } .fa-star-o:before { content: "\f006"; } .fa-user:before { content: "\f007"; } .fa-film:before { content: "\f008"; } .fa-th-large:before { content: "\f009"; } .fa-th:before { content: "\f00a"; } .fa-th-list:before { content: "\f00b"; } .fa-check:before { content: "\f00c"; } .fa-remove:before, .fa-close:before, .fa-times:before { content: "\f00d"; } .fa-search-plus:before { content: "\f00e"; } .fa-search-minus:before { content: "\f010"; } .fa-power-off:before { content: "\f011"; } .fa-signal:before { content: "\f012"; } .fa-gear:before, .fa-cog:before { content: "\f013"; } .fa-trash-o:before { content: "\f014"; } .fa-home:before { content: "\f015"; } .fa-file-o:before { content: "\f016"; } .fa-clock-o:before { content: "\f017"; } .fa-road:before { content: "\f018"; } .fa-download:before { content: "\f019"; } .fa-arrow-circle-o-down:before { content: "\f01a"; } .fa-arrow-circle-o-up:before { content: "\f01b"; } .fa-inbox:before { content: "\f01c"; } .fa-play-circle-o:before { content: "\f01d"; } .fa-rotate-right:before, .fa-repeat:before { content: "\f01e"; } .fa-refresh:before { content: "\f021"; } .fa-list-alt:before { content: "\f022"; } .fa-lock:before { content: "\f023"; } .fa-flag:before { content: "\f024"; } .fa-headphones:before { content: "\f025"; } .fa-volume-off:before { content: "\f026"; } .fa-volume-down:before { content: "\f027"; } .fa-volume-up:before { content: "\f028"; } .fa-qrcode:before { content: "\f029"; } .fa-barcode:before { content: "\f02a"; } .fa-tag:before { content: "\f02b"; } .fa-tags:before { content: "\f02c"; } .fa-book:before { content: "\f02d"; } .fa-bookmark:before { content: "\f02e"; } .fa-print:before { content: "\f02f"; } .fa-camera:before { content: "\f030"; } .fa-font:before { content: "\f031"; } .fa-bold:before { content: "\f032"; } .fa-italic:before { content: "\f033"; } .fa-text-height:before { content: "\f034"; } .fa-text-width:before { content: "\f035"; } .fa-align-left:before { content: "\f036"; } .fa-align-center:before { content: "\f037"; } .fa-align-right:before { content: "\f038"; } .fa-align-justify:before { content: "\f039"; } .fa-list:before { content: "\f03a"; } .fa-dedent:before, .fa-outdent:before { content: "\f03b"; } .fa-indent:before { content: "\f03c"; } .fa-video-camera:before { content: "\f03d"; } .fa-photo:before, .fa-image:before, .fa-picture-o:before { content: "\f03e"; } .fa-pencil:before { content: "\f040"; } .fa-map-marker:before { content: "\f041"; } .fa-adjust:before { content: "\f042"; } .fa-tint:before { content: "\f043"; } .fa-edit:before, .fa-pencil-square-o:before { content: "\f044"; } .fa-share-square-o:before { content: "\f045"; } .fa-check-square-o:before { content: "\f046"; } .fa-arrows:before { content: "\f047"; } .fa-step-backward:before { content: "\f048"; } .fa-fast-backward:before { content: "\f049"; } .fa-backward:before { content: "\f04a"; } .fa-play:before { content: "\f04b"; } .fa-pause:before { content: "\f04c"; } .fa-stop:before { content: "\f04d"; } .fa-forward:before { content: "\f04e"; } .fa-fast-forward:before { content: "\f050"; } .fa-step-forward:before { content: "\f051"; } .fa-eject:before { content: "\f052"; } .fa-chevron-left:before { content: "\f053"; } .fa-chevron-right:before { content: "\f054"; } .fa-plus-circle:before { content: "\f055"; } .fa-minus-circle:before { content: "\f056"; } .fa-times-circle:before { content: "\f057"; } .fa-check-circle:before { content: "\f058"; } .fa-question-circle:before { content: "\f059"; } .fa-info-circle:before { content: "\f05a"; } .fa-crosshairs:before { content: "\f05b"; } .fa-times-circle-o:before { content: "\f05c"; } .fa-check-circle-o:before { content: "\f05d"; } .fa-ban:before { content: "\f05e"; } .fa-arrow-left:before { content: "\f060"; } .fa-arrow-right:before { content: "\f061"; } .fa-arrow-up:before { content: "\f062"; } .fa-arrow-down:before { content: "\f063"; } .fa-mail-forward:before, .fa-share:before { content: "\f064"; } .fa-expand:before { content: "\f065"; } .fa-compress:before { content: "\f066"; } .fa-plus:before { content: "\f067"; } .fa-minus:before { content: "\f068"; } .fa-asterisk:before { content: "\f069"; } .fa-exclamation-circle:before { content: "\f06a"; } .fa-gift:before { content: "\f06b"; } .fa-leaf:before { content: "\f06c"; } .fa-fire:before { content: "\f06d"; } .fa-eye:before { content: "\f06e"; } .fa-eye-slash:before { content: "\f070"; } .fa-warning:before, .fa-exclamation-triangle:before { content: "\f071"; } .fa-plane:before { content: "\f072"; } .fa-calendar:before { content: "\f073"; } .fa-random:before { content: "\f074"; } .fa-comment:before { content: "\f075"; } .fa-magnet:before { content: "\f076"; } .fa-chevron-up:before { content: "\f077"; } .fa-chevron-down:before { content: "\f078"; } .fa-retweet:before { content: "\f079"; } .fa-shopping-cart:before { content: "\f07a"; } .fa-folder:before { content: "\f07b"; } .fa-folder-open:before { content: "\f07c"; } .fa-arrows-v:before { content: "\f07d"; } .fa-arrows-h:before { content: "\f07e"; } .fa-bar-chart-o:before, .fa-bar-chart:before { content: "\f080"; } .fa-twitter-square:before { content: "\f081"; } .fa-facebook-square:before { content: "\f082"; } .fa-camera-retro:before { content: "\f083"; } .fa-key:before { content: "\f084"; } .fa-gears:before, .fa-cogs:before { content: "\f085"; } .fa-comments:before { content: "\f086"; } .fa-thumbs-o-up:before { content: "\f087"; } .fa-thumbs-o-down:before { content: "\f088"; } .fa-star-half:before { content: "\f089"; } .fa-heart-o:before { content: "\f08a"; } .fa-sign-out:before { content: "\f08b"; } .fa-linkedin-square:before { content: "\f08c"; } .fa-thumb-tack:before { content: "\f08d"; } .fa-external-link:before { content: "\f08e"; } .fa-sign-in:before { content: "\f090"; } .fa-trophy:before { content: "\f091"; } .fa-github-square:before { content: "\f092"; } .fa-upload:before { content: "\f093"; } .fa-lemon-o:before { content: "\f094"; } .fa-phone:before { content: "\f095"; } .fa-square-o:before { content: "\f096"; } .fa-bookmark-o:before { content: "\f097"; } .fa-phone-square:before { content: "\f098"; } .fa-twitter:before { content: "\f099"; } .fa-facebook:before { content: "\f09a"; } .fa-github:before { content: "\f09b"; } .fa-unlock:before { content: "\f09c"; } .fa-credit-card:before { content: "\f09d"; } .fa-rss:before { content: "\f09e"; } .fa-hdd-o:before { content: "\f0a0"; } .fa-bullhorn:before { content: "\f0a1"; } .fa-bell:before { content: "\f0f3"; } .fa-certificate:before { content: "\f0a3"; } .fa-hand-o-right:before { content: "\f0a4"; } .fa-hand-o-left:before { content: "\f0a5"; } .fa-hand-o-up:before { content: "\f0a6"; } .fa-hand-o-down:before { content: "\f0a7"; } .fa-arrow-circle-left:before { content: "\f0a8"; } .fa-arrow-circle-right:before { content: "\f0a9"; } .fa-arrow-circle-up:before { content: "\f0aa"; } .fa-arrow-circle-down:before { content: "\f0ab"; } .fa-globe:before { content: "\f0ac"; } .fa-wrench:before { content: "\f0ad"; } .fa-tasks:before { content: "\f0ae"; } .fa-filter:before { content: "\f0b0"; } .fa-briefcase:before { content: "\f0b1"; } .fa-arrows-alt:before { content: "\f0b2"; } .fa-group:before, .fa-users:before { content: "\f0c0"; } .fa-chain:before, .fa-link:before { content: "\f0c1"; } .fa-cloud:before { content: "\f0c2"; } .fa-flask:before { content: "\f0c3"; } .fa-cut:before, .fa-scissors:before { content: "\f0c4"; } .fa-copy:before, .fa-files-o:before { content: "\f0c5"; } .fa-paperclip:before { content: "\f0c6"; } .fa-save:before, .fa-floppy-o:before { content: "\f0c7"; } .fa-square:before { content: "\f0c8"; } .fa-navicon:before, .fa-reorder:before, .fa-bars:before { content: "\f0c9"; } .fa-list-ul:before { content: "\f0ca"; } .fa-list-ol:before { content: "\f0cb"; } .fa-strikethrough:before { content: "\f0cc"; } .fa-underline:before { content: "\f0cd"; } .fa-table:before { content: "\f0ce"; } .fa-magic:before { content: "\f0d0"; } .fa-truck:before { content: "\f0d1"; } .fa-pinterest:before { content: "\f0d2"; } .fa-pinterest-square:before { content: "\f0d3"; } .fa-google-plus-square:before { content: "\f0d4"; } .fa-google-plus:before { content: "\f0d5"; } .fa-money:before { content: "\f0d6"; } .fa-caret-down:before { content: "\f0d7"; } .fa-caret-up:before { content: "\f0d8"; } .fa-caret-left:before { content: "\f0d9"; } .fa-caret-right:before { content: "\f0da"; } .fa-columns:before { content: "\f0db"; } .fa-unsorted:before, .fa-sort:before { content: "\f0dc"; } .fa-sort-down:before, .fa-sort-desc:before { content: "\f0dd"; } .fa-sort-up:before, .fa-sort-asc:before { content: "\f0de"; } .fa-envelope:before { content: "\f0e0"; } .fa-linkedin:before { content: "\f0e1"; } .fa-rotate-left:before, .fa-undo:before { content: "\f0e2"; } .fa-legal:before, .fa-gavel:before { content: "\f0e3"; } .fa-dashboard:before, .fa-tachometer:before { content: "\f0e4"; } .fa-comment-o:before { content: "\f0e5"; } .fa-comments-o:before { content: "\f0e6"; } .fa-flash:before, .fa-bolt:before { content: "\f0e7"; } .fa-sitemap:before { content: "\f0e8"; } .fa-umbrella:before { content: "\f0e9"; } .fa-paste:before, .fa-clipboard:before { content: "\f0ea"; } .fa-lightbulb-o:before { content: "\f0eb"; } .fa-exchange:before { content: "\f0ec"; } .fa-cloud-download:before { content: "\f0ed"; } .fa-cloud-upload:before { content: "\f0ee"; } .fa-user-md:before { content: "\f0f0"; } .fa-stethoscope:before { content: "\f0f1"; } .fa-suitcase:before { content: "\f0f2"; } .fa-bell-o:before { content: "\f0a2"; } .fa-coffee:before { content: "\f0f4"; } .fa-cutlery:before { content: "\f0f5"; } .fa-file-text-o:before { content: "\f0f6"; } .fa-building-o:before { content: "\f0f7"; } .fa-hospital-o:before { content: "\f0f8"; } .fa-ambulance:before { content: "\f0f9"; } .fa-medkit:before { content: "\f0fa"; } .fa-fighter-jet:before { content: "\f0fb"; } .fa-beer:before { content: "\f0fc"; } .fa-h-square:before { content: "\f0fd"; } .fa-plus-square:before { content: "\f0fe"; } .fa-angle-double-left:before { content: "\f100"; } .fa-angle-double-right:before { content: "\f101"; } .fa-angle-double-up:before { content: "\f102"; } .fa-angle-double-down:before { content: "\f103"; } .fa-angle-left:before { content: "\f104"; } .fa-angle-right:before { content: "\f105"; } .fa-angle-up:before { content: "\f106"; } .fa-angle-down:before { content: "\f107"; } .fa-desktop:before { content: "\f108"; } .fa-laptop:before { content: "\f109"; } .fa-tablet:before { content: "\f10a"; } .fa-mobile-phone:before, .fa-mobile:before { content: "\f10b"; } .fa-circle-o:before { content: "\f10c"; } .fa-quote-left:before { content: "\f10d"; } .fa-quote-right:before { content: "\f10e"; } .fa-spinner:before { content: "\f110"; } .fa-circle:before { content: "\f111"; } .fa-mail-reply:before, .fa-reply:before { content: "\f112"; } .fa-github-alt:before { content: "\f113"; } .fa-folder-o:before { content: "\f114"; } .fa-folder-open-o:before { content: "\f115"; } .fa-smile-o:before { content: "\f118"; } .fa-frown-o:before { content: "\f119"; } .fa-meh-o:before { content: "\f11a"; } .fa-gamepad:before { content: "\f11b"; } .fa-keyboard-o:before { content: "\f11c"; } .fa-flag-o:before { content: "\f11d"; } .fa-flag-checkered:before { content: "\f11e"; } .fa-terminal:before { content: "\f120"; } .fa-code:before { content: "\f121"; } .fa-mail-reply-all:before, .fa-reply-all:before { content: "\f122"; } .fa-star-half-empty:before, .fa-star-half-full:before, .fa-star-half-o:before { content: "\f123"; } .fa-location-arrow:before { content: "\f124"; } .fa-crop:before { content: "\f125"; } .fa-code-fork:before { content: "\f126"; } .fa-unlink:before, .fa-chain-broken:before { content: "\f127"; } .fa-question:before { content: "\f128"; } .fa-info:before { content: "\f129"; } .fa-exclamation:before { content: "\f12a"; } .fa-superscript:before { content: "\f12b"; } .fa-subscript:before { content: "\f12c"; } .fa-eraser:before { content: "\f12d"; } .fa-puzzle-piece:before { content: "\f12e"; } .fa-microphone:before { content: "\f130"; } .fa-microphone-slash:before { content: "\f131"; } .fa-shield:before { content: "\f132"; } .fa-calendar-o:before { content: "\f133"; } .fa-fire-extinguisher:before { content: "\f134"; } .fa-rocket:before { content: "\f135"; } .fa-maxcdn:before { content: "\f136"; } .fa-chevron-circle-left:before { content: "\f137"; } .fa-chevron-circle-right:before { content: "\f138"; } .fa-chevron-circle-up:before { content: "\f139"; } .fa-chevron-circle-down:before { content: "\f13a"; } .fa-html5:before { content: "\f13b"; } .fa-css3:before { content: "\f13c"; } .fa-anchor:before { content: "\f13d"; } .fa-unlock-alt:before { content: "\f13e"; } .fa-bullseye:before { content: "\f140"; } .fa-ellipsis-h:before { content: "\f141"; } .fa-ellipsis-v:before { content: "\f142"; } .fa-rss-square:before { content: "\f143"; } .fa-play-circle:before { content: "\f144"; } .fa-ticket:before { content: "\f145"; } .fa-minus-square:before { content: "\f146"; } .fa-minus-square-o:before { content: "\f147"; } .fa-level-up:before { content: "\f148"; } .fa-level-down:before { content: "\f149"; } .fa-check-square:before { content: "\f14a"; } .fa-pencil-square:before { content: "\f14b"; } .fa-external-link-square:before { content: "\f14c"; } .fa-share-square:before { content: "\f14d"; } .fa-compass:before { content: "\f14e"; } .fa-toggle-down:before, .fa-caret-square-o-down:before { content: "\f150"; } .fa-toggle-up:before, .fa-caret-square-o-up:before { content: "\f151"; } .fa-toggle-right:before, .fa-caret-square-o-right:before { content: "\f152"; } .fa-euro:before, .fa-eur:before { content: "\f153"; } .fa-gbp:before { content: "\f154"; } .fa-dollar:before, .fa-usd:before { content: "\f155"; } .fa-rupee:before, .fa-inr:before { content: "\f156"; } .fa-cny:before, .fa-rmb:before, .fa-yen:before, .fa-jpy:before { content: "\f157"; } .fa-ruble:before, .fa-rouble:before, .fa-rub:before { content: "\f158"; } .fa-won:before, .fa-krw:before { content: "\f159"; } .fa-bitcoin:before, .fa-btc:before { content: "\f15a"; } .fa-file:before { content: "\f15b"; } .fa-file-text:before { content: "\f15c"; } .fa-sort-alpha-asc:before { content: "\f15d"; } .fa-sort-alpha-desc:before { content: "\f15e"; } .fa-sort-amount-asc:before { content: "\f160"; } .fa-sort-amount-desc:before { content: "\f161"; } .fa-sort-numeric-asc:before { content: "\f162"; } .fa-sort-numeric-desc:before { content: "\f163"; } .fa-thumbs-up:before { content: "\f164"; } .fa-thumbs-down:before { content: "\f165"; } .fa-youtube-square:before { content: "\f166"; } .fa-youtube:before { content: "\f167"; } .fa-xing:before { content: "\f168"; } .fa-xing-square:before { content: "\f169"; } .fa-youtube-play:before { content: "\f16a"; } .fa-dropbox:before { content: "\f16b"; } .fa-stack-overflow:before { content: "\f16c"; } .fa-instagram:before { content: "\f16d"; } .fa-flickr:before { content: "\f16e"; } .fa-adn:before { content: "\f170"; } .fa-bitbucket:before { content: "\f171"; } .fa-bitbucket-square:before { content: "\f172"; } .fa-tumblr:before { content: "\f173"; } .fa-tumblr-square:before { content: "\f174"; } .fa-long-arrow-down:before { content: "\f175"; } .fa-long-arrow-up:before { content: "\f176"; } .fa-long-arrow-left:before { content: "\f177"; } .fa-long-arrow-right:before { content: "\f178"; } .fa-apple:before { content: "\f179"; } .fa-windows:before { content: "\f17a"; } .fa-android:before { content: "\f17b"; } .fa-linux:before { content: "\f17c"; } .fa-dribbble:before { content: "\f17d"; } .fa-skype:before { content: "\f17e"; } .fa-foursquare:before { content: "\f180"; } .fa-trello:before { content: "\f181"; } .fa-female:before { content: "\f182"; } .fa-male:before { content: "\f183"; } .fa-gittip:before { content: "\f184"; } .fa-sun-o:before { content: "\f185"; } .fa-moon-o:before { content: "\f186"; } .fa-archive:before { content: "\f187"; } .fa-bug:before { content: "\f188"; } .fa-vk:before { content: "\f189"; } .fa-weibo:before { content: "\f18a"; } .fa-renren:before { content: "\f18b"; } .fa-pagelines:before { content: "\f18c"; } .fa-stack-exchange:before { content: "\f18d"; } .fa-arrow-circle-o-right:before { content: "\f18e"; } .fa-arrow-circle-o-left:before { content: "\f190"; } .fa-toggle-left:before, .fa-caret-square-o-left:before { content: "\f191"; } .fa-dot-circle-o:before { content: "\f192"; } .fa-wheelchair:before { content: "\f193"; } .fa-vimeo-square:before { content: "\f194"; } .fa-turkish-lira:before, .fa-try:before { content: "\f195"; } .fa-plus-square-o:before { content: "\f196"; } .fa-space-shuttle:before { content: "\f197"; } .fa-slack:before { content: "\f198"; } .fa-envelope-square:before { content: "\f199"; } .fa-wordpress:before { content: "\f19a"; } .fa-openid:before { content: "\f19b"; } .fa-institution:before, .fa-bank:before, .fa-university:before { content: "\f19c"; } .fa-mortar-board:before, .fa-graduation-cap:before { content: "\f19d"; } .fa-yahoo:before { content: "\f19e"; } .fa-google:before { content: "\f1a0"; } .fa-reddit:before { content: "\f1a1"; } .fa-reddit-square:before { content: "\f1a2"; } .fa-stumbleupon-circle:before { content: "\f1a3"; } .fa-stumbleupon:before { content: "\f1a4"; } .fa-delicious:before { content: "\f1a5"; } .fa-digg:before { content: "\f1a6"; } .fa-pied-piper:before { content: "\f1a7"; } .fa-pied-piper-alt:before { content: "\f1a8"; } .fa-drupal:before { content: "\f1a9"; } .fa-joomla:before { content: "\f1aa"; } .fa-language:before { content: "\f1ab"; } .fa-fax:before { content: "\f1ac"; } .fa-building:before { content: "\f1ad"; } .fa-child:before { content: "\f1ae"; } .fa-paw:before { content: "\f1b0"; } .fa-spoon:before { content: "\f1b1"; } .fa-cube:before { content: "\f1b2"; } .fa-cubes:before { content: "\f1b3"; } .fa-behance:before { content: "\f1b4"; } .fa-behance-square:before { content: "\f1b5"; } .fa-steam:before { content: "\f1b6"; } .fa-steam-square:before { content: "\f1b7"; } .fa-recycle:before { content: "\f1b8"; } .fa-automobile:before, .fa-car:before { content: "\f1b9"; } .fa-cab:before, .fa-taxi:before { content: "\f1ba"; } .fa-tree:before { content: "\f1bb"; } .fa-spotify:before { content: "\f1bc"; } .fa-deviantart:before { content: "\f1bd"; } .fa-soundcloud:before { content: "\f1be"; } .fa-database:before { content: "\f1c0"; } .fa-file-pdf-o:before { content: "\f1c1"; } .fa-file-word-o:before { content: "\f1c2"; } .fa-file-excel-o:before { content: "\f1c3"; } .fa-file-powerpoint-o:before { content: "\f1c4"; } .fa-file-photo-o:before, .fa-file-picture-o:before, .fa-file-image-o:before { content: "\f1c5"; } .fa-file-zip-o:before, .fa-file-archive-o:before { content: "\f1c6"; } .fa-file-sound-o:before, .fa-file-audio-o:before { content: "\f1c7"; } .fa-file-movie-o:before, .fa-file-video-o:before { content: "\f1c8"; } .fa-file-code-o:before { content: "\f1c9"; } .fa-vine:before { content: "\f1ca"; } .fa-codepen:before { content: "\f1cb"; } .fa-jsfiddle:before { content: "\f1cc"; } .fa-life-bouy:before, .fa-life-buoy:before, .fa-life-saver:before, .fa-support:before, .fa-life-ring:before { content: "\f1cd"; } .fa-circle-o-notch:before { content: "\f1ce"; } .fa-ra:before, .fa-rebel:before { content: "\f1d0"; } .fa-ge:before, .fa-empire:before { content: "\f1d1"; } .fa-git-square:before { content: "\f1d2"; } .fa-git:before { content: "\f1d3"; } .fa-hacker-news:before { content: "\f1d4"; } .fa-tencent-weibo:before { content: "\f1d5"; } .fa-qq:before { content: "\f1d6"; } .fa-wechat:before, .fa-weixin:before { content: "\f1d7"; } .fa-send:before, .fa-paper-plane:before { content: "\f1d8"; } .fa-send-o:before, .fa-paper-plane-o:before { content: "\f1d9"; } .fa-history:before { content: "\f1da"; } .fa-circle-thin:before { content: "\f1db"; } .fa-header:before { content: "\f1dc"; } .fa-paragraph:before { content: "\f1dd"; } .fa-sliders:before { content: "\f1de"; } .fa-share-alt:before { content: "\f1e0"; } .fa-share-alt-square:before { content: "\f1e1"; } .fa-bomb:before { content: "\f1e2"; } .fa-soccer-ball-o:before, .fa-futbol-o:before { content: "\f1e3"; } .fa-tty:before { content: "\f1e4"; } .fa-binoculars:before { content: "\f1e5"; } .fa-plug:before { content: "\f1e6"; } .fa-slideshare:before { content: "\f1e7"; } .fa-twitch:before { content: "\f1e8"; } .fa-yelp:before { content: "\f1e9"; } .fa-newspaper-o:before { content: "\f1ea"; } .fa-wifi:before { content: "\f1eb"; } .fa-calculator:before { content: "\f1ec"; } .fa-paypal:before { content: "\f1ed"; } .fa-google-wallet:before { content: "\f1ee"; } .fa-cc-visa:before { content: "\f1f0"; } .fa-cc-mastercard:before { content: "\f1f1"; } .fa-cc-discover:before { content: "\f1f2"; } .fa-cc-amex:before { content: "\f1f3"; } .fa-cc-paypal:before { content: "\f1f4"; } .fa-cc-stripe:before { content: "\f1f5"; } .fa-bell-slash:before { content: "\f1f6"; } .fa-bell-slash-o:before { content: "\f1f7"; } .fa-trash:before { content: "\f1f8"; } .fa-copyright:before { content: "\f1f9"; } .fa-at:before { content: "\f1fa"; } .fa-eyedropper:before { content: "\f1fb"; } .fa-paint-brush:before { content: "\f1fc"; } .fa-birthday-cake:before { content: "\f1fd"; } .fa-area-chart:before { content: "\f1fe"; } .fa-pie-chart:before { content: "\f200"; } .fa-line-chart:before { content: "\f201"; } .fa-lastfm:before { content: "\f202"; } .fa-lastfm-square:before { content: "\f203"; } .fa-toggle-off:before { content: "\f204"; } .fa-toggle-on:before { content: "\f205"; } .fa-bicycle:before { content: "\f206"; } .fa-bus:before { content: "\f207"; } .fa-ioxhost:before { content: "\f208"; } .fa-angellist:before { content: "\f209"; } .fa-cc:before { content: "\f20a"; } .fa-shekel:before, .fa-sheqel:before, .fa-ils:before { content: "\f20b"; } .fa-meanpath:before { content: "\f20c"; } grr-3.1.0.2/grr/gui/static/third-party/third-party.bundle.js000066400000000000000000171012731273104013200236430ustar00rootroot00000000000000//javascript/closure/base.js // Copyright 2006 The Closure Library Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS-IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /** * @fileoverview Bootstrap for the Google JS Library (Closure). * * In uncompiled mode base.js will write out Closure's deps file, unless the * global CLOSURE_NO_DEPS is set to true. This allows projects to * include their own deps file(s) from different locations. * * @author arv@google.com (Erik Arvidsson) * * @provideGoog */ /** * @define {boolean} Overridden to true by the compiler when * --process_closure_primitives is specified. */ var COMPILED = false; /** * Base namespace for the Closure library. Checks to see goog is already * defined in the current scope before assigning to prevent clobbering if * base.js is loaded more than once. * * @const */ var goog = goog || {}; /** * Reference to the global context. In most cases this will be 'window'. */ goog.global = this; /** * A hook for overriding the define values in uncompiled mode. * * In uncompiled mode, {@code CLOSURE_UNCOMPILED_DEFINES} may be defined before * loading base.js. If a key is defined in {@code CLOSURE_UNCOMPILED_DEFINES}, * {@code goog.define} will use the value instead of the default value. This * allows flags to be overwritten without compilation (this is normally * accomplished with the compiler's "define" flag). * * Example: *
 *   var CLOSURE_UNCOMPILED_DEFINES = {'goog.DEBUG': false};
 * 
* * @type {Object|undefined} */ goog.global.CLOSURE_UNCOMPILED_DEFINES; /** * A hook for overriding the define values in uncompiled or compiled mode, * like CLOSURE_UNCOMPILED_DEFINES but effective in compiled code. In * uncompiled code CLOSURE_UNCOMPILED_DEFINES takes precedence. * * Also unlike CLOSURE_UNCOMPILED_DEFINES the values must be number, boolean or * string literals or the compiler will emit an error. * * While any @define value may be set, only those set with goog.define will be * effective for uncompiled code. * * Example: *
 *   var CLOSURE_DEFINES = {'goog.DEBUG': false} ;
 * 
* * @type {Object|undefined} */ goog.global.CLOSURE_DEFINES; /** * Returns true if the specified value is not undefined. * WARNING: Do not use this to test if an object has a property. Use the in * operator instead. * * @param {?} val Variable to test. * @return {boolean} Whether variable is defined. */ goog.isDef = function(val) { // void 0 always evaluates to undefined and hence we do not need to depend on // the definition of the global variable named 'undefined'. return val !== void 0; }; /** * Builds an object structure for the provided namespace path, ensuring that * names that already exist are not overwritten. For example: * "a.b.c" -> a = {};a.b={};a.b.c={}; * Used by goog.provide and goog.exportSymbol. * @param {string} name name of the object that this file defines. * @param {*=} opt_object the object to expose at the end of the path. * @param {Object=} opt_objectToExportTo The object to add the path to; default * is |goog.global|. * @private */ goog.exportPath_ = function(name, opt_object, opt_objectToExportTo) { var parts = name.split('.'); var cur = opt_objectToExportTo || goog.global; // Internet Explorer exhibits strange behavior when throwing errors from // methods externed in this manner. See the testExportSymbolExceptions in // base_test.html for an example. if (!(parts[0] in cur) && cur.execScript) { cur.execScript('var ' + parts[0]); } // Certain browsers cannot parse code in the form for((a in b); c;); // This pattern is produced by the JSCompiler when it collapses the // statement above into the conditional loop below. To prevent this from // happening, use a for-loop and reserve the init logic as below. // Parentheses added to eliminate strict JS warning in Firefox. for (var part; parts.length && (part = parts.shift());) { if (!parts.length && goog.isDef(opt_object)) { // last part and we have an object; use it cur[part] = opt_object; } else if (cur[part]) { cur = cur[part]; } else { cur = cur[part] = {}; } } }; /** * Defines a named value. In uncompiled mode, the value is retrieved from * CLOSURE_DEFINES or CLOSURE_UNCOMPILED_DEFINES if the object is defined and * has the property specified, and otherwise used the defined defaultValue. * When compiled the default can be overridden using the compiler * options or the value set in the CLOSURE_DEFINES object. * * @param {string} name The distinguished name to provide. * @param {string|number|boolean} defaultValue */ goog.define = function(name, defaultValue) { var value = defaultValue; if (!COMPILED) { if (goog.global.CLOSURE_UNCOMPILED_DEFINES && Object.prototype.hasOwnProperty.call( goog.global.CLOSURE_UNCOMPILED_DEFINES, name)) { value = goog.global.CLOSURE_UNCOMPILED_DEFINES[name]; } else if ( goog.global.CLOSURE_DEFINES && Object.prototype.hasOwnProperty.call( goog.global.CLOSURE_DEFINES, name)) { value = goog.global.CLOSURE_DEFINES[name]; } } goog.exportPath_(name, value); }; /** * @define {boolean} DEBUG is provided as a convenience so that debugging code * that should not be included in a production js_binary can be easily stripped * by specifying --define goog.DEBUG=false to the JSCompiler. For example, most * toString() methods should be declared inside an "if (goog.DEBUG)" conditional * because they are generally used for debugging purposes and it is difficult * for the JSCompiler to statically determine whether they are used. */ goog.define('goog.DEBUG', true); /** * @define {string} LOCALE defines the locale being used for compilation. It is * used to select locale specific data to be compiled in js binary. BUILD rule * can specify this value by "--define goog.LOCALE=" as JSCompiler * option. * * Take into account that the locale code format is important. You should use * the canonical Unicode format with hyphen as a delimiter. Language must be * lowercase, Language Script - Capitalized, Region - UPPERCASE. * There are few examples: pt-BR, en, en-US, sr-Latin-BO, zh-Hans-CN. * * See more info about locale codes here: * http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers * * For language codes you should use values defined by ISO 693-1. See it here * http://www.w3.org/WAI/ER/IG/ert/iso639.htm. There is only one exception from * this rule: the Hebrew language. For legacy reasons the old code (iw) should * be used instead of the new code (he), see http://wiki/Main/IIISynonyms. */ goog.define('goog.LOCALE', 'en'); // default to en /** * @define {boolean} Whether this code is running on trusted sites. * * On untrusted sites, several native functions can be defined or overridden by * external libraries like Prototype, Datejs, and JQuery and setting this flag * to false forces closure to use its own implementations when possible. * * If your JavaScript can be loaded by a third party site and you are wary about * relying on non-standard implementations, specify * "--define goog.TRUSTED_SITE=false" to the JSCompiler. */ goog.define('goog.TRUSTED_SITE', true); /** * @define {boolean} Whether a project is expected to be running in strict mode. * * This define can be used to trigger alternate implementations compatible with * running in EcmaScript Strict mode or warn about unavailable functionality. * @see https://goo.gl/PudQ4y * */ goog.define('goog.STRICT_MODE_COMPATIBLE', false); /** * @define {boolean} Whether code that calls {@link goog.setTestOnly} should * be disallowed in the compilation unit. */ goog.define('goog.DISALLOW_TEST_ONLY_CODE', COMPILED && !goog.DEBUG); /** * @define {boolean} Whether to use a Chrome app CSP-compliant method for * loading scripts via goog.require. @see appendScriptSrcNode_. */ goog.define('goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING', false); /** * Defines a namespace in Closure. * * A namespace may only be defined once in a codebase. It may be defined using * goog.provide() or goog.module(). * * The presence of one or more goog.provide() calls in a file indicates * that the file defines the given objects/namespaces. * Provided symbols must not be null or undefined. * * In addition, goog.provide() creates the object stubs for a namespace * (for example, goog.provide("goog.foo.bar") will create the object * goog.foo.bar if it does not already exist). * * Build tools also scan for provide/require/module statements * to discern dependencies, build dependency files (see deps.js), etc. * * @see goog.require * @see goog.module * @param {string} name Namespace provided by this file in the form * "goog.package.part". */ goog.provide = function(name) { if (goog.isInModuleLoader_()) { throw Error('goog.provide can not be used within a goog.module.'); } if (!COMPILED) { // Ensure that the same namespace isn't provided twice. // A goog.module/goog.provide maps a goog.require to a specific file if (goog.isProvided_(name)) { throw Error('Namespace "' + name + '" already declared.'); } } goog.constructNamespace_(name); }; /** * @param {string} name Namespace provided by this file in the form * "goog.package.part". * @param {Object=} opt_obj The object to embed in the namespace. * @private */ goog.constructNamespace_ = function(name, opt_obj) { if (!COMPILED) { delete goog.implicitNamespaces_[name]; var namespace = name; while ((namespace = namespace.substring(0, namespace.lastIndexOf('.')))) { if (goog.getObjectByName(namespace)) { break; } goog.implicitNamespaces_[namespace] = true; } } goog.exportPath_(name, opt_obj); }; /** * Module identifier validation regexp. * Note: This is a conservative check, it is very possible to be more lenient, * the primary exclusion here is "/" and "\" and a leading ".", these * restrictions are intended to leave the door open for using goog.require * with relative file paths rather than module identifiers. * @private */ goog.VALID_MODULE_RE_ = /^[a-zA-Z_$][a-zA-Z0-9._$]*$/; /** * Defines a module in Closure. * * Marks that this file must be loaded as a module and claims the namespace. * * A namespace may only be defined once in a codebase. It may be defined using * goog.provide() or goog.module(). * * goog.module() has three requirements: * - goog.module may not be used in the same file as goog.provide. * - goog.module must be the first statement in the file. * - only one goog.module is allowed per file. * * When a goog.module annotated file is loaded, it is enclosed in * a strict function closure. This means that: * - any variables declared in a goog.module file are private to the file * (not global), though the compiler is expected to inline the module. * - The code must obey all the rules of "strict" JavaScript. * - the file will be marked as "use strict" * * NOTE: unlike goog.provide, goog.module does not declare any symbols by * itself. If declared symbols are desired, use * goog.module.declareLegacyNamespace(). * * * See the public goog.module proposal: http://goo.gl/Va1hin * * @param {string} name Namespace provided by this file in the form * "goog.package.part", is expected but not required. */ goog.module = function(name) { if (!goog.isString(name) || !name || name.search(goog.VALID_MODULE_RE_) == -1) { throw Error('Invalid module identifier'); } if (!goog.isInModuleLoader_()) { throw Error('Module ' + name + ' has been loaded incorrectly.'); } if (goog.moduleLoaderState_.moduleName) { throw Error('goog.module may only be called once per module.'); } // Store the module name for the loader. goog.moduleLoaderState_.moduleName = name; if (!COMPILED) { // Ensure that the same namespace isn't provided twice. // A goog.module/goog.provide maps a goog.require to a specific file if (goog.isProvided_(name)) { throw Error('Namespace "' + name + '" already declared.'); } delete goog.implicitNamespaces_[name]; } }; /** * @param {string} name The module identifier. * @return {?} The module exports for an already loaded module or null. * * Note: This is not an alternative to goog.require, it does not * indicate a hard dependency, instead it is used to indicate * an optional dependency or to access the exports of a module * that has already been loaded. * @suppress {missingProvide} */ goog.module.get = function(name) { return goog.module.getInternal_(name); }; /** * @param {string} name The module identifier. * @return {?} The module exports for an already loaded module or null. * @private */ goog.module.getInternal_ = function(name) { if (!COMPILED) { if (goog.isProvided_(name)) { // goog.require only return a value with-in goog.module files. return name in goog.loadedModules_ ? goog.loadedModules_[name] : goog.getObjectByName(name); } else { return null; } } }; /** * @private {?{moduleName: (string|undefined), declareLegacyNamespace:boolean}} */ goog.moduleLoaderState_ = null; /** * @private * @return {boolean} Whether a goog.module is currently being initialized. */ goog.isInModuleLoader_ = function() { return goog.moduleLoaderState_ != null; }; /** * Provide the module's exports as a globally accessible object under the * module's declared name. This is intended to ease migration to goog.module * for files that have existing usages. * @suppress {missingProvide} */ goog.module.declareLegacyNamespace = function() { if (!COMPILED && !goog.isInModuleLoader_()) { throw new Error( 'goog.module.declareLegacyNamespace must be called from ' + 'within a goog.module'); } if (!COMPILED && !goog.moduleLoaderState_.moduleName) { throw Error( 'goog.module must be called prior to ' + 'goog.module.declareLegacyNamespace.'); } goog.moduleLoaderState_.declareLegacyNamespace = true; }; /** * Marks that the current file should only be used for testing, and never for * live code in production. * * In the case of unit tests, the message may optionally be an exact namespace * for the test (e.g. 'goog.stringTest'). The linter will then ignore the extra * provide (if not explicitly defined in the code). * * @param {string=} opt_message Optional message to add to the error that's * raised when used in production code. */ goog.setTestOnly = function(opt_message) { if (goog.DISALLOW_TEST_ONLY_CODE) { opt_message = opt_message || ''; throw Error( 'Importing test-only code into non-debug environment' + (opt_message ? ': ' + opt_message : '.')); } }; /** * Forward declares a symbol. This is an indication to the compiler that the * symbol may be used in the source yet is not required and may not be provided * in compilation. * * The most common usage of forward declaration is code that takes a type as a * function parameter but does not need to require it. By forward declaring * instead of requiring, no hard dependency is made, and (if not required * elsewhere) the namespace may never be required and thus, not be pulled * into the JavaScript binary. If it is required elsewhere, it will be type * checked as normal. * * * @param {string} name The namespace to forward declare in the form of * "goog.package.part". */ goog.forwardDeclare = function(name) {}; /** * Forward declare type information. Used to assign types to goog.global * referenced object that would otherwise result in unknown type references * and thus block property disambiguation. */ goog.forwardDeclare('Document'); goog.forwardDeclare('HTMLScriptElement'); goog.forwardDeclare('XMLHttpRequest'); if (!COMPILED) { /** * Check if the given name has been goog.provided. This will return false for * names that are available only as implicit namespaces. * @param {string} name name of the object to look for. * @return {boolean} Whether the name has been provided. * @private */ goog.isProvided_ = function(name) { return (name in goog.loadedModules_) || (!goog.implicitNamespaces_[name] && goog.isDefAndNotNull(goog.getObjectByName(name))); }; /** * Namespaces implicitly defined by goog.provide. For example, * goog.provide('goog.events.Event') implicitly declares that 'goog' and * 'goog.events' must be namespaces. * * @type {!Object} * @private */ goog.implicitNamespaces_ = {'goog.module': true}; // NOTE: We add goog.module as an implicit namespace as goog.module is defined // here and because the existing module package has not been moved yet out of // the goog.module namespace. This satisifies both the debug loader and // ahead-of-time dependency management. } /** * Returns an object based on its fully qualified external name. The object * is not found if null or undefined. If you are using a compilation pass that * renames property names beware that using this function will not find renamed * properties. * * @param {string} name The fully qualified name. * @param {Object=} opt_obj The object within which to look; default is * |goog.global|. * @return {?} The value (object or primitive) or, if not found, null. */ goog.getObjectByName = function(name, opt_obj) { var parts = name.split('.'); var cur = opt_obj || goog.global; for (var part; part = parts.shift();) { if (goog.isDefAndNotNull(cur[part])) { cur = cur[part]; } else { return null; } } return cur; }; /** * Globalizes a whole namespace, such as goog or goog.lang. * * @param {!Object} obj The namespace to globalize. * @param {Object=} opt_global The object to add the properties to. * @deprecated Properties may be explicitly exported to the global scope, but * this should no longer be done in bulk. */ goog.globalize = function(obj, opt_global) { var global = opt_global || goog.global; for (var x in obj) { global[x] = obj[x]; } }; /** * Adds a dependency from a file to the files it requires. * @param {string} relPath The path to the js file. * @param {!Array} provides An array of strings with * the names of the objects this file provides. * @param {!Array} requires An array of strings with * the names of the objects this file requires. * @param {boolean|!Object=} opt_loadFlags Parameters indicating * how the file must be loaded. The boolean 'true' is equivalent * to {'module': 'goog'} for backwards-compatibility. Valid properties * and values include {'module': 'goog'} and {'lang': 'es6'}. */ goog.addDependency = function(relPath, provides, requires, opt_loadFlags) { if (goog.DEPENDENCIES_ENABLED) { var provide, require; var path = relPath.replace(/\\/g, '/'); var deps = goog.dependencies_; if (!opt_loadFlags || typeof opt_loadFlags === 'boolean') { opt_loadFlags = opt_loadFlags ? {'module': 'goog'} : {}; } for (var i = 0; provide = provides[i]; i++) { deps.nameToPath[provide] = path; deps.loadFlags[path] = opt_loadFlags; } for (var j = 0; require = requires[j]; j++) { if (!(path in deps.requires)) { deps.requires[path] = {}; } deps.requires[path][require] = true; } } }; // NOTE(nnaze): The debug DOM loader was included in base.js as an original way // to do "debug-mode" development. The dependency system can sometimes be // confusing, as can the debug DOM loader's asynchronous nature. // // With the DOM loader, a call to goog.require() is not blocking -- the script // will not load until some point after the current script. If a namespace is // needed at runtime, it needs to be defined in a previous script, or loaded via // require() with its registered dependencies. // // User-defined namespaces may need their own deps file. For a reference on // creating a deps file, see: // Externally: https://developers.google.com/closure/library/docs/depswriter // // Because of legacy clients, the DOM loader can't be easily removed from // base.js. Work is being done to make it disableable or replaceable for // different environments (DOM-less JavaScript interpreters like Rhino or V8, // for example). See bootstrap/ for more information. /** * @define {boolean} Whether to enable the debug loader. * * If enabled, a call to goog.require() will attempt to load the namespace by * appending a script tag to the DOM (if the namespace has been registered). * * If disabled, goog.require() will simply assert that the namespace has been * provided (and depend on the fact that some outside tool correctly ordered * the script). */ goog.define('goog.ENABLE_DEBUG_LOADER', true); /** * @param {string} msg * @private */ goog.logToConsole_ = function(msg) { if (goog.global.console) { goog.global.console['error'](msg); } }; /** * Implements a system for the dynamic resolution of dependencies that works in * parallel with the BUILD system. Note that all calls to goog.require will be * stripped by the JSCompiler when the --process_closure_primitives option is * used. * @see goog.provide * @param {string} name Namespace to include (as was given in goog.provide()) in * the form "goog.package.part". * @return {?} If called within a goog.module file, the associated namespace or * module otherwise null. */ goog.require = function(name) { // If the object already exists we do not need do do anything. if (!COMPILED) { if (goog.ENABLE_DEBUG_LOADER && goog.IS_OLD_IE_) { goog.maybeProcessDeferredDep_(name); } if (goog.isProvided_(name)) { if (goog.isInModuleLoader_()) { return goog.module.getInternal_(name); } else { return null; } } if (goog.ENABLE_DEBUG_LOADER) { var path = goog.getPathFromDeps_(name); if (path) { goog.writeScripts_(path); return null; } } var errorMessage = 'goog.require could not find: ' + name; goog.logToConsole_(errorMessage); throw Error(errorMessage); } }; /** * Path for included scripts. * @type {string} */ goog.basePath = ''; /** * A hook for overriding the base path. * @type {string|undefined} */ goog.global.CLOSURE_BASE_PATH; /** * Whether to write out Closure's deps file. By default, the deps are written. * @type {boolean|undefined} */ goog.global.CLOSURE_NO_DEPS; /** * A function to import a single script. This is meant to be overridden when * Closure is being run in non-HTML contexts, such as web workers. It's defined * in the global scope so that it can be set before base.js is loaded, which * allows deps.js to be imported properly. * * The function is passed the script source, which is a relative URI. It should * return true if the script was imported, false otherwise. * @type {(function(string): boolean)|undefined} */ goog.global.CLOSURE_IMPORT_SCRIPT; /** * Null function used for default values of callbacks, etc. * @return {void} Nothing. */ goog.nullFunction = function() {}; /** * When defining a class Foo with an abstract method bar(), you can do: * Foo.prototype.bar = goog.abstractMethod * * Now if a subclass of Foo fails to override bar(), an error will be thrown * when bar() is invoked. * * Note: This does not take the name of the function to override as an argument * because that would make it more difficult to obfuscate our JavaScript code. * * @type {!Function} * @throws {Error} when invoked to indicate the method should be overridden. */ goog.abstractMethod = function() { throw Error('unimplemented abstract method'); }; /** * Adds a {@code getInstance} static method that always returns the same * instance object. * @param {!Function} ctor The constructor for the class to add the static * method to. */ goog.addSingletonGetter = function(ctor) { ctor.getInstance = function() { if (ctor.instance_) { return ctor.instance_; } if (goog.DEBUG) { // NOTE: JSCompiler can't optimize away Array#push. goog.instantiatedSingletons_[goog.instantiatedSingletons_.length] = ctor; } return ctor.instance_ = new ctor; }; }; /** * All singleton classes that have been instantiated, for testing. Don't read * it directly, use the {@code goog.testing.singleton} module. The compiler * removes this variable if unused. * @type {!Array} * @private */ goog.instantiatedSingletons_ = []; /** * @define {boolean} Whether to load goog.modules using {@code eval} when using * the debug loader. This provides a better debugging experience as the * source is unmodified and can be edited using Chrome Workspaces or similar. * However in some environments the use of {@code eval} is banned * so we provide an alternative. */ goog.define('goog.LOAD_MODULE_USING_EVAL', true); /** * @define {boolean} Whether the exports of goog.modules should be sealed when * possible. */ goog.define('goog.SEAL_MODULE_EXPORTS', goog.DEBUG); /** * The registry of initialized modules: * the module identifier to module exports map. * @private @const {!Object} */ goog.loadedModules_ = {}; /** * True if goog.dependencies_ is available. * @const {boolean} */ goog.DEPENDENCIES_ENABLED = !COMPILED && goog.ENABLE_DEBUG_LOADER; /** * @define {string} How to decide whether to transpile. Valid values * are 'always', 'never', and 'detect'. The default ('detect') is to * use feature detection to determine which language levels need * transpilation. */ // NOTE(user): we could expand this to accept a language level to bypass // detection: e.g. goog.TRANSPILE == 'es5' would transpile ES6 files but // would leave ES3 and ES5 files alone. goog.define('goog.TRANSPILE', 'detect'); /** * @define {string} Path to the transpiler. Executing the script at this * path (relative to base.js) should define a function $jscomp.transpile. */ goog.define('goog.TRANSPILER', 'transpile.js'); if (goog.DEPENDENCIES_ENABLED) { /** * This object is used to keep track of dependencies and other data that is * used for loading scripts. * @private * @type {{ * loadFlags: !Object>, * nameToPath: !Object, * requires: !Object>, * visited: !Object, * written: !Object, * deferred: !Object * }} */ goog.dependencies_ = { loadFlags: {}, // 1 to 1 nameToPath: {}, // 1 to 1 requires: {}, // 1 to many // Used when resolving dependencies to prevent us from visiting file twice. visited: {}, written: {}, // Used to keep track of script files we have written. deferred: {} // Used to track deferred module evaluations in old IEs }; /** * Tries to detect whether is in the context of an HTML document. * @return {boolean} True if it looks like HTML document. * @private */ goog.inHtmlDocument_ = function() { /** @type {Document} */ var doc = goog.global.document; return doc != null && 'write' in doc; // XULDocument misses write. }; /** * Tries to detect the base path of base.js script that bootstraps Closure. * @private */ goog.findBasePath_ = function() { if (goog.isDef(goog.global.CLOSURE_BASE_PATH)) { goog.basePath = goog.global.CLOSURE_BASE_PATH; return; } else if (!goog.inHtmlDocument_()) { return; } /** @type {Document} */ var doc = goog.global.document; var scripts = doc.getElementsByTagName('SCRIPT'); // Search backwards since the current script is in almost all cases the one // that has base.js. for (var i = scripts.length - 1; i >= 0; --i) { var script = /** @type {!HTMLScriptElement} */ (scripts[i]); var src = script.src; var qmark = src.lastIndexOf('?'); var l = qmark == -1 ? src.length : qmark; if (src.substr(l - 7, 7) == 'base.js') { goog.basePath = src.substr(0, l - 7); return; } } }; /** * Imports a script if, and only if, that script hasn't already been imported. * (Must be called at execution time) * @param {string} src Script source. * @param {string=} opt_sourceText The optionally source text to evaluate * @private */ goog.importScript_ = function(src, opt_sourceText) { var importScript = goog.global.CLOSURE_IMPORT_SCRIPT || goog.writeScriptTag_; if (importScript(src, opt_sourceText)) { goog.dependencies_.written[src] = true; } }; /** * Whether the browser is IE9 or earlier, which needs special handling * for deferred modules. * @const @private {boolean} */ goog.IS_OLD_IE_ = !!(!goog.global.atob && goog.global.document && goog.global.document.all); /** * Given a URL initiate retrieval and execution of a script that needs * pre-processing. * @param {string} src Script source URL. * @param {boolean} isModule Whether this is a goog.module. * @param {boolean} needsTranspile Whether this source needs transpilation. * @private */ goog.importProcessedScript_ = function(src, isModule, needsTranspile) { // In an attempt to keep browsers from timing out loading scripts using // synchronous XHRs, put each load in its own script block. var bootstrap = 'goog.retrieveAndExec_("' + src + '", ' + isModule + ', ' + needsTranspile + ');'; goog.importScript_('', bootstrap); }; /** @private {!Array} */ goog.queuedModules_ = []; /** * Return an appropriate module text. Suitable to insert into * a script tag (that is unescaped). * @param {string} srcUrl * @param {string} scriptText * @return {string} * @private */ goog.wrapModule_ = function(srcUrl, scriptText) { if (!goog.LOAD_MODULE_USING_EVAL || !goog.isDef(goog.global.JSON)) { return '' + 'goog.loadModule(function(exports) {' + '"use strict";' + scriptText + '\n' + // terminate any trailing single line comment. ';return exports' + '});' + '\n//# sourceURL=' + srcUrl + '\n'; } else { return '' + 'goog.loadModule(' + goog.global.JSON.stringify( scriptText + '\n//# sourceURL=' + srcUrl + '\n') + ');'; } }; // On IE9 and earlier, it is necessary to handle // deferred module loads. In later browsers, the // code to be evaluated is simply inserted as a script // block in the correct order. To eval deferred // code at the right time, we piggy back on goog.require to call // goog.maybeProcessDeferredDep_. // // The goog.requires are used both to bootstrap // the loading process (when no deps are available) and // declare that they should be available. // // Here we eval the sources, if all the deps are available // either already eval'd or goog.require'd. This will // be the case when all the dependencies have already // been loaded, and the dependent module is loaded. // // But this alone isn't sufficient because it is also // necessary to handle the case where there is no root // that is not deferred. For that there we register for an event // and trigger goog.loadQueuedModules_ handle any remaining deferred // evaluations. /** * Handle any remaining deferred goog.module evals. * @private */ goog.loadQueuedModules_ = function() { var count = goog.queuedModules_.length; if (count > 0) { var queue = goog.queuedModules_; goog.queuedModules_ = []; for (var i = 0; i < count; i++) { var path = queue[i]; goog.maybeProcessDeferredPath_(path); } } }; /** * Eval the named module if its dependencies are * available. * @param {string} name The module to load. * @private */ goog.maybeProcessDeferredDep_ = function(name) { if (goog.isDeferredModule_(name) && goog.allDepsAreAvailable_(name)) { var path = goog.getPathFromDeps_(name); goog.maybeProcessDeferredPath_(goog.basePath + path); } }; /** * @param {string} name The module to check. * @return {boolean} Whether the name represents a * module whose evaluation has been deferred. * @private */ goog.isDeferredModule_ = function(name) { var path = goog.getPathFromDeps_(name); var loadFlags = path && goog.dependencies_.loadFlags[path] || {}; if (path && (loadFlags['module'] == 'goog' || goog.needsTranspile_(loadFlags['lang']))) { var abspath = goog.basePath + path; return (abspath) in goog.dependencies_.deferred; } return false; }; /** * @param {string} name The module to check. * @return {boolean} Whether the name represents a * module whose declared dependencies have all been loaded * (eval'd or a deferred module load) * @private */ goog.allDepsAreAvailable_ = function(name) { var path = goog.getPathFromDeps_(name); if (path && (path in goog.dependencies_.requires)) { for (var requireName in goog.dependencies_.requires[path]) { if (!goog.isProvided_(requireName) && !goog.isDeferredModule_(requireName)) { return false; } } } return true; }; /** * @param {string} abspath * @private */ goog.maybeProcessDeferredPath_ = function(abspath) { if (abspath in goog.dependencies_.deferred) { var src = goog.dependencies_.deferred[abspath]; delete goog.dependencies_.deferred[abspath]; goog.globalEval(src); } }; /** * Load a goog.module from the provided URL. This is not a general purpose * code loader and does not support late loading code, that is it should only * be used during page load. This method exists to support unit tests and * "debug" loaders that would otherwise have inserted script tags. Under the * hood this needs to use a synchronous XHR and is not recommeneded for * production code. * * The module's goog.requires must have already been satisified; an exception * will be thrown if this is not the case. This assumption is that no * "deps.js" file exists, so there is no way to discover and locate the * module-to-be-loaded's dependencies and no attempt is made to do so. * * There should only be one attempt to load a module. If * "goog.loadModuleFromUrl" is called for an already loaded module, an * exception will be throw. * * @param {string} url The URL from which to attempt to load the goog.module. */ goog.loadModuleFromUrl = function(url) { // Because this executes synchronously, we don't need to do any additional // bookkeeping. When "goog.loadModule" the namespace will be marked as // having been provided which is sufficient. goog.retrieveAndExec_(url, true, false); }; /** * Writes a new script pointing to {@code src} directly into the DOM. * * NOTE: This method is not CSP-compliant. @see goog.appendScriptSrcNode_ for * the fallback mechanism. * * @param {string} src The script URL. * @private */ goog.writeScriptSrcNode_ = function(src) { goog.global.document.write( ' */ function copy(source, destination) { var stackSource = []; var stackDest = []; if (destination) { if (isTypedArray(destination) || isArrayBuffer(destination)) { throw ngMinErr('cpta', "Can't copy! TypedArray destination cannot be mutated."); } if (source === destination) { throw ngMinErr('cpi', "Can't copy! Source and destination are identical."); } // Empty the destination object if (isArray(destination)) { destination.length = 0; } else { forEach(destination, function(value, key) { if (key !== '$$hashKey') { delete destination[key]; } }); } stackSource.push(source); stackDest.push(destination); return copyRecurse(source, destination); } return copyElement(source); function copyRecurse(source, destination) { var h = destination.$$hashKey; var key; if (isArray(source)) { for (var i = 0, ii = source.length; i < ii; i++) { destination.push(copyElement(source[i])); } } else if (isBlankObject(source)) { // createMap() fast path --- Safe to avoid hasOwnProperty check because prototype chain is empty for (key in source) { destination[key] = copyElement(source[key]); } } else if (source && typeof source.hasOwnProperty === 'function') { // Slow path, which must rely on hasOwnProperty for (key in source) { if (source.hasOwnProperty(key)) { destination[key] = copyElement(source[key]); } } } else { // Slowest path --- hasOwnProperty can't be called as a method for (key in source) { if (hasOwnProperty.call(source, key)) { destination[key] = copyElement(source[key]); } } } setHashKey(destination, h); return destination; } function copyElement(source) { // Simple values if (!isObject(source)) { return source; } // Already copied values var index = stackSource.indexOf(source); if (index !== -1) { return stackDest[index]; } if (isWindow(source) || isScope(source)) { throw ngMinErr('cpws', "Can't copy! Making copies of Window or Scope instances is not supported."); } var needsRecurse = false; var destination = copyType(source); if (destination === undefined) { destination = isArray(source) ? [] : Object.create(getPrototypeOf(source)); needsRecurse = true; } stackSource.push(source); stackDest.push(destination); return needsRecurse ? copyRecurse(source, destination) : destination; } function copyType(source) { switch (toString.call(source)) { case '[object Int8Array]': case '[object Int16Array]': case '[object Int32Array]': case '[object Float32Array]': case '[object Float64Array]': case '[object Uint8Array]': case '[object Uint8ClampedArray]': case '[object Uint16Array]': case '[object Uint32Array]': return new source.constructor(copyElement(source.buffer)); case '[object ArrayBuffer]': //Support: IE10 if (!source.slice) { var copied = new ArrayBuffer(source.byteLength); new Uint8Array(copied).set(new Uint8Array(source)); return copied; } return source.slice(0); case '[object Boolean]': case '[object Number]': case '[object String]': case '[object Date]': return new source.constructor(source.valueOf()); case '[object RegExp]': var re = new RegExp(source.source, source.toString().match(/[^\/]*$/)[0]); re.lastIndex = source.lastIndex; return re; case '[object Blob]': return new source.constructor([source], {type: source.type}); } if (isFunction(source.cloneNode)) { return source.cloneNode(true); } } } /** * @ngdoc function * @name angular.equals * @module ng * @kind function * * @description * Determines if two objects or two values are equivalent. Supports value types, regular * expressions, arrays and objects. * * Two objects or values are considered equivalent if at least one of the following is true: * * * Both objects or values pass `===` comparison. * * Both objects or values are of the same type and all of their properties are equal by * comparing them with `angular.equals`. * * Both values are NaN. (In JavaScript, NaN == NaN => false. But we consider two NaN as equal) * * Both values represent the same regular expression (In JavaScript, * /abc/ == /abc/ => false. But we consider two regular expressions as equal when their textual * representation matches). * * During a property comparison, properties of `function` type and properties with names * that begin with `$` are ignored. * * Scope and DOMWindow objects are being compared only by identify (`===`). * * @param {*} o1 Object or value to compare. * @param {*} o2 Object or value to compare. * @returns {boolean} True if arguments are equal. * * @example

User 1

Name: Age:

User 2

Name: Age:

User 1:
{{user1 | json}}
User 2:
{{user2 | json}}
Equal:
{{result}}
angular.module('equalsExample', []).controller('ExampleController', ['$scope', function($scope) { $scope.user1 = {}; $scope.user2 = {}; $scope.result; $scope.compare = function() { $scope.result = angular.equals($scope.user1, $scope.user2); }; }]);
*/ function equals(o1, o2) { if (o1 === o2) return true; if (o1 === null || o2 === null) return false; if (o1 !== o1 && o2 !== o2) return true; // NaN === NaN var t1 = typeof o1, t2 = typeof o2, length, key, keySet; if (t1 == t2 && t1 == 'object') { if (isArray(o1)) { if (!isArray(o2)) return false; if ((length = o1.length) == o2.length) { for (key = 0; key < length; key++) { if (!equals(o1[key], o2[key])) return false; } return true; } } else if (isDate(o1)) { if (!isDate(o2)) return false; return equals(o1.getTime(), o2.getTime()); } else if (isRegExp(o1)) { if (!isRegExp(o2)) return false; return o1.toString() == o2.toString(); } else { if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2) || isArray(o2) || isDate(o2) || isRegExp(o2)) return false; keySet = createMap(); for (key in o1) { if (key.charAt(0) === '$' || isFunction(o1[key])) continue; if (!equals(o1[key], o2[key])) return false; keySet[key] = true; } for (key in o2) { if (!(key in keySet) && key.charAt(0) !== '$' && isDefined(o2[key]) && !isFunction(o2[key])) return false; } return true; } } return false; } var csp = function() { if (!isDefined(csp.rules)) { var ngCspElement = (window.document.querySelector('[ng-csp]') || window.document.querySelector('[data-ng-csp]')); if (ngCspElement) { var ngCspAttribute = ngCspElement.getAttribute('ng-csp') || ngCspElement.getAttribute('data-ng-csp'); csp.rules = { noUnsafeEval: !ngCspAttribute || (ngCspAttribute.indexOf('no-unsafe-eval') !== -1), noInlineStyle: !ngCspAttribute || (ngCspAttribute.indexOf('no-inline-style') !== -1) }; } else { csp.rules = { noUnsafeEval: noUnsafeEval(), noInlineStyle: false }; } } return csp.rules; function noUnsafeEval() { try { /* jshint -W031, -W054 */ new Function(''); /* jshint +W031, +W054 */ return false; } catch (e) { return true; } } }; /** * @ngdoc directive * @module ng * @name ngJq * * @element ANY * @param {string=} ngJq the name of the library available under `window` * to be used for angular.element * @description * Use this directive to force the angular.element library. This should be * used to force either jqLite by leaving ng-jq blank or setting the name of * the jquery variable under window (eg. jQuery). * * Since angular looks for this directive when it is loaded (doesn't wait for the * DOMContentLoaded event), it must be placed on an element that comes before the script * which loads angular. Also, only the first instance of `ng-jq` will be used and all * others ignored. * * @example * This example shows how to force jqLite using the `ngJq` directive to the `html` tag. ```html ... ... ``` * @example * This example shows how to use a jQuery based library of a different name. * The library name must be available at the top most 'window'. ```html ... ... ``` */ var jq = function() { if (isDefined(jq.name_)) return jq.name_; var el; var i, ii = ngAttrPrefixes.length, prefix, name; for (i = 0; i < ii; ++i) { prefix = ngAttrPrefixes[i]; if (el = window.document.querySelector('[' + prefix.replace(':', '\\:') + 'jq]')) { name = el.getAttribute(prefix + 'jq'); break; } } return (jq.name_ = name); }; function concat(array1, array2, index) { return array1.concat(slice.call(array2, index)); } function sliceArgs(args, startIndex) { return slice.call(args, startIndex || 0); } /* jshint -W101 */ /** * @ngdoc function * @name angular.bind * @module ng * @kind function * * @description * Returns a function which calls function `fn` bound to `self` (`self` becomes the `this` for * `fn`). You can supply optional `args` that are prebound to the function. This feature is also * known as [partial application](http://en.wikipedia.org/wiki/Partial_application), as * distinguished from [function currying](http://en.wikipedia.org/wiki/Currying#Contrast_with_partial_function_application). * * @param {Object} self Context which `fn` should be evaluated in. * @param {function()} fn Function to be bound. * @param {...*} args Optional arguments to be prebound to the `fn` function call. * @returns {function()} Function that wraps the `fn` with all the specified bindings. */ /* jshint +W101 */ function bind(self, fn) { var curryArgs = arguments.length > 2 ? sliceArgs(arguments, 2) : []; if (isFunction(fn) && !(fn instanceof RegExp)) { return curryArgs.length ? function() { return arguments.length ? fn.apply(self, concat(curryArgs, arguments, 0)) : fn.apply(self, curryArgs); } : function() { return arguments.length ? fn.apply(self, arguments) : fn.call(self); }; } else { // In IE, native methods are not functions so they cannot be bound (note: they don't need to be). return fn; } } function toJsonReplacer(key, value) { var val = value; if (typeof key === 'string' && key.charAt(0) === '$' && key.charAt(1) === '$') { val = undefined; } else if (isWindow(value)) { val = '$WINDOW'; } else if (value && window.document === value) { val = '$DOCUMENT'; } else if (isScope(value)) { val = '$SCOPE'; } return val; } /** * @ngdoc function * @name angular.toJson * @module ng * @kind function * * @description * Serializes input into a JSON-formatted string. Properties with leading $$ characters will be * stripped since angular uses this notation internally. * * @param {Object|Array|Date|string|number} obj Input to be serialized into JSON. * @param {boolean|number} [pretty=2] If set to true, the JSON output will contain newlines and whitespace. * If set to an integer, the JSON output will contain that many spaces per indentation. * @returns {string|undefined} JSON-ified string representing `obj`. * @knownIssue * * The Safari browser throws a `RangeError` instead of returning `null` when it tries to stringify a `Date` * object with an invalid date value. The only reliable way to prevent this is to monkeypatch the * `Date.prototype.toJSON` method as follows: * * ``` * var _DatetoJSON = Date.prototype.toJSON; * Date.prototype.toJSON = function() { * try { * return _DatetoJSON.call(this); * } catch(e) { * if (e instanceof RangeError) { * return null; * } * throw e; * } * }; * ``` * * See https://github.com/angular/angular.js/pull/14221 for more information. */ function toJson(obj, pretty) { if (isUndefined(obj)) return undefined; if (!isNumber(pretty)) { pretty = pretty ? 2 : null; } return JSON.stringify(obj, toJsonReplacer, pretty); } /** * @ngdoc function * @name angular.fromJson * @module ng * @kind function * * @description * Deserializes a JSON string. * * @param {string} json JSON string to deserialize. * @returns {Object|Array|string|number} Deserialized JSON string. */ function fromJson(json) { return isString(json) ? JSON.parse(json) : json; } var ALL_COLONS = /:/g; function timezoneToOffset(timezone, fallback) { // IE/Edge do not "understand" colon (`:`) in timezone timezone = timezone.replace(ALL_COLONS, ''); var requestedTimezoneOffset = Date.parse('Jan 01, 1970 00:00:00 ' + timezone) / 60000; return isNaN(requestedTimezoneOffset) ? fallback : requestedTimezoneOffset; } function addDateMinutes(date, minutes) { date = new Date(date.getTime()); date.setMinutes(date.getMinutes() + minutes); return date; } function convertTimezoneToLocal(date, timezone, reverse) { reverse = reverse ? -1 : 1; var dateTimezoneOffset = date.getTimezoneOffset(); var timezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset); return addDateMinutes(date, reverse * (timezoneOffset - dateTimezoneOffset)); } /** * @returns {string} Returns the string representation of the element. */ function startingTag(element) { element = jqLite(element).clone(); try { // turns out IE does not let you set .html() on elements which // are not allowed to have children. So we just ignore it. element.empty(); } catch (e) {} var elemHtml = jqLite('
').append(element).html(); try { return element[0].nodeType === NODE_TYPE_TEXT ? lowercase(elemHtml) : elemHtml. match(/^(<[^>]+>)/)[1]. replace(/^<([\w\-]+)/, function(match, nodeName) {return '<' + lowercase(nodeName);}); } catch (e) { return lowercase(elemHtml); } } ///////////////////////////////////////////////// /** * Tries to decode the URI component without throwing an exception. * * @private * @param str value potential URI component to check. * @returns {boolean} True if `value` can be decoded * with the decodeURIComponent function. */ function tryDecodeURIComponent(value) { try { return decodeURIComponent(value); } catch (e) { // Ignore any invalid uri component. } } /** * Parses an escaped url query string into key-value pairs. * @returns {Object.} */ function parseKeyValue(/**string*/keyValue) { var obj = {}; forEach((keyValue || "").split('&'), function(keyValue) { var splitPoint, key, val; if (keyValue) { key = keyValue = keyValue.replace(/\+/g,'%20'); splitPoint = keyValue.indexOf('='); if (splitPoint !== -1) { key = keyValue.substring(0, splitPoint); val = keyValue.substring(splitPoint + 1); } key = tryDecodeURIComponent(key); if (isDefined(key)) { val = isDefined(val) ? tryDecodeURIComponent(val) : true; if (!hasOwnProperty.call(obj, key)) { obj[key] = val; } else if (isArray(obj[key])) { obj[key].push(val); } else { obj[key] = [obj[key],val]; } } } }); return obj; } function toKeyValue(obj) { var parts = []; forEach(obj, function(value, key) { if (isArray(value)) { forEach(value, function(arrayValue) { parts.push(encodeUriQuery(key, true) + (arrayValue === true ? '' : '=' + encodeUriQuery(arrayValue, true))); }); } else { parts.push(encodeUriQuery(key, true) + (value === true ? '' : '=' + encodeUriQuery(value, true))); } }); return parts.length ? parts.join('&') : ''; } /** * We need our custom method because encodeURIComponent is too aggressive and doesn't follow * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path * segments: * segment = *pchar * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" * pct-encoded = "%" HEXDIG HEXDIG * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" * / "*" / "+" / "," / ";" / "=" */ function encodeUriSegment(val) { return encodeUriQuery(val, true). replace(/%26/gi, '&'). replace(/%3D/gi, '='). replace(/%2B/gi, '+'); } /** * This method is intended for encoding *key* or *value* parts of query component. We need a custom * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be * encoded per http://tools.ietf.org/html/rfc3986: * query = *( pchar / "/" / "?" ) * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" * pct-encoded = "%" HEXDIG HEXDIG * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" * / "*" / "+" / "," / ";" / "=" */ function encodeUriQuery(val, pctEncodeSpaces) { return encodeURIComponent(val). replace(/%40/gi, '@'). replace(/%3A/gi, ':'). replace(/%24/g, '$'). replace(/%2C/gi, ','). replace(/%3B/gi, ';'). replace(/%20/g, (pctEncodeSpaces ? '%20' : '+')); } var ngAttrPrefixes = ['ng-', 'data-ng-', 'ng:', 'x-ng-']; function getNgAttribute(element, ngAttr) { var attr, i, ii = ngAttrPrefixes.length; for (i = 0; i < ii; ++i) { attr = ngAttrPrefixes[i] + ngAttr; if (isString(attr = element.getAttribute(attr))) { return attr; } } return null; } /** * @ngdoc directive * @name ngApp * @module ng * * @element ANY * @param {angular.Module} ngApp an optional application * {@link angular.module module} name to load. * @param {boolean=} ngStrictDi if this attribute is present on the app element, the injector will be * created in "strict-di" mode. This means that the application will fail to invoke functions which * do not use explicit function annotation (and are thus unsuitable for minification), as described * in {@link guide/di the Dependency Injection guide}, and useful debugging info will assist in * tracking down the root of these bugs. * * @description * * Use this directive to **auto-bootstrap** an AngularJS application. The `ngApp` directive * designates the **root element** of the application and is typically placed near the root element * of the page - e.g. on the `` or `` tags. * * There are a few things to keep in mind when using `ngApp`: * - only one AngularJS application can be auto-bootstrapped per HTML document. The first `ngApp` * found in the document will be used to define the root element to auto-bootstrap as an * application. To run multiple applications in an HTML document you must manually bootstrap them using * {@link angular.bootstrap} instead. * - AngularJS applications cannot be nested within each other. * - Do not use a directive that uses {@link ng.$compile#transclusion transclusion} on the same element as `ngApp`. * This includes directives such as {@link ng.ngIf `ngIf`}, {@link ng.ngInclude `ngInclude`} and * {@link ngRoute.ngView `ngView`}. * Doing this misplaces the app {@link ng.$rootElement `$rootElement`} and the app's {@link auto.$injector injector}, * causing animations to stop working and making the injector inaccessible from outside the app. * * You can specify an **AngularJS module** to be used as the root module for the application. This * module will be loaded into the {@link auto.$injector} when the application is bootstrapped. It * should contain the application code needed or have dependencies on other modules that will * contain the code. See {@link angular.module} for more information. * * In the example below if the `ngApp` directive were not placed on the `html` element then the * document would not be compiled, the `AppController` would not be instantiated and the `{{ a+b }}` * would not be resolved to `3`. * * `ngApp` is the easiest, and most common way to bootstrap an application. *
I can add: {{a}} + {{b}} = {{ a+b }}
angular.module('ngAppDemo', []).controller('ngAppDemoController', function($scope) { $scope.a = 1; $scope.b = 2; });
* * Using `ngStrictDi`, you would see something like this: *
I can add: {{a}} + {{b}} = {{ a+b }}

This renders because the controller does not fail to instantiate, by using explicit annotation style (see script.js for details)

Name:
Hello, {{name}}!

This renders because the controller does not fail to instantiate, by using explicit annotation style (see script.js for details)

I can add: {{a}} + {{b}} = {{ a+b }}

The controller could not be instantiated, due to relying on automatic function annotations (which are disabled in strict mode). As such, the content of this section is not interpolated, and there should be an error in your web console.

angular.module('ngAppStrictDemo', []) // BadController will fail to instantiate, due to relying on automatic function annotation, // rather than an explicit annotation .controller('BadController', function($scope) { $scope.a = 1; $scope.b = 2; }) // Unlike BadController, GoodController1 and GoodController2 will not fail to be instantiated, // due to using explicit annotations using the array style and $inject property, respectively. .controller('GoodController1', ['$scope', function($scope) { $scope.a = 1; $scope.b = 2; }]) .controller('GoodController2', GoodController2); function GoodController2($scope) { $scope.name = "World"; } GoodController2.$inject = ['$scope']; div[ng-controller] { margin-bottom: 1em; -webkit-border-radius: 4px; border-radius: 4px; border: 1px solid; padding: .5em; } div[ng-controller^=Good] { border-color: #d6e9c6; background-color: #dff0d8; color: #3c763d; } div[ng-controller^=Bad] { border-color: #ebccd1; background-color: #f2dede; color: #a94442; margin-bottom: 0; }
*/ function angularInit(element, bootstrap) { var appElement, module, config = {}; // The element `element` has priority over any other element. forEach(ngAttrPrefixes, function(prefix) { var name = prefix + 'app'; if (!appElement && element.hasAttribute && element.hasAttribute(name)) { appElement = element; module = element.getAttribute(name); } }); forEach(ngAttrPrefixes, function(prefix) { var name = prefix + 'app'; var candidate; if (!appElement && (candidate = element.querySelector('[' + name.replace(':', '\\:') + ']'))) { appElement = candidate; module = candidate.getAttribute(name); } }); if (appElement) { config.strictDi = getNgAttribute(appElement, "strict-di") !== null; bootstrap(appElement, module ? [module] : [], config); } } /** * @ngdoc function * @name angular.bootstrap * @module ng * @description * Use this function to manually start up angular application. * * For more information, see the {@link guide/bootstrap Bootstrap guide}. * * Angular will detect if it has been loaded into the browser more than once and only allow the * first loaded script to be bootstrapped and will report a warning to the browser console for * each of the subsequent scripts. This prevents strange results in applications, where otherwise * multiple instances of Angular try to work on the DOM. * *
* **Note:** Protractor based end-to-end tests cannot use this function to bootstrap manually. * They must use {@link ng.directive:ngApp ngApp}. *
* *
* **Note:** Do not bootstrap the app on an element with a directive that uses {@link ng.$compile#transclusion transclusion}, * such as {@link ng.ngIf `ngIf`}, {@link ng.ngInclude `ngInclude`} and {@link ngRoute.ngView `ngView`}. * Doing this misplaces the app {@link ng.$rootElement `$rootElement`} and the app's {@link auto.$injector injector}, * causing animations to stop working and making the injector inaccessible from outside the app. *
* * ```html * * * *
* {{greeting}} *
* * * * * * ``` * * @param {DOMElement} element DOM element which is the root of angular application. * @param {Array=} modules an array of modules to load into the application. * Each item in the array should be the name of a predefined module or a (DI annotated) * function that will be invoked by the injector as a `config` block. * See: {@link angular.module modules} * @param {Object=} config an object for defining configuration options for the application. The * following keys are supported: * * * `strictDi` - disable automatic function annotation for the application. This is meant to * assist in finding bugs which break minified code. Defaults to `false`. * * @returns {auto.$injector} Returns the newly created injector for this app. */ function bootstrap(element, modules, config) { if (!isObject(config)) config = {}; var defaultConfig = { strictDi: false }; config = extend(defaultConfig, config); var doBootstrap = function() { element = jqLite(element); if (element.injector()) { var tag = (element[0] === window.document) ? 'document' : startingTag(element); // Encode angle brackets to prevent input from being sanitized to empty string #8683. throw ngMinErr( 'btstrpd', "App already bootstrapped with this element '{0}'", tag.replace(//,'>')); } modules = modules || []; modules.unshift(['$provide', function($provide) { $provide.value('$rootElement', element); }]); if (config.debugInfoEnabled) { // Pushing so that this overrides `debugInfoEnabled` setting defined in user's `modules`. modules.push(['$compileProvider', function($compileProvider) { $compileProvider.debugInfoEnabled(true); }]); } modules.unshift('ng'); var injector = createInjector(modules, config.strictDi); injector.invoke(['$rootScope', '$rootElement', '$compile', '$injector', function bootstrapApply(scope, element, compile, injector) { scope.$apply(function() { element.data('$injector', injector); compile(element)(scope); }); }] ); return injector; }; var NG_ENABLE_DEBUG_INFO = /^NG_ENABLE_DEBUG_INFO!/; var NG_DEFER_BOOTSTRAP = /^NG_DEFER_BOOTSTRAP!/; if (window && NG_ENABLE_DEBUG_INFO.test(window.name)) { config.debugInfoEnabled = true; window.name = window.name.replace(NG_ENABLE_DEBUG_INFO, ''); } if (window && !NG_DEFER_BOOTSTRAP.test(window.name)) { return doBootstrap(); } window.name = window.name.replace(NG_DEFER_BOOTSTRAP, ''); angular.resumeBootstrap = function(extraModules) { forEach(extraModules, function(module) { modules.push(module); }); return doBootstrap(); }; if (isFunction(angular.resumeDeferredBootstrap)) { angular.resumeDeferredBootstrap(); } } /** * @ngdoc function * @name angular.reloadWithDebugInfo * @module ng * @description * Use this function to reload the current application with debug information turned on. * This takes precedence over a call to `$compileProvider.debugInfoEnabled(false)`. * * See {@link ng.$compileProvider#debugInfoEnabled} for more. */ function reloadWithDebugInfo() { window.name = 'NG_ENABLE_DEBUG_INFO!' + window.name; window.location.reload(); } /** * @name angular.getTestability * @module ng * @description * Get the testability service for the instance of Angular on the given * element. * @param {DOMElement} element DOM element which is the root of angular application. */ function getTestability(rootElement) { var injector = angular.element(rootElement).injector(); if (!injector) { throw ngMinErr('test', 'no injector found for element argument to getTestability'); } return injector.get('$$testability'); } var SNAKE_CASE_REGEXP = /[A-Z]/g; function snake_case(name, separator) { separator = separator || '_'; return name.replace(SNAKE_CASE_REGEXP, function(letter, pos) { return (pos ? separator : '') + letter.toLowerCase(); }); } var bindJQueryFired = false; function bindJQuery() { var originalCleanData; if (bindJQueryFired) { return; } // bind to jQuery if present; var jqName = jq(); jQuery = isUndefined(jqName) ? window.jQuery : // use jQuery (if present) !jqName ? undefined : // use jqLite window[jqName]; // use jQuery specified by `ngJq` // Use jQuery if it exists with proper functionality, otherwise default to us. // Angular 1.2+ requires jQuery 1.7+ for on()/off() support. // Angular 1.3+ technically requires at least jQuery 2.1+ but it may work with older // versions. It will not work for sure with jQuery <1.7, though. if (jQuery && jQuery.fn.on) { jqLite = jQuery; extend(jQuery.fn, { scope: JQLitePrototype.scope, isolateScope: JQLitePrototype.isolateScope, controller: JQLitePrototype.controller, injector: JQLitePrototype.injector, inheritedData: JQLitePrototype.inheritedData }); // All nodes removed from the DOM via various jQuery APIs like .remove() // are passed through jQuery.cleanData. Monkey-patch this method to fire // the $destroy event on all removed nodes. originalCleanData = jQuery.cleanData; jQuery.cleanData = function(elems) { var events; for (var i = 0, elem; (elem = elems[i]) != null; i++) { events = jQuery._data(elem, "events"); if (events && events.$destroy) { jQuery(elem).triggerHandler('$destroy'); } } originalCleanData(elems); }; } else { jqLite = JQLite; } angular.element = jqLite; // Prevent double-proxying. bindJQueryFired = true; } /** * throw error if the argument is falsy. */ function assertArg(arg, name, reason) { if (!arg) { throw ngMinErr('areq', "Argument '{0}' is {1}", (name || '?'), (reason || "required")); } return arg; } function assertArgFn(arg, name, acceptArrayAnnotation) { if (acceptArrayAnnotation && isArray(arg)) { arg = arg[arg.length - 1]; } assertArg(isFunction(arg), name, 'not a function, got ' + (arg && typeof arg === 'object' ? arg.constructor.name || 'Object' : typeof arg)); return arg; } /** * throw error if the name given is hasOwnProperty * @param {String} name the name to test * @param {String} context the context in which the name is used, such as module or directive */ function assertNotHasOwnProperty(name, context) { if (name === 'hasOwnProperty') { throw ngMinErr('badname', "hasOwnProperty is not a valid {0} name", context); } } /** * Return the value accessible from the object by path. Any undefined traversals are ignored * @param {Object} obj starting object * @param {String} path path to traverse * @param {boolean} [bindFnToScope=true] * @returns {Object} value as accessible by path */ //TODO(user): this function needs to be removed function getter(obj, path, bindFnToScope) { if (!path) return obj; var keys = path.split('.'); var key; var lastInstance = obj; var len = keys.length; for (var i = 0; i < len; i++) { key = keys[i]; if (obj) { obj = (lastInstance = obj)[key]; } } if (!bindFnToScope && isFunction(obj)) { return bind(lastInstance, obj); } return obj; } /** * Return the DOM siblings between the first and last node in the given array. * @param {Array} array like object * @returns {Array} the inputted object or a jqLite collection containing the nodes */ function getBlockNodes(nodes) { // TODO(user): update `nodes` instead of creating a new object? var node = nodes[0]; var endNode = nodes[nodes.length - 1]; var blockNodes; for (var i = 1; node !== endNode && (node = node.nextSibling); i++) { if (blockNodes || nodes[i] !== node) { if (!blockNodes) { blockNodes = jqLite(slice.call(nodes, 0, i)); } blockNodes.push(node); } } return blockNodes || nodes; } /** * Creates a new object without a prototype. This object is useful for lookup without having to * guard against prototypically inherited properties via hasOwnProperty. * * Related micro-benchmarks: * - http://jsperf.com/object-create2 * - http://jsperf.com/proto-map-lookup/2 * - http://jsperf.com/for-in-vs-object-keys2 * * @returns {Object} */ function createMap() { return Object.create(null); } var NODE_TYPE_ELEMENT = 1; var NODE_TYPE_ATTRIBUTE = 2; var NODE_TYPE_TEXT = 3; var NODE_TYPE_COMMENT = 8; var NODE_TYPE_DOCUMENT = 9; var NODE_TYPE_DOCUMENT_FRAGMENT = 11; /** * @ngdoc type * @name angular.Module * @module ng * @description * * Interface for configuring angular {@link angular.module modules}. */ function setupModuleLoader(window) { var $injectorMinErr = minErr('$injector'); var ngMinErr = minErr('ng'); function ensure(obj, name, factory) { return obj[name] || (obj[name] = factory()); } var angular = ensure(window, 'angular', Object); // We need to expose `angular.$$minErr` to modules such as `ngResource` that reference it during bootstrap angular.$$minErr = angular.$$minErr || minErr; return ensure(angular, 'module', function() { /** @type {Object.} */ var modules = {}; /** * @ngdoc function * @name angular.module * @module ng * @description * * The `angular.module` is a global place for creating, registering and retrieving Angular * modules. * All modules (angular core or 3rd party) that should be available to an application must be * registered using this mechanism. * * Passing one argument retrieves an existing {@link angular.Module}, * whereas passing more than one argument creates a new {@link angular.Module} * * * # Module * * A module is a collection of services, directives, controllers, filters, and configuration information. * `angular.module` is used to configure the {@link auto.$injector $injector}. * * ```js * // Create a new module * var myModule = angular.module('myModule', []); * * // register a new service * myModule.value('appName', 'MyCoolApp'); * * // configure existing services inside initialization blocks. * myModule.config(['$locationProvider', function($locationProvider) { * // Configure existing providers * $locationProvider.hashPrefix('!'); * }]); * ``` * * Then you can create an injector and load your modules like this: * * ```js * var injector = angular.injector(['ng', 'myModule']) * ``` * * However it's more likely that you'll just use * {@link ng.directive:ngApp ngApp} or * {@link angular.bootstrap} to simplify this process for you. * * @param {!string} name The name of the module to create or retrieve. * @param {!Array.=} requires If specified then new module is being created. If * unspecified then the module is being retrieved for further configuration. * @param {Function=} configFn Optional configuration function for the module. Same as * {@link angular.Module#config Module#config()}. * @returns {angular.Module} new module with the {@link angular.Module} api. */ return function module(name, requires, configFn) { var assertNotHasOwnProperty = function(name, context) { if (name === 'hasOwnProperty') { throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context); } }; assertNotHasOwnProperty(name, 'module'); if (requires && modules.hasOwnProperty(name)) { modules[name] = null; } return ensure(modules, name, function() { if (!requires) { throw $injectorMinErr('nomod', "Module '{0}' is not available! You either misspelled " + "the module name or forgot to load it. If registering a module ensure that you " + "specify the dependencies as the second argument.", name); } /** @type {!Array.>} */ var invokeQueue = []; /** @type {!Array.} */ var configBlocks = []; /** @type {!Array.} */ var runBlocks = []; var config = invokeLater('$injector', 'invoke', 'push', configBlocks); /** @type {angular.Module} */ var moduleInstance = { // Private state _invokeQueue: invokeQueue, _configBlocks: configBlocks, _runBlocks: runBlocks, /** * @ngdoc property * @name angular.Module#requires * @module ng * * @description * Holds the list of modules which the injector will load before the current module is * loaded. */ requires: requires, /** * @ngdoc property * @name angular.Module#name * @module ng * * @description * Name of the module. */ name: name, /** * @ngdoc method * @name angular.Module#provider * @module ng * @param {string} name service name * @param {Function} providerType Construction function for creating new instance of the * service. * @description * See {@link auto.$provide#provider $provide.provider()}. */ provider: invokeLaterAndSetModuleName('$provide', 'provider'), /** * @ngdoc method * @name angular.Module#factory * @module ng * @param {string} name service name * @param {Function} providerFunction Function for creating new instance of the service. * @description * See {@link auto.$provide#factory $provide.factory()}. */ factory: invokeLaterAndSetModuleName('$provide', 'factory'), /** * @ngdoc method * @name angular.Module#service * @module ng * @param {string} name service name * @param {Function} constructor A constructor function that will be instantiated. * @description * See {@link auto.$provide#service $provide.service()}. */ service: invokeLaterAndSetModuleName('$provide', 'service'), /** * @ngdoc method * @name angular.Module#value * @module ng * @param {string} name service name * @param {*} object Service instance object. * @description * See {@link auto.$provide#value $provide.value()}. */ value: invokeLater('$provide', 'value'), /** * @ngdoc method * @name angular.Module#constant * @module ng * @param {string} name constant name * @param {*} object Constant value. * @description * Because the constants are fixed, they get applied before other provide methods. * See {@link auto.$provide#constant $provide.constant()}. */ constant: invokeLater('$provide', 'constant', 'unshift'), /** * @ngdoc method * @name angular.Module#decorator * @module ng * @param {string} name The name of the service to decorate. * @param {Function} decorFn This function will be invoked when the service needs to be * instantiated and should return the decorated service instance. * @description * See {@link auto.$provide#decorator $provide.decorator()}. */ decorator: invokeLaterAndSetModuleName('$provide', 'decorator'), /** * @ngdoc method * @name angular.Module#animation * @module ng * @param {string} name animation name * @param {Function} animationFactory Factory function for creating new instance of an * animation. * @description * * **NOTE**: animations take effect only if the **ngAnimate** module is loaded. * * * Defines an animation hook that can be later used with * {@link $animate $animate} service and directives that use this service. * * ```js * module.animation('.animation-name', function($inject1, $inject2) { * return { * eventName : function(element, done) { * //code to run the animation * //once complete, then run done() * return function cancellationFunction(element) { * //code to cancel the animation * } * } * } * }) * ``` * * See {@link ng.$animateProvider#register $animateProvider.register()} and * {@link ngAnimate ngAnimate module} for more information. */ animation: invokeLaterAndSetModuleName('$animateProvider', 'register'), /** * @ngdoc method * @name angular.Module#filter * @module ng * @param {string} name Filter name - this must be a valid angular expression identifier * @param {Function} filterFactory Factory function for creating new instance of filter. * @description * See {@link ng.$filterProvider#register $filterProvider.register()}. * *
* **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`. * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores * (`myapp_subsection_filterx`). *
*/ filter: invokeLaterAndSetModuleName('$filterProvider', 'register'), /** * @ngdoc method * @name angular.Module#controller * @module ng * @param {string|Object} name Controller name, or an object map of controllers where the * keys are the names and the values are the constructors. * @param {Function} constructor Controller constructor function. * @description * See {@link ng.$controllerProvider#register $controllerProvider.register()}. */ controller: invokeLaterAndSetModuleName('$controllerProvider', 'register'), /** * @ngdoc method * @name angular.Module#directive * @module ng * @param {string|Object} name Directive name, or an object map of directives where the * keys are the names and the values are the factories. * @param {Function} directiveFactory Factory function for creating new instance of * directives. * @description * See {@link ng.$compileProvider#directive $compileProvider.directive()}. */ directive: invokeLaterAndSetModuleName('$compileProvider', 'directive'), /** * @ngdoc method * @name angular.Module#component * @module ng * @param {string} name Name of the component in camel-case (i.e. myComp which will match as my-comp) * @param {Object} options Component definition object (a simplified * {@link ng.$compile#directive-definition-object directive definition object}) * * @description * See {@link ng.$compileProvider#component $compileProvider.component()}. */ component: invokeLaterAndSetModuleName('$compileProvider', 'component'), /** * @ngdoc method * @name angular.Module#config * @module ng * @param {Function} configFn Execute this function on module load. Useful for service * configuration. * @description * Use this method to register work which needs to be performed on module loading. * For more about how to configure services, see * {@link providers#provider-recipe Provider Recipe}. */ config: config, /** * @ngdoc method * @name angular.Module#run * @module ng * @param {Function} initializationFn Execute this function after injector creation. * Useful for application initialization. * @description * Use this method to register work which should be performed when the injector is done * loading all modules. */ run: function(block) { runBlocks.push(block); return this; } }; if (configFn) { config(configFn); } return moduleInstance; /** * @param {string} provider * @param {string} method * @param {String=} insertMethod * @returns {angular.Module} */ function invokeLater(provider, method, insertMethod, queue) { if (!queue) queue = invokeQueue; return function() { queue[insertMethod || 'push']([provider, method, arguments]); return moduleInstance; }; } /** * @param {string} provider * @param {string} method * @returns {angular.Module} */ function invokeLaterAndSetModuleName(provider, method) { return function(recipeName, factoryFunction) { if (factoryFunction && isFunction(factoryFunction)) factoryFunction.$$moduleName = name; invokeQueue.push([provider, method, arguments]); return moduleInstance; }; } }); }; }); } /* global shallowCopy: true */ /** * Creates a shallow copy of an object, an array or a primitive. * * Assumes that there are no proto properties for objects. */ function shallowCopy(src, dst) { if (isArray(src)) { dst = dst || []; for (var i = 0, ii = src.length; i < ii; i++) { dst[i] = src[i]; } } else if (isObject(src)) { dst = dst || {}; for (var key in src) { if (!(key.charAt(0) === '$' && key.charAt(1) === '$')) { dst[key] = src[key]; } } } return dst || src; } /* global toDebugString: true */ function serializeObject(obj) { var seen = []; return JSON.stringify(obj, function(key, val) { val = toJsonReplacer(key, val); if (isObject(val)) { if (seen.indexOf(val) >= 0) return '...'; seen.push(val); } return val; }); } function toDebugString(obj) { if (typeof obj === 'function') { return obj.toString().replace(/ \{[\s\S]*$/, ''); } else if (isUndefined(obj)) { return 'undefined'; } else if (typeof obj !== 'string') { return serializeObject(obj); } return obj; } /* global angularModule: true, version: true, $CompileProvider, htmlAnchorDirective, inputDirective, inputDirective, formDirective, scriptDirective, selectDirective, styleDirective, optionDirective, ngBindDirective, ngBindHtmlDirective, ngBindTemplateDirective, ngClassDirective, ngClassEvenDirective, ngClassOddDirective, ngCloakDirective, ngControllerDirective, ngFormDirective, ngHideDirective, ngIfDirective, ngIncludeDirective, ngIncludeFillContentDirective, ngInitDirective, ngNonBindableDirective, ngPluralizeDirective, ngRepeatDirective, ngShowDirective, ngStyleDirective, ngSwitchDirective, ngSwitchWhenDirective, ngSwitchDefaultDirective, ngOptionsDirective, ngTranscludeDirective, ngModelDirective, ngListDirective, ngChangeDirective, patternDirective, patternDirective, requiredDirective, requiredDirective, minlengthDirective, minlengthDirective, maxlengthDirective, maxlengthDirective, ngValueDirective, ngModelOptionsDirective, ngAttributeAliasDirectives, ngEventDirectives, $AnchorScrollProvider, $AnimateProvider, $CoreAnimateCssProvider, $$CoreAnimateJsProvider, $$CoreAnimateQueueProvider, $$AnimateRunnerFactoryProvider, $$AnimateAsyncRunFactoryProvider, $BrowserProvider, $CacheFactoryProvider, $ControllerProvider, $DateProvider, $DocumentProvider, $ExceptionHandlerProvider, $FilterProvider, $$ForceReflowProvider, $InterpolateProvider, $IntervalProvider, $$HashMapProvider, $HttpProvider, $HttpParamSerializerProvider, $HttpParamSerializerJQLikeProvider, $HttpBackendProvider, $xhrFactoryProvider, $LocationProvider, $LogProvider, $ParseProvider, $RootScopeProvider, $QProvider, $$QProvider, $$SanitizeUriProvider, $SceProvider, $SceDelegateProvider, $SnifferProvider, $TemplateCacheProvider, $TemplateRequestProvider, $$TestabilityProvider, $TimeoutProvider, $$RAFProvider, $WindowProvider, $$jqLiteProvider, $$CookieReaderProvider */ /** * @ngdoc object * @name angular.version * @module ng * @description * An object that contains information about the current AngularJS version. * * This object has the following properties: * * - `full` – `{string}` – Full version string, such as "0.9.18". * - `major` – `{number}` – Major version number, such as "0". * - `minor` – `{number}` – Minor version number, such as "9". * - `dot` – `{number}` – Dot version number, such as "18". * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat". */ var version = { full: '1.5.7-local+sha.cfbe1a7', // all of these placeholder strings will be replaced by grunt's major: 1, // package task minor: 5, dot: undefined, codeName: 'undefined' }; function publishExternalAPI(angular) { extend(angular, { 'bootstrap': bootstrap, 'copy': copy, 'extend': extend, 'merge': merge, 'equals': equals, 'element': jqLite, 'forEach': forEach, 'injector': createInjector, 'noop': noop, 'bind': bind, 'toJson': toJson, 'fromJson': fromJson, 'identity': identity, 'isUndefined': isUndefined, 'isDefined': isDefined, 'isString': isString, 'isFunction': isFunction, 'isObject': isObject, 'isNumber': isNumber, 'isElement': isElement, 'isArray': isArray, 'version': version, 'isDate': isDate, 'lowercase': lowercase, 'uppercase': uppercase, 'callbacks': {counter: 0}, 'getTestability': getTestability, '$$minErr': minErr, '$$csp': csp, 'reloadWithDebugInfo': reloadWithDebugInfo }); angularModule = setupModuleLoader(window); angularModule('ng', ['ngLocale'], ['$provide', function ngModule($provide) { // $$sanitizeUriProvider needs to be before $compileProvider as it is used by it. $provide.provider({ $$sanitizeUri: $$SanitizeUriProvider }); $provide.provider('$compile', $CompileProvider). directive({ a: htmlAnchorDirective, input: inputDirective, textarea: inputDirective, form: formDirective, script: scriptDirective, select: selectDirective, style: styleDirective, option: optionDirective, ngBind: ngBindDirective, ngBindHtml: ngBindHtmlDirective, ngBindTemplate: ngBindTemplateDirective, ngClass: ngClassDirective, ngClassEven: ngClassEvenDirective, ngClassOdd: ngClassOddDirective, ngCloak: ngCloakDirective, ngController: ngControllerDirective, ngForm: ngFormDirective, ngHide: ngHideDirective, ngIf: ngIfDirective, ngInclude: ngIncludeDirective, ngInit: ngInitDirective, ngNonBindable: ngNonBindableDirective, ngPluralize: ngPluralizeDirective, ngRepeat: ngRepeatDirective, ngShow: ngShowDirective, ngStyle: ngStyleDirective, ngSwitch: ngSwitchDirective, ngSwitchWhen: ngSwitchWhenDirective, ngSwitchDefault: ngSwitchDefaultDirective, ngOptions: ngOptionsDirective, ngTransclude: ngTranscludeDirective, ngModel: ngModelDirective, ngList: ngListDirective, ngChange: ngChangeDirective, pattern: patternDirective, ngPattern: patternDirective, required: requiredDirective, ngRequired: requiredDirective, minlength: minlengthDirective, ngMinlength: minlengthDirective, maxlength: maxlengthDirective, ngMaxlength: maxlengthDirective, ngValue: ngValueDirective, ngModelOptions: ngModelOptionsDirective }). directive({ ngInclude: ngIncludeFillContentDirective }). directive(ngAttributeAliasDirectives). directive(ngEventDirectives); $provide.provider({ $anchorScroll: $AnchorScrollProvider, $animate: $AnimateProvider, $animateCss: $CoreAnimateCssProvider, $$animateJs: $$CoreAnimateJsProvider, $$animateQueue: $$CoreAnimateQueueProvider, $$AnimateRunner: $$AnimateRunnerFactoryProvider, $$animateAsyncRun: $$AnimateAsyncRunFactoryProvider, $browser: $BrowserProvider, $cacheFactory: $CacheFactoryProvider, $controller: $ControllerProvider, $document: $DocumentProvider, $exceptionHandler: $ExceptionHandlerProvider, $filter: $FilterProvider, $$forceReflow: $$ForceReflowProvider, $interpolate: $InterpolateProvider, $interval: $IntervalProvider, $http: $HttpProvider, $httpParamSerializer: $HttpParamSerializerProvider, $httpParamSerializerJQLike: $HttpParamSerializerJQLikeProvider, $httpBackend: $HttpBackendProvider, $xhrFactory: $xhrFactoryProvider, $location: $LocationProvider, $log: $LogProvider, $parse: $ParseProvider, $rootScope: $RootScopeProvider, $q: $QProvider, $$q: $$QProvider, $sce: $SceProvider, $sceDelegate: $SceDelegateProvider, $sniffer: $SnifferProvider, $templateCache: $TemplateCacheProvider, $templateRequest: $TemplateRequestProvider, $$testability: $$TestabilityProvider, $timeout: $TimeoutProvider, $window: $WindowProvider, $$rAF: $$RAFProvider, $$jqLite: $$jqLiteProvider, $$HashMap: $$HashMapProvider, $$cookieReader: $$CookieReaderProvider }); } ]); } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Any commits to this file should be reviewed with security in mind. * * Changes to this file can potentially create security vulnerabilities. * * An approval from 2 Core members with history of modifying * * this file is required. * * * * Does the change somehow allow for arbitrary javascript to be executed? * * Or allows for someone to change the prototype of built-in objects? * * Or gives undesired access to variables likes document or window? * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* global JQLitePrototype: true, addEventListenerFn: true, removeEventListenerFn: true, BOOLEAN_ATTR: true, ALIASED_ATTR: true, */ ////////////////////////////////// //JQLite ////////////////////////////////// /** * @ngdoc function * @name angular.element * @module ng * @kind function * * @description * Wraps a raw DOM element or HTML string as a [jQuery](http://jquery.com) element. * * If jQuery is available, `angular.element` is an alias for the * [jQuery](http://api.jquery.com/jQuery/) function. If jQuery is not available, `angular.element` * delegates to Angular's built-in subset of jQuery, called "jQuery lite" or **jqLite**. * * jqLite is a tiny, API-compatible subset of jQuery that allows * Angular to manipulate the DOM in a cross-browser compatible way. jqLite implements only the most * commonly needed functionality with the goal of having a very small footprint. * * To use `jQuery`, simply ensure it is loaded before the `angular.js` file. You can also use the * {@link ngJq `ngJq`} directive to specify that jqlite should be used over jQuery, or to use a * specific version of jQuery if multiple versions exist on the page. * *
**Note:** All element references in Angular are always wrapped with jQuery or * jqLite (such as the element argument in a directive's compile / link function). They are never raw DOM references.
* *
**Note:** Keep in mind that this function will not find elements * by tag name / CSS selector. For lookups by tag name, try instead `angular.element(document).find(...)` * or `$document.find()`, or use the standard DOM APIs, e.g. `document.querySelectorAll()`.
* * ## Angular's jqLite * jqLite provides only the following jQuery methods: * * - [`addClass()`](http://api.jquery.com/addClass/) - Does not support a function as first argument * - [`after()`](http://api.jquery.com/after/) * - [`append()`](http://api.jquery.com/append/) * - [`attr()`](http://api.jquery.com/attr/) - Does not support functions as parameters * - [`bind()`](http://api.jquery.com/bind/) - Does not support namespaces, selectors or eventData * - [`children()`](http://api.jquery.com/children/) - Does not support selectors * - [`clone()`](http://api.jquery.com/clone/) * - [`contents()`](http://api.jquery.com/contents/) * - [`css()`](http://api.jquery.com/css/) - Only retrieves inline-styles, does not call `getComputedStyle()`. * As a setter, does not convert numbers to strings or append 'px', and also does not have automatic property prefixing. * - [`data()`](http://api.jquery.com/data/) * - [`detach()`](http://api.jquery.com/detach/) * - [`empty()`](http://api.jquery.com/empty/) * - [`eq()`](http://api.jquery.com/eq/) * - [`find()`](http://api.jquery.com/find/) - Limited to lookups by tag name * - [`hasClass()`](http://api.jquery.com/hasClass/) * - [`html()`](http://api.jquery.com/html/) * - [`next()`](http://api.jquery.com/next/) - Does not support selectors * - [`on()`](http://api.jquery.com/on/) - Does not support namespaces, selectors or eventData * - [`off()`](http://api.jquery.com/off/) - Does not support namespaces, selectors or event object as parameter * - [`one()`](http://api.jquery.com/one/) - Does not support namespaces or selectors * - [`parent()`](http://api.jquery.com/parent/) - Does not support selectors * - [`prepend()`](http://api.jquery.com/prepend/) * - [`prop()`](http://api.jquery.com/prop/) * - [`ready()`](http://api.jquery.com/ready/) * - [`remove()`](http://api.jquery.com/remove/) * - [`removeAttr()`](http://api.jquery.com/removeAttr/) * - [`removeClass()`](http://api.jquery.com/removeClass/) - Does not support a function as first argument * - [`removeData()`](http://api.jquery.com/removeData/) * - [`replaceWith()`](http://api.jquery.com/replaceWith/) * - [`text()`](http://api.jquery.com/text/) * - [`toggleClass()`](http://api.jquery.com/toggleClass/) - Does not support a function as first argument * - [`triggerHandler()`](http://api.jquery.com/triggerHandler/) - Passes a dummy event object to handlers * - [`unbind()`](http://api.jquery.com/unbind/) - Does not support namespaces or event object as parameter * - [`val()`](http://api.jquery.com/val/) * - [`wrap()`](http://api.jquery.com/wrap/) * * ## jQuery/jqLite Extras * Angular also provides the following additional methods and events to both jQuery and jqLite: * * ### Events * - `$destroy` - AngularJS intercepts all jqLite/jQuery's DOM destruction apis and fires this event * on all DOM nodes being removed. This can be used to clean up any 3rd party bindings to the DOM * element before it is removed. * * ### Methods * - `controller(name)` - retrieves the controller of the current element or its parent. By default * retrieves controller associated with the `ngController` directive. If `name` is provided as * camelCase directive name, then the controller for this directive will be retrieved (e.g. * `'ngModel'`). * - `injector()` - retrieves the injector of the current element or its parent. * - `scope()` - retrieves the {@link ng.$rootScope.Scope scope} of the current * element or its parent. Requires {@link guide/production#disabling-debug-data Debug Data} to * be enabled. * - `isolateScope()` - retrieves an isolate {@link ng.$rootScope.Scope scope} if one is attached directly to the * current element. This getter should be used only on elements that contain a directive which starts a new isolate * scope. Calling `scope()` on this element always returns the original non-isolate scope. * Requires {@link guide/production#disabling-debug-data Debug Data} to be enabled. * - `inheritedData()` - same as `data()`, but walks up the DOM until a value is found or the top * parent element is reached. * * @knownIssue You cannot spy on `angular.element` if you are using Jasmine version 1.x. See * https://github.com/angular/angular.js/issues/14251 for more information. * * @param {string|DOMElement} element HTML string or DOMElement to be wrapped into jQuery. * @returns {Object} jQuery object. */ JQLite.expando = 'ng339'; var jqCache = JQLite.cache = {}, jqId = 1, addEventListenerFn = function(element, type, fn) { element.addEventListener(type, fn, false); }, removeEventListenerFn = function(element, type, fn) { element.removeEventListener(type, fn, false); }; /* * !!! This is an undocumented "private" function !!! */ JQLite._data = function(node) { //jQuery always returns an object on cache miss return this.cache[node[this.expando]] || {}; }; function jqNextId() { return ++jqId; } var SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g; var MOZ_HACK_REGEXP = /^moz([A-Z])/; var MOUSE_EVENT_MAP= { mouseleave: "mouseout", mouseenter: "mouseover"}; var jqLiteMinErr = minErr('jqLite'); /** * Converts snake_case to camelCase. * Also there is special case for Moz prefix starting with upper case letter. * @param name Name to normalize */ function camelCase(name) { return name. replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) { return offset ? letter.toUpperCase() : letter; }). replace(MOZ_HACK_REGEXP, 'Moz$1'); } var SINGLE_TAG_REGEXP = /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/; var HTML_REGEXP = /<|&#?\w+;/; var TAG_NAME_REGEXP = /<([\w:-]+)/; var XHTML_TAG_REGEXP = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi; var wrapMap = { 'option': [1, ''], 'thead': [1, '', '
'], 'col': [2, '', '
'], 'tr': [2, '', '
'], 'td': [3, '', '
'], '_default': [0, "", ""] }; wrapMap.optgroup = wrapMap.option; wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; wrapMap.th = wrapMap.td; function jqLiteIsTextNode(html) { return !HTML_REGEXP.test(html); } function jqLiteAcceptsData(node) { // The window object can accept data but has no nodeType // Otherwise we are only interested in elements (1) and documents (9) var nodeType = node.nodeType; return nodeType === NODE_TYPE_ELEMENT || !nodeType || nodeType === NODE_TYPE_DOCUMENT; } function jqLiteHasData(node) { for (var key in jqCache[node.ng339]) { return true; } return false; } function jqLiteCleanData(nodes) { for (var i = 0, ii = nodes.length; i < ii; i++) { jqLiteRemoveData(nodes[i]); } } function jqLiteBuildFragment(html, context) { var tmp, tag, wrap, fragment = context.createDocumentFragment(), nodes = [], i; if (jqLiteIsTextNode(html)) { // Convert non-html into a text node nodes.push(context.createTextNode(html)); } else { // Convert html into DOM nodes tmp = tmp || fragment.appendChild(context.createElement("div")); tag = (TAG_NAME_REGEXP.exec(html) || ["", ""])[1].toLowerCase(); wrap = wrapMap[tag] || wrapMap._default; tmp.innerHTML = wrap[1] + html.replace(XHTML_TAG_REGEXP, "<$1>") + wrap[2]; // Descend through wrappers to the right content i = wrap[0]; while (i--) { tmp = tmp.lastChild; } nodes = concat(nodes, tmp.childNodes); tmp = fragment.firstChild; tmp.textContent = ""; } // Remove wrapper from fragment fragment.textContent = ""; fragment.innerHTML = ""; // Clear inner HTML forEach(nodes, function(node) { fragment.appendChild(node); }); return fragment; } function jqLiteParseHTML(html, context) { context = context || window.document; var parsed; if ((parsed = SINGLE_TAG_REGEXP.exec(html))) { return [context.createElement(parsed[1])]; } if ((parsed = jqLiteBuildFragment(html, context))) { return parsed.childNodes; } return []; } function jqLiteWrapNode(node, wrapper) { var parent = node.parentNode; if (parent) { parent.replaceChild(wrapper, node); } wrapper.appendChild(node); } // IE9-11 has no method "contains" in SVG element and in Node.prototype. Bug #10259. var jqLiteContains = window.Node.prototype.contains || function(arg) { // jshint bitwise: false return !!(this.compareDocumentPosition(arg) & 16); // jshint bitwise: true }; ///////////////////////////////////////////// function JQLite(element) { if (element instanceof JQLite) { return element; } var argIsString; if (isString(element)) { element = trim(element); argIsString = true; } if (!(this instanceof JQLite)) { if (argIsString && element.charAt(0) != '<') { throw jqLiteMinErr('nosel', 'Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element'); } return new JQLite(element); } if (argIsString) { jqLiteAddNodes(this, jqLiteParseHTML(element)); } else { jqLiteAddNodes(this, element); } } function jqLiteClone(element) { return element.cloneNode(true); } function jqLiteDealoc(element, onlyDescendants) { if (!onlyDescendants) jqLiteRemoveData(element); if (element.querySelectorAll) { var descendants = element.querySelectorAll('*'); for (var i = 0, l = descendants.length; i < l; i++) { jqLiteRemoveData(descendants[i]); } } } function jqLiteOff(element, type, fn, unsupported) { if (isDefined(unsupported)) throw jqLiteMinErr('offargs', 'jqLite#off() does not support the `selector` argument'); var expandoStore = jqLiteExpandoStore(element); var events = expandoStore && expandoStore.events; var handle = expandoStore && expandoStore.handle; if (!handle) return; //no listeners registered if (!type) { for (type in events) { if (type !== '$destroy') { removeEventListenerFn(element, type, handle); } delete events[type]; } } else { var removeHandler = function(type) { var listenerFns = events[type]; if (isDefined(fn)) { arrayRemove(listenerFns || [], fn); } if (!(isDefined(fn) && listenerFns && listenerFns.length > 0)) { removeEventListenerFn(element, type, handle); delete events[type]; } }; forEach(type.split(' '), function(type) { removeHandler(type); if (MOUSE_EVENT_MAP[type]) { removeHandler(MOUSE_EVENT_MAP[type]); } }); } } function jqLiteRemoveData(element, name) { var expandoId = element.ng339; var expandoStore = expandoId && jqCache[expandoId]; if (expandoStore) { if (name) { delete expandoStore.data[name]; return; } if (expandoStore.handle) { if (expandoStore.events.$destroy) { expandoStore.handle({}, '$destroy'); } jqLiteOff(element); } delete jqCache[expandoId]; element.ng339 = undefined; // don't delete DOM expandos. IE and Chrome don't like it } } function jqLiteExpandoStore(element, createIfNecessary) { var expandoId = element.ng339, expandoStore = expandoId && jqCache[expandoId]; if (createIfNecessary && !expandoStore) { element.ng339 = expandoId = jqNextId(); expandoStore = jqCache[expandoId] = {events: {}, data: {}, handle: undefined}; } return expandoStore; } function jqLiteData(element, key, value) { if (jqLiteAcceptsData(element)) { var isSimpleSetter = isDefined(value); var isSimpleGetter = !isSimpleSetter && key && !isObject(key); var massGetter = !key; var expandoStore = jqLiteExpandoStore(element, !isSimpleGetter); var data = expandoStore && expandoStore.data; if (isSimpleSetter) { // data('key', value) data[key] = value; } else { if (massGetter) { // data() return data; } else { if (isSimpleGetter) { // data('key') // don't force creation of expandoStore if it doesn't exist yet return data && data[key]; } else { // mass-setter: data({key1: val1, key2: val2}) extend(data, key); } } } } } function jqLiteHasClass(element, selector) { if (!element.getAttribute) return false; return ((" " + (element.getAttribute('class') || '') + " ").replace(/[\n\t]/g, " "). indexOf(" " + selector + " ") > -1); } function jqLiteRemoveClass(element, cssClasses) { if (cssClasses && element.setAttribute) { forEach(cssClasses.split(' '), function(cssClass) { element.setAttribute('class', trim( (" " + (element.getAttribute('class') || '') + " ") .replace(/[\n\t]/g, " ") .replace(" " + trim(cssClass) + " ", " ")) ); }); } } function jqLiteAddClass(element, cssClasses) { if (cssClasses && element.setAttribute) { var existingClasses = (' ' + (element.getAttribute('class') || '') + ' ') .replace(/[\n\t]/g, " "); forEach(cssClasses.split(' '), function(cssClass) { cssClass = trim(cssClass); if (existingClasses.indexOf(' ' + cssClass + ' ') === -1) { existingClasses += cssClass + ' '; } }); element.setAttribute('class', trim(existingClasses)); } } function jqLiteAddNodes(root, elements) { // THIS CODE IS VERY HOT. Don't make changes without benchmarking. if (elements) { // if a Node (the most common case) if (elements.nodeType) { root[root.length++] = elements; } else { var length = elements.length; // if an Array or NodeList and not a Window if (typeof length === 'number' && elements.window !== elements) { if (length) { for (var i = 0; i < length; i++) { root[root.length++] = elements[i]; } } } else { root[root.length++] = elements; } } } } function jqLiteController(element, name) { return jqLiteInheritedData(element, '$' + (name || 'ngController') + 'Controller'); } function jqLiteInheritedData(element, name, value) { // if element is the document object work with the html element instead // this makes $(document).scope() possible if (element.nodeType == NODE_TYPE_DOCUMENT) { element = element.documentElement; } var names = isArray(name) ? name : [name]; while (element) { for (var i = 0, ii = names.length; i < ii; i++) { if (isDefined(value = jqLite.data(element, names[i]))) return value; } // If dealing with a document fragment node with a host element, and no parent, use the host // element as the parent. This enables directives within a Shadow DOM or polyfilled Shadow DOM // to lookup parent controllers. element = element.parentNode || (element.nodeType === NODE_TYPE_DOCUMENT_FRAGMENT && element.host); } } function jqLiteEmpty(element) { jqLiteDealoc(element, true); while (element.firstChild) { element.removeChild(element.firstChild); } } function jqLiteRemove(element, keepData) { if (!keepData) jqLiteDealoc(element); var parent = element.parentNode; if (parent) parent.removeChild(element); } function jqLiteDocumentLoaded(action, win) { win = win || window; if (win.document.readyState === 'complete') { // Force the action to be run async for consistent behavior // from the action's point of view // i.e. it will definitely not be in a $apply win.setTimeout(action); } else { // No need to unbind this handler as load is only ever called once jqLite(win).on('load', action); } } ////////////////////////////////////////// // Functions which are declared directly. ////////////////////////////////////////// var JQLitePrototype = JQLite.prototype = { ready: function(fn) { var fired = false; function trigger() { if (fired) return; fired = true; fn(); } // check if document is already loaded if (window.document.readyState === 'complete') { window.setTimeout(trigger); } else { this.on('DOMContentLoaded', trigger); // works for modern browsers and IE9 // we can not use jqLite since we are not done loading and jQuery could be loaded later. // jshint -W064 JQLite(window).on('load', trigger); // fallback to window.onload for others // jshint +W064 } }, toString: function() { var value = []; forEach(this, function(e) { value.push('' + e);}); return '[' + value.join(', ') + ']'; }, eq: function(index) { return (index >= 0) ? jqLite(this[index]) : jqLite(this[this.length + index]); }, length: 0, push: push, sort: [].sort, splice: [].splice }; ////////////////////////////////////////// // Functions iterating getter/setters. // these functions return self on setter and // value on get. ////////////////////////////////////////// var BOOLEAN_ATTR = {}; forEach('multiple,selected,checked,disabled,readOnly,required,open'.split(','), function(value) { BOOLEAN_ATTR[lowercase(value)] = value; }); var BOOLEAN_ELEMENTS = {}; forEach('input,select,option,textarea,button,form,details'.split(','), function(value) { BOOLEAN_ELEMENTS[value] = true; }); var ALIASED_ATTR = { 'ngMinlength': 'minlength', 'ngMaxlength': 'maxlength', 'ngMin': 'min', 'ngMax': 'max', 'ngPattern': 'pattern' }; function getBooleanAttrName(element, name) { // check dom last since we will most likely fail on name var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()]; // booleanAttr is here twice to minimize DOM access return booleanAttr && BOOLEAN_ELEMENTS[nodeName_(element)] && booleanAttr; } function getAliasedAttrName(name) { return ALIASED_ATTR[name]; } forEach({ data: jqLiteData, removeData: jqLiteRemoveData, hasData: jqLiteHasData, cleanData: jqLiteCleanData }, function(fn, name) { JQLite[name] = fn; }); forEach({ data: jqLiteData, inheritedData: jqLiteInheritedData, scope: function(element) { // Can't use jqLiteData here directly so we stay compatible with jQuery! return jqLite.data(element, '$scope') || jqLiteInheritedData(element.parentNode || element, ['$isolateScope', '$scope']); }, isolateScope: function(element) { // Can't use jqLiteData here directly so we stay compatible with jQuery! return jqLite.data(element, '$isolateScope') || jqLite.data(element, '$isolateScopeNoTemplate'); }, controller: jqLiteController, injector: function(element) { return jqLiteInheritedData(element, '$injector'); }, removeAttr: function(element, name) { element.removeAttribute(name); }, hasClass: jqLiteHasClass, css: function(element, name, value) { name = camelCase(name); if (isDefined(value)) { element.style[name] = value; } else { return element.style[name]; } }, attr: function(element, name, value) { var nodeType = element.nodeType; if (nodeType === NODE_TYPE_TEXT || nodeType === NODE_TYPE_ATTRIBUTE || nodeType === NODE_TYPE_COMMENT) { return; } var lowercasedName = lowercase(name); if (BOOLEAN_ATTR[lowercasedName]) { if (isDefined(value)) { if (!!value) { element[name] = true; element.setAttribute(name, lowercasedName); } else { element[name] = false; element.removeAttribute(lowercasedName); } } else { return (element[name] || (element.attributes.getNamedItem(name) || noop).specified) ? lowercasedName : undefined; } } else if (isDefined(value)) { element.setAttribute(name, value); } else if (element.getAttribute) { // the extra argument "2" is to get the right thing for a.href in IE, see jQuery code // some elements (e.g. Document) don't have get attribute, so return undefined var ret = element.getAttribute(name, 2); // normalize non-existing attributes to undefined (as jQuery) return ret === null ? undefined : ret; } }, prop: function(element, name, value) { if (isDefined(value)) { element[name] = value; } else { return element[name]; } }, text: (function() { getText.$dv = ''; return getText; function getText(element, value) { if (isUndefined(value)) { var nodeType = element.nodeType; return (nodeType === NODE_TYPE_ELEMENT || nodeType === NODE_TYPE_TEXT) ? element.textContent : ''; } element.textContent = value; } })(), val: function(element, value) { if (isUndefined(value)) { if (element.multiple && nodeName_(element) === 'select') { var result = []; forEach(element.options, function(option) { if (option.selected) { result.push(option.value || option.text); } }); return result.length === 0 ? null : result; } return element.value; } element.value = value; }, html: function(element, value) { if (isUndefined(value)) { return element.innerHTML; } jqLiteDealoc(element, true); element.innerHTML = value; }, empty: jqLiteEmpty }, function(fn, name) { /** * Properties: writes return selection, reads return first value */ JQLite.prototype[name] = function(arg1, arg2) { var i, key; var nodeCount = this.length; // jqLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it // in a way that survives minification. // jqLiteEmpty takes no arguments but is a setter. if (fn !== jqLiteEmpty && (isUndefined((fn.length == 2 && (fn !== jqLiteHasClass && fn !== jqLiteController)) ? arg1 : arg2))) { if (isObject(arg1)) { // we are a write, but the object properties are the key/values for (i = 0; i < nodeCount; i++) { if (fn === jqLiteData) { // data() takes the whole object in jQuery fn(this[i], arg1); } else { for (key in arg1) { fn(this[i], key, arg1[key]); } } } // return self for chaining return this; } else { // we are a read, so read the first child. // TODO: do we still need this? var value = fn.$dv; // Only if we have $dv do we iterate over all, otherwise it is just the first element. var jj = (isUndefined(value)) ? Math.min(nodeCount, 1) : nodeCount; for (var j = 0; j < jj; j++) { var nodeValue = fn(this[j], arg1, arg2); value = value ? value + nodeValue : nodeValue; } return value; } } else { // we are a write, so apply to all children for (i = 0; i < nodeCount; i++) { fn(this[i], arg1, arg2); } // return self for chaining return this; } }; }); function createEventHandler(element, events) { var eventHandler = function(event, type) { // jQuery specific api event.isDefaultPrevented = function() { return event.defaultPrevented; }; var eventFns = events[type || event.type]; var eventFnsLength = eventFns ? eventFns.length : 0; if (!eventFnsLength) return; if (isUndefined(event.immediatePropagationStopped)) { var originalStopImmediatePropagation = event.stopImmediatePropagation; event.stopImmediatePropagation = function() { event.immediatePropagationStopped = true; if (event.stopPropagation) { event.stopPropagation(); } if (originalStopImmediatePropagation) { originalStopImmediatePropagation.call(event); } }; } event.isImmediatePropagationStopped = function() { return event.immediatePropagationStopped === true; }; // Some events have special handlers that wrap the real handler var handlerWrapper = eventFns.specialHandlerWrapper || defaultHandlerWrapper; // Copy event handlers in case event handlers array is modified during execution. if ((eventFnsLength > 1)) { eventFns = shallowCopy(eventFns); } for (var i = 0; i < eventFnsLength; i++) { if (!event.isImmediatePropagationStopped()) { handlerWrapper(element, event, eventFns[i]); } } }; // TODO: this is a hack for angularMocks/clearDataCache that makes it possible to deregister all // events on `element` eventHandler.elem = element; return eventHandler; } function defaultHandlerWrapper(element, event, handler) { handler.call(element, event); } function specialMouseHandlerWrapper(target, event, handler) { // Refer to jQuery's implementation of mouseenter & mouseleave // Read about mouseenter and mouseleave: // http://www.quirksmode.org/js/events_mouse.html#link8 var related = event.relatedTarget; // For mousenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window if (!related || (related !== target && !jqLiteContains.call(target, related))) { handler.call(target, event); } } ////////////////////////////////////////// // Functions iterating traversal. // These functions chain results into a single // selector. ////////////////////////////////////////// forEach({ removeData: jqLiteRemoveData, on: function jqLiteOn(element, type, fn, unsupported) { if (isDefined(unsupported)) throw jqLiteMinErr('onargs', 'jqLite#on() does not support the `selector` or `eventData` parameters'); // Do not add event handlers to non-elements because they will not be cleaned up. if (!jqLiteAcceptsData(element)) { return; } var expandoStore = jqLiteExpandoStore(element, true); var events = expandoStore.events; var handle = expandoStore.handle; if (!handle) { handle = expandoStore.handle = createEventHandler(element, events); } // http://jsperf.com/string-indexof-vs-split var types = type.indexOf(' ') >= 0 ? type.split(' ') : [type]; var i = types.length; var addHandler = function(type, specialHandlerWrapper, noEventListener) { var eventFns = events[type]; if (!eventFns) { eventFns = events[type] = []; eventFns.specialHandlerWrapper = specialHandlerWrapper; if (type !== '$destroy' && !noEventListener) { addEventListenerFn(element, type, handle); } } eventFns.push(fn); }; while (i--) { type = types[i]; if (MOUSE_EVENT_MAP[type]) { addHandler(MOUSE_EVENT_MAP[type], specialMouseHandlerWrapper); addHandler(type, undefined, true); } else { addHandler(type); } } }, off: jqLiteOff, one: function(element, type, fn) { element = jqLite(element); //add the listener twice so that when it is called //you can remove the original function and still be //able to call element.off(ev, fn) normally element.on(type, function onFn() { element.off(type, fn); element.off(type, onFn); }); element.on(type, fn); }, replaceWith: function(element, replaceNode) { var index, parent = element.parentNode; jqLiteDealoc(element); forEach(new JQLite(replaceNode), function(node) { if (index) { parent.insertBefore(node, index.nextSibling); } else { parent.replaceChild(node, element); } index = node; }); }, children: function(element) { var children = []; forEach(element.childNodes, function(element) { if (element.nodeType === NODE_TYPE_ELEMENT) { children.push(element); } }); return children; }, contents: function(element) { return element.contentDocument || element.childNodes || []; }, append: function(element, node) { var nodeType = element.nodeType; if (nodeType !== NODE_TYPE_ELEMENT && nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT) return; node = new JQLite(node); for (var i = 0, ii = node.length; i < ii; i++) { var child = node[i]; element.appendChild(child); } }, prepend: function(element, node) { if (element.nodeType === NODE_TYPE_ELEMENT) { var index = element.firstChild; forEach(new JQLite(node), function(child) { element.insertBefore(child, index); }); } }, wrap: function(element, wrapNode) { jqLiteWrapNode(element, jqLite(wrapNode).eq(0).clone()[0]); }, remove: jqLiteRemove, detach: function(element) { jqLiteRemove(element, true); }, after: function(element, newElement) { var index = element, parent = element.parentNode; newElement = new JQLite(newElement); for (var i = 0, ii = newElement.length; i < ii; i++) { var node = newElement[i]; parent.insertBefore(node, index.nextSibling); index = node; } }, addClass: jqLiteAddClass, removeClass: jqLiteRemoveClass, toggleClass: function(element, selector, condition) { if (selector) { forEach(selector.split(' '), function(className) { var classCondition = condition; if (isUndefined(classCondition)) { classCondition = !jqLiteHasClass(element, className); } (classCondition ? jqLiteAddClass : jqLiteRemoveClass)(element, className); }); } }, parent: function(element) { var parent = element.parentNode; return parent && parent.nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT ? parent : null; }, next: function(element) { return element.nextElementSibling; }, find: function(element, selector) { if (element.getElementsByTagName) { return element.getElementsByTagName(selector); } else { return []; } }, clone: jqLiteClone, triggerHandler: function(element, event, extraParameters) { var dummyEvent, eventFnsCopy, handlerArgs; var eventName = event.type || event; var expandoStore = jqLiteExpandoStore(element); var events = expandoStore && expandoStore.events; var eventFns = events && events[eventName]; if (eventFns) { // Create a dummy event to pass to the handlers dummyEvent = { preventDefault: function() { this.defaultPrevented = true; }, isDefaultPrevented: function() { return this.defaultPrevented === true; }, stopImmediatePropagation: function() { this.immediatePropagationStopped = true; }, isImmediatePropagationStopped: function() { return this.immediatePropagationStopped === true; }, stopPropagation: noop, type: eventName, target: element }; // If a custom event was provided then extend our dummy event with it if (event.type) { dummyEvent = extend(dummyEvent, event); } // Copy event handlers in case event handlers array is modified during execution. eventFnsCopy = shallowCopy(eventFns); handlerArgs = extraParameters ? [dummyEvent].concat(extraParameters) : [dummyEvent]; forEach(eventFnsCopy, function(fn) { if (!dummyEvent.isImmediatePropagationStopped()) { fn.apply(element, handlerArgs); } }); } } }, function(fn, name) { /** * chaining functions */ JQLite.prototype[name] = function(arg1, arg2, arg3) { var value; for (var i = 0, ii = this.length; i < ii; i++) { if (isUndefined(value)) { value = fn(this[i], arg1, arg2, arg3); if (isDefined(value)) { // any function which returns a value needs to be wrapped value = jqLite(value); } } else { jqLiteAddNodes(value, fn(this[i], arg1, arg2, arg3)); } } return isDefined(value) ? value : this; }; // bind legacy bind/unbind to on/off JQLite.prototype.bind = JQLite.prototype.on; JQLite.prototype.unbind = JQLite.prototype.off; }); // Provider for private $$jqLite service function $$jqLiteProvider() { this.$get = function $$jqLite() { return extend(JQLite, { hasClass: function(node, classes) { if (node.attr) node = node[0]; return jqLiteHasClass(node, classes); }, addClass: function(node, classes) { if (node.attr) node = node[0]; return jqLiteAddClass(node, classes); }, removeClass: function(node, classes) { if (node.attr) node = node[0]; return jqLiteRemoveClass(node, classes); } }); }; } /** * Computes a hash of an 'obj'. * Hash of a: * string is string * number is number as string * object is either result of calling $$hashKey function on the object or uniquely generated id, * that is also assigned to the $$hashKey property of the object. * * @param obj * @returns {string} hash string such that the same input will have the same hash string. * The resulting string key is in 'type:hashKey' format. */ function hashKey(obj, nextUidFn) { var key = obj && obj.$$hashKey; if (key) { if (typeof key === 'function') { key = obj.$$hashKey(); } return key; } var objType = typeof obj; if (objType == 'function' || (objType == 'object' && obj !== null)) { key = obj.$$hashKey = objType + ':' + (nextUidFn || nextUid)(); } else { key = objType + ':' + obj; } return key; } /** * HashMap which can use objects as keys */ function HashMap(array, isolatedUid) { if (isolatedUid) { var uid = 0; this.nextUid = function() { return ++uid; }; } forEach(array, this.put, this); } HashMap.prototype = { /** * Store key value pair * @param key key to store can be any type * @param value value to store can be any type */ put: function(key, value) { this[hashKey(key, this.nextUid)] = value; }, /** * @param key * @returns {Object} the value for the key */ get: function(key) { return this[hashKey(key, this.nextUid)]; }, /** * Remove the key/value pair * @param key */ remove: function(key) { var value = this[key = hashKey(key, this.nextUid)]; delete this[key]; return value; } }; var $$HashMapProvider = [function() { this.$get = [function() { return HashMap; }]; }]; /** * @ngdoc function * @module ng * @name angular.injector * @kind function * * @description * Creates an injector object that can be used for retrieving services as well as for * dependency injection (see {@link guide/di dependency injection}). * * @param {Array.} modules A list of module functions or their aliases. See * {@link angular.module}. The `ng` module must be explicitly added. * @param {boolean=} [strictDi=false] Whether the injector should be in strict mode, which * disallows argument name annotation inference. * @returns {injector} Injector object. See {@link auto.$injector $injector}. * * @example * Typical usage * ```js * // create an injector * var $injector = angular.injector(['ng']); * * // use the injector to kick off your application * // use the type inference to auto inject arguments, or use implicit injection * $injector.invoke(function($rootScope, $compile, $document) { * $compile($document)($rootScope); * $rootScope.$digest(); * }); * ``` * * Sometimes you want to get access to the injector of a currently running Angular app * from outside Angular. Perhaps, you want to inject and compile some markup after the * application has been bootstrapped. You can do this using the extra `injector()` added * to JQuery/jqLite elements. See {@link angular.element}. * * *This is fairly rare but could be the case if a third party library is injecting the * markup.* * * In the following example a new block of HTML containing a `ng-controller` * directive is added to the end of the document body by JQuery. We then compile and link * it into the current AngularJS scope. * * ```js * var $div = $('
{{content.label}}
'); * $(document.body).append($div); * * angular.element(document).injector().invoke(function($compile) { * var scope = angular.element($div).scope(); * $compile($div)(scope); * }); * ``` */ /** * @ngdoc module * @name auto * @installation * @description * * Implicit module which gets automatically added to each {@link auto.$injector $injector}. */ var ARROW_ARG = /^([^\(]+?)=>/; var FN_ARGS = /^[^\(]*\(\s*([^\)]*)\)/m; var FN_ARG_SPLIT = /,/; var FN_ARG = /^\s*(_?)(\S+?)\1\s*$/; var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; var $injectorMinErr = minErr('$injector'); function stringifyFn(fn) { // Support: Chrome 50-51 only // Creating a new string by adding `' '` at the end, to hack around some bug in Chrome v50/51 // (See https://github.com/angular/angular.js/issues/14487.) // TODO (gkalpak): Remove workaround when Chrome v52 is released return Function.prototype.toString.call(fn) + ' '; } function extractArgs(fn) { var fnText = stringifyFn(fn).replace(STRIP_COMMENTS, ''), args = fnText.match(ARROW_ARG) || fnText.match(FN_ARGS); return args; } function anonFn(fn) { // For anonymous functions, showing at the very least the function signature can help in // debugging. var args = extractArgs(fn); if (args) { return 'function(' + (args[1] || '').replace(/[\s\r\n]+/, ' ') + ')'; } return 'fn'; } function annotate(fn, strictDi, name) { var $inject, argDecl, last; if (typeof fn === 'function') { if (!($inject = fn.$inject)) { $inject = []; if (fn.length) { if (strictDi) { if (!isString(name) || !name) { name = fn.name || anonFn(fn); } throw $injectorMinErr('strictdi', '{0} is not using explicit annotation and cannot be invoked in strict mode', name); } argDecl = extractArgs(fn); forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg) { arg.replace(FN_ARG, function(all, underscore, name) { $inject.push(name); }); }); } fn.$inject = $inject; } } else if (isArray(fn)) { last = fn.length - 1; assertArgFn(fn[last], 'fn'); $inject = fn.slice(0, last); } else { assertArgFn(fn, 'fn', true); } return $inject; } /////////////////////////////////////// /** * @ngdoc service * @name $injector * * @description * * `$injector` is used to retrieve object instances as defined by * {@link auto.$provide provider}, instantiate types, invoke methods, * and load modules. * * The following always holds true: * * ```js * var $injector = angular.injector(); * expect($injector.get('$injector')).toBe($injector); * expect($injector.invoke(function($injector) { * return $injector; * })).toBe($injector); * ``` * * # Injection Function Annotation * * JavaScript does not have annotations, and annotations are needed for dependency injection. The * following are all valid ways of annotating function with injection arguments and are equivalent. * * ```js * // inferred (only works if code not minified/obfuscated) * $injector.invoke(function(serviceA){}); * * // annotated * function explicit(serviceA) {}; * explicit.$inject = ['serviceA']; * $injector.invoke(explicit); * * // inline * $injector.invoke(['serviceA', function(serviceA){}]); * ``` * * ## Inference * * In JavaScript calling `toString()` on a function returns the function definition. The definition * can then be parsed and the function arguments can be extracted. This method of discovering * annotations is disallowed when the injector is in strict mode. * *NOTE:* This does not work with minification, and obfuscation tools since these tools change the * argument names. * * ## `$inject` Annotation * By adding an `$inject` property onto a function the injection parameters can be specified. * * ## Inline * As an array of injection names, where the last item in the array is the function to call. */ /** * @ngdoc method * @name $injector#get * * @description * Return an instance of the service. * * @param {string} name The name of the instance to retrieve. * @param {string=} caller An optional string to provide the origin of the function call for error messages. * @return {*} The instance. */ /** * @ngdoc method * @name $injector#invoke * * @description * Invoke the method and supply the method arguments from the `$injector`. * * @param {Function|Array.} fn The injectable function to invoke. Function parameters are * injected according to the {@link guide/di $inject Annotation} rules. * @param {Object=} self The `this` for the invoked method. * @param {Object=} locals Optional object. If preset then any argument names are read from this * object first, before the `$injector` is consulted. * @returns {*} the value returned by the invoked `fn` function. */ /** * @ngdoc method * @name $injector#has * * @description * Allows the user to query if the particular service exists. * * @param {string} name Name of the service to query. * @returns {boolean} `true` if injector has given service. */ /** * @ngdoc method * @name $injector#instantiate * @description * Create a new instance of JS type. The method takes a constructor function, invokes the new * operator, and supplies all of the arguments to the constructor function as specified by the * constructor annotation. * * @param {Function} Type Annotated constructor function. * @param {Object=} locals Optional object. If preset then any argument names are read from this * object first, before the `$injector` is consulted. * @returns {Object} new instance of `Type`. */ /** * @ngdoc method * @name $injector#annotate * * @description * Returns an array of service names which the function is requesting for injection. This API is * used by the injector to determine which services need to be injected into the function when the * function is invoked. There are three ways in which the function can be annotated with the needed * dependencies. * * # Argument names * * The simplest form is to extract the dependencies from the arguments of the function. This is done * by converting the function into a string using `toString()` method and extracting the argument * names. * ```js * // Given * function MyController($scope, $route) { * // ... * } * * // Then * expect(injector.annotate(MyController)).toEqual(['$scope', '$route']); * ``` * * You can disallow this method by using strict injection mode. * * This method does not work with code minification / obfuscation. For this reason the following * annotation strategies are supported. * * # The `$inject` property * * If a function has an `$inject` property and its value is an array of strings, then the strings * represent names of services to be injected into the function. * ```js * // Given * var MyController = function(obfuscatedScope, obfuscatedRoute) { * // ... * } * // Define function dependencies * MyController['$inject'] = ['$scope', '$route']; * * // Then * expect(injector.annotate(MyController)).toEqual(['$scope', '$route']); * ``` * * # The array notation * * It is often desirable to inline Injected functions and that's when setting the `$inject` property * is very inconvenient. In these situations using the array notation to specify the dependencies in * a way that survives minification is a better choice: * * ```js * // We wish to write this (not minification / obfuscation safe) * injector.invoke(function($compile, $rootScope) { * // ... * }); * * // We are forced to write break inlining * var tmpFn = function(obfuscatedCompile, obfuscatedRootScope) { * // ... * }; * tmpFn.$inject = ['$compile', '$rootScope']; * injector.invoke(tmpFn); * * // To better support inline function the inline annotation is supported * injector.invoke(['$compile', '$rootScope', function(obfCompile, obfRootScope) { * // ... * }]); * * // Therefore * expect(injector.annotate( * ['$compile', '$rootScope', function(obfus_$compile, obfus_$rootScope) {}]) * ).toEqual(['$compile', '$rootScope']); * ``` * * @param {Function|Array.} fn Function for which dependent service names need to * be retrieved as described above. * * @param {boolean=} [strictDi=false] Disallow argument name annotation inference. * * @returns {Array.} The names of the services which the function requires. */ /** * @ngdoc service * @name $provide * * @description * * The {@link auto.$provide $provide} service has a number of methods for registering components * with the {@link auto.$injector $injector}. Many of these functions are also exposed on * {@link angular.Module}. * * An Angular **service** is a singleton object created by a **service factory**. These **service * factories** are functions which, in turn, are created by a **service provider**. * The **service providers** are constructor functions. When instantiated they must contain a * property called `$get`, which holds the **service factory** function. * * When you request a service, the {@link auto.$injector $injector} is responsible for finding the * correct **service provider**, instantiating it and then calling its `$get` **service factory** * function to get the instance of the **service**. * * Often services have no configuration options and there is no need to add methods to the service * provider. The provider will be no more than a constructor function with a `$get` property. For * these cases the {@link auto.$provide $provide} service has additional helper methods to register * services without specifying a provider. * * * {@link auto.$provide#provider provider(name, provider)} - registers a **service provider** with the * {@link auto.$injector $injector} * * {@link auto.$provide#constant constant(name, obj)} - registers a value/object that can be accessed by * providers and services. * * {@link auto.$provide#value value(name, obj)} - registers a value/object that can only be accessed by * services, not providers. * * {@link auto.$provide#factory factory(name, fn)} - registers a service **factory function** * that will be wrapped in a **service provider** object, whose `$get` property will contain the * given factory function. * * {@link auto.$provide#service service(name, Fn)} - registers a **constructor function** * that will be wrapped in a **service provider** object, whose `$get` property will instantiate * a new object using the given constructor function. * * {@link auto.$provide#decorator decorator(name, decorFn)} - registers a **decorator function** that * will be able to modify or replace the implementation of another service. * * See the individual methods for more information and examples. */ /** * @ngdoc method * @name $provide#provider * @description * * Register a **provider function** with the {@link auto.$injector $injector}. Provider functions * are constructor functions, whose instances are responsible for "providing" a factory for a * service. * * Service provider names start with the name of the service they provide followed by `Provider`. * For example, the {@link ng.$log $log} service has a provider called * {@link ng.$logProvider $logProvider}. * * Service provider objects can have additional methods which allow configuration of the provider * and its service. Importantly, you can configure what kind of service is created by the `$get` * method, or how that service will act. For example, the {@link ng.$logProvider $logProvider} has a * method {@link ng.$logProvider#debugEnabled debugEnabled} * which lets you specify whether the {@link ng.$log $log} service will log debug messages to the * console or not. * * @param {string} name The name of the instance. NOTE: the provider will be available under `name + 'Provider'` key. * @param {(Object|function())} provider If the provider is: * * - `Object`: then it should have a `$get` method. The `$get` method will be invoked using * {@link auto.$injector#invoke $injector.invoke()} when an instance needs to be created. * - `Constructor`: a new instance of the provider will be created using * {@link auto.$injector#instantiate $injector.instantiate()}, then treated as `object`. * * @returns {Object} registered provider instance * @example * * The following example shows how to create a simple event tracking service and register it using * {@link auto.$provide#provider $provide.provider()}. * * ```js * // Define the eventTracker provider * function EventTrackerProvider() { * var trackingUrl = '/track'; * * // A provider method for configuring where the tracked events should been saved * this.setTrackingUrl = function(url) { * trackingUrl = url; * }; * * // The service factory function * this.$get = ['$http', function($http) { * var trackedEvents = {}; * return { * // Call this to track an event * event: function(event) { * var count = trackedEvents[event] || 0; * count += 1; * trackedEvents[event] = count; * return count; * }, * // Call this to save the tracked events to the trackingUrl * save: function() { * $http.post(trackingUrl, trackedEvents); * } * }; * }]; * } * * describe('eventTracker', function() { * var postSpy; * * beforeEach(module(function($provide) { * // Register the eventTracker provider * $provide.provider('eventTracker', EventTrackerProvider); * })); * * beforeEach(module(function(eventTrackerProvider) { * // Configure eventTracker provider * eventTrackerProvider.setTrackingUrl('/custom-track'); * })); * * it('tracks events', inject(function(eventTracker) { * expect(eventTracker.event('login')).toEqual(1); * expect(eventTracker.event('login')).toEqual(2); * })); * * it('saves to the tracking url', inject(function(eventTracker, $http) { * postSpy = spyOn($http, 'post'); * eventTracker.event('login'); * eventTracker.save(); * expect(postSpy).toHaveBeenCalled(); * expect(postSpy.mostRecentCall.args[0]).not.toEqual('/track'); * expect(postSpy.mostRecentCall.args[0]).toEqual('/custom-track'); * expect(postSpy.mostRecentCall.args[1]).toEqual({ 'login': 1 }); * })); * }); * ``` */ /** * @ngdoc method * @name $provide#factory * @description * * Register a **service factory**, which will be called to return the service instance. * This is short for registering a service where its provider consists of only a `$get` property, * which is the given service factory function. * You should use {@link auto.$provide#factory $provide.factory(getFn)} if you do not need to * configure your service in a provider. * * @param {string} name The name of the instance. * @param {Function|Array.} $getFn The injectable $getFn for the instance creation. * Internally this is a short hand for `$provide.provider(name, {$get: $getFn})`. * @returns {Object} registered provider instance * * @example * Here is an example of registering a service * ```js * $provide.factory('ping', ['$http', function($http) { * return function ping() { * return $http.send('/ping'); * }; * }]); * ``` * You would then inject and use this service like this: * ```js * someModule.controller('Ctrl', ['ping', function(ping) { * ping(); * }]); * ``` */ /** * @ngdoc method * @name $provide#service * @description * * Register a **service constructor**, which will be invoked with `new` to create the service * instance. * This is short for registering a service where its provider's `$get` property is a factory * function that returns an instance instantiated by the injector from the service constructor * function. * * Internally it looks a bit like this: * * ``` * { * $get: function() { * return $injector.instantiate(constructor); * } * } * ``` * * * You should use {@link auto.$provide#service $provide.service(class)} if you define your service * as a type/class. * * @param {string} name The name of the instance. * @param {Function|Array.} constructor An injectable class (constructor function) * that will be instantiated. * @returns {Object} registered provider instance * * @example * Here is an example of registering a service using * {@link auto.$provide#service $provide.service(class)}. * ```js * var Ping = function($http) { * this.$http = $http; * }; * * Ping.$inject = ['$http']; * * Ping.prototype.send = function() { * return this.$http.get('/ping'); * }; * $provide.service('ping', Ping); * ``` * You would then inject and use this service like this: * ```js * someModule.controller('Ctrl', ['ping', function(ping) { * ping.send(); * }]); * ``` */ /** * @ngdoc method * @name $provide#value * @description * * Register a **value service** with the {@link auto.$injector $injector}, such as a string, a * number, an array, an object or a function. This is short for registering a service where its * provider's `$get` property is a factory function that takes no arguments and returns the **value * service**. That also means it is not possible to inject other services into a value service. * * Value services are similar to constant services, except that they cannot be injected into a * module configuration function (see {@link angular.Module#config}) but they can be overridden by * an Angular {@link auto.$provide#decorator decorator}. * * @param {string} name The name of the instance. * @param {*} value The value. * @returns {Object} registered provider instance * * @example * Here are some examples of creating value services. * ```js * $provide.value('ADMIN_USER', 'admin'); * * $provide.value('RoleLookup', { admin: 0, writer: 1, reader: 2 }); * * $provide.value('halfOf', function(value) { * return value / 2; * }); * ``` */ /** * @ngdoc method * @name $provide#constant * @description * * Register a **constant service** with the {@link auto.$injector $injector}, such as a string, * a number, an array, an object or a function. Like the {@link auto.$provide#value value}, it is not * possible to inject other services into a constant. * * But unlike {@link auto.$provide#value value}, a constant can be * injected into a module configuration function (see {@link angular.Module#config}) and it cannot * be overridden by an Angular {@link auto.$provide#decorator decorator}. * * @param {string} name The name of the constant. * @param {*} value The constant value. * @returns {Object} registered instance * * @example * Here a some examples of creating constants: * ```js * $provide.constant('SHARD_HEIGHT', 306); * * $provide.constant('MY_COLOURS', ['red', 'blue', 'grey']); * * $provide.constant('double', function(value) { * return value * 2; * }); * ``` */ /** * @ngdoc method * @name $provide#decorator * @description * * Register a **decorator function** with the {@link auto.$injector $injector}. A decorator function * intercepts the creation of a service, allowing it to override or modify the behavior of the * service. The return value of the decorator function may be the original service, or a new service * that replaces (or wraps and delegates to) the original service. * * You can find out more about using decorators in the {@link guide/decorators} guide. * * @param {string} name The name of the service to decorate. * @param {Function|Array.} decorator This function will be invoked when the service needs to be * provided and should return the decorated service instance. The function is called using * the {@link auto.$injector#invoke injector.invoke} method and is therefore fully injectable. * Local injection arguments: * * * `$delegate` - The original service instance, which can be replaced, monkey patched, configured, * decorated or delegated to. * * @example * Here we decorate the {@link ng.$log $log} service to convert warnings to errors by intercepting * calls to {@link ng.$log#error $log.warn()}. * ```js * $provide.decorator('$log', ['$delegate', function($delegate) { * $delegate.warn = $delegate.error; * return $delegate; * }]); * ``` */ function createInjector(modulesToLoad, strictDi) { strictDi = (strictDi === true); var INSTANTIATING = {}, providerSuffix = 'Provider', path = [], loadedModules = new HashMap([], true), providerCache = { $provide: { provider: supportObject(provider), factory: supportObject(factory), service: supportObject(service), value: supportObject(value), constant: supportObject(constant), decorator: decorator } }, providerInjector = (providerCache.$injector = createInternalInjector(providerCache, function(serviceName, caller) { if (angular.isString(caller)) { path.push(caller); } throw $injectorMinErr('unpr', "Unknown provider: {0}", path.join(' <- ')); })), instanceCache = {}, protoInstanceInjector = createInternalInjector(instanceCache, function(serviceName, caller) { var provider = providerInjector.get(serviceName + providerSuffix, caller); return instanceInjector.invoke( provider.$get, provider, undefined, serviceName); }), instanceInjector = protoInstanceInjector; providerCache['$injector' + providerSuffix] = { $get: valueFn(protoInstanceInjector) }; var runBlocks = loadModules(modulesToLoad); instanceInjector = protoInstanceInjector.get('$injector'); instanceInjector.strictDi = strictDi; forEach(runBlocks, function(fn) { if (fn) instanceInjector.invoke(fn); }); return instanceInjector; //////////////////////////////////// // $provider //////////////////////////////////// function supportObject(delegate) { return function(key, value) { if (isObject(key)) { forEach(key, reverseParams(delegate)); } else { return delegate(key, value); } }; } function provider(name, provider_) { assertNotHasOwnProperty(name, 'service'); if (isFunction(provider_) || isArray(provider_)) { provider_ = providerInjector.instantiate(provider_); } if (!provider_.$get) { throw $injectorMinErr('pget', "Provider '{0}' must define $get factory method.", name); } return providerCache[name + providerSuffix] = provider_; } function enforceReturnValue(name, factory) { return function enforcedReturnValue() { var result = instanceInjector.invoke(factory, this); if (isUndefined(result)) { throw $injectorMinErr('undef', "Provider '{0}' must return a value from $get factory method.", name); } return result; }; } function factory(name, factoryFn, enforce) { return provider(name, { $get: enforce !== false ? enforceReturnValue(name, factoryFn) : factoryFn }); } function service(name, constructor) { return factory(name, ['$injector', function($injector) { return $injector.instantiate(constructor); }]); } function value(name, val) { return factory(name, valueFn(val), false); } function constant(name, value) { assertNotHasOwnProperty(name, 'constant'); providerCache[name] = value; instanceCache[name] = value; } function decorator(serviceName, decorFn) { var origProvider = providerInjector.get(serviceName + providerSuffix), orig$get = origProvider.$get; origProvider.$get = function() { var origInstance = instanceInjector.invoke(orig$get, origProvider); return instanceInjector.invoke(decorFn, null, {$delegate: origInstance}); }; } //////////////////////////////////// // Module Loading //////////////////////////////////// function loadModules(modulesToLoad) { assertArg(isUndefined(modulesToLoad) || isArray(modulesToLoad), 'modulesToLoad', 'not an array'); var runBlocks = [], moduleFn; forEach(modulesToLoad, function(module) { if (loadedModules.get(module)) return; loadedModules.put(module, true); function runInvokeQueue(queue) { var i, ii; for (i = 0, ii = queue.length; i < ii; i++) { var invokeArgs = queue[i], provider = providerInjector.get(invokeArgs[0]); provider[invokeArgs[1]].apply(provider, invokeArgs[2]); } } try { if (isString(module)) { moduleFn = angularModule(module); runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks); runInvokeQueue(moduleFn._invokeQueue); runInvokeQueue(moduleFn._configBlocks); } else if (isFunction(module)) { runBlocks.push(providerInjector.invoke(module)); } else if (isArray(module)) { runBlocks.push(providerInjector.invoke(module)); } else { assertArgFn(module, 'module'); } } catch (e) { if (isArray(module)) { module = module[module.length - 1]; } if (e.message && e.stack && e.stack.indexOf(e.message) == -1) { // Safari & FF's stack traces don't contain error.message content // unlike those of Chrome and IE // So if stack doesn't contain message, we create a new string that contains both. // Since error.stack is read-only in Safari, I'm overriding e and not e.stack here. /* jshint -W022 */ e = e.message + '\n' + e.stack; } throw $injectorMinErr('modulerr', "Failed to instantiate module {0} due to:\n{1}", module, e.stack || e.message || e); } }); return runBlocks; } //////////////////////////////////// // internal Injector //////////////////////////////////// function createInternalInjector(cache, factory) { function getService(serviceName, caller) { if (cache.hasOwnProperty(serviceName)) { if (cache[serviceName] === INSTANTIATING) { throw $injectorMinErr('cdep', 'Circular dependency found: {0}', serviceName + ' <- ' + path.join(' <- ')); } return cache[serviceName]; } else { try { path.unshift(serviceName); cache[serviceName] = INSTANTIATING; return cache[serviceName] = factory(serviceName, caller); } catch (err) { if (cache[serviceName] === INSTANTIATING) { delete cache[serviceName]; } throw err; } finally { path.shift(); } } } function injectionArgs(fn, locals, serviceName) { var args = [], $inject = createInjector.$$annotate(fn, strictDi, serviceName); for (var i = 0, length = $inject.length; i < length; i++) { var key = $inject[i]; if (typeof key !== 'string') { throw $injectorMinErr('itkn', 'Incorrect injection token! Expected service name as string, got {0}', key); } args.push(locals && locals.hasOwnProperty(key) ? locals[key] : getService(key, serviceName)); } return args; } function isClass(func) { // IE 9-11 do not support classes and IE9 leaks with the code below. if (msie <= 11) { return false; } // Workaround for MS Edge. // Check https://connect.microsoft.com/IE/Feedback/Details/2211653 return typeof func === 'function' && /^(?:class\s|constructor\()/.test(stringifyFn(func)); } function invoke(fn, self, locals, serviceName) { if (typeof locals === 'string') { serviceName = locals; locals = null; } var args = injectionArgs(fn, locals, serviceName); if (isArray(fn)) { fn = fn[fn.length - 1]; } if (!isClass(fn)) { // http://jsperf.com/angularjs-invoke-apply-vs-switch // #5388 return fn.apply(self, args); } else { args.unshift(null); return new (Function.prototype.bind.apply(fn, args))(); } } function instantiate(Type, locals, serviceName) { // Check if Type is annotated and use just the given function at n-1 as parameter // e.g. someModule.factory('greeter', ['$window', function(renamed$window) {}]); var ctor = (isArray(Type) ? Type[Type.length - 1] : Type); var args = injectionArgs(Type, locals, serviceName); // Empty object at position 0 is ignored for invocation with `new`, but required. args.unshift(null); return new (Function.prototype.bind.apply(ctor, args))(); } return { invoke: invoke, instantiate: instantiate, get: getService, annotate: createInjector.$$annotate, has: function(name) { return providerCache.hasOwnProperty(name + providerSuffix) || cache.hasOwnProperty(name); } }; } } createInjector.$$annotate = annotate; /** * @ngdoc provider * @name $anchorScrollProvider * * @description * Use `$anchorScrollProvider` to disable automatic scrolling whenever * {@link ng.$location#hash $location.hash()} changes. */ function $AnchorScrollProvider() { var autoScrollingEnabled = true; /** * @ngdoc method * @name $anchorScrollProvider#disableAutoScrolling * * @description * By default, {@link ng.$anchorScroll $anchorScroll()} will automatically detect changes to * {@link ng.$location#hash $location.hash()} and scroll to the element matching the new hash.
* Use this method to disable automatic scrolling. * * If automatic scrolling is disabled, one must explicitly call * {@link ng.$anchorScroll $anchorScroll()} in order to scroll to the element related to the * current hash. */ this.disableAutoScrolling = function() { autoScrollingEnabled = false; }; /** * @ngdoc service * @name $anchorScroll * @kind function * @requires $window * @requires $location * @requires $rootScope * * @description * When called, it scrolls to the element related to the specified `hash` or (if omitted) to the * current value of {@link ng.$location#hash $location.hash()}, according to the rules specified * in the * [HTML5 spec](http://www.w3.org/html/wg/drafts/html/master/browsers.html#an-indicated-part-of-the-document). * * It also watches the {@link ng.$location#hash $location.hash()} and automatically scrolls to * match any anchor whenever it changes. This can be disabled by calling * {@link ng.$anchorScrollProvider#disableAutoScrolling $anchorScrollProvider.disableAutoScrolling()}. * * Additionally, you can use its {@link ng.$anchorScroll#yOffset yOffset} property to specify a * vertical scroll-offset (either fixed or dynamic). * * @param {string=} hash The hash specifying the element to scroll to. If omitted, the value of * {@link ng.$location#hash $location.hash()} will be used. * * @property {(number|function|jqLite)} yOffset * If set, specifies a vertical scroll-offset. This is often useful when there are fixed * positioned elements at the top of the page, such as navbars, headers etc. * * `yOffset` can be specified in various ways: * - **number**: A fixed number of pixels to be used as offset.

* - **function**: A getter function called everytime `$anchorScroll()` is executed. Must return * a number representing the offset (in pixels).

* - **jqLite**: A jqLite/jQuery element to be used for specifying the offset. The distance from * the top of the page to the element's bottom will be used as offset.
* **Note**: The element will be taken into account only as long as its `position` is set to * `fixed`. This option is useful, when dealing with responsive navbars/headers that adjust * their height and/or positioning according to the viewport's size. * *
*
* In order for `yOffset` to work properly, scrolling should take place on the document's root and * not some child element. *
* * @example
Go to bottom You're at the bottom!
angular.module('anchorScrollExample', []) .controller('ScrollController', ['$scope', '$location', '$anchorScroll', function ($scope, $location, $anchorScroll) { $scope.gotoBottom = function() { // set the location.hash to the id of // the element you wish to scroll to. $location.hash('bottom'); // call $anchorScroll() $anchorScroll(); }; }]); #scrollArea { height: 280px; overflow: auto; } #bottom { display: block; margin-top: 2000px; }
* *
* The example below illustrates the use of a vertical scroll-offset (specified as a fixed value). * See {@link ng.$anchorScroll#yOffset $anchorScroll.yOffset} for more details. * * @example
Anchor {{x}} of 5
angular.module('anchorScrollOffsetExample', []) .run(['$anchorScroll', function($anchorScroll) { $anchorScroll.yOffset = 50; // always scroll by 50 extra pixels }]) .controller('headerCtrl', ['$anchorScroll', '$location', '$scope', function ($anchorScroll, $location, $scope) { $scope.gotoAnchor = function(x) { var newHash = 'anchor' + x; if ($location.hash() !== newHash) { // set the $location.hash to `newHash` and // $anchorScroll will automatically scroll to it $location.hash('anchor' + x); } else { // call $anchorScroll() explicitly, // since $location.hash hasn't changed $anchorScroll(); } }; } ]); body { padding-top: 50px; } .anchor { border: 2px dashed DarkOrchid; padding: 10px 10px 200px 10px; } .fixed-header { background-color: rgba(0, 0, 0, 0.2); height: 50px; position: fixed; top: 0; left: 0; right: 0; } .fixed-header > a { display: inline-block; margin: 5px 15px; }
*/ this.$get = ['$window', '$location', '$rootScope', function($window, $location, $rootScope) { var document = $window.document; // Helper function to get first anchor from a NodeList // (using `Array#some()` instead of `angular#forEach()` since it's more performant // and working in all supported browsers.) function getFirstAnchor(list) { var result = null; Array.prototype.some.call(list, function(element) { if (nodeName_(element) === 'a') { result = element; return true; } }); return result; } function getYOffset() { var offset = scroll.yOffset; if (isFunction(offset)) { offset = offset(); } else if (isElement(offset)) { var elem = offset[0]; var style = $window.getComputedStyle(elem); if (style.position !== 'fixed') { offset = 0; } else { offset = elem.getBoundingClientRect().bottom; } } else if (!isNumber(offset)) { offset = 0; } return offset; } function scrollTo(elem) { if (elem) { elem.scrollIntoView(); var offset = getYOffset(); if (offset) { // `offset` is the number of pixels we should scroll UP in order to align `elem` properly. // This is true ONLY if the call to `elem.scrollIntoView()` initially aligns `elem` at the // top of the viewport. // // IF the number of pixels from the top of `elem` to the end of the page's content is less // than the height of the viewport, then `elem.scrollIntoView()` will align the `elem` some // way down the page. // // This is often the case for elements near the bottom of the page. // // In such cases we do not need to scroll the whole `offset` up, just the difference between // the top of the element and the offset, which is enough to align the top of `elem` at the // desired position. var elemTop = elem.getBoundingClientRect().top; $window.scrollBy(0, elemTop - offset); } } else { $window.scrollTo(0, 0); } } function scroll(hash) { hash = isString(hash) ? hash : $location.hash(); var elm; // empty hash, scroll to the top of the page if (!hash) scrollTo(null); // element with given id else if ((elm = document.getElementById(hash))) scrollTo(elm); // first anchor with given name :-D else if ((elm = getFirstAnchor(document.getElementsByName(hash)))) scrollTo(elm); // no element and hash == 'top', scroll to the top of the page else if (hash === 'top') scrollTo(null); } // does not scroll when user clicks on anchor link that is currently on // (no url change, no $location.hash() change), browser native does scroll if (autoScrollingEnabled) { $rootScope.$watch(function autoScrollWatch() {return $location.hash();}, function autoScrollWatchAction(newVal, oldVal) { // skip the initial scroll if $location.hash is empty if (newVal === oldVal && newVal === '') return; jqLiteDocumentLoaded(function() { $rootScope.$evalAsync(scroll); }); }); } return scroll; }]; } var $animateMinErr = minErr('$animate'); var ELEMENT_NODE = 1; var NG_ANIMATE_CLASSNAME = 'ng-animate'; function mergeClasses(a,b) { if (!a && !b) return ''; if (!a) return b; if (!b) return a; if (isArray(a)) a = a.join(' '); if (isArray(b)) b = b.join(' '); return a + ' ' + b; } function extractElementNode(element) { for (var i = 0; i < element.length; i++) { var elm = element[i]; if (elm.nodeType === ELEMENT_NODE) { return elm; } } } function splitClasses(classes) { if (isString(classes)) { classes = classes.split(' '); } // Use createMap() to prevent class assumptions involving property names in // Object.prototype var obj = createMap(); forEach(classes, function(klass) { // sometimes the split leaves empty string values // incase extra spaces were applied to the options if (klass.length) { obj[klass] = true; } }); return obj; } // if any other type of options value besides an Object value is // passed into the $animate.method() animation then this helper code // will be run which will ignore it. While this patch is not the // greatest solution to this, a lot of existing plugins depend on // $animate to either call the callback (< 1.2) or return a promise // that can be changed. This helper function ensures that the options // are wiped clean incase a callback function is provided. function prepareAnimateOptions(options) { return isObject(options) ? options : {}; } var $$CoreAnimateJsProvider = function() { this.$get = noop; }; // this is prefixed with Core since it conflicts with // the animateQueueProvider defined in ngAnimate/animateQueue.js var $$CoreAnimateQueueProvider = function() { var postDigestQueue = new HashMap(); var postDigestElements = []; this.$get = ['$$AnimateRunner', '$rootScope', function($$AnimateRunner, $rootScope) { return { enabled: noop, on: noop, off: noop, pin: noop, push: function(element, event, options, domOperation) { domOperation && domOperation(); options = options || {}; options.from && element.css(options.from); options.to && element.css(options.to); if (options.addClass || options.removeClass) { addRemoveClassesPostDigest(element, options.addClass, options.removeClass); } var runner = new $$AnimateRunner(); // jshint ignore:line // since there are no animations to run the runner needs to be // notified that the animation call is complete. runner.complete(); return runner; } }; function updateData(data, classes, value) { var changed = false; if (classes) { classes = isString(classes) ? classes.split(' ') : isArray(classes) ? classes : []; forEach(classes, function(className) { if (className) { changed = true; data[className] = value; } }); } return changed; } function handleCSSClassChanges() { forEach(postDigestElements, function(element) { var data = postDigestQueue.get(element); if (data) { var existing = splitClasses(element.attr('class')); var toAdd = ''; var toRemove = ''; forEach(data, function(status, className) { var hasClass = !!existing[className]; if (status !== hasClass) { if (status) { toAdd += (toAdd.length ? ' ' : '') + className; } else { toRemove += (toRemove.length ? ' ' : '') + className; } } }); forEach(element, function(elm) { toAdd && jqLiteAddClass(elm, toAdd); toRemove && jqLiteRemoveClass(elm, toRemove); }); postDigestQueue.remove(element); } }); postDigestElements.length = 0; } function addRemoveClassesPostDigest(element, add, remove) { var data = postDigestQueue.get(element) || {}; var classesAdded = updateData(data, add, true); var classesRemoved = updateData(data, remove, false); if (classesAdded || classesRemoved) { postDigestQueue.put(element, data); postDigestElements.push(element); if (postDigestElements.length === 1) { $rootScope.$$postDigest(handleCSSClassChanges); } } } }]; }; /** * @ngdoc provider * @name $animateProvider * * @description * Default implementation of $animate that doesn't perform any animations, instead just * synchronously performs DOM updates and resolves the returned runner promise. * * In order to enable animations the `ngAnimate` module has to be loaded. * * To see the functional implementation check out `src/ngAnimate/animate.js`. */ var $AnimateProvider = ['$provide', function($provide) { var provider = this; this.$$registeredAnimations = Object.create(null); /** * @ngdoc method * @name $animateProvider#register * * @description * Registers a new injectable animation factory function. The factory function produces the * animation object which contains callback functions for each event that is expected to be * animated. * * * `eventFn`: `function(element, ... , doneFunction, options)` * The element to animate, the `doneFunction` and the options fed into the animation. Depending * on the type of animation additional arguments will be injected into the animation function. The * list below explains the function signatures for the different animation methods: * * - setClass: function(element, addedClasses, removedClasses, doneFunction, options) * - addClass: function(element, addedClasses, doneFunction, options) * - removeClass: function(element, removedClasses, doneFunction, options) * - enter, leave, move: function(element, doneFunction, options) * - animate: function(element, fromStyles, toStyles, doneFunction, options) * * Make sure to trigger the `doneFunction` once the animation is fully complete. * * ```js * return { * //enter, leave, move signature * eventFn : function(element, done, options) { * //code to run the animation * //once complete, then run done() * return function endFunction(wasCancelled) { * //code to cancel the animation * } * } * } * ``` * * @param {string} name The name of the animation (this is what the class-based CSS value will be compared to). * @param {Function} factory The factory function that will be executed to return the animation * object. */ this.register = function(name, factory) { if (name && name.charAt(0) !== '.') { throw $animateMinErr('notcsel', "Expecting class selector starting with '.' got '{0}'.", name); } var key = name + '-animation'; provider.$$registeredAnimations[name.substr(1)] = key; $provide.factory(key, factory); }; /** * @ngdoc method * @name $animateProvider#classNameFilter * * @description * Sets and/or returns the CSS class regular expression that is checked when performing * an animation. Upon bootstrap the classNameFilter value is not set at all and will * therefore enable $animate to attempt to perform an animation on any element that is triggered. * When setting the `classNameFilter` value, animations will only be performed on elements * that successfully match the filter expression. This in turn can boost performance * for low-powered devices as well as applications containing a lot of structural operations. * @param {RegExp=} expression The className expression which will be checked against all animations * @return {RegExp} The current CSS className expression value. If null then there is no expression value */ this.classNameFilter = function(expression) { if (arguments.length === 1) { this.$$classNameFilter = (expression instanceof RegExp) ? expression : null; if (this.$$classNameFilter) { var reservedRegex = new RegExp("(\\s+|\\/)" + NG_ANIMATE_CLASSNAME + "(\\s+|\\/)"); if (reservedRegex.test(this.$$classNameFilter.toString())) { throw $animateMinErr('nongcls','$animateProvider.classNameFilter(regex) prohibits accepting a regex value which matches/contains the "{0}" CSS class.', NG_ANIMATE_CLASSNAME); } } } return this.$$classNameFilter; }; this.$get = ['$$animateQueue', function($$animateQueue) { function domInsert(element, parentElement, afterElement) { // if for some reason the previous element was removed // from the dom sometime before this code runs then let's // just stick to using the parent element as the anchor if (afterElement) { var afterNode = extractElementNode(afterElement); if (afterNode && !afterNode.parentNode && !afterNode.previousElementSibling) { afterElement = null; } } afterElement ? afterElement.after(element) : parentElement.prepend(element); } /** * @ngdoc service * @name $animate * @description The $animate service exposes a series of DOM utility methods that provide support * for animation hooks. The default behavior is the application of DOM operations, however, * when an animation is detected (and animations are enabled), $animate will do the heavy lifting * to ensure that animation runs with the triggered DOM operation. * * By default $animate doesn't trigger any animations. This is because the `ngAnimate` module isn't * included and only when it is active then the animation hooks that `$animate` triggers will be * functional. Once active then all structural `ng-` directives will trigger animations as they perform * their DOM-related operations (enter, leave and move). Other directives such as `ngClass`, * `ngShow`, `ngHide` and `ngMessages` also provide support for animations. * * It is recommended that the`$animate` service is always used when executing DOM-related procedures within directives. * * To learn more about enabling animation support, click here to visit the * {@link ngAnimate ngAnimate module page}. */ return { // we don't call it directly since non-existant arguments may // be interpreted as null within the sub enabled function /** * * @ngdoc method * @name $animate#on * @kind function * @description Sets up an event listener to fire whenever the animation event (enter, leave, move, etc...) * has fired on the given element or among any of its children. Once the listener is fired, the provided callback * is fired with the following params: * * ```js * $animate.on('enter', container, * function callback(element, phase) { * // cool we detected an enter animation within the container * } * ); * ``` * * @param {string} event the animation event that will be captured (e.g. enter, leave, move, addClass, removeClass, etc...) * @param {DOMElement} container the container element that will capture each of the animation events that are fired on itself * as well as among its children * @param {Function} callback the callback function that will be fired when the listener is triggered * * The arguments present in the callback function are: * * `element` - The captured DOM element that the animation was fired on. * * `phase` - The phase of the animation. The two possible phases are **start** (when the animation starts) and **close** (when it ends). */ on: $$animateQueue.on, /** * * @ngdoc method * @name $animate#off * @kind function * @description Deregisters an event listener based on the event which has been associated with the provided element. This method * can be used in three different ways depending on the arguments: * * ```js * // remove all the animation event listeners listening for `enter` * $animate.off('enter'); * * // remove listeners for all animation events from the container element * $animate.off(container); * * // remove all the animation event listeners listening for `enter` on the given element and its children * $animate.off('enter', container); * * // remove the event listener function provided by `callback` that is set * // to listen for `enter` on the given `container` as well as its children * $animate.off('enter', container, callback); * ``` * * @param {string|DOMElement} event|container the animation event (e.g. enter, leave, move, * addClass, removeClass, etc...), or the container element. If it is the element, all other * arguments are ignored. * @param {DOMElement=} container the container element the event listener was placed on * @param {Function=} callback the callback function that was registered as the listener */ off: $$animateQueue.off, /** * @ngdoc method * @name $animate#pin * @kind function * @description Associates the provided element with a host parent element to allow the element to be animated even if it exists * outside of the DOM structure of the Angular application. By doing so, any animation triggered via `$animate` can be issued on the * element despite being outside the realm of the application or within another application. Say for example if the application * was bootstrapped on an element that is somewhere inside of the `` tag, but we wanted to allow for an element to be situated * as a direct child of `document.body`, then this can be achieved by pinning the element via `$animate.pin(element)`. Keep in mind * that calling `$animate.pin(element, parentElement)` will not actually insert into the DOM anywhere; it will just create the association. * * Note that this feature is only active when the `ngAnimate` module is used. * * @param {DOMElement} element the external element that will be pinned * @param {DOMElement} parentElement the host parent element that will be associated with the external element */ pin: $$animateQueue.pin, /** * * @ngdoc method * @name $animate#enabled * @kind function * @description Used to get and set whether animations are enabled or not on the entire application or on an element and its children. This * function can be called in four ways: * * ```js * // returns true or false * $animate.enabled(); * * // changes the enabled state for all animations * $animate.enabled(false); * $animate.enabled(true); * * // returns true or false if animations are enabled for an element * $animate.enabled(element); * * // changes the enabled state for an element and its children * $animate.enabled(element, true); * $animate.enabled(element, false); * ``` * * @param {DOMElement=} element the element that will be considered for checking/setting the enabled state * @param {boolean=} enabled whether or not the animations will be enabled for the element * * @return {boolean} whether or not animations are enabled */ enabled: $$animateQueue.enabled, /** * @ngdoc method * @name $animate#cancel * @kind function * @description Cancels the provided animation. * * @param {Promise} animationPromise The animation promise that is returned when an animation is started. */ cancel: function(runner) { runner.end && runner.end(); }, /** * * @ngdoc method * @name $animate#enter * @kind function * @description Inserts the element into the DOM either after the `after` element (if provided) or * as the first child within the `parent` element and then triggers an animation. * A promise is returned that will be resolved during the next digest once the animation * has completed. * * @param {DOMElement} element the element which will be inserted into the DOM * @param {DOMElement} parent the parent element which will append the element as * a child (so long as the after element is not present) * @param {DOMElement=} after the sibling element after which the element will be appended * @param {object=} options an optional collection of options/styles that will be applied to the element. * The object can have the following properties: * * - **addClass** - `{string}` - space-separated CSS classes to add to element * - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to` * - **removeClass** - `{string}` - space-separated CSS classes to remove from element * - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from` * * @return {Promise} the animation callback promise */ enter: function(element, parent, after, options) { parent = parent && jqLite(parent); after = after && jqLite(after); parent = parent || after.parent(); domInsert(element, parent, after); return $$animateQueue.push(element, 'enter', prepareAnimateOptions(options)); }, /** * * @ngdoc method * @name $animate#move * @kind function * @description Inserts (moves) the element into its new position in the DOM either after * the `after` element (if provided) or as the first child within the `parent` element * and then triggers an animation. A promise is returned that will be resolved * during the next digest once the animation has completed. * * @param {DOMElement} element the element which will be moved into the new DOM position * @param {DOMElement} parent the parent element which will append the element as * a child (so long as the after element is not present) * @param {DOMElement=} after the sibling element after which the element will be appended * @param {object=} options an optional collection of options/styles that will be applied to the element. * The object can have the following properties: * * - **addClass** - `{string}` - space-separated CSS classes to add to element * - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to` * - **removeClass** - `{string}` - space-separated CSS classes to remove from element * - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from` * * @return {Promise} the animation callback promise */ move: function(element, parent, after, options) { parent = parent && jqLite(parent); after = after && jqLite(after); parent = parent || after.parent(); domInsert(element, parent, after); return $$animateQueue.push(element, 'move', prepareAnimateOptions(options)); }, /** * @ngdoc method * @name $animate#leave * @kind function * @description Triggers an animation and then removes the element from the DOM. * When the function is called a promise is returned that will be resolved during the next * digest once the animation has completed. * * @param {DOMElement} element the element which will be removed from the DOM * @param {object=} options an optional collection of options/styles that will be applied to the element. * The object can have the following properties: * * - **addClass** - `{string}` - space-separated CSS classes to add to element * - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to` * - **removeClass** - `{string}` - space-separated CSS classes to remove from element * - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from` * * @return {Promise} the animation callback promise */ leave: function(element, options) { return $$animateQueue.push(element, 'leave', prepareAnimateOptions(options), function() { element.remove(); }); }, /** * @ngdoc method * @name $animate#addClass * @kind function * * @description Triggers an addClass animation surrounding the addition of the provided CSS class(es). Upon * execution, the addClass operation will only be handled after the next digest and it will not trigger an * animation if element already contains the CSS class or if the class is removed at a later step. * Note that class-based animations are treated differently compared to structural animations * (like enter, move and leave) since the CSS classes may be added/removed at different points * depending if CSS or JavaScript animations are used. * * @param {DOMElement} element the element which the CSS classes will be applied to * @param {string} className the CSS class(es) that will be added (multiple classes are separated via spaces) * @param {object=} options an optional collection of options/styles that will be applied to the element. * The object can have the following properties: * * - **addClass** - `{string}` - space-separated CSS classes to add to element * - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to` * - **removeClass** - `{string}` - space-separated CSS classes to remove from element * - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from` * * @return {Promise} the animation callback promise */ addClass: function(element, className, options) { options = prepareAnimateOptions(options); options.addClass = mergeClasses(options.addclass, className); return $$animateQueue.push(element, 'addClass', options); }, /** * @ngdoc method * @name $animate#removeClass * @kind function * * @description Triggers a removeClass animation surrounding the removal of the provided CSS class(es). Upon * execution, the removeClass operation will only be handled after the next digest and it will not trigger an * animation if element does not contain the CSS class or if the class is added at a later step. * Note that class-based animations are treated differently compared to structural animations * (like enter, move and leave) since the CSS classes may be added/removed at different points * depending if CSS or JavaScript animations are used. * * @param {DOMElement} element the element which the CSS classes will be applied to * @param {string} className the CSS class(es) that will be removed (multiple classes are separated via spaces) * @param {object=} options an optional collection of options/styles that will be applied to the element. * The object can have the following properties: * * - **addClass** - `{string}` - space-separated CSS classes to add to element * - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to` * - **removeClass** - `{string}` - space-separated CSS classes to remove from element * - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from` * * @return {Promise} the animation callback promise */ removeClass: function(element, className, options) { options = prepareAnimateOptions(options); options.removeClass = mergeClasses(options.removeClass, className); return $$animateQueue.push(element, 'removeClass', options); }, /** * @ngdoc method * @name $animate#setClass * @kind function * * @description Performs both the addition and removal of a CSS classes on an element and (during the process) * triggers an animation surrounding the class addition/removal. Much like `$animate.addClass` and * `$animate.removeClass`, `setClass` will only evaluate the classes being added/removed once a digest has * passed. Note that class-based animations are treated differently compared to structural animations * (like enter, move and leave) since the CSS classes may be added/removed at different points * depending if CSS or JavaScript animations are used. * * @param {DOMElement} element the element which the CSS classes will be applied to * @param {string} add the CSS class(es) that will be added (multiple classes are separated via spaces) * @param {string} remove the CSS class(es) that will be removed (multiple classes are separated via spaces) * @param {object=} options an optional collection of options/styles that will be applied to the element. * The object can have the following properties: * * - **addClass** - `{string}` - space-separated CSS classes to add to element * - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to` * - **removeClass** - `{string}` - space-separated CSS classes to remove from element * - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from` * * @return {Promise} the animation callback promise */ setClass: function(element, add, remove, options) { options = prepareAnimateOptions(options); options.addClass = mergeClasses(options.addClass, add); options.removeClass = mergeClasses(options.removeClass, remove); return $$animateQueue.push(element, 'setClass', options); }, /** * @ngdoc method * @name $animate#animate * @kind function * * @description Performs an inline animation on the element which applies the provided to and from CSS styles to the element. * If any detected CSS transition, keyframe or JavaScript matches the provided className value, then the animation will take * on the provided styles. For example, if a transition animation is set for the given classNamem, then the provided `from` and * `to` styles will be applied alongside the given transition. If the CSS style provided in `from` does not have a corresponding * style in `to`, the style in `from` is applied immediately, and no animation is run. * If a JavaScript animation is detected then the provided styles will be given in as function parameters into the `animate` * method (or as part of the `options` parameter): * * ```js * ngModule.animation('.my-inline-animation', function() { * return { * animate : function(element, from, to, done, options) { * //animation * done(); * } * } * }); * ``` * * @param {DOMElement} element the element which the CSS styles will be applied to * @param {object} from the from (starting) CSS styles that will be applied to the element and across the animation. * @param {object} to the to (destination) CSS styles that will be applied to the element and across the animation. * @param {string=} className an optional CSS class that will be applied to the element for the duration of the animation. If * this value is left as empty then a CSS class of `ng-inline-animate` will be applied to the element. * (Note that if no animation is detected then this value will not be applied to the element.) * @param {object=} options an optional collection of options/styles that will be applied to the element. * The object can have the following properties: * * - **addClass** - `{string}` - space-separated CSS classes to add to element * - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to` * - **removeClass** - `{string}` - space-separated CSS classes to remove from element * - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from` * * @return {Promise} the animation callback promise */ animate: function(element, from, to, className, options) { options = prepareAnimateOptions(options); options.from = options.from ? extend(options.from, from) : from; options.to = options.to ? extend(options.to, to) : to; className = className || 'ng-inline-animate'; options.tempClasses = mergeClasses(options.tempClasses, className); return $$animateQueue.push(element, 'animate', options); } }; }]; }]; var $$AnimateAsyncRunFactoryProvider = function() { this.$get = ['$$rAF', function($$rAF) { var waitQueue = []; function waitForTick(fn) { waitQueue.push(fn); if (waitQueue.length > 1) return; $$rAF(function() { for (var i = 0; i < waitQueue.length; i++) { waitQueue[i](); } waitQueue = []; }); } return function() { var passed = false; waitForTick(function() { passed = true; }); return function(callback) { passed ? callback() : waitForTick(callback); }; }; }]; }; var $$AnimateRunnerFactoryProvider = function() { this.$get = ['$q', '$sniffer', '$$animateAsyncRun', '$document', '$timeout', function($q, $sniffer, $$animateAsyncRun, $document, $timeout) { var INITIAL_STATE = 0; var DONE_PENDING_STATE = 1; var DONE_COMPLETE_STATE = 2; AnimateRunner.chain = function(chain, callback) { var index = 0; next(); function next() { if (index === chain.length) { callback(true); return; } chain[index](function(response) { if (response === false) { callback(false); return; } index++; next(); }); } }; AnimateRunner.all = function(runners, callback) { var count = 0; var status = true; forEach(runners, function(runner) { runner.done(onProgress); }); function onProgress(response) { status = status && response; if (++count === runners.length) { callback(status); } } }; function AnimateRunner(host) { this.setHost(host); var rafTick = $$animateAsyncRun(); var timeoutTick = function(fn) { $timeout(fn, 0, false); }; this._doneCallbacks = []; this._tick = function(fn) { var doc = $document[0]; // the document may not be ready or attached // to the module for some internal tests if (doc && doc.hidden) { timeoutTick(fn); } else { rafTick(fn); } }; this._state = 0; } AnimateRunner.prototype = { setHost: function(host) { this.host = host || {}; }, done: function(fn) { if (this._state === DONE_COMPLETE_STATE) { fn(); } else { this._doneCallbacks.push(fn); } }, progress: noop, getPromise: function() { if (!this.promise) { var self = this; this.promise = $q(function(resolve, reject) { self.done(function(status) { status === false ? reject() : resolve(); }); }); } return this.promise; }, then: function(resolveHandler, rejectHandler) { return this.getPromise().then(resolveHandler, rejectHandler); }, 'catch': function(handler) { return this.getPromise()['catch'](handler); }, 'finally': function(handler) { return this.getPromise()['finally'](handler); }, pause: function() { if (this.host.pause) { this.host.pause(); } }, resume: function() { if (this.host.resume) { this.host.resume(); } }, end: function() { if (this.host.end) { this.host.end(); } this._resolve(true); }, cancel: function() { if (this.host.cancel) { this.host.cancel(); } this._resolve(false); }, complete: function(response) { var self = this; if (self._state === INITIAL_STATE) { self._state = DONE_PENDING_STATE; self._tick(function() { self._resolve(response); }); } }, _resolve: function(response) { if (this._state !== DONE_COMPLETE_STATE) { forEach(this._doneCallbacks, function(fn) { fn(response); }); this._doneCallbacks.length = 0; this._state = DONE_COMPLETE_STATE; } } }; return AnimateRunner; }]; }; /** * @ngdoc service * @name $animateCss * @kind object * * @description * This is the core version of `$animateCss`. By default, only when the `ngAnimate` is included, * then the `$animateCss` service will actually perform animations. * * Click here {@link ngAnimate.$animateCss to read the documentation for $animateCss}. */ var $CoreAnimateCssProvider = function() { this.$get = ['$$rAF', '$q', '$$AnimateRunner', function($$rAF, $q, $$AnimateRunner) { return function(element, initialOptions) { // all of the animation functions should create // a copy of the options data, however, if a // parent service has already created a copy then // we should stick to using that var options = initialOptions || {}; if (!options.$$prepared) { options = copy(options); } // there is no point in applying the styles since // there is no animation that goes on at all in // this version of $animateCss. if (options.cleanupStyles) { options.from = options.to = null; } if (options.from) { element.css(options.from); options.from = null; } /* jshint newcap: false */ var closed, runner = new $$AnimateRunner(); return { start: run, end: run }; function run() { $$rAF(function() { applyAnimationContents(); if (!closed) { runner.complete(); } closed = true; }); return runner; } function applyAnimationContents() { if (options.addClass) { element.addClass(options.addClass); options.addClass = null; } if (options.removeClass) { element.removeClass(options.removeClass); options.removeClass = null; } if (options.to) { element.css(options.to); options.to = null; } } }; }]; }; /* global stripHash: true */ /** * ! This is a private undocumented service ! * * @name $browser * @requires $log * @description * This object has two goals: * * - hide all the global state in the browser caused by the window object * - abstract away all the browser specific features and inconsistencies * * For tests we provide {@link ngMock.$browser mock implementation} of the `$browser` * service, which can be used for convenient testing of the application without the interaction with * the real browser apis. */ /** * @param {object} window The global window object. * @param {object} document jQuery wrapped document. * @param {object} $log window.console or an object with the same interface. * @param {object} $sniffer $sniffer service */ function Browser(window, document, $log, $sniffer) { var self = this, location = window.location, history = window.history, setTimeout = window.setTimeout, clearTimeout = window.clearTimeout, pendingDeferIds = {}; self.isMock = false; var outstandingRequestCount = 0; var outstandingRequestCallbacks = []; // TODO(user): remove this temporary api self.$$completeOutstandingRequest = completeOutstandingRequest; self.$$incOutstandingRequestCount = function() { outstandingRequestCount++; }; /** * Executes the `fn` function(supports currying) and decrements the `outstandingRequestCallbacks` * counter. If the counter reaches 0, all the `outstandingRequestCallbacks` are executed. */ function completeOutstandingRequest(fn) { try { fn.apply(null, sliceArgs(arguments, 1)); } finally { outstandingRequestCount--; if (outstandingRequestCount === 0) { while (outstandingRequestCallbacks.length) { try { outstandingRequestCallbacks.pop()(); } catch (e) { $log.error(e); } } } } } function getHash(url) { var index = url.indexOf('#'); return index === -1 ? '' : url.substr(index); } /** * @private * Note: this method is used only by scenario runner * TODO(user): prefix this method with $$ ? * @param {function()} callback Function that will be called when no outstanding request */ self.notifyWhenNoOutstandingRequests = function(callback) { if (outstandingRequestCount === 0) { callback(); } else { outstandingRequestCallbacks.push(callback); } }; ////////////////////////////////////////////////////////////// // URL API ////////////////////////////////////////////////////////////// var cachedState, lastHistoryState, lastBrowserUrl = location.href, baseElement = document.find('base'), pendingLocation = null, getCurrentState = !$sniffer.history ? noop : function getCurrentState() { try { return history.state; } catch (e) { // MSIE can reportedly throw when there is no state (UNCONFIRMED). } }; cacheState(); lastHistoryState = cachedState; /** * @name $browser#url * * @description * GETTER: * Without any argument, this method just returns current value of location.href. * * SETTER: * With at least one argument, this method sets url to new value. * If html5 history api supported, pushState/replaceState is used, otherwise * location.href/location.replace is used. * Returns its own instance to allow chaining * * NOTE: this api is intended for use only by the $location service. Please use the * {@link ng.$location $location service} to change url. * * @param {string} url New url (when used as setter) * @param {boolean=} replace Should new url replace current history record? * @param {object=} state object to use with pushState/replaceState */ self.url = function(url, replace, state) { // In modern browsers `history.state` is `null` by default; treating it separately // from `undefined` would cause `$browser.url('/foo')` to change `history.state` // to undefined via `pushState`. Instead, let's change `undefined` to `null` here. if (isUndefined(state)) { state = null; } // Android Browser BFCache causes location, history reference to become stale. if (location !== window.location) location = window.location; if (history !== window.history) history = window.history; // setter if (url) { var sameState = lastHistoryState === state; // Don't change anything if previous and current URLs and states match. This also prevents // IE<10 from getting into redirect loop when in LocationHashbangInHtml5Url mode. // See https://github.com/angular/angular.js/commit/ffb2701 if (lastBrowserUrl === url && (!$sniffer.history || sameState)) { return self; } var sameBase = lastBrowserUrl && stripHash(lastBrowserUrl) === stripHash(url); lastBrowserUrl = url; lastHistoryState = state; // Don't use history API if only the hash changed // due to a bug in IE10/IE11 which leads // to not firing a `hashchange` nor `popstate` event // in some cases (see #9143). if ($sniffer.history && (!sameBase || !sameState)) { history[replace ? 'replaceState' : 'pushState'](state, '', url); cacheState(); // Do the assignment again so that those two variables are referentially identical. lastHistoryState = cachedState; } else { if (!sameBase) { pendingLocation = url; } if (replace) { location.replace(url); } else if (!sameBase) { location.href = url; } else { location.hash = getHash(url); } if (location.href !== url) { pendingLocation = url; } } if (pendingLocation) { pendingLocation = url; } return self; // getter } else { // - pendingLocation is needed as browsers don't allow to read out // the new location.href if a reload happened or if there is a bug like in iOS 9 (see // https://openradar.appspot.com/22186109). // - the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172 return pendingLocation || location.href.replace(/%27/g,"'"); } }; /** * @name $browser#state * * @description * This method is a getter. * * Return history.state or null if history.state is undefined. * * @returns {object} state */ self.state = function() { return cachedState; }; var urlChangeListeners = [], urlChangeInit = false; function cacheStateAndFireUrlChange() { pendingLocation = null; cacheState(); fireUrlChange(); } // This variable should be used *only* inside the cacheState function. var lastCachedState = null; function cacheState() { // This should be the only place in $browser where `history.state` is read. cachedState = getCurrentState(); cachedState = isUndefined(cachedState) ? null : cachedState; // Prevent callbacks fo fire twice if both hashchange & popstate were fired. if (equals(cachedState, lastCachedState)) { cachedState = lastCachedState; } lastCachedState = cachedState; } function fireUrlChange() { if (lastBrowserUrl === self.url() && lastHistoryState === cachedState) { return; } lastBrowserUrl = self.url(); lastHistoryState = cachedState; forEach(urlChangeListeners, function(listener) { listener(self.url(), cachedState); }); } /** * @name $browser#onUrlChange * * @description * Register callback function that will be called, when url changes. * * It's only called when the url is changed from outside of angular: * - user types different url into address bar * - user clicks on history (forward/back) button * - user clicks on a link * * It's not called when url is changed by $browser.url() method * * The listener gets called with new url as parameter. * * NOTE: this api is intended for use only by the $location service. Please use the * {@link ng.$location $location service} to monitor url changes in angular apps. * * @param {function(string)} listener Listener function to be called when url changes. * @return {function(string)} Returns the registered listener fn - handy if the fn is anonymous. */ self.onUrlChange = function(callback) { // TODO(user): refactor to use node's syntax for events if (!urlChangeInit) { // We listen on both (hashchange/popstate) when available, as some browsers (e.g. Opera) // don't fire popstate when user change the address bar and don't fire hashchange when url // changed by push/replaceState // html5 history api - popstate event if ($sniffer.history) jqLite(window).on('popstate', cacheStateAndFireUrlChange); // hashchange event jqLite(window).on('hashchange', cacheStateAndFireUrlChange); urlChangeInit = true; } urlChangeListeners.push(callback); return callback; }; /** * @private * Remove popstate and hashchange handler from window. * * NOTE: this api is intended for use only by $rootScope. */ self.$$applicationDestroyed = function() { jqLite(window).off('hashchange popstate', cacheStateAndFireUrlChange); }; /** * Checks whether the url has changed outside of Angular. * Needs to be exported to be able to check for changes that have been done in sync, * as hashchange/popstate events fire in async. */ self.$$checkUrlChange = fireUrlChange; ////////////////////////////////////////////////////////////// // Misc API ////////////////////////////////////////////////////////////// /** * @name $browser#baseHref * * @description * Returns current * (always relative - without domain) * * @returns {string} The current base href */ self.baseHref = function() { var href = baseElement.attr('href'); return href ? href.replace(/^(https?\:)?\/\/[^\/]*/, '') : ''; }; /** * @name $browser#defer * @param {function()} fn A function, who's execution should be deferred. * @param {number=} [delay=0] of milliseconds to defer the function execution. * @returns {*} DeferId that can be used to cancel the task via `$browser.defer.cancel()`. * * @description * Executes a fn asynchronously via `setTimeout(fn, delay)`. * * Unlike when calling `setTimeout` directly, in test this function is mocked and instead of using * `setTimeout` in tests, the fns are queued in an array, which can be programmatically flushed * via `$browser.defer.flush()`. * */ self.defer = function(fn, delay) { var timeoutId; outstandingRequestCount++; timeoutId = setTimeout(function() { delete pendingDeferIds[timeoutId]; completeOutstandingRequest(fn); }, delay || 0); pendingDeferIds[timeoutId] = true; return timeoutId; }; /** * @name $browser#defer.cancel * * @description * Cancels a deferred task identified with `deferId`. * * @param {*} deferId Token returned by the `$browser.defer` function. * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully * canceled. */ self.defer.cancel = function(deferId) { if (pendingDeferIds[deferId]) { delete pendingDeferIds[deferId]; clearTimeout(deferId); completeOutstandingRequest(noop); return true; } return false; }; } function $BrowserProvider() { this.$get = ['$window', '$log', '$sniffer', '$document', function($window, $log, $sniffer, $document) { return new Browser($window, $document, $log, $sniffer); }]; } /** * @ngdoc service * @name $cacheFactory * * @description * Factory that constructs {@link $cacheFactory.Cache Cache} objects and gives access to * them. * * ```js * * var cache = $cacheFactory('cacheId'); * expect($cacheFactory.get('cacheId')).toBe(cache); * expect($cacheFactory.get('noSuchCacheId')).not.toBeDefined(); * * cache.put("key", "value"); * cache.put("another key", "another value"); * * // We've specified no options on creation * expect(cache.info()).toEqual({id: 'cacheId', size: 2}); * * ``` * * * @param {string} cacheId Name or id of the newly created cache. * @param {object=} options Options object that specifies the cache behavior. Properties: * * - `{number=}` `capacity` — turns the cache into LRU cache. * * @returns {object} Newly created cache object with the following set of methods: * * - `{object}` `info()` — Returns id, size, and options of cache. * - `{{*}}` `put({string} key, {*} value)` — Puts a new key-value pair into the cache and returns * it. * - `{{*}}` `get({string} key)` — Returns cached value for `key` or undefined for cache miss. * - `{void}` `remove({string} key)` — Removes a key-value pair from the cache. * - `{void}` `removeAll()` — Removes all cached values. * - `{void}` `destroy()` — Removes references to this cache from $cacheFactory. * * @example

Cached Values

:

Cache Info

:
angular.module('cacheExampleApp', []). controller('CacheController', ['$scope', '$cacheFactory', function($scope, $cacheFactory) { $scope.keys = []; $scope.cache = $cacheFactory('cacheId'); $scope.put = function(key, value) { if (angular.isUndefined($scope.cache.get(key))) { $scope.keys.push(key); } $scope.cache.put(key, angular.isUndefined(value) ? null : value); }; }]); p { margin: 10px 0 3px; }
*/ function $CacheFactoryProvider() { this.$get = function() { var caches = {}; function cacheFactory(cacheId, options) { if (cacheId in caches) { throw minErr('$cacheFactory')('iid', "CacheId '{0}' is already taken!", cacheId); } var size = 0, stats = extend({}, options, {id: cacheId}), data = createMap(), capacity = (options && options.capacity) || Number.MAX_VALUE, lruHash = createMap(), freshEnd = null, staleEnd = null; /** * @ngdoc type * @name $cacheFactory.Cache * * @description * A cache object used to store and retrieve data, primarily used by * {@link $http $http} and the {@link ng.directive:script script} directive to cache * templates and other data. * * ```js * angular.module('superCache') * .factory('superCache', ['$cacheFactory', function($cacheFactory) { * return $cacheFactory('super-cache'); * }]); * ``` * * Example test: * * ```js * it('should behave like a cache', inject(function(superCache) { * superCache.put('key', 'value'); * superCache.put('another key', 'another value'); * * expect(superCache.info()).toEqual({ * id: 'super-cache', * size: 2 * }); * * superCache.remove('another key'); * expect(superCache.get('another key')).toBeUndefined(); * * superCache.removeAll(); * expect(superCache.info()).toEqual({ * id: 'super-cache', * size: 0 * }); * })); * ``` */ return caches[cacheId] = { /** * @ngdoc method * @name $cacheFactory.Cache#put * @kind function * * @description * Inserts a named entry into the {@link $cacheFactory.Cache Cache} object to be * retrieved later, and incrementing the size of the cache if the key was not already * present in the cache. If behaving like an LRU cache, it will also remove stale * entries from the set. * * It will not insert undefined values into the cache. * * @param {string} key the key under which the cached data is stored. * @param {*} value the value to store alongside the key. If it is undefined, the key * will not be stored. * @returns {*} the value stored. */ put: function(key, value) { if (isUndefined(value)) return; if (capacity < Number.MAX_VALUE) { var lruEntry = lruHash[key] || (lruHash[key] = {key: key}); refresh(lruEntry); } if (!(key in data)) size++; data[key] = value; if (size > capacity) { this.remove(staleEnd.key); } return value; }, /** * @ngdoc method * @name $cacheFactory.Cache#get * @kind function * * @description * Retrieves named data stored in the {@link $cacheFactory.Cache Cache} object. * * @param {string} key the key of the data to be retrieved * @returns {*} the value stored. */ get: function(key) { if (capacity < Number.MAX_VALUE) { var lruEntry = lruHash[key]; if (!lruEntry) return; refresh(lruEntry); } return data[key]; }, /** * @ngdoc method * @name $cacheFactory.Cache#remove * @kind function * * @description * Removes an entry from the {@link $cacheFactory.Cache Cache} object. * * @param {string} key the key of the entry to be removed */ remove: function(key) { if (capacity < Number.MAX_VALUE) { var lruEntry = lruHash[key]; if (!lruEntry) return; if (lruEntry == freshEnd) freshEnd = lruEntry.p; if (lruEntry == staleEnd) staleEnd = lruEntry.n; link(lruEntry.n,lruEntry.p); delete lruHash[key]; } if (!(key in data)) return; delete data[key]; size--; }, /** * @ngdoc method * @name $cacheFactory.Cache#removeAll * @kind function * * @description * Clears the cache object of any entries. */ removeAll: function() { data = createMap(); size = 0; lruHash = createMap(); freshEnd = staleEnd = null; }, /** * @ngdoc method * @name $cacheFactory.Cache#destroy * @kind function * * @description * Destroys the {@link $cacheFactory.Cache Cache} object entirely, * removing it from the {@link $cacheFactory $cacheFactory} set. */ destroy: function() { data = null; stats = null; lruHash = null; delete caches[cacheId]; }, /** * @ngdoc method * @name $cacheFactory.Cache#info * @kind function * * @description * Retrieve information regarding a particular {@link $cacheFactory.Cache Cache}. * * @returns {object} an object with the following properties: *
    *
  • **id**: the id of the cache instance
  • *
  • **size**: the number of entries kept in the cache instance
  • *
  • **...**: any additional properties from the options object when creating the * cache.
  • *
*/ info: function() { return extend({}, stats, {size: size}); } }; /** * makes the `entry` the freshEnd of the LRU linked list */ function refresh(entry) { if (entry != freshEnd) { if (!staleEnd) { staleEnd = entry; } else if (staleEnd == entry) { staleEnd = entry.n; } link(entry.n, entry.p); link(entry, freshEnd); freshEnd = entry; freshEnd.n = null; } } /** * bidirectionally links two entries of the LRU linked list */ function link(nextEntry, prevEntry) { if (nextEntry != prevEntry) { if (nextEntry) nextEntry.p = prevEntry; //p stands for previous, 'prev' didn't minify if (prevEntry) prevEntry.n = nextEntry; //n stands for next, 'next' didn't minify } } } /** * @ngdoc method * @name $cacheFactory#info * * @description * Get information about all the caches that have been created * * @returns {Object} - key-value map of `cacheId` to the result of calling `cache#info` */ cacheFactory.info = function() { var info = {}; forEach(caches, function(cache, cacheId) { info[cacheId] = cache.info(); }); return info; }; /** * @ngdoc method * @name $cacheFactory#get * * @description * Get access to a cache object by the `cacheId` used when it was created. * * @param {string} cacheId Name or id of a cache to access. * @returns {object} Cache object identified by the cacheId or undefined if no such cache. */ cacheFactory.get = function(cacheId) { return caches[cacheId]; }; return cacheFactory; }; } /** * @ngdoc service * @name $templateCache * * @description * The first time a template is used, it is loaded in the template cache for quick retrieval. You * can load templates directly into the cache in a `script` tag, or by consuming the * `$templateCache` service directly. * * Adding via the `script` tag: * * ```html * * ``` * * **Note:** the `script` tag containing the template does not need to be included in the `head` of * the document, but it must be a descendent of the {@link ng.$rootElement $rootElement} (IE, * element with ng-app attribute), otherwise the template will be ignored. * * Adding via the `$templateCache` service: * * ```js * var myApp = angular.module('myApp', []); * myApp.run(function($templateCache) { * $templateCache.put('templateId.html', 'This is the content of the template'); * }); * ``` * * To retrieve the template later, simply use it in your HTML: * ```html *
* ``` * * or get it via Javascript: * ```js * $templateCache.get('templateId.html') * ``` * * See {@link ng.$cacheFactory $cacheFactory}. * */ function $TemplateCacheProvider() { this.$get = ['$cacheFactory', function($cacheFactory) { return $cacheFactory('templates'); }]; } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Any commits to this file should be reviewed with security in mind. * * Changes to this file can potentially create security vulnerabilities. * * An approval from 2 Core members with history of modifying * * this file is required. * * * * Does the change somehow allow for arbitrary javascript to be executed? * * Or allows for someone to change the prototype of built-in objects? * * Or gives undesired access to variables likes document or window? * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* ! VARIABLE/FUNCTION NAMING CONVENTIONS THAT APPLY TO THIS FILE! * * DOM-related variables: * * - "node" - DOM Node * - "element" - DOM Element or Node * - "$node" or "$element" - jqLite-wrapped node or element * * * Compiler related stuff: * * - "linkFn" - linking fn of a single directive * - "nodeLinkFn" - function that aggregates all linking fns for a particular node * - "childLinkFn" - function that aggregates all linking fns for child nodes of a particular node * - "compositeLinkFn" - function that aggregates all linking fns for a compilation root (nodeList) */ /** * @ngdoc service * @name $compile * @kind function * * @description * Compiles an HTML string or DOM into a template and produces a template function, which * can then be used to link {@link ng.$rootScope.Scope `scope`} and the template together. * * The compilation is a process of walking the DOM tree and matching DOM elements to * {@link ng.$compileProvider#directive directives}. * *
* **Note:** This document is an in-depth reference of all directive options. * For a gentle introduction to directives with examples of common use cases, * see the {@link guide/directive directive guide}. *
* * ## Comprehensive Directive API * * There are many different options for a directive. * * The difference resides in the return value of the factory function. * You can either return a "Directive Definition Object" (see below) that defines the directive properties, * or just the `postLink` function (all other properties will have the default values). * *
* **Best Practice:** It's recommended to use the "directive definition object" form. *
* * Here's an example directive declared with a Directive Definition Object: * * ```js * var myModule = angular.module(...); * * myModule.directive('directiveName', function factory(injectables) { * var directiveDefinitionObject = { * priority: 0, * template: '
', // or // function(tElement, tAttrs) { ... }, * // or * // templateUrl: 'directive.html', // or // function(tElement, tAttrs) { ... }, * transclude: false, * restrict: 'A', * templateNamespace: 'html', * scope: false, * controller: function($scope, $element, $attrs, $transclude, otherInjectables) { ... }, * controllerAs: 'stringIdentifier', * bindToController: false, * require: 'siblingDirectiveName', // or // ['^parentDirectiveName', '?optionalDirectiveName', '?^optionalParent'], * compile: function compile(tElement, tAttrs, transclude) { * return { * pre: function preLink(scope, iElement, iAttrs, controller) { ... }, * post: function postLink(scope, iElement, iAttrs, controller) { ... } * } * // or * // return function postLink( ... ) { ... } * }, * // or * // link: { * // pre: function preLink(scope, iElement, iAttrs, controller) { ... }, * // post: function postLink(scope, iElement, iAttrs, controller) { ... } * // } * // or * // link: function postLink( ... ) { ... } * }; * return directiveDefinitionObject; * }); * ``` * *
* **Note:** Any unspecified options will use the default value. You can see the default values below. *
* * Therefore the above can be simplified as: * * ```js * var myModule = angular.module(...); * * myModule.directive('directiveName', function factory(injectables) { * var directiveDefinitionObject = { * link: function postLink(scope, iElement, iAttrs) { ... } * }; * return directiveDefinitionObject; * // or * // return function postLink(scope, iElement, iAttrs) { ... } * }); * ``` * * * * ### Directive Definition Object * * The directive definition object provides instructions to the {@link ng.$compile * compiler}. The attributes are: * * #### `multiElement` * When this property is set to true, the HTML compiler will collect DOM nodes between * nodes with the attributes `directive-name-start` and `directive-name-end`, and group them * together as the directive elements. It is recommended that this feature be used on directives * which are not strictly behavioral (such as {@link ngClick}), and which * do not manipulate or replace child nodes (such as {@link ngInclude}). * * #### `priority` * When there are multiple directives defined on a single DOM element, sometimes it * is necessary to specify the order in which the directives are applied. The `priority` is used * to sort the directives before their `compile` functions get called. Priority is defined as a * number. Directives with greater numerical `priority` are compiled first. Pre-link functions * are also run in priority order, but post-link functions are run in reverse order. The order * of directives with the same priority is undefined. The default priority is `0`. * * #### `terminal` * If set to true then the current `priority` will be the last set of directives * which will execute (any directives at the current priority will still execute * as the order of execution on same `priority` is undefined). Note that expressions * and other directives used in the directive's template will also be excluded from execution. * * #### `scope` * The scope property can be `true`, an object or a falsy value: * * * **falsy:** No scope will be created for the directive. The directive will use its parent's scope. * * * **`true`:** A new child scope that prototypically inherits from its parent will be created for * the directive's element. If multiple directives on the same element request a new scope, * only one new scope is created. The new scope rule does not apply for the root of the template * since the root of the template always gets a new scope. * * * **`{...}` (an object hash):** A new "isolate" scope is created for the directive's element. The * 'isolate' scope differs from normal scope in that it does not prototypically inherit from its parent * scope. This is useful when creating reusable components, which should not accidentally read or modify * data in the parent scope. * * The 'isolate' scope object hash defines a set of local scope properties derived from attributes on the * directive's element. These local properties are useful for aliasing values for templates. The keys in * the object hash map to the name of the property on the isolate scope; the values define how the property * is bound to the parent scope, via matching attributes on the directive's element: * * * `@` or `@attr` - bind a local scope property to the value of DOM attribute. The result is * always a string since DOM attributes are strings. If no `attr` name is specified then the * attribute name is assumed to be the same as the local name. Given `` and the isolate scope definition `scope: { localName:'@myAttr' }`, * the directive's scope property `localName` will reflect the interpolated value of `hello * {{name}}`. As the `name` attribute changes so will the `localName` property on the directive's * scope. The `name` is read from the parent scope (not the directive's scope). * * * `=` or `=attr` - set up a bidirectional binding between a local scope property and an expression * passed via the attribute `attr`. The expression is evaluated in the context of the parent scope. * If no `attr` name is specified then the attribute name is assumed to be the same as the local * name. Given `` and the isolate scope definition `scope: { * localModel: '=myAttr' }`, the property `localModel` on the directive's scope will reflect the * value of `parentModel` on the parent scope. Changes to `parentModel` will be reflected in * `localModel` and vice versa. Optional attributes should be marked as such with a question mark: * `=?` or `=?attr`. If the binding expression is non-assignable, or if the attribute isn't * optional and doesn't exist, an exception ({@link error/$compile/nonassign `$compile:nonassign`}) * will be thrown upon discovering changes to the local value, since it will be impossible to sync * them back to the parent scope. By default, the {@link ng.$rootScope.Scope#$watch `$watch`} * method is used for tracking changes, and the equality check is based on object identity. * However, if an object literal or an array literal is passed as the binding expression, the * equality check is done by value (using the {@link angular.equals} function). It's also possible * to watch the evaluated value shallowly with {@link ng.$rootScope.Scope#$watchCollection * `$watchCollection`}: use `=*` or `=*attr` (`=*?` or `=*?attr` if the attribute is optional). * * * `<` or `` and directive definition of * `scope: { localModel:'` and the isolate scope definition `scope: { * localFn:'&myAttr' }`, the isolate scope property `localFn` will point to a function wrapper for * the `count = count + value` expression. Often it's desirable to pass data from the isolated scope * via an expression to the parent scope. This can be done by passing a map of local variable names * and values into the expression wrapper fn. For example, if the expression is `increment(amount)` * then we can specify the amount value by calling the `localFn` as `localFn({amount: 22})`. * * In general it's possible to apply more than one directive to one element, but there might be limitations * depending on the type of scope required by the directives. The following points will help explain these limitations. * For simplicity only two directives are taken into account, but it is also applicable for several directives: * * * **no scope** + **no scope** => Two directives which don't require their own scope will use their parent's scope * * **child scope** + **no scope** => Both directives will share one single child scope * * **child scope** + **child scope** => Both directives will share one single child scope * * **isolated scope** + **no scope** => The isolated directive will use it's own created isolated scope. The other directive will use * its parent's scope * * **isolated scope** + **child scope** => **Won't work!** Only one scope can be related to one element. Therefore these directives cannot * be applied to the same element. * * **isolated scope** + **isolated scope** => **Won't work!** Only one scope can be related to one element. Therefore these directives * cannot be applied to the same element. * * * #### `bindToController` * This property is used to bind scope properties directly to the controller. It can be either * `true` or an object hash with the same format as the `scope` property. Additionally, a controller * alias must be set, either by using `controllerAs: 'myAlias'` or by specifying the alias in the controller * definition: `controller: 'myCtrl as myAlias'`. * * When an isolate scope is used for a directive (see above), `bindToController: true` will * allow a component to have its properties bound to the controller, rather than to scope. * * After the controller is instantiated, the initial values of the isolate scope bindings will be bound to the controller * properties. You can access these bindings once they have been initialized by providing a controller method called * `$onInit`, which is called after all the controllers on an element have been constructed and had their bindings * initialized. * *
* **Deprecation warning:** although bindings for non-ES6 class controllers are currently * bound to `this` before the controller constructor is called, this use is now deprecated. Please place initialization * code that relies upon bindings inside a `$onInit` method on the controller, instead. *
* * It is also possible to set `bindToController` to an object hash with the same format as the `scope` property. * This will set up the scope bindings to the controller directly. Note that `scope` can still be used * to define which kind of scope is created. By default, no scope is created. Use `scope: {}` to create an isolate * scope (useful for component directives). * * If both `bindToController` and `scope` are defined and have object hashes, `bindToController` overrides `scope`. * * * #### `controller` * Controller constructor function. The controller is instantiated before the * pre-linking phase and can be accessed by other directives (see * `require` attribute). This allows the directives to communicate with each other and augment * each other's behavior. The controller is injectable (and supports bracket notation) with the following locals: * * * `$scope` - Current scope associated with the element * * `$element` - Current element * * `$attrs` - Current attributes object for the element * * `$transclude` - A transclude linking function pre-bound to the correct transclusion scope: * `function([scope], cloneLinkingFn, futureParentElement, slotName)`: * * `scope`: (optional) override the scope. * * `cloneLinkingFn`: (optional) argument to create clones of the original transcluded content. * * `futureParentElement` (optional): * * defines the parent to which the `cloneLinkingFn` will add the cloned elements. * * default: `$element.parent()` resp. `$element` for `transclude:'element'` resp. `transclude:true`. * * only needed for transcludes that are allowed to contain non html elements (e.g. SVG elements) * and when the `cloneLinkinFn` is passed, * as those elements need to created and cloned in a special way when they are defined outside their * usual containers (e.g. like ``). * * See also the `directive.templateNamespace` property. * * `slotName`: (optional) the name of the slot to transclude. If falsy (e.g. `null`, `undefined` or `''`) * then the default translusion is provided. * The `$transclude` function also has a method on it, `$transclude.isSlotFilled(slotName)`, which returns * `true` if the specified slot contains content (i.e. one or more DOM nodes). * * The controller can provide the following methods that act as life-cycle hooks: * * `$onInit()` - Called on each controller after all the controllers on an element have been constructed and * had their bindings initialized (and before the pre & post linking functions for the directives on * this element). This is a good place to put initialization code for your controller. * * `$onChanges(changesObj)` - Called whenever one-way (`<`) or interpolation (`@`) bindings are updated. The * `changesObj` is a hash whose keys are the names of the bound properties that have changed, and the values are an * object of the form `{ currentValue, previousValue, isFirstChange() }`. Use this hook to trigger updates within a * component such as cloning the bound value to prevent accidental mutation of the outer value. * * `$onDestroy()` - Called on a controller when its containing scope is destroyed. Use this hook for releasing * external resources, watches and event handlers. Note that components have their `$onDestroy()` hooks called in * the same order as the `$scope.$broadcast` events are triggered, which is top down. This means that parent * components will have their `$onDestroy()` hook called before child components. * * `$postLink()` - Called after this controller's element and its children have been linked. Similar to the post-link * function this hook can be used to set up DOM event handlers and do direct DOM manipulation. * Note that child elements that contain `templateUrl` directives will not have been compiled and linked since * they are waiting for their template to load asynchronously and their own compilation and linking has been * suspended until that occurs. * * * #### `require` * Require another directive and inject its controller as the fourth argument to the linking function. The * `require` property can be a string, an array or an object: * * a **string** containing the name of the directive to pass to the linking function * * an **array** containing the names of directives to pass to the linking function. The argument passed to the * linking function will be an array of controllers in the same order as the names in the `require` property * * an **object** whose property values are the names of the directives to pass to the linking function. The argument * passed to the linking function will also be an object with matching keys, whose values will hold the corresponding * controllers. * * If the `require` property is an object and `bindToController` is truthy, then the required controllers are * bound to the controller using the keys of the `require` property. This binding occurs after all the controllers * have been constructed but before `$onInit` is called. * If the name of the required controller is the same as the local name (the key), the name can be * omitted. For example, `{parentDir: '^^'}` is equivalent to `{parentDir: '^^parentDir'}`. * See the {@link $compileProvider#component} helper for an example of how this can be used. * If no such required directive(s) can be found, or if the directive does not have a controller, then an error is * raised (unless no link function is specified and the required controllers are not being bound to the directive * controller, in which case error checking is skipped). The name can be prefixed with: * * * (no prefix) - Locate the required controller on the current element. Throw an error if not found. * * `?` - Attempt to locate the required controller or pass `null` to the `link` fn if not found. * * `^` - Locate the required controller by searching the element and its parents. Throw an error if not found. * * `^^` - Locate the required controller by searching the element's parents. Throw an error if not found. * * `?^` - Attempt to locate the required controller by searching the element and its parents or pass * `null` to the `link` fn if not found. * * `?^^` - Attempt to locate the required controller by searching the element's parents, or pass * `null` to the `link` fn if not found. * * * #### `controllerAs` * Identifier name for a reference to the controller in the directive's scope. * This allows the controller to be referenced from the directive template. This is especially * useful when a directive is used as component, i.e. with an `isolate` scope. It's also possible * to use it in a directive without an `isolate` / `new` scope, but you need to be aware that the * `controllerAs` reference might overwrite a property that already exists on the parent scope. * * * #### `restrict` * String of subset of `EACM` which restricts the directive to a specific directive * declaration style. If omitted, the defaults (elements and attributes) are used. * * * `E` - Element name (default): `` * * `A` - Attribute (default): `
` * * `C` - Class: `
` * * `M` - Comment: `` * * * #### `templateNamespace` * String representing the document type used by the markup in the template. * AngularJS needs this information as those elements need to be created and cloned * in a special way when they are defined outside their usual containers like `` and ``. * * * `html` - All root nodes in the template are HTML. Root nodes may also be * top-level elements such as `` or ``. * * `svg` - The root nodes in the template are SVG elements (excluding ``). * * `math` - The root nodes in the template are MathML elements (excluding ``). * * If no `templateNamespace` is specified, then the namespace is considered to be `html`. * * #### `template` * HTML markup that may: * * Replace the contents of the directive's element (default). * * Replace the directive's element itself (if `replace` is true - DEPRECATED). * * Wrap the contents of the directive's element (if `transclude` is true). * * Value may be: * * * A string. For example `
{{delete_str}}
`. * * A function which takes two arguments `tElement` and `tAttrs` (described in the `compile` * function api below) and returns a string value. * * * #### `templateUrl` * This is similar to `template` but the template is loaded from the specified URL, asynchronously. * * Because template loading is asynchronous the compiler will suspend compilation of directives on that element * for later when the template has been resolved. In the meantime it will continue to compile and link * sibling and parent elements as though this element had not contained any directives. * * The compiler does not suspend the entire compilation to wait for templates to be loaded because this * would result in the whole app "stalling" until all templates are loaded asynchronously - even in the * case when only one deeply nested directive has `templateUrl`. * * Template loading is asynchronous even if the template has been preloaded into the {@link $templateCache} * * You can specify `templateUrl` as a string representing the URL or as a function which takes two * arguments `tElement` and `tAttrs` (described in the `compile` function api below) and returns * a string value representing the url. In either case, the template URL is passed through {@link * $sce#getTrustedResourceUrl $sce.getTrustedResourceUrl}. * * * #### `replace` ([*DEPRECATED*!], will be removed in next major release - i.e. v2.0) * specify what the template should replace. Defaults to `false`. * * * `true` - the template will replace the directive's element. * * `false` - the template will replace the contents of the directive's element. * * The replacement process migrates all of the attributes / classes from the old element to the new * one. See the {@link guide/directive#template-expanding-directive * Directives Guide} for an example. * * There are very few scenarios where element replacement is required for the application function, * the main one being reusable custom components that are used within SVG contexts * (because SVG doesn't work with custom elements in the DOM tree). * * #### `transclude` * Extract the contents of the element where the directive appears and make it available to the directive. * The contents are compiled and provided to the directive as a **transclusion function**. See the * {@link $compile#transclusion Transclusion} section below. * * * #### `compile` * * ```js * function compile(tElement, tAttrs, transclude) { ... } * ``` * * The compile function deals with transforming the template DOM. Since most directives do not do * template transformation, it is not used often. The compile function takes the following arguments: * * * `tElement` - template element - The element where the directive has been declared. It is * safe to do template transformation on the element and child elements only. * * * `tAttrs` - template attributes - Normalized list of attributes declared on this element shared * between all directive compile functions. * * * `transclude` - [*DEPRECATED*!] A transclude linking function: `function(scope, cloneLinkingFn)` * *
* **Note:** The template instance and the link instance may be different objects if the template has * been cloned. For this reason it is **not** safe to do anything other than DOM transformations that * apply to all cloned DOM nodes within the compile function. Specifically, DOM listener registration * should be done in a linking function rather than in a compile function. *
*
* **Note:** The compile function cannot handle directives that recursively use themselves in their * own templates or compile functions. Compiling these directives results in an infinite loop and * stack overflow errors. * * This can be avoided by manually using $compile in the postLink function to imperatively compile * a directive's template instead of relying on automatic template compilation via `template` or * `templateUrl` declaration or manual compilation inside the compile function. *
* *
* **Note:** The `transclude` function that is passed to the compile function is deprecated, as it * e.g. does not know about the right outer scope. Please use the transclude function that is passed * to the link function instead. *
* A compile function can have a return value which can be either a function or an object. * * * returning a (post-link) function - is equivalent to registering the linking function via the * `link` property of the config object when the compile function is empty. * * * returning an object with function(s) registered via `pre` and `post` properties - allows you to * control when a linking function should be called during the linking phase. See info about * pre-linking and post-linking functions below. * * * #### `link` * This property is used only if the `compile` property is not defined. * * ```js * function link(scope, iElement, iAttrs, controller, transcludeFn) { ... } * ``` * * The link function is responsible for registering DOM listeners as well as updating the DOM. It is * executed after the template has been cloned. This is where most of the directive logic will be * put. * * * `scope` - {@link ng.$rootScope.Scope Scope} - The scope to be used by the * directive for registering {@link ng.$rootScope.Scope#$watch watches}. * * * `iElement` - instance element - The element where the directive is to be used. It is safe to * manipulate the children of the element only in `postLink` function since the children have * already been linked. * * * `iAttrs` - instance attributes - Normalized list of attributes declared on this element shared * between all directive linking functions. * * * `controller` - the directive's required controller instance(s) - Instances are shared * among all directives, which allows the directives to use the controllers as a communication * channel. The exact value depends on the directive's `require` property: * * no controller(s) required: the directive's own controller, or `undefined` if it doesn't have one * * `string`: the controller instance * * `array`: array of controller instances * * If a required controller cannot be found, and it is optional, the instance is `null`, * otherwise the {@link error:$compile:ctreq Missing Required Controller} error is thrown. * * Note that you can also require the directive's own controller - it will be made available like * any other controller. * * * `transcludeFn` - A transclude linking function pre-bound to the correct transclusion scope. * This is the same as the `$transclude` * parameter of directive controllers, see there for details. * `function([scope], cloneLinkingFn, futureParentElement)`. * * #### Pre-linking function * * Executed before the child elements are linked. Not safe to do DOM transformation since the * compiler linking function will fail to locate the correct elements for linking. * * #### Post-linking function * * Executed after the child elements are linked. * * Note that child elements that contain `templateUrl` directives will not have been compiled * and linked since they are waiting for their template to load asynchronously and their own * compilation and linking has been suspended until that occurs. * * It is safe to do DOM transformation in the post-linking function on elements that are not waiting * for their async templates to be resolved. * * * ### Transclusion * * Transclusion is the process of extracting a collection of DOM elements from one part of the DOM and * copying them to another part of the DOM, while maintaining their connection to the original AngularJS * scope from where they were taken. * * Transclusion is used (often with {@link ngTransclude}) to insert the * original contents of a directive's element into a specified place in the template of the directive. * The benefit of transclusion, over simply moving the DOM elements manually, is that the transcluded * content has access to the properties on the scope from which it was taken, even if the directive * has isolated scope. * See the {@link guide/directive#creating-a-directive-that-wraps-other-elements Directives Guide}. * * This makes it possible for the widget to have private state for its template, while the transcluded * content has access to its originating scope. * *
* **Note:** When testing an element transclude directive you must not place the directive at the root of the * DOM fragment that is being compiled. See {@link guide/unit-testing#testing-transclusion-directives * Testing Transclusion Directives}. *
* * There are three kinds of transclusion depending upon whether you want to transclude just the contents of the * directive's element, the entire element or multiple parts of the element contents: * * * `true` - transclude the content (i.e. the child nodes) of the directive's element. * * `'element'` - transclude the whole of the directive's element including any directives on this * element that defined at a lower priority than this directive. When used, the `template` * property is ignored. * * **`{...}` (an object hash):** - map elements of the content onto transclusion "slots" in the template. * * **Mult-slot transclusion** is declared by providing an object for the `transclude` property. * * This object is a map where the keys are the name of the slot to fill and the value is an element selector * used to match the HTML to the slot. The element selector should be in normalized form (e.g. `myElement`) * and will match the standard element variants (e.g. `my-element`, `my:element`, `data-my-element`, etc). * * For further information check out the guide on {@link guide/directive#matching-directives Matching Directives} * * If the element selector is prefixed with a `?` then that slot is optional. * * For example, the transclude object `{ slotA: '?myCustomElement' }` maps `` elements to * the `slotA` slot, which can be accessed via the `$transclude` function or via the {@link ngTransclude} directive. * * Slots that are not marked as optional (`?`) will trigger a compile time error if there are no matching elements * in the transclude content. If you wish to know if an optional slot was filled with content, then you can call * `$transclude.isSlotFilled(slotName)` on the transclude function passed to the directive's link function and * injectable into the directive's controller. * * * #### Transclusion Functions * * When a directive requests transclusion, the compiler extracts its contents and provides a **transclusion * function** to the directive's `link` function and `controller`. This transclusion function is a special * **linking function** that will return the compiled contents linked to a new transclusion scope. * *
* If you are just using {@link ngTransclude} then you don't need to worry about this function, since * ngTransclude will deal with it for us. *
* * If you want to manually control the insertion and removal of the transcluded content in your directive * then you must use this transclude function. When you call a transclude function it returns a a jqLite/JQuery * object that contains the compiled DOM, which is linked to the correct transclusion scope. * * When you call a transclusion function you can pass in a **clone attach function**. This function accepts * two parameters, `function(clone, scope) { ... }`, where the `clone` is a fresh compiled copy of your transcluded * content and the `scope` is the newly created transclusion scope, to which the clone is bound. * *
* **Best Practice**: Always provide a `cloneFn` (clone attach function) when you call a transclude function * since you then get a fresh clone of the original DOM and also have access to the new transclusion scope. *
* * It is normal practice to attach your transcluded content (`clone`) to the DOM inside your **clone * attach function**: * * ```js * var transcludedContent, transclusionScope; * * $transclude(function(clone, scope) { * element.append(clone); * transcludedContent = clone; * transclusionScope = scope; * }); * ``` * * Later, if you want to remove the transcluded content from your DOM then you should also destroy the * associated transclusion scope: * * ```js * transcludedContent.remove(); * transclusionScope.$destroy(); * ``` * *
* **Best Practice**: if you intend to add and remove transcluded content manually in your directive * (by calling the transclude function to get the DOM and calling `element.remove()` to remove it), * then you are also responsible for calling `$destroy` on the transclusion scope. *
* * The built-in DOM manipulation directives, such as {@link ngIf}, {@link ngSwitch} and {@link ngRepeat} * automatically destroy their transcluded clones as necessary so you do not need to worry about this if * you are simply using {@link ngTransclude} to inject the transclusion into your directive. * * * #### Transclusion Scopes * * When you call a transclude function it returns a DOM fragment that is pre-bound to a **transclusion * scope**. This scope is special, in that it is a child of the directive's scope (and so gets destroyed * when the directive's scope gets destroyed) but it inherits the properties of the scope from which it * was taken. * * For example consider a directive that uses transclusion and isolated scope. The DOM hierarchy might look * like this: * * ```html *
*
*
*
*
*
* ``` * * The `$parent` scope hierarchy will look like this: * ``` - $rootScope - isolate - transclusion ``` * * but the scopes will inherit prototypically from different scopes to their `$parent`. * ``` - $rootScope - transclusion - isolate ``` * * * ### Attributes * * The {@link ng.$compile.directive.Attributes Attributes} object - passed as a parameter in the * `link()` or `compile()` functions. It has a variety of uses. * * * *Accessing normalized attribute names:* Directives like 'ngBind' can be expressed in many ways: * 'ng:bind', `data-ng-bind`, or 'x-ng-bind'. The attributes object allows for normalized access * to the attributes. * * * *Directive inter-communication:* All directives share the same instance of the attributes * object which allows the directives to use the attributes object as inter directive * communication. * * * *Supports interpolation:* Interpolation attributes are assigned to the attribute object * allowing other directives to read the interpolated value. * * * *Observing interpolated attributes:* Use `$observe` to observe the value changes of attributes * that contain interpolation (e.g. `src="{{bar}}"`). Not only is this very efficient but it's also * the only way to easily get the actual value because during the linking phase the interpolation * hasn't been evaluated yet and so the value is at this time set to `undefined`. * * ```js * function linkingFn(scope, elm, attrs, ctrl) { * // get the attribute value * console.log(attrs.ngModel); * * // change the attribute * attrs.$set('ngModel', 'new value'); * * // observe changes to interpolated attribute * attrs.$observe('ngModel', function(value) { * console.log('ngModel has changed value to ' + value); * }); * } * ``` * * ## Example * *
* **Note**: Typically directives are registered with `module.directive`. The example below is * to illustrate how `$compile` works. *
*


it('should auto compile', function() { var textarea = $('textarea'); var output = $('div[compile]'); // The initial state reads 'Hello Angular'. expect(output.getText()).toBe('Hello Angular'); textarea.clear(); textarea.sendKeys('{{name}}!'); expect(output.getText()).toBe('Angular!'); });
* * * @param {string|DOMElement} element Element or HTML string to compile into a template function. * @param {function(angular.Scope, cloneAttachFn=)} transclude function available to directives - DEPRECATED. * *
* **Note:** Passing a `transclude` function to the $compile function is deprecated, as it * e.g. will not use the right outer scope. Please pass the transclude function as a * `parentBoundTranscludeFn` to the link function instead. *
* * @param {number} maxPriority only apply directives lower than given priority (Only effects the * root element(s), not their children) * @returns {function(scope, cloneAttachFn=, options=)} a link function which is used to bind template * (a DOM element/tree) to a scope. Where: * * * `scope` - A {@link ng.$rootScope.Scope Scope} to bind to. * * `cloneAttachFn` - If `cloneAttachFn` is provided, then the link function will clone the * `template` and call the `cloneAttachFn` function allowing the caller to attach the * cloned elements to the DOM document at the appropriate place. The `cloneAttachFn` is * called as:
`cloneAttachFn(clonedElement, scope)` where: * * * `clonedElement` - is a clone of the original `element` passed into the compiler. * * `scope` - is the current scope with which the linking function is working with. * * * `options` - An optional object hash with linking options. If `options` is provided, then the following * keys may be used to control linking behavior: * * * `parentBoundTranscludeFn` - the transclude function made available to * directives; if given, it will be passed through to the link functions of * directives found in `element` during compilation. * * `transcludeControllers` - an object hash with keys that map controller names * to a hash with the key `instance`, which maps to the controller instance; * if given, it will make the controllers available to directives on the compileNode: * ``` * { * parent: { * instance: parentControllerInstance * } * } * ``` * * `futureParentElement` - defines the parent to which the `cloneAttachFn` will add * the cloned elements; only needed for transcludes that are allowed to contain non html * elements (e.g. SVG elements). See also the directive.controller property. * * Calling the linking function returns the element of the template. It is either the original * element passed in, or the clone of the element if the `cloneAttachFn` is provided. * * After linking the view is not updated until after a call to $digest which typically is done by * Angular automatically. * * If you need access to the bound view, there are two ways to do it: * * - If you are not asking the linking function to clone the template, create the DOM element(s) * before you send them to the compiler and keep this reference around. * ```js * var element = $compile('

{{total}}

')(scope); * ``` * * - if on the other hand, you need the element to be cloned, the view reference from the original * example would not point to the clone, but rather to the original template that was cloned. In * this case, you can access the clone via the cloneAttachFn: * ```js * var templateElement = angular.element('

{{total}}

'), * scope = ....; * * var clonedElement = $compile(templateElement)(scope, function(clonedElement, scope) { * //attach the clone to DOM document at the right place * }); * * //now we have reference to the cloned DOM via `clonedElement` * ``` * * * For information on how the compiler works, see the * {@link guide/compiler Angular HTML Compiler} section of the Developer Guide. */ var $compileMinErr = minErr('$compile'); function UNINITIALIZED_VALUE() {} var _UNINITIALIZED_VALUE = new UNINITIALIZED_VALUE(); /** * @ngdoc provider * @name $compileProvider * * @description */ $CompileProvider.$inject = ['$provide', '$$sanitizeUriProvider']; function $CompileProvider($provide, $$sanitizeUriProvider) { var hasDirectives = {}, Suffix = 'Directive', COMMENT_DIRECTIVE_REGEXP = /^\s*directive\:\s*([\w\-]+)\s+(.*)$/, CLASS_DIRECTIVE_REGEXP = /(([\w\-]+)(?:\:([^;]+))?;?)/, ALL_OR_NOTHING_ATTRS = makeMap('ngSrc,ngSrcset,src,srcset'), REQUIRE_PREFIX_REGEXP = /^(?:(\^\^?)?(\?)?(\^\^?)?)?/; // Ref: http://developers.whatwg.org/webappapis.html#event-handler-idl-attributes // The assumption is that future DOM event attribute names will begin with // 'on' and be composed of only English letters. var EVENT_HANDLER_ATTR_REGEXP = /^(on[a-z]+|formaction)$/; var bindingCache = createMap(); function parseIsolateBindings(scope, directiveName, isController) { var LOCAL_REGEXP = /^\s*([@&<]|=(\*?))(\??)\s*(\w*)\s*$/; var bindings = createMap(); forEach(scope, function(definition, scopeName) { if (definition in bindingCache) { bindings[scopeName] = bindingCache[definition]; return; } var match = definition.match(LOCAL_REGEXP); if (!match) { throw $compileMinErr('iscp', "Invalid {3} for directive '{0}'." + " Definition: {... {1}: '{2}' ...}", directiveName, scopeName, definition, (isController ? "controller bindings definition" : "isolate scope definition")); } bindings[scopeName] = { mode: match[1][0], collection: match[2] === '*', optional: match[3] === '?', attrName: match[4] || scopeName }; if (match[4]) { bindingCache[definition] = bindings[scopeName]; } }); return bindings; } function parseDirectiveBindings(directive, directiveName) { var bindings = { isolateScope: null, bindToController: null }; if (isObject(directive.scope)) { if (directive.bindToController === true) { bindings.bindToController = parseIsolateBindings(directive.scope, directiveName, true); bindings.isolateScope = {}; } else { bindings.isolateScope = parseIsolateBindings(directive.scope, directiveName, false); } } if (isObject(directive.bindToController)) { bindings.bindToController = parseIsolateBindings(directive.bindToController, directiveName, true); } if (isObject(bindings.bindToController)) { var controller = directive.controller; var controllerAs = directive.controllerAs; if (!controller) { // There is no controller, there may or may not be a controllerAs property throw $compileMinErr('noctrl', "Cannot bind to controller without directive '{0}'s controller.", directiveName); } else if (!identifierForController(controller, controllerAs)) { // There is a controller, but no identifier or controllerAs property throw $compileMinErr('noident', "Cannot bind to controller without identifier for directive '{0}'.", directiveName); } } return bindings; } function assertValidDirectiveName(name) { var letter = name.charAt(0); if (!letter || letter !== lowercase(letter)) { throw $compileMinErr('baddir', "Directive/Component name '{0}' is invalid. The first character must be a lowercase letter", name); } if (name !== name.trim()) { throw $compileMinErr('baddir', "Directive/Component name '{0}' is invalid. The name should not contain leading or trailing whitespaces", name); } } function getDirectiveRequire(directive) { var require = directive.require || (directive.controller && directive.name); if (!isArray(require) && isObject(require)) { forEach(require, function(value, key) { var match = value.match(REQUIRE_PREFIX_REGEXP); var name = value.substring(match[0].length); if (!name) require[key] = match[0] + key; }); } return require; } /** * @ngdoc method * @name $compileProvider#directive * @kind function * * @description * Register a new directive with the compiler. * * @param {string|Object} name Name of the directive in camel-case (i.e. ngBind which * will match as ng-bind), or an object map of directives where the keys are the * names and the values are the factories. * @param {Function|Array} directiveFactory An injectable directive factory function. See the * {@link guide/directive directive guide} and the {@link $compile compile API} for more info. * @returns {ng.$compileProvider} Self for chaining. */ this.directive = function registerDirective(name, directiveFactory) { assertNotHasOwnProperty(name, 'directive'); if (isString(name)) { assertValidDirectiveName(name); assertArg(directiveFactory, 'directiveFactory'); if (!hasDirectives.hasOwnProperty(name)) { hasDirectives[name] = []; $provide.factory(name + Suffix, ['$injector', '$exceptionHandler', function($injector, $exceptionHandler) { var directives = []; forEach(hasDirectives[name], function(directiveFactory, index) { try { var directive = $injector.invoke(directiveFactory); if (isFunction(directive)) { directive = { compile: valueFn(directive) }; } else if (!directive.compile && directive.link) { directive.compile = valueFn(directive.link); } directive.priority = directive.priority || 0; directive.index = index; directive.name = directive.name || name; directive.require = getDirectiveRequire(directive); directive.restrict = directive.restrict || 'EA'; directive.$$moduleName = directiveFactory.$$moduleName; directives.push(directive); } catch (e) { $exceptionHandler(e); } }); return directives; }]); } hasDirectives[name].push(directiveFactory); } else { forEach(name, reverseParams(registerDirective)); } return this; }; /** * @ngdoc method * @name $compileProvider#component * @module ng * @param {string} name Name of the component in camelCase (i.e. `myComp` which will match ``) * @param {Object} options Component definition object (a simplified * {@link ng.$compile#directive-definition-object directive definition object}), * with the following properties (all optional): * * - `controller` – `{(string|function()=}` – controller constructor function that should be * associated with newly created scope or the name of a {@link ng.$compile#-controller- * registered controller} if passed as a string. An empty `noop` function by default. * - `controllerAs` – `{string=}` – identifier name for to reference the controller in the component's scope. * If present, the controller will be published to scope under the `controllerAs` name. * If not present, this will default to be `$ctrl`. * - `template` – `{string=|function()=}` – html template as a string or a function that * returns an html template as a string which should be used as the contents of this component. * Empty string by default. * * If `template` is a function, then it is {@link auto.$injector#invoke injected} with * the following locals: * * - `$element` - Current element * - `$attrs` - Current attributes object for the element * * - `templateUrl` – `{string=|function()=}` – path or function that returns a path to an html * template that should be used as the contents of this component. * * If `templateUrl` is a function, then it is {@link auto.$injector#invoke injected} with * the following locals: * * - `$element` - Current element * - `$attrs` - Current attributes object for the element * * - `bindings` – `{object=}` – defines bindings between DOM attributes and component properties. * Component properties are always bound to the component controller and not to the scope. * See {@link ng.$compile#-bindtocontroller- `bindToController`}. * - `transclude` – `{boolean=}` – whether {@link $compile#transclusion content transclusion} is enabled. * Disabled by default. * - `require` - `{Object=}` - requires the controllers of other directives and binds them to * this component's controller. The object keys specify the property names under which the required * controllers (object values) will be bound. See {@link ng.$compile#-require- `require`}. * - `$...` – additional properties to attach to the directive factory function and the controller * constructor function. (This is used by the component router to annotate) * * @returns {ng.$compileProvider} the compile provider itself, for chaining of function calls. * @description * Register a **component definition** with the compiler. This is a shorthand for registering a special * type of directive, which represents a self-contained UI component in your application. Such components * are always isolated (i.e. `scope: {}`) and are always restricted to elements (i.e. `restrict: 'E'`). * * Component definitions are very simple and do not require as much configuration as defining general * directives. Component definitions usually consist only of a template and a controller backing it. * * In order to make the definition easier, components enforce best practices like use of `controllerAs`, * `bindToController`. They always have **isolate scope** and are restricted to elements. * * Here are a few examples of how you would usually define components: * * ```js * var myMod = angular.module(...); * myMod.component('myComp', { * template: '
My name is {{$ctrl.name}}
', * controller: function() { * this.name = 'shahar'; * } * }); * * myMod.component('myComp', { * template: '
My name is {{$ctrl.name}}
', * bindings: {name: '@'} * }); * * myMod.component('myComp', { * templateUrl: 'views/my-comp.html', * controller: 'MyCtrl', * controllerAs: 'ctrl', * bindings: {name: '@'} * }); * * ``` * For more examples, and an in-depth guide, see the {@link guide/component component guide}. * *
* See also {@link ng.$compileProvider#directive $compileProvider.directive()}. */ this.component = function registerComponent(name, options) { var controller = options.controller || function() {}; function factory($injector) { function makeInjectable(fn) { if (isFunction(fn) || isArray(fn)) { return function(tElement, tAttrs) { return $injector.invoke(fn, this, {$element: tElement, $attrs: tAttrs}); }; } else { return fn; } } var template = (!options.template && !options.templateUrl ? '' : options.template); var ddo = { controller: controller, controllerAs: identifierForController(options.controller) || options.controllerAs || '$ctrl', template: makeInjectable(template), templateUrl: makeInjectable(options.templateUrl), transclude: options.transclude, scope: {}, bindToController: options.bindings || {}, restrict: 'E', require: options.require }; // Copy annotations (starting with $) over to the DDO forEach(options, function(val, key) { if (key.charAt(0) === '$') ddo[key] = val; }); return ddo; } // TODO(user) remove the following `forEach` before we release 1.6.0 // The component-router@0.2.0 looks for the annotations on the controller constructor // Nothing in Angular looks for annotations on the factory function but we can't remove // it from 1.5.x yet. // Copy any annotation properties (starting with $) over to the factory and controller constructor functions // These could be used by libraries such as the new component router forEach(options, function(val, key) { if (key.charAt(0) === '$') { factory[key] = val; // Don't try to copy over annotations to named controller if (isFunction(controller)) controller[key] = val; } }); factory.$inject = ['$injector']; return this.directive(name, factory); }; /** * @ngdoc method * @name $compileProvider#aHrefSanitizationWhitelist * @kind function * * @description * Retrieves or overrides the default regular expression that is used for whitelisting of safe * urls during a[href] sanitization. * * The sanitization is a security measure aimed at preventing XSS attacks via html links. * * Any url about to be assigned to a[href] via data-binding is first normalized and turned into * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist` * regular expression. If a match is found, the original url is written into the dom. Otherwise, * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. * * @param {RegExp=} regexp New regexp to whitelist urls with. * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for * chaining otherwise. */ this.aHrefSanitizationWhitelist = function(regexp) { if (isDefined(regexp)) { $$sanitizeUriProvider.aHrefSanitizationWhitelist(regexp); return this; } else { return $$sanitizeUriProvider.aHrefSanitizationWhitelist(); } }; /** * @ngdoc method * @name $compileProvider#imgSrcSanitizationWhitelist * @kind function * * @description * Retrieves or overrides the default regular expression that is used for whitelisting of safe * urls during img[src] sanitization. * * The sanitization is a security measure aimed at prevent XSS attacks via html links. * * Any url about to be assigned to img[src] via data-binding is first normalized and turned into * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist` * regular expression. If a match is found, the original url is written into the dom. Otherwise, * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. * * @param {RegExp=} regexp New regexp to whitelist urls with. * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for * chaining otherwise. */ this.imgSrcSanitizationWhitelist = function(regexp) { if (isDefined(regexp)) { $$sanitizeUriProvider.imgSrcSanitizationWhitelist(regexp); return this; } else { return $$sanitizeUriProvider.imgSrcSanitizationWhitelist(); } }; /** * @ngdoc method * @name $compileProvider#debugInfoEnabled * * @param {boolean=} enabled update the debugInfoEnabled state if provided, otherwise just return the * current debugInfoEnabled state * @returns {*} current value if used as getter or itself (chaining) if used as setter * * @kind function * * @description * Call this method to enable/disable various debug runtime information in the compiler such as adding * binding information and a reference to the current scope on to DOM elements. * If enabled, the compiler will add the following to DOM elements that have been bound to the scope * * `ng-binding` CSS class * * `$binding` data property containing an array of the binding expressions * * You may want to disable this in production for a significant performance boost. See * {@link guide/production#disabling-debug-data Disabling Debug Data} for more. * * The default value is true. */ var debugInfoEnabled = true; this.debugInfoEnabled = function(enabled) { if (isDefined(enabled)) { debugInfoEnabled = enabled; return this; } return debugInfoEnabled; }; var TTL = 10; /** * @ngdoc method * @name $compileProvider#onChangesTtl * @description * * Sets the number of times `$onChanges` hooks can trigger new changes before giving up and * assuming that the model is unstable. * * The current default is 10 iterations. * * In complex applications it's possible that dependencies between `$onChanges` hooks and bindings will result * in several iterations of calls to these hooks. However if an application needs more than the default 10 * iterations to stabilize then you should investigate what is causing the model to continuously change during * the `$onChanges` hook execution. * * Increasing the TTL could have performance implications, so you should not change it without proper justification. * * @param {number} limit The number of `$onChanges` hook iterations. * @returns {number|object} the current limit (or `this` if called as a setter for chaining) */ this.onChangesTtl = function(value) { if (arguments.length) { TTL = value; return this; } return TTL; }; this.$get = [ '$injector', '$interpolate', '$exceptionHandler', '$templateRequest', '$parse', '$controller', '$rootScope', '$sce', '$animate', '$$sanitizeUri', function($injector, $interpolate, $exceptionHandler, $templateRequest, $parse, $controller, $rootScope, $sce, $animate, $$sanitizeUri) { var SIMPLE_ATTR_NAME = /^\w/; var specialAttrHolder = window.document.createElement('div'); var onChangesTtl = TTL; // The onChanges hooks should all be run together in a single digest // When changes occur, the call to trigger their hooks will be added to this queue var onChangesQueue; // This function is called in a $$postDigest to trigger all the onChanges hooks in a single digest function flushOnChangesQueue() { try { if (!(--onChangesTtl)) { // We have hit the TTL limit so reset everything onChangesQueue = undefined; throw $compileMinErr('infchng', '{0} $onChanges() iterations reached. Aborting!\n', TTL); } // We must run this hook in an apply since the $$postDigest runs outside apply $rootScope.$apply(function() { var errors = []; for (var i = 0, ii = onChangesQueue.length; i < ii; ++i) { try { onChangesQueue[i](); } catch (e) { errors.push(e); } } // Reset the queue to trigger a new schedule next time there is a change onChangesQueue = undefined; if (errors.length) { throw errors; } }); } finally { onChangesTtl++; } } function Attributes(element, attributesToCopy) { if (attributesToCopy) { var keys = Object.keys(attributesToCopy); var i, l, key; for (i = 0, l = keys.length; i < l; i++) { key = keys[i]; this[key] = attributesToCopy[key]; } } else { this.$attr = {}; } this.$$element = element; } Attributes.prototype = { /** * @ngdoc method * @name $compile.directive.Attributes#$normalize * @kind function * * @description * Converts an attribute name (e.g. dash/colon/underscore-delimited string, optionally prefixed with `x-` or * `data-`) to its normalized, camelCase form. * * Also there is special case for Moz prefix starting with upper case letter. * * For further information check out the guide on {@link guide/directive#matching-directives Matching Directives} * * @param {string} name Name to normalize */ $normalize: directiveNormalize, /** * @ngdoc method * @name $compile.directive.Attributes#$addClass * @kind function * * @description * Adds the CSS class value specified by the classVal parameter to the element. If animations * are enabled then an animation will be triggered for the class addition. * * @param {string} classVal The className value that will be added to the element */ $addClass: function(classVal) { if (classVal && classVal.length > 0) { $animate.addClass(this.$$element, classVal); } }, /** * @ngdoc method * @name $compile.directive.Attributes#$removeClass * @kind function * * @description * Removes the CSS class value specified by the classVal parameter from the element. If * animations are enabled then an animation will be triggered for the class removal. * * @param {string} classVal The className value that will be removed from the element */ $removeClass: function(classVal) { if (classVal && classVal.length > 0) { $animate.removeClass(this.$$element, classVal); } }, /** * @ngdoc method * @name $compile.directive.Attributes#$updateClass * @kind function * * @description * Adds and removes the appropriate CSS class values to the element based on the difference * between the new and old CSS class values (specified as newClasses and oldClasses). * * @param {string} newClasses The current CSS className value * @param {string} oldClasses The former CSS className value */ $updateClass: function(newClasses, oldClasses) { var toAdd = tokenDifference(newClasses, oldClasses); if (toAdd && toAdd.length) { $animate.addClass(this.$$element, toAdd); } var toRemove = tokenDifference(oldClasses, newClasses); if (toRemove && toRemove.length) { $animate.removeClass(this.$$element, toRemove); } }, /** * Set a normalized attribute on the element in a way such that all directives * can share the attribute. This function properly handles boolean attributes. * @param {string} key Normalized key. (ie ngAttribute) * @param {string|boolean} value The value to set. If `null` attribute will be deleted. * @param {boolean=} writeAttr If false, does not write the value to DOM element attribute. * Defaults to true. * @param {string=} attrName Optional none normalized name. Defaults to key. */ $set: function(key, value, writeAttr, attrName) { // TODO: decide whether or not to throw an error if "class" //is set through this function since it may cause $updateClass to //become unstable. var node = this.$$element[0], booleanKey = getBooleanAttrName(node, key), aliasedKey = getAliasedAttrName(key), observer = key, nodeName; if (booleanKey) { this.$$element.prop(key, value); attrName = booleanKey; } else if (aliasedKey) { this[aliasedKey] = value; observer = aliasedKey; } this[key] = value; // translate normalized key to actual key if (attrName) { this.$attr[key] = attrName; } else { attrName = this.$attr[key]; if (!attrName) { this.$attr[key] = attrName = snake_case(key, '-'); } } nodeName = nodeName_(this.$$element); if ((nodeName === 'a' && (key === 'href' || key === 'xlinkHref')) || (nodeName === 'img' && key === 'src')) { // sanitize a[href] and img[src] values this[key] = value = $$sanitizeUri(value, key === 'src'); } else if (nodeName === 'img' && key === 'srcset' && isDefined(value)) { // sanitize img[srcset] values var result = ""; // first check if there are spaces because it's not the same pattern var trimmedSrcset = trim(value); // ( 999x ,| 999w ,| ,|, ) var srcPattern = /(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/; var pattern = /\s/.test(trimmedSrcset) ? srcPattern : /(,)/; // split srcset into tuple of uri and descriptor except for the last item var rawUris = trimmedSrcset.split(pattern); // for each tuples var nbrUrisWith2parts = Math.floor(rawUris.length / 2); for (var i = 0; i < nbrUrisWith2parts; i++) { var innerIdx = i * 2; // sanitize the uri result += $$sanitizeUri(trim(rawUris[innerIdx]), true); // add the descriptor result += (" " + trim(rawUris[innerIdx + 1])); } // split the last item into uri and descriptor var lastTuple = trim(rawUris[i * 2]).split(/\s/); // sanitize the last uri result += $$sanitizeUri(trim(lastTuple[0]), true); // and add the last descriptor if any if (lastTuple.length === 2) { result += (" " + trim(lastTuple[1])); } this[key] = value = result; } if (writeAttr !== false) { if (value === null || isUndefined(value)) { this.$$element.removeAttr(attrName); } else { if (SIMPLE_ATTR_NAME.test(attrName)) { this.$$element.attr(attrName, value); } else { setSpecialAttr(this.$$element[0], attrName, value); } } } // fire observers var $$observers = this.$$observers; $$observers && forEach($$observers[observer], function(fn) { try { fn(value); } catch (e) { $exceptionHandler(e); } }); }, /** * @ngdoc method * @name $compile.directive.Attributes#$observe * @kind function * * @description * Observes an interpolated attribute. * * The observer function will be invoked once during the next `$digest` following * compilation. The observer is then invoked whenever the interpolated value * changes. * * @param {string} key Normalized key. (ie ngAttribute) . * @param {function(interpolatedValue)} fn Function that will be called whenever the interpolated value of the attribute changes. * See the {@link guide/interpolation#how-text-and-attribute-bindings-work Interpolation * guide} for more info. * @returns {function()} Returns a deregistration function for this observer. */ $observe: function(key, fn) { var attrs = this, $$observers = (attrs.$$observers || (attrs.$$observers = createMap())), listeners = ($$observers[key] || ($$observers[key] = [])); listeners.push(fn); $rootScope.$evalAsync(function() { if (!listeners.$$inter && attrs.hasOwnProperty(key) && !isUndefined(attrs[key])) { // no one registered attribute interpolation function, so lets call it manually fn(attrs[key]); } }); return function() { arrayRemove(listeners, fn); }; } }; function setSpecialAttr(element, attrName, value) { // Attributes names that do not start with letters (such as `(click)`) cannot be set using `setAttribute` // so we have to jump through some hoops to get such an attribute // https://github.com/angular/angular.js/pull/13318 specialAttrHolder.innerHTML = ""; var attributes = specialAttrHolder.firstChild.attributes; var attribute = attributes[0]; // We have to remove the attribute from its container element before we can add it to the destination element attributes.removeNamedItem(attribute.name); attribute.value = value; element.attributes.setNamedItem(attribute); } function safeAddClass($element, className) { try { $element.addClass(className); } catch (e) { // ignore, since it means that we are trying to set class on // SVG element, where class name is read-only. } } var startSymbol = $interpolate.startSymbol(), endSymbol = $interpolate.endSymbol(), denormalizeTemplate = (startSymbol == '{{' && endSymbol == '}}') ? identity : function denormalizeTemplate(template) { return template.replace(/\{\{/g, startSymbol).replace(/}}/g, endSymbol); }, NG_ATTR_BINDING = /^ngAttr[A-Z]/; var MULTI_ELEMENT_DIR_RE = /^(.+)Start$/; compile.$$addBindingInfo = debugInfoEnabled ? function $$addBindingInfo($element, binding) { var bindings = $element.data('$binding') || []; if (isArray(binding)) { bindings = bindings.concat(binding); } else { bindings.push(binding); } $element.data('$binding', bindings); } : noop; compile.$$addBindingClass = debugInfoEnabled ? function $$addBindingClass($element) { safeAddClass($element, 'ng-binding'); } : noop; compile.$$addScopeInfo = debugInfoEnabled ? function $$addScopeInfo($element, scope, isolated, noTemplate) { var dataName = isolated ? (noTemplate ? '$isolateScopeNoTemplate' : '$isolateScope') : '$scope'; $element.data(dataName, scope); } : noop; compile.$$addScopeClass = debugInfoEnabled ? function $$addScopeClass($element, isolated) { safeAddClass($element, isolated ? 'ng-isolate-scope' : 'ng-scope'); } : noop; compile.$$createComment = function(directiveName, comment) { var content = ''; if (debugInfoEnabled) { content = ' ' + (directiveName || '') + ': '; if (comment) content += comment + ' '; } return window.document.createComment(content); }; return compile; //================================ function compile($compileNodes, transcludeFn, maxPriority, ignoreDirective, previousCompileContext) { if (!($compileNodes instanceof jqLite)) { // jquery always rewraps, whereas we need to preserve the original selector so that we can // modify it. $compileNodes = jqLite($compileNodes); } var NOT_EMPTY = /\S+/; // We can not compile top level text elements since text nodes can be merged and we will // not be able to attach scope data to them, so we will wrap them in for (var i = 0, len = $compileNodes.length; i < len; i++) { var domNode = $compileNodes[i]; if (domNode.nodeType === NODE_TYPE_TEXT && domNode.nodeValue.match(NOT_EMPTY) /* non-empty */) { jqLiteWrapNode(domNode, $compileNodes[i] = window.document.createElement('span')); } } var compositeLinkFn = compileNodes($compileNodes, transcludeFn, $compileNodes, maxPriority, ignoreDirective, previousCompileContext); compile.$$addScopeClass($compileNodes); var namespace = null; return function publicLinkFn(scope, cloneConnectFn, options) { assertArg(scope, 'scope'); if (previousCompileContext && previousCompileContext.needsNewScope) { // A parent directive did a replace and a directive on this element asked // for transclusion, which caused us to lose a layer of element on which // we could hold the new transclusion scope, so we will create it manually // here. scope = scope.$parent.$new(); } options = options || {}; var parentBoundTranscludeFn = options.parentBoundTranscludeFn, transcludeControllers = options.transcludeControllers, futureParentElement = options.futureParentElement; // When `parentBoundTranscludeFn` is passed, it is a // `controllersBoundTransclude` function (it was previously passed // as `transclude` to directive.link) so we must unwrap it to get // its `boundTranscludeFn` if (parentBoundTranscludeFn && parentBoundTranscludeFn.$$boundTransclude) { parentBoundTranscludeFn = parentBoundTranscludeFn.$$boundTransclude; } if (!namespace) { namespace = detectNamespaceForChildElements(futureParentElement); } var $linkNode; if (namespace !== 'html') { // When using a directive with replace:true and templateUrl the $compileNodes // (or a child element inside of them) // might change, so we need to recreate the namespace adapted compileNodes // for call to the link function. // Note: This will already clone the nodes... $linkNode = jqLite( wrapTemplate(namespace, jqLite('
').append($compileNodes).html()) ); } else if (cloneConnectFn) { // important!!: we must call our jqLite.clone() since the jQuery one is trying to be smart // and sometimes changes the structure of the DOM. $linkNode = JQLitePrototype.clone.call($compileNodes); } else { $linkNode = $compileNodes; } if (transcludeControllers) { for (var controllerName in transcludeControllers) { $linkNode.data('$' + controllerName + 'Controller', transcludeControllers[controllerName].instance); } } compile.$$addScopeInfo($linkNode, scope); if (cloneConnectFn) cloneConnectFn($linkNode, scope); if (compositeLinkFn) compositeLinkFn(scope, $linkNode, $linkNode, parentBoundTranscludeFn); return $linkNode; }; } function detectNamespaceForChildElements(parentElement) { // TODO: Make this detect MathML as well... var node = parentElement && parentElement[0]; if (!node) { return 'html'; } else { return nodeName_(node) !== 'foreignobject' && toString.call(node).match(/SVG/) ? 'svg' : 'html'; } } /** * Compile function matches each node in nodeList against the directives. Once all directives * for a particular node are collected their compile functions are executed. The compile * functions return values - the linking functions - are combined into a composite linking * function, which is the a linking function for the node. * * @param {NodeList} nodeList an array of nodes or NodeList to compile * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the * scope argument is auto-generated to the new child of the transcluded parent scope. * @param {DOMElement=} $rootElement If the nodeList is the root of the compilation tree then * the rootElement must be set the jqLite collection of the compile root. This is * needed so that the jqLite collection items can be replaced with widgets. * @param {number=} maxPriority Max directive priority. * @returns {Function} A composite linking function of all of the matched directives or null. */ function compileNodes(nodeList, transcludeFn, $rootElement, maxPriority, ignoreDirective, previousCompileContext) { var linkFns = [], attrs, directives, nodeLinkFn, childNodes, childLinkFn, linkFnFound, nodeLinkFnFound; for (var i = 0; i < nodeList.length; i++) { attrs = new Attributes(); // we must always refer to nodeList[i] since the nodes can be replaced underneath us. directives = collectDirectives(nodeList[i], [], attrs, i === 0 ? maxPriority : undefined, ignoreDirective); nodeLinkFn = (directives.length) ? applyDirectivesToNode(directives, nodeList[i], attrs, transcludeFn, $rootElement, null, [], [], previousCompileContext) : null; if (nodeLinkFn && nodeLinkFn.scope) { compile.$$addScopeClass(attrs.$$element); } childLinkFn = (nodeLinkFn && nodeLinkFn.terminal || !(childNodes = nodeList[i].childNodes) || !childNodes.length) ? null : compileNodes(childNodes, nodeLinkFn ? ( (nodeLinkFn.transcludeOnThisElement || !nodeLinkFn.templateOnThisElement) && nodeLinkFn.transclude) : transcludeFn); if (nodeLinkFn || childLinkFn) { linkFns.push(i, nodeLinkFn, childLinkFn); linkFnFound = true; nodeLinkFnFound = nodeLinkFnFound || nodeLinkFn; } //use the previous context only for the first element in the virtual group previousCompileContext = null; } // return a linking function if we have found anything, null otherwise return linkFnFound ? compositeLinkFn : null; function compositeLinkFn(scope, nodeList, $rootElement, parentBoundTranscludeFn) { var nodeLinkFn, childLinkFn, node, childScope, i, ii, idx, childBoundTranscludeFn; var stableNodeList; if (nodeLinkFnFound) { // copy nodeList so that if a nodeLinkFn removes or adds an element at this DOM level our // offsets don't get screwed up var nodeListLength = nodeList.length; stableNodeList = new Array(nodeListLength); // create a sparse array by only copying the elements which have a linkFn for (i = 0; i < linkFns.length; i+=3) { idx = linkFns[i]; stableNodeList[idx] = nodeList[idx]; } } else { stableNodeList = nodeList; } for (i = 0, ii = linkFns.length; i < ii;) { node = stableNodeList[linkFns[i++]]; nodeLinkFn = linkFns[i++]; childLinkFn = linkFns[i++]; if (nodeLinkFn) { if (nodeLinkFn.scope) { childScope = scope.$new(); compile.$$addScopeInfo(jqLite(node), childScope); } else { childScope = scope; } if (nodeLinkFn.transcludeOnThisElement) { childBoundTranscludeFn = createBoundTranscludeFn( scope, nodeLinkFn.transclude, parentBoundTranscludeFn); } else if (!nodeLinkFn.templateOnThisElement && parentBoundTranscludeFn) { childBoundTranscludeFn = parentBoundTranscludeFn; } else if (!parentBoundTranscludeFn && transcludeFn) { childBoundTranscludeFn = createBoundTranscludeFn(scope, transcludeFn); } else { childBoundTranscludeFn = null; } nodeLinkFn(childLinkFn, childScope, node, $rootElement, childBoundTranscludeFn); } else if (childLinkFn) { childLinkFn(scope, node.childNodes, undefined, parentBoundTranscludeFn); } } } } function createBoundTranscludeFn(scope, transcludeFn, previousBoundTranscludeFn) { function boundTranscludeFn(transcludedScope, cloneFn, controllers, futureParentElement, containingScope) { if (!transcludedScope) { transcludedScope = scope.$new(false, containingScope); transcludedScope.$$transcluded = true; } return transcludeFn(transcludedScope, cloneFn, { parentBoundTranscludeFn: previousBoundTranscludeFn, transcludeControllers: controllers, futureParentElement: futureParentElement }); } // We need to attach the transclusion slots onto the `boundTranscludeFn` // so that they are available inside the `controllersBoundTransclude` function var boundSlots = boundTranscludeFn.$$slots = createMap(); for (var slotName in transcludeFn.$$slots) { if (transcludeFn.$$slots[slotName]) { boundSlots[slotName] = createBoundTranscludeFn(scope, transcludeFn.$$slots[slotName], previousBoundTranscludeFn); } else { boundSlots[slotName] = null; } } return boundTranscludeFn; } /** * Looks for directives on the given node and adds them to the directive collection which is * sorted. * * @param node Node to search. * @param directives An array to which the directives are added to. This array is sorted before * the function returns. * @param attrs The shared attrs object which is used to populate the normalized attributes. * @param {number=} maxPriority Max directive priority. */ function collectDirectives(node, directives, attrs, maxPriority, ignoreDirective) { var nodeType = node.nodeType, attrsMap = attrs.$attr, match, className; switch (nodeType) { case NODE_TYPE_ELEMENT: /* Element */ // use the node name: addDirective(directives, directiveNormalize(nodeName_(node)), 'E', maxPriority, ignoreDirective); // iterate over the attributes for (var attr, name, nName, ngAttrName, value, isNgAttr, nAttrs = node.attributes, j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) { var attrStartName = false; var attrEndName = false; attr = nAttrs[j]; name = attr.name; value = trim(attr.value); // support ngAttr attribute binding ngAttrName = directiveNormalize(name); if (isNgAttr = NG_ATTR_BINDING.test(ngAttrName)) { name = name.replace(PREFIX_REGEXP, '') .substr(8).replace(/_(.)/g, function(match, letter) { return letter.toUpperCase(); }); } var multiElementMatch = ngAttrName.match(MULTI_ELEMENT_DIR_RE); if (multiElementMatch && directiveIsMultiElement(multiElementMatch[1])) { attrStartName = name; attrEndName = name.substr(0, name.length - 5) + 'end'; name = name.substr(0, name.length - 6); } nName = directiveNormalize(name.toLowerCase()); attrsMap[nName] = name; if (isNgAttr || !attrs.hasOwnProperty(nName)) { attrs[nName] = value; if (getBooleanAttrName(node, nName)) { attrs[nName] = true; // presence means true } } addAttrInterpolateDirective(node, directives, value, nName, isNgAttr); addDirective(directives, nName, 'A', maxPriority, ignoreDirective, attrStartName, attrEndName); } // use class as directive className = node.className; if (isObject(className)) { // Maybe SVGAnimatedString className = className.animVal; } if (isString(className) && className !== '') { while (match = CLASS_DIRECTIVE_REGEXP.exec(className)) { nName = directiveNormalize(match[2]); if (addDirective(directives, nName, 'C', maxPriority, ignoreDirective)) { attrs[nName] = trim(match[3]); } className = className.substr(match.index + match[0].length); } } break; case NODE_TYPE_TEXT: /* Text Node */ if (msie === 11) { // Workaround for #11781 while (node.parentNode && node.nextSibling && node.nextSibling.nodeType === NODE_TYPE_TEXT) { node.nodeValue = node.nodeValue + node.nextSibling.nodeValue; node.parentNode.removeChild(node.nextSibling); } } addTextInterpolateDirective(directives, node.nodeValue); break; case NODE_TYPE_COMMENT: /* Comment */ try { match = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue); if (match) { nName = directiveNormalize(match[1]); if (addDirective(directives, nName, 'M', maxPriority, ignoreDirective)) { attrs[nName] = trim(match[2]); } } } catch (e) { // turns out that under some circumstances IE9 throws errors when one attempts to read // comment's node value. // Just ignore it and continue. (Can't seem to reproduce in test case.) } break; } directives.sort(byPriority); return directives; } /** * Given a node with an directive-start it collects all of the siblings until it finds * directive-end. * @param node * @param attrStart * @param attrEnd * @returns {*} */ function groupScan(node, attrStart, attrEnd) { var nodes = []; var depth = 0; if (attrStart && node.hasAttribute && node.hasAttribute(attrStart)) { do { if (!node) { throw $compileMinErr('uterdir', "Unterminated attribute, found '{0}' but no matching '{1}' found.", attrStart, attrEnd); } if (node.nodeType == NODE_TYPE_ELEMENT) { if (node.hasAttribute(attrStart)) depth++; if (node.hasAttribute(attrEnd)) depth--; } nodes.push(node); node = node.nextSibling; } while (depth > 0); } else { nodes.push(node); } return jqLite(nodes); } /** * Wrapper for linking function which converts normal linking function into a grouped * linking function. * @param linkFn * @param attrStart * @param attrEnd * @returns {Function} */ function groupElementsLinkFnWrapper(linkFn, attrStart, attrEnd) { return function groupedElementsLink(scope, element, attrs, controllers, transcludeFn) { element = groupScan(element[0], attrStart, attrEnd); return linkFn(scope, element, attrs, controllers, transcludeFn); }; } /** * A function generator that is used to support both eager and lazy compilation * linking function. * @param eager * @param $compileNodes * @param transcludeFn * @param maxPriority * @param ignoreDirective * @param previousCompileContext * @returns {Function} */ function compilationGenerator(eager, $compileNodes, transcludeFn, maxPriority, ignoreDirective, previousCompileContext) { var compiled; if (eager) { return compile($compileNodes, transcludeFn, maxPriority, ignoreDirective, previousCompileContext); } return function lazyCompilation() { if (!compiled) { compiled = compile($compileNodes, transcludeFn, maxPriority, ignoreDirective, previousCompileContext); // Null out all of these references in order to make them eligible for garbage collection // since this is a potentially long lived closure $compileNodes = transcludeFn = previousCompileContext = null; } return compiled.apply(this, arguments); }; } /** * Once the directives have been collected, their compile functions are executed. This method * is responsible for inlining directive templates as well as terminating the application * of the directives if the terminal directive has been reached. * * @param {Array} directives Array of collected directives to execute their compile function. * this needs to be pre-sorted by priority order. * @param {Node} compileNode The raw DOM node to apply the compile functions to * @param {Object} templateAttrs The shared attribute function * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the * scope argument is auto-generated to the new * child of the transcluded parent scope. * @param {JQLite} jqCollection If we are working on the root of the compile tree then this * argument has the root jqLite array so that we can replace nodes * on it. * @param {Object=} originalReplaceDirective An optional directive that will be ignored when * compiling the transclusion. * @param {Array.} preLinkFns * @param {Array.} postLinkFns * @param {Object} previousCompileContext Context used for previous compilation of the current * node * @returns {Function} linkFn */ function applyDirectivesToNode(directives, compileNode, templateAttrs, transcludeFn, jqCollection, originalReplaceDirective, preLinkFns, postLinkFns, previousCompileContext) { previousCompileContext = previousCompileContext || {}; var terminalPriority = -Number.MAX_VALUE, newScopeDirective = previousCompileContext.newScopeDirective, controllerDirectives = previousCompileContext.controllerDirectives, newIsolateScopeDirective = previousCompileContext.newIsolateScopeDirective, templateDirective = previousCompileContext.templateDirective, nonTlbTranscludeDirective = previousCompileContext.nonTlbTranscludeDirective, hasTranscludeDirective = false, hasTemplate = false, hasElementTranscludeDirective = previousCompileContext.hasElementTranscludeDirective, $compileNode = templateAttrs.$$element = jqLite(compileNode), directive, directiveName, $template, replaceDirective = originalReplaceDirective, childTranscludeFn = transcludeFn, linkFn, didScanForMultipleTransclusion = false, mightHaveMultipleTransclusionError = false, directiveValue; // executes all directives on the current element for (var i = 0, ii = directives.length; i < ii; i++) { directive = directives[i]; var attrStart = directive.$$start; var attrEnd = directive.$$end; // collect multiblock sections if (attrStart) { $compileNode = groupScan(compileNode, attrStart, attrEnd); } $template = undefined; if (terminalPriority > directive.priority) { break; // prevent further processing of directives } if (directiveValue = directive.scope) { // skip the check for directives with async templates, we'll check the derived sync // directive when the template arrives if (!directive.templateUrl) { if (isObject(directiveValue)) { // This directive is trying to add an isolated scope. // Check that there is no scope of any kind already assertNoDuplicate('new/isolated scope', newIsolateScopeDirective || newScopeDirective, directive, $compileNode); newIsolateScopeDirective = directive; } else { // This directive is trying to add a child scope. // Check that there is no isolated scope already assertNoDuplicate('new/isolated scope', newIsolateScopeDirective, directive, $compileNode); } } newScopeDirective = newScopeDirective || directive; } directiveName = directive.name; // If we encounter a condition that can result in transclusion on the directive, // then scan ahead in the remaining directives for others that may cause a multiple // transclusion error to be thrown during the compilation process. If a matching directive // is found, then we know that when we encounter a transcluded directive, we need to eagerly // compile the `transclude` function rather than doing it lazily in order to throw // exceptions at the correct time if (!didScanForMultipleTransclusion && ((directive.replace && (directive.templateUrl || directive.template)) || (directive.transclude && !directive.$$tlb))) { var candidateDirective; for (var scanningIndex = i + 1; candidateDirective = directives[scanningIndex++];) { if ((candidateDirective.transclude && !candidateDirective.$$tlb) || (candidateDirective.replace && (candidateDirective.templateUrl || candidateDirective.template))) { mightHaveMultipleTransclusionError = true; break; } } didScanForMultipleTransclusion = true; } if (!directive.templateUrl && directive.controller) { directiveValue = directive.controller; controllerDirectives = controllerDirectives || createMap(); assertNoDuplicate("'" + directiveName + "' controller", controllerDirectives[directiveName], directive, $compileNode); controllerDirectives[directiveName] = directive; } if (directiveValue = directive.transclude) { hasTranscludeDirective = true; // Special case ngIf and ngRepeat so that we don't complain about duplicate transclusion. // This option should only be used by directives that know how to safely handle element transclusion, // where the transcluded nodes are added or replaced after linking. if (!directive.$$tlb) { assertNoDuplicate('transclusion', nonTlbTranscludeDirective, directive, $compileNode); nonTlbTranscludeDirective = directive; } if (directiveValue == 'element') { hasElementTranscludeDirective = true; terminalPriority = directive.priority; $template = $compileNode; $compileNode = templateAttrs.$$element = jqLite(compile.$$createComment(directiveName, templateAttrs[directiveName])); compileNode = $compileNode[0]; replaceWith(jqCollection, sliceArgs($template), compileNode); // Support: Chrome < 50 // https://github.com/angular/angular.js/issues/14041 // In the versions of V8 prior to Chrome 50, the document fragment that is created // in the `replaceWith` function is improperly garbage collected despite still // being referenced by the `parentNode` property of all of the child nodes. By adding // a reference to the fragment via a different property, we can avoid that incorrect // behavior. // TODO: remove this line after Chrome 50 has been released $template[0].$$parentNode = $template[0].parentNode; childTranscludeFn = compilationGenerator(mightHaveMultipleTransclusionError, $template, transcludeFn, terminalPriority, replaceDirective && replaceDirective.name, { // Don't pass in: // - controllerDirectives - otherwise we'll create duplicates controllers // - newIsolateScopeDirective or templateDirective - combining templates with // element transclusion doesn't make sense. // // We need only nonTlbTranscludeDirective so that we prevent putting transclusion // on the same element more than once. nonTlbTranscludeDirective: nonTlbTranscludeDirective }); } else { var slots = createMap(); $template = jqLite(jqLiteClone(compileNode)).contents(); if (isObject(directiveValue)) { // We have transclusion slots, // collect them up, compile them and store their transclusion functions $template = []; var slotMap = createMap(); var filledSlots = createMap(); // Parse the element selectors forEach(directiveValue, function(elementSelector, slotName) { // If an element selector starts with a ? then it is optional var optional = (elementSelector.charAt(0) === '?'); elementSelector = optional ? elementSelector.substring(1) : elementSelector; slotMap[elementSelector] = slotName; // We explicitly assign `null` since this implies that a slot was defined but not filled. // Later when calling boundTransclusion functions with a slot name we only error if the // slot is `undefined` slots[slotName] = null; // filledSlots contains `true` for all slots that are either optional or have been // filled. This is used to check that we have not missed any required slots filledSlots[slotName] = optional; }); // Add the matching elements into their slot forEach($compileNode.contents(), function(node) { var slotName = slotMap[directiveNormalize(nodeName_(node))]; if (slotName) { filledSlots[slotName] = true; slots[slotName] = slots[slotName] || []; slots[slotName].push(node); } else { $template.push(node); } }); // Check for required slots that were not filled forEach(filledSlots, function(filled, slotName) { if (!filled) { throw $compileMinErr('reqslot', 'Required transclusion slot `{0}` was not filled.', slotName); } }); for (var slotName in slots) { if (slots[slotName]) { // Only define a transclusion function if the slot was filled slots[slotName] = compilationGenerator(mightHaveMultipleTransclusionError, slots[slotName], transcludeFn); } } } $compileNode.empty(); // clear contents childTranscludeFn = compilationGenerator(mightHaveMultipleTransclusionError, $template, transcludeFn, undefined, undefined, { needsNewScope: directive.$$isolateScope || directive.$$newScope}); childTranscludeFn.$$slots = slots; } } if (directive.template) { hasTemplate = true; assertNoDuplicate('template', templateDirective, directive, $compileNode); templateDirective = directive; directiveValue = (isFunction(directive.template)) ? directive.template($compileNode, templateAttrs) : directive.template; directiveValue = denormalizeTemplate(directiveValue); if (directive.replace) { replaceDirective = directive; if (jqLiteIsTextNode(directiveValue)) { $template = []; } else { $template = removeComments(wrapTemplate(directive.templateNamespace, trim(directiveValue))); } compileNode = $template[0]; if ($template.length != 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) { throw $compileMinErr('tplrt', "Template for directive '{0}' must have exactly one root element. {1}", directiveName, ''); } replaceWith(jqCollection, $compileNode, compileNode); var newTemplateAttrs = {$attr: {}}; // combine directives from the original node and from the template: // - take the array of directives for this element // - split it into two parts, those that already applied (processed) and those that weren't (unprocessed) // - collect directives from the template and sort them by priority // - combine directives as: processed + template + unprocessed var templateDirectives = collectDirectives(compileNode, [], newTemplateAttrs); var unprocessedDirectives = directives.splice(i + 1, directives.length - (i + 1)); if (newIsolateScopeDirective || newScopeDirective) { // The original directive caused the current element to be replaced but this element // also needs to have a new scope, so we need to tell the template directives // that they would need to get their scope from further up, if they require transclusion markDirectiveScope(templateDirectives, newIsolateScopeDirective, newScopeDirective); } directives = directives.concat(templateDirectives).concat(unprocessedDirectives); mergeTemplateAttributes(templateAttrs, newTemplateAttrs); ii = directives.length; } else { $compileNode.html(directiveValue); } } if (directive.templateUrl) { hasTemplate = true; assertNoDuplicate('template', templateDirective, directive, $compileNode); templateDirective = directive; if (directive.replace) { replaceDirective = directive; } /* jshint -W021 */ nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i), $compileNode, /* jshint +W021 */ templateAttrs, jqCollection, hasTranscludeDirective && childTranscludeFn, preLinkFns, postLinkFns, { controllerDirectives: controllerDirectives, newScopeDirective: (newScopeDirective !== directive) && newScopeDirective, newIsolateScopeDirective: newIsolateScopeDirective, templateDirective: templateDirective, nonTlbTranscludeDirective: nonTlbTranscludeDirective }); ii = directives.length; } else if (directive.compile) { try { linkFn = directive.compile($compileNode, templateAttrs, childTranscludeFn); var context = directive.$$originalDirective || directive; if (isFunction(linkFn)) { addLinkFns(null, bind(context, linkFn), attrStart, attrEnd); } else if (linkFn) { addLinkFns(bind(context, linkFn.pre), bind(context, linkFn.post), attrStart, attrEnd); } } catch (e) { $exceptionHandler(e, startingTag($compileNode)); } } if (directive.terminal) { nodeLinkFn.terminal = true; terminalPriority = Math.max(terminalPriority, directive.priority); } } nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope === true; nodeLinkFn.transcludeOnThisElement = hasTranscludeDirective; nodeLinkFn.templateOnThisElement = hasTemplate; nodeLinkFn.transclude = childTranscludeFn; previousCompileContext.hasElementTranscludeDirective = hasElementTranscludeDirective; // might be normal or delayed nodeLinkFn depending on if templateUrl is present return nodeLinkFn; //////////////////// function addLinkFns(pre, post, attrStart, attrEnd) { if (pre) { if (attrStart) pre = groupElementsLinkFnWrapper(pre, attrStart, attrEnd); pre.require = directive.require; pre.directiveName = directiveName; if (newIsolateScopeDirective === directive || directive.$$isolateScope) { pre = cloneAndAnnotateFn(pre, {isolateScope: true}); } preLinkFns.push(pre); } if (post) { if (attrStart) post = groupElementsLinkFnWrapper(post, attrStart, attrEnd); post.require = directive.require; post.directiveName = directiveName; if (newIsolateScopeDirective === directive || directive.$$isolateScope) { post = cloneAndAnnotateFn(post, {isolateScope: true}); } postLinkFns.push(post); } } function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn) { var i, ii, linkFn, isolateScope, controllerScope, elementControllers, transcludeFn, $element, attrs, scopeBindingInfo; if (compileNode === linkNode) { attrs = templateAttrs; $element = templateAttrs.$$element; } else { $element = jqLite(linkNode); attrs = new Attributes($element, templateAttrs); } controllerScope = scope; if (newIsolateScopeDirective) { isolateScope = scope.$new(true); } else if (newScopeDirective) { controllerScope = scope.$parent; } if (boundTranscludeFn) { // track `boundTranscludeFn` so it can be unwrapped if `transcludeFn` // is later passed as `parentBoundTranscludeFn` to `publicLinkFn` transcludeFn = controllersBoundTransclude; transcludeFn.$$boundTransclude = boundTranscludeFn; // expose the slots on the `$transclude` function transcludeFn.isSlotFilled = function(slotName) { return !!boundTranscludeFn.$$slots[slotName]; }; } if (controllerDirectives) { elementControllers = setupControllers($element, attrs, transcludeFn, controllerDirectives, isolateScope, scope, newIsolateScopeDirective); } if (newIsolateScopeDirective) { // Initialize isolate scope bindings for new isolate scope directive. compile.$$addScopeInfo($element, isolateScope, true, !(templateDirective && (templateDirective === newIsolateScopeDirective || templateDirective === newIsolateScopeDirective.$$originalDirective))); compile.$$addScopeClass($element, true); isolateScope.$$isolateBindings = newIsolateScopeDirective.$$isolateBindings; scopeBindingInfo = initializeDirectiveBindings(scope, attrs, isolateScope, isolateScope.$$isolateBindings, newIsolateScopeDirective); if (scopeBindingInfo.removeWatches) { isolateScope.$on('$destroy', scopeBindingInfo.removeWatches); } } // Initialize bindToController bindings for (var name in elementControllers) { var controllerDirective = controllerDirectives[name]; var controller = elementControllers[name]; var bindings = controllerDirective.$$bindings.bindToController; if (controller.identifier && bindings) { controller.bindingInfo = initializeDirectiveBindings(controllerScope, attrs, controller.instance, bindings, controllerDirective); } else { controller.bindingInfo = {}; } var controllerResult = controller(); if (controllerResult !== controller.instance) { // If the controller constructor has a return value, overwrite the instance // from setupControllers controller.instance = controllerResult; $element.data('$' + controllerDirective.name + 'Controller', controllerResult); controller.bindingInfo.removeWatches && controller.bindingInfo.removeWatches(); controller.bindingInfo = initializeDirectiveBindings(controllerScope, attrs, controller.instance, bindings, controllerDirective); } } // Bind the required controllers to the controller, if `require` is an object and `bindToController` is truthy forEach(controllerDirectives, function(controllerDirective, name) { var require = controllerDirective.require; if (controllerDirective.bindToController && !isArray(require) && isObject(require)) { extend(elementControllers[name].instance, getControllers(name, require, $element, elementControllers)); } }); // Handle the init and destroy lifecycle hooks on all controllers that have them forEach(elementControllers, function(controller) { var controllerInstance = controller.instance; if (isFunction(controllerInstance.$onChanges)) { try { controllerInstance.$onChanges(controller.bindingInfo.initialChanges); } catch (e) { $exceptionHandler(e); } } if (isFunction(controllerInstance.$onInit)) { try { controllerInstance.$onInit(); } catch (e) { $exceptionHandler(e); } } if (isFunction(controllerInstance.$onDestroy)) { controllerScope.$on('$destroy', function callOnDestroyHook() { controllerInstance.$onDestroy(); }); } }); // PRELINKING for (i = 0, ii = preLinkFns.length; i < ii; i++) { linkFn = preLinkFns[i]; invokeLinkFn(linkFn, linkFn.isolateScope ? isolateScope : scope, $element, attrs, linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers), transcludeFn ); } // RECURSION // We only pass the isolate scope, if the isolate directive has a template, // otherwise the child elements do not belong to the isolate directive. var scopeToChild = scope; if (newIsolateScopeDirective && (newIsolateScopeDirective.template || newIsolateScopeDirective.templateUrl === null)) { scopeToChild = isolateScope; } childLinkFn && childLinkFn(scopeToChild, linkNode.childNodes, undefined, boundTranscludeFn); // POSTLINKING for (i = postLinkFns.length - 1; i >= 0; i--) { linkFn = postLinkFns[i]; invokeLinkFn(linkFn, linkFn.isolateScope ? isolateScope : scope, $element, attrs, linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers), transcludeFn ); } // Trigger $postLink lifecycle hooks forEach(elementControllers, function(controller) { var controllerInstance = controller.instance; if (isFunction(controllerInstance.$postLink)) { controllerInstance.$postLink(); } }); // This is the function that is injected as `$transclude`. // Note: all arguments are optional! function controllersBoundTransclude(scope, cloneAttachFn, futureParentElement, slotName) { var transcludeControllers; // No scope passed in: if (!isScope(scope)) { slotName = futureParentElement; futureParentElement = cloneAttachFn; cloneAttachFn = scope; scope = undefined; } if (hasElementTranscludeDirective) { transcludeControllers = elementControllers; } if (!futureParentElement) { futureParentElement = hasElementTranscludeDirective ? $element.parent() : $element; } if (slotName) { // slotTranscludeFn can be one of three things: // * a transclude function - a filled slot // * `null` - an optional slot that was not filled // * `undefined` - a slot that was not declared (i.e. invalid) var slotTranscludeFn = boundTranscludeFn.$$slots[slotName]; if (slotTranscludeFn) { return slotTranscludeFn(scope, cloneAttachFn, transcludeControllers, futureParentElement, scopeToChild); } else if (isUndefined(slotTranscludeFn)) { throw $compileMinErr('noslot', 'No parent directive that requires a transclusion with slot name "{0}". ' + 'Element: {1}', slotName, startingTag($element)); } } else { return boundTranscludeFn(scope, cloneAttachFn, transcludeControllers, futureParentElement, scopeToChild); } } } } function getControllers(directiveName, require, $element, elementControllers) { var value; if (isString(require)) { var match = require.match(REQUIRE_PREFIX_REGEXP); var name = require.substring(match[0].length); var inheritType = match[1] || match[3]; var optional = match[2] === '?'; //If only parents then start at the parent element if (inheritType === '^^') { $element = $element.parent(); //Otherwise attempt getting the controller from elementControllers in case //the element is transcluded (and has no data) and to avoid .data if possible } else { value = elementControllers && elementControllers[name]; value = value && value.instance; } if (!value) { var dataName = '$' + name + 'Controller'; value = inheritType ? $element.inheritedData(dataName) : $element.data(dataName); } if (!value && !optional) { throw $compileMinErr('ctreq', "Controller '{0}', required by directive '{1}', can't be found!", name, directiveName); } } else if (isArray(require)) { value = []; for (var i = 0, ii = require.length; i < ii; i++) { value[i] = getControllers(directiveName, require[i], $element, elementControllers); } } else if (isObject(require)) { value = {}; forEach(require, function(controller, property) { value[property] = getControllers(directiveName, controller, $element, elementControllers); }); } return value || null; } function setupControllers($element, attrs, transcludeFn, controllerDirectives, isolateScope, scope, newIsolateScopeDirective) { var elementControllers = createMap(); for (var controllerKey in controllerDirectives) { var directive = controllerDirectives[controllerKey]; var locals = { $scope: directive === newIsolateScopeDirective || directive.$$isolateScope ? isolateScope : scope, $element: $element, $attrs: attrs, $transclude: transcludeFn }; var controller = directive.controller; if (controller == '@') { controller = attrs[directive.name]; } var controllerInstance = $controller(controller, locals, true, directive.controllerAs); // For directives with element transclusion the element is a comment. // In this case .data will not attach any data. // Instead, we save the controllers for the element in a local hash and attach to .data // later, once we have the actual element. elementControllers[directive.name] = controllerInstance; $element.data('$' + directive.name + 'Controller', controllerInstance.instance); } return elementControllers; } // Depending upon the context in which a directive finds itself it might need to have a new isolated // or child scope created. For instance: // * if the directive has been pulled into a template because another directive with a higher priority // asked for element transclusion // * if the directive itself asks for transclusion but it is at the root of a template and the original // element was replaced. See https://github.com/angular/angular.js/issues/12936 function markDirectiveScope(directives, isolateScope, newScope) { for (var j = 0, jj = directives.length; j < jj; j++) { directives[j] = inherit(directives[j], {$$isolateScope: isolateScope, $$newScope: newScope}); } } /** * looks up the directive and decorates it with exception handling and proper parameters. We * call this the boundDirective. * * @param {string} name name of the directive to look up. * @param {string} location The directive must be found in specific format. * String containing any of theses characters: * * * `E`: element name * * `A': attribute * * `C`: class * * `M`: comment * @returns {boolean} true if directive was added. */ function addDirective(tDirectives, name, location, maxPriority, ignoreDirective, startAttrName, endAttrName) { if (name === ignoreDirective) return null; var match = null; if (hasDirectives.hasOwnProperty(name)) { for (var directive, directives = $injector.get(name + Suffix), i = 0, ii = directives.length; i < ii; i++) { try { directive = directives[i]; if ((isUndefined(maxPriority) || maxPriority > directive.priority) && directive.restrict.indexOf(location) != -1) { if (startAttrName) { directive = inherit(directive, {$$start: startAttrName, $$end: endAttrName}); } if (!directive.$$bindings) { var bindings = directive.$$bindings = parseDirectiveBindings(directive, directive.name); if (isObject(bindings.isolateScope)) { directive.$$isolateBindings = bindings.isolateScope; } } tDirectives.push(directive); match = directive; } } catch (e) { $exceptionHandler(e); } } } return match; } /** * looks up the directive and returns true if it is a multi-element directive, * and therefore requires DOM nodes between -start and -end markers to be grouped * together. * * @param {string} name name of the directive to look up. * @returns true if directive was registered as multi-element. */ function directiveIsMultiElement(name) { if (hasDirectives.hasOwnProperty(name)) { for (var directive, directives = $injector.get(name + Suffix), i = 0, ii = directives.length; i < ii; i++) { directive = directives[i]; if (directive.multiElement) { return true; } } } return false; } /** * When the element is replaced with HTML template then the new attributes * on the template need to be merged with the existing attributes in the DOM. * The desired effect is to have both of the attributes present. * * @param {object} dst destination attributes (original DOM) * @param {object} src source attributes (from the directive template) */ function mergeTemplateAttributes(dst, src) { var srcAttr = src.$attr, dstAttr = dst.$attr, $element = dst.$$element; // reapply the old attributes to the new element forEach(dst, function(value, key) { if (key.charAt(0) != '$') { if (src[key] && src[key] !== value) { value += (key === 'style' ? ';' : ' ') + src[key]; } dst.$set(key, value, true, srcAttr[key]); } }); // copy the new attributes on the old attrs object forEach(src, function(value, key) { // Check if we already set this attribute in the loop above. // `dst` will never contain hasOwnProperty as DOM parser won't let it. // You will get an "InvalidCharacterError: DOM Exception 5" error if you // have an attribute like "has-own-property" or "data-has-own-property", etc. if (!dst.hasOwnProperty(key) && key.charAt(0) !== '$') { dst[key] = value; if (key !== 'class' && key !== 'style') { dstAttr[key] = srcAttr[key]; } } }); } function compileTemplateUrl(directives, $compileNode, tAttrs, $rootElement, childTranscludeFn, preLinkFns, postLinkFns, previousCompileContext) { var linkQueue = [], afterTemplateNodeLinkFn, afterTemplateChildLinkFn, beforeTemplateCompileNode = $compileNode[0], origAsyncDirective = directives.shift(), derivedSyncDirective = inherit(origAsyncDirective, { templateUrl: null, transclude: null, replace: null, $$originalDirective: origAsyncDirective }), templateUrl = (isFunction(origAsyncDirective.templateUrl)) ? origAsyncDirective.templateUrl($compileNode, tAttrs) : origAsyncDirective.templateUrl, templateNamespace = origAsyncDirective.templateNamespace; $compileNode.empty(); $templateRequest(templateUrl) .then(function(content) { var compileNode, tempTemplateAttrs, $template, childBoundTranscludeFn; content = denormalizeTemplate(content); if (origAsyncDirective.replace) { if (jqLiteIsTextNode(content)) { $template = []; } else { $template = removeComments(wrapTemplate(templateNamespace, trim(content))); } compileNode = $template[0]; if ($template.length != 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) { throw $compileMinErr('tplrt', "Template for directive '{0}' must have exactly one root element. {1}", origAsyncDirective.name, templateUrl); } tempTemplateAttrs = {$attr: {}}; replaceWith($rootElement, $compileNode, compileNode); var templateDirectives = collectDirectives(compileNode, [], tempTemplateAttrs); if (isObject(origAsyncDirective.scope)) { // the original directive that caused the template to be loaded async required // an isolate scope markDirectiveScope(templateDirectives, true); } directives = templateDirectives.concat(directives); mergeTemplateAttributes(tAttrs, tempTemplateAttrs); } else { compileNode = beforeTemplateCompileNode; $compileNode.html(content); } directives.unshift(derivedSyncDirective); afterTemplateNodeLinkFn = applyDirectivesToNode(directives, compileNode, tAttrs, childTranscludeFn, $compileNode, origAsyncDirective, preLinkFns, postLinkFns, previousCompileContext); forEach($rootElement, function(node, i) { if (node == compileNode) { $rootElement[i] = $compileNode[0]; } }); afterTemplateChildLinkFn = compileNodes($compileNode[0].childNodes, childTranscludeFn); while (linkQueue.length) { var scope = linkQueue.shift(), beforeTemplateLinkNode = linkQueue.shift(), linkRootElement = linkQueue.shift(), boundTranscludeFn = linkQueue.shift(), linkNode = $compileNode[0]; if (scope.$$destroyed) continue; if (beforeTemplateLinkNode !== beforeTemplateCompileNode) { var oldClasses = beforeTemplateLinkNode.className; if (!(previousCompileContext.hasElementTranscludeDirective && origAsyncDirective.replace)) { // it was cloned therefore we have to clone as well. linkNode = jqLiteClone(compileNode); } replaceWith(linkRootElement, jqLite(beforeTemplateLinkNode), linkNode); // Copy in CSS classes from original node safeAddClass(jqLite(linkNode), oldClasses); } if (afterTemplateNodeLinkFn.transcludeOnThisElement) { childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn); } else { childBoundTranscludeFn = boundTranscludeFn; } afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, linkNode, $rootElement, childBoundTranscludeFn); } linkQueue = null; }); return function delayedNodeLinkFn(ignoreChildLinkFn, scope, node, rootElement, boundTranscludeFn) { var childBoundTranscludeFn = boundTranscludeFn; if (scope.$$destroyed) return; if (linkQueue) { linkQueue.push(scope, node, rootElement, childBoundTranscludeFn); } else { if (afterTemplateNodeLinkFn.transcludeOnThisElement) { childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn); } afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, childBoundTranscludeFn); } }; } /** * Sorting function for bound directives. */ function byPriority(a, b) { var diff = b.priority - a.priority; if (diff !== 0) return diff; if (a.name !== b.name) return (a.name < b.name) ? -1 : 1; return a.index - b.index; } function assertNoDuplicate(what, previousDirective, directive, element) { function wrapModuleNameIfDefined(moduleName) { return moduleName ? (' (module: ' + moduleName + ')') : ''; } if (previousDirective) { throw $compileMinErr('multidir', 'Multiple directives [{0}{1}, {2}{3}] asking for {4} on: {5}', previousDirective.name, wrapModuleNameIfDefined(previousDirective.$$moduleName), directive.name, wrapModuleNameIfDefined(directive.$$moduleName), what, startingTag(element)); } } function addTextInterpolateDirective(directives, text) { var interpolateFn = $interpolate(text, true); if (interpolateFn) { directives.push({ priority: 0, compile: function textInterpolateCompileFn(templateNode) { var templateNodeParent = templateNode.parent(), hasCompileParent = !!templateNodeParent.length; // When transcluding a template that has bindings in the root // we don't have a parent and thus need to add the class during linking fn. if (hasCompileParent) compile.$$addBindingClass(templateNodeParent); return function textInterpolateLinkFn(scope, node) { var parent = node.parent(); if (!hasCompileParent) compile.$$addBindingClass(parent); compile.$$addBindingInfo(parent, interpolateFn.expressions); scope.$watch(interpolateFn, function interpolateFnWatchAction(value) { node[0].nodeValue = value; }); }; } }); } } function wrapTemplate(type, template) { type = lowercase(type || 'html'); switch (type) { case 'svg': case 'math': var wrapper = window.document.createElement('div'); wrapper.innerHTML = '<' + type + '>' + template + ''; return wrapper.childNodes[0].childNodes; default: return template; } } function getTrustedContext(node, attrNormalizedName) { if (attrNormalizedName == "srcdoc") { return $sce.HTML; } var tag = nodeName_(node); // maction[xlink:href] can source SVG. It's not limited to . if (attrNormalizedName == "xlinkHref" || (tag == "form" && attrNormalizedName == "action") || (tag != "img" && (attrNormalizedName == "src" || attrNormalizedName == "ngSrc"))) { return $sce.RESOURCE_URL; } } function addAttrInterpolateDirective(node, directives, value, name, allOrNothing) { var trustedContext = getTrustedContext(node, name); allOrNothing = ALL_OR_NOTHING_ATTRS[name] || allOrNothing; var interpolateFn = $interpolate(value, true, trustedContext, allOrNothing); // no interpolation found -> ignore if (!interpolateFn) return; if (name === "multiple" && nodeName_(node) === "select") { throw $compileMinErr("selmulti", "Binding to the 'multiple' attribute is not supported. Element: {0}", startingTag(node)); } directives.push({ priority: 100, compile: function() { return { pre: function attrInterpolatePreLinkFn(scope, element, attr) { var $$observers = (attr.$$observers || (attr.$$observers = createMap())); if (EVENT_HANDLER_ATTR_REGEXP.test(name)) { throw $compileMinErr('nodomevents', "Interpolations for HTML DOM event attributes are disallowed. Please use the " + "ng- versions (such as ng-click instead of onclick) instead."); } // If the attribute has changed since last $interpolate()ed var newValue = attr[name]; if (newValue !== value) { // we need to interpolate again since the attribute value has been updated // (e.g. by another directive's compile function) // ensure unset/empty values make interpolateFn falsy interpolateFn = newValue && $interpolate(newValue, true, trustedContext, allOrNothing); value = newValue; } // if attribute was updated so that there is no interpolation going on we don't want to // register any observers if (!interpolateFn) return; // initialize attr object so that it's ready in case we need the value for isolate // scope initialization, otherwise the value would not be available from isolate // directive's linking fn during linking phase attr[name] = interpolateFn(scope); ($$observers[name] || ($$observers[name] = [])).$$inter = true; (attr.$$observers && attr.$$observers[name].$$scope || scope). $watch(interpolateFn, function interpolateFnWatchAction(newValue, oldValue) { //special case for class attribute addition + removal //so that class changes can tap into the animation //hooks provided by the $animate service. Be sure to //skip animations when the first digest occurs (when //both the new and the old values are the same) since //the CSS classes are the non-interpolated values if (name === 'class' && newValue != oldValue) { attr.$updateClass(newValue, oldValue); } else { attr.$set(name, newValue); } }); } }; } }); } /** * This is a special jqLite.replaceWith, which can replace items which * have no parents, provided that the containing jqLite collection is provided. * * @param {JqLite=} $rootElement The root of the compile tree. Used so that we can replace nodes * in the root of the tree. * @param {JqLite} elementsToRemove The jqLite element which we are going to replace. We keep * the shell, but replace its DOM node reference. * @param {Node} newNode The new DOM node. */ function replaceWith($rootElement, elementsToRemove, newNode) { var firstElementToRemove = elementsToRemove[0], removeCount = elementsToRemove.length, parent = firstElementToRemove.parentNode, i, ii; if ($rootElement) { for (i = 0, ii = $rootElement.length; i < ii; i++) { if ($rootElement[i] == firstElementToRemove) { $rootElement[i++] = newNode; for (var j = i, j2 = j + removeCount - 1, jj = $rootElement.length; j < jj; j++, j2++) { if (j2 < jj) { $rootElement[j] = $rootElement[j2]; } else { delete $rootElement[j]; } } $rootElement.length -= removeCount - 1; // If the replaced element is also the jQuery .context then replace it // .context is a deprecated jQuery api, so we should set it only when jQuery set it // http://api.jquery.com/context/ if ($rootElement.context === firstElementToRemove) { $rootElement.context = newNode; } break; } } } if (parent) { parent.replaceChild(newNode, firstElementToRemove); } // Append all the `elementsToRemove` to a fragment. This will... // - remove them from the DOM // - allow them to still be traversed with .nextSibling // - allow a single fragment.qSA to fetch all elements being removed var fragment = window.document.createDocumentFragment(); for (i = 0; i < removeCount; i++) { fragment.appendChild(elementsToRemove[i]); } if (jqLite.hasData(firstElementToRemove)) { // Copy over user data (that includes Angular's $scope etc.). Don't copy private // data here because there's no public interface in jQuery to do that and copying over // event listeners (which is the main use of private data) wouldn't work anyway. jqLite.data(newNode, jqLite.data(firstElementToRemove)); // Remove $destroy event listeners from `firstElementToRemove` jqLite(firstElementToRemove).off('$destroy'); } // Cleanup any data/listeners on the elements and children. // This includes invoking the $destroy event on any elements with listeners. jqLite.cleanData(fragment.querySelectorAll('*')); // Update the jqLite collection to only contain the `newNode` for (i = 1; i < removeCount; i++) { delete elementsToRemove[i]; } elementsToRemove[0] = newNode; elementsToRemove.length = 1; } function cloneAndAnnotateFn(fn, annotation) { return extend(function() { return fn.apply(null, arguments); }, fn, annotation); } function invokeLinkFn(linkFn, scope, $element, attrs, controllers, transcludeFn) { try { linkFn(scope, $element, attrs, controllers, transcludeFn); } catch (e) { $exceptionHandler(e, startingTag($element)); } } // Set up $watches for isolate scope and controller bindings. This process // only occurs for isolate scopes and new scopes with controllerAs. function initializeDirectiveBindings(scope, attrs, destination, bindings, directive) { var removeWatchCollection = []; var initialChanges = {}; var changes; forEach(bindings, function initializeBinding(definition, scopeName) { var attrName = definition.attrName, optional = definition.optional, mode = definition.mode, // @, =, or & lastValue, parentGet, parentSet, compare, removeWatch; switch (mode) { case '@': if (!optional && !hasOwnProperty.call(attrs, attrName)) { destination[scopeName] = attrs[attrName] = void 0; } attrs.$observe(attrName, function(value) { if (isString(value) || isBoolean(value)) { var oldValue = destination[scopeName]; recordChanges(scopeName, value, oldValue); destination[scopeName] = value; } }); attrs.$$observers[attrName].$$scope = scope; lastValue = attrs[attrName]; if (isString(lastValue)) { // If the attribute has been provided then we trigger an interpolation to ensure // the value is there for use in the link fn destination[scopeName] = $interpolate(lastValue)(scope); } else if (isBoolean(lastValue)) { // If the attributes is one of the BOOLEAN_ATTR then Angular will have converted // the value to boolean rather than a string, so we special case this situation destination[scopeName] = lastValue; } initialChanges[scopeName] = new SimpleChange(_UNINITIALIZED_VALUE, destination[scopeName]); break; case '=': if (!hasOwnProperty.call(attrs, attrName)) { if (optional) break; attrs[attrName] = void 0; } if (optional && !attrs[attrName]) break; parentGet = $parse(attrs[attrName]); if (parentGet.literal) { compare = equals; } else { compare = function simpleCompare(a, b) { return a === b || (a !== a && b !== b); }; } parentSet = parentGet.assign || function() { // reset the change, or we will throw this exception on every $digest lastValue = destination[scopeName] = parentGet(scope); throw $compileMinErr('nonassign', "Expression '{0}' in attribute '{1}' used with directive '{2}' is non-assignable!", attrs[attrName], attrName, directive.name); }; lastValue = destination[scopeName] = parentGet(scope); var parentValueWatch = function parentValueWatch(parentValue) { if (!compare(parentValue, destination[scopeName])) { // we are out of sync and need to copy if (!compare(parentValue, lastValue)) { // parent changed and it has precedence destination[scopeName] = parentValue; } else { // if the parent can be assigned then do so parentSet(scope, parentValue = destination[scopeName]); } } return lastValue = parentValue; }; parentValueWatch.$stateful = true; if (definition.collection) { removeWatch = scope.$watchCollection(attrs[attrName], parentValueWatch); } else { removeWatch = scope.$watch($parse(attrs[attrName], parentValueWatch), null, parentGet.literal); } removeWatchCollection.push(removeWatch); break; case '<': if (!hasOwnProperty.call(attrs, attrName)) { if (optional) break; attrs[attrName] = void 0; } if (optional && !attrs[attrName]) break; parentGet = $parse(attrs[attrName]); var initialValue = destination[scopeName] = parentGet(scope); initialChanges[scopeName] = new SimpleChange(_UNINITIALIZED_VALUE, destination[scopeName]); removeWatch = scope.$watch(parentGet, function parentValueWatchAction(newValue, oldValue) { if (oldValue === newValue) { if (oldValue === initialValue) return; oldValue = initialValue; } recordChanges(scopeName, newValue, oldValue); destination[scopeName] = newValue; }, parentGet.literal); removeWatchCollection.push(removeWatch); break; case '&': // Don't assign Object.prototype method to scope parentGet = attrs.hasOwnProperty(attrName) ? $parse(attrs[attrName]) : noop; // Don't assign noop to destination if expression is not valid if (parentGet === noop && optional) break; destination[scopeName] = function(locals) { return parentGet(scope, locals); }; break; } }); function recordChanges(key, currentValue, previousValue) { if (isFunction(destination.$onChanges) && currentValue !== previousValue) { // If we have not already scheduled the top level onChangesQueue handler then do so now if (!onChangesQueue) { scope.$$postDigest(flushOnChangesQueue); onChangesQueue = []; } // If we have not already queued a trigger of onChanges for this controller then do so now if (!changes) { changes = {}; onChangesQueue.push(triggerOnChangesHook); } // If the has been a change on this property already then we need to reuse the previous value if (changes[key]) { previousValue = changes[key].previousValue; } // Store this change changes[key] = new SimpleChange(previousValue, currentValue); } } function triggerOnChangesHook() { destination.$onChanges(changes); // Now clear the changes so that we schedule onChanges when more changes arrive changes = undefined; } return { initialChanges: initialChanges, removeWatches: removeWatchCollection.length && function removeWatches() { for (var i = 0, ii = removeWatchCollection.length; i < ii; ++i) { removeWatchCollection[i](); } } }; } }]; } function SimpleChange(previous, current) { this.previousValue = previous; this.currentValue = current; } SimpleChange.prototype.isFirstChange = function() { return this.previousValue === _UNINITIALIZED_VALUE; }; var PREFIX_REGEXP = /^((?:x|data)[\:\-_])/i; /** * Converts all accepted directives format into proper directive name. * @param name Name to normalize */ function directiveNormalize(name) { return camelCase(name.replace(PREFIX_REGEXP, '')); } /** * @ngdoc type * @name $compile.directive.Attributes * * @description * A shared object between directive compile / linking functions which contains normalized DOM * element attributes. The values reflect current binding state `{{ }}`. The normalization is * needed since all of these are treated as equivalent in Angular: * * ``` * * ``` */ /** * @ngdoc property * @name $compile.directive.Attributes#$attr * * @description * A map of DOM element attribute names to the normalized name. This is * needed to do reverse lookup from normalized name back to actual name. */ /** * @ngdoc method * @name $compile.directive.Attributes#$set * @kind function * * @description * Set DOM element attribute value. * * * @param {string} name Normalized element attribute name of the property to modify. The name is * reverse-translated using the {@link ng.$compile.directive.Attributes#$attr $attr} * property to the original name. * @param {string} value Value to set the attribute to. The value can be an interpolated string. */ /** * Closure compiler type information */ function nodesetLinkingFn( /* angular.Scope */ scope, /* NodeList */ nodeList, /* Element */ rootElement, /* function(Function) */ boundTranscludeFn ) {} function directiveLinkingFn( /* nodesetLinkingFn */ nodesetLinkingFn, /* angular.Scope */ scope, /* Node */ node, /* Element */ rootElement, /* function(Function) */ boundTranscludeFn ) {} function tokenDifference(str1, str2) { var values = '', tokens1 = str1.split(/\s+/), tokens2 = str2.split(/\s+/); outer: for (var i = 0; i < tokens1.length; i++) { var token = tokens1[i]; for (var j = 0; j < tokens2.length; j++) { if (token == tokens2[j]) continue outer; } values += (values.length > 0 ? ' ' : '') + token; } return values; } function removeComments(jqNodes) { jqNodes = jqLite(jqNodes); var i = jqNodes.length; if (i <= 1) { return jqNodes; } while (i--) { var node = jqNodes[i]; if (node.nodeType === NODE_TYPE_COMMENT) { splice.call(jqNodes, i, 1); } } return jqNodes; } var $controllerMinErr = minErr('$controller'); var CNTRL_REG = /^(\S+)(\s+as\s+([\w$]+))?$/; function identifierForController(controller, ident) { if (ident && isString(ident)) return ident; if (isString(controller)) { var match = CNTRL_REG.exec(controller); if (match) return match[3]; } } /** * @ngdoc provider * @name $controllerProvider * @description * The {@link ng.$controller $controller service} is used by Angular to create new * controllers. * * This provider allows controller registration via the * {@link ng.$controllerProvider#register register} method. */ function $ControllerProvider() { var controllers = {}, globals = false; /** * @ngdoc method * @name $controllerProvider#has * @param {string} name Controller name to check. */ this.has = function(name) { return controllers.hasOwnProperty(name); }; /** * @ngdoc method * @name $controllerProvider#register * @param {string|Object} name Controller name, or an object map of controllers where the keys are * the names and the values are the constructors. * @param {Function|Array} constructor Controller constructor fn (optionally decorated with DI * annotations in the array notation). */ this.register = function(name, constructor) { assertNotHasOwnProperty(name, 'controller'); if (isObject(name)) { extend(controllers, name); } else { controllers[name] = constructor; } }; /** * @ngdoc method * @name $controllerProvider#allowGlobals * @description If called, allows `$controller` to find controller constructors on `window` */ this.allowGlobals = function() { globals = true; }; this.$get = ['$injector', '$window', function($injector, $window) { /** * @ngdoc service * @name $controller * @requires $injector * * @param {Function|string} constructor If called with a function then it's considered to be the * controller constructor function. Otherwise it's considered to be a string which is used * to retrieve the controller constructor using the following steps: * * * check if a controller with given name is registered via `$controllerProvider` * * check if evaluating the string on the current scope returns a constructor * * if $controllerProvider#allowGlobals, check `window[constructor]` on the global * `window` object (not recommended) * * The string can use the `controller as property` syntax, where the controller instance is published * as the specified property on the `scope`; the `scope` must be injected into `locals` param for this * to work correctly. * * @param {Object} locals Injection locals for Controller. * @return {Object} Instance of given controller. * * @description * `$controller` service is responsible for instantiating controllers. * * It's just a simple call to {@link auto.$injector $injector}, but extracted into * a service, so that one can override this service with [BC version](https://gist.github.com/1649788). */ return function $controller(expression, locals, later, ident) { // PRIVATE API: // param `later` --- indicates that the controller's constructor is invoked at a later time. // If true, $controller will allocate the object with the correct // prototype chain, but will not invoke the controller until a returned // callback is invoked. // param `ident` --- An optional label which overrides the label parsed from the controller // expression, if any. var instance, match, constructor, identifier; later = later === true; if (ident && isString(ident)) { identifier = ident; } if (isString(expression)) { match = expression.match(CNTRL_REG); if (!match) { throw $controllerMinErr('ctrlfmt', "Badly formed controller string '{0}'. " + "Must match `__name__ as __id__` or `__name__`.", expression); } constructor = match[1], identifier = identifier || match[3]; expression = controllers.hasOwnProperty(constructor) ? controllers[constructor] : getter(locals.$scope, constructor, true) || (globals ? getter($window, constructor, true) : undefined); assertArgFn(expression, constructor, true); } if (later) { // Instantiate controller later: // This machinery is used to create an instance of the object before calling the // controller's constructor itself. // // This allows properties to be added to the controller before the constructor is // invoked. Primarily, this is used for isolate scope bindings in $compile. // // This feature is not intended for use by applications, and is thus not documented // publicly. // Object creation: http://jsperf.com/create-constructor/2 var controllerPrototype = (isArray(expression) ? expression[expression.length - 1] : expression).prototype; instance = Object.create(controllerPrototype || null); if (identifier) { addIdentifier(locals, identifier, instance, constructor || expression.name); } var instantiate; return instantiate = extend(function $controllerInit() { var result = $injector.invoke(expression, instance, locals, constructor); if (result !== instance && (isObject(result) || isFunction(result))) { instance = result; if (identifier) { // If result changed, re-assign controllerAs value to scope. addIdentifier(locals, identifier, instance, constructor || expression.name); } } return instance; }, { instance: instance, identifier: identifier }); } instance = $injector.instantiate(expression, locals, constructor); if (identifier) { addIdentifier(locals, identifier, instance, constructor || expression.name); } return instance; }; function addIdentifier(locals, identifier, instance, name) { if (!(locals && isObject(locals.$scope))) { throw minErr('$controller')('noscp', "Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.", name, identifier); } locals.$scope[identifier] = instance; } }]; } /** * @ngdoc service * @name $document * @requires $window * * @description * A {@link angular.element jQuery or jqLite} wrapper for the browser's `window.document` object. * * @example

$document title:

window.document title:

angular.module('documentExample', []) .controller('ExampleController', ['$scope', '$document', function($scope, $document) { $scope.title = $document[0].title; $scope.windowTitle = angular.element(window.document)[0].title; }]);
*/ function $DocumentProvider() { this.$get = ['$window', function(window) { return jqLite(window.document); }]; } /** * @ngdoc service * @name $exceptionHandler * @requires ng.$log * * @description * Any uncaught exception in angular expressions is delegated to this service. * The default implementation simply delegates to `$log.error` which logs it into * the browser console. * * In unit tests, if `angular-mocks.js` is loaded, this service is overridden by * {@link ngMock.$exceptionHandler mock $exceptionHandler} which aids in testing. * * ## Example: * * The example below will overwrite the default `$exceptionHandler` in order to (a) log uncaught * errors to the backend for later inspection by the developers and (b) to use `$log.warn()` instead * of `$log.error()`. * * ```js * angular. * module('exceptionOverwrite', []). * factory('$exceptionHandler', ['$log', 'logErrorsToBackend', function($log, logErrorsToBackend) { * return function myExceptionHandler(exception, cause) { * logErrorsToBackend(exception, cause); * $log.warn(exception, cause); * }; * }); * ``` * *
* Note, that code executed in event-listeners (even those registered using jqLite's `on`/`bind` * methods) does not delegate exceptions to the {@link ng.$exceptionHandler $exceptionHandler} * (unless executed during a digest). * * If you wish, you can manually delegate exceptions, e.g. * `try { ... } catch(e) { $exceptionHandler(e); }` * * @param {Error} exception Exception associated with the error. * @param {string=} cause Optional information about the context in which * the error was thrown. * */ function $ExceptionHandlerProvider() { this.$get = ['$log', function($log) { return function(exception, cause) { $log.error.apply($log, arguments); }; }]; } var $$ForceReflowProvider = function() { this.$get = ['$document', function($document) { return function(domNode) { //the line below will force the browser to perform a repaint so //that all the animated elements within the animation frame will //be properly updated and drawn on screen. This is required to //ensure that the preparation animation is properly flushed so that //the active state picks up from there. DO NOT REMOVE THIS LINE. //DO NOT OPTIMIZE THIS LINE. THE MINIFIER WILL REMOVE IT OTHERWISE WHICH //WILL RESULT IN AN UNPREDICTABLE BUG THAT IS VERY HARD TO TRACK DOWN AND //WILL TAKE YEARS AWAY FROM YOUR LIFE. if (domNode) { if (!domNode.nodeType && domNode instanceof jqLite) { domNode = domNode[0]; } } else { domNode = $document[0].body; } return domNode.offsetWidth + 1; }; }]; }; var APPLICATION_JSON = 'application/json'; var CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': APPLICATION_JSON + ';charset=utf-8'}; var JSON_START = /^\[|^\{(?!\{)/; var JSON_ENDS = { '[': /]$/, '{': /}$/ }; var JSON_PROTECTION_PREFIX = /^\)\]\}',?\n/; var $httpMinErr = minErr('$http'); var $httpMinErrLegacyFn = function(method) { return function() { throw $httpMinErr('legacy', 'The method `{0}` on the promise returned from `$http` has been disabled.', method); }; }; function serializeValue(v) { if (isObject(v)) { return isDate(v) ? v.toISOString() : toJson(v); } return v; } function $HttpParamSerializerProvider() { /** * @ngdoc service * @name $httpParamSerializer * @description * * Default {@link $http `$http`} params serializer that converts objects to strings * according to the following rules: * * * `{'foo': 'bar'}` results in `foo=bar` * * `{'foo': Date.now()}` results in `foo=2015-04-01T09%3A50%3A49.262Z` (`toISOString()` and encoded representation of a Date object) * * `{'foo': ['bar', 'baz']}` results in `foo=bar&foo=baz` (repeated key for each array element) * * `{'foo': {'bar':'baz'}}` results in `foo=%7B%22bar%22%3A%22baz%22%7D"` (stringified and encoded representation of an object) * * Note that serializer will sort the request parameters alphabetically. * */ this.$get = function() { return function ngParamSerializer(params) { if (!params) return ''; var parts = []; forEachSorted(params, function(value, key) { if (value === null || isUndefined(value)) return; if (isArray(value)) { forEach(value, function(v) { parts.push(encodeUriQuery(key) + '=' + encodeUriQuery(serializeValue(v))); }); } else { parts.push(encodeUriQuery(key) + '=' + encodeUriQuery(serializeValue(value))); } }); return parts.join('&'); }; }; } function $HttpParamSerializerJQLikeProvider() { /** * @ngdoc service * @name $httpParamSerializerJQLike * @description * * Alternative {@link $http `$http`} params serializer that follows * jQuery's [`param()`](http://api.jquery.com/jquery.param/) method logic. * The serializer will also sort the params alphabetically. * * To use it for serializing `$http` request parameters, set it as the `paramSerializer` property: * * ```js * $http({ * url: myUrl, * method: 'GET', * params: myParams, * paramSerializer: '$httpParamSerializerJQLike' * }); * ``` * * It is also possible to set it as the default `paramSerializer` in the * {@link $httpProvider#defaults `$httpProvider`}. * * Additionally, you can inject the serializer and use it explicitly, for example to serialize * form data for submission: * * ```js * .controller(function($http, $httpParamSerializerJQLike) { * //... * * $http({ * url: myUrl, * method: 'POST', * data: $httpParamSerializerJQLike(myData), * headers: { * 'Content-Type': 'application/x-www-form-urlencoded' * } * }); * * }); * ``` * * */ this.$get = function() { return function jQueryLikeParamSerializer(params) { if (!params) return ''; var parts = []; serialize(params, '', true); return parts.join('&'); function serialize(toSerialize, prefix, topLevel) { if (toSerialize === null || isUndefined(toSerialize)) return; if (isArray(toSerialize)) { forEach(toSerialize, function(value, index) { serialize(value, prefix + '[' + (isObject(value) ? index : '') + ']'); }); } else if (isObject(toSerialize) && !isDate(toSerialize)) { forEachSorted(toSerialize, function(value, key) { serialize(value, prefix + (topLevel ? '' : '[') + key + (topLevel ? '' : ']')); }); } else { parts.push(encodeUriQuery(prefix) + '=' + encodeUriQuery(serializeValue(toSerialize))); } } }; }; } function defaultHttpResponseTransform(data, headers) { if (isString(data)) { // Strip json vulnerability protection prefix and trim whitespace var tempData = data.replace(JSON_PROTECTION_PREFIX, '').trim(); if (tempData) { var contentType = headers('Content-Type'); if ((contentType && (contentType.indexOf(APPLICATION_JSON) === 0)) || isJsonLike(tempData)) { data = fromJson(tempData); } } } return data; } function isJsonLike(str) { var jsonStart = str.match(JSON_START); return jsonStart && JSON_ENDS[jsonStart[0]].test(str); } /** * Parse headers into key value object * * @param {string} headers Raw headers as a string * @returns {Object} Parsed headers as key value object */ function parseHeaders(headers) { var parsed = createMap(), i; function fillInParsed(key, val) { if (key) { parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; } } if (isString(headers)) { forEach(headers.split('\n'), function(line) { i = line.indexOf(':'); fillInParsed(lowercase(trim(line.substr(0, i))), trim(line.substr(i + 1))); }); } else if (isObject(headers)) { forEach(headers, function(headerVal, headerKey) { fillInParsed(lowercase(headerKey), trim(headerVal)); }); } return parsed; } /** * Returns a function that provides access to parsed headers. * * Headers are lazy parsed when first requested. * @see parseHeaders * * @param {(string|Object)} headers Headers to provide access to. * @returns {function(string=)} Returns a getter function which if called with: * * - if called with single an argument returns a single header value or null * - if called with no arguments returns an object containing all headers. */ function headersGetter(headers) { var headersObj; return function(name) { if (!headersObj) headersObj = parseHeaders(headers); if (name) { var value = headersObj[lowercase(name)]; if (value === void 0) { value = null; } return value; } return headersObj; }; } /** * Chain all given functions * * This function is used for both request and response transforming * * @param {*} data Data to transform. * @param {function(string=)} headers HTTP headers getter fn. * @param {number} status HTTP status code of the response. * @param {(Function|Array.)} fns Function or an array of functions. * @returns {*} Transformed data. */ function transformData(data, headers, status, fns) { if (isFunction(fns)) { return fns(data, headers, status); } forEach(fns, function(fn) { data = fn(data, headers, status); }); return data; } function isSuccess(status) { return 200 <= status && status < 300; } /** * @ngdoc provider * @name $httpProvider * @description * Use `$httpProvider` to change the default behavior of the {@link ng.$http $http} service. * */ function $HttpProvider() { /** * @ngdoc property * @name $httpProvider#defaults * @description * * Object containing default values for all {@link ng.$http $http} requests. * * - **`defaults.cache`** - {boolean|Object} - A boolean value or object created with * {@link ng.$cacheFactory `$cacheFactory`} to enable or disable caching of HTTP responses * by default. See {@link $http#caching $http Caching} for more information. * * - **`defaults.xsrfCookieName`** - {string} - Name of cookie containing the XSRF token. * Defaults value is `'XSRF-TOKEN'`. * * - **`defaults.xsrfHeaderName`** - {string} - Name of HTTP header to populate with the * XSRF token. Defaults value is `'X-XSRF-TOKEN'`. * * - **`defaults.headers`** - {Object} - Default headers for all $http requests. * Refer to {@link ng.$http#setting-http-headers $http} for documentation on * setting default headers. * - **`defaults.headers.common`** * - **`defaults.headers.post`** * - **`defaults.headers.put`** * - **`defaults.headers.patch`** * * * - **`defaults.paramSerializer`** - `{string|function(Object):string}` - A function * used to the prepare string representation of request parameters (specified as an object). * If specified as string, it is interpreted as a function registered with the {@link auto.$injector $injector}. * Defaults to {@link ng.$httpParamSerializer $httpParamSerializer}. * **/ var defaults = this.defaults = { // transform incoming response data transformResponse: [defaultHttpResponseTransform], // transform outgoing request data transformRequest: [function(d) { return isObject(d) && !isFile(d) && !isBlob(d) && !isFormData(d) ? toJson(d) : d; }], // default headers headers: { common: { 'Accept': 'application/json, text/plain, */*' }, post: shallowCopy(CONTENT_TYPE_APPLICATION_JSON), put: shallowCopy(CONTENT_TYPE_APPLICATION_JSON), patch: shallowCopy(CONTENT_TYPE_APPLICATION_JSON) }, xsrfCookieName: 'XSRF-TOKEN', xsrfHeaderName: 'X-XSRF-TOKEN', paramSerializer: '$httpParamSerializer' }; var useApplyAsync = false; /** * @ngdoc method * @name $httpProvider#useApplyAsync * @description * * Configure $http service to combine processing of multiple http responses received at around * the same time via {@link ng.$rootScope.Scope#$applyAsync $rootScope.$applyAsync}. This can result in * significant performance improvement for bigger applications that make many HTTP requests * concurrently (common during application bootstrap). * * Defaults to false. If no value is specified, returns the current configured value. * * @param {boolean=} value If true, when requests are loaded, they will schedule a deferred * "apply" on the next tick, giving time for subsequent requests in a roughly ~10ms window * to load and share the same digest cycle. * * @returns {boolean|Object} If a value is specified, returns the $httpProvider for chaining. * otherwise, returns the current configured value. **/ this.useApplyAsync = function(value) { if (isDefined(value)) { useApplyAsync = !!value; return this; } return useApplyAsync; }; var useLegacyPromise = true; /** * @ngdoc method * @name $httpProvider#useLegacyPromiseExtensions * @description * * Configure `$http` service to return promises without the shorthand methods `success` and `error`. * This should be used to make sure that applications work without these methods. * * Defaults to true. If no value is specified, returns the current configured value. * * @param {boolean=} value If true, `$http` will return a promise with the deprecated legacy `success` and `error` methods. * * @returns {boolean|Object} If a value is specified, returns the $httpProvider for chaining. * otherwise, returns the current configured value. **/ this.useLegacyPromiseExtensions = function(value) { if (isDefined(value)) { useLegacyPromise = !!value; return this; } return useLegacyPromise; }; /** * @ngdoc property * @name $httpProvider#interceptors * @description * * Array containing service factories for all synchronous or asynchronous {@link ng.$http $http} * pre-processing of request or postprocessing of responses. * * These service factories are ordered by request, i.e. they are applied in the same order as the * array, on request, but reverse order, on response. * * {@link ng.$http#interceptors Interceptors detailed info} **/ var interceptorFactories = this.interceptors = []; this.$get = ['$httpBackend', '$$cookieReader', '$cacheFactory', '$rootScope', '$q', '$injector', function($httpBackend, $$cookieReader, $cacheFactory, $rootScope, $q, $injector) { var defaultCache = $cacheFactory('$http'); /** * Make sure that default param serializer is exposed as a function */ defaults.paramSerializer = isString(defaults.paramSerializer) ? $injector.get(defaults.paramSerializer) : defaults.paramSerializer; /** * Interceptors stored in reverse order. Inner interceptors before outer interceptors. * The reversal is needed so that we can build up the interception chain around the * server request. */ var reversedInterceptors = []; forEach(interceptorFactories, function(interceptorFactory) { reversedInterceptors.unshift(isString(interceptorFactory) ? $injector.get(interceptorFactory) : $injector.invoke(interceptorFactory)); }); /** * @ngdoc service * @kind function * @name $http * @requires ng.$httpBackend * @requires $cacheFactory * @requires $rootScope * @requires $q * @requires $injector * * @description * The `$http` service is a core Angular service that facilitates communication with the remote * HTTP servers via the browser's [XMLHttpRequest](https://developer.mozilla.org/en/xmlhttprequest) * object or via [JSONP](http://en.wikipedia.org/wiki/JSONP). * * For unit testing applications that use `$http` service, see * {@link ngMock.$httpBackend $httpBackend mock}. * * For a higher level of abstraction, please check out the {@link ngResource.$resource * $resource} service. * * The $http API is based on the {@link ng.$q deferred/promise APIs} exposed by * the $q service. While for simple usage patterns this doesn't matter much, for advanced usage * it is important to familiarize yourself with these APIs and the guarantees they provide. * * * ## General usage * The `$http` service is a function which takes a single argument — a {@link $http#usage configuration object} — * that is used to generate an HTTP request and returns a {@link ng.$q promise}. * * ```js * // Simple GET request example: * $http({ * method: 'GET', * url: '/someUrl' * }).then(function successCallback(response) { * // this callback will be called asynchronously * // when the response is available * }, function errorCallback(response) { * // called asynchronously if an error occurs * // or server returns response with an error status. * }); * ``` * * The response object has these properties: * * - **data** – `{string|Object}` – The response body transformed with the transform * functions. * - **status** – `{number}` – HTTP status code of the response. * - **headers** – `{function([headerName])}` – Header getter function. * - **config** – `{Object}` – The configuration object that was used to generate the request. * - **statusText** – `{string}` – HTTP status text of the response. * * A response status code between 200 and 299 is considered a success status and will result in * the success callback being called. Any response status code outside of that range is * considered an error status and will result in the error callback being called. * Also, status codes less than -1 are normalized to zero. -1 usually means the request was * aborted, e.g. using a `config.timeout`. * Note that if the response is a redirect, XMLHttpRequest will transparently follow it, meaning * that the outcome (success or error) will be determined by the final response status code. * * * ## Shortcut methods * * Shortcut methods are also available. All shortcut methods require passing in the URL, and * request data must be passed in for POST/PUT requests. An optional config can be passed as the * last argument. * * ```js * $http.get('/someUrl', config).then(successCallback, errorCallback); * $http.post('/someUrl', data, config).then(successCallback, errorCallback); * ``` * * Complete list of shortcut methods: * * - {@link ng.$http#get $http.get} * - {@link ng.$http#head $http.head} * - {@link ng.$http#post $http.post} * - {@link ng.$http#put $http.put} * - {@link ng.$http#delete $http.delete} * - {@link ng.$http#jsonp $http.jsonp} * - {@link ng.$http#patch $http.patch} * * * ## Writing Unit Tests that use $http * When unit testing (using {@link ngMock ngMock}), it is necessary to call * {@link ngMock.$httpBackend#flush $httpBackend.flush()} to flush each pending * request using trained responses. * * ``` * $httpBackend.expectGET(...); * $http.get(...); * $httpBackend.flush(); * ``` * * ## Deprecation Notice *
* The `$http` legacy promise methods `success` and `error` have been deprecated. * Use the standard `then` method instead. * If {@link $httpProvider#useLegacyPromiseExtensions `$httpProvider.useLegacyPromiseExtensions`} is set to * `false` then these methods will throw {@link $http:legacy `$http/legacy`} error. *
* * ## Setting HTTP Headers * * The $http service will automatically add certain HTTP headers to all requests. These defaults * can be fully configured by accessing the `$httpProvider.defaults.headers` configuration * object, which currently contains this default configuration: * * - `$httpProvider.defaults.headers.common` (headers that are common for all requests): * - `Accept: application/json, text/plain, * / *` * - `$httpProvider.defaults.headers.post`: (header defaults for POST requests) * - `Content-Type: application/json` * - `$httpProvider.defaults.headers.put` (header defaults for PUT requests) * - `Content-Type: application/json` * * To add or overwrite these defaults, simply add or remove a property from these configuration * objects. To add headers for an HTTP method other than POST or PUT, simply add a new object * with the lowercased HTTP method name as the key, e.g. * `$httpProvider.defaults.headers.get = { 'My-Header' : 'value' }`. * * The defaults can also be set at runtime via the `$http.defaults` object in the same * fashion. For example: * * ``` * module.run(function($http) { * $http.defaults.headers.common.Authorization = 'Basic YmVlcDpib29w'; * }); * ``` * * In addition, you can supply a `headers` property in the config object passed when * calling `$http(config)`, which overrides the defaults without changing them globally. * * To explicitly remove a header automatically added via $httpProvider.defaults.headers on a per request basis, * Use the `headers` property, setting the desired header to `undefined`. For example: * * ```js * var req = { * method: 'POST', * url: 'http://example.com', * headers: { * 'Content-Type': undefined * }, * data: { test: 'test' } * } * * $http(req).then(function(){...}, function(){...}); * ``` * * ## Transforming Requests and Responses * * Both requests and responses can be transformed using transformation functions: `transformRequest` * and `transformResponse`. These properties can be a single function that returns * the transformed value (`function(data, headersGetter, status)`) or an array of such transformation functions, * which allows you to `push` or `unshift` a new transformation function into the transformation chain. * *
* **Note:** Angular does not make a copy of the `data` parameter before it is passed into the `transformRequest` pipeline. * That means changes to the properties of `data` are not local to the transform function (since Javascript passes objects by reference). * For example, when calling `$http.get(url, $scope.myObject)`, modifications to the object's properties in a transformRequest * function will be reflected on the scope and in any templates where the object is data-bound. * To prevent this, transform functions should have no side-effects. * If you need to modify properties, it is recommended to make a copy of the data, or create new object to return. *
* * ### Default Transformations * * The `$httpProvider` provider and `$http` service expose `defaults.transformRequest` and * `defaults.transformResponse` properties. If a request does not provide its own transformations * then these will be applied. * * You can augment or replace the default transformations by modifying these properties by adding to or * replacing the array. * * Angular provides the following default transformations: * * Request transformations (`$httpProvider.defaults.transformRequest` and `$http.defaults.transformRequest`): * * - If the `data` property of the request configuration object contains an object, serialize it * into JSON format. * * Response transformations (`$httpProvider.defaults.transformResponse` and `$http.defaults.transformResponse`): * * - If XSRF prefix is detected, strip it (see Security Considerations section below). * - If JSON response is detected, deserialize it using a JSON parser. * * * ### Overriding the Default Transformations Per Request * * If you wish override the request/response transformations only for a single request then provide * `transformRequest` and/or `transformResponse` properties on the configuration object passed * into `$http`. * * Note that if you provide these properties on the config object the default transformations will be * overwritten. If you wish to augment the default transformations then you must include them in your * local transformation array. * * The following code demonstrates adding a new response transformation to be run after the default response * transformations have been run. * * ```js * function appendTransform(defaults, transform) { * * // We can't guarantee that the default transformation is an array * defaults = angular.isArray(defaults) ? defaults : [defaults]; * * // Append the new transformation to the defaults * return defaults.concat(transform); * } * * $http({ * url: '...', * method: 'GET', * transformResponse: appendTransform($http.defaults.transformResponse, function(value) { * return doTransform(value); * }) * }); * ``` * * * ## Caching * * {@link ng.$http `$http`} responses are not cached by default. To enable caching, you must * set the config.cache value or the default cache value to TRUE or to a cache object (created * with {@link ng.$cacheFactory `$cacheFactory`}). If defined, the value of config.cache takes * precedence over the default cache value. * * In order to: * * cache all responses - set the default cache value to TRUE or to a cache object * * cache a specific response - set config.cache value to TRUE or to a cache object * * If caching is enabled, but neither the default cache nor config.cache are set to a cache object, * then the default `$cacheFactory($http)` object is used. * * The default cache value can be set by updating the * {@link ng.$http#defaults `$http.defaults.cache`} property or the * {@link $httpProvider#defaults `$httpProvider.defaults.cache`} property. * * When caching is enabled, {@link ng.$http `$http`} stores the response from the server using * the relevant cache object. The next time the same request is made, the response is returned * from the cache without sending a request to the server. * * Take note that: * * * Only GET and JSONP requests are cached. * * The cache key is the request URL including search parameters; headers are not considered. * * Cached responses are returned asynchronously, in the same way as responses from the server. * * If multiple identical requests are made using the same cache, which is not yet populated, * one request will be made to the server and remaining requests will return the same response. * * A cache-control header on the response does not affect if or how responses are cached. * * * ## Interceptors * * Before you start creating interceptors, be sure to understand the * {@link ng.$q $q and deferred/promise APIs}. * * For purposes of global error handling, authentication, or any kind of synchronous or * asynchronous pre-processing of request or postprocessing of responses, it is desirable to be * able to intercept requests before they are handed to the server and * responses before they are handed over to the application code that * initiated these requests. The interceptors leverage the {@link ng.$q * promise APIs} to fulfill this need for both synchronous and asynchronous pre-processing. * * The interceptors are service factories that are registered with the `$httpProvider` by * adding them to the `$httpProvider.interceptors` array. The factory is called and * injected with dependencies (if specified) and returns the interceptor. * * There are two kinds of interceptors (and two kinds of rejection interceptors): * * * `request`: interceptors get called with a http {@link $http#usage config} object. The function is free to * modify the `config` object or create a new one. The function needs to return the `config` * object directly, or a promise containing the `config` or a new `config` object. * * `requestError`: interceptor gets called when a previous interceptor threw an error or * resolved with a rejection. * * `response`: interceptors get called with http `response` object. The function is free to * modify the `response` object or create a new one. The function needs to return the `response` * object directly, or as a promise containing the `response` or a new `response` object. * * `responseError`: interceptor gets called when a previous interceptor threw an error or * resolved with a rejection. * * * ```js * // register the interceptor as a service * $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) { * return { * // optional method * 'request': function(config) { * // do something on success * return config; * }, * * // optional method * 'requestError': function(rejection) { * // do something on error * if (canRecover(rejection)) { * return responseOrNewPromise * } * return $q.reject(rejection); * }, * * * * // optional method * 'response': function(response) { * // do something on success * return response; * }, * * // optional method * 'responseError': function(rejection) { * // do something on error * if (canRecover(rejection)) { * return responseOrNewPromise * } * return $q.reject(rejection); * } * }; * }); * * $httpProvider.interceptors.push('myHttpInterceptor'); * * * // alternatively, register the interceptor via an anonymous factory * $httpProvider.interceptors.push(function($q, dependency1, dependency2) { * return { * 'request': function(config) { * // same as above * }, * * 'response': function(response) { * // same as above * } * }; * }); * ``` * * ## Security Considerations * * When designing web applications, consider security threats from: * * - [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx) * - [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) * * Both server and the client must cooperate in order to eliminate these threats. Angular comes * pre-configured with strategies that address these issues, but for this to work backend server * cooperation is required. * * ### JSON Vulnerability Protection * * A [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx) * allows third party website to turn your JSON resource URL into * [JSONP](http://en.wikipedia.org/wiki/JSONP) request under some conditions. To * counter this your server can prefix all JSON requests with following string `")]}',\n"`. * Angular will automatically strip the prefix before processing it as JSON. * * For example if your server needs to return: * ```js * ['one','two'] * ``` * * which is vulnerable to attack, your server can return: * ```js * )]}', * ['one','two'] * ``` * * Angular will strip the prefix, before processing the JSON. * * * ### Cross Site Request Forgery (XSRF) Protection * * [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) is an attack technique by * which the attacker can trick an authenticated user into unknowingly executing actions on your * website. Angular provides a mechanism to counter XSRF. When performing XHR requests, the * $http service reads a token from a cookie (by default, `XSRF-TOKEN`) and sets it as an HTTP * header (`X-XSRF-TOKEN`). Since only JavaScript that runs on your domain could read the * cookie, your server can be assured that the XHR came from JavaScript running on your domain. * The header will not be set for cross-domain requests. * * To take advantage of this, your server needs to set a token in a JavaScript readable session * cookie called `XSRF-TOKEN` on the first HTTP GET request. On subsequent XHR requests the * server can verify that the cookie matches `X-XSRF-TOKEN` HTTP header, and therefore be sure * that only JavaScript running on your domain could have sent the request. The token must be * unique for each user and must be verifiable by the server (to prevent the JavaScript from * making up its own tokens). We recommend that the token is a digest of your site's * authentication cookie with a [salt](https://en.wikipedia.org/wiki/Salt_(cryptography)) * for added security. * * The name of the headers can be specified using the xsrfHeaderName and xsrfCookieName * properties of either $httpProvider.defaults at config-time, $http.defaults at run-time, * or the per-request config object. * * In order to prevent collisions in environments where multiple Angular apps share the * same domain or subdomain, we recommend that each application uses unique cookie name. * * @param {object} config Object describing the request to be made and how it should be * processed. The object has following properties: * * - **method** – `{string}` – HTTP method (e.g. 'GET', 'POST', etc) * - **url** – `{string}` – Absolute or relative URL of the resource that is being requested. * - **params** – `{Object.}` – Map of strings or objects which will be serialized * with the `paramSerializer` and appended as GET parameters. * - **data** – `{string|Object}` – Data to be sent as the request message data. * - **headers** – `{Object}` – Map of strings or functions which return strings representing * HTTP headers to send to the server. If the return value of a function is null, the * header will not be sent. Functions accept a config object as an argument. * - **eventHandlers** - `{Object}` - Event listeners to be bound to the XMLHttpRequest object. * To bind events to the XMLHttpRequest upload object, use `uploadEventHandlers`. * The handler will be called in the context of a `$apply` block. * - **uploadEventHandlers** - `{Object}` - Event listeners to be bound to the XMLHttpRequest upload * object. To bind events to the XMLHttpRequest object, use `eventHandlers`. * The handler will be called in the context of a `$apply` block. * - **xsrfHeaderName** – `{string}` – Name of HTTP header to populate with the XSRF token. * - **xsrfCookieName** – `{string}` – Name of cookie containing the XSRF token. * - **transformRequest** – * `{function(data, headersGetter)|Array.}` – * transform function or an array of such functions. The transform function takes the http * request body and headers and returns its transformed (typically serialized) version. * See {@link ng.$http#overriding-the-default-transformations-per-request * Overriding the Default Transformations} * - **transformResponse** – * `{function(data, headersGetter, status)|Array.}` – * transform function or an array of such functions. The transform function takes the http * response body, headers and status and returns its transformed (typically deserialized) version. * See {@link ng.$http#overriding-the-default-transformations-per-request * Overriding the Default Transformations} * - **paramSerializer** - `{string|function(Object):string}` - A function used to * prepare the string representation of request parameters (specified as an object). * If specified as string, it is interpreted as function registered with the * {@link $injector $injector}, which means you can create your own serializer * by registering it as a {@link auto.$provide#service service}. * The default serializer is the {@link $httpParamSerializer $httpParamSerializer}; * alternatively, you can use the {@link $httpParamSerializerJQLike $httpParamSerializerJQLike} * - **cache** – `{boolean|Object}` – A boolean value or object created with * {@link ng.$cacheFactory `$cacheFactory`} to enable or disable caching of the HTTP response. * See {@link $http#caching $http Caching} for more information. * - **timeout** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise} * that should abort the request when resolved. * - **withCredentials** - `{boolean}` - whether to set the `withCredentials` flag on the * XHR object. See [requests with credentials](https://developer.mozilla.org/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials) * for more information. * - **responseType** - `{string}` - see * [XMLHttpRequest.responseType](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#xmlhttprequest-responsetype). * * @returns {HttpPromise} Returns a {@link ng.$q `Promise}` that will be resolved to a response object * when the request succeeds or fails. * * * @property {Array.} pendingRequests Array of config objects for currently pending * requests. This is primarily meant to be used for debugging purposes. * * * @example

http status code: {{status}}
http response data: {{data}}
angular.module('httpExample', []) .controller('FetchController', ['$scope', '$http', '$templateCache', function($scope, $http, $templateCache) { $scope.method = 'GET'; $scope.url = 'http-hello.html'; $scope.fetch = function() { $scope.code = null; $scope.response = null; $http({method: $scope.method, url: $scope.url, cache: $templateCache}). then(function(response) { $scope.status = response.status; $scope.data = response.data; }, function(response) { $scope.data = response.data || "Request failed"; $scope.status = response.status; }); }; $scope.updateModel = function(method, url) { $scope.method = method; $scope.url = url; }; }]); Hello, $http! var status = element(by.binding('status')); var data = element(by.binding('data')); var fetchBtn = element(by.id('fetchbtn')); var sampleGetBtn = element(by.id('samplegetbtn')); var sampleJsonpBtn = element(by.id('samplejsonpbtn')); var invalidJsonpBtn = element(by.id('invalidjsonpbtn')); it('should make an xhr GET request', function() { sampleGetBtn.click(); fetchBtn.click(); expect(status.getText()).toMatch('200'); expect(data.getText()).toMatch(/Hello, \$http!/); }); // Commented out due to flakes. See https://github.com/angular/angular.js/issues/9185 // it('should make a JSONP request to angularjs.org', function() { // sampleJsonpBtn.click(); // fetchBtn.click(); // expect(status.getText()).toMatch('200'); // expect(data.getText()).toMatch(/Super Hero!/); // }); it('should make JSONP request to invalid URL and invoke the error handler', function() { invalidJsonpBtn.click(); fetchBtn.click(); expect(status.getText()).toMatch('0'); expect(data.getText()).toMatch('Request failed'); });
*/ function $http(requestConfig) { if (!isObject(requestConfig)) { throw minErr('$http')('badreq', 'Http request configuration must be an object. Received: {0}', requestConfig); } if (!isString(requestConfig.url)) { throw minErr('$http')('badreq', 'Http request configuration url must be a string. Received: {0}', requestConfig.url); } var config = extend({ method: 'get', transformRequest: defaults.transformRequest, transformResponse: defaults.transformResponse, paramSerializer: defaults.paramSerializer }, requestConfig); config.headers = mergeHeaders(requestConfig); config.method = uppercase(config.method); config.paramSerializer = isString(config.paramSerializer) ? $injector.get(config.paramSerializer) : config.paramSerializer; var serverRequest = function(config) { var headers = config.headers; var reqData = transformData(config.data, headersGetter(headers), undefined, config.transformRequest); // strip content-type if data is undefined if (isUndefined(reqData)) { forEach(headers, function(value, header) { if (lowercase(header) === 'content-type') { delete headers[header]; } }); } if (isUndefined(config.withCredentials) && !isUndefined(defaults.withCredentials)) { config.withCredentials = defaults.withCredentials; } // send request return sendReq(config, reqData).then(transformResponse, transformResponse); }; var chain = [serverRequest, undefined]; var promise = $q.when(config); // apply interceptors forEach(reversedInterceptors, function(interceptor) { if (interceptor.request || interceptor.requestError) { chain.unshift(interceptor.request, interceptor.requestError); } if (interceptor.response || interceptor.responseError) { chain.push(interceptor.response, interceptor.responseError); } }); while (chain.length) { var thenFn = chain.shift(); var rejectFn = chain.shift(); promise = promise.then(thenFn, rejectFn); } if (useLegacyPromise) { promise.success = function(fn) { assertArgFn(fn, 'fn'); promise.then(function(response) { fn(response.data, response.status, response.headers, config); }); return promise; }; promise.error = function(fn) { assertArgFn(fn, 'fn'); promise.then(null, function(response) { fn(response.data, response.status, response.headers, config); }); return promise; }; } else { promise.success = $httpMinErrLegacyFn('success'); promise.error = $httpMinErrLegacyFn('error'); } return promise; function transformResponse(response) { // make a copy since the response must be cacheable var resp = extend({}, response); resp.data = transformData(response.data, response.headers, response.status, config.transformResponse); return (isSuccess(response.status)) ? resp : $q.reject(resp); } function executeHeaderFns(headers, config) { var headerContent, processedHeaders = {}; forEach(headers, function(headerFn, header) { if (isFunction(headerFn)) { headerContent = headerFn(config); if (headerContent != null) { processedHeaders[header] = headerContent; } } else { processedHeaders[header] = headerFn; } }); return processedHeaders; } function mergeHeaders(config) { var defHeaders = defaults.headers, reqHeaders = extend({}, config.headers), defHeaderName, lowercaseDefHeaderName, reqHeaderName; defHeaders = extend({}, defHeaders.common, defHeaders[lowercase(config.method)]); // using for-in instead of forEach to avoid unnecessary iteration after header has been found defaultHeadersIteration: for (defHeaderName in defHeaders) { lowercaseDefHeaderName = lowercase(defHeaderName); for (reqHeaderName in reqHeaders) { if (lowercase(reqHeaderName) === lowercaseDefHeaderName) { continue defaultHeadersIteration; } } reqHeaders[defHeaderName] = defHeaders[defHeaderName]; } // execute if header value is a function for merged headers return executeHeaderFns(reqHeaders, shallowCopy(config)); } } $http.pendingRequests = []; /** * @ngdoc method * @name $http#get * * @description * Shortcut method to perform `GET` request. * * @param {string} url Relative or absolute URL specifying the destination of the request * @param {Object=} config Optional configuration object * @returns {HttpPromise} Future object */ /** * @ngdoc method * @name $http#delete * * @description * Shortcut method to perform `DELETE` request. * * @param {string} url Relative or absolute URL specifying the destination of the request * @param {Object=} config Optional configuration object * @returns {HttpPromise} Future object */ /** * @ngdoc method * @name $http#head * * @description * Shortcut method to perform `HEAD` request. * * @param {string} url Relative or absolute URL specifying the destination of the request * @param {Object=} config Optional configuration object * @returns {HttpPromise} Future object */ /** * @ngdoc method * @name $http#jsonp * * @description * Shortcut method to perform `JSONP` request. * * @param {string} url Relative or absolute URL specifying the destination of the request. * The name of the callback should be the string `JSON_CALLBACK`. * @param {Object=} config Optional configuration object * @returns {HttpPromise} Future object */ createShortMethods('get', 'delete', 'head', 'jsonp'); /** * @ngdoc method * @name $http#post * * @description * Shortcut method to perform `POST` request. * * @param {string} url Relative or absolute URL specifying the destination of the request * @param {*} data Request content * @param {Object=} config Optional configuration object * @returns {HttpPromise} Future object */ /** * @ngdoc method * @name $http#put * * @description * Shortcut method to perform `PUT` request. * * @param {string} url Relative or absolute URL specifying the destination of the request * @param {*} data Request content * @param {Object=} config Optional configuration object * @returns {HttpPromise} Future object */ /** * @ngdoc method * @name $http#patch * * @description * Shortcut method to perform `PATCH` request. * * @param {string} url Relative or absolute URL specifying the destination of the request * @param {*} data Request content * @param {Object=} config Optional configuration object * @returns {HttpPromise} Future object */ createShortMethodsWithData('post', 'put', 'patch'); /** * @ngdoc property * @name $http#defaults * * @description * Runtime equivalent of the `$httpProvider.defaults` property. Allows configuration of * default headers, withCredentials as well as request and response transformations. * * See "Setting HTTP Headers" and "Transforming Requests and Responses" sections above. */ $http.defaults = defaults; return $http; function createShortMethods(names) { forEach(arguments, function(name) { $http[name] = function(url, config) { return $http(extend({}, config || {}, { method: name, url: url })); }; }); } function createShortMethodsWithData(name) { forEach(arguments, function(name) { $http[name] = function(url, data, config) { return $http(extend({}, config || {}, { method: name, url: url, data: data })); }; }); } /** * Makes the request. * * !!! ACCESSES CLOSURE VARS: * $httpBackend, defaults, $log, $rootScope, defaultCache, $http.pendingRequests */ function sendReq(config, reqData) { var deferred = $q.defer(), promise = deferred.promise, cache, cachedResp, reqHeaders = config.headers, url = buildUrl(config.url, config.paramSerializer(config.params)); $http.pendingRequests.push(config); promise.then(removePendingReq, removePendingReq); if ((config.cache || defaults.cache) && config.cache !== false && (config.method === 'GET' || config.method === 'JSONP')) { cache = isObject(config.cache) ? config.cache : isObject(defaults.cache) ? defaults.cache : defaultCache; } if (cache) { cachedResp = cache.get(url); if (isDefined(cachedResp)) { if (isPromiseLike(cachedResp)) { // cached request has already been sent, but there is no response yet cachedResp.then(resolvePromiseWithResult, resolvePromiseWithResult); } else { // serving from cache if (isArray(cachedResp)) { resolvePromise(cachedResp[1], cachedResp[0], shallowCopy(cachedResp[2]), cachedResp[3]); } else { resolvePromise(cachedResp, 200, {}, 'OK'); } } } else { // put the promise for the non-transformed response into cache as a placeholder cache.put(url, promise); } } // if we won't have the response in cache, set the xsrf headers and // send the request to the backend if (isUndefined(cachedResp)) { var xsrfValue = urlIsSameOrigin(config.url) ? $$cookieReader()[config.xsrfCookieName || defaults.xsrfCookieName] : undefined; if (xsrfValue) { reqHeaders[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue; } $httpBackend(config.method, url, reqData, done, reqHeaders, config.timeout, config.withCredentials, config.responseType, createApplyHandlers(config.eventHandlers), createApplyHandlers(config.uploadEventHandlers)); } return promise; function createApplyHandlers(eventHandlers) { if (eventHandlers) { var applyHandlers = {}; forEach(eventHandlers, function(eventHandler, key) { applyHandlers[key] = function(event) { if (useApplyAsync) { $rootScope.$applyAsync(callEventHandler); } else if ($rootScope.$$phase) { callEventHandler(); } else { $rootScope.$apply(callEventHandler); } function callEventHandler() { eventHandler(event); } }; }); return applyHandlers; } } /** * Callback registered to $httpBackend(): * - caches the response if desired * - resolves the raw $http promise * - calls $apply */ function done(status, response, headersString, statusText) { if (cache) { if (isSuccess(status)) { cache.put(url, [status, response, parseHeaders(headersString), statusText]); } else { // remove promise from the cache cache.remove(url); } } function resolveHttpPromise() { resolvePromise(response, status, headersString, statusText); } if (useApplyAsync) { $rootScope.$applyAsync(resolveHttpPromise); } else { resolveHttpPromise(); if (!$rootScope.$$phase) $rootScope.$apply(); } } /** * Resolves the raw $http promise. */ function resolvePromise(response, status, headers, statusText) { //status: HTTP response status code, 0, -1 (aborted by timeout / promise) status = status >= -1 ? status : 0; (isSuccess(status) ? deferred.resolve : deferred.reject)({ data: response, status: status, headers: headersGetter(headers), config: config, statusText: statusText }); } function resolvePromiseWithResult(result) { resolvePromise(result.data, result.status, shallowCopy(result.headers()), result.statusText); } function removePendingReq() { var idx = $http.pendingRequests.indexOf(config); if (idx !== -1) $http.pendingRequests.splice(idx, 1); } } function buildUrl(url, serializedParams) { if (serializedParams.length > 0) { url += ((url.indexOf('?') == -1) ? '?' : '&') + serializedParams; } return url; } }]; } /** * @ngdoc service * @name $xhrFactory * * @description * Factory function used to create XMLHttpRequest objects. * * Replace or decorate this service to create your own custom XMLHttpRequest objects. * * ``` * angular.module('myApp', []) * .factory('$xhrFactory', function() { * return function createXhr(method, url) { * return new window.XMLHttpRequest({mozSystem: true}); * }; * }); * ``` * * @param {string} method HTTP method of the request (GET, POST, PUT, ..) * @param {string} url URL of the request. */ function $xhrFactoryProvider() { this.$get = function() { return function createXhr() { return new window.XMLHttpRequest(); }; }; } /** * @ngdoc service * @name $httpBackend * @requires $window * @requires $document * @requires $xhrFactory * * @description * HTTP backend used by the {@link ng.$http service} that delegates to * XMLHttpRequest object or JSONP and deals with browser incompatibilities. * * You should never need to use this service directly, instead use the higher-level abstractions: * {@link ng.$http $http} or {@link ngResource.$resource $resource}. * * During testing this implementation is swapped with {@link ngMock.$httpBackend mock * $httpBackend} which can be trained with responses. */ function $HttpBackendProvider() { this.$get = ['$browser', '$window', '$document', '$xhrFactory', function($browser, $window, $document, $xhrFactory) { return createHttpBackend($browser, $xhrFactory, $browser.defer, $window.angular.callbacks, $document[0]); }]; } function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDocument) { // TODO(user): fix the signature return function(method, url, post, callback, headers, timeout, withCredentials, responseType, eventHandlers, uploadEventHandlers) { $browser.$$incOutstandingRequestCount(); url = url || $browser.url(); if (lowercase(method) == 'jsonp') { var callbackId = '_' + (callbacks.counter++).toString(36); callbacks[callbackId] = function(data) { callbacks[callbackId].data = data; callbacks[callbackId].called = true; }; var jsonpDone = jsonpReq(url.replace('JSON_CALLBACK', 'angular.callbacks.' + callbackId), callbackId, function(status, text) { completeRequest(callback, status, callbacks[callbackId].data, "", text); callbacks[callbackId] = noop; }); } else { var xhr = createXhr(method, url); xhr.open(method, url, true); forEach(headers, function(value, key) { if (isDefined(value)) { xhr.setRequestHeader(key, value); } }); xhr.onload = function requestLoaded() { var statusText = xhr.statusText || ''; // responseText is the old-school way of retrieving response (supported by IE9) // response/responseType properties were introduced in XHR Level2 spec (supported by IE10) var response = ('response' in xhr) ? xhr.response : xhr.responseText; // normalize IE9 bug (http://bugs.jquery.com/ticket/1450) var status = xhr.status === 1223 ? 204 : xhr.status; // fix status code when it is 0 (0 status is undocumented). // Occurs when accessing file resources or on Android 4.1 stock browser // while retrieving files from application cache. if (status === 0) { status = response ? 200 : urlResolve(url).protocol == 'file' ? 404 : 0; } completeRequest(callback, status, response, xhr.getAllResponseHeaders(), statusText); }; var requestError = function() { // The response is always empty // See https://xhr.spec.whatwg.org/#request-error-steps and https://fetch.spec.whatwg.org/#concept-network-error completeRequest(callback, -1, null, null, ''); }; xhr.onerror = requestError; xhr.onabort = requestError; forEach(eventHandlers, function(value, key) { xhr.addEventListener(key, value); }); forEach(uploadEventHandlers, function(value, key) { xhr.upload.addEventListener(key, value); }); if (withCredentials) { xhr.withCredentials = true; } if (responseType) { try { xhr.responseType = responseType; } catch (e) { // WebKit added support for the json responseType value on 09/03/2013 // https://bugs.webkit.org/show_bug.cgi?id=73648. Versions of Safari prior to 7 are // known to throw when setting the value "json" as the response type. Other older // browsers implementing the responseType // // The json response type can be ignored if not supported, because JSON payloads are // parsed on the client-side regardless. if (responseType !== 'json') { throw e; } } } xhr.send(isUndefined(post) ? null : post); } if (timeout > 0) { var timeoutId = $browserDefer(timeoutRequest, timeout); } else if (isPromiseLike(timeout)) { timeout.then(timeoutRequest); } function timeoutRequest() { jsonpDone && jsonpDone(); xhr && xhr.abort(); } function completeRequest(callback, status, response, headersString, statusText) { // cancel timeout and subsequent timeout promise resolution if (isDefined(timeoutId)) { $browserDefer.cancel(timeoutId); } jsonpDone = xhr = null; callback(status, response, headersString, statusText); $browser.$$completeOutstandingRequest(noop); } }; function jsonpReq(url, callbackId, done) { // we can't use jQuery/jqLite here because jQuery does crazy stuff with script elements, e.g.: // - fetches local scripts via XHR and evals them // - adds and immediately removes script elements from the document var script = rawDocument.createElement('script'), callback = null; script.type = "text/javascript"; script.src = url; script.async = true; callback = function(event) { removeEventListenerFn(script, "load", callback); removeEventListenerFn(script, "error", callback); rawDocument.body.removeChild(script); script = null; var status = -1; var text = "unknown"; if (event) { if (event.type === "load" && !callbacks[callbackId].called) { event = { type: "error" }; } text = event.type; status = event.type === "error" ? 404 : 200; } if (done) { done(status, text); } }; addEventListenerFn(script, "load", callback); addEventListenerFn(script, "error", callback); rawDocument.body.appendChild(script); return callback; } } var $interpolateMinErr = angular.$interpolateMinErr = minErr('$interpolate'); $interpolateMinErr.throwNoconcat = function(text) { throw $interpolateMinErr('noconcat', "Error while interpolating: {0}\nStrict Contextual Escaping disallows " + "interpolations that concatenate multiple expressions when a trusted value is " + "required. See http://docs.angularjs.org/api/ng.$sce", text); }; $interpolateMinErr.interr = function(text, err) { return $interpolateMinErr('interr', "Can't interpolate: {0}\n{1}", text, err.toString()); }; /** * @ngdoc provider * @name $interpolateProvider * * @description * * Used for configuring the interpolation markup. Defaults to `{{` and `}}`. * *
* This feature is sometimes used to mix different markup languages, e.g. to wrap an Angular * template within a Python Jinja template (or any other template language). Mixing templating * languages is **very dangerous**. The embedding template language will not safely escape Angular * expressions, so any user-controlled values in the template will cause Cross Site Scripting (XSS) * security bugs! *
* * @example
//demo.label//
it('should interpolate binding with custom symbols', function() { expect(element(by.binding('demo.label')).getText()).toBe('This binding is brought you by // interpolation symbols.'); });
*/ function $InterpolateProvider() { var startSymbol = '{{'; var endSymbol = '}}'; /** * @ngdoc method * @name $interpolateProvider#startSymbol * @description * Symbol to denote start of expression in the interpolated string. Defaults to `{{`. * * @param {string=} value new value to set the starting symbol to. * @returns {string|self} Returns the symbol when used as getter and self if used as setter. */ this.startSymbol = function(value) { if (value) { startSymbol = value; return this; } else { return startSymbol; } }; /** * @ngdoc method * @name $interpolateProvider#endSymbol * @description * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`. * * @param {string=} value new value to set the ending symbol to. * @returns {string|self} Returns the symbol when used as getter and self if used as setter. */ this.endSymbol = function(value) { if (value) { endSymbol = value; return this; } else { return endSymbol; } }; this.$get = ['$parse', '$exceptionHandler', '$sce', function($parse, $exceptionHandler, $sce) { var startSymbolLength = startSymbol.length, endSymbolLength = endSymbol.length, escapedStartRegexp = new RegExp(startSymbol.replace(/./g, escape), 'g'), escapedEndRegexp = new RegExp(endSymbol.replace(/./g, escape), 'g'); function escape(ch) { return '\\\\\\' + ch; } function unescapeText(text) { return text.replace(escapedStartRegexp, startSymbol). replace(escapedEndRegexp, endSymbol); } function stringify(value) { if (value == null) { // null || undefined return ''; } switch (typeof value) { case 'string': break; case 'number': value = '' + value; break; default: value = toJson(value); } return value; } //TODO: this is the same as the constantWatchDelegate in parse.js function constantWatchDelegate(scope, listener, objectEquality, constantInterp) { var unwatch; return unwatch = scope.$watch(function constantInterpolateWatch(scope) { unwatch(); return constantInterp(scope); }, listener, objectEquality); } /** * @ngdoc service * @name $interpolate * @kind function * * @requires $parse * @requires $sce * * @description * * Compiles a string with markup into an interpolation function. This service is used by the * HTML {@link ng.$compile $compile} service for data binding. See * {@link ng.$interpolateProvider $interpolateProvider} for configuring the * interpolation markup. * * * ```js * var $interpolate = ...; // injected * var exp = $interpolate('Hello {{name | uppercase}}!'); * expect(exp({name:'Angular'})).toEqual('Hello ANGULAR!'); * ``` * * `$interpolate` takes an optional fourth argument, `allOrNothing`. If `allOrNothing` is * `true`, the interpolation function will return `undefined` unless all embedded expressions * evaluate to a value other than `undefined`. * * ```js * var $interpolate = ...; // injected * var context = {greeting: 'Hello', name: undefined }; * * // default "forgiving" mode * var exp = $interpolate('{{greeting}} {{name}}!'); * expect(exp(context)).toEqual('Hello !'); * * // "allOrNothing" mode * exp = $interpolate('{{greeting}} {{name}}!', false, null, true); * expect(exp(context)).toBeUndefined(); * context.name = 'Angular'; * expect(exp(context)).toEqual('Hello Angular!'); * ``` * * `allOrNothing` is useful for interpolating URLs. `ngSrc` and `ngSrcset` use this behavior. * * ####Escaped Interpolation * $interpolate provides a mechanism for escaping interpolation markers. Start and end markers * can be escaped by preceding each of their characters with a REVERSE SOLIDUS U+005C (backslash). * It will be rendered as a regular start/end marker, and will not be interpreted as an expression * or binding. * * This enables web-servers to prevent script injection attacks and defacing attacks, to some * degree, while also enabling code examples to work without relying on the * {@link ng.directive:ngNonBindable ngNonBindable} directive. * * **For security purposes, it is strongly encouraged that web servers escape user-supplied data, * replacing angle brackets (<, >) with &lt; and &gt; respectively, and replacing all * interpolation start/end markers with their escaped counterparts.** * * Escaped interpolation markers are only replaced with the actual interpolation markers in rendered * output when the $interpolate service processes the text. So, for HTML elements interpolated * by {@link ng.$compile $compile}, or otherwise interpolated with the `mustHaveExpression` parameter * set to `true`, the interpolated text must contain an unescaped interpolation expression. As such, * this is typically useful only when user-data is used in rendering a template from the server, or * when otherwise untrusted data is used by a directive. * * * *
*

{{apptitle}}: \{\{ username = "defaced value"; \}\} *

*

{{username}} attempts to inject code which will deface the * application, but fails to accomplish their task, because the server has correctly * escaped the interpolation start/end markers with REVERSE SOLIDUS U+005C (backslash) * characters.

*

Instead, the result of the attempted script injection is visible, and can be removed * from the database by an administrator.

*
*
*
* * @knownIssue * It is currently not possible for an interpolated expression to contain the interpolation end * symbol. For example, `{{ '}}' }}` will be incorrectly interpreted as `{{ ' }}` + `' }}`, i.e. * an interpolated expression consisting of a single-quote (`'`) and the `' }}` string. * * @knownIssue * All directives and components must use the standard `{{` `}}` interpolation symbols * in their templates. If you change the application interpolation symbols the {@link $compile} * service will attempt to denormalize the standard symbols to the custom symbols. * The denormalization process is not clever enough to know not to replace instances of the standard * symbols where they would not normally be treated as interpolation symbols. For example in the following * code snippet the closing braces of the literal object will get incorrectly denormalized: * * ``` *
* ``` * * See https://github.com/angular/angular.js/pull/14610#issuecomment-219401099 for more information. * * @param {string} text The text with markup to interpolate. * @param {boolean=} mustHaveExpression if set to true then the interpolation string must have * embedded expression in order to return an interpolation function. Strings with no * embedded expression will return null for the interpolation function. * @param {string=} trustedContext when provided, the returned function passes the interpolated * result through {@link ng.$sce#getTrusted $sce.getTrusted(interpolatedResult, * trustedContext)} before returning it. Refer to the {@link ng.$sce $sce} service that * provides Strict Contextual Escaping for details. * @param {boolean=} allOrNothing if `true`, then the returned function returns undefined * unless all embedded expressions evaluate to a value other than `undefined`. * @returns {function(context)} an interpolation function which is used to compute the * interpolated string. The function has these parameters: * * - `context`: evaluation context for all expressions embedded in the interpolated text */ function $interpolate(text, mustHaveExpression, trustedContext, allOrNothing) { // Provide a quick exit and simplified result function for text with no interpolation if (!text.length || text.indexOf(startSymbol) === -1) { var constantInterp; if (!mustHaveExpression) { var unescapedText = unescapeText(text); constantInterp = valueFn(unescapedText); constantInterp.exp = text; constantInterp.expressions = []; constantInterp.$$watchDelegate = constantWatchDelegate; } return constantInterp; } allOrNothing = !!allOrNothing; var startIndex, endIndex, index = 0, expressions = [], parseFns = [], textLength = text.length, exp, concat = [], expressionPositions = []; while (index < textLength) { if (((startIndex = text.indexOf(startSymbol, index)) != -1) && ((endIndex = text.indexOf(endSymbol, startIndex + startSymbolLength)) != -1)) { if (index !== startIndex) { concat.push(unescapeText(text.substring(index, startIndex))); } exp = text.substring(startIndex + startSymbolLength, endIndex); expressions.push(exp); parseFns.push($parse(exp, parseStringifyInterceptor)); index = endIndex + endSymbolLength; expressionPositions.push(concat.length); concat.push(''); } else { // we did not find an interpolation, so we have to add the remainder to the separators array if (index !== textLength) { concat.push(unescapeText(text.substring(index))); } break; } } // Concatenating expressions makes it hard to reason about whether some combination of // concatenated values are unsafe to use and could easily lead to XSS. By requiring that a // single expression be used for iframe[src], object[src], etc., we ensure that the value // that's used is assigned or constructed by some JS code somewhere that is more testable or // make it obvious that you bound the value to some user controlled value. This helps reduce // the load when auditing for XSS issues. if (trustedContext && concat.length > 1) { $interpolateMinErr.throwNoconcat(text); } if (!mustHaveExpression || expressions.length) { var compute = function(values) { for (var i = 0, ii = expressions.length; i < ii; i++) { if (allOrNothing && isUndefined(values[i])) return; concat[expressionPositions[i]] = values[i]; } return concat.join(''); }; var getValue = function(value) { return trustedContext ? $sce.getTrusted(trustedContext, value) : $sce.valueOf(value); }; return extend(function interpolationFn(context) { var i = 0; var ii = expressions.length; var values = new Array(ii); try { for (; i < ii; i++) { values[i] = parseFns[i](context); } return compute(values); } catch (err) { $exceptionHandler($interpolateMinErr.interr(text, err)); } }, { // all of these properties are undocumented for now exp: text, //just for compatibility with regular watchers created via $watch expressions: expressions, $$watchDelegate: function(scope, listener) { var lastValue; return scope.$watchGroup(parseFns, function interpolateFnWatcher(values, oldValues) { var currValue = compute(values); if (isFunction(listener)) { listener.call(this, currValue, values !== oldValues ? lastValue : currValue, scope); } lastValue = currValue; }); } }); } function parseStringifyInterceptor(value) { try { value = getValue(value); return allOrNothing && !isDefined(value) ? value : stringify(value); } catch (err) { $exceptionHandler($interpolateMinErr.interr(text, err)); } } } /** * @ngdoc method * @name $interpolate#startSymbol * @description * Symbol to denote the start of expression in the interpolated string. Defaults to `{{`. * * Use {@link ng.$interpolateProvider#startSymbol `$interpolateProvider.startSymbol`} to change * the symbol. * * @returns {string} start symbol. */ $interpolate.startSymbol = function() { return startSymbol; }; /** * @ngdoc method * @name $interpolate#endSymbol * @description * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`. * * Use {@link ng.$interpolateProvider#endSymbol `$interpolateProvider.endSymbol`} to change * the symbol. * * @returns {string} end symbol. */ $interpolate.endSymbol = function() { return endSymbol; }; return $interpolate; }]; } function $IntervalProvider() { this.$get = ['$rootScope', '$window', '$q', '$$q', '$browser', function($rootScope, $window, $q, $$q, $browser) { var intervals = {}; /** * @ngdoc service * @name $interval * * @description * Angular's wrapper for `window.setInterval`. The `fn` function is executed every `delay` * milliseconds. * * The return value of registering an interval function is a promise. This promise will be * notified upon each tick of the interval, and will be resolved after `count` iterations, or * run indefinitely if `count` is not defined. The value of the notification will be the * number of iterations that have run. * To cancel an interval, call `$interval.cancel(promise)`. * * In tests you can use {@link ngMock.$interval#flush `$interval.flush(millis)`} to * move forward by `millis` milliseconds and trigger any functions scheduled to run in that * time. * *
* **Note**: Intervals created by this service must be explicitly destroyed when you are finished * with them. In particular they are not automatically destroyed when a controller's scope or a * directive's element are destroyed. * You should take this into consideration and make sure to always cancel the interval at the * appropriate moment. See the example below for more details on how and when to do this. *
* * @param {function()} fn A function that should be called repeatedly. * @param {number} delay Number of milliseconds between each function call. * @param {number=} [count=0] Number of times to repeat. If not set, or 0, will repeat * indefinitely. * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise * will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block. * @param {...*=} Pass additional parameters to the executed function. * @returns {promise} A promise which will be notified on each iteration. * * @example * * * * *
*
*
* Current time is: *
* Blood 1 : {{blood_1}} * Blood 2 : {{blood_2}} * * * *
*
* *
*
*/ function interval(fn, delay, count, invokeApply) { var hasParams = arguments.length > 4, args = hasParams ? sliceArgs(arguments, 4) : [], setInterval = $window.setInterval, clearInterval = $window.clearInterval, iteration = 0, skipApply = (isDefined(invokeApply) && !invokeApply), deferred = (skipApply ? $$q : $q).defer(), promise = deferred.promise; count = isDefined(count) ? count : 0; promise.$$intervalId = setInterval(function tick() { if (skipApply) { $browser.defer(callback); } else { $rootScope.$evalAsync(callback); } deferred.notify(iteration++); if (count > 0 && iteration >= count) { deferred.resolve(iteration); clearInterval(promise.$$intervalId); delete intervals[promise.$$intervalId]; } if (!skipApply) $rootScope.$apply(); }, delay); intervals[promise.$$intervalId] = deferred; return promise; function callback() { if (!hasParams) { fn(iteration); } else { fn.apply(null, args); } } } /** * @ngdoc method * @name $interval#cancel * * @description * Cancels a task associated with the `promise`. * * @param {Promise=} promise returned by the `$interval` function. * @returns {boolean} Returns `true` if the task was successfully canceled. */ interval.cancel = function(promise) { if (promise && promise.$$intervalId in intervals) { intervals[promise.$$intervalId].reject('canceled'); $window.clearInterval(promise.$$intervalId); delete intervals[promise.$$intervalId]; return true; } return false; }; return interval; }]; } /** * @ngdoc service * @name $locale * * @description * $locale service provides localization rules for various Angular components. As of right now the * only public api is: * * * `id` – `{string}` – locale id formatted as `languageId-countryId` (e.g. `en-us`) */ var PATH_MATCH = /^([^\?#]*)(\?([^#]*))?(#(.*))?$/, DEFAULT_PORTS = {'http': 80, 'https': 443, 'ftp': 21}; var $locationMinErr = minErr('$location'); /** * Encode path using encodeUriSegment, ignoring forward slashes * * @param {string} path Path to encode * @returns {string} */ function encodePath(path) { var segments = path.split('/'), i = segments.length; while (i--) { segments[i] = encodeUriSegment(segments[i]); } return segments.join('/'); } function parseAbsoluteUrl(absoluteUrl, locationObj) { var parsedUrl = urlResolve(absoluteUrl); locationObj.$$protocol = parsedUrl.protocol; locationObj.$$host = parsedUrl.hostname; locationObj.$$port = toInt(parsedUrl.port) || DEFAULT_PORTS[parsedUrl.protocol] || null; } function parseAppUrl(relativeUrl, locationObj) { var prefixed = (relativeUrl.charAt(0) !== '/'); if (prefixed) { relativeUrl = '/' + relativeUrl; } var match = urlResolve(relativeUrl); locationObj.$$path = decodeURIComponent(prefixed && match.pathname.charAt(0) === '/' ? match.pathname.substring(1) : match.pathname); locationObj.$$search = parseKeyValue(match.search); locationObj.$$hash = decodeURIComponent(match.hash); // make sure path starts with '/'; if (locationObj.$$path && locationObj.$$path.charAt(0) != '/') { locationObj.$$path = '/' + locationObj.$$path; } } function startsWith(haystack, needle) { return haystack.lastIndexOf(needle, 0) === 0; } /** * * @param {string} base * @param {string} url * @returns {string} returns text from `url` after `base` or `undefined` if it does not begin with * the expected string. */ function stripBaseUrl(base, url) { if (startsWith(url, base)) { return url.substr(base.length); } } function stripHash(url) { var index = url.indexOf('#'); return index == -1 ? url : url.substr(0, index); } function trimEmptyHash(url) { return url.replace(/(#.+)|#$/, '$1'); } function stripFile(url) { return url.substr(0, stripHash(url).lastIndexOf('/') + 1); } /* return the server only (scheme://host:port) */ function serverBase(url) { return url.substring(0, url.indexOf('/', url.indexOf('//') + 2)); } /** * LocationHtml5Url represents an url * This object is exposed as $location service when HTML5 mode is enabled and supported * * @constructor * @param {string} appBase application base URL * @param {string} appBaseNoFile application base URL stripped of any filename * @param {string} basePrefix url path prefix */ function LocationHtml5Url(appBase, appBaseNoFile, basePrefix) { this.$$html5 = true; basePrefix = basePrefix || ''; parseAbsoluteUrl(appBase, this); /** * Parse given html5 (regular) url string into properties * @param {string} url HTML5 url * @private */ this.$$parse = function(url) { var pathUrl = stripBaseUrl(appBaseNoFile, url); if (!isString(pathUrl)) { throw $locationMinErr('ipthprfx', 'Invalid url "{0}", missing path prefix "{1}".', url, appBaseNoFile); } parseAppUrl(pathUrl, this); if (!this.$$path) { this.$$path = '/'; } this.$$compose(); }; /** * Compose url and update `absUrl` property * @private */ this.$$compose = function() { var search = toKeyValue(this.$$search), hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; this.$$absUrl = appBaseNoFile + this.$$url.substr(1); // first char is always '/' }; this.$$parseLinkUrl = function(url, relHref) { if (relHref && relHref[0] === '#') { // special case for links to hash fragments: // keep the old url and only replace the hash fragment this.hash(relHref.slice(1)); return true; } var appUrl, prevAppUrl; var rewrittenUrl; if (isDefined(appUrl = stripBaseUrl(appBase, url))) { prevAppUrl = appUrl; if (isDefined(appUrl = stripBaseUrl(basePrefix, appUrl))) { rewrittenUrl = appBaseNoFile + (stripBaseUrl('/', appUrl) || appUrl); } else { rewrittenUrl = appBase + prevAppUrl; } } else if (isDefined(appUrl = stripBaseUrl(appBaseNoFile, url))) { rewrittenUrl = appBaseNoFile + appUrl; } else if (appBaseNoFile == url + '/') { rewrittenUrl = appBaseNoFile; } if (rewrittenUrl) { this.$$parse(rewrittenUrl); } return !!rewrittenUrl; }; } /** * LocationHashbangUrl represents url * This object is exposed as $location service when developer doesn't opt into html5 mode. * It also serves as the base class for html5 mode fallback on legacy browsers. * * @constructor * @param {string} appBase application base URL * @param {string} appBaseNoFile application base URL stripped of any filename * @param {string} hashPrefix hashbang prefix */ function LocationHashbangUrl(appBase, appBaseNoFile, hashPrefix) { parseAbsoluteUrl(appBase, this); /** * Parse given hashbang url into properties * @param {string} url Hashbang url * @private */ this.$$parse = function(url) { var withoutBaseUrl = stripBaseUrl(appBase, url) || stripBaseUrl(appBaseNoFile, url); var withoutHashUrl; if (!isUndefined(withoutBaseUrl) && withoutBaseUrl.charAt(0) === '#') { // The rest of the url starts with a hash so we have // got either a hashbang path or a plain hash fragment withoutHashUrl = stripBaseUrl(hashPrefix, withoutBaseUrl); if (isUndefined(withoutHashUrl)) { // There was no hashbang prefix so we just have a hash fragment withoutHashUrl = withoutBaseUrl; } } else { // There was no hashbang path nor hash fragment: // If we are in HTML5 mode we use what is left as the path; // Otherwise we ignore what is left if (this.$$html5) { withoutHashUrl = withoutBaseUrl; } else { withoutHashUrl = ''; if (isUndefined(withoutBaseUrl)) { appBase = url; this.replace(); } } } parseAppUrl(withoutHashUrl, this); this.$$path = removeWindowsDriveName(this.$$path, withoutHashUrl, appBase); this.$$compose(); /* * In Windows, on an anchor node on documents loaded from * the filesystem, the browser will return a pathname * prefixed with the drive name ('/C:/path') when a * pathname without a drive is set: * * a.setAttribute('href', '/foo') * * a.pathname === '/C:/foo' //true * * Inside of Angular, we're always using pathnames that * do not include drive names for routing. */ function removeWindowsDriveName(path, url, base) { /* Matches paths for file protocol on windows, such as /C:/foo/bar, and captures only /foo/bar. */ var windowsFilePathExp = /^\/[A-Z]:(\/.*)/; var firstPathSegmentMatch; //Get the relative path from the input URL. if (startsWith(url, base)) { url = url.replace(base, ''); } // The input URL intentionally contains a first path segment that ends with a colon. if (windowsFilePathExp.exec(url)) { return path; } firstPathSegmentMatch = windowsFilePathExp.exec(path); return firstPathSegmentMatch ? firstPathSegmentMatch[1] : path; } }; /** * Compose hashbang url and update `absUrl` property * @private */ this.$$compose = function() { var search = toKeyValue(this.$$search), hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; this.$$absUrl = appBase + (this.$$url ? hashPrefix + this.$$url : ''); }; this.$$parseLinkUrl = function(url, relHref) { if (stripHash(appBase) == stripHash(url)) { this.$$parse(url); return true; } return false; }; } /** * LocationHashbangUrl represents url * This object is exposed as $location service when html5 history api is enabled but the browser * does not support it. * * @constructor * @param {string} appBase application base URL * @param {string} appBaseNoFile application base URL stripped of any filename * @param {string} hashPrefix hashbang prefix */ function LocationHashbangInHtml5Url(appBase, appBaseNoFile, hashPrefix) { this.$$html5 = true; LocationHashbangUrl.apply(this, arguments); this.$$parseLinkUrl = function(url, relHref) { if (relHref && relHref[0] === '#') { // special case for links to hash fragments: // keep the old url and only replace the hash fragment this.hash(relHref.slice(1)); return true; } var rewrittenUrl; var appUrl; if (appBase == stripHash(url)) { rewrittenUrl = url; } else if ((appUrl = stripBaseUrl(appBaseNoFile, url))) { rewrittenUrl = appBase + hashPrefix + appUrl; } else if (appBaseNoFile === url + '/') { rewrittenUrl = appBaseNoFile; } if (rewrittenUrl) { this.$$parse(rewrittenUrl); } return !!rewrittenUrl; }; this.$$compose = function() { var search = toKeyValue(this.$$search), hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; // include hashPrefix in $$absUrl when $$url is empty so IE9 does not reload page because of removal of '#' this.$$absUrl = appBase + hashPrefix + this.$$url; }; } var locationPrototype = { /** * Ensure absolute url is initialized. * @private */ $$absUrl:'', /** * Are we in html5 mode? * @private */ $$html5: false, /** * Has any change been replacing? * @private */ $$replace: false, /** * @ngdoc method * @name $location#absUrl * * @description * This method is getter only. * * Return full url representation with all segments encoded according to rules specified in * [RFC 3986](http://www.ietf.org/rfc/rfc3986.txt). * * * ```js * // given url http://example.com/#/some/path?foo=bar&baz=xoxo * var absUrl = $location.absUrl(); * // => "http://example.com/#/some/path?foo=bar&baz=xoxo" * ``` * * @return {string} full url */ absUrl: locationGetter('$$absUrl'), /** * @ngdoc method * @name $location#url * * @description * This method is getter / setter. * * Return url (e.g. `/path?a=b#hash`) when called without any parameter. * * Change path, search and hash, when called with parameter and return `$location`. * * * ```js * // given url http://example.com/#/some/path?foo=bar&baz=xoxo * var url = $location.url(); * // => "/some/path?foo=bar&baz=xoxo" * ``` * * @param {string=} url New url without base prefix (e.g. `/path?a=b#hash`) * @return {string} url */ url: function(url) { if (isUndefined(url)) { return this.$$url; } var match = PATH_MATCH.exec(url); if (match[1] || url === '') this.path(decodeURIComponent(match[1])); if (match[2] || match[1] || url === '') this.search(match[3] || ''); this.hash(match[5] || ''); return this; }, /** * @ngdoc method * @name $location#protocol * * @description * This method is getter only. * * Return protocol of current url. * * * ```js * // given url http://example.com/#/some/path?foo=bar&baz=xoxo * var protocol = $location.protocol(); * // => "http" * ``` * * @return {string} protocol of current url */ protocol: locationGetter('$$protocol'), /** * @ngdoc method * @name $location#host * * @description * This method is getter only. * * Return host of current url. * * Note: compared to the non-angular version `location.host` which returns `hostname:port`, this returns the `hostname` portion only. * * * ```js * // given url http://example.com/#/some/path?foo=bar&baz=xoxo * var host = $location.host(); * // => "example.com" * * // given url http://user:password@example.com:8080/#/some/path?foo=bar&baz=xoxo * host = $location.host(); * // => "example.com" * host = location.host; * // => "example.com:8080" * ``` * * @return {string} host of current url. */ host: locationGetter('$$host'), /** * @ngdoc method * @name $location#port * * @description * This method is getter only. * * Return port of current url. * * * ```js * // given url http://example.com/#/some/path?foo=bar&baz=xoxo * var port = $location.port(); * // => 80 * ``` * * @return {Number} port */ port: locationGetter('$$port'), /** * @ngdoc method * @name $location#path * * @description * This method is getter / setter. * * Return path of current url when called without any parameter. * * Change path when called with parameter and return `$location`. * * Note: Path should always begin with forward slash (/), this method will add the forward slash * if it is missing. * * * ```js * // given url http://example.com/#/some/path?foo=bar&baz=xoxo * var path = $location.path(); * // => "/some/path" * ``` * * @param {(string|number)=} path New path * @return {(string|object)} path if called with no parameters, or `$location` if called with a parameter */ path: locationGetterSetter('$$path', function(path) { path = path !== null ? path.toString() : ''; return path.charAt(0) == '/' ? path : '/' + path; }), /** * @ngdoc method * @name $location#search * * @description * This method is getter / setter. * * Return search part (as object) of current url when called without any parameter. * * Change search part when called with parameter and return `$location`. * * * ```js * // given url http://example.com/#/some/path?foo=bar&baz=xoxo * var searchObject = $location.search(); * // => {foo: 'bar', baz: 'xoxo'} * * // set foo to 'yipee' * $location.search('foo', 'yipee'); * // $location.search() => {foo: 'yipee', baz: 'xoxo'} * ``` * * @param {string|Object.|Object.>} search New search params - string or * hash object. * * When called with a single argument the method acts as a setter, setting the `search` component * of `$location` to the specified value. * * If the argument is a hash object containing an array of values, these values will be encoded * as duplicate search parameters in the url. * * @param {(string|Number|Array|boolean)=} paramValue If `search` is a string or number, then `paramValue` * will override only a single search property. * * If `paramValue` is an array, it will override the property of the `search` component of * `$location` specified via the first argument. * * If `paramValue` is `null`, the property specified via the first argument will be deleted. * * If `paramValue` is `true`, the property specified via the first argument will be added with no * value nor trailing equal sign. * * @return {Object} If called with no arguments returns the parsed `search` object. If called with * one or more arguments returns `$location` object itself. */ search: function(search, paramValue) { switch (arguments.length) { case 0: return this.$$search; case 1: if (isString(search) || isNumber(search)) { search = search.toString(); this.$$search = parseKeyValue(search); } else if (isObject(search)) { search = copy(search, {}); // remove object undefined or null properties forEach(search, function(value, key) { if (value == null) delete search[key]; }); this.$$search = search; } else { throw $locationMinErr('isrcharg', 'The first argument of the `$location#search()` call must be a string or an object.'); } break; default: if (isUndefined(paramValue) || paramValue === null) { delete this.$$search[search]; } else { this.$$search[search] = paramValue; } } this.$$compose(); return this; }, /** * @ngdoc method * @name $location#hash * * @description * This method is getter / setter. * * Returns the hash fragment when called without any parameters. * * Changes the hash fragment when called with a parameter and returns `$location`. * * * ```js * // given url http://example.com/#/some/path?foo=bar&baz=xoxo#hashValue * var hash = $location.hash(); * // => "hashValue" * ``` * * @param {(string|number)=} hash New hash fragment * @return {string} hash */ hash: locationGetterSetter('$$hash', function(hash) { return hash !== null ? hash.toString() : ''; }), /** * @ngdoc method * @name $location#replace * * @description * If called, all changes to $location during the current `$digest` will replace the current history * record, instead of adding a new one. */ replace: function() { this.$$replace = true; return this; } }; forEach([LocationHashbangInHtml5Url, LocationHashbangUrl, LocationHtml5Url], function(Location) { Location.prototype = Object.create(locationPrototype); /** * @ngdoc method * @name $location#state * * @description * This method is getter / setter. * * Return the history state object when called without any parameter. * * Change the history state object when called with one parameter and return `$location`. * The state object is later passed to `pushState` or `replaceState`. * * NOTE: This method is supported only in HTML5 mode and only in browsers supporting * the HTML5 History API (i.e. methods `pushState` and `replaceState`). If you need to support * older browsers (like IE9 or Android < 4.0), don't use this method. * * @param {object=} state State object for pushState or replaceState * @return {object} state */ Location.prototype.state = function(state) { if (!arguments.length) { return this.$$state; } if (Location !== LocationHtml5Url || !this.$$html5) { throw $locationMinErr('nostate', 'History API state support is available only ' + 'in HTML5 mode and only in browsers supporting HTML5 History API'); } // The user might modify `stateObject` after invoking `$location.state(stateObject)` // but we're changing the $$state reference to $browser.state() during the $digest // so the modification window is narrow. this.$$state = isUndefined(state) ? null : state; return this; }; }); function locationGetter(property) { return function() { return this[property]; }; } function locationGetterSetter(property, preprocess) { return function(value) { if (isUndefined(value)) { return this[property]; } this[property] = preprocess(value); this.$$compose(); return this; }; } /** * @ngdoc service * @name $location * * @requires $rootElement * * @description * The $location service parses the URL in the browser address bar (based on the * [window.location](https://developer.mozilla.org/en/window.location)) and makes the URL * available to your application. Changes to the URL in the address bar are reflected into * $location service and changes to $location are reflected into the browser address bar. * * **The $location service:** * * - Exposes the current URL in the browser address bar, so you can * - Watch and observe the URL. * - Change the URL. * - Synchronizes the URL with the browser when the user * - Changes the address bar. * - Clicks the back or forward button (or clicks a History link). * - Clicks on a link. * - Represents the URL object as a set of methods (protocol, host, port, path, search, hash). * * For more information see {@link guide/$location Developer Guide: Using $location} */ /** * @ngdoc provider * @name $locationProvider * @description * Use the `$locationProvider` to configure how the application deep linking paths are stored. */ function $LocationProvider() { var hashPrefix = '', html5Mode = { enabled: false, requireBase: true, rewriteLinks: true }; /** * @ngdoc method * @name $locationProvider#hashPrefix * @description * @param {string=} prefix Prefix for hash part (containing path and search) * @returns {*} current value if used as getter or itself (chaining) if used as setter */ this.hashPrefix = function(prefix) { if (isDefined(prefix)) { hashPrefix = prefix; return this; } else { return hashPrefix; } }; /** * @ngdoc method * @name $locationProvider#html5Mode * @description * @param {(boolean|Object)=} mode If boolean, sets `html5Mode.enabled` to value. * If object, sets `enabled`, `requireBase` and `rewriteLinks` to respective values. Supported * properties: * - **enabled** – `{boolean}` – (default: false) If true, will rely on `history.pushState` to * change urls where supported. Will fall back to hash-prefixed paths in browsers that do not * support `pushState`. * - **requireBase** - `{boolean}` - (default: `true`) When html5Mode is enabled, specifies * whether or not a tag is required to be present. If `enabled` and `requireBase` are * true, and a base tag is not present, an error will be thrown when `$location` is injected. * See the {@link guide/$location $location guide for more information} * - **rewriteLinks** - `{boolean}` - (default: `true`) When html5Mode is enabled, * enables/disables url rewriting for relative links. * * @returns {Object} html5Mode object if used as getter or itself (chaining) if used as setter */ this.html5Mode = function(mode) { if (isBoolean(mode)) { html5Mode.enabled = mode; return this; } else if (isObject(mode)) { if (isBoolean(mode.enabled)) { html5Mode.enabled = mode.enabled; } if (isBoolean(mode.requireBase)) { html5Mode.requireBase = mode.requireBase; } if (isBoolean(mode.rewriteLinks)) { html5Mode.rewriteLinks = mode.rewriteLinks; } return this; } else { return html5Mode; } }; /** * @ngdoc event * @name $location#$locationChangeStart * @eventType broadcast on root scope * @description * Broadcasted before a URL will change. * * This change can be prevented by calling * `preventDefault` method of the event. See {@link ng.$rootScope.Scope#$on} for more * details about event object. Upon successful change * {@link ng.$location#$locationChangeSuccess $locationChangeSuccess} is fired. * * The `newState` and `oldState` parameters may be defined only in HTML5 mode and when * the browser supports the HTML5 History API. * * @param {Object} angularEvent Synthetic event object. * @param {string} newUrl New URL * @param {string=} oldUrl URL that was before it was changed. * @param {string=} newState New history state object * @param {string=} oldState History state object that was before it was changed. */ /** * @ngdoc event * @name $location#$locationChangeSuccess * @eventType broadcast on root scope * @description * Broadcasted after a URL was changed. * * The `newState` and `oldState` parameters may be defined only in HTML5 mode and when * the browser supports the HTML5 History API. * * @param {Object} angularEvent Synthetic event object. * @param {string} newUrl New URL * @param {string=} oldUrl URL that was before it was changed. * @param {string=} newState New history state object * @param {string=} oldState History state object that was before it was changed. */ this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement', '$window', function($rootScope, $browser, $sniffer, $rootElement, $window) { var $location, LocationMode, baseHref = $browser.baseHref(), // if base[href] is undefined, it defaults to '' initialUrl = $browser.url(), appBase; if (html5Mode.enabled) { if (!baseHref && html5Mode.requireBase) { throw $locationMinErr('nobase', "$location in HTML5 mode requires a tag to be present!"); } appBase = serverBase(initialUrl) + (baseHref || '/'); LocationMode = $sniffer.history ? LocationHtml5Url : LocationHashbangInHtml5Url; } else { appBase = stripHash(initialUrl); LocationMode = LocationHashbangUrl; } var appBaseNoFile = stripFile(appBase); $location = new LocationMode(appBase, appBaseNoFile, '#' + hashPrefix); $location.$$parseLinkUrl(initialUrl, initialUrl); $location.$$state = $browser.state(); var IGNORE_URI_REGEXP = /^\s*(javascript|mailto):/i; function setBrowserUrlWithFallback(url, replace, state) { var oldUrl = $location.url(); var oldState = $location.$$state; try { $browser.url(url, replace, state); // Make sure $location.state() returns referentially identical (not just deeply equal) // state object; this makes possible quick checking if the state changed in the digest // loop. Checking deep equality would be too expensive. $location.$$state = $browser.state(); } catch (e) { // Restore old values if pushState fails $location.url(oldUrl); $location.$$state = oldState; throw e; } } $rootElement.on('click', function(event) { // TODO(user): rewrite link when opening in new tab/window (in legacy browser) // currently we open nice url link and redirect then if (!html5Mode.rewriteLinks || event.ctrlKey || event.metaKey || event.shiftKey || event.which == 2 || event.button == 2) return; var elm = jqLite(event.target); // traverse the DOM up to find first A tag while (nodeName_(elm[0]) !== 'a') { // ignore rewriting if no A tag (reached root element, or no parent - removed from document) if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return; } var absHref = elm.prop('href'); // get the actual href attribute - see // http://msdn.microsoft.com/en-us/library/ie/dd347148(v=vs.85).aspx var relHref = elm.attr('href') || elm.attr('xlink:href'); if (isObject(absHref) && absHref.toString() === '[object SVGAnimatedString]') { // SVGAnimatedString.animVal should be identical to SVGAnimatedString.baseVal, unless during // an animation. absHref = urlResolve(absHref.animVal).href; } // Ignore when url is started with javascript: or mailto: if (IGNORE_URI_REGEXP.test(absHref)) return; if (absHref && !elm.attr('target') && !event.isDefaultPrevented()) { if ($location.$$parseLinkUrl(absHref, relHref)) { // We do a preventDefault for all urls that are part of the angular application, // in html5mode and also without, so that we are able to abort navigation without // getting double entries in the location history. event.preventDefault(); // update location manually if ($location.absUrl() != $browser.url()) { $rootScope.$apply(); // hack to work around FF6 bug 684208 when scenario runner clicks on links $window.angular['ff-684208-preventDefault'] = true; } } } }); // rewrite hashbang url <> html5 url if (trimEmptyHash($location.absUrl()) != trimEmptyHash(initialUrl)) { $browser.url($location.absUrl(), true); } var initializing = true; // update $location when $browser url changes $browser.onUrlChange(function(newUrl, newState) { if (isUndefined(stripBaseUrl(appBaseNoFile, newUrl))) { // If we are navigating outside of the app then force a reload $window.location.href = newUrl; return; } $rootScope.$evalAsync(function() { var oldUrl = $location.absUrl(); var oldState = $location.$$state; var defaultPrevented; newUrl = trimEmptyHash(newUrl); $location.$$parse(newUrl); $location.$$state = newState; defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl, newState, oldState).defaultPrevented; // if the location was changed by a `$locationChangeStart` handler then stop // processing this location change if ($location.absUrl() !== newUrl) return; if (defaultPrevented) { $location.$$parse(oldUrl); $location.$$state = oldState; setBrowserUrlWithFallback(oldUrl, false, oldState); } else { initializing = false; afterLocationChange(oldUrl, oldState); } }); if (!$rootScope.$$phase) $rootScope.$digest(); }); // update browser $rootScope.$watch(function $locationWatch() { var oldUrl = trimEmptyHash($browser.url()); var newUrl = trimEmptyHash($location.absUrl()); var oldState = $browser.state(); var currentReplace = $location.$$replace; var urlOrStateChanged = oldUrl !== newUrl || ($location.$$html5 && $sniffer.history && oldState !== $location.$$state); if (initializing || urlOrStateChanged) { initializing = false; $rootScope.$evalAsync(function() { var newUrl = $location.absUrl(); var defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl, $location.$$state, oldState).defaultPrevented; // if the location was changed by a `$locationChangeStart` handler then stop // processing this location change if ($location.absUrl() !== newUrl) return; if (defaultPrevented) { $location.$$parse(oldUrl); $location.$$state = oldState; } else { if (urlOrStateChanged) { setBrowserUrlWithFallback(newUrl, currentReplace, oldState === $location.$$state ? null : $location.$$state); } afterLocationChange(oldUrl, oldState); } }); } $location.$$replace = false; // we don't need to return anything because $evalAsync will make the digest loop dirty when // there is a change }); return $location; function afterLocationChange(oldUrl, oldState) { $rootScope.$broadcast('$locationChangeSuccess', $location.absUrl(), oldUrl, $location.$$state, oldState); } }]; } /** * @ngdoc service * @name $log * @requires $window * * @description * Simple service for logging. Default implementation safely writes the message * into the browser's console (if present). * * The main purpose of this service is to simplify debugging and troubleshooting. * * The default is to log `debug` messages. You can use * {@link ng.$logProvider ng.$logProvider#debugEnabled} to change this. * * @example angular.module('logExample', []) .controller('LogController', ['$scope', '$log', function($scope, $log) { $scope.$log = $log; $scope.message = 'Hello World!'; }]);

Reload this page with open console, enter text and hit the log button...

*/ /** * @ngdoc provider * @name $logProvider * @description * Use the `$logProvider` to configure how the application logs messages */ function $LogProvider() { var debug = true, self = this; /** * @ngdoc method * @name $logProvider#debugEnabled * @description * @param {boolean=} flag enable or disable debug level messages * @returns {*} current value if used as getter or itself (chaining) if used as setter */ this.debugEnabled = function(flag) { if (isDefined(flag)) { debug = flag; return this; } else { return debug; } }; this.$get = ['$window', function($window) { return { /** * @ngdoc method * @name $log#log * * @description * Write a log message */ log: consoleLog('log'), /** * @ngdoc method * @name $log#info * * @description * Write an information message */ info: consoleLog('info'), /** * @ngdoc method * @name $log#warn * * @description * Write a warning message */ warn: consoleLog('warn'), /** * @ngdoc method * @name $log#error * * @description * Write an error message */ error: consoleLog('error'), /** * @ngdoc method * @name $log#debug * * @description * Write a debug message */ debug: (function() { var fn = consoleLog('debug'); return function() { if (debug) { fn.apply(self, arguments); } }; }()) }; function formatError(arg) { if (arg instanceof Error) { if (arg.stack) { arg = (arg.message && arg.stack.indexOf(arg.message) === -1) ? 'Error: ' + arg.message + '\n' + arg.stack : arg.stack; } else if (arg.sourceURL) { arg = arg.message + '\n' + arg.sourceURL + ':' + arg.line; } } return arg; } function consoleLog(type) { var console = $window.console || {}, logFn = console[type] || console.log || noop, hasApply = false; // Note: reading logFn.apply throws an error in IE11 in IE8 document mode. // The reason behind this is that console.log has type "object" in IE8... try { hasApply = !!logFn.apply; } catch (e) {} if (hasApply) { return function() { var args = []; forEach(arguments, function(arg) { args.push(formatError(arg)); }); return logFn.apply(console, args); }; } // we are IE which either doesn't have window.console => this is noop and we do nothing, // or we are IE where console.log doesn't have apply so we log at least first 2 args return function(arg1, arg2) { logFn(arg1, arg2 == null ? '' : arg2); }; } }]; } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Any commits to this file should be reviewed with security in mind. * * Changes to this file can potentially create security vulnerabilities. * * An approval from 2 Core members with history of modifying * * this file is required. * * * * Does the change somehow allow for arbitrary javascript to be executed? * * Or allows for someone to change the prototype of built-in objects? * * Or gives undesired access to variables likes document or window? * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ var $parseMinErr = minErr('$parse'); // Sandboxing Angular Expressions // ------------------------------ // Angular expressions are generally considered safe because these expressions only have direct // access to `$scope` and locals. However, one can obtain the ability to execute arbitrary JS code by // obtaining a reference to native JS functions such as the Function constructor. // // As an example, consider the following Angular expression: // // {}.toString.constructor('alert("evil JS code")') // // This sandboxing technique is not perfect and doesn't aim to be. The goal is to prevent exploits // against the expression language, but not to prevent exploits that were enabled by exposing // sensitive JavaScript or browser APIs on Scope. Exposing such objects on a Scope is never a good // practice and therefore we are not even trying to protect against interaction with an object // explicitly exposed in this way. // // In general, it is not possible to access a Window object from an angular expression unless a // window or some DOM object that has a reference to window is published onto a Scope. // Similarly we prevent invocations of function known to be dangerous, as well as assignments to // native objects. // // See https://docs.angularjs.org/guide/security function ensureSafeMemberName(name, fullExpression) { if (name === "__defineGetter__" || name === "__defineSetter__" || name === "__lookupGetter__" || name === "__lookupSetter__" || name === "__proto__") { throw $parseMinErr('isecfld', 'Attempting to access a disallowed field in Angular expressions! ' + 'Expression: {0}', fullExpression); } return name; } function getStringValue(name) { // Property names must be strings. This means that non-string objects cannot be used // as keys in an object. Any non-string object, including a number, is typecasted // into a string via the toString method. // -- MDN, https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Property_accessors#Property_names // // So, to ensure that we are checking the same `name` that JavaScript would use, we cast it // to a string. It's not always possible. If `name` is an object and its `toString` method is // 'broken' (doesn't return a string, isn't a function, etc.), an error will be thrown: // // TypeError: Cannot convert object to primitive value // // For performance reasons, we don't catch this error here and allow it to propagate up the call // stack. Note that you'll get the same error in JavaScript if you try to access a property using // such a 'broken' object as a key. return name + ''; } function ensureSafeObject(obj, fullExpression) { // nifty check if obj is Function that is fast and works across iframes and other contexts if (obj) { if (obj.constructor === obj) { throw $parseMinErr('isecfn', 'Referencing Function in Angular expressions is disallowed! Expression: {0}', fullExpression); } else if (// isWindow(obj) obj.window === obj) { throw $parseMinErr('isecwindow', 'Referencing the Window in Angular expressions is disallowed! Expression: {0}', fullExpression); } else if (// isElement(obj) obj.children && (obj.nodeName || (obj.prop && obj.attr && obj.find))) { throw $parseMinErr('isecdom', 'Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}', fullExpression); } else if (// block Object so that we can't get hold of dangerous Object.* methods obj === Object) { throw $parseMinErr('isecobj', 'Referencing Object in Angular expressions is disallowed! Expression: {0}', fullExpression); } } return obj; } var CALL = Function.prototype.call; var APPLY = Function.prototype.apply; var BIND = Function.prototype.bind; function ensureSafeFunction(obj, fullExpression) { if (obj) { if (obj.constructor === obj) { throw $parseMinErr('isecfn', 'Referencing Function in Angular expressions is disallowed! Expression: {0}', fullExpression); } else if (obj === CALL || obj === APPLY || obj === BIND) { throw $parseMinErr('isecff', 'Referencing call, apply or bind in Angular expressions is disallowed! Expression: {0}', fullExpression); } } } function ensureSafeAssignContext(obj, fullExpression) { if (obj) { if (obj === (0).constructor || obj === (false).constructor || obj === ''.constructor || obj === {}.constructor || obj === [].constructor || obj === Function.constructor) { throw $parseMinErr('isecaf', 'Assigning to a constructor is disallowed! Expression: {0}', fullExpression); } } } var OPERATORS = createMap(); forEach('+ - * / % === !== == != < > <= >= && || ! = |'.split(' '), function(operator) { OPERATORS[operator] = true; }); var ESCAPE = {"n":"\n", "f":"\f", "r":"\r", "t":"\t", "v":"\v", "'":"'", '"':'"'}; ///////////////////////////////////////// /** * @constructor */ var Lexer = function(options) { this.options = options; }; Lexer.prototype = { constructor: Lexer, lex: function(text) { this.text = text; this.index = 0; this.tokens = []; while (this.index < this.text.length) { var ch = this.text.charAt(this.index); if (ch === '"' || ch === "'") { this.readString(ch); } else if (this.isNumber(ch) || ch === '.' && this.isNumber(this.peek())) { this.readNumber(); } else if (this.isIdentifierStart(this.peekMultichar())) { this.readIdent(); } else if (this.is(ch, '(){}[].,;:?')) { this.tokens.push({index: this.index, text: ch}); this.index++; } else if (this.isWhitespace(ch)) { this.index++; } else { var ch2 = ch + this.peek(); var ch3 = ch2 + this.peek(2); var op1 = OPERATORS[ch]; var op2 = OPERATORS[ch2]; var op3 = OPERATORS[ch3]; if (op1 || op2 || op3) { var token = op3 ? ch3 : (op2 ? ch2 : ch); this.tokens.push({index: this.index, text: token, operator: true}); this.index += token.length; } else { this.throwError('Unexpected next character ', this.index, this.index + 1); } } } return this.tokens; }, is: function(ch, chars) { return chars.indexOf(ch) !== -1; }, peek: function(i) { var num = i || 1; return (this.index + num < this.text.length) ? this.text.charAt(this.index + num) : false; }, isNumber: function(ch) { return ('0' <= ch && ch <= '9') && typeof ch === "string"; }, isWhitespace: function(ch) { // IE treats non-breaking space as \u00A0 return (ch === ' ' || ch === '\r' || ch === '\t' || ch === '\n' || ch === '\v' || ch === '\u00A0'); }, isIdentifierStart: function(ch) { return this.options.isIdentifierStart ? this.options.isIdentifierStart(ch, this.codePointAt(ch)) : this.isValidIdentifierStart(ch); }, isValidIdentifierStart: function(ch) { return ('a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || '_' === ch || ch === '$'); }, isIdentifierContinue: function(ch) { return this.options.isIdentifierContinue ? this.options.isIdentifierContinue(ch, this.codePointAt(ch)) : this.isValidIdentifierContinue(ch); }, isValidIdentifierContinue: function(ch, cp) { return this.isValidIdentifierStart(ch, cp) || this.isNumber(ch); }, codePointAt: function(ch) { if (ch.length === 1) return ch.charCodeAt(0); /*jshint bitwise: false*/ return (ch.charCodeAt(0) << 10) + ch.charCodeAt(1) - 0x35FDC00; /*jshint bitwise: true*/ }, peekMultichar: function() { var ch = this.text.charAt(this.index); var peek = this.peek(); if (!peek) { return ch; } var cp1 = ch.charCodeAt(0); var cp2 = peek.charCodeAt(0); if (cp1 >= 0xD800 && cp1 <= 0xDBFF && cp2 >= 0xDC00 && cp2 <= 0xDFFF) { return ch + peek; } return ch; }, isExpOperator: function(ch) { return (ch === '-' || ch === '+' || this.isNumber(ch)); }, throwError: function(error, start, end) { end = end || this.index; var colStr = (isDefined(start) ? 's ' + start + '-' + this.index + ' [' + this.text.substring(start, end) + ']' : ' ' + end); throw $parseMinErr('lexerr', 'Lexer Error: {0} at column{1} in expression [{2}].', error, colStr, this.text); }, readNumber: function() { var number = ''; var start = this.index; while (this.index < this.text.length) { var ch = lowercase(this.text.charAt(this.index)); if (ch == '.' || this.isNumber(ch)) { number += ch; } else { var peekCh = this.peek(); if (ch == 'e' && this.isExpOperator(peekCh)) { number += ch; } else if (this.isExpOperator(ch) && peekCh && this.isNumber(peekCh) && number.charAt(number.length - 1) == 'e') { number += ch; } else if (this.isExpOperator(ch) && (!peekCh || !this.isNumber(peekCh)) && number.charAt(number.length - 1) == 'e') { this.throwError('Invalid exponent'); } else { break; } } this.index++; } this.tokens.push({ index: start, text: number, constant: true, value: Number(number) }); }, readIdent: function() { var start = this.index; this.index += this.peekMultichar().length; while (this.index < this.text.length) { var ch = this.peekMultichar(); if (!this.isIdentifierContinue(ch)) { break; } this.index += ch.length; } this.tokens.push({ index: start, text: this.text.slice(start, this.index), identifier: true }); }, readString: function(quote) { var start = this.index; this.index++; var string = ''; var rawString = quote; var escape = false; while (this.index < this.text.length) { var ch = this.text.charAt(this.index); rawString += ch; if (escape) { if (ch === 'u') { var hex = this.text.substring(this.index + 1, this.index + 5); if (!hex.match(/[\da-f]{4}/i)) { this.throwError('Invalid unicode escape [\\u' + hex + ']'); } this.index += 4; string += String.fromCharCode(parseInt(hex, 16)); } else { var rep = ESCAPE[ch]; string = string + (rep || ch); } escape = false; } else if (ch === '\\') { escape = true; } else if (ch === quote) { this.index++; this.tokens.push({ index: start, text: rawString, constant: true, value: string }); return; } else { string += ch; } this.index++; } this.throwError('Unterminated quote', start); } }; var AST = function(lexer, options) { this.lexer = lexer; this.options = options; }; AST.Program = 'Program'; AST.ExpressionStatement = 'ExpressionStatement'; AST.AssignmentExpression = 'AssignmentExpression'; AST.ConditionalExpression = 'ConditionalExpression'; AST.LogicalExpression = 'LogicalExpression'; AST.BinaryExpression = 'BinaryExpression'; AST.UnaryExpression = 'UnaryExpression'; AST.CallExpression = 'CallExpression'; AST.MemberExpression = 'MemberExpression'; AST.Identifier = 'Identifier'; AST.Literal = 'Literal'; AST.ArrayExpression = 'ArrayExpression'; AST.Property = 'Property'; AST.ObjectExpression = 'ObjectExpression'; AST.ThisExpression = 'ThisExpression'; AST.LocalsExpression = 'LocalsExpression'; // Internal use only AST.NGValueParameter = 'NGValueParameter'; AST.prototype = { ast: function(text) { this.text = text; this.tokens = this.lexer.lex(text); var value = this.program(); if (this.tokens.length !== 0) { this.throwError('is an unexpected token', this.tokens[0]); } return value; }, program: function() { var body = []; while (true) { if (this.tokens.length > 0 && !this.peek('}', ')', ';', ']')) body.push(this.expressionStatement()); if (!this.expect(';')) { return { type: AST.Program, body: body}; } } }, expressionStatement: function() { return { type: AST.ExpressionStatement, expression: this.filterChain() }; }, filterChain: function() { var left = this.expression(); var token; while ((token = this.expect('|'))) { left = this.filter(left); } return left; }, expression: function() { return this.assignment(); }, assignment: function() { var result = this.ternary(); if (this.expect('=')) { result = { type: AST.AssignmentExpression, left: result, right: this.assignment(), operator: '='}; } return result; }, ternary: function() { var test = this.logicalOR(); var alternate; var consequent; if (this.expect('?')) { alternate = this.expression(); if (this.consume(':')) { consequent = this.expression(); return { type: AST.ConditionalExpression, test: test, alternate: alternate, consequent: consequent}; } } return test; }, logicalOR: function() { var left = this.logicalAND(); while (this.expect('||')) { left = { type: AST.LogicalExpression, operator: '||', left: left, right: this.logicalAND() }; } return left; }, logicalAND: function() { var left = this.equality(); while (this.expect('&&')) { left = { type: AST.LogicalExpression, operator: '&&', left: left, right: this.equality()}; } return left; }, equality: function() { var left = this.relational(); var token; while ((token = this.expect('==','!=','===','!=='))) { left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.relational() }; } return left; }, relational: function() { var left = this.additive(); var token; while ((token = this.expect('<', '>', '<=', '>='))) { left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.additive() }; } return left; }, additive: function() { var left = this.multiplicative(); var token; while ((token = this.expect('+','-'))) { left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.multiplicative() }; } return left; }, multiplicative: function() { var left = this.unary(); var token; while ((token = this.expect('*','/','%'))) { left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.unary() }; } return left; }, unary: function() { var token; if ((token = this.expect('+', '-', '!'))) { return { type: AST.UnaryExpression, operator: token.text, prefix: true, argument: this.unary() }; } else { return this.primary(); } }, primary: function() { var primary; if (this.expect('(')) { primary = this.filterChain(); this.consume(')'); } else if (this.expect('[')) { primary = this.arrayDeclaration(); } else if (this.expect('{')) { primary = this.object(); } else if (this.selfReferential.hasOwnProperty(this.peek().text)) { primary = copy(this.selfReferential[this.consume().text]); } else if (this.options.literals.hasOwnProperty(this.peek().text)) { primary = { type: AST.Literal, value: this.options.literals[this.consume().text]}; } else if (this.peek().identifier) { primary = this.identifier(); } else if (this.peek().constant) { primary = this.constant(); } else { this.throwError('not a primary expression', this.peek()); } var next; while ((next = this.expect('(', '[', '.'))) { if (next.text === '(') { primary = {type: AST.CallExpression, callee: primary, arguments: this.parseArguments() }; this.consume(')'); } else if (next.text === '[') { primary = { type: AST.MemberExpression, object: primary, property: this.expression(), computed: true }; this.consume(']'); } else if (next.text === '.') { primary = { type: AST.MemberExpression, object: primary, property: this.identifier(), computed: false }; } else { this.throwError('IMPOSSIBLE'); } } return primary; }, filter: function(baseExpression) { var args = [baseExpression]; var result = {type: AST.CallExpression, callee: this.identifier(), arguments: args, filter: true}; while (this.expect(':')) { args.push(this.expression()); } return result; }, parseArguments: function() { var args = []; if (this.peekToken().text !== ')') { do { args.push(this.filterChain()); } while (this.expect(',')); } return args; }, identifier: function() { var token = this.consume(); if (!token.identifier) { this.throwError('is not a valid identifier', token); } return { type: AST.Identifier, name: token.text }; }, constant: function() { // TODO check that it is a constant return { type: AST.Literal, value: this.consume().value }; }, arrayDeclaration: function() { var elements = []; if (this.peekToken().text !== ']') { do { if (this.peek(']')) { // Support trailing commas per ES5.1. break; } elements.push(this.expression()); } while (this.expect(',')); } this.consume(']'); return { type: AST.ArrayExpression, elements: elements }; }, object: function() { var properties = [], property; if (this.peekToken().text !== '}') { do { if (this.peek('}')) { // Support trailing commas per ES5.1. break; } property = {type: AST.Property, kind: 'init'}; if (this.peek().constant) { property.key = this.constant(); property.computed = false; this.consume(':'); property.value = this.expression(); } else if (this.peek().identifier) { property.key = this.identifier(); property.computed = false; if (this.peek(':')) { this.consume(':'); property.value = this.expression(); } else { property.value = property.key; } } else if (this.peek('[')) { this.consume('['); property.key = this.expression(); this.consume(']'); property.computed = true; this.consume(':'); property.value = this.expression(); } else { this.throwError("invalid key", this.peek()); } properties.push(property); } while (this.expect(',')); } this.consume('}'); return {type: AST.ObjectExpression, properties: properties }; }, throwError: function(msg, token) { throw $parseMinErr('syntax', 'Syntax Error: Token \'{0}\' {1} at column {2} of the expression [{3}] starting at [{4}].', token.text, msg, (token.index + 1), this.text, this.text.substring(token.index)); }, consume: function(e1) { if (this.tokens.length === 0) { throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text); } var token = this.expect(e1); if (!token) { this.throwError('is unexpected, expecting [' + e1 + ']', this.peek()); } return token; }, peekToken: function() { if (this.tokens.length === 0) { throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text); } return this.tokens[0]; }, peek: function(e1, e2, e3, e4) { return this.peekAhead(0, e1, e2, e3, e4); }, peekAhead: function(i, e1, e2, e3, e4) { if (this.tokens.length > i) { var token = this.tokens[i]; var t = token.text; if (t === e1 || t === e2 || t === e3 || t === e4 || (!e1 && !e2 && !e3 && !e4)) { return token; } } return false; }, expect: function(e1, e2, e3, e4) { var token = this.peek(e1, e2, e3, e4); if (token) { this.tokens.shift(); return token; } return false; }, selfReferential: { 'this': {type: AST.ThisExpression }, '$locals': {type: AST.LocalsExpression } } }; function ifDefined(v, d) { return typeof v !== 'undefined' ? v : d; } function plusFn(l, r) { if (typeof l === 'undefined') return r; if (typeof r === 'undefined') return l; return l + r; } function isStateless($filter, filterName) { var fn = $filter(filterName); return !fn.$stateful; } function findConstantAndWatchExpressions(ast, $filter) { var allConstants; var argsToWatch; switch (ast.type) { case AST.Program: allConstants = true; forEach(ast.body, function(expr) { findConstantAndWatchExpressions(expr.expression, $filter); allConstants = allConstants && expr.expression.constant; }); ast.constant = allConstants; break; case AST.Literal: ast.constant = true; ast.toWatch = []; break; case AST.UnaryExpression: findConstantAndWatchExpressions(ast.argument, $filter); ast.constant = ast.argument.constant; ast.toWatch = ast.argument.toWatch; break; case AST.BinaryExpression: findConstantAndWatchExpressions(ast.left, $filter); findConstantAndWatchExpressions(ast.right, $filter); ast.constant = ast.left.constant && ast.right.constant; ast.toWatch = ast.left.toWatch.concat(ast.right.toWatch); break; case AST.LogicalExpression: findConstantAndWatchExpressions(ast.left, $filter); findConstantAndWatchExpressions(ast.right, $filter); ast.constant = ast.left.constant && ast.right.constant; ast.toWatch = ast.constant ? [] : [ast]; break; case AST.ConditionalExpression: findConstantAndWatchExpressions(ast.test, $filter); findConstantAndWatchExpressions(ast.alternate, $filter); findConstantAndWatchExpressions(ast.consequent, $filter); ast.constant = ast.test.constant && ast.alternate.constant && ast.consequent.constant; ast.toWatch = ast.constant ? [] : [ast]; break; case AST.Identifier: ast.constant = false; ast.toWatch = [ast]; break; case AST.MemberExpression: findConstantAndWatchExpressions(ast.object, $filter); if (ast.computed) { findConstantAndWatchExpressions(ast.property, $filter); } ast.constant = ast.object.constant && (!ast.computed || ast.property.constant); ast.toWatch = [ast]; break; case AST.CallExpression: allConstants = ast.filter ? isStateless($filter, ast.callee.name) : false; argsToWatch = []; forEach(ast.arguments, function(expr) { findConstantAndWatchExpressions(expr, $filter); allConstants = allConstants && expr.constant; if (!expr.constant) { argsToWatch.push.apply(argsToWatch, expr.toWatch); } }); ast.constant = allConstants; ast.toWatch = ast.filter && isStateless($filter, ast.callee.name) ? argsToWatch : [ast]; break; case AST.AssignmentExpression: findConstantAndWatchExpressions(ast.left, $filter); findConstantAndWatchExpressions(ast.right, $filter); ast.constant = ast.left.constant && ast.right.constant; ast.toWatch = [ast]; break; case AST.ArrayExpression: allConstants = true; argsToWatch = []; forEach(ast.elements, function(expr) { findConstantAndWatchExpressions(expr, $filter); allConstants = allConstants && expr.constant; if (!expr.constant) { argsToWatch.push.apply(argsToWatch, expr.toWatch); } }); ast.constant = allConstants; ast.toWatch = argsToWatch; break; case AST.ObjectExpression: allConstants = true; argsToWatch = []; forEach(ast.properties, function(property) { findConstantAndWatchExpressions(property.value, $filter); allConstants = allConstants && property.value.constant && !property.computed; if (!property.value.constant) { argsToWatch.push.apply(argsToWatch, property.value.toWatch); } }); ast.constant = allConstants; ast.toWatch = argsToWatch; break; case AST.ThisExpression: ast.constant = false; ast.toWatch = []; break; case AST.LocalsExpression: ast.constant = false; ast.toWatch = []; break; } } function getInputs(body) { if (body.length != 1) return; var lastExpression = body[0].expression; var candidate = lastExpression.toWatch; if (candidate.length !== 1) return candidate; return candidate[0] !== lastExpression ? candidate : undefined; } function isAssignable(ast) { return ast.type === AST.Identifier || ast.type === AST.MemberExpression; } function assignableAST(ast) { if (ast.body.length === 1 && isAssignable(ast.body[0].expression)) { return {type: AST.AssignmentExpression, left: ast.body[0].expression, right: {type: AST.NGValueParameter}, operator: '='}; } } function isLiteral(ast) { return ast.body.length === 0 || ast.body.length === 1 && ( ast.body[0].expression.type === AST.Literal || ast.body[0].expression.type === AST.ArrayExpression || ast.body[0].expression.type === AST.ObjectExpression); } function isConstant(ast) { return ast.constant; } function ASTCompiler(astBuilder, $filter) { this.astBuilder = astBuilder; this.$filter = $filter; } ASTCompiler.prototype = { compile: function(expression, expensiveChecks) { var self = this; var ast = this.astBuilder.ast(expression); this.state = { nextId: 0, filters: {}, expensiveChecks: expensiveChecks, fn: {vars: [], body: [], own: {}}, assign: {vars: [], body: [], own: {}}, inputs: [] }; findConstantAndWatchExpressions(ast, self.$filter); var extra = ''; var assignable; this.stage = 'assign'; if ((assignable = assignableAST(ast))) { this.state.computing = 'assign'; var result = this.nextId(); this.recurse(assignable, result); this.return_(result); extra = 'fn.assign=' + this.generateFunction('assign', 's,v,l'); } var toWatch = getInputs(ast.body); self.stage = 'inputs'; forEach(toWatch, function(watch, key) { var fnKey = 'fn' + key; self.state[fnKey] = {vars: [], body: [], own: {}}; self.state.computing = fnKey; var intoId = self.nextId(); self.recurse(watch, intoId); self.return_(intoId); self.state.inputs.push(fnKey); watch.watchId = key; }); this.state.computing = 'fn'; this.stage = 'main'; this.recurse(ast); var fnString = // The build and minification steps remove the string "use strict" from the code, but this is done using a regex. // This is a workaround for this until we do a better job at only removing the prefix only when we should. '"' + this.USE + ' ' + this.STRICT + '";\n' + this.filterPrefix() + 'var fn=' + this.generateFunction('fn', 's,l,a,i') + extra + this.watchFns() + 'return fn;'; /* jshint -W054 */ var fn = (new Function('$filter', 'ensureSafeMemberName', 'ensureSafeObject', 'ensureSafeFunction', 'getStringValue', 'ensureSafeAssignContext', 'ifDefined', 'plus', 'text', fnString))( this.$filter, ensureSafeMemberName, ensureSafeObject, ensureSafeFunction, getStringValue, ensureSafeAssignContext, ifDefined, plusFn, expression); /* jshint +W054 */ this.state = this.stage = undefined; fn.literal = isLiteral(ast); fn.constant = isConstant(ast); return fn; }, USE: 'use', STRICT: 'strict', watchFns: function() { var result = []; var fns = this.state.inputs; var self = this; forEach(fns, function(name) { result.push('var ' + name + '=' + self.generateFunction(name, 's')); }); if (fns.length) { result.push('fn.inputs=[' + fns.join(',') + '];'); } return result.join(''); }, generateFunction: function(name, params) { return 'function(' + params + '){' + this.varsPrefix(name) + this.body(name) + '};'; }, filterPrefix: function() { var parts = []; var self = this; forEach(this.state.filters, function(id, filter) { parts.push(id + '=$filter(' + self.escape(filter) + ')'); }); if (parts.length) return 'var ' + parts.join(',') + ';'; return ''; }, varsPrefix: function(section) { return this.state[section].vars.length ? 'var ' + this.state[section].vars.join(',') + ';' : ''; }, body: function(section) { return this.state[section].body.join(''); }, recurse: function(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck) { var left, right, self = this, args, expression, computed; recursionFn = recursionFn || noop; if (!skipWatchIdCheck && isDefined(ast.watchId)) { intoId = intoId || this.nextId(); this.if_('i', this.lazyAssign(intoId, this.computedMember('i', ast.watchId)), this.lazyRecurse(ast, intoId, nameId, recursionFn, create, true) ); return; } switch (ast.type) { case AST.Program: forEach(ast.body, function(expression, pos) { self.recurse(expression.expression, undefined, undefined, function(expr) { right = expr; }); if (pos !== ast.body.length - 1) { self.current().body.push(right, ';'); } else { self.return_(right); } }); break; case AST.Literal: expression = this.escape(ast.value); this.assign(intoId, expression); recursionFn(expression); break; case AST.UnaryExpression: this.recurse(ast.argument, undefined, undefined, function(expr) { right = expr; }); expression = ast.operator + '(' + this.ifDefined(right, 0) + ')'; this.assign(intoId, expression); recursionFn(expression); break; case AST.BinaryExpression: this.recurse(ast.left, undefined, undefined, function(expr) { left = expr; }); this.recurse(ast.right, undefined, undefined, function(expr) { right = expr; }); if (ast.operator === '+') { expression = this.plus(left, right); } else if (ast.operator === '-') { expression = this.ifDefined(left, 0) + ast.operator + this.ifDefined(right, 0); } else { expression = '(' + left + ')' + ast.operator + '(' + right + ')'; } this.assign(intoId, expression); recursionFn(expression); break; case AST.LogicalExpression: intoId = intoId || this.nextId(); self.recurse(ast.left, intoId); self.if_(ast.operator === '&&' ? intoId : self.not(intoId), self.lazyRecurse(ast.right, intoId)); recursionFn(intoId); break; case AST.ConditionalExpression: intoId = intoId || this.nextId(); self.recurse(ast.test, intoId); self.if_(intoId, self.lazyRecurse(ast.alternate, intoId), self.lazyRecurse(ast.consequent, intoId)); recursionFn(intoId); break; case AST.Identifier: intoId = intoId || this.nextId(); if (nameId) { nameId.context = self.stage === 'inputs' ? 's' : this.assign(this.nextId(), this.getHasOwnProperty('l', ast.name) + '?l:s'); nameId.computed = false; nameId.name = ast.name; } ensureSafeMemberName(ast.name); self.if_(self.stage === 'inputs' || self.not(self.getHasOwnProperty('l', ast.name)), function() { self.if_(self.stage === 'inputs' || 's', function() { if (create && create !== 1) { self.if_( self.not(self.nonComputedMember('s', ast.name)), self.lazyAssign(self.nonComputedMember('s', ast.name), '{}')); } self.assign(intoId, self.nonComputedMember('s', ast.name)); }); }, intoId && self.lazyAssign(intoId, self.nonComputedMember('l', ast.name)) ); if (self.state.expensiveChecks || isPossiblyDangerousMemberName(ast.name)) { self.addEnsureSafeObject(intoId); } recursionFn(intoId); break; case AST.MemberExpression: left = nameId && (nameId.context = this.nextId()) || this.nextId(); intoId = intoId || this.nextId(); self.recurse(ast.object, left, undefined, function() { self.if_(self.notNull(left), function() { if (create && create !== 1) { self.addEnsureSafeAssignContext(left); } if (ast.computed) { right = self.nextId(); self.recurse(ast.property, right); self.getStringValue(right); self.addEnsureSafeMemberName(right); if (create && create !== 1) { self.if_(self.not(self.computedMember(left, right)), self.lazyAssign(self.computedMember(left, right), '{}')); } expression = self.ensureSafeObject(self.computedMember(left, right)); self.assign(intoId, expression); if (nameId) { nameId.computed = true; nameId.name = right; } } else { ensureSafeMemberName(ast.property.name); if (create && create !== 1) { self.if_(self.not(self.nonComputedMember(left, ast.property.name)), self.lazyAssign(self.nonComputedMember(left, ast.property.name), '{}')); } expression = self.nonComputedMember(left, ast.property.name); if (self.state.expensiveChecks || isPossiblyDangerousMemberName(ast.property.name)) { expression = self.ensureSafeObject(expression); } self.assign(intoId, expression); if (nameId) { nameId.computed = false; nameId.name = ast.property.name; } } }, function() { self.assign(intoId, 'undefined'); }); recursionFn(intoId); }, !!create); break; case AST.CallExpression: intoId = intoId || this.nextId(); if (ast.filter) { right = self.filter(ast.callee.name); args = []; forEach(ast.arguments, function(expr) { var argument = self.nextId(); self.recurse(expr, argument); args.push(argument); }); expression = right + '(' + args.join(',') + ')'; self.assign(intoId, expression); recursionFn(intoId); } else { right = self.nextId(); left = {}; args = []; self.recurse(ast.callee, right, left, function() { self.if_(self.notNull(right), function() { self.addEnsureSafeFunction(right); forEach(ast.arguments, function(expr) { self.recurse(expr, self.nextId(), undefined, function(argument) { args.push(self.ensureSafeObject(argument)); }); }); if (left.name) { if (!self.state.expensiveChecks) { self.addEnsureSafeObject(left.context); } expression = self.member(left.context, left.name, left.computed) + '(' + args.join(',') + ')'; } else { expression = right + '(' + args.join(',') + ')'; } expression = self.ensureSafeObject(expression); self.assign(intoId, expression); }, function() { self.assign(intoId, 'undefined'); }); recursionFn(intoId); }); } break; case AST.AssignmentExpression: right = this.nextId(); left = {}; if (!isAssignable(ast.left)) { throw $parseMinErr('lval', 'Trying to assign a value to a non l-value'); } this.recurse(ast.left, undefined, left, function() { self.if_(self.notNull(left.context), function() { self.recurse(ast.right, right); self.addEnsureSafeObject(self.member(left.context, left.name, left.computed)); self.addEnsureSafeAssignContext(left.context); expression = self.member(left.context, left.name, left.computed) + ast.operator + right; self.assign(intoId, expression); recursionFn(intoId || expression); }); }, 1); break; case AST.ArrayExpression: args = []; forEach(ast.elements, function(expr) { self.recurse(expr, self.nextId(), undefined, function(argument) { args.push(argument); }); }); expression = '[' + args.join(',') + ']'; this.assign(intoId, expression); recursionFn(expression); break; case AST.ObjectExpression: args = []; computed = false; forEach(ast.properties, function(property) { if (property.computed) { computed = true; } }); if (computed) { intoId = intoId || this.nextId(); this.assign(intoId, '{}'); forEach(ast.properties, function(property) { if (property.computed) { left = self.nextId(); self.recurse(property.key, left); } else { left = property.key.type === AST.Identifier ? property.key.name : ('' + property.key.value); } right = self.nextId(); self.recurse(property.value, right); self.assign(self.member(intoId, left, property.computed), right); }); } else { forEach(ast.properties, function(property) { self.recurse(property.value, ast.constant ? undefined : self.nextId(), undefined, function(expr) { args.push(self.escape( property.key.type === AST.Identifier ? property.key.name : ('' + property.key.value)) + ':' + expr); }); }); expression = '{' + args.join(',') + '}'; this.assign(intoId, expression); } recursionFn(intoId || expression); break; case AST.ThisExpression: this.assign(intoId, 's'); recursionFn('s'); break; case AST.LocalsExpression: this.assign(intoId, 'l'); recursionFn('l'); break; case AST.NGValueParameter: this.assign(intoId, 'v'); recursionFn('v'); break; } }, getHasOwnProperty: function(element, property) { var key = element + '.' + property; var own = this.current().own; if (!own.hasOwnProperty(key)) { own[key] = this.nextId(false, element + '&&(' + this.escape(property) + ' in ' + element + ')'); } return own[key]; }, assign: function(id, value) { if (!id) return; this.current().body.push(id, '=', value, ';'); return id; }, filter: function(filterName) { if (!this.state.filters.hasOwnProperty(filterName)) { this.state.filters[filterName] = this.nextId(true); } return this.state.filters[filterName]; }, ifDefined: function(id, defaultValue) { return 'ifDefined(' + id + ',' + this.escape(defaultValue) + ')'; }, plus: function(left, right) { return 'plus(' + left + ',' + right + ')'; }, return_: function(id) { this.current().body.push('return ', id, ';'); }, if_: function(test, alternate, consequent) { if (test === true) { alternate(); } else { var body = this.current().body; body.push('if(', test, '){'); alternate(); body.push('}'); if (consequent) { body.push('else{'); consequent(); body.push('}'); } } }, not: function(expression) { return '!(' + expression + ')'; }, notNull: function(expression) { return expression + '!=null'; }, nonComputedMember: function(left, right) { var SAFE_IDENTIFIER = /[$_a-zA-Z][$_a-zA-Z0-9]*/; var UNSAFE_CHARACTERS = /[^$_a-zA-Z0-9]/g; if (SAFE_IDENTIFIER.test(right)) { return left + '.' + right; } else { return left + '["' + right.replace(UNSAFE_CHARACTERS, this.stringEscapeFn) + '"]'; } }, computedMember: function(left, right) { return left + '[' + right + ']'; }, member: function(left, right, computed) { if (computed) return this.computedMember(left, right); return this.nonComputedMember(left, right); }, addEnsureSafeObject: function(item) { this.current().body.push(this.ensureSafeObject(item), ';'); }, addEnsureSafeMemberName: function(item) { this.current().body.push(this.ensureSafeMemberName(item), ';'); }, addEnsureSafeFunction: function(item) { this.current().body.push(this.ensureSafeFunction(item), ';'); }, addEnsureSafeAssignContext: function(item) { this.current().body.push(this.ensureSafeAssignContext(item), ';'); }, ensureSafeObject: function(item) { return 'ensureSafeObject(' + item + ',text)'; }, ensureSafeMemberName: function(item) { return 'ensureSafeMemberName(' + item + ',text)'; }, ensureSafeFunction: function(item) { return 'ensureSafeFunction(' + item + ',text)'; }, getStringValue: function(item) { this.assign(item, 'getStringValue(' + item + ')'); }, ensureSafeAssignContext: function(item) { return 'ensureSafeAssignContext(' + item + ',text)'; }, lazyRecurse: function(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck) { var self = this; return function() { self.recurse(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck); }; }, lazyAssign: function(id, value) { var self = this; return function() { self.assign(id, value); }; }, stringEscapeRegex: /[^ a-zA-Z0-9]/g, stringEscapeFn: function(c) { return '\\u' + ('0000' + c.charCodeAt(0).toString(16)).slice(-4); }, escape: function(value) { if (isString(value)) return "'" + value.replace(this.stringEscapeRegex, this.stringEscapeFn) + "'"; if (isNumber(value)) return value.toString(); if (value === true) return 'true'; if (value === false) return 'false'; if (value === null) return 'null'; if (typeof value === 'undefined') return 'undefined'; throw $parseMinErr('esc', 'IMPOSSIBLE'); }, nextId: function(skip, init) { var id = 'v' + (this.state.nextId++); if (!skip) { this.current().vars.push(id + (init ? '=' + init : '')); } return id; }, current: function() { return this.state[this.state.computing]; } }; function ASTInterpreter(astBuilder, $filter) { this.astBuilder = astBuilder; this.$filter = $filter; } ASTInterpreter.prototype = { compile: function(expression, expensiveChecks) { var self = this; var ast = this.astBuilder.ast(expression); this.expression = expression; this.expensiveChecks = expensiveChecks; findConstantAndWatchExpressions(ast, self.$filter); var assignable; var assign; if ((assignable = assignableAST(ast))) { assign = this.recurse(assignable); } var toWatch = getInputs(ast.body); var inputs; if (toWatch) { inputs = []; forEach(toWatch, function(watch, key) { var input = self.recurse(watch); watch.input = input; inputs.push(input); watch.watchId = key; }); } var expressions = []; forEach(ast.body, function(expression) { expressions.push(self.recurse(expression.expression)); }); var fn = ast.body.length === 0 ? noop : ast.body.length === 1 ? expressions[0] : function(scope, locals) { var lastValue; forEach(expressions, function(exp) { lastValue = exp(scope, locals); }); return lastValue; }; if (assign) { fn.assign = function(scope, value, locals) { return assign(scope, locals, value); }; } if (inputs) { fn.inputs = inputs; } fn.literal = isLiteral(ast); fn.constant = isConstant(ast); return fn; }, recurse: function(ast, context, create) { var left, right, self = this, args, expression; if (ast.input) { return this.inputs(ast.input, ast.watchId); } switch (ast.type) { case AST.Literal: return this.value(ast.value, context); case AST.UnaryExpression: right = this.recurse(ast.argument); return this['unary' + ast.operator](right, context); case AST.BinaryExpression: left = this.recurse(ast.left); right = this.recurse(ast.right); return this['binary' + ast.operator](left, right, context); case AST.LogicalExpression: left = this.recurse(ast.left); right = this.recurse(ast.right); return this['binary' + ast.operator](left, right, context); case AST.ConditionalExpression: return this['ternary?:']( this.recurse(ast.test), this.recurse(ast.alternate), this.recurse(ast.consequent), context ); case AST.Identifier: ensureSafeMemberName(ast.name, self.expression); return self.identifier(ast.name, self.expensiveChecks || isPossiblyDangerousMemberName(ast.name), context, create, self.expression); case AST.MemberExpression: left = this.recurse(ast.object, false, !!create); if (!ast.computed) { ensureSafeMemberName(ast.property.name, self.expression); right = ast.property.name; } if (ast.computed) right = this.recurse(ast.property); return ast.computed ? this.computedMember(left, right, context, create, self.expression) : this.nonComputedMember(left, right, self.expensiveChecks, context, create, self.expression); case AST.CallExpression: args = []; forEach(ast.arguments, function(expr) { args.push(self.recurse(expr)); }); if (ast.filter) right = this.$filter(ast.callee.name); if (!ast.filter) right = this.recurse(ast.callee, true); return ast.filter ? function(scope, locals, assign, inputs) { var values = []; for (var i = 0; i < args.length; ++i) { values.push(args[i](scope, locals, assign, inputs)); } var value = right.apply(undefined, values, inputs); return context ? {context: undefined, name: undefined, value: value} : value; } : function(scope, locals, assign, inputs) { var rhs = right(scope, locals, assign, inputs); var value; if (rhs.value != null) { ensureSafeObject(rhs.context, self.expression); ensureSafeFunction(rhs.value, self.expression); var values = []; for (var i = 0; i < args.length; ++i) { values.push(ensureSafeObject(args[i](scope, locals, assign, inputs), self.expression)); } value = ensureSafeObject(rhs.value.apply(rhs.context, values), self.expression); } return context ? {value: value} : value; }; case AST.AssignmentExpression: left = this.recurse(ast.left, true, 1); right = this.recurse(ast.right); return function(scope, locals, assign, inputs) { var lhs = left(scope, locals, assign, inputs); var rhs = right(scope, locals, assign, inputs); ensureSafeObject(lhs.value, self.expression); ensureSafeAssignContext(lhs.context); lhs.context[lhs.name] = rhs; return context ? {value: rhs} : rhs; }; case AST.ArrayExpression: args = []; forEach(ast.elements, function(expr) { args.push(self.recurse(expr)); }); return function(scope, locals, assign, inputs) { var value = []; for (var i = 0; i < args.length; ++i) { value.push(args[i](scope, locals, assign, inputs)); } return context ? {value: value} : value; }; case AST.ObjectExpression: args = []; forEach(ast.properties, function(property) { if (property.computed) { args.push({key: self.recurse(property.key), computed: true, value: self.recurse(property.value) }); } else { args.push({key: property.key.type === AST.Identifier ? property.key.name : ('' + property.key.value), computed: false, value: self.recurse(property.value) }); } }); return function(scope, locals, assign, inputs) { var value = {}; for (var i = 0; i < args.length; ++i) { if (args[i].computed) { value[args[i].key(scope, locals, assign, inputs)] = args[i].value(scope, locals, assign, inputs); } else { value[args[i].key] = args[i].value(scope, locals, assign, inputs); } } return context ? {value: value} : value; }; case AST.ThisExpression: return function(scope) { return context ? {value: scope} : scope; }; case AST.LocalsExpression: return function(scope, locals) { return context ? {value: locals} : locals; }; case AST.NGValueParameter: return function(scope, locals, assign) { return context ? {value: assign} : assign; }; } }, 'unary+': function(argument, context) { return function(scope, locals, assign, inputs) { var arg = argument(scope, locals, assign, inputs); if (isDefined(arg)) { arg = +arg; } else { arg = 0; } return context ? {value: arg} : arg; }; }, 'unary-': function(argument, context) { return function(scope, locals, assign, inputs) { var arg = argument(scope, locals, assign, inputs); if (isDefined(arg)) { arg = -arg; } else { arg = 0; } return context ? {value: arg} : arg; }; }, 'unary!': function(argument, context) { return function(scope, locals, assign, inputs) { var arg = !argument(scope, locals, assign, inputs); return context ? {value: arg} : arg; }; }, 'binary+': function(left, right, context) { return function(scope, locals, assign, inputs) { var lhs = left(scope, locals, assign, inputs); var rhs = right(scope, locals, assign, inputs); var arg = plusFn(lhs, rhs); return context ? {value: arg} : arg; }; }, 'binary-': function(left, right, context) { return function(scope, locals, assign, inputs) { var lhs = left(scope, locals, assign, inputs); var rhs = right(scope, locals, assign, inputs); var arg = (isDefined(lhs) ? lhs : 0) - (isDefined(rhs) ? rhs : 0); return context ? {value: arg} : arg; }; }, 'binary*': function(left, right, context) { return function(scope, locals, assign, inputs) { var arg = left(scope, locals, assign, inputs) * right(scope, locals, assign, inputs); return context ? {value: arg} : arg; }; }, 'binary/': function(left, right, context) { return function(scope, locals, assign, inputs) { var arg = left(scope, locals, assign, inputs) / right(scope, locals, assign, inputs); return context ? {value: arg} : arg; }; }, 'binary%': function(left, right, context) { return function(scope, locals, assign, inputs) { var arg = left(scope, locals, assign, inputs) % right(scope, locals, assign, inputs); return context ? {value: arg} : arg; }; }, 'binary===': function(left, right, context) { return function(scope, locals, assign, inputs) { var arg = left(scope, locals, assign, inputs) === right(scope, locals, assign, inputs); return context ? {value: arg} : arg; }; }, 'binary!==': function(left, right, context) { return function(scope, locals, assign, inputs) { var arg = left(scope, locals, assign, inputs) !== right(scope, locals, assign, inputs); return context ? {value: arg} : arg; }; }, 'binary==': function(left, right, context) { return function(scope, locals, assign, inputs) { var arg = left(scope, locals, assign, inputs) == right(scope, locals, assign, inputs); return context ? {value: arg} : arg; }; }, 'binary!=': function(left, right, context) { return function(scope, locals, assign, inputs) { var arg = left(scope, locals, assign, inputs) != right(scope, locals, assign, inputs); return context ? {value: arg} : arg; }; }, 'binary<': function(left, right, context) { return function(scope, locals, assign, inputs) { var arg = left(scope, locals, assign, inputs) < right(scope, locals, assign, inputs); return context ? {value: arg} : arg; }; }, 'binary>': function(left, right, context) { return function(scope, locals, assign, inputs) { var arg = left(scope, locals, assign, inputs) > right(scope, locals, assign, inputs); return context ? {value: arg} : arg; }; }, 'binary<=': function(left, right, context) { return function(scope, locals, assign, inputs) { var arg = left(scope, locals, assign, inputs) <= right(scope, locals, assign, inputs); return context ? {value: arg} : arg; }; }, 'binary>=': function(left, right, context) { return function(scope, locals, assign, inputs) { var arg = left(scope, locals, assign, inputs) >= right(scope, locals, assign, inputs); return context ? {value: arg} : arg; }; }, 'binary&&': function(left, right, context) { return function(scope, locals, assign, inputs) { var arg = left(scope, locals, assign, inputs) && right(scope, locals, assign, inputs); return context ? {value: arg} : arg; }; }, 'binary||': function(left, right, context) { return function(scope, locals, assign, inputs) { var arg = left(scope, locals, assign, inputs) || right(scope, locals, assign, inputs); return context ? {value: arg} : arg; }; }, 'ternary?:': function(test, alternate, consequent, context) { return function(scope, locals, assign, inputs) { var arg = test(scope, locals, assign, inputs) ? alternate(scope, locals, assign, inputs) : consequent(scope, locals, assign, inputs); return context ? {value: arg} : arg; }; }, value: function(value, context) { return function() { return context ? {context: undefined, name: undefined, value: value} : value; }; }, identifier: function(name, expensiveChecks, context, create, expression) { return function(scope, locals, assign, inputs) { var base = locals && (name in locals) ? locals : scope; if (create && create !== 1 && base && !(base[name])) { base[name] = {}; } var value = base ? base[name] : undefined; if (expensiveChecks) { ensureSafeObject(value, expression); } if (context) { return {context: base, name: name, value: value}; } else { return value; } }; }, computedMember: function(left, right, context, create, expression) { return function(scope, locals, assign, inputs) { var lhs = left(scope, locals, assign, inputs); var rhs; var value; if (lhs != null) { rhs = right(scope, locals, assign, inputs); rhs = getStringValue(rhs); ensureSafeMemberName(rhs, expression); if (create && create !== 1) { ensureSafeAssignContext(lhs); if (lhs && !(lhs[rhs])) { lhs[rhs] = {}; } } value = lhs[rhs]; ensureSafeObject(value, expression); } if (context) { return {context: lhs, name: rhs, value: value}; } else { return value; } }; }, nonComputedMember: function(left, right, expensiveChecks, context, create, expression) { return function(scope, locals, assign, inputs) { var lhs = left(scope, locals, assign, inputs); if (create && create !== 1) { ensureSafeAssignContext(lhs); if (lhs && !(lhs[right])) { lhs[right] = {}; } } var value = lhs != null ? lhs[right] : undefined; if (expensiveChecks || isPossiblyDangerousMemberName(right)) { ensureSafeObject(value, expression); } if (context) { return {context: lhs, name: right, value: value}; } else { return value; } }; }, inputs: function(input, watchId) { return function(scope, value, locals, inputs) { if (inputs) return inputs[watchId]; return input(scope, value, locals); }; } }; /** * @constructor */ var Parser = function(lexer, $filter, options) { this.lexer = lexer; this.$filter = $filter; this.options = options; this.ast = new AST(lexer, options); this.astCompiler = options.csp ? new ASTInterpreter(this.ast, $filter) : new ASTCompiler(this.ast, $filter); }; Parser.prototype = { constructor: Parser, parse: function(text) { return this.astCompiler.compile(text, this.options.expensiveChecks); } }; function isPossiblyDangerousMemberName(name) { return name == 'constructor'; } var objectValueOf = Object.prototype.valueOf; function getValueOf(value) { return isFunction(value.valueOf) ? value.valueOf() : objectValueOf.call(value); } /////////////////////////////////// /** * @ngdoc service * @name $parse * @kind function * * @description * * Converts Angular {@link guide/expression expression} into a function. * * ```js * var getter = $parse('user.name'); * var setter = getter.assign; * var context = {user:{name:'angular'}}; * var locals = {user:{name:'local'}}; * * expect(getter(context)).toEqual('angular'); * setter(context, 'newValue'); * expect(context.user.name).toEqual('newValue'); * expect(getter(context, locals)).toEqual('local'); * ``` * * * @param {string} expression String expression to compile. * @returns {function(context, locals)} a function which represents the compiled expression: * * * `context` – `{object}` – an object against which any expressions embedded in the strings * are evaluated against (typically a scope object). * * `locals` – `{object=}` – local variables context object, useful for overriding values in * `context`. * * The returned function also has the following properties: * * `literal` – `{boolean}` – whether the expression's top-level node is a JavaScript * literal. * * `constant` – `{boolean}` – whether the expression is made entirely of JavaScript * constant literals. * * `assign` – `{?function(context, value)}` – if the expression is assignable, this will be * set to a function to change its value on the given context. * */ /** * @ngdoc provider * @name $parseProvider * * @description * `$parseProvider` can be used for configuring the default behavior of the {@link ng.$parse $parse} * service. */ function $ParseProvider() { var cacheDefault = createMap(); var cacheExpensive = createMap(); var literals = { 'true': true, 'false': false, 'null': null, 'undefined': undefined }; var identStart, identContinue; /** * @ngdoc method * @name $parseProvider#addLiteral * @description * * Configure $parse service to add literal values that will be present as literal at expressions. * * @param {string} literalName Token for the literal value. The literal name value must be a valid literal name. * @param {*} literalValue Value for this literal. All literal values must be primitives or `undefined`. * **/ this.addLiteral = function(literalName, literalValue) { literals[literalName] = literalValue; }; /** * @ngdoc method * @name $parseProvider#setIdentifierFns * @description * * Allows defining the set of characters that are allowed in Angular expressions. The function * `identifierStart` will get called to know if a given character is a valid character to be the * first character for an identifier. The function `identifierContinue` will get called to know if * a given character is a valid character to be a follow-up identifier character. The functions * `identifierStart` and `identifierContinue` will receive as arguments the single character to be * identifier and the character code point. These arguments will be `string` and `numeric`. Keep in * mind that the `string` parameter can be two characters long depending on the character * representation. It is expected for the function to return `true` or `false`, whether that * character is allowed or not. * * Since this function will be called extensivelly, keep the implementation of these functions fast, * as the performance of these functions have a direct impact on the expressions parsing speed. * * @param {function=} identifierStart The function that will decide whether the given character is * a valid identifier start character. * @param {function=} identifierContinue The function that will decide whether the given character is * a valid identifier continue character. */ this.setIdentifierFns = function(identifierStart, identifierContinue) { identStart = identifierStart; identContinue = identifierContinue; return this; }; this.$get = ['$filter', function($filter) { var noUnsafeEval = csp().noUnsafeEval; var $parseOptions = { csp: noUnsafeEval, expensiveChecks: false, literals: copy(literals), isIdentifierStart: isFunction(identStart) && identStart, isIdentifierContinue: isFunction(identContinue) && identContinue }, $parseOptionsExpensive = { csp: noUnsafeEval, expensiveChecks: true, literals: copy(literals), isIdentifierStart: isFunction(identStart) && identStart, isIdentifierContinue: isFunction(identContinue) && identContinue }; var runningChecksEnabled = false; $parse.$$runningExpensiveChecks = function() { return runningChecksEnabled; }; return $parse; function $parse(exp, interceptorFn, expensiveChecks) { var parsedExpression, oneTime, cacheKey; expensiveChecks = expensiveChecks || runningChecksEnabled; switch (typeof exp) { case 'string': exp = exp.trim(); cacheKey = exp; var cache = (expensiveChecks ? cacheExpensive : cacheDefault); parsedExpression = cache[cacheKey]; if (!parsedExpression) { if (exp.charAt(0) === ':' && exp.charAt(1) === ':') { oneTime = true; exp = exp.substring(2); } var parseOptions = expensiveChecks ? $parseOptionsExpensive : $parseOptions; var lexer = new Lexer(parseOptions); var parser = new Parser(lexer, $filter, parseOptions); parsedExpression = parser.parse(exp); if (parsedExpression.constant) { parsedExpression.$$watchDelegate = constantWatchDelegate; } else if (oneTime) { parsedExpression.$$watchDelegate = parsedExpression.literal ? oneTimeLiteralWatchDelegate : oneTimeWatchDelegate; } else if (parsedExpression.inputs) { parsedExpression.$$watchDelegate = inputsWatchDelegate; } if (expensiveChecks) { parsedExpression = expensiveChecksInterceptor(parsedExpression); } cache[cacheKey] = parsedExpression; } return addInterceptor(parsedExpression, interceptorFn); case 'function': return addInterceptor(exp, interceptorFn); default: return addInterceptor(noop, interceptorFn); } } function expensiveChecksInterceptor(fn) { if (!fn) return fn; expensiveCheckFn.$$watchDelegate = fn.$$watchDelegate; expensiveCheckFn.assign = expensiveChecksInterceptor(fn.assign); expensiveCheckFn.constant = fn.constant; expensiveCheckFn.literal = fn.literal; for (var i = 0; fn.inputs && i < fn.inputs.length; ++i) { fn.inputs[i] = expensiveChecksInterceptor(fn.inputs[i]); } expensiveCheckFn.inputs = fn.inputs; return expensiveCheckFn; function expensiveCheckFn(scope, locals, assign, inputs) { var expensiveCheckOldValue = runningChecksEnabled; runningChecksEnabled = true; try { return fn(scope, locals, assign, inputs); } finally { runningChecksEnabled = expensiveCheckOldValue; } } } function expressionInputDirtyCheck(newValue, oldValueOfValue) { if (newValue == null || oldValueOfValue == null) { // null/undefined return newValue === oldValueOfValue; } if (typeof newValue === 'object') { // attempt to convert the value to a primitive type // TODO(user): add a note to docs that by implementing valueOf even objects and arrays can // be cheaply dirty-checked newValue = getValueOf(newValue); if (typeof newValue === 'object') { // objects/arrays are not supported - deep-watching them would be too expensive return false; } // fall-through to the primitive equality check } //Primitive or NaN return newValue === oldValueOfValue || (newValue !== newValue && oldValueOfValue !== oldValueOfValue); } function inputsWatchDelegate(scope, listener, objectEquality, parsedExpression, prettyPrintExpression) { var inputExpressions = parsedExpression.inputs; var lastResult; if (inputExpressions.length === 1) { var oldInputValueOf = expressionInputDirtyCheck; // init to something unique so that equals check fails inputExpressions = inputExpressions[0]; return scope.$watch(function expressionInputWatch(scope) { var newInputValue = inputExpressions(scope); if (!expressionInputDirtyCheck(newInputValue, oldInputValueOf)) { lastResult = parsedExpression(scope, undefined, undefined, [newInputValue]); oldInputValueOf = newInputValue && getValueOf(newInputValue); } return lastResult; }, listener, objectEquality, prettyPrintExpression); } var oldInputValueOfValues = []; var oldInputValues = []; for (var i = 0, ii = inputExpressions.length; i < ii; i++) { oldInputValueOfValues[i] = expressionInputDirtyCheck; // init to something unique so that equals check fails oldInputValues[i] = null; } return scope.$watch(function expressionInputsWatch(scope) { var changed = false; for (var i = 0, ii = inputExpressions.length; i < ii; i++) { var newInputValue = inputExpressions[i](scope); if (changed || (changed = !expressionInputDirtyCheck(newInputValue, oldInputValueOfValues[i]))) { oldInputValues[i] = newInputValue; oldInputValueOfValues[i] = newInputValue && getValueOf(newInputValue); } } if (changed) { lastResult = parsedExpression(scope, undefined, undefined, oldInputValues); } return lastResult; }, listener, objectEquality, prettyPrintExpression); } function oneTimeWatchDelegate(scope, listener, objectEquality, parsedExpression) { var unwatch, lastValue; return unwatch = scope.$watch(function oneTimeWatch(scope) { return parsedExpression(scope); }, function oneTimeListener(value, old, scope) { lastValue = value; if (isFunction(listener)) { listener.apply(this, arguments); } if (isDefined(value)) { scope.$$postDigest(function() { if (isDefined(lastValue)) { unwatch(); } }); } }, objectEquality); } function oneTimeLiteralWatchDelegate(scope, listener, objectEquality, parsedExpression) { var unwatch, lastValue; return unwatch = scope.$watch(function oneTimeWatch(scope) { return parsedExpression(scope); }, function oneTimeListener(value, old, scope) { lastValue = value; if (isFunction(listener)) { listener.call(this, value, old, scope); } if (isAllDefined(value)) { scope.$$postDigest(function() { if (isAllDefined(lastValue)) unwatch(); }); } }, objectEquality); function isAllDefined(value) { var allDefined = true; forEach(value, function(val) { if (!isDefined(val)) allDefined = false; }); return allDefined; } } function constantWatchDelegate(scope, listener, objectEquality, parsedExpression) { var unwatch; return unwatch = scope.$watch(function constantWatch(scope) { unwatch(); return parsedExpression(scope); }, listener, objectEquality); } function addInterceptor(parsedExpression, interceptorFn) { if (!interceptorFn) return parsedExpression; var watchDelegate = parsedExpression.$$watchDelegate; var useInputs = false; var regularWatch = watchDelegate !== oneTimeLiteralWatchDelegate && watchDelegate !== oneTimeWatchDelegate; var fn = regularWatch ? function regularInterceptedExpression(scope, locals, assign, inputs) { var value = useInputs && inputs ? inputs[0] : parsedExpression(scope, locals, assign, inputs); return interceptorFn(value, scope, locals); } : function oneTimeInterceptedExpression(scope, locals, assign, inputs) { var value = parsedExpression(scope, locals, assign, inputs); var result = interceptorFn(value, scope, locals); // we only return the interceptor's result if the // initial value is defined (for bind-once) return isDefined(value) ? result : value; }; // Propagate $$watchDelegates other then inputsWatchDelegate if (parsedExpression.$$watchDelegate && parsedExpression.$$watchDelegate !== inputsWatchDelegate) { fn.$$watchDelegate = parsedExpression.$$watchDelegate; } else if (!interceptorFn.$stateful) { // If there is an interceptor, but no watchDelegate then treat the interceptor like // we treat filters - it is assumed to be a pure function unless flagged with $stateful fn.$$watchDelegate = inputsWatchDelegate; useInputs = !parsedExpression.inputs; fn.inputs = parsedExpression.inputs ? parsedExpression.inputs : [parsedExpression]; } return fn; } }]; } /** * @ngdoc service * @name $q * @requires $rootScope * * @description * A service that helps you run functions asynchronously, and use their return values (or exceptions) * when they are done processing. * * This is an implementation of promises/deferred objects inspired by * [Kris Kowal's Q](https://github.com/kriskowal/q). * * $q can be used in two fashions --- one which is more similar to Kris Kowal's Q or jQuery's Deferred * implementations, and the other which resembles ES6 (ES2015) promises to some degree. * * # $q constructor * * The streamlined ES6 style promise is essentially just using $q as a constructor which takes a `resolver` * function as the first argument. This is similar to the native Promise implementation from ES6, * see [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise). * * While the constructor-style use is supported, not all of the supporting methods from ES6 promises are * available yet. * * It can be used like so: * * ```js * // for the purpose of this example let's assume that variables `$q` and `okToGreet` * // are available in the current lexical scope (they could have been injected or passed in). * * function asyncGreet(name) { * // perform some asynchronous operation, resolve or reject the promise when appropriate. * return $q(function(resolve, reject) { * setTimeout(function() { * if (okToGreet(name)) { * resolve('Hello, ' + name + '!'); * } else { * reject('Greeting ' + name + ' is not allowed.'); * } * }, 1000); * }); * } * * var promise = asyncGreet('Robin Hood'); * promise.then(function(greeting) { * alert('Success: ' + greeting); * }, function(reason) { * alert('Failed: ' + reason); * }); * ``` * * Note: progress/notify callbacks are not currently supported via the ES6-style interface. * * Note: unlike ES6 behavior, an exception thrown in the constructor function will NOT implicitly reject the promise. * * However, the more traditional CommonJS-style usage is still available, and documented below. * * [The CommonJS Promise proposal](http://wiki.commonjs.org/wiki/Promises) describes a promise as an * interface for interacting with an object that represents the result of an action that is * performed asynchronously, and may or may not be finished at any given point in time. * * From the perspective of dealing with error handling, deferred and promise APIs are to * asynchronous programming what `try`, `catch` and `throw` keywords are to synchronous programming. * * ```js * // for the purpose of this example let's assume that variables `$q` and `okToGreet` * // are available in the current lexical scope (they could have been injected or passed in). * * function asyncGreet(name) { * var deferred = $q.defer(); * * setTimeout(function() { * deferred.notify('About to greet ' + name + '.'); * * if (okToGreet(name)) { * deferred.resolve('Hello, ' + name + '!'); * } else { * deferred.reject('Greeting ' + name + ' is not allowed.'); * } * }, 1000); * * return deferred.promise; * } * * var promise = asyncGreet('Robin Hood'); * promise.then(function(greeting) { * alert('Success: ' + greeting); * }, function(reason) { * alert('Failed: ' + reason); * }, function(update) { * alert('Got notification: ' + update); * }); * ``` * * At first it might not be obvious why this extra complexity is worth the trouble. The payoff * comes in the way of guarantees that promise and deferred APIs make, see * https://github.com/kriskowal/uncommonjs/blob/master/promises/specification.md. * * Additionally the promise api allows for composition that is very hard to do with the * traditional callback ([CPS](http://en.wikipedia.org/wiki/Continuation-passing_style)) approach. * For more on this please see the [Q documentation](https://github.com/kriskowal/q) especially the * section on serial or parallel joining of promises. * * # The Deferred API * * A new instance of deferred is constructed by calling `$q.defer()`. * * The purpose of the deferred object is to expose the associated Promise instance as well as APIs * that can be used for signaling the successful or unsuccessful completion, as well as the status * of the task. * * **Methods** * * - `resolve(value)` – resolves the derived promise with the `value`. If the value is a rejection * constructed via `$q.reject`, the promise will be rejected instead. * - `reject(reason)` – rejects the derived promise with the `reason`. This is equivalent to * resolving it with a rejection constructed via `$q.reject`. * - `notify(value)` - provides updates on the status of the promise's execution. This may be called * multiple times before the promise is either resolved or rejected. * * **Properties** * * - promise – `{Promise}` – promise object associated with this deferred. * * * # The Promise API * * A new promise instance is created when a deferred instance is created and can be retrieved by * calling `deferred.promise`. * * The purpose of the promise object is to allow for interested parties to get access to the result * of the deferred task when it completes. * * **Methods** * * - `then(successCallback, errorCallback, notifyCallback)` – regardless of when the promise was or * will be resolved or rejected, `then` calls one of the success or error callbacks asynchronously * as soon as the result is available. The callbacks are called with a single argument: the result * or rejection reason. Additionally, the notify callback may be called zero or more times to * provide a progress indication, before the promise is resolved or rejected. * * This method *returns a new promise* which is resolved or rejected via the return value of the * `successCallback`, `errorCallback` (unless that value is a promise, in which case it is resolved * with the value which is resolved in that promise using * [promise chaining](http://www.html5rocks.com/en/tutorials/es6/promises/#toc-promises-queues)). * It also notifies via the return value of the `notifyCallback` method. The promise cannot be * resolved or rejected from the notifyCallback method. * * - `catch(errorCallback)` – shorthand for `promise.then(null, errorCallback)` * * - `finally(callback, notifyCallback)` – allows you to observe either the fulfillment or rejection of a promise, * but to do so without modifying the final value. This is useful to release resources or do some * clean-up that needs to be done whether the promise was rejected or resolved. See the [full * specification](https://github.com/kriskowal/q/wiki/API-Reference#promisefinallycallback) for * more information. * * # Chaining promises * * Because calling the `then` method of a promise returns a new derived promise, it is easily * possible to create a chain of promises: * * ```js * promiseB = promiseA.then(function(result) { * return result + 1; * }); * * // promiseB will be resolved immediately after promiseA is resolved and its value * // will be the result of promiseA incremented by 1 * ``` * * It is possible to create chains of any length and since a promise can be resolved with another * promise (which will defer its resolution further), it is possible to pause/defer resolution of * the promises at any point in the chain. This makes it possible to implement powerful APIs like * $http's response interceptors. * * * # Differences between Kris Kowal's Q and $q * * There are two main differences: * * - $q is integrated with the {@link ng.$rootScope.Scope} Scope model observation * mechanism in angular, which means faster propagation of resolution or rejection into your * models and avoiding unnecessary browser repaints, which would result in flickering UI. * - Q has many more features than $q, but that comes at a cost of bytes. $q is tiny, but contains * all the important functionality needed for common async tasks. * * # Testing * * ```js * it('should simulate promise', inject(function($q, $rootScope) { * var deferred = $q.defer(); * var promise = deferred.promise; * var resolvedValue; * * promise.then(function(value) { resolvedValue = value; }); * expect(resolvedValue).toBeUndefined(); * * // Simulate resolving of promise * deferred.resolve(123); * // Note that the 'then' function does not get called synchronously. * // This is because we want the promise API to always be async, whether or not * // it got called synchronously or asynchronously. * expect(resolvedValue).toBeUndefined(); * * // Propagate promise resolution to 'then' functions using $apply(). * $rootScope.$apply(); * expect(resolvedValue).toEqual(123); * })); * ``` * * @param {function(function, function)} resolver Function which is responsible for resolving or * rejecting the newly created promise. The first parameter is a function which resolves the * promise, the second parameter is a function which rejects the promise. * * @returns {Promise} The newly created promise. */ function $QProvider() { this.$get = ['$rootScope', '$exceptionHandler', function($rootScope, $exceptionHandler) { return qFactory(function(callback) { $rootScope.$evalAsync(callback); }, $exceptionHandler); }]; } function $$QProvider() { this.$get = ['$browser', '$exceptionHandler', function($browser, $exceptionHandler) { return qFactory(function(callback) { $browser.defer(callback); }, $exceptionHandler); }]; } /** * Constructs a promise manager. * * @param {function(function)} nextTick Function for executing functions in the next turn. * @param {function(...*)} exceptionHandler Function into which unexpected exceptions are passed for * debugging purposes. * @returns {object} Promise manager. */ function qFactory(nextTick, exceptionHandler) { var $qMinErr = minErr('$q', TypeError); /** * @ngdoc method * @name ng.$q#defer * @kind function * * @description * Creates a `Deferred` object which represents a task which will finish in the future. * * @returns {Deferred} Returns a new instance of deferred. */ var defer = function() { var d = new Deferred(); //Necessary to support unbound execution :/ d.resolve = simpleBind(d, d.resolve); d.reject = simpleBind(d, d.reject); d.notify = simpleBind(d, d.notify); return d; }; function Promise() { this.$$state = { status: 0 }; } extend(Promise.prototype, { then: function(onFulfilled, onRejected, progressBack) { if (isUndefined(onFulfilled) && isUndefined(onRejected) && isUndefined(progressBack)) { return this; } var result = new Deferred(); this.$$state.pending = this.$$state.pending || []; this.$$state.pending.push([result, onFulfilled, onRejected, progressBack]); if (this.$$state.status > 0) scheduleProcessQueue(this.$$state); return result.promise; }, "catch": function(callback) { return this.then(null, callback); }, "finally": function(callback, progressBack) { return this.then(function(value) { return handleCallback(value, true, callback); }, function(error) { return handleCallback(error, false, callback); }, progressBack); } }); //Faster, more basic than angular.bind http://jsperf.com/angular-bind-vs-custom-vs-native function simpleBind(context, fn) { return function(value) { fn.call(context, value); }; } function processQueue(state) { var fn, deferred, pending; pending = state.pending; state.processScheduled = false; state.pending = undefined; for (var i = 0, ii = pending.length; i < ii; ++i) { deferred = pending[i][0]; fn = pending[i][state.status]; try { if (isFunction(fn)) { deferred.resolve(fn(state.value)); } else if (state.status === 1) { deferred.resolve(state.value); } else { deferred.reject(state.value); } } catch (e) { deferred.reject(e); exceptionHandler(e); } } } function scheduleProcessQueue(state) { if (state.processScheduled || !state.pending) return; state.processScheduled = true; nextTick(function() { processQueue(state); }); } function Deferred() { this.promise = new Promise(); } extend(Deferred.prototype, { resolve: function(val) { if (this.promise.$$state.status) return; if (val === this.promise) { this.$$reject($qMinErr( 'qcycle', "Expected promise to be resolved with value other than itself '{0}'", val)); } else { this.$$resolve(val); } }, $$resolve: function(val) { var then; var that = this; var done = false; try { if ((isObject(val) || isFunction(val))) then = val && val.then; if (isFunction(then)) { this.promise.$$state.status = -1; then.call(val, resolvePromise, rejectPromise, simpleBind(this, this.notify)); } else { this.promise.$$state.value = val; this.promise.$$state.status = 1; scheduleProcessQueue(this.promise.$$state); } } catch (e) { rejectPromise(e); exceptionHandler(e); } function resolvePromise(val) { if (done) return; done = true; that.$$resolve(val); } function rejectPromise(val) { if (done) return; done = true; that.$$reject(val); } }, reject: function(reason) { if (this.promise.$$state.status) return; this.$$reject(reason); }, $$reject: function(reason) { this.promise.$$state.value = reason; this.promise.$$state.status = 2; scheduleProcessQueue(this.promise.$$state); }, notify: function(progress) { var callbacks = this.promise.$$state.pending; if ((this.promise.$$state.status <= 0) && callbacks && callbacks.length) { nextTick(function() { var callback, result; for (var i = 0, ii = callbacks.length; i < ii; i++) { result = callbacks[i][0]; callback = callbacks[i][3]; try { result.notify(isFunction(callback) ? callback(progress) : progress); } catch (e) { exceptionHandler(e); } } }); } } }); /** * @ngdoc method * @name $q#reject * @kind function * * @description * Creates a promise that is resolved as rejected with the specified `reason`. This api should be * used to forward rejection in a chain of promises. If you are dealing with the last promise in * a promise chain, you don't need to worry about it. * * When comparing deferreds/promises to the familiar behavior of try/catch/throw, think of * `reject` as the `throw` keyword in JavaScript. This also means that if you "catch" an error via * a promise error callback and you want to forward the error to the promise derived from the * current promise, you have to "rethrow" the error by returning a rejection constructed via * `reject`. * * ```js * promiseB = promiseA.then(function(result) { * // success: do something and resolve promiseB * // with the old or a new result * return result; * }, function(reason) { * // error: handle the error if possible and * // resolve promiseB with newPromiseOrValue, * // otherwise forward the rejection to promiseB * if (canHandle(reason)) { * // handle the error and recover * return newPromiseOrValue; * } * return $q.reject(reason); * }); * ``` * * @param {*} reason Constant, message, exception or an object representing the rejection reason. * @returns {Promise} Returns a promise that was already resolved as rejected with the `reason`. */ var reject = function(reason) { var result = new Deferred(); result.reject(reason); return result.promise; }; var makePromise = function makePromise(value, resolved) { var result = new Deferred(); if (resolved) { result.resolve(value); } else { result.reject(value); } return result.promise; }; var handleCallback = function handleCallback(value, isResolved, callback) { var callbackOutput = null; try { if (isFunction(callback)) callbackOutput = callback(); } catch (e) { return makePromise(e, false); } if (isPromiseLike(callbackOutput)) { return callbackOutput.then(function() { return makePromise(value, isResolved); }, function(error) { return makePromise(error, false); }); } else { return makePromise(value, isResolved); } }; /** * @ngdoc method * @name $q#when * @kind function * * @description * Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise. * This is useful when you are dealing with an object that might or might not be a promise, or if * the promise comes from a source that can't be trusted. * * @param {*} value Value or a promise * @param {Function=} successCallback * @param {Function=} errorCallback * @param {Function=} progressCallback * @returns {Promise} Returns a promise of the passed value or promise */ var when = function(value, callback, errback, progressBack) { var result = new Deferred(); result.resolve(value); return result.promise.then(callback, errback, progressBack); }; /** * @ngdoc method * @name $q#resolve * @kind function * * @description * Alias of {@link ng.$q#when when} to maintain naming consistency with ES6. * * @param {*} value Value or a promise * @param {Function=} successCallback * @param {Function=} errorCallback * @param {Function=} progressCallback * @returns {Promise} Returns a promise of the passed value or promise */ var resolve = when; /** * @ngdoc method * @name $q#all * @kind function * * @description * Combines multiple promises into a single promise that is resolved when all of the input * promises are resolved. * * @param {Array.|Object.} promises An array or hash of promises. * @returns {Promise} Returns a single promise that will be resolved with an array/hash of values, * each value corresponding to the promise at the same index/key in the `promises` array/hash. * If any of the promises is resolved with a rejection, this resulting promise will be rejected * with the same rejection value. */ function all(promises) { var deferred = new Deferred(), counter = 0, results = isArray(promises) ? [] : {}; forEach(promises, function(promise, key) { counter++; when(promise).then(function(value) { if (results.hasOwnProperty(key)) return; results[key] = value; if (!(--counter)) deferred.resolve(results); }, function(reason) { if (results.hasOwnProperty(key)) return; deferred.reject(reason); }); }); if (counter === 0) { deferred.resolve(results); } return deferred.promise; } var $Q = function Q(resolver) { if (!isFunction(resolver)) { throw $qMinErr('norslvr', "Expected resolverFn, got '{0}'", resolver); } var deferred = new Deferred(); function resolveFn(value) { deferred.resolve(value); } function rejectFn(reason) { deferred.reject(reason); } resolver(resolveFn, rejectFn); return deferred.promise; }; // Let's make the instanceof operator work for promises, so that // `new $q(fn) instanceof $q` would evaluate to true. $Q.prototype = Promise.prototype; $Q.defer = defer; $Q.reject = reject; $Q.when = when; $Q.resolve = resolve; $Q.all = all; return $Q; } function $$RAFProvider() { //rAF this.$get = ['$window', '$timeout', function($window, $timeout) { var requestAnimationFrame = $window.requestAnimationFrame || $window.webkitRequestAnimationFrame; var cancelAnimationFrame = $window.cancelAnimationFrame || $window.webkitCancelAnimationFrame || $window.webkitCancelRequestAnimationFrame; var rafSupported = !!requestAnimationFrame; var raf = rafSupported ? function(fn) { var id = requestAnimationFrame(fn); return function() { cancelAnimationFrame(id); }; } : function(fn) { var timer = $timeout(fn, 16.66, false); // 1000 / 60 = 16.666 return function() { $timeout.cancel(timer); }; }; raf.supported = rafSupported; return raf; }]; } /** * DESIGN NOTES * * The design decisions behind the scope are heavily favored for speed and memory consumption. * * The typical use of scope is to watch the expressions, which most of the time return the same * value as last time so we optimize the operation. * * Closures construction is expensive in terms of speed as well as memory: * - No closures, instead use prototypical inheritance for API * - Internal state needs to be stored on scope directly, which means that private state is * exposed as $$____ properties * * Loop operations are optimized by using while(count--) { ... } * - This means that in order to keep the same order of execution as addition we have to add * items to the array at the beginning (unshift) instead of at the end (push) * * Child scopes are created and removed often * - Using an array would be slow since inserts in the middle are expensive; so we use linked lists * * There are fewer watches than observers. This is why you don't want the observer to be implemented * in the same way as watch. Watch requires return of the initialization function which is expensive * to construct. */ /** * @ngdoc provider * @name $rootScopeProvider * @description * * Provider for the $rootScope service. */ /** * @ngdoc method * @name $rootScopeProvider#digestTtl * @description * * Sets the number of `$digest` iterations the scope should attempt to execute before giving up and * assuming that the model is unstable. * * The current default is 10 iterations. * * In complex applications it's possible that the dependencies between `$watch`s will result in * several digest iterations. However if an application needs more than the default 10 digest * iterations for its model to stabilize then you should investigate what is causing the model to * continuously change during the digest. * * Increasing the TTL could have performance implications, so you should not change it without * proper justification. * * @param {number} limit The number of digest iterations. */ /** * @ngdoc service * @name $rootScope * @description * * Every application has a single root {@link ng.$rootScope.Scope scope}. * All other scopes are descendant scopes of the root scope. Scopes provide separation * between the model and the view, via a mechanism for watching the model for changes. * They also provide event emission/broadcast and subscription facility. See the * {@link guide/scope developer guide on scopes}. */ function $RootScopeProvider() { var TTL = 10; var $rootScopeMinErr = minErr('$rootScope'); var lastDirtyWatch = null; var applyAsyncId = null; this.digestTtl = function(value) { if (arguments.length) { TTL = value; } return TTL; }; function createChildScopeClass(parent) { function ChildScope() { this.$$watchers = this.$$nextSibling = this.$$childHead = this.$$childTail = null; this.$$listeners = {}; this.$$listenerCount = {}; this.$$watchersCount = 0; this.$id = nextUid(); this.$$ChildScope = null; } ChildScope.prototype = parent; return ChildScope; } this.$get = ['$exceptionHandler', '$parse', '$browser', function($exceptionHandler, $parse, $browser) { function destroyChildScope($event) { $event.currentScope.$$destroyed = true; } function cleanUpScope($scope) { if (msie === 9) { // There is a memory leak in IE9 if all child scopes are not disconnected // completely when a scope is destroyed. So this code will recurse up through // all this scopes children // // See issue https://github.com/angular/angular.js/issues/10706 $scope.$$childHead && cleanUpScope($scope.$$childHead); $scope.$$nextSibling && cleanUpScope($scope.$$nextSibling); } // The code below works around IE9 and V8's memory leaks // // See: // - https://code.google.com/p/v8/issues/detail?id=2073#c26 // - https://github.com/angular/angular.js/issues/6794#issuecomment-38648909 // - https://github.com/angular/angular.js/issues/1313#issuecomment-10378451 $scope.$parent = $scope.$$nextSibling = $scope.$$prevSibling = $scope.$$childHead = $scope.$$childTail = $scope.$root = $scope.$$watchers = null; } /** * @ngdoc type * @name $rootScope.Scope * * @description * A root scope can be retrieved using the {@link ng.$rootScope $rootScope} key from the * {@link auto.$injector $injector}. Child scopes are created using the * {@link ng.$rootScope.Scope#$new $new()} method. (Most scopes are created automatically when * compiled HTML template is executed.) See also the {@link guide/scope Scopes guide} for * an in-depth introduction and usage examples. * * * # Inheritance * A scope can inherit from a parent scope, as in this example: * ```js var parent = $rootScope; var child = parent.$new(); parent.salutation = "Hello"; expect(child.salutation).toEqual('Hello'); child.salutation = "Welcome"; expect(child.salutation).toEqual('Welcome'); expect(parent.salutation).toEqual('Hello'); * ``` * * When interacting with `Scope` in tests, additional helper methods are available on the * instances of `Scope` type. See {@link ngMock.$rootScope.Scope ngMock Scope} for additional * details. * * * @param {Object.=} providers Map of service factory which need to be * provided for the current scope. Defaults to {@link ng}. * @param {Object.=} instanceCache Provides pre-instantiated services which should * append/override services provided by `providers`. This is handy * when unit-testing and having the need to override a default * service. * @returns {Object} Newly created scope. * */ function Scope() { this.$id = nextUid(); this.$$phase = this.$parent = this.$$watchers = this.$$nextSibling = this.$$prevSibling = this.$$childHead = this.$$childTail = null; this.$root = this; this.$$destroyed = false; this.$$listeners = {}; this.$$listenerCount = {}; this.$$watchersCount = 0; this.$$isolateBindings = null; } /** * @ngdoc property * @name $rootScope.Scope#$id * * @description * Unique scope ID (monotonically increasing) useful for debugging. */ /** * @ngdoc property * @name $rootScope.Scope#$parent * * @description * Reference to the parent scope. */ /** * @ngdoc property * @name $rootScope.Scope#$root * * @description * Reference to the root scope. */ Scope.prototype = { constructor: Scope, /** * @ngdoc method * @name $rootScope.Scope#$new * @kind function * * @description * Creates a new child {@link ng.$rootScope.Scope scope}. * * The parent scope will propagate the {@link ng.$rootScope.Scope#$digest $digest()} event. * The scope can be removed from the scope hierarchy using {@link ng.$rootScope.Scope#$destroy $destroy()}. * * {@link ng.$rootScope.Scope#$destroy $destroy()} must be called on a scope when it is * desired for the scope and its child scopes to be permanently detached from the parent and * thus stop participating in model change detection and listener notification by invoking. * * @param {boolean} isolate If true, then the scope does not prototypically inherit from the * parent scope. The scope is isolated, as it can not see parent scope properties. * When creating widgets, it is useful for the widget to not accidentally read parent * state. * * @param {Scope} [parent=this] The {@link ng.$rootScope.Scope `Scope`} that will be the `$parent` * of the newly created scope. Defaults to `this` scope if not provided. * This is used when creating a transclude scope to correctly place it * in the scope hierarchy while maintaining the correct prototypical * inheritance. * * @returns {Object} The newly created child scope. * */ $new: function(isolate, parent) { var child; parent = parent || this; if (isolate) { child = new Scope(); child.$root = this.$root; } else { // Only create a child scope class if somebody asks for one, // but cache it to allow the VM to optimize lookups. if (!this.$$ChildScope) { this.$$ChildScope = createChildScopeClass(this); } child = new this.$$ChildScope(); } child.$parent = parent; child.$$prevSibling = parent.$$childTail; if (parent.$$childHead) { parent.$$childTail.$$nextSibling = child; parent.$$childTail = child; } else { parent.$$childHead = parent.$$childTail = child; } // When the new scope is not isolated or we inherit from `this`, and // the parent scope is destroyed, the property `$$destroyed` is inherited // prototypically. In all other cases, this property needs to be set // when the parent scope is destroyed. // The listener needs to be added after the parent is set if (isolate || parent != this) child.$on('$destroy', destroyChildScope); return child; }, /** * @ngdoc method * @name $rootScope.Scope#$watch * @kind function * * @description * Registers a `listener` callback to be executed whenever the `watchExpression` changes. * * - The `watchExpression` is called on every call to {@link ng.$rootScope.Scope#$digest * $digest()} and should return the value that will be watched. (`watchExpression` should not change * its value when executed multiple times with the same input because it may be executed multiple * times by {@link ng.$rootScope.Scope#$digest $digest()}. That is, `watchExpression` should be * [idempotent](http://en.wikipedia.org/wiki/Idempotence). * - The `listener` is called only when the value from the current `watchExpression` and the * previous call to `watchExpression` are not equal (with the exception of the initial run, * see below). Inequality is determined according to reference inequality, * [strict comparison](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators) * via the `!==` Javascript operator, unless `objectEquality == true` * (see next point) * - When `objectEquality == true`, inequality of the `watchExpression` is determined * according to the {@link angular.equals} function. To save the value of the object for * later comparison, the {@link angular.copy} function is used. This therefore means that * watching complex objects will have adverse memory and performance implications. * - The watch `listener` may change the model, which may trigger other `listener`s to fire. * This is achieved by rerunning the watchers until no changes are detected. The rerun * iteration limit is 10 to prevent an infinite loop deadlock. * * * If you want to be notified whenever {@link ng.$rootScope.Scope#$digest $digest} is called, * you can register a `watchExpression` function with no `listener`. (Be prepared for * multiple calls to your `watchExpression` because it will execute multiple times in a * single {@link ng.$rootScope.Scope#$digest $digest} cycle if a change is detected.) * * After a watcher is registered with the scope, the `listener` fn is called asynchronously * (via {@link ng.$rootScope.Scope#$evalAsync $evalAsync}) to initialize the * watcher. In rare cases, this is undesirable because the listener is called when the result * of `watchExpression` didn't change. To detect this scenario within the `listener` fn, you * can compare the `newVal` and `oldVal`. If these two values are identical (`===`) then the * listener was called due to initialization. * * * * # Example * ```js // let's assume that scope was dependency injected as the $rootScope var scope = $rootScope; scope.name = 'misko'; scope.counter = 0; expect(scope.counter).toEqual(0); scope.$watch('name', function(newValue, oldValue) { scope.counter = scope.counter + 1; }); expect(scope.counter).toEqual(0); scope.$digest(); // the listener is always called during the first $digest loop after it was registered expect(scope.counter).toEqual(1); scope.$digest(); // but now it will not be called unless the value changes expect(scope.counter).toEqual(1); scope.name = 'adam'; scope.$digest(); expect(scope.counter).toEqual(2); // Using a function as a watchExpression var food; scope.foodCounter = 0; expect(scope.foodCounter).toEqual(0); scope.$watch( // This function returns the value being watched. It is called for each turn of the $digest loop function() { return food; }, // This is the change listener, called when the value returned from the above function changes function(newValue, oldValue) { if ( newValue !== oldValue ) { // Only increment the counter if the value changed scope.foodCounter = scope.foodCounter + 1; } } ); // No digest has been run so the counter will be zero expect(scope.foodCounter).toEqual(0); // Run the digest but since food has not changed count will still be zero scope.$digest(); expect(scope.foodCounter).toEqual(0); // Update food and run digest. Now the counter will increment food = 'cheeseburger'; scope.$digest(); expect(scope.foodCounter).toEqual(1); * ``` * * * * @param {(function()|string)} watchExpression Expression that is evaluated on each * {@link ng.$rootScope.Scope#$digest $digest} cycle. A change in the return value triggers * a call to the `listener`. * * - `string`: Evaluated as {@link guide/expression expression} * - `function(scope)`: called with current `scope` as a parameter. * @param {function(newVal, oldVal, scope)} listener Callback called whenever the value * of `watchExpression` changes. * * - `newVal` contains the current value of the `watchExpression` * - `oldVal` contains the previous value of the `watchExpression` * - `scope` refers to the current scope * @param {boolean=} [objectEquality=false] Compare for object equality using {@link angular.equals} instead of * comparing for reference equality. * @returns {function()} Returns a deregistration function for this listener. */ $watch: function(watchExp, listener, objectEquality, prettyPrintExpression) { var get = $parse(watchExp); if (get.$$watchDelegate) { return get.$$watchDelegate(this, listener, objectEquality, get, watchExp); } var scope = this, array = scope.$$watchers, watcher = { fn: listener, last: initWatchVal, get: get, exp: prettyPrintExpression || watchExp, eq: !!objectEquality }; lastDirtyWatch = null; if (!isFunction(listener)) { watcher.fn = noop; } if (!array) { array = scope.$$watchers = []; } // we use unshift since we use a while loop in $digest for speed. // the while loop reads in reverse order. array.unshift(watcher); incrementWatchersCount(this, 1); return function deregisterWatch() { if (arrayRemove(array, watcher) >= 0) { incrementWatchersCount(scope, -1); } lastDirtyWatch = null; }; }, /** * @ngdoc method * @name $rootScope.Scope#$watchGroup * @kind function * * @description * A variant of {@link ng.$rootScope.Scope#$watch $watch()} where it watches an array of `watchExpressions`. * If any one expression in the collection changes the `listener` is executed. * * - The items in the `watchExpressions` array are observed via standard $watch operation and are examined on every * call to $digest() to see if any items changes. * - The `listener` is called whenever any expression in the `watchExpressions` array changes. * * @param {Array.} watchExpressions Array of expressions that will be individually * watched using {@link ng.$rootScope.Scope#$watch $watch()} * * @param {function(newValues, oldValues, scope)} listener Callback called whenever the return value of any * expression in `watchExpressions` changes * The `newValues` array contains the current values of the `watchExpressions`, with the indexes matching * those of `watchExpression` * and the `oldValues` array contains the previous values of the `watchExpressions`, with the indexes matching * those of `watchExpression` * The `scope` refers to the current scope. * @returns {function()} Returns a de-registration function for all listeners. */ $watchGroup: function(watchExpressions, listener) { var oldValues = new Array(watchExpressions.length); var newValues = new Array(watchExpressions.length); var deregisterFns = []; var self = this; var changeReactionScheduled = false; var firstRun = true; if (!watchExpressions.length) { // No expressions means we call the listener ASAP var shouldCall = true; self.$evalAsync(function() { if (shouldCall) listener(newValues, newValues, self); }); return function deregisterWatchGroup() { shouldCall = false; }; } if (watchExpressions.length === 1) { // Special case size of one return this.$watch(watchExpressions[0], function watchGroupAction(value, oldValue, scope) { newValues[0] = value; oldValues[0] = oldValue; listener(newValues, (value === oldValue) ? newValues : oldValues, scope); }); } forEach(watchExpressions, function(expr, i) { var unwatchFn = self.$watch(expr, function watchGroupSubAction(value, oldValue) { newValues[i] = value; oldValues[i] = oldValue; if (!changeReactionScheduled) { changeReactionScheduled = true; self.$evalAsync(watchGroupAction); } }); deregisterFns.push(unwatchFn); }); function watchGroupAction() { changeReactionScheduled = false; if (firstRun) { firstRun = false; listener(newValues, newValues, self); } else { listener(newValues, oldValues, self); } } return function deregisterWatchGroup() { while (deregisterFns.length) { deregisterFns.shift()(); } }; }, /** * @ngdoc method * @name $rootScope.Scope#$watchCollection * @kind function * * @description * Shallow watches the properties of an object and fires whenever any of the properties change * (for arrays, this implies watching the array items; for object maps, this implies watching * the properties). If a change is detected, the `listener` callback is fired. * * - The `obj` collection is observed via standard $watch operation and is examined on every * call to $digest() to see if any items have been added, removed, or moved. * - The `listener` is called whenever anything within the `obj` has changed. Examples include * adding, removing, and moving items belonging to an object or array. * * * # Example * ```js $scope.names = ['igor', 'matias', 'misko', 'james']; $scope.dataCount = 4; $scope.$watchCollection('names', function(newNames, oldNames) { $scope.dataCount = newNames.length; }); expect($scope.dataCount).toEqual(4); $scope.$digest(); //still at 4 ... no changes expect($scope.dataCount).toEqual(4); $scope.names.pop(); $scope.$digest(); //now there's been a change expect($scope.dataCount).toEqual(3); * ``` * * * @param {string|function(scope)} obj Evaluated as {@link guide/expression expression}. The * expression value should evaluate to an object or an array which is observed on each * {@link ng.$rootScope.Scope#$digest $digest} cycle. Any shallow change within the * collection will trigger a call to the `listener`. * * @param {function(newCollection, oldCollection, scope)} listener a callback function called * when a change is detected. * - The `newCollection` object is the newly modified data obtained from the `obj` expression * - The `oldCollection` object is a copy of the former collection data. * Due to performance considerations, the`oldCollection` value is computed only if the * `listener` function declares two or more arguments. * - The `scope` argument refers to the current scope. * * @returns {function()} Returns a de-registration function for this listener. When the * de-registration function is executed, the internal watch operation is terminated. */ $watchCollection: function(obj, listener) { $watchCollectionInterceptor.$stateful = true; var self = this; // the current value, updated on each dirty-check run var newValue; // a shallow copy of the newValue from the last dirty-check run, // updated to match newValue during dirty-check run var oldValue; // a shallow copy of the newValue from when the last change happened var veryOldValue; // only track veryOldValue if the listener is asking for it var trackVeryOldValue = (listener.length > 1); var changeDetected = 0; var changeDetector = $parse(obj, $watchCollectionInterceptor); var internalArray = []; var internalObject = {}; var initRun = true; var oldLength = 0; function $watchCollectionInterceptor(_value) { newValue = _value; var newLength, key, bothNaN, newItem, oldItem; // If the new value is undefined, then return undefined as the watch may be a one-time watch if (isUndefined(newValue)) return; if (!isObject(newValue)) { // if primitive if (oldValue !== newValue) { oldValue = newValue; changeDetected++; } } else if (isArrayLike(newValue)) { if (oldValue !== internalArray) { // we are transitioning from something which was not an array into array. oldValue = internalArray; oldLength = oldValue.length = 0; changeDetected++; } newLength = newValue.length; if (oldLength !== newLength) { // if lengths do not match we need to trigger change notification changeDetected++; oldValue.length = oldLength = newLength; } // copy the items to oldValue and look for changes. for (var i = 0; i < newLength; i++) { oldItem = oldValue[i]; newItem = newValue[i]; bothNaN = (oldItem !== oldItem) && (newItem !== newItem); if (!bothNaN && (oldItem !== newItem)) { changeDetected++; oldValue[i] = newItem; } } } else { if (oldValue !== internalObject) { // we are transitioning from something which was not an object into object. oldValue = internalObject = {}; oldLength = 0; changeDetected++; } // copy the items to oldValue and look for changes. newLength = 0; for (key in newValue) { if (hasOwnProperty.call(newValue, key)) { newLength++; newItem = newValue[key]; oldItem = oldValue[key]; if (key in oldValue) { bothNaN = (oldItem !== oldItem) && (newItem !== newItem); if (!bothNaN && (oldItem !== newItem)) { changeDetected++; oldValue[key] = newItem; } } else { oldLength++; oldValue[key] = newItem; changeDetected++; } } } if (oldLength > newLength) { // we used to have more keys, need to find them and destroy them. changeDetected++; for (key in oldValue) { if (!hasOwnProperty.call(newValue, key)) { oldLength--; delete oldValue[key]; } } } } return changeDetected; } function $watchCollectionAction() { if (initRun) { initRun = false; listener(newValue, newValue, self); } else { listener(newValue, veryOldValue, self); } // make a copy for the next time a collection is changed if (trackVeryOldValue) { if (!isObject(newValue)) { //primitive veryOldValue = newValue; } else if (isArrayLike(newValue)) { veryOldValue = new Array(newValue.length); for (var i = 0; i < newValue.length; i++) { veryOldValue[i] = newValue[i]; } } else { // if object veryOldValue = {}; for (var key in newValue) { if (hasOwnProperty.call(newValue, key)) { veryOldValue[key] = newValue[key]; } } } } } return this.$watch(changeDetector, $watchCollectionAction); }, /** * @ngdoc method * @name $rootScope.Scope#$digest * @kind function * * @description * Processes all of the {@link ng.$rootScope.Scope#$watch watchers} of the current scope and * its children. Because a {@link ng.$rootScope.Scope#$watch watcher}'s listener can change * the model, the `$digest()` keeps calling the {@link ng.$rootScope.Scope#$watch watchers} * until no more listeners are firing. This means that it is possible to get into an infinite * loop. This function will throw `'Maximum iteration limit exceeded.'` if the number of * iterations exceeds 10. * * Usually, you don't call `$digest()` directly in * {@link ng.directive:ngController controllers} or in * {@link ng.$compileProvider#directive directives}. * Instead, you should call {@link ng.$rootScope.Scope#$apply $apply()} (typically from within * a {@link ng.$compileProvider#directive directive}), which will force a `$digest()`. * * If you want to be notified whenever `$digest()` is called, * you can register a `watchExpression` function with * {@link ng.$rootScope.Scope#$watch $watch()} with no `listener`. * * In unit tests, you may need to call `$digest()` to simulate the scope life cycle. * * # Example * ```js var scope = ...; scope.name = 'misko'; scope.counter = 0; expect(scope.counter).toEqual(0); scope.$watch('name', function(newValue, oldValue) { scope.counter = scope.counter + 1; }); expect(scope.counter).toEqual(0); scope.$digest(); // the listener is always called during the first $digest loop after it was registered expect(scope.counter).toEqual(1); scope.$digest(); // but now it will not be called unless the value changes expect(scope.counter).toEqual(1); scope.name = 'adam'; scope.$digest(); expect(scope.counter).toEqual(2); * ``` * */ $digest: function() { var watch, value, last, fn, get, watchers, length, dirty, ttl = TTL, next, current, target = this, watchLog = [], logIdx, asyncTask; beginPhase('$digest'); // Check for changes to browser url that happened in sync before the call to $digest $browser.$$checkUrlChange(); if (this === $rootScope && applyAsyncId !== null) { // If this is the root scope, and $applyAsync has scheduled a deferred $apply(), then // cancel the scheduled $apply and flush the queue of expressions to be evaluated. $browser.defer.cancel(applyAsyncId); flushApplyAsync(); } lastDirtyWatch = null; do { // "while dirty" loop dirty = false; current = target; // It's safe for asyncQueuePosition to be a local variable here because this loop can't // be reentered recursively. Calling $digest from a function passed to $applyAsync would // lead to a '$digest already in progress' error. for (var asyncQueuePosition = 0; asyncQueuePosition < asyncQueue.length; asyncQueuePosition++) { try { asyncTask = asyncQueue[asyncQueuePosition]; asyncTask.scope.$eval(asyncTask.expression, asyncTask.locals); } catch (e) { $exceptionHandler(e); } lastDirtyWatch = null; } asyncQueue.length = 0; traverseScopesLoop: do { // "traverse the scopes" loop if ((watchers = current.$$watchers)) { // process our watches length = watchers.length; while (length--) { try { watch = watchers[length]; // Most common watches are on primitives, in which case we can short // circuit it with === operator, only when === fails do we use .equals if (watch) { get = watch.get; if ((value = get(current)) !== (last = watch.last) && !(watch.eq ? equals(value, last) : (typeof value === 'number' && typeof last === 'number' && isNaN(value) && isNaN(last)))) { dirty = true; lastDirtyWatch = watch; watch.last = watch.eq ? copy(value, null) : value; fn = watch.fn; fn(value, ((last === initWatchVal) ? value : last), current); if (ttl < 5) { logIdx = 4 - ttl; if (!watchLog[logIdx]) watchLog[logIdx] = []; watchLog[logIdx].push({ msg: isFunction(watch.exp) ? 'fn: ' + (watch.exp.name || watch.exp.toString()) : watch.exp, newVal: value, oldVal: last }); } } else if (watch === lastDirtyWatch) { // If the most recently dirty watcher is now clean, short circuit since the remaining watchers // have already been tested. dirty = false; break traverseScopesLoop; } } } catch (e) { $exceptionHandler(e); } } } // Insanity Warning: scope depth-first traversal // yes, this code is a bit crazy, but it works and we have tests to prove it! // this piece should be kept in sync with the traversal in $broadcast if (!(next = ((current.$$watchersCount && current.$$childHead) || (current !== target && current.$$nextSibling)))) { while (current !== target && !(next = current.$$nextSibling)) { current = current.$parent; } } } while ((current = next)); // `break traverseScopesLoop;` takes us to here if ((dirty || asyncQueue.length) && !(ttl--)) { clearPhase(); throw $rootScopeMinErr('infdig', '{0} $digest() iterations reached. Aborting!\n' + 'Watchers fired in the last 5 iterations: {1}', TTL, watchLog); } } while (dirty || asyncQueue.length); clearPhase(); // postDigestQueuePosition isn't local here because this loop can be reentered recursively. while (postDigestQueuePosition < postDigestQueue.length) { try { postDigestQueue[postDigestQueuePosition++](); } catch (e) { $exceptionHandler(e); } } postDigestQueue.length = postDigestQueuePosition = 0; }, /** * @ngdoc event * @name $rootScope.Scope#$destroy * @eventType broadcast on scope being destroyed * * @description * Broadcasted when a scope and its children are being destroyed. * * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to * clean up DOM bindings before an element is removed from the DOM. */ /** * @ngdoc method * @name $rootScope.Scope#$destroy * @kind function * * @description * Removes the current scope (and all of its children) from the parent scope. Removal implies * that calls to {@link ng.$rootScope.Scope#$digest $digest()} will no longer * propagate to the current scope and its children. Removal also implies that the current * scope is eligible for garbage collection. * * The `$destroy()` is usually used by directives such as * {@link ng.directive:ngRepeat ngRepeat} for managing the * unrolling of the loop. * * Just before a scope is destroyed, a `$destroy` event is broadcasted on this scope. * Application code can register a `$destroy` event handler that will give it a chance to * perform any necessary cleanup. * * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to * clean up DOM bindings before an element is removed from the DOM. */ $destroy: function() { // We can't destroy a scope that has been already destroyed. if (this.$$destroyed) return; var parent = this.$parent; this.$broadcast('$destroy'); this.$$destroyed = true; if (this === $rootScope) { //Remove handlers attached to window when $rootScope is removed $browser.$$applicationDestroyed(); } incrementWatchersCount(this, -this.$$watchersCount); for (var eventName in this.$$listenerCount) { decrementListenerCount(this, this.$$listenerCount[eventName], eventName); } // sever all the references to parent scopes (after this cleanup, the current scope should // not be retained by any of our references and should be eligible for garbage collection) if (parent && parent.$$childHead == this) parent.$$childHead = this.$$nextSibling; if (parent && parent.$$childTail == this) parent.$$childTail = this.$$prevSibling; if (this.$$prevSibling) this.$$prevSibling.$$nextSibling = this.$$nextSibling; if (this.$$nextSibling) this.$$nextSibling.$$prevSibling = this.$$prevSibling; // Disable listeners, watchers and apply/digest methods this.$destroy = this.$digest = this.$apply = this.$evalAsync = this.$applyAsync = noop; this.$on = this.$watch = this.$watchGroup = function() { return noop; }; this.$$listeners = {}; // Disconnect the next sibling to prevent `cleanUpScope` destroying those too this.$$nextSibling = null; cleanUpScope(this); }, /** * @ngdoc method * @name $rootScope.Scope#$eval * @kind function * * @description * Executes the `expression` on the current scope and returns the result. Any exceptions in * the expression are propagated (uncaught). This is useful when evaluating Angular * expressions. * * # Example * ```js var scope = ng.$rootScope.Scope(); scope.a = 1; scope.b = 2; expect(scope.$eval('a+b')).toEqual(3); expect(scope.$eval(function(scope){ return scope.a + scope.b; })).toEqual(3); * ``` * * @param {(string|function())=} expression An angular expression to be executed. * * - `string`: execute using the rules as defined in {@link guide/expression expression}. * - `function(scope)`: execute the function with the current `scope` parameter. * * @param {(object)=} locals Local variables object, useful for overriding values in scope. * @returns {*} The result of evaluating the expression. */ $eval: function(expr, locals) { return $parse(expr)(this, locals); }, /** * @ngdoc method * @name $rootScope.Scope#$evalAsync * @kind function * * @description * Executes the expression on the current scope at a later point in time. * * The `$evalAsync` makes no guarantees as to when the `expression` will be executed, only * that: * * - it will execute after the function that scheduled the evaluation (preferably before DOM * rendering). * - at least one {@link ng.$rootScope.Scope#$digest $digest cycle} will be performed after * `expression` execution. * * Any exceptions from the execution of the expression are forwarded to the * {@link ng.$exceptionHandler $exceptionHandler} service. * * __Note:__ if this function is called outside of a `$digest` cycle, a new `$digest` cycle * will be scheduled. However, it is encouraged to always call code that changes the model * from within an `$apply` call. That includes code evaluated via `$evalAsync`. * * @param {(string|function())=} expression An angular expression to be executed. * * - `string`: execute using the rules as defined in {@link guide/expression expression}. * - `function(scope)`: execute the function with the current `scope` parameter. * * @param {(object)=} locals Local variables object, useful for overriding values in scope. */ $evalAsync: function(expr, locals) { // if we are outside of an $digest loop and this is the first time we are scheduling async // task also schedule async auto-flush if (!$rootScope.$$phase && !asyncQueue.length) { $browser.defer(function() { if (asyncQueue.length) { $rootScope.$digest(); } }); } asyncQueue.push({scope: this, expression: $parse(expr), locals: locals}); }, $$postDigest: function(fn) { postDigestQueue.push(fn); }, /** * @ngdoc method * @name $rootScope.Scope#$apply * @kind function * * @description * `$apply()` is used to execute an expression in angular from outside of the angular * framework. (For example from browser DOM events, setTimeout, XHR or third party libraries). * Because we are calling into the angular framework we need to perform proper scope life * cycle of {@link ng.$exceptionHandler exception handling}, * {@link ng.$rootScope.Scope#$digest executing watches}. * * ## Life cycle * * # Pseudo-Code of `$apply()` * ```js function $apply(expr) { try { return $eval(expr); } catch (e) { $exceptionHandler(e); } finally { $root.$digest(); } } * ``` * * * Scope's `$apply()` method transitions through the following stages: * * 1. The {@link guide/expression expression} is executed using the * {@link ng.$rootScope.Scope#$eval $eval()} method. * 2. Any exceptions from the execution of the expression are forwarded to the * {@link ng.$exceptionHandler $exceptionHandler} service. * 3. The {@link ng.$rootScope.Scope#$watch watch} listeners are fired immediately after the * expression was executed using the {@link ng.$rootScope.Scope#$digest $digest()} method. * * * @param {(string|function())=} exp An angular expression to be executed. * * - `string`: execute using the rules as defined in {@link guide/expression expression}. * - `function(scope)`: execute the function with current `scope` parameter. * * @returns {*} The result of evaluating the expression. */ $apply: function(expr) { try { beginPhase('$apply'); try { return this.$eval(expr); } finally { clearPhase(); } } catch (e) { $exceptionHandler(e); } finally { try { $rootScope.$digest(); } catch (e) { $exceptionHandler(e); throw e; } } }, /** * @ngdoc method * @name $rootScope.Scope#$applyAsync * @kind function * * @description * Schedule the invocation of $apply to occur at a later time. The actual time difference * varies across browsers, but is typically around ~10 milliseconds. * * This can be used to queue up multiple expressions which need to be evaluated in the same * digest. * * @param {(string|function())=} exp An angular expression to be executed. * * - `string`: execute using the rules as defined in {@link guide/expression expression}. * - `function(scope)`: execute the function with current `scope` parameter. */ $applyAsync: function(expr) { var scope = this; expr && applyAsyncQueue.push($applyAsyncExpression); expr = $parse(expr); scheduleApplyAsync(); function $applyAsyncExpression() { scope.$eval(expr); } }, /** * @ngdoc method * @name $rootScope.Scope#$on * @kind function * * @description * Listens on events of a given type. See {@link ng.$rootScope.Scope#$emit $emit} for * discussion of event life cycle. * * The event listener function format is: `function(event, args...)`. The `event` object * passed into the listener has the following attributes: * * - `targetScope` - `{Scope}`: the scope on which the event was `$emit`-ed or * `$broadcast`-ed. * - `currentScope` - `{Scope}`: the scope that is currently handling the event. Once the * event propagates through the scope hierarchy, this property is set to null. * - `name` - `{string}`: name of the event. * - `stopPropagation` - `{function=}`: calling `stopPropagation` function will cancel * further event propagation (available only for events that were `$emit`-ed). * - `preventDefault` - `{function}`: calling `preventDefault` sets `defaultPrevented` flag * to true. * - `defaultPrevented` - `{boolean}`: true if `preventDefault` was called. * * @param {string} name Event name to listen on. * @param {function(event, ...args)} listener Function to call when the event is emitted. * @returns {function()} Returns a deregistration function for this listener. */ $on: function(name, listener) { var namedListeners = this.$$listeners[name]; if (!namedListeners) { this.$$listeners[name] = namedListeners = []; } namedListeners.push(listener); var current = this; do { if (!current.$$listenerCount[name]) { current.$$listenerCount[name] = 0; } current.$$listenerCount[name]++; } while ((current = current.$parent)); var self = this; return function() { var indexOfListener = namedListeners.indexOf(listener); if (indexOfListener !== -1) { namedListeners[indexOfListener] = null; decrementListenerCount(self, 1, name); } }; }, /** * @ngdoc method * @name $rootScope.Scope#$emit * @kind function * * @description * Dispatches an event `name` upwards through the scope hierarchy notifying the * registered {@link ng.$rootScope.Scope#$on} listeners. * * The event life cycle starts at the scope on which `$emit` was called. All * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get * notified. Afterwards, the event traverses upwards toward the root scope and calls all * registered listeners along the way. The event will stop propagating if one of the listeners * cancels it. * * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed * onto the {@link ng.$exceptionHandler $exceptionHandler} service. * * @param {string} name Event name to emit. * @param {...*} args Optional one or more arguments which will be passed onto the event listeners. * @return {Object} Event object (see {@link ng.$rootScope.Scope#$on}). */ $emit: function(name, args) { var empty = [], namedListeners, scope = this, stopPropagation = false, event = { name: name, targetScope: scope, stopPropagation: function() {stopPropagation = true;}, preventDefault: function() { event.defaultPrevented = true; }, defaultPrevented: false }, listenerArgs = concat([event], arguments, 1), i, length; do { namedListeners = scope.$$listeners[name] || empty; event.currentScope = scope; for (i = 0, length = namedListeners.length; i < length; i++) { // if listeners were deregistered, defragment the array if (!namedListeners[i]) { namedListeners.splice(i, 1); i--; length--; continue; } try { //allow all listeners attached to the current scope to run namedListeners[i].apply(null, listenerArgs); } catch (e) { $exceptionHandler(e); } } //if any listener on the current scope stops propagation, prevent bubbling if (stopPropagation) { event.currentScope = null; return event; } //traverse upwards scope = scope.$parent; } while (scope); event.currentScope = null; return event; }, /** * @ngdoc method * @name $rootScope.Scope#$broadcast * @kind function * * @description * Dispatches an event `name` downwards to all child scopes (and their children) notifying the * registered {@link ng.$rootScope.Scope#$on} listeners. * * The event life cycle starts at the scope on which `$broadcast` was called. All * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get * notified. Afterwards, the event propagates to all direct and indirect scopes of the current * scope and calls all registered listeners along the way. The event cannot be canceled. * * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed * onto the {@link ng.$exceptionHandler $exceptionHandler} service. * * @param {string} name Event name to broadcast. * @param {...*} args Optional one or more arguments which will be passed onto the event listeners. * @return {Object} Event object, see {@link ng.$rootScope.Scope#$on} */ $broadcast: function(name, args) { var target = this, current = target, next = target, event = { name: name, targetScope: target, preventDefault: function() { event.defaultPrevented = true; }, defaultPrevented: false }; if (!target.$$listenerCount[name]) return event; var listenerArgs = concat([event], arguments, 1), listeners, i, length; //down while you can, then up and next sibling or up and next sibling until back at root while ((current = next)) { event.currentScope = current; listeners = current.$$listeners[name] || []; for (i = 0, length = listeners.length; i < length; i++) { // if listeners were deregistered, defragment the array if (!listeners[i]) { listeners.splice(i, 1); i--; length--; continue; } try { listeners[i].apply(null, listenerArgs); } catch (e) { $exceptionHandler(e); } } // Insanity Warning: scope depth-first traversal // yes, this code is a bit crazy, but it works and we have tests to prove it! // this piece should be kept in sync with the traversal in $digest // (though it differs due to having the extra check for $$listenerCount) if (!(next = ((current.$$listenerCount[name] && current.$$childHead) || (current !== target && current.$$nextSibling)))) { while (current !== target && !(next = current.$$nextSibling)) { current = current.$parent; } } } event.currentScope = null; return event; } }; var $rootScope = new Scope(); //The internal queues. Expose them on the $rootScope for debugging/testing purposes. var asyncQueue = $rootScope.$$asyncQueue = []; var postDigestQueue = $rootScope.$$postDigestQueue = []; var applyAsyncQueue = $rootScope.$$applyAsyncQueue = []; var postDigestQueuePosition = 0; return $rootScope; function beginPhase(phase) { if ($rootScope.$$phase) { throw $rootScopeMinErr('inprog', '{0} already in progress', $rootScope.$$phase); } $rootScope.$$phase = phase; } function clearPhase() { $rootScope.$$phase = null; } function incrementWatchersCount(current, count) { do { current.$$watchersCount += count; } while ((current = current.$parent)); } function decrementListenerCount(current, count, name) { do { current.$$listenerCount[name] -= count; if (current.$$listenerCount[name] === 0) { delete current.$$listenerCount[name]; } } while ((current = current.$parent)); } /** * function used as an initial value for watchers. * because it's unique we can easily tell it apart from other values */ function initWatchVal() {} function flushApplyAsync() { while (applyAsyncQueue.length) { try { applyAsyncQueue.shift()(); } catch (e) { $exceptionHandler(e); } } applyAsyncId = null; } function scheduleApplyAsync() { if (applyAsyncId === null) { applyAsyncId = $browser.defer(function() { $rootScope.$apply(flushApplyAsync); }); } } }]; } /** * @ngdoc service * @name $rootElement * * @description * The root element of Angular application. This is either the element where {@link * ng.directive:ngApp ngApp} was declared or the element passed into * {@link angular.bootstrap}. The element represents the root element of application. It is also the * location where the application's {@link auto.$injector $injector} service gets * published, and can be retrieved using `$rootElement.injector()`. */ // the implementation is in angular.bootstrap /** * @description * Private service to sanitize uris for links and images. Used by $compile and $sanitize. */ function $$SanitizeUriProvider() { var aHrefSanitizationWhitelist = /^\s*(https?|ftp|mailto|tel|file):/, imgSrcSanitizationWhitelist = /^\s*((https?|ftp|file|blob):|data:image\/)/; /** * @description * Retrieves or overrides the default regular expression that is used for whitelisting of safe * urls during a[href] sanitization. * * The sanitization is a security measure aimed at prevent XSS attacks via html links. * * Any url about to be assigned to a[href] via data-binding is first normalized and turned into * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist` * regular expression. If a match is found, the original url is written into the dom. Otherwise, * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. * * @param {RegExp=} regexp New regexp to whitelist urls with. * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for * chaining otherwise. */ this.aHrefSanitizationWhitelist = function(regexp) { if (isDefined(regexp)) { aHrefSanitizationWhitelist = regexp; return this; } return aHrefSanitizationWhitelist; }; /** * @description * Retrieves or overrides the default regular expression that is used for whitelisting of safe * urls during img[src] sanitization. * * The sanitization is a security measure aimed at prevent XSS attacks via html links. * * Any url about to be assigned to img[src] via data-binding is first normalized and turned into * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist` * regular expression. If a match is found, the original url is written into the dom. Otherwise, * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. * * @param {RegExp=} regexp New regexp to whitelist urls with. * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for * chaining otherwise. */ this.imgSrcSanitizationWhitelist = function(regexp) { if (isDefined(regexp)) { imgSrcSanitizationWhitelist = regexp; return this; } return imgSrcSanitizationWhitelist; }; this.$get = function() { return function sanitizeUri(uri, isImage) { var regex = isImage ? imgSrcSanitizationWhitelist : aHrefSanitizationWhitelist; var normalizedVal; normalizedVal = urlResolve(uri).href; if (normalizedVal !== '' && !normalizedVal.match(regex)) { return 'unsafe:' + normalizedVal; } return uri; }; }; } /** * !!! This is an undocumented "private" service !!! * * @name $sniffer * @requires $window * @requires $document * * @property {boolean} history Does the browser support html5 history api ? * @property {boolean} transitions Does the browser support CSS transition events ? * @property {boolean} animations Does the browser support CSS animation events ? * * @description * This is very simple implementation of testing browser's features. */ function $SnifferProvider() { this.$get = ['$window', '$document', function($window, $document) { var eventSupport = {}, // Chrome Packaged Apps are not allowed to access `history.pushState`. They can be detected by // the presence of `chrome.app.runtime` (see https://developer.chrome.com/apps/api_index) isChromePackagedApp = $window.chrome && $window.chrome.app && $window.chrome.app.runtime, hasHistoryPushState = !isChromePackagedApp && $window.history && $window.history.pushState, android = toInt((/android (\d+)/.exec(lowercase(($window.navigator || {}).userAgent)) || [])[1]), boxee = /Boxee/i.test(($window.navigator || {}).userAgent), document = $document[0] || {}, vendorPrefix, vendorRegex = /^(Moz|webkit|ms)(?=[A-Z])/, bodyStyle = document.body && document.body.style, transitions = false, animations = false, match; if (bodyStyle) { for (var prop in bodyStyle) { if (match = vendorRegex.exec(prop)) { vendorPrefix = match[0]; vendorPrefix = vendorPrefix[0].toUpperCase() + vendorPrefix.substr(1); break; } } if (!vendorPrefix) { vendorPrefix = ('WebkitOpacity' in bodyStyle) && 'webkit'; } transitions = !!(('transition' in bodyStyle) || (vendorPrefix + 'Transition' in bodyStyle)); animations = !!(('animation' in bodyStyle) || (vendorPrefix + 'Animation' in bodyStyle)); if (android && (!transitions || !animations)) { transitions = isString(bodyStyle.webkitTransition); animations = isString(bodyStyle.webkitAnimation); } } return { // Android has history.pushState, but it does not update location correctly // so let's not use the history API at all. // http://code.google.com/p/android/issues/detail?id=17471 // https://github.com/angular/angular.js/issues/904 // older webkit browser (533.9) on Boxee box has exactly the same problem as Android has // so let's not use the history API also // We are purposefully using `!(android < 4)` to cover the case when `android` is undefined // jshint -W018 history: !!(hasHistoryPushState && !(android < 4) && !boxee), // jshint +W018 hasEvent: function(event) { // IE9 implements 'input' event it's so fubared that we rather pretend that it doesn't have // it. In particular the event is not fired when backspace or delete key are pressed or // when cut operation is performed. // IE10+ implements 'input' event but it erroneously fires under various situations, // e.g. when placeholder changes, or a form is focused. if (event === 'input' && msie <= 11) return false; if (isUndefined(eventSupport[event])) { var divElm = document.createElement('div'); eventSupport[event] = 'on' + event in divElm; } return eventSupport[event]; }, csp: csp(), vendorPrefix: vendorPrefix, transitions: transitions, animations: animations, android: android }; }]; } function $$TestabilityProvider() { this.$get = ['$rootScope', '$browser', '$location', function($rootScope, $browser, $location) { /** * @name $testability * * @description * The private $$testability service provides a collection of methods for use when debugging * or by automated test and debugging tools. */ var testability = {}; /** * @name $$testability#findBindings * * @description * Returns an array of elements that are bound (via ng-bind or {{}}) * to expressions matching the input. * * @param {Element} element The element root to search from. * @param {string} expression The binding expression to match. * @param {boolean} opt_exactMatch If true, only returns exact matches * for the expression. Filters and whitespace are ignored. */ testability.findBindings = function(element, expression, opt_exactMatch) { var bindings = element.getElementsByClassName('ng-binding'); var matches = []; forEach(bindings, function(binding) { var dataBinding = angular.element(binding).data('$binding'); if (dataBinding) { forEach(dataBinding, function(bindingName) { if (opt_exactMatch) { var matcher = new RegExp('(^|\\s)' + escapeForRegexp(expression) + '(\\s|\\||$)'); if (matcher.test(bindingName)) { matches.push(binding); } } else { if (bindingName.indexOf(expression) != -1) { matches.push(binding); } } }); } }); return matches; }; /** * @name $$testability#findModels * * @description * Returns an array of elements that are two-way found via ng-model to * expressions matching the input. * * @param {Element} element The element root to search from. * @param {string} expression The model expression to match. * @param {boolean} opt_exactMatch If true, only returns exact matches * for the expression. */ testability.findModels = function(element, expression, opt_exactMatch) { var prefixes = ['ng-', 'data-ng-', 'ng\\:']; for (var p = 0; p < prefixes.length; ++p) { var attributeEquals = opt_exactMatch ? '=' : '*='; var selector = '[' + prefixes[p] + 'model' + attributeEquals + '"' + expression + '"]'; var elements = element.querySelectorAll(selector); if (elements.length) { return elements; } } }; /** * @name $$testability#getLocation * * @description * Shortcut for getting the location in a browser agnostic way. Returns * the path, search, and hash. (e.g. /path?a=b#hash) */ testability.getLocation = function() { return $location.url(); }; /** * @name $$testability#setLocation * * @description * Shortcut for navigating to a location without doing a full page reload. * * @param {string} url The location url (path, search and hash, * e.g. /path?a=b#hash) to go to. */ testability.setLocation = function(url) { if (url !== $location.url()) { $location.url(url); $rootScope.$digest(); } }; /** * @name $$testability#whenStable * * @description * Calls the callback when $timeout and $http requests are completed. * * @param {function} callback */ testability.whenStable = function(callback) { $browser.notifyWhenNoOutstandingRequests(callback); }; return testability; }]; } function $TimeoutProvider() { this.$get = ['$rootScope', '$browser', '$q', '$$q', '$exceptionHandler', function($rootScope, $browser, $q, $$q, $exceptionHandler) { var deferreds = {}; /** * @ngdoc service * @name $timeout * * @description * Angular's wrapper for `window.setTimeout`. The `fn` function is wrapped into a try/catch * block and delegates any exceptions to * {@link ng.$exceptionHandler $exceptionHandler} service. * * The return value of calling `$timeout` is a promise, which will be resolved when * the delay has passed and the timeout function, if provided, is executed. * * To cancel a timeout request, call `$timeout.cancel(promise)`. * * In tests you can use {@link ngMock.$timeout `$timeout.flush()`} to * synchronously flush the queue of deferred functions. * * If you only want a promise that will be resolved after some specified delay * then you can call `$timeout` without the `fn` function. * * @param {function()=} fn A function, whose execution should be delayed. * @param {number=} [delay=0] Delay in milliseconds. * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise * will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block. * @param {...*=} Pass additional parameters to the executed function. * @returns {Promise} Promise that will be resolved when the timeout is reached. The promise * will be resolved with the return value of the `fn` function. * */ function timeout(fn, delay, invokeApply) { if (!isFunction(fn)) { invokeApply = delay; delay = fn; fn = noop; } var args = sliceArgs(arguments, 3), skipApply = (isDefined(invokeApply) && !invokeApply), deferred = (skipApply ? $$q : $q).defer(), promise = deferred.promise, timeoutId; timeoutId = $browser.defer(function() { try { deferred.resolve(fn.apply(null, args)); } catch (e) { deferred.reject(e); $exceptionHandler(e); } finally { delete deferreds[promise.$$timeoutId]; } if (!skipApply) $rootScope.$apply(); }, delay); promise.$$timeoutId = timeoutId; deferreds[timeoutId] = deferred; return promise; } /** * @ngdoc method * @name $timeout#cancel * * @description * Cancels a task associated with the `promise`. As a result of this, the promise will be * resolved with a rejection. * * @param {Promise=} promise Promise returned by the `$timeout` function. * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully * canceled. */ timeout.cancel = function(promise) { if (promise && promise.$$timeoutId in deferreds) { deferreds[promise.$$timeoutId].reject('canceled'); delete deferreds[promise.$$timeoutId]; return $browser.defer.cancel(promise.$$timeoutId); } return false; }; return timeout; }]; } // NOTE: The usage of window and document instead of $window and $document here is // deliberate. This service depends on the specific behavior of anchor nodes created by the // browser (resolving and parsing URLs) that is unlikely to be provided by mock objects and // cause us to break tests. In addition, when the browser resolves a URL for XHR, it // doesn't know about mocked locations and resolves URLs to the real document - which is // exactly the behavior needed here. There is little value is mocking these out for this // service. var urlParsingNode = window.document.createElement("a"); var originUrl = urlResolve(window.location.href); /** * * Implementation Notes for non-IE browsers * ---------------------------------------- * Assigning a URL to the href property of an anchor DOM node, even one attached to the DOM, * results both in the normalizing and parsing of the URL. Normalizing means that a relative * URL will be resolved into an absolute URL in the context of the application document. * Parsing means that the anchor node's host, hostname, protocol, port, pathname and related * properties are all populated to reflect the normalized URL. This approach has wide * compatibility - Safari 1+, Mozilla 1+, Opera 7+,e etc. See * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html * * Implementation Notes for IE * --------------------------- * IE <= 10 normalizes the URL when assigned to the anchor node similar to the other * browsers. However, the parsed components will not be set if the URL assigned did not specify * them. (e.g. if you assign a.href = "foo", then a.protocol, a.host, etc. will be empty.) We * work around that by performing the parsing in a 2nd step by taking a previously normalized * URL (e.g. by assigning to a.href) and assigning it a.href again. This correctly populates the * properties such as protocol, hostname, port, etc. * * References: * http://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html * http://url.spec.whatwg.org/#urlutils * https://github.com/angular/angular.js/pull/2902 * http://james.padolsey.com/javascript/parsing-urls-with-the-dom/ * * @kind function * @param {string} url The URL to be parsed. * @description Normalizes and parses a URL. * @returns {object} Returns the normalized URL as a dictionary. * * | member name | Description | * |---------------|----------------| * | href | A normalized version of the provided URL if it was not an absolute URL | * | protocol | The protocol including the trailing colon | * | host | The host and port (if the port is non-default) of the normalizedUrl | * | search | The search params, minus the question mark | * | hash | The hash string, minus the hash symbol * | hostname | The hostname * | port | The port, without ":" * | pathname | The pathname, beginning with "/" * */ function urlResolve(url) { var href = url; if (msie) { // Normalize before parse. Refer Implementation Notes on why this is // done in two steps on IE. urlParsingNode.setAttribute("href", href); href = urlParsingNode.href; } urlParsingNode.setAttribute('href', href); // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils return { href: urlParsingNode.href, protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', host: urlParsingNode.host, search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', hostname: urlParsingNode.hostname, port: urlParsingNode.port, pathname: (urlParsingNode.pathname.charAt(0) === '/') ? urlParsingNode.pathname : '/' + urlParsingNode.pathname }; } /** * Parse a request URL and determine whether this is a same-origin request as the application document. * * @param {string|object} requestUrl The url of the request as a string that will be resolved * or a parsed URL object. * @returns {boolean} Whether the request is for the same origin as the application document. */ function urlIsSameOrigin(requestUrl) { var parsed = (isString(requestUrl)) ? urlResolve(requestUrl) : requestUrl; return (parsed.protocol === originUrl.protocol && parsed.host === originUrl.host); } /** * @ngdoc service * @name $window * * @description * A reference to the browser's `window` object. While `window` * is globally available in JavaScript, it causes testability problems, because * it is a global variable. In angular we always refer to it through the * `$window` service, so it may be overridden, removed or mocked for testing. * * Expressions, like the one defined for the `ngClick` directive in the example * below, are evaluated with respect to the current scope. Therefore, there is * no risk of inadvertently coding in a dependency on a global value in such an * expression. * * @example
it('should display the greeting in the input box', function() { element(by.model('greeting')).sendKeys('Hello, E2E Tests'); // If we click the button it will block the test runner // element(':button').click(); });
*/ function $WindowProvider() { this.$get = valueFn(window); } /** * @name $$cookieReader * @requires $document * * @description * This is a private service for reading cookies used by $http and ngCookies * * @return {Object} a key/value map of the current cookies */ function $$CookieReader($document) { var rawDocument = $document[0] || {}; var lastCookies = {}; var lastCookieString = ''; function safeDecodeURIComponent(str) { try { return decodeURIComponent(str); } catch (e) { return str; } } return function() { var cookieArray, cookie, i, index, name; var currentCookieString = rawDocument.cookie || ''; if (currentCookieString !== lastCookieString) { lastCookieString = currentCookieString; cookieArray = lastCookieString.split('; '); lastCookies = {}; for (i = 0; i < cookieArray.length; i++) { cookie = cookieArray[i]; index = cookie.indexOf('='); if (index > 0) { //ignore nameless cookies name = safeDecodeURIComponent(cookie.substring(0, index)); // the first value that is seen for a cookie is the most // specific one. values for the same cookie name that // follow are for less specific paths. if (isUndefined(lastCookies[name])) { lastCookies[name] = safeDecodeURIComponent(cookie.substring(index + 1)); } } } } return lastCookies; }; } $$CookieReader.$inject = ['$document']; function $$CookieReaderProvider() { this.$get = $$CookieReader; } /* global currencyFilter: true, dateFilter: true, filterFilter: true, jsonFilter: true, limitToFilter: true, lowercaseFilter: true, numberFilter: true, orderByFilter: true, uppercaseFilter: true, */ /** * @ngdoc provider * @name $filterProvider * @description * * Filters are just functions which transform input to an output. However filters need to be * Dependency Injected. To achieve this a filter definition consists of a factory function which is * annotated with dependencies and is responsible for creating a filter function. * *
* **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`. * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores * (`myapp_subsection_filterx`). *
* * ```js * // Filter registration * function MyModule($provide, $filterProvider) { * // create a service to demonstrate injection (not always needed) * $provide.value('greet', function(name){ * return 'Hello ' + name + '!'; * }); * * // register a filter factory which uses the * // greet service to demonstrate DI. * $filterProvider.register('greet', function(greet){ * // return the filter function which uses the greet service * // to generate salutation * return function(text) { * // filters need to be forgiving so check input validity * return text && greet(text) || text; * }; * }); * } * ``` * * The filter function is registered with the `$injector` under the filter name suffix with * `Filter`. * * ```js * it('should be the same instance', inject( * function($filterProvider) { * $filterProvider.register('reverse', function(){ * return ...; * }); * }, * function($filter, reverseFilter) { * expect($filter('reverse')).toBe(reverseFilter); * }); * ``` * * * For more information about how angular filters work, and how to create your own filters, see * {@link guide/filter Filters} in the Angular Developer Guide. */ /** * @ngdoc service * @name $filter * @kind function * @description * Filters are used for formatting data displayed to the user. * * The general syntax in templates is as follows: * * {{ expression [| filter_name[:parameter_value] ... ] }} * * @param {String} name Name of the filter function to retrieve * @return {Function} the filter function * @example

{{ originalText }}

{{ filteredText }}

angular.module('filterExample', []) .controller('MainCtrl', function($scope, $filter) { $scope.originalText = 'hello'; $scope.filteredText = $filter('uppercase')($scope.originalText); });
*/ $FilterProvider.$inject = ['$provide']; function $FilterProvider($provide) { var suffix = 'Filter'; /** * @ngdoc method * @name $filterProvider#register * @param {string|Object} name Name of the filter function, or an object map of filters where * the keys are the filter names and the values are the filter factories. * *
* **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`. * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores * (`myapp_subsection_filterx`). *
* @param {Function} factory If the first argument was a string, a factory function for the filter to be registered. * @returns {Object} Registered filter instance, or if a map of filters was provided then a map * of the registered filter instances. */ function register(name, factory) { if (isObject(name)) { var filters = {}; forEach(name, function(filter, key) { filters[key] = register(key, filter); }); return filters; } else { return $provide.factory(name + suffix, factory); } } this.register = register; this.$get = ['$injector', function($injector) { return function(name) { return $injector.get(name + suffix); }; }]; //////////////////////////////////////// /* global currencyFilter: false, dateFilter: false, filterFilter: false, jsonFilter: false, limitToFilter: false, lowercaseFilter: false, numberFilter: false, orderByFilter: false, uppercaseFilter: false, */ register('currency', currencyFilter); register('date', dateFilter); register('filter', filterFilter); register('json', jsonFilter); register('limitTo', limitToFilter); register('lowercase', lowercaseFilter); register('number', numberFilter); register('orderBy', orderByFilter); register('uppercase', uppercaseFilter); } /** * @ngdoc filter * @name filter * @kind function * * @description * Selects a subset of items from `array` and returns it as a new array. * * @param {Array} array The source array. * @param {string|Object|function()} expression The predicate to be used for selecting items from * `array`. * * Can be one of: * * - `string`: The string is used for matching against the contents of the `array`. All strings or * objects with string properties in `array` that match this string will be returned. This also * applies to nested object properties. * The predicate can be negated by prefixing the string with `!`. * * - `Object`: A pattern object can be used to filter specific properties on objects contained * by `array`. For example `{name:"M", phone:"1"}` predicate will return an array of items * which have property `name` containing "M" and property `phone` containing "1". A special * property name `$` can be used (as in `{$:"text"}`) to accept a match against any * property of the object or its nested object properties. That's equivalent to the simple * substring match with a `string` as described above. The predicate can be negated by prefixing * the string with `!`. * For example `{name: "!M"}` predicate will return an array of items which have property `name` * not containing "M". * * Note that a named property will match properties on the same level only, while the special * `$` property will match properties on the same level or deeper. E.g. an array item like * `{name: {first: 'John', last: 'Doe'}}` will **not** be matched by `{name: 'John'}`, but * **will** be matched by `{$: 'John'}`. * * - `function(value, index, array)`: A predicate function can be used to write arbitrary filters. * The function is called for each element of the array, with the element, its index, and * the entire array itself as arguments. * * The final result is an array of those elements that the predicate returned true for. * * @param {function(actual, expected)|true|undefined} comparator Comparator which is used in * determining if the expected value (from the filter expression) and actual value (from * the object in the array) should be considered a match. * * Can be one of: * * - `function(actual, expected)`: * The function will be given the object value and the predicate value to compare and * should return true if both values should be considered equal. * * - `true`: A shorthand for `function(actual, expected) { return angular.equals(actual, expected)}`. * This is essentially strict comparison of expected and actual. * * - `false|undefined`: A short hand for a function which will look for a substring match in case * insensitive way. * * Primitive values are converted to strings. Objects are not compared against primitives, * unless they have a custom `toString` method (e.g. `Date` objects). * * @example
NamePhone
{{friend.name}} {{friend.phone}}





NamePhone
{{friendObj.name}} {{friendObj.phone}}
var expectFriendNames = function(expectedNames, key) { element.all(by.repeater(key + ' in friends').column(key + '.name')).then(function(arr) { arr.forEach(function(wd, i) { expect(wd.getText()).toMatch(expectedNames[i]); }); }); }; it('should search across all fields when filtering with a string', function() { var searchText = element(by.model('searchText')); searchText.clear(); searchText.sendKeys('m'); expectFriendNames(['Mary', 'Mike', 'Adam'], 'friend'); searchText.clear(); searchText.sendKeys('76'); expectFriendNames(['John', 'Julie'], 'friend'); }); it('should search in specific fields when filtering with a predicate object', function() { var searchAny = element(by.model('search.$')); searchAny.clear(); searchAny.sendKeys('i'); expectFriendNames(['Mary', 'Mike', 'Julie', 'Juliette'], 'friendObj'); }); it('should use a equal comparison when comparator is true', function() { var searchName = element(by.model('search.name')); var strict = element(by.model('strict')); searchName.clear(); searchName.sendKeys('Julie'); strict.click(); expectFriendNames(['Julie'], 'friendObj'); });
*/ function filterFilter() { return function(array, expression, comparator) { if (!isArrayLike(array)) { if (array == null) { return array; } else { throw minErr('filter')('notarray', 'Expected array but received: {0}', array); } } var expressionType = getTypeForFilter(expression); var predicateFn; var matchAgainstAnyProp; switch (expressionType) { case 'function': predicateFn = expression; break; case 'boolean': case 'null': case 'number': case 'string': matchAgainstAnyProp = true; //jshint -W086 case 'object': //jshint +W086 predicateFn = createPredicateFn(expression, comparator, matchAgainstAnyProp); break; default: return array; } return Array.prototype.filter.call(array, predicateFn); }; } // Helper functions for `filterFilter` function createPredicateFn(expression, comparator, matchAgainstAnyProp) { var shouldMatchPrimitives = isObject(expression) && ('$' in expression); var predicateFn; if (comparator === true) { comparator = equals; } else if (!isFunction(comparator)) { comparator = function(actual, expected) { if (isUndefined(actual)) { // No substring matching against `undefined` return false; } if ((actual === null) || (expected === null)) { // No substring matching against `null`; only match against `null` return actual === expected; } if (isObject(expected) || (isObject(actual) && !hasCustomToString(actual))) { // Should not compare primitives against objects, unless they have custom `toString` method return false; } actual = lowercase('' + actual); expected = lowercase('' + expected); return actual.indexOf(expected) !== -1; }; } predicateFn = function(item) { if (shouldMatchPrimitives && !isObject(item)) { return deepCompare(item, expression.$, comparator, false); } return deepCompare(item, expression, comparator, matchAgainstAnyProp); }; return predicateFn; } function deepCompare(actual, expected, comparator, matchAgainstAnyProp, dontMatchWholeObject) { var actualType = getTypeForFilter(actual); var expectedType = getTypeForFilter(expected); if ((expectedType === 'string') && (expected.charAt(0) === '!')) { return !deepCompare(actual, expected.substring(1), comparator, matchAgainstAnyProp); } else if (isArray(actual)) { // In case `actual` is an array, consider it a match // if ANY of it's items matches `expected` return actual.some(function(item) { return deepCompare(item, expected, comparator, matchAgainstAnyProp); }); } switch (actualType) { case 'object': var key; if (matchAgainstAnyProp) { for (key in actual) { if ((key.charAt(0) !== '$') && deepCompare(actual[key], expected, comparator, true)) { return true; } } return dontMatchWholeObject ? false : deepCompare(actual, expected, comparator, false); } else if (expectedType === 'object') { for (key in expected) { var expectedVal = expected[key]; if (isFunction(expectedVal) || isUndefined(expectedVal)) { continue; } var matchAnyProperty = key === '$'; var actualVal = matchAnyProperty ? actual : actual[key]; if (!deepCompare(actualVal, expectedVal, comparator, matchAnyProperty, matchAnyProperty)) { return false; } } return true; } else { return comparator(actual, expected); } break; case 'function': return false; default: return comparator(actual, expected); } } // Used for easily differentiating between `null` and actual `object` function getTypeForFilter(val) { return (val === null) ? 'null' : typeof val; } var MAX_DIGITS = 22; var DECIMAL_SEP = '.'; var ZERO_CHAR = '0'; /** * @ngdoc filter * @name currency * @kind function * * @description * Formats a number as a currency (ie $1,234.56). When no currency symbol is provided, default * symbol for current locale is used. * * @param {number} amount Input to filter. * @param {string=} symbol Currency symbol or identifier to be displayed. * @param {number=} fractionSize Number of decimal places to round the amount to, defaults to default max fraction size for current locale * @returns {string} Formatted number. * * * @example

default currency symbol ($): {{amount | currency}}
custom currency identifier (USD$): {{amount | currency:"USD$"}} no fractions (0): {{amount | currency:"USD$":0}}
it('should init with 1234.56', function() { expect(element(by.id('currency-default')).getText()).toBe('$1,234.56'); expect(element(by.id('currency-custom')).getText()).toBe('USD$1,234.56'); expect(element(by.id('currency-no-fractions')).getText()).toBe('USD$1,235'); }); it('should update', function() { if (browser.params.browser == 'safari') { // Safari does not understand the minus key. See // https://github.com/angular/protractor/issues/481 return; } element(by.model('amount')).clear(); element(by.model('amount')).sendKeys('-1234'); expect(element(by.id('currency-default')).getText()).toBe('-$1,234.00'); expect(element(by.id('currency-custom')).getText()).toBe('-USD$1,234.00'); expect(element(by.id('currency-no-fractions')).getText()).toBe('-USD$1,234'); });
*/ currencyFilter.$inject = ['$locale']; function currencyFilter($locale) { var formats = $locale.NUMBER_FORMATS; return function(amount, currencySymbol, fractionSize) { if (isUndefined(currencySymbol)) { currencySymbol = formats.CURRENCY_SYM; } if (isUndefined(fractionSize)) { fractionSize = formats.PATTERNS[1].maxFrac; } // if null or undefined pass it through return (amount == null) ? amount : formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, fractionSize). replace(/\u00A4/g, currencySymbol); }; } /** * @ngdoc filter * @name number * @kind function * * @description * Formats a number as text. * * If the input is null or undefined, it will just be returned. * If the input is infinite (Infinity or -Infinity), the Infinity symbol '∞' or '-∞' is returned, respectively. * If the input is not a number an empty string is returned. * * * @param {number|string} number Number to format. * @param {(number|string)=} fractionSize Number of decimal places to round the number to. * If this is not provided then the fraction size is computed from the current locale's number * formatting pattern. In the case of the default locale, it will be 3. * @returns {string} Number rounded to `fractionSize` appropriately formatted based on the current * locale (e.g., in the en_US locale it will have "." as the decimal separator and * include "," group separators after each third digit). * * @example

Default formatting: {{val | number}}
No fractions: {{val | number:0}}
Negative number: {{-val | number:4}}
it('should format numbers', function() { expect(element(by.id('number-default')).getText()).toBe('1,234.568'); expect(element(by.binding('val | number:0')).getText()).toBe('1,235'); expect(element(by.binding('-val | number:4')).getText()).toBe('-1,234.5679'); }); it('should update', function() { element(by.model('val')).clear(); element(by.model('val')).sendKeys('3374.333'); expect(element(by.id('number-default')).getText()).toBe('3,374.333'); expect(element(by.binding('val | number:0')).getText()).toBe('3,374'); expect(element(by.binding('-val | number:4')).getText()).toBe('-3,374.3330'); });
*/ numberFilter.$inject = ['$locale']; function numberFilter($locale) { var formats = $locale.NUMBER_FORMATS; return function(number, fractionSize) { // if null or undefined pass it through return (number == null) ? number : formatNumber(number, formats.PATTERNS[0], formats.GROUP_SEP, formats.DECIMAL_SEP, fractionSize); }; } /** * Parse a number (as a string) into three components that can be used * for formatting the number. * * (Significant bits of this parse algorithm came from https://github.com/MikeMcl/big.js/) * * @param {string} numStr The number to parse * @return {object} An object describing this number, containing the following keys: * - d : an array of digits containing leading zeros as necessary * - i : the number of the digits in `d` that are to the left of the decimal point * - e : the exponent for numbers that would need more than `MAX_DIGITS` digits in `d` * */ function parse(numStr) { var exponent = 0, digits, numberOfIntegerDigits; var i, j, zeros; // Decimal point? if ((numberOfIntegerDigits = numStr.indexOf(DECIMAL_SEP)) > -1) { numStr = numStr.replace(DECIMAL_SEP, ''); } // Exponential form? if ((i = numStr.search(/e/i)) > 0) { // Work out the exponent. if (numberOfIntegerDigits < 0) numberOfIntegerDigits = i; numberOfIntegerDigits += +numStr.slice(i + 1); numStr = numStr.substring(0, i); } else if (numberOfIntegerDigits < 0) { // There was no decimal point or exponent so it is an integer. numberOfIntegerDigits = numStr.length; } // Count the number of leading zeros. for (i = 0; numStr.charAt(i) == ZERO_CHAR; i++) {/* jshint noempty: false */} if (i == (zeros = numStr.length)) { // The digits are all zero. digits = [0]; numberOfIntegerDigits = 1; } else { // Count the number of trailing zeros zeros--; while (numStr.charAt(zeros) == ZERO_CHAR) zeros--; // Trailing zeros are insignificant so ignore them numberOfIntegerDigits -= i; digits = []; // Convert string to array of digits without leading/trailing zeros. for (j = 0; i <= zeros; i++, j++) { digits[j] = +numStr.charAt(i); } } // If the number overflows the maximum allowed digits then use an exponent. if (numberOfIntegerDigits > MAX_DIGITS) { digits = digits.splice(0, MAX_DIGITS - 1); exponent = numberOfIntegerDigits - 1; numberOfIntegerDigits = 1; } return { d: digits, e: exponent, i: numberOfIntegerDigits }; } /** * Round the parsed number to the specified number of decimal places * This function changed the parsedNumber in-place */ function roundNumber(parsedNumber, fractionSize, minFrac, maxFrac) { var digits = parsedNumber.d; var fractionLen = digits.length - parsedNumber.i; // determine fractionSize if it is not specified; `+fractionSize` converts it to a number fractionSize = (isUndefined(fractionSize)) ? Math.min(Math.max(minFrac, fractionLen), maxFrac) : +fractionSize; // The index of the digit to where rounding is to occur var roundAt = fractionSize + parsedNumber.i; var digit = digits[roundAt]; if (roundAt > 0) { // Drop fractional digits beyond `roundAt` digits.splice(Math.max(parsedNumber.i, roundAt)); // Set non-fractional digits beyond `roundAt` to 0 for (var j = roundAt; j < digits.length; j++) { digits[j] = 0; } } else { // We rounded to zero so reset the parsedNumber fractionLen = Math.max(0, fractionLen); parsedNumber.i = 1; digits.length = Math.max(1, roundAt = fractionSize + 1); digits[0] = 0; for (var i = 1; i < roundAt; i++) digits[i] = 0; } if (digit >= 5) { if (roundAt - 1 < 0) { for (var k = 0; k > roundAt; k--) { digits.unshift(0); parsedNumber.i++; } digits.unshift(1); parsedNumber.i++; } else { digits[roundAt - 1]++; } } // Pad out with zeros to get the required fraction length for (; fractionLen < Math.max(0, fractionSize); fractionLen++) digits.push(0); // Do any carrying, e.g. a digit was rounded up to 10 var carry = digits.reduceRight(function(carry, d, i, digits) { d = d + carry; digits[i] = d % 10; return Math.floor(d / 10); }, 0); if (carry) { digits.unshift(carry); parsedNumber.i++; } } /** * Format a number into a string * @param {number} number The number to format * @param {{ * minFrac, // the minimum number of digits required in the fraction part of the number * maxFrac, // the maximum number of digits required in the fraction part of the number * gSize, // number of digits in each group of separated digits * lgSize, // number of digits in the last group of digits before the decimal separator * negPre, // the string to go in front of a negative number (e.g. `-` or `(`)) * posPre, // the string to go in front of a positive number * negSuf, // the string to go after a negative number (e.g. `)`) * posSuf // the string to go after a positive number * }} pattern * @param {string} groupSep The string to separate groups of number (e.g. `,`) * @param {string} decimalSep The string to act as the decimal separator (e.g. `.`) * @param {[type]} fractionSize The size of the fractional part of the number * @return {string} The number formatted as a string */ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) { if (!(isString(number) || isNumber(number)) || isNaN(number)) return ''; var isInfinity = !isFinite(number); var isZero = false; var numStr = Math.abs(number) + '', formattedText = '', parsedNumber; if (isInfinity) { formattedText = '\u221e'; } else { parsedNumber = parse(numStr); roundNumber(parsedNumber, fractionSize, pattern.minFrac, pattern.maxFrac); var digits = parsedNumber.d; var integerLen = parsedNumber.i; var exponent = parsedNumber.e; var decimals = []; isZero = digits.reduce(function(isZero, d) { return isZero && !d; }, true); // pad zeros for small numbers while (integerLen < 0) { digits.unshift(0); integerLen++; } // extract decimals digits if (integerLen > 0) { decimals = digits.splice(integerLen, digits.length); } else { decimals = digits; digits = [0]; } // format the integer digits with grouping separators var groups = []; if (digits.length >= pattern.lgSize) { groups.unshift(digits.splice(-pattern.lgSize, digits.length).join('')); } while (digits.length > pattern.gSize) { groups.unshift(digits.splice(-pattern.gSize, digits.length).join('')); } if (digits.length) { groups.unshift(digits.join('')); } formattedText = groups.join(groupSep); // append the decimal digits if (decimals.length) { formattedText += decimalSep + decimals.join(''); } if (exponent) { formattedText += 'e+' + exponent; } } if (number < 0 && !isZero) { return pattern.negPre + formattedText + pattern.negSuf; } else { return pattern.posPre + formattedText + pattern.posSuf; } } function padNumber(num, digits, trim, negWrap) { var neg = ''; if (num < 0 || (negWrap && num <= 0)) { if (negWrap) { num = -num + 1; } else { num = -num; neg = '-'; } } num = '' + num; while (num.length < digits) num = ZERO_CHAR + num; if (trim) { num = num.substr(num.length - digits); } return neg + num; } function dateGetter(name, size, offset, trim, negWrap) { offset = offset || 0; return function(date) { var value = date['get' + name](); if (offset > 0 || value > -offset) { value += offset; } if (value === 0 && offset == -12) value = 12; return padNumber(value, size, trim, negWrap); }; } function dateStrGetter(name, shortForm, standAlone) { return function(date, formats) { var value = date['get' + name](); var propPrefix = (standAlone ? 'STANDALONE' : '') + (shortForm ? 'SHORT' : ''); var get = uppercase(propPrefix + name); return formats[get][value]; }; } function timeZoneGetter(date, formats, offset) { var zone = -1 * offset; var paddedZone = (zone >= 0) ? "+" : ""; paddedZone += padNumber(Math[zone > 0 ? 'floor' : 'ceil'](zone / 60), 2) + padNumber(Math.abs(zone % 60), 2); return paddedZone; } function getFirstThursdayOfYear(year) { // 0 = index of January var dayOfWeekOnFirst = (new Date(year, 0, 1)).getDay(); // 4 = index of Thursday (+1 to account for 1st = 5) // 11 = index of *next* Thursday (+1 account for 1st = 12) return new Date(year, 0, ((dayOfWeekOnFirst <= 4) ? 5 : 12) - dayOfWeekOnFirst); } function getThursdayThisWeek(datetime) { return new Date(datetime.getFullYear(), datetime.getMonth(), // 4 = index of Thursday datetime.getDate() + (4 - datetime.getDay())); } function weekGetter(size) { return function(date) { var firstThurs = getFirstThursdayOfYear(date.getFullYear()), thisThurs = getThursdayThisWeek(date); var diff = +thisThurs - +firstThurs, result = 1 + Math.round(diff / 6.048e8); // 6.048e8 ms per week return padNumber(result, size); }; } function ampmGetter(date, formats) { return date.getHours() < 12 ? formats.AMPMS[0] : formats.AMPMS[1]; } function eraGetter(date, formats) { return date.getFullYear() <= 0 ? formats.ERAS[0] : formats.ERAS[1]; } function longEraGetter(date, formats) { return date.getFullYear() <= 0 ? formats.ERANAMES[0] : formats.ERANAMES[1]; } var DATE_FORMATS = { yyyy: dateGetter('FullYear', 4, 0, false, true), yy: dateGetter('FullYear', 2, 0, true, true), y: dateGetter('FullYear', 1, 0, false, true), MMMM: dateStrGetter('Month'), MMM: dateStrGetter('Month', true), MM: dateGetter('Month', 2, 1), M: dateGetter('Month', 1, 1), LLLL: dateStrGetter('Month', false, true), dd: dateGetter('Date', 2), d: dateGetter('Date', 1), HH: dateGetter('Hours', 2), H: dateGetter('Hours', 1), hh: dateGetter('Hours', 2, -12), h: dateGetter('Hours', 1, -12), mm: dateGetter('Minutes', 2), m: dateGetter('Minutes', 1), ss: dateGetter('Seconds', 2), s: dateGetter('Seconds', 1), // while ISO 8601 requires fractions to be prefixed with `.` or `,` // we can be just safely rely on using `sss` since we currently don't support single or two digit fractions sss: dateGetter('Milliseconds', 3), EEEE: dateStrGetter('Day'), EEE: dateStrGetter('Day', true), a: ampmGetter, Z: timeZoneGetter, ww: weekGetter(2), w: weekGetter(1), G: eraGetter, GG: eraGetter, GGG: eraGetter, GGGG: longEraGetter }; var DATE_FORMATS_SPLIT = /((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/, NUMBER_STRING = /^\-?\d+$/; /** * @ngdoc filter * @name date * @kind function * * @description * Formats `date` to a string based on the requested `format`. * * `format` string can be composed of the following elements: * * * `'yyyy'`: 4 digit representation of year (e.g. AD 1 => 0001, AD 2010 => 2010) * * `'yy'`: 2 digit representation of year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10) * * `'y'`: 1 digit representation of year, e.g. (AD 1 => 1, AD 199 => 199) * * `'MMMM'`: Month in year (January-December) * * `'MMM'`: Month in year (Jan-Dec) * * `'MM'`: Month in year, padded (01-12) * * `'M'`: Month in year (1-12) * * `'LLLL'`: Stand-alone month in year (January-December) * * `'dd'`: Day in month, padded (01-31) * * `'d'`: Day in month (1-31) * * `'EEEE'`: Day in Week,(Sunday-Saturday) * * `'EEE'`: Day in Week, (Sun-Sat) * * `'HH'`: Hour in day, padded (00-23) * * `'H'`: Hour in day (0-23) * * `'hh'`: Hour in AM/PM, padded (01-12) * * `'h'`: Hour in AM/PM, (1-12) * * `'mm'`: Minute in hour, padded (00-59) * * `'m'`: Minute in hour (0-59) * * `'ss'`: Second in minute, padded (00-59) * * `'s'`: Second in minute (0-59) * * `'sss'`: Millisecond in second, padded (000-999) * * `'a'`: AM/PM marker * * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200-+1200) * * `'ww'`: Week of year, padded (00-53). Week 01 is the week with the first Thursday of the year * * `'w'`: Week of year (0-53). Week 1 is the week with the first Thursday of the year * * `'G'`, `'GG'`, `'GGG'`: The abbreviated form of the era string (e.g. 'AD') * * `'GGGG'`: The long form of the era string (e.g. 'Anno Domini') * * `format` string can also be one of the following predefined * {@link guide/i18n localizable formats}: * * * `'medium'`: equivalent to `'MMM d, y h:mm:ss a'` for en_US locale * (e.g. Sep 3, 2010 12:05:08 PM) * * `'short'`: equivalent to `'M/d/yy h:mm a'` for en_US locale (e.g. 9/3/10 12:05 PM) * * `'fullDate'`: equivalent to `'EEEE, MMMM d, y'` for en_US locale * (e.g. Friday, September 3, 2010) * * `'longDate'`: equivalent to `'MMMM d, y'` for en_US locale (e.g. September 3, 2010) * * `'mediumDate'`: equivalent to `'MMM d, y'` for en_US locale (e.g. Sep 3, 2010) * * `'shortDate'`: equivalent to `'M/d/yy'` for en_US locale (e.g. 9/3/10) * * `'mediumTime'`: equivalent to `'h:mm:ss a'` for en_US locale (e.g. 12:05:08 PM) * * `'shortTime'`: equivalent to `'h:mm a'` for en_US locale (e.g. 12:05 PM) * * `format` string can contain literal values. These need to be escaped by surrounding with single quotes (e.g. * `"h 'in the morning'"`). In order to output a single quote, escape it - i.e., two single quotes in a sequence * (e.g. `"h 'o''clock'"`). * * @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or * number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.sssZ and its * shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ). If no timezone is * specified in the string input, the time is considered to be in the local timezone. * @param {string=} format Formatting rules (see Description). If not specified, * `mediumDate` is used. * @param {string=} timezone Timezone to be used for formatting. It understands UTC/GMT and the * continental US time zone abbreviations, but for general use, use a time zone offset, for * example, `'+0430'` (4 hours, 30 minutes east of the Greenwich meridian) * If not specified, the timezone of the browser will be used. * @returns {string} Formatted string or the input if input is not recognized as date/millis. * * @example {{1288323623006 | date:'medium'}}: {{1288323623006 | date:'medium'}}
{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}: {{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}
{{1288323623006 | date:'MM/dd/yyyy @ h:mma'}}: {{'1288323623006' | date:'MM/dd/yyyy @ h:mma'}}
{{1288323623006 | date:"MM/dd/yyyy 'at' h:mma"}}: {{'1288323623006' | date:"MM/dd/yyyy 'at' h:mma"}}
it('should format date', function() { expect(element(by.binding("1288323623006 | date:'medium'")).getText()). toMatch(/Oct 2\d, 2010 \d{1,2}:\d{2}:\d{2} (AM|PM)/); expect(element(by.binding("1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'")).getText()). toMatch(/2010\-10\-2\d \d{2}:\d{2}:\d{2} (\-|\+)?\d{4}/); expect(element(by.binding("'1288323623006' | date:'MM/dd/yyyy @ h:mma'")).getText()). toMatch(/10\/2\d\/2010 @ \d{1,2}:\d{2}(AM|PM)/); expect(element(by.binding("'1288323623006' | date:\"MM/dd/yyyy 'at' h:mma\"")).getText()). toMatch(/10\/2\d\/2010 at \d{1,2}:\d{2}(AM|PM)/); });
*/ dateFilter.$inject = ['$locale']; function dateFilter($locale) { var R_ISO8601_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/; // 1 2 3 4 5 6 7 8 9 10 11 function jsonStringToDate(string) { var match; if (match = string.match(R_ISO8601_STR)) { var date = new Date(0), tzHour = 0, tzMin = 0, dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear, timeSetter = match[8] ? date.setUTCHours : date.setHours; if (match[9]) { tzHour = toInt(match[9] + match[10]); tzMin = toInt(match[9] + match[11]); } dateSetter.call(date, toInt(match[1]), toInt(match[2]) - 1, toInt(match[3])); var h = toInt(match[4] || 0) - tzHour; var m = toInt(match[5] || 0) - tzMin; var s = toInt(match[6] || 0); var ms = Math.round(parseFloat('0.' + (match[7] || 0)) * 1000); timeSetter.call(date, h, m, s, ms); return date; } return string; } return function(date, format, timezone) { var text = '', parts = [], fn, match; format = format || 'mediumDate'; format = $locale.DATETIME_FORMATS[format] || format; if (isString(date)) { date = NUMBER_STRING.test(date) ? toInt(date) : jsonStringToDate(date); } if (isNumber(date)) { date = new Date(date); } if (!isDate(date) || !isFinite(date.getTime())) { return date; } while (format) { match = DATE_FORMATS_SPLIT.exec(format); if (match) { parts = concat(parts, match, 1); format = parts.pop(); } else { parts.push(format); format = null; } } var dateTimezoneOffset = date.getTimezoneOffset(); if (timezone) { dateTimezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset); date = convertTimezoneToLocal(date, timezone, true); } forEach(parts, function(value) { fn = DATE_FORMATS[value]; text += fn ? fn(date, $locale.DATETIME_FORMATS, dateTimezoneOffset) : value === "''" ? "'" : value.replace(/(^'|'$)/g, '').replace(/''/g, "'"); }); return text; }; } /** * @ngdoc filter * @name json * @kind function * * @description * Allows you to convert a JavaScript object into JSON string. * * This filter is mostly useful for debugging. When using the double curly {{value}} notation * the binding is automatically converted to JSON. * * @param {*} object Any JavaScript object (including arrays and primitive types) to filter. * @param {number=} spacing The number of spaces to use per indentation, defaults to 2. * @returns {string} JSON string. * * * @example
{{ {'name':'value'} | json }}
{{ {'name':'value'} | json:4 }}
it('should jsonify filtered objects', function() { expect(element(by.id('default-spacing')).getText()).toMatch(/\{\n "name": ?"value"\n}/); expect(element(by.id('custom-spacing')).getText()).toMatch(/\{\n "name": ?"value"\n}/); });
* */ function jsonFilter() { return function(object, spacing) { if (isUndefined(spacing)) { spacing = 2; } return toJson(object, spacing); }; } /** * @ngdoc filter * @name lowercase * @kind function * @description * Converts string to lowercase. * @see angular.lowercase */ var lowercaseFilter = valueFn(lowercase); /** * @ngdoc filter * @name uppercase * @kind function * @description * Converts string to uppercase. * @see angular.uppercase */ var uppercaseFilter = valueFn(uppercase); /** * @ngdoc filter * @name limitTo * @kind function * * @description * Creates a new array or string containing only a specified number of elements. The elements are * taken from either the beginning or the end of the source array, string or number, as specified by * the value and sign (positive or negative) of `limit`. Other array-like objects are also supported * (e.g. array subclasses, NodeLists, jqLite/jQuery collections etc). If a number is used as input, * it is converted to a string. * * @param {Array|ArrayLike|string|number} input - Array/array-like, string or number to be limited. * @param {string|number} limit - The length of the returned array or string. If the `limit` number * is positive, `limit` number of items from the beginning of the source array/string are copied. * If the number is negative, `limit` number of items from the end of the source array/string * are copied. The `limit` will be trimmed if it exceeds `array.length`. If `limit` is undefined, * the input will be returned unchanged. * @param {(string|number)=} begin - Index at which to begin limitation. As a negative index, * `begin` indicates an offset from the end of `input`. Defaults to `0`. * @returns {Array|string} A new sub-array or substring of length `limit` or less if the input had * less than `limit` elements. * * @example

Output numbers: {{ numbers | limitTo:numLimit }}

Output letters: {{ letters | limitTo:letterLimit }}

Output long number: {{ longNumber | limitTo:longNumberLimit }}

var numLimitInput = element(by.model('numLimit')); var letterLimitInput = element(by.model('letterLimit')); var longNumberLimitInput = element(by.model('longNumberLimit')); var limitedNumbers = element(by.binding('numbers | limitTo:numLimit')); var limitedLetters = element(by.binding('letters | limitTo:letterLimit')); var limitedLongNumber = element(by.binding('longNumber | limitTo:longNumberLimit')); it('should limit the number array to first three items', function() { expect(numLimitInput.getAttribute('value')).toBe('3'); expect(letterLimitInput.getAttribute('value')).toBe('3'); expect(longNumberLimitInput.getAttribute('value')).toBe('3'); expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3]'); expect(limitedLetters.getText()).toEqual('Output letters: abc'); expect(limitedLongNumber.getText()).toEqual('Output long number: 234'); }); // There is a bug in safari and protractor that doesn't like the minus key // it('should update the output when -3 is entered', function() { // numLimitInput.clear(); // numLimitInput.sendKeys('-3'); // letterLimitInput.clear(); // letterLimitInput.sendKeys('-3'); // longNumberLimitInput.clear(); // longNumberLimitInput.sendKeys('-3'); // expect(limitedNumbers.getText()).toEqual('Output numbers: [7,8,9]'); // expect(limitedLetters.getText()).toEqual('Output letters: ghi'); // expect(limitedLongNumber.getText()).toEqual('Output long number: 342'); // }); it('should not exceed the maximum size of input array', function() { numLimitInput.clear(); numLimitInput.sendKeys('100'); letterLimitInput.clear(); letterLimitInput.sendKeys('100'); longNumberLimitInput.clear(); longNumberLimitInput.sendKeys('100'); expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3,4,5,6,7,8,9]'); expect(limitedLetters.getText()).toEqual('Output letters: abcdefghi'); expect(limitedLongNumber.getText()).toEqual('Output long number: 2345432342'); });
*/ function limitToFilter() { return function(input, limit, begin) { if (Math.abs(Number(limit)) === Infinity) { limit = Number(limit); } else { limit = toInt(limit); } if (isNaN(limit)) return input; if (isNumber(input)) input = input.toString(); if (!isArrayLike(input)) return input; begin = (!begin || isNaN(begin)) ? 0 : toInt(begin); begin = (begin < 0) ? Math.max(0, input.length + begin) : begin; if (limit >= 0) { return sliceFn(input, begin, begin + limit); } else { if (begin === 0) { return sliceFn(input, limit, input.length); } else { return sliceFn(input, Math.max(0, begin + limit), begin); } } }; } function sliceFn(input, begin, end) { if (isString(input)) return input.slice(begin, end); return slice.call(input, begin, end); } /** * @ngdoc filter * @name orderBy * @kind function * * @description * Returns an array containing the items from the specified `collection`, ordered by a `comparator` * function based on the values computed using the `expression` predicate. * * For example, `[{id: 'foo'}, {id: 'bar'}] | orderBy:'id'` would result in * `[{id: 'bar'}, {id: 'foo'}]`. * * The `collection` can be an Array or array-like object (e.g. NodeList, jQuery object, TypedArray, * String, etc). * * The `expression` can be a single predicate, or a list of predicates each serving as a tie-breaker * for the preceeding one. The `expression` is evaluated against each item and the output is used * for comparing with other items. * * You can change the sorting order by setting `reverse` to `true`. By default, items are sorted in * ascending order. * * The comparison is done using the `comparator` function. If none is specified, a default, built-in * comparator is used (see below for details - in a nutshell, it compares numbers numerically and * strings alphabetically). * * ### Under the hood * * Ordering the specified `collection` happens in two phases: * * 1. All items are passed through the predicate (or predicates), and the returned values are saved * along with their type (`string`, `number` etc). For example, an item `{label: 'foo'}`, passed * through a predicate that extracts the value of the `label` property, would be transformed to: * ``` * { * value: 'foo', * type: 'string', * index: ... * } * ``` * 2. The comparator function is used to sort the items, based on the derived values, types and * indices. * * If you use a custom comparator, it will be called with pairs of objects of the form * `{value: ..., type: '...', index: ...}` and is expected to return `0` if the objects are equal * (as far as the comparator is concerned), `-1` if the 1st one should be ranked higher than the * second, or `1` otherwise. * * In order to ensure that the sorting will be deterministic across platforms, if none of the * specified predicates can distinguish between two items, `orderBy` will automatically introduce a * dummy predicate that returns the item's index as `value`. * (If you are using a custom comparator, make sure it can handle this predicate as well.) * * Finally, in an attempt to simplify things, if a predicate returns an object as the extracted * value for an item, `orderBy` will try to convert that object to a primitive value, before passing * it to the comparator. The following rules govern the conversion: * * 1. If the object has a `valueOf()` method that returns a primitive, its return value will be * used instead.
* (If the object has a `valueOf()` method that returns another object, then the returned object * will be used in subsequent steps.) * 2. If the object has a custom `toString()` method (i.e. not the one inherited from `Object`) that * returns a primitive, its return value will be used instead.
* (If the object has a `toString()` method that returns another object, then the returned object * will be used in subsequent steps.) * 3. No conversion; the object itself is used. * * ### The default comparator * * The default, built-in comparator should be sufficient for most usecases. In short, it compares * numbers numerically, strings alphabetically (and case-insensitively), for objects falls back to * using their index in the original collection, and sorts values of different types by type. * * More specifically, it follows these steps to determine the relative order of items: * * 1. If the compared values are of different types, compare the types themselves alphabetically. * 2. If both values are of type `string`, compare them alphabetically in a case- and * locale-insensitive way. * 3. If both values are objects, compare their indices instead. * 4. Otherwise, return: * - `0`, if the values are equal (by strict equality comparison, i.e. using `===`). * - `-1`, if the 1st value is "less than" the 2nd value (compared using the `<` operator). * - `1`, otherwise. * * **Note:** If you notice numbers not being sorted as expected, make sure they are actually being * saved as numbers and not strings. * * @param {Array|ArrayLike} collection - The collection (array or array-like object) to sort. * @param {(Function|string|Array.)=} expression - A predicate (or list of * predicates) to be used by the comparator to determine the order of elements. * * Can be one of: * * - `Function`: A getter function. This function will be called with each item as argument and * the return value will be used for sorting. * - `string`: An Angular expression. This expression will be evaluated against each item and the * result will be used for sorting. For example, use `'label'` to sort by a property called * `label` or `'label.substring(0, 3)'` to sort by the first 3 characters of the `label` * property.
* (The result of a constant expression is interpreted as a property name to be used for * comparison. For example, use `'"special name"'` (note the extra pair of quotes) to sort by a * property called `special name`.)
* An expression can be optionally prefixed with `+` or `-` to control the sorting direction, * ascending or descending. For example, `'+label'` or `'-label'`. If no property is provided, * (e.g. `'+'` or `'-'`), the collection element itself is used in comparisons. * - `Array`: An array of function and/or string predicates. If a predicate cannot determine the * relative order of two items, the next predicate is used as a tie-breaker. * * **Note:** If the predicate is missing or empty then it defaults to `'+'`. * * @param {boolean=} reverse - If `true`, reverse the sorting order. * @param {(Function)=} comparator - The comparator function used to determine the relative order of * value pairs. If omitted, the built-in comparator will be used. * * @returns {Array} - The sorted array. * * * @example * ### Ordering a table with `ngRepeat` * * The example below demonstrates a simple {@link ngRepeat ngRepeat}, where the data is sorted by * age in descending order (expression is set to `'-age'`). The `comparator` is not set, which means * it defaults to the built-in comparator. *
Name Phone Number Age
{{friend.name}} {{friend.phone}} {{friend.age}}
angular.module('orderByExample1', []) .controller('ExampleController', ['$scope', function($scope) { $scope.friends = [ {name: 'John', phone: '555-1212', age: 10}, {name: 'Mary', phone: '555-9876', age: 19}, {name: 'Mike', phone: '555-4321', age: 21}, {name: 'Adam', phone: '555-5678', age: 35}, {name: 'Julie', phone: '555-8765', age: 29} ]; }]); .friends { border-collapse: collapse; } .friends th { border-bottom: 1px solid; } .friends td, .friends th { border-left: 1px solid; padding: 5px 10px; } .friends td:first-child, .friends th:first-child { border-left: none; } // Element locators var names = element.all(by.repeater('friends').column('friend.name')); it('should sort friends by age in reverse order', function() { expect(names.get(0).getText()).toBe('Adam'); expect(names.get(1).getText()).toBe('Julie'); expect(names.get(2).getText()).toBe('Mike'); expect(names.get(3).getText()).toBe('Mary'); expect(names.get(4).getText()).toBe('John'); });
*
* * @example * ### Changing parameters dynamically * * All parameters can be changed dynamically. The next example shows how you can make the columns of * a table sortable, by binding the `expression` and `reverse` parameters to scope properties. *
Sort by = {{propertyName}}; reverse = {{reverse}}


{{friend.name}} {{friend.phone}} {{friend.age}}
angular.module('orderByExample2', []) .controller('ExampleController', ['$scope', function($scope) { var friends = [ {name: 'John', phone: '555-1212', age: 10}, {name: 'Mary', phone: '555-9876', age: 19}, {name: 'Mike', phone: '555-4321', age: 21}, {name: 'Adam', phone: '555-5678', age: 35}, {name: 'Julie', phone: '555-8765', age: 29} ]; $scope.propertyName = 'age'; $scope.reverse = true; $scope.friends = friends; $scope.sortBy = function(propertyName) { $scope.reverse = ($scope.propertyName === propertyName) ? !$scope.reverse : false; $scope.propertyName = propertyName; }; }]); .friends { border-collapse: collapse; } .friends th { border-bottom: 1px solid; } .friends td, .friends th { border-left: 1px solid; padding: 5px 10px; } .friends td:first-child, .friends th:first-child { border-left: none; } .sortorder:after { content: '\25b2'; // BLACK UP-POINTING TRIANGLE } .sortorder.reverse:after { content: '\25bc'; // BLACK DOWN-POINTING TRIANGLE } // Element locators var unsortButton = element(by.partialButtonText('unsorted')); var nameHeader = element(by.partialButtonText('Name')); var phoneHeader = element(by.partialButtonText('Phone')); var ageHeader = element(by.partialButtonText('Age')); var firstName = element(by.repeater('friends').column('friend.name').row(0)); var lastName = element(by.repeater('friends').column('friend.name').row(4)); it('should sort friends by some property, when clicking on the column header', function() { expect(firstName.getText()).toBe('Adam'); expect(lastName.getText()).toBe('John'); phoneHeader.click(); expect(firstName.getText()).toBe('John'); expect(lastName.getText()).toBe('Mary'); nameHeader.click(); expect(firstName.getText()).toBe('Adam'); expect(lastName.getText()).toBe('Mike'); ageHeader.click(); expect(firstName.getText()).toBe('John'); expect(lastName.getText()).toBe('Adam'); }); it('should sort friends in reverse order, when clicking on the same column', function() { expect(firstName.getText()).toBe('Adam'); expect(lastName.getText()).toBe('John'); ageHeader.click(); expect(firstName.getText()).toBe('John'); expect(lastName.getText()).toBe('Adam'); ageHeader.click(); expect(firstName.getText()).toBe('Adam'); expect(lastName.getText()).toBe('John'); }); it('should restore the original order, when clicking "Set to unsorted"', function() { expect(firstName.getText()).toBe('Adam'); expect(lastName.getText()).toBe('John'); unsortButton.click(); expect(firstName.getText()).toBe('John'); expect(lastName.getText()).toBe('Julie'); });
*
* * @example * ### Using `orderBy` inside a controller * * It is also possible to call the `orderBy` filter manually, by injecting `orderByFilter`, and * calling it with the desired parameters. (Alternatively, you could inject the `$filter` factory * and retrieve the `orderBy` filter with `$filter('orderBy')`.) *
Sort by = {{propertyName}}; reverse = {{reverse}}


{{friend.name}} {{friend.phone}} {{friend.age}}
angular.module('orderByExample3', []) .controller('ExampleController', ['$scope', 'orderByFilter', function($scope, orderBy) { var friends = [ {name: 'John', phone: '555-1212', age: 10}, {name: 'Mary', phone: '555-9876', age: 19}, {name: 'Mike', phone: '555-4321', age: 21}, {name: 'Adam', phone: '555-5678', age: 35}, {name: 'Julie', phone: '555-8765', age: 29} ]; $scope.propertyName = 'age'; $scope.reverse = true; $scope.friends = orderBy(friends, $scope.propertyName, $scope.reverse); $scope.sortBy = function(propertyName) { $scope.reverse = (propertyName !== null && $scope.propertyName === propertyName) ? !$scope.reverse : false; $scope.propertyName = propertyName; $scope.friends = orderBy(friends, $scope.propertyName, $scope.reverse); }; }]); .friends { border-collapse: collapse; } .friends th { border-bottom: 1px solid; } .friends td, .friends th { border-left: 1px solid; padding: 5px 10px; } .friends td:first-child, .friends th:first-child { border-left: none; } .sortorder:after { content: '\25b2'; // BLACK UP-POINTING TRIANGLE } .sortorder.reverse:after { content: '\25bc'; // BLACK DOWN-POINTING TRIANGLE } // Element locators var unsortButton = element(by.partialButtonText('unsorted')); var nameHeader = element(by.partialButtonText('Name')); var phoneHeader = element(by.partialButtonText('Phone')); var ageHeader = element(by.partialButtonText('Age')); var firstName = element(by.repeater('friends').column('friend.name').row(0)); var lastName = element(by.repeater('friends').column('friend.name').row(4)); it('should sort friends by some property, when clicking on the column header', function() { expect(firstName.getText()).toBe('Adam'); expect(lastName.getText()).toBe('John'); phoneHeader.click(); expect(firstName.getText()).toBe('John'); expect(lastName.getText()).toBe('Mary'); nameHeader.click(); expect(firstName.getText()).toBe('Adam'); expect(lastName.getText()).toBe('Mike'); ageHeader.click(); expect(firstName.getText()).toBe('John'); expect(lastName.getText()).toBe('Adam'); }); it('should sort friends in reverse order, when clicking on the same column', function() { expect(firstName.getText()).toBe('Adam'); expect(lastName.getText()).toBe('John'); ageHeader.click(); expect(firstName.getText()).toBe('John'); expect(lastName.getText()).toBe('Adam'); ageHeader.click(); expect(firstName.getText()).toBe('Adam'); expect(lastName.getText()).toBe('John'); }); it('should restore the original order, when clicking "Set to unsorted"', function() { expect(firstName.getText()).toBe('Adam'); expect(lastName.getText()).toBe('John'); unsortButton.click(); expect(firstName.getText()).toBe('John'); expect(lastName.getText()).toBe('Julie'); });
*
* * @example * ### Using a custom comparator * * If you have very specific requirements about the way items are sorted, you can pass your own * comparator function. For example, you might need to compare some strings in a locale-sensitive * way. (When specifying a custom comparator, you also need to pass a value for the `reverse` * argument - passing `false` retains the default sorting order, i.e. ascending.) *

Locale-sensitive Comparator

Name Favorite Letter
{{friend.name}} {{friend.favoriteLetter}}

Default Comparator

Name Favorite Letter
{{friend.name}} {{friend.favoriteLetter}}
angular.module('orderByExample4', []) .controller('ExampleController', ['$scope', function($scope) { $scope.friends = [ {name: 'John', favoriteLetter: 'Ä'}, {name: 'Mary', favoriteLetter: 'Ü'}, {name: 'Mike', favoriteLetter: 'Ö'}, {name: 'Adam', favoriteLetter: 'H'}, {name: 'Julie', favoriteLetter: 'Z'} ]; $scope.localeSensitiveComparator = function(v1, v2) { // If we don't get strings, just compare by index if (v1.type !== 'string' || v2.type !== 'string') { return (v1.index < v2.index) ? -1 : 1; } // Compare strings alphabetically, taking locale into account return v1.value.localeCompare(v2.value); }; }]); .friends-container { display: inline-block; margin: 0 30px; } .friends { border-collapse: collapse; } .friends th { border-bottom: 1px solid; } .friends td, .friends th { border-left: 1px solid; padding: 5px 10px; } .friends td:first-child, .friends th:first-child { border-left: none; } // Element locators var container = element(by.css('.custom-comparator')); var names = container.all(by.repeater('friends').column('friend.name')); it('should sort friends by favorite letter (in correct alphabetical order)', function() { expect(names.get(0).getText()).toBe('John'); expect(names.get(1).getText()).toBe('Adam'); expect(names.get(2).getText()).toBe('Mike'); expect(names.get(3).getText()).toBe('Mary'); expect(names.get(4).getText()).toBe('Julie'); });
* */ orderByFilter.$inject = ['$parse']; function orderByFilter($parse) { return function(array, sortPredicate, reverseOrder, compareFn) { if (array == null) return array; if (!isArrayLike(array)) { throw minErr('orderBy')('notarray', 'Expected array but received: {0}', array); } if (!isArray(sortPredicate)) { sortPredicate = [sortPredicate]; } if (sortPredicate.length === 0) { sortPredicate = ['+']; } var predicates = processPredicates(sortPredicate); var descending = reverseOrder ? -1 : 1; // Define the `compare()` function. Use a default comparator if none is specified. var compare = isFunction(compareFn) ? compareFn : defaultCompare; // The next three lines are a version of a Swartzian Transform idiom from Perl // (sometimes called the Decorate-Sort-Undecorate idiom) // See https://en.wikipedia.org/wiki/Schwartzian_transform var compareValues = Array.prototype.map.call(array, getComparisonObject); compareValues.sort(doComparison); array = compareValues.map(function(item) { return item.value; }); return array; function getComparisonObject(value, index) { // NOTE: We are adding an extra `tieBreaker` value based on the element's index. // This will be used to keep the sort stable when none of the input predicates can // distinguish between two elements. return { value: value, tieBreaker: {value: index, type: 'number', index: index}, predicateValues: predicates.map(function(predicate) { return getPredicateValue(predicate.get(value), index); }) }; } function doComparison(v1, v2) { for (var i = 0, ii = predicates.length; i < ii; i++) { var result = compare(v1.predicateValues[i], v2.predicateValues[i]); if (result) { return result * predicates[i].descending * descending; } } return compare(v1.tieBreaker, v2.tieBreaker) * descending; } }; function processPredicates(sortPredicates) { return sortPredicates.map(function(predicate) { var descending = 1, get = identity; if (isFunction(predicate)) { get = predicate; } else if (isString(predicate)) { if ((predicate.charAt(0) == '+' || predicate.charAt(0) == '-')) { descending = predicate.charAt(0) == '-' ? -1 : 1; predicate = predicate.substring(1); } if (predicate !== '') { get = $parse(predicate); if (get.constant) { var key = get(); get = function(value) { return value[key]; }; } } } return {get: get, descending: descending}; }); } function isPrimitive(value) { switch (typeof value) { case 'number': /* falls through */ case 'boolean': /* falls through */ case 'string': return true; default: return false; } } function objectValue(value) { // If `valueOf` is a valid function use that if (isFunction(value.valueOf)) { value = value.valueOf(); if (isPrimitive(value)) return value; } // If `toString` is a valid function and not the one from `Object.prototype` use that if (hasCustomToString(value)) { value = value.toString(); if (isPrimitive(value)) return value; } return value; } function getPredicateValue(value, index) { var type = typeof value; if (value === null) { type = 'string'; value = 'null'; } else if (type === 'object') { value = objectValue(value); } return {value: value, type: type, index: index}; } function defaultCompare(v1, v2) { var result = 0; var type1 = v1.type; var type2 = v2.type; if (type1 === type2) { var value1 = v1.value; var value2 = v2.value; if (type1 === 'string') { // Compare strings case-insensitively value1 = value1.toLowerCase(); value2 = value2.toLowerCase(); } else if (type1 === 'object') { // For basic objects, use the position of the object // in the collection instead of the value if (isObject(value1)) value1 = v1.index; if (isObject(value2)) value2 = v2.index; } if (value1 !== value2) { result = value1 < value2 ? -1 : 1; } } else { result = type1 < type2 ? -1 : 1; } return result; } } function ngDirective(directive) { if (isFunction(directive)) { directive = { link: directive }; } directive.restrict = directive.restrict || 'AC'; return valueFn(directive); } /** * @ngdoc directive * @name a * @restrict E * * @description * Modifies the default behavior of the html A tag so that the default action is prevented when * the href attribute is empty. * * This change permits the easy creation of action links with the `ngClick` directive * without changing the location or causing page reloads, e.g.: * `Add Item` */ var htmlAnchorDirective = valueFn({ restrict: 'E', compile: function(element, attr) { if (!attr.href && !attr.xlinkHref) { return function(scope, element) { // If the linked element is not an anchor tag anymore, do nothing if (element[0].nodeName.toLowerCase() !== 'a') return; // SVGAElement does not use the href attribute, but rather the 'xlinkHref' attribute. var href = toString.call(element.prop('href')) === '[object SVGAnimatedString]' ? 'xlink:href' : 'href'; element.on('click', function(event) { // if we have no href url, then don't navigate anywhere. if (!element.attr(href)) { event.preventDefault(); } }); }; } } }); /** * @ngdoc directive * @name ngHref * @restrict A * @priority 99 * * @description * Using Angular markup like `{{hash}}` in an href attribute will * make the link go to the wrong URL if the user clicks it before * Angular has a chance to replace the `{{hash}}` markup with its * value. Until Angular replaces the markup the link will be broken * and will most likely return a 404 error. The `ngHref` directive * solves this problem. * * The wrong way to write it: * ```html * link1 * ``` * * The correct way to write it: * ```html * link1 * ``` * * @element A * @param {template} ngHref any string which can contain `{{}}` markup. * * @example * This example shows various combinations of `href`, `ng-href` and `ng-click` attributes * in links and their different behaviors:
link 1 (link, don't reload)
link 2 (link, don't reload)
link 3 (link, reload!)
anchor (link, don't reload)
anchor (no link)
link (link, change location)
it('should execute ng-click but not reload when href without value', function() { element(by.id('link-1')).click(); expect(element(by.model('value')).getAttribute('value')).toEqual('1'); expect(element(by.id('link-1')).getAttribute('href')).toBe(''); }); it('should execute ng-click but not reload when href empty string', function() { element(by.id('link-2')).click(); expect(element(by.model('value')).getAttribute('value')).toEqual('2'); expect(element(by.id('link-2')).getAttribute('href')).toBe(''); }); it('should execute ng-click and change url when ng-href specified', function() { expect(element(by.id('link-3')).getAttribute('href')).toMatch(/\/123$/); element(by.id('link-3')).click(); // At this point, we navigate away from an Angular page, so we need // to use browser.driver to get the base webdriver. browser.wait(function() { return browser.driver.getCurrentUrl().then(function(url) { return url.match(/\/123$/); }); }, 5000, 'page should navigate to /123'); }); it('should execute ng-click but not reload when href empty string and name specified', function() { element(by.id('link-4')).click(); expect(element(by.model('value')).getAttribute('value')).toEqual('4'); expect(element(by.id('link-4')).getAttribute('href')).toBe(''); }); it('should execute ng-click but not reload when no href but name specified', function() { element(by.id('link-5')).click(); expect(element(by.model('value')).getAttribute('value')).toEqual('5'); expect(element(by.id('link-5')).getAttribute('href')).toBe(null); }); it('should only change url when only ng-href', function() { element(by.model('value')).clear(); element(by.model('value')).sendKeys('6'); expect(element(by.id('link-6')).getAttribute('href')).toMatch(/\/6$/); element(by.id('link-6')).click(); // At this point, we navigate away from an Angular page, so we need // to use browser.driver to get the base webdriver. browser.wait(function() { return browser.driver.getCurrentUrl().then(function(url) { return url.match(/\/6$/); }); }, 5000, 'page should navigate to /6'); });
*/ /** * @ngdoc directive * @name ngSrc * @restrict A * @priority 99 * * @description * Using Angular markup like `{{hash}}` in a `src` attribute doesn't * work right: The browser will fetch from the URL with the literal * text `{{hash}}` until Angular replaces the expression inside * `{{hash}}`. The `ngSrc` directive solves this problem. * * The buggy way to write it: * ```html * Description * ``` * * The correct way to write it: * ```html * Description * ``` * * @element IMG * @param {template} ngSrc any string which can contain `{{}}` markup. */ /** * @ngdoc directive * @name ngSrcset * @restrict A * @priority 99 * * @description * Using Angular markup like `{{hash}}` in a `srcset` attribute doesn't * work right: The browser will fetch from the URL with the literal * text `{{hash}}` until Angular replaces the expression inside * `{{hash}}`. The `ngSrcset` directive solves this problem. * * The buggy way to write it: * ```html * Description * ``` * * The correct way to write it: * ```html * Description * ``` * * @element IMG * @param {template} ngSrcset any string which can contain `{{}}` markup. */ /** * @ngdoc directive * @name ngDisabled * @restrict A * @priority 100 * * @description * * This directive sets the `disabled` attribute on the element if the * {@link guide/expression expression} inside `ngDisabled` evaluates to truthy. * * A special directive is necessary because we cannot use interpolation inside the `disabled` * attribute. See the {@link guide/interpolation interpolation guide} for more info. * * @example
it('should toggle button', function() { expect(element(by.css('button')).getAttribute('disabled')).toBeFalsy(); element(by.model('checked')).click(); expect(element(by.css('button')).getAttribute('disabled')).toBeTruthy(); });
* * @element INPUT * @param {expression} ngDisabled If the {@link guide/expression expression} is truthy, * then the `disabled` attribute will be set on the element */ /** * @ngdoc directive * @name ngChecked * @restrict A * @priority 100 * * @description * Sets the `checked` attribute on the element, if the expression inside `ngChecked` is truthy. * * Note that this directive should not be used together with {@link ngModel `ngModel`}, * as this can lead to unexpected behavior. * * A special directive is necessary because we cannot use interpolation inside the `checked` * attribute. See the {@link guide/interpolation interpolation guide} for more info. * * @example
it('should check both checkBoxes', function() { expect(element(by.id('checkSlave')).getAttribute('checked')).toBeFalsy(); element(by.model('master')).click(); expect(element(by.id('checkSlave')).getAttribute('checked')).toBeTruthy(); });
* * @element INPUT * @param {expression} ngChecked If the {@link guide/expression expression} is truthy, * then the `checked` attribute will be set on the element */ /** * @ngdoc directive * @name ngReadonly * @restrict A * @priority 100 * * @description * * Sets the `readOnly` attribute on the element, if the expression inside `ngReadonly` is truthy. * * A special directive is necessary because we cannot use interpolation inside the `readOnly` * attribute. See the {@link guide/interpolation interpolation guide} for more info. * * @example
it('should toggle readonly attr', function() { expect(element(by.css('[type="text"]')).getAttribute('readonly')).toBeFalsy(); element(by.model('checked')).click(); expect(element(by.css('[type="text"]')).getAttribute('readonly')).toBeTruthy(); });
* * @element INPUT * @param {expression} ngReadonly If the {@link guide/expression expression} is truthy, * then special attribute "readonly" will be set on the element */ /** * @ngdoc directive * @name ngSelected * @restrict A * @priority 100 * * @description * * Sets the `selected` attribute on the element, if the expression inside `ngSelected` is truthy. * * A special directive is necessary because we cannot use interpolation inside the `selected` * attribute. See the {@link guide/interpolation interpolation guide} for more info. * * @example
it('should select Greetings!', function() { expect(element(by.id('greet')).getAttribute('selected')).toBeFalsy(); element(by.model('selected')).click(); expect(element(by.id('greet')).getAttribute('selected')).toBeTruthy(); });
* * @element OPTION * @param {expression} ngSelected If the {@link guide/expression expression} is truthy, * then special attribute "selected" will be set on the element */ /** * @ngdoc directive * @name ngOpen * @restrict A * @priority 100 * * @description * * Sets the `open` attribute on the element, if the expression inside `ngOpen` is truthy. * * A special directive is necessary because we cannot use interpolation inside the `open` * attribute. See the {@link guide/interpolation interpolation guide} for more info. * * @example
Show/Hide me
it('should toggle open', function() { expect(element(by.id('details')).getAttribute('open')).toBeFalsy(); element(by.model('open')).click(); expect(element(by.id('details')).getAttribute('open')).toBeTruthy(); });
* * @element DETAILS * @param {expression} ngOpen If the {@link guide/expression expression} is truthy, * then special attribute "open" will be set on the element */ var ngAttributeAliasDirectives = {}; // boolean attrs are evaluated forEach(BOOLEAN_ATTR, function(propName, attrName) { // binding to multiple is not supported if (propName == "multiple") return; function defaultLinkFn(scope, element, attr) { scope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value) { attr.$set(attrName, !!value); }); } var normalized = directiveNormalize('ng-' + attrName); var linkFn = defaultLinkFn; if (propName === 'checked') { linkFn = function(scope, element, attr) { // ensuring ngChecked doesn't interfere with ngModel when both are set on the same input if (attr.ngModel !== attr[normalized]) { defaultLinkFn(scope, element, attr); } }; } ngAttributeAliasDirectives[normalized] = function() { return { restrict: 'A', priority: 100, link: linkFn }; }; }); // aliased input attrs are evaluated forEach(ALIASED_ATTR, function(htmlAttr, ngAttr) { ngAttributeAliasDirectives[ngAttr] = function() { return { priority: 100, link: function(scope, element, attr) { //special case ngPattern when a literal regular expression value //is used as the expression (this way we don't have to watch anything). if (ngAttr === "ngPattern" && attr.ngPattern.charAt(0) == "/") { var match = attr.ngPattern.match(REGEX_STRING_REGEXP); if (match) { attr.$set("ngPattern", new RegExp(match[1], match[2])); return; } } scope.$watch(attr[ngAttr], function ngAttrAliasWatchAction(value) { attr.$set(ngAttr, value); }); } }; }; }); // ng-src, ng-srcset, ng-href are interpolated forEach(['src', 'srcset', 'href'], function(attrName) { var normalized = directiveNormalize('ng-' + attrName); ngAttributeAliasDirectives[normalized] = function() { return { priority: 99, // it needs to run after the attributes are interpolated link: function(scope, element, attr) { var propName = attrName, name = attrName; if (attrName === 'href' && toString.call(element.prop('href')) === '[object SVGAnimatedString]') { name = 'xlinkHref'; attr.$attr[name] = 'xlink:href'; propName = null; } attr.$observe(normalized, function(value) { if (!value) { if (attrName === 'href') { attr.$set(name, null); } return; } attr.$set(name, value); // on IE, if "ng:src" directive declaration is used and "src" attribute doesn't exist // then calling element.setAttribute('src', 'foo') doesn't do anything, so we need // to set the property as well to achieve the desired effect. // we use attr[attrName] value since $set can sanitize the url. if (msie && propName) element.prop(propName, attr[name]); }); } }; }; }); /* global -nullFormCtrl, -SUBMITTED_CLASS, addSetValidityMethod: true */ var nullFormCtrl = { $addControl: noop, $$renameControl: nullFormRenameControl, $removeControl: noop, $setValidity: noop, $setDirty: noop, $setPristine: noop, $setSubmitted: noop }, SUBMITTED_CLASS = 'ng-submitted'; function nullFormRenameControl(control, name) { control.$name = name; } /** * @ngdoc type * @name form.FormController * * @property {boolean} $pristine True if user has not interacted with the form yet. * @property {boolean} $dirty True if user has already interacted with the form. * @property {boolean} $valid True if all of the containing forms and controls are valid. * @property {boolean} $invalid True if at least one containing control or form is invalid. * @property {boolean} $pending True if at least one containing control or form is pending. * @property {boolean} $submitted True if user has submitted the form even if its invalid. * * @property {Object} $error Is an object hash, containing references to controls or * forms with failing validators, where: * * - keys are validation tokens (error names), * - values are arrays of controls or forms that have a failing validator for given error name. * * Built-in validation tokens: * * - `email` * - `max` * - `maxlength` * - `min` * - `minlength` * - `number` * - `pattern` * - `required` * - `url` * - `date` * - `datetimelocal` * - `time` * - `week` * - `month` * * @description * `FormController` keeps track of all its controls and nested forms as well as the state of them, * such as being valid/invalid or dirty/pristine. * * Each {@link ng.directive:form form} directive creates an instance * of `FormController`. * */ //asks for $scope to fool the BC controller module FormController.$inject = ['$element', '$attrs', '$scope', '$animate', '$interpolate']; function FormController(element, attrs, $scope, $animate, $interpolate) { var form = this, controls = []; // init state form.$error = {}; form.$$success = {}; form.$pending = undefined; form.$name = $interpolate(attrs.name || attrs.ngForm || '')($scope); form.$dirty = false; form.$pristine = true; form.$valid = true; form.$invalid = false; form.$submitted = false; form.$$parentForm = nullFormCtrl; /** * @ngdoc method * @name form.FormController#$rollbackViewValue * * @description * Rollback all form controls pending updates to the `$modelValue`. * * Updates may be pending by a debounced event or because the input is waiting for a some future * event defined in `ng-model-options`. This method is typically needed by the reset button of * a form that uses `ng-model-options` to pend updates. */ form.$rollbackViewValue = function() { forEach(controls, function(control) { control.$rollbackViewValue(); }); }; /** * @ngdoc method * @name form.FormController#$commitViewValue * * @description * Commit all form controls pending updates to the `$modelValue`. * * Updates may be pending by a debounced event or because the input is waiting for a some future * event defined in `ng-model-options`. This method is rarely needed as `NgModelController` * usually handles calling this in response to input events. */ form.$commitViewValue = function() { forEach(controls, function(control) { control.$commitViewValue(); }); }; /** * @ngdoc method * @name form.FormController#$addControl * @param {object} control control object, either a {@link form.FormController} or an * {@link ngModel.NgModelController} * * @description * Register a control with the form. Input elements using ngModelController do this automatically * when they are linked. * * Note that the current state of the control will not be reflected on the new parent form. This * is not an issue with normal use, as freshly compiled and linked controls are in a `$pristine` * state. * * However, if the method is used programmatically, for example by adding dynamically created controls, * or controls that have been previously removed without destroying their corresponding DOM element, * it's the developers responsibility to make sure the current state propagates to the parent form. * * For example, if an input control is added that is already `$dirty` and has `$error` properties, * calling `$setDirty()` and `$validate()` afterwards will propagate the state to the parent form. */ form.$addControl = function(control) { // Breaking change - before, inputs whose name was "hasOwnProperty" were quietly ignored // and not added to the scope. Now we throw an error. assertNotHasOwnProperty(control.$name, 'input'); controls.push(control); if (control.$name) { form[control.$name] = control; } control.$$parentForm = form; }; // Private API: rename a form control form.$$renameControl = function(control, newName) { var oldName = control.$name; if (form[oldName] === control) { delete form[oldName]; } form[newName] = control; control.$name = newName; }; /** * @ngdoc method * @name form.FormController#$removeControl * @param {object} control control object, either a {@link form.FormController} or an * {@link ngModel.NgModelController} * * @description * Deregister a control from the form. * * Input elements using ngModelController do this automatically when they are destroyed. * * Note that only the removed control's validation state (`$errors`etc.) will be removed from the * form. `$dirty`, `$submitted` states will not be changed, because the expected behavior can be * different from case to case. For example, removing the only `$dirty` control from a form may or * may not mean that the form is still `$dirty`. */ form.$removeControl = function(control) { if (control.$name && form[control.$name] === control) { delete form[control.$name]; } forEach(form.$pending, function(value, name) { form.$setValidity(name, null, control); }); forEach(form.$error, function(value, name) { form.$setValidity(name, null, control); }); forEach(form.$$success, function(value, name) { form.$setValidity(name, null, control); }); arrayRemove(controls, control); control.$$parentForm = nullFormCtrl; }; /** * @ngdoc method * @name form.FormController#$setValidity * * @description * Sets the validity of a form control. * * This method will also propagate to parent forms. */ addSetValidityMethod({ ctrl: this, $element: element, set: function(object, property, controller) { var list = object[property]; if (!list) { object[property] = [controller]; } else { var index = list.indexOf(controller); if (index === -1) { list.push(controller); } } }, unset: function(object, property, controller) { var list = object[property]; if (!list) { return; } arrayRemove(list, controller); if (list.length === 0) { delete object[property]; } }, $animate: $animate }); /** * @ngdoc method * @name form.FormController#$setDirty * * @description * Sets the form to a dirty state. * * This method can be called to add the 'ng-dirty' class and set the form to a dirty * state (ng-dirty class). This method will also propagate to parent forms. */ form.$setDirty = function() { $animate.removeClass(element, PRISTINE_CLASS); $animate.addClass(element, DIRTY_CLASS); form.$dirty = true; form.$pristine = false; form.$$parentForm.$setDirty(); }; /** * @ngdoc method * @name form.FormController#$setPristine * * @description * Sets the form to its pristine state. * * This method can be called to remove the 'ng-dirty' class and set the form to its pristine * state (ng-pristine class). This method will also propagate to all the controls contained * in this form. * * Setting a form back to a pristine state is often useful when we want to 'reuse' a form after * saving or resetting it. */ form.$setPristine = function() { $animate.setClass(element, PRISTINE_CLASS, DIRTY_CLASS + ' ' + SUBMITTED_CLASS); form.$dirty = false; form.$pristine = true; form.$submitted = false; forEach(controls, function(control) { control.$setPristine(); }); }; /** * @ngdoc method * @name form.FormController#$setUntouched * * @description * Sets the form to its untouched state. * * This method can be called to remove the 'ng-touched' class and set the form controls to their * untouched state (ng-untouched class). * * Setting a form controls back to their untouched state is often useful when setting the form * back to its pristine state. */ form.$setUntouched = function() { forEach(controls, function(control) { control.$setUntouched(); }); }; /** * @ngdoc method * @name form.FormController#$setSubmitted * * @description * Sets the form to its submitted state. */ form.$setSubmitted = function() { $animate.addClass(element, SUBMITTED_CLASS); form.$submitted = true; form.$$parentForm.$setSubmitted(); }; } /** * @ngdoc directive * @name ngForm * @restrict EAC * * @description * Nestable alias of {@link ng.directive:form `form`} directive. HTML * does not allow nesting of form elements. It is useful to nest forms, for example if the validity of a * sub-group of controls needs to be determined. * * Note: the purpose of `ngForm` is to group controls, * but not to be a replacement for the `
` tag with all of its capabilities * (e.g. posting to the server, ...). * * @param {string=} ngForm|name Name of the form. If specified, the form controller will be published into * related scope, under this name. * */ /** * @ngdoc directive * @name form * @restrict E * * @description * Directive that instantiates * {@link form.FormController FormController}. * * If the `name` attribute is specified, the form controller is published onto the current scope under * this name. * * # Alias: {@link ng.directive:ngForm `ngForm`} * * In Angular, forms can be nested. This means that the outer form is valid when all of the child * forms are valid as well. However, browsers do not allow nesting of `` elements, so * Angular provides the {@link ng.directive:ngForm `ngForm`} directive, which behaves identically to * `form` but can be nested. Nested forms can be useful, for example, if the validity of a sub-group * of controls needs to be determined. * * # CSS classes * - `ng-valid` is set if the form is valid. * - `ng-invalid` is set if the form is invalid. * - `ng-pending` is set if the form is pending. * - `ng-pristine` is set if the form is pristine. * - `ng-dirty` is set if the form is dirty. * - `ng-submitted` is set if the form was submitted. * * Keep in mind that ngAnimate can detect each of these classes when added and removed. * * * # Submitting a form and preventing the default action * * Since the role of forms in client-side Angular applications is different than in classical * roundtrip apps, it is desirable for the browser not to translate the form submission into a full * page reload that sends the data to the server. Instead some javascript logic should be triggered * to handle the form submission in an application-specific way. * * For this reason, Angular prevents the default action (form submission to the server) unless the * `` element has an `action` attribute specified. * * You can use one of the following two ways to specify what javascript method should be called when * a form is submitted: * * - {@link ng.directive:ngSubmit ngSubmit} directive on the form element * - {@link ng.directive:ngClick ngClick} directive on the first * button or input field of type submit (input[type=submit]) * * To prevent double execution of the handler, use only one of the {@link ng.directive:ngSubmit ngSubmit} * or {@link ng.directive:ngClick ngClick} directives. * This is because of the following form submission rules in the HTML specification: * * - If a form has only one input field then hitting enter in this field triggers form submit * (`ngSubmit`) * - if a form has 2+ input fields and no buttons or input[type=submit] then hitting enter * doesn't trigger submit * - if a form has one or more input fields and one or more buttons or input[type=submit] then * hitting enter in any of the input fields will trigger the click handler on the *first* button or * input[type=submit] (`ngClick`) *and* a submit handler on the enclosing form (`ngSubmit`) * * Any pending `ngModelOptions` changes will take place immediately when an enclosing form is * submitted. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit` * to have access to the updated model. * * ## Animation Hooks * * Animations in ngForm are triggered when any of the associated CSS classes are added and removed. * These classes are: `.ng-pristine`, `.ng-dirty`, `.ng-invalid` and `.ng-valid` as well as any * other validations that are performed within the form. Animations in ngForm are similar to how * they work in ngClass and animations can be hooked into using CSS transitions, keyframes as well * as JS animations. * * The following example shows a simple way to utilize CSS transitions to style a form element * that has been rendered as invalid after it has been validated: * *
 * //be sure to include ngAnimate as a module to hook into more
 * //advanced animations
 * .my-form {
 *   transition:0.5s linear all;
 *   background: white;
 * }
 * .my-form.ng-invalid {
 *   background: red;
 *   color:white;
 * }
 * 
* * @example userType: Required!
userType = {{userType}}
myForm.input.$valid = {{myForm.input.$valid}}
myForm.input.$error = {{myForm.input.$error}}
myForm.$valid = {{myForm.$valid}}
myForm.$error.required = {{!!myForm.$error.required}}
it('should initialize to model', function() { var userType = element(by.binding('userType')); var valid = element(by.binding('myForm.input.$valid')); expect(userType.getText()).toContain('guest'); expect(valid.getText()).toContain('true'); }); it('should be invalid if empty', function() { var userType = element(by.binding('userType')); var valid = element(by.binding('myForm.input.$valid')); var userInput = element(by.model('userType')); userInput.clear(); userInput.sendKeys(''); expect(userType.getText()).toEqual('userType ='); expect(valid.getText()).toContain('false'); });
* * @param {string=} name Name of the form. If specified, the form controller will be published into * related scope, under this name. */ var formDirectiveFactory = function(isNgForm) { return ['$timeout', '$parse', function($timeout, $parse) { var formDirective = { name: 'form', restrict: isNgForm ? 'EAC' : 'E', require: ['form', '^^?form'], //first is the form's own ctrl, second is an optional parent form controller: FormController, compile: function ngFormCompile(formElement, attr) { // Setup initial state of the control formElement.addClass(PRISTINE_CLASS).addClass(VALID_CLASS); var nameAttr = attr.name ? 'name' : (isNgForm && attr.ngForm ? 'ngForm' : false); return { pre: function ngFormPreLink(scope, formElement, attr, ctrls) { var controller = ctrls[0]; // if `action` attr is not present on the form, prevent the default action (submission) if (!('action' in attr)) { // we can't use jq events because if a form is destroyed during submission the default // action is not prevented. see #1238 // // IE 9 is not affected because it doesn't fire a submit event and try to do a full // page reload if the form was destroyed by submission of the form via a click handler // on a button in the form. Looks like an IE9 specific bug. var handleFormSubmission = function(event) { scope.$apply(function() { controller.$commitViewValue(); controller.$setSubmitted(); }); event.preventDefault(); }; addEventListenerFn(formElement[0], 'submit', handleFormSubmission); // unregister the preventDefault listener so that we don't not leak memory but in a // way that will achieve the prevention of the default action. formElement.on('$destroy', function() { $timeout(function() { removeEventListenerFn(formElement[0], 'submit', handleFormSubmission); }, 0, false); }); } var parentFormCtrl = ctrls[1] || controller.$$parentForm; parentFormCtrl.$addControl(controller); var setter = nameAttr ? getSetter(controller.$name) : noop; if (nameAttr) { setter(scope, controller); attr.$observe(nameAttr, function(newValue) { if (controller.$name === newValue) return; setter(scope, undefined); controller.$$parentForm.$$renameControl(controller, newValue); setter = getSetter(controller.$name); setter(scope, controller); }); } formElement.on('$destroy', function() { controller.$$parentForm.$removeControl(controller); setter(scope, undefined); extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards }); } }; } }; return formDirective; function getSetter(expression) { if (expression === '') { //create an assignable expression, so forms with an empty name can be renamed later return $parse('this[""]').assign; } return $parse(expression).assign || noop; } }]; }; var formDirective = formDirectiveFactory(); var ngFormDirective = formDirectiveFactory(true); /* global VALID_CLASS: false, INVALID_CLASS: false, PRISTINE_CLASS: false, DIRTY_CLASS: false, UNTOUCHED_CLASS: false, TOUCHED_CLASS: false, ngModelMinErr: false, */ // Regex code was initially obtained from SO prior to modification: https://stackoverflow.com/questions/3143070/javascript-regex-iso-datetime#answer-3143231 var ISO_DATE_REGEXP = /^\d{4,}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+(?:[+-][0-2]\d:[0-5]\d|Z)$/; // See valid URLs in RFC3987 (http://tools.ietf.org/html/rfc3987) // Note: We are being more lenient, because browsers are too. // 1. Scheme // 2. Slashes // 3. Username // 4. Password // 5. Hostname // 6. Port // 7. Path // 8. Query // 9. Fragment // 1111111111111111 222 333333 44444 555555555555555555555555 666 77777777 8888888 999 var URL_REGEXP = /^[a-z][a-z\d.+-]*:\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\s:/?#]+|\[[a-f\d:]+\])(?::\d+)?(?:\/[^?#]*)?(?:\?[^#]*)?(?:#.*)?$/i; /* jshint maxlen:220 */ var EMAIL_REGEXP = /^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+\/0-9=?A-Z^_`a-z{|}~]+(\.[-!#$%&'*+\/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/; /* jshint maxlen:200 */ var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/; var DATE_REGEXP = /^(\d{4,})-(\d{2})-(\d{2})$/; var DATETIMELOCAL_REGEXP = /^(\d{4,})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/; var WEEK_REGEXP = /^(\d{4,})-W(\d\d)$/; var MONTH_REGEXP = /^(\d{4,})-(\d\d)$/; var TIME_REGEXP = /^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/; var PARTIAL_VALIDATION_EVENTS = 'keydown wheel mousedown'; var PARTIAL_VALIDATION_TYPES = createMap(); forEach('date,datetime-local,month,time,week'.split(','), function(type) { PARTIAL_VALIDATION_TYPES[type] = true; }); var inputType = { /** * @ngdoc input * @name input[text] * * @description * Standard HTML text input with angular data binding, inherited by most of the `input` elements. * * * @param {string} ngModel Assignable angular expression to data-bind to. * @param {string=} name Property name of the form under which the control is published. * @param {string=} required Adds `required` validation error key if the value is not entered. * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of * `required` when you want to data-bind to the `required` attribute. * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than * minlength. * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of * any length. * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string * that contains the regular expression body that will be converted to a regular expression * as in the ngPattern directive. * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue} * does not match a RegExp found by evaluating the Angular expression given in the attribute value. * If the expression evaluates to a RegExp object, then this is used directly. * If the expression evaluates to a string, then it will be converted to a RegExp * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to * `new RegExp('^abc$')`.
* **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to * start at the index of the last search's match, thus not taking the whole input value into * account. * @param {string=} ngChange Angular expression to be executed when input changes due to user * interaction with the input element. * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input. * This parameter is ignored for input[type=password] controls, which will never trim the * input. * * @example
Required! Single word only!
text = {{example.text}}
myForm.input.$valid = {{myForm.input.$valid}}
myForm.input.$error = {{myForm.input.$error}}
myForm.$valid = {{myForm.$valid}}
myForm.$error.required = {{!!myForm.$error.required}}
var text = element(by.binding('example.text')); var valid = element(by.binding('myForm.input.$valid')); var input = element(by.model('example.text')); it('should initialize to model', function() { expect(text.getText()).toContain('guest'); expect(valid.getText()).toContain('true'); }); it('should be invalid if empty', function() { input.clear(); input.sendKeys(''); expect(text.getText()).toEqual('text ='); expect(valid.getText()).toContain('false'); }); it('should be invalid if multi word', function() { input.clear(); input.sendKeys('hello world'); expect(valid.getText()).toContain('false'); });
*/ 'text': textInputType, /** * @ngdoc input * @name input[date] * * @description * Input with date validation and transformation. In browsers that do not yet support * the HTML5 date input, a text element will be used. In that case, text must be entered in a valid ISO-8601 * date format (yyyy-MM-dd), for example: `2009-01-06`. Since many * modern browsers do not yet support this input type, it is important to provide cues to users on the * expected input format via a placeholder or label. * * The model must always be a Date object, otherwise Angular will throw an error. * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. * * The timezone to be used to read/write the `Date` instance in the model can be defined using * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. * * @param {string} ngModel Assignable angular expression to data-bind to. * @param {string=} name Property name of the form under which the control is published. * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a * valid ISO date string (yyyy-MM-dd). You can also use interpolation inside this attribute * (e.g. `min="{{minDate | date:'yyyy-MM-dd'}}"`). Note that `min` will also add native HTML5 * constraint validation. * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be * a valid ISO date string (yyyy-MM-dd). You can also use interpolation inside this attribute * (e.g. `max="{{maxDate | date:'yyyy-MM-dd'}}"`). Note that `max` will also add native HTML5 * constraint validation. * @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO date string * the `ngMin` expression evaluates to. Note that it does not set the `min` attribute. * @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO date string * the `ngMax` expression evaluates to. Note that it does not set the `max` attribute. * @param {string=} required Sets `required` validation error key if the value is not entered. * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of * `required` when you want to data-bind to the `required` attribute. * @param {string=} ngChange Angular expression to be executed when input changes due to user * interaction with the input element. * * @example
Required! Not a valid date!
value = {{example.value | date: "yyyy-MM-dd"}}
myForm.input.$valid = {{myForm.input.$valid}}
myForm.input.$error = {{myForm.input.$error}}
myForm.$valid = {{myForm.$valid}}
myForm.$error.required = {{!!myForm.$error.required}}
var value = element(by.binding('example.value | date: "yyyy-MM-dd"')); var valid = element(by.binding('myForm.input.$valid')); var input = element(by.model('example.value')); // currently protractor/webdriver does not support // sending keys to all known HTML5 input controls // for various browsers (see https://github.com/angular/protractor/issues/562). function setInput(val) { // set the value of the element and force validation. var scr = "var ipt = document.getElementById('exampleInput'); " + "ipt.value = '" + val + "';" + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; browser.executeScript(scr); } it('should initialize to model', function() { expect(value.getText()).toContain('2013-10-22'); expect(valid.getText()).toContain('myForm.input.$valid = true'); }); it('should be invalid if empty', function() { setInput(''); expect(value.getText()).toEqual('value ='); expect(valid.getText()).toContain('myForm.input.$valid = false'); }); it('should be invalid if over max', function() { setInput('2015-01-01'); expect(value.getText()).toContain(''); expect(valid.getText()).toContain('myForm.input.$valid = false'); });
*/ 'date': createDateInputType('date', DATE_REGEXP, createDateParser(DATE_REGEXP, ['yyyy', 'MM', 'dd']), 'yyyy-MM-dd'), /** * @ngdoc input * @name input[datetime-local] * * @description * Input with datetime validation and transformation. In browsers that do not yet support * the HTML5 date input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 * local datetime format (yyyy-MM-ddTHH:mm:ss), for example: `2010-12-28T14:57:00`. * * The model must always be a Date object, otherwise Angular will throw an error. * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. * * The timezone to be used to read/write the `Date` instance in the model can be defined using * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. * * @param {string} ngModel Assignable angular expression to data-bind to. * @param {string=} name Property name of the form under which the control is published. * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. * This must be a valid ISO datetime format (yyyy-MM-ddTHH:mm:ss). You can also use interpolation * inside this attribute (e.g. `min="{{minDatetimeLocal | date:'yyyy-MM-ddTHH:mm:ss'}}"`). * Note that `min` will also add native HTML5 constraint validation. * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. * This must be a valid ISO datetime format (yyyy-MM-ddTHH:mm:ss). You can also use interpolation * inside this attribute (e.g. `max="{{maxDatetimeLocal | date:'yyyy-MM-ddTHH:mm:ss'}}"`). * Note that `max` will also add native HTML5 constraint validation. * @param {(date|string)=} ngMin Sets the `min` validation error key to the Date / ISO datetime string * the `ngMin` expression evaluates to. Note that it does not set the `min` attribute. * @param {(date|string)=} ngMax Sets the `max` validation error key to the Date / ISO datetime string * the `ngMax` expression evaluates to. Note that it does not set the `max` attribute. * @param {string=} required Sets `required` validation error key if the value is not entered. * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of * `required` when you want to data-bind to the `required` attribute. * @param {string=} ngChange Angular expression to be executed when input changes due to user * interaction with the input element. * * @example
Required! Not a valid date!
value = {{example.value | date: "yyyy-MM-ddTHH:mm:ss"}}
myForm.input.$valid = {{myForm.input.$valid}}
myForm.input.$error = {{myForm.input.$error}}
myForm.$valid = {{myForm.$valid}}
myForm.$error.required = {{!!myForm.$error.required}}
var value = element(by.binding('example.value | date: "yyyy-MM-ddTHH:mm:ss"')); var valid = element(by.binding('myForm.input.$valid')); var input = element(by.model('example.value')); // currently protractor/webdriver does not support // sending keys to all known HTML5 input controls // for various browsers (https://github.com/angular/protractor/issues/562). function setInput(val) { // set the value of the element and force validation. var scr = "var ipt = document.getElementById('exampleInput'); " + "ipt.value = '" + val + "';" + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; browser.executeScript(scr); } it('should initialize to model', function() { expect(value.getText()).toContain('2010-12-28T14:57:00'); expect(valid.getText()).toContain('myForm.input.$valid = true'); }); it('should be invalid if empty', function() { setInput(''); expect(value.getText()).toEqual('value ='); expect(valid.getText()).toContain('myForm.input.$valid = false'); }); it('should be invalid if over max', function() { setInput('2015-01-01T23:59:00'); expect(value.getText()).toContain(''); expect(valid.getText()).toContain('myForm.input.$valid = false'); });
*/ 'datetime-local': createDateInputType('datetimelocal', DATETIMELOCAL_REGEXP, createDateParser(DATETIMELOCAL_REGEXP, ['yyyy', 'MM', 'dd', 'HH', 'mm', 'ss', 'sss']), 'yyyy-MM-ddTHH:mm:ss.sss'), /** * @ngdoc input * @name input[time] * * @description * Input with time validation and transformation. In browsers that do not yet support * the HTML5 time input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 * local time format (HH:mm:ss), for example: `14:57:00`. Model must be a Date object. This binding will always output a * Date object to the model of January 1, 1970, or local date `new Date(1970, 0, 1, HH, mm, ss)`. * * The model must always be a Date object, otherwise Angular will throw an error. * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. * * The timezone to be used to read/write the `Date` instance in the model can be defined using * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. * * @param {string} ngModel Assignable angular expression to data-bind to. * @param {string=} name Property name of the form under which the control is published. * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. * This must be a valid ISO time format (HH:mm:ss). You can also use interpolation inside this * attribute (e.g. `min="{{minTime | date:'HH:mm:ss'}}"`). Note that `min` will also add * native HTML5 constraint validation. * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. * This must be a valid ISO time format (HH:mm:ss). You can also use interpolation inside this * attribute (e.g. `max="{{maxTime | date:'HH:mm:ss'}}"`). Note that `max` will also add * native HTML5 constraint validation. * @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO time string the * `ngMin` expression evaluates to. Note that it does not set the `min` attribute. * @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO time string the * `ngMax` expression evaluates to. Note that it does not set the `max` attribute. * @param {string=} required Sets `required` validation error key if the value is not entered. * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of * `required` when you want to data-bind to the `required` attribute. * @param {string=} ngChange Angular expression to be executed when input changes due to user * interaction with the input element. * * @example
Required! Not a valid date!
value = {{example.value | date: "HH:mm:ss"}}
myForm.input.$valid = {{myForm.input.$valid}}
myForm.input.$error = {{myForm.input.$error}}
myForm.$valid = {{myForm.$valid}}
myForm.$error.required = {{!!myForm.$error.required}}
var value = element(by.binding('example.value | date: "HH:mm:ss"')); var valid = element(by.binding('myForm.input.$valid')); var input = element(by.model('example.value')); // currently protractor/webdriver does not support // sending keys to all known HTML5 input controls // for various browsers (https://github.com/angular/protractor/issues/562). function setInput(val) { // set the value of the element and force validation. var scr = "var ipt = document.getElementById('exampleInput'); " + "ipt.value = '" + val + "';" + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; browser.executeScript(scr); } it('should initialize to model', function() { expect(value.getText()).toContain('14:57:00'); expect(valid.getText()).toContain('myForm.input.$valid = true'); }); it('should be invalid if empty', function() { setInput(''); expect(value.getText()).toEqual('value ='); expect(valid.getText()).toContain('myForm.input.$valid = false'); }); it('should be invalid if over max', function() { setInput('23:59:00'); expect(value.getText()).toContain(''); expect(valid.getText()).toContain('myForm.input.$valid = false'); });
*/ 'time': createDateInputType('time', TIME_REGEXP, createDateParser(TIME_REGEXP, ['HH', 'mm', 'ss', 'sss']), 'HH:mm:ss.sss'), /** * @ngdoc input * @name input[week] * * @description * Input with week-of-the-year validation and transformation to Date. In browsers that do not yet support * the HTML5 week input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 * week format (yyyy-W##), for example: `2013-W02`. * * The model must always be a Date object, otherwise Angular will throw an error. * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. * * The timezone to be used to read/write the `Date` instance in the model can be defined using * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. * * @param {string} ngModel Assignable angular expression to data-bind to. * @param {string=} name Property name of the form under which the control is published. * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. * This must be a valid ISO week format (yyyy-W##). You can also use interpolation inside this * attribute (e.g. `min="{{minWeek | date:'yyyy-Www'}}"`). Note that `min` will also add * native HTML5 constraint validation. * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. * This must be a valid ISO week format (yyyy-W##). You can also use interpolation inside this * attribute (e.g. `max="{{maxWeek | date:'yyyy-Www'}}"`). Note that `max` will also add * native HTML5 constraint validation. * @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO week string * the `ngMin` expression evaluates to. Note that it does not set the `min` attribute. * @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO week string * the `ngMax` expression evaluates to. Note that it does not set the `max` attribute. * @param {string=} required Sets `required` validation error key if the value is not entered. * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of * `required` when you want to data-bind to the `required` attribute. * @param {string=} ngChange Angular expression to be executed when input changes due to user * interaction with the input element. * * @example
Required! Not a valid date!
value = {{example.value | date: "yyyy-Www"}}
myForm.input.$valid = {{myForm.input.$valid}}
myForm.input.$error = {{myForm.input.$error}}
myForm.$valid = {{myForm.$valid}}
myForm.$error.required = {{!!myForm.$error.required}}
var value = element(by.binding('example.value | date: "yyyy-Www"')); var valid = element(by.binding('myForm.input.$valid')); var input = element(by.model('example.value')); // currently protractor/webdriver does not support // sending keys to all known HTML5 input controls // for various browsers (https://github.com/angular/protractor/issues/562). function setInput(val) { // set the value of the element and force validation. var scr = "var ipt = document.getElementById('exampleInput'); " + "ipt.value = '" + val + "';" + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; browser.executeScript(scr); } it('should initialize to model', function() { expect(value.getText()).toContain('2013-W01'); expect(valid.getText()).toContain('myForm.input.$valid = true'); }); it('should be invalid if empty', function() { setInput(''); expect(value.getText()).toEqual('value ='); expect(valid.getText()).toContain('myForm.input.$valid = false'); }); it('should be invalid if over max', function() { setInput('2015-W01'); expect(value.getText()).toContain(''); expect(valid.getText()).toContain('myForm.input.$valid = false'); });
*/ 'week': createDateInputType('week', WEEK_REGEXP, weekParser, 'yyyy-Www'), /** * @ngdoc input * @name input[month] * * @description * Input with month validation and transformation. In browsers that do not yet support * the HTML5 month input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 * month format (yyyy-MM), for example: `2009-01`. * * The model must always be a Date object, otherwise Angular will throw an error. * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. * If the model is not set to the first of the month, the next view to model update will set it * to the first of the month. * * The timezone to be used to read/write the `Date` instance in the model can be defined using * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. * * @param {string} ngModel Assignable angular expression to data-bind to. * @param {string=} name Property name of the form under which the control is published. * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. * This must be a valid ISO month format (yyyy-MM). You can also use interpolation inside this * attribute (e.g. `min="{{minMonth | date:'yyyy-MM'}}"`). Note that `min` will also add * native HTML5 constraint validation. * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. * This must be a valid ISO month format (yyyy-MM). You can also use interpolation inside this * attribute (e.g. `max="{{maxMonth | date:'yyyy-MM'}}"`). Note that `max` will also add * native HTML5 constraint validation. * @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO week string * the `ngMin` expression evaluates to. Note that it does not set the `min` attribute. * @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO week string * the `ngMax` expression evaluates to. Note that it does not set the `max` attribute. * @param {string=} required Sets `required` validation error key if the value is not entered. * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of * `required` when you want to data-bind to the `required` attribute. * @param {string=} ngChange Angular expression to be executed when input changes due to user * interaction with the input element. * * @example
Required! Not a valid month!
value = {{example.value | date: "yyyy-MM"}}
myForm.input.$valid = {{myForm.input.$valid}}
myForm.input.$error = {{myForm.input.$error}}
myForm.$valid = {{myForm.$valid}}
myForm.$error.required = {{!!myForm.$error.required}}
var value = element(by.binding('example.value | date: "yyyy-MM"')); var valid = element(by.binding('myForm.input.$valid')); var input = element(by.model('example.value')); // currently protractor/webdriver does not support // sending keys to all known HTML5 input controls // for various browsers (https://github.com/angular/protractor/issues/562). function setInput(val) { // set the value of the element and force validation. var scr = "var ipt = document.getElementById('exampleInput'); " + "ipt.value = '" + val + "';" + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; browser.executeScript(scr); } it('should initialize to model', function() { expect(value.getText()).toContain('2013-10'); expect(valid.getText()).toContain('myForm.input.$valid = true'); }); it('should be invalid if empty', function() { setInput(''); expect(value.getText()).toEqual('value ='); expect(valid.getText()).toContain('myForm.input.$valid = false'); }); it('should be invalid if over max', function() { setInput('2015-01'); expect(value.getText()).toContain(''); expect(valid.getText()).toContain('myForm.input.$valid = false'); });
*/ 'month': createDateInputType('month', MONTH_REGEXP, createDateParser(MONTH_REGEXP, ['yyyy', 'MM']), 'yyyy-MM'), /** * @ngdoc input * @name input[number] * * @description * Text input with number validation and transformation. Sets the `number` validation * error if not a valid number. * *
* The model must always be of type `number` otherwise Angular will throw an error. * Be aware that a string containing a number is not enough. See the {@link ngModel:numfmt} * error docs for more information and an example of how to convert your model if necessary. *
* * ## Issues with HTML5 constraint validation * * In browsers that follow the * [HTML5 specification](https://html.spec.whatwg.org/multipage/forms.html#number-state-%28type=number%29), * `input[number]` does not work as expected with {@link ngModelOptions `ngModelOptions.allowInvalid`}. * If a non-number is entered in the input, the browser will report the value as an empty string, * which means the view / model values in `ngModel` and subsequently the scope value * will also be an empty string. * * * @param {string} ngModel Assignable angular expression to data-bind to. * @param {string=} name Property name of the form under which the control is published. * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. * @param {string=} required Sets `required` validation error key if the value is not entered. * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of * `required` when you want to data-bind to the `required` attribute. * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than * minlength. * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of * any length. * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string * that contains the regular expression body that will be converted to a regular expression * as in the ngPattern directive. * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue} * does not match a RegExp found by evaluating the Angular expression given in the attribute value. * If the expression evaluates to a RegExp object, then this is used directly. * If the expression evaluates to a string, then it will be converted to a RegExp * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to * `new RegExp('^abc$')`.
* **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to * start at the index of the last search's match, thus not taking the whole input value into * account. * @param {string=} ngChange Angular expression to be executed when input changes due to user * interaction with the input element. * * @example
Required! Not valid number!
value = {{example.value}}
myForm.input.$valid = {{myForm.input.$valid}}
myForm.input.$error = {{myForm.input.$error}}
myForm.$valid = {{myForm.$valid}}
myForm.$error.required = {{!!myForm.$error.required}}
var value = element(by.binding('example.value')); var valid = element(by.binding('myForm.input.$valid')); var input = element(by.model('example.value')); it('should initialize to model', function() { expect(value.getText()).toContain('12'); expect(valid.getText()).toContain('true'); }); it('should be invalid if empty', function() { input.clear(); input.sendKeys(''); expect(value.getText()).toEqual('value ='); expect(valid.getText()).toContain('false'); }); it('should be invalid if over max', function() { input.clear(); input.sendKeys('123'); expect(value.getText()).toEqual('value ='); expect(valid.getText()).toContain('false'); });
*/ 'number': numberInputType, /** * @ngdoc input * @name input[url] * * @description * Text input with URL validation. Sets the `url` validation error key if the content is not a * valid URL. * *
* **Note:** `input[url]` uses a regex to validate urls that is derived from the regex * used in Chromium. If you need stricter validation, you can use `ng-pattern` or modify * the built-in validators (see the {@link guide/forms Forms guide}) *
* * @param {string} ngModel Assignable angular expression to data-bind to. * @param {string=} name Property name of the form under which the control is published. * @param {string=} required Sets `required` validation error key if the value is not entered. * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of * `required` when you want to data-bind to the `required` attribute. * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than * minlength. * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of * any length. * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string * that contains the regular expression body that will be converted to a regular expression * as in the ngPattern directive. * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue} * does not match a RegExp found by evaluating the Angular expression given in the attribute value. * If the expression evaluates to a RegExp object, then this is used directly. * If the expression evaluates to a string, then it will be converted to a RegExp * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to * `new RegExp('^abc$')`.
* **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to * start at the index of the last search's match, thus not taking the whole input value into * account. * @param {string=} ngChange Angular expression to be executed when input changes due to user * interaction with the input element. * * @example
var text = element(by.binding('url.text')); var valid = element(by.binding('myForm.input.$valid')); var input = element(by.model('url.text')); it('should initialize to model', function() { expect(text.getText()).toContain('http://google.com'); expect(valid.getText()).toContain('true'); }); it('should be invalid if empty', function() { input.clear(); input.sendKeys(''); expect(text.getText()).toEqual('text ='); expect(valid.getText()).toContain('false'); }); it('should be invalid if not url', function() { input.clear(); input.sendKeys('box'); expect(valid.getText()).toContain('false'); });
*/ 'url': urlInputType, /** * @ngdoc input * @name input[email] * * @description * Text input with email validation. Sets the `email` validation error key if not a valid email * address. * *
* **Note:** `input[email]` uses a regex to validate email addresses that is derived from the regex * used in Chromium. If you need stricter validation (e.g. requiring a top-level domain), you can * use `ng-pattern` or modify the built-in validators (see the {@link guide/forms Forms guide}) *
* * @param {string} ngModel Assignable angular expression to data-bind to. * @param {string=} name Property name of the form under which the control is published. * @param {string=} required Sets `required` validation error key if the value is not entered. * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of * `required` when you want to data-bind to the `required` attribute. * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than * minlength. * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of * any length. * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string * that contains the regular expression body that will be converted to a regular expression * as in the ngPattern directive. * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue} * does not match a RegExp found by evaluating the Angular expression given in the attribute value. * If the expression evaluates to a RegExp object, then this is used directly. * If the expression evaluates to a string, then it will be converted to a RegExp * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to * `new RegExp('^abc$')`.
* **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to * start at the index of the last search's match, thus not taking the whole input value into * account. * @param {string=} ngChange Angular expression to be executed when input changes due to user * interaction with the input element. * * @example
Required! Not valid email!
text = {{email.text}}
myForm.input.$valid = {{myForm.input.$valid}}
myForm.input.$error = {{myForm.input.$error}}
myForm.$valid = {{myForm.$valid}}
myForm.$error.required = {{!!myForm.$error.required}}
myForm.$error.email = {{!!myForm.$error.email}}
var text = element(by.binding('email.text')); var valid = element(by.binding('myForm.input.$valid')); var input = element(by.model('email.text')); it('should initialize to model', function() { expect(text.getText()).toContain('me@example.com'); expect(valid.getText()).toContain('true'); }); it('should be invalid if empty', function() { input.clear(); input.sendKeys(''); expect(text.getText()).toEqual('text ='); expect(valid.getText()).toContain('false'); }); it('should be invalid if not email', function() { input.clear(); input.sendKeys('xxx'); expect(valid.getText()).toContain('false'); });
*/ 'email': emailInputType, /** * @ngdoc input * @name input[radio] * * @description * HTML radio button. * * @param {string} ngModel Assignable angular expression to data-bind to. * @param {string} value The value to which the `ngModel` expression should be set when selected. * Note that `value` only supports `string` values, i.e. the scope model needs to be a string, * too. Use `ngValue` if you need complex models (`number`, `object`, ...). * @param {string=} name Property name of the form under which the control is published. * @param {string=} ngChange Angular expression to be executed when input changes due to user * interaction with the input element. * @param {string} ngValue Angular expression to which `ngModel` will be be set when the radio * is selected. Should be used instead of the `value` attribute if you need * a non-string `ngModel` (`boolean`, `array`, ...). * * @example



color = {{color.name | json}}
Note that `ng-value="specialValue"` sets radio item's value to be the value of `$scope.specialValue`.
it('should change state', function() { var color = element(by.binding('color.name')); expect(color.getText()).toContain('blue'); element.all(by.model('color.name')).get(0).click(); expect(color.getText()).toContain('red'); });
*/ 'radio': radioInputType, /** * @ngdoc input * @name input[checkbox] * * @description * HTML checkbox. * * @param {string} ngModel Assignable angular expression to data-bind to. * @param {string=} name Property name of the form under which the control is published. * @param {expression=} ngTrueValue The value to which the expression should be set when selected. * @param {expression=} ngFalseValue The value to which the expression should be set when not selected. * @param {string=} ngChange Angular expression to be executed when input changes due to user * interaction with the input element. * * @example


value1 = {{checkboxModel.value1}}
value2 = {{checkboxModel.value2}}
it('should change state', function() { var value1 = element(by.binding('checkboxModel.value1')); var value2 = element(by.binding('checkboxModel.value2')); expect(value1.getText()).toContain('true'); expect(value2.getText()).toContain('YES'); element(by.model('checkboxModel.value1')).click(); element(by.model('checkboxModel.value2')).click(); expect(value1.getText()).toContain('false'); expect(value2.getText()).toContain('NO'); });
*/ 'checkbox': checkboxInputType, 'hidden': noop, 'button': noop, 'submit': noop, 'reset': noop, 'file': noop }; function stringBasedInputType(ctrl) { ctrl.$formatters.push(function(value) { return ctrl.$isEmpty(value) ? value : value.toString(); }); } function textInputType(scope, element, attr, ctrl, $sniffer, $browser) { baseInputType(scope, element, attr, ctrl, $sniffer, $browser); stringBasedInputType(ctrl); } function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) { var type = lowercase(element[0].type); // In composition mode, users are still inputing intermediate text buffer, // hold the listener until composition is done. // More about composition events: https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent if (!$sniffer.android) { var composing = false; element.on('compositionstart', function() { composing = true; }); element.on('compositionend', function() { composing = false; listener(); }); } var timeout; var listener = function(ev) { if (timeout) { $browser.defer.cancel(timeout); timeout = null; } if (composing) return; var value = element.val(), event = ev && ev.type; // By default we will trim the value // If the attribute ng-trim exists we will avoid trimming // If input type is 'password', the value is never trimmed if (type !== 'password' && (!attr.ngTrim || attr.ngTrim !== 'false')) { value = trim(value); } // If a control is suffering from bad input (due to native validators), browsers discard its // value, so it may be necessary to revalidate (by calling $setViewValue again) even if the // control's value is the same empty value twice in a row. if (ctrl.$viewValue !== value || (value === '' && ctrl.$$hasNativeValidators)) { ctrl.$setViewValue(value, event); } }; // if the browser does support "input" event, we are fine - except on IE9 which doesn't fire the // input event on backspace, delete or cut if ($sniffer.hasEvent('input')) { element.on('input', listener); } else { var deferListener = function(ev, input, origValue) { if (!timeout) { timeout = $browser.defer(function() { timeout = null; if (!input || input.value !== origValue) { listener(ev); } }); } }; element.on('keydown', function(event) { var key = event.keyCode; // ignore // command modifiers arrows if (key === 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) return; deferListener(event, this, this.value); }); // if user modifies input value using context menu in IE, we need "paste" and "cut" events to catch it if ($sniffer.hasEvent('paste')) { element.on('paste cut', deferListener); } } // if user paste into input using mouse on older browser // or form autocomplete on newer browser, we need "change" event to catch it element.on('change', listener); // Some native input types (date-family) have the ability to change validity without // firing any input/change events. // For these event types, when native validators are present and the browser supports the type, // check for validity changes on various DOM events. if (PARTIAL_VALIDATION_TYPES[type] && ctrl.$$hasNativeValidators && type === attr.type) { element.on(PARTIAL_VALIDATION_EVENTS, function(ev) { if (!timeout) { var validity = this[VALIDITY_STATE_PROPERTY]; var origBadInput = validity.badInput; var origTypeMismatch = validity.typeMismatch; timeout = $browser.defer(function() { timeout = null; if (validity.badInput !== origBadInput || validity.typeMismatch !== origTypeMismatch) { listener(ev); } }); } }); } ctrl.$render = function() { // Workaround for Firefox validation #12102. var value = ctrl.$isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue; if (element.val() !== value) { element.val(value); } }; } function weekParser(isoWeek, existingDate) { if (isDate(isoWeek)) { return isoWeek; } if (isString(isoWeek)) { WEEK_REGEXP.lastIndex = 0; var parts = WEEK_REGEXP.exec(isoWeek); if (parts) { var year = +parts[1], week = +parts[2], hours = 0, minutes = 0, seconds = 0, milliseconds = 0, firstThurs = getFirstThursdayOfYear(year), addDays = (week - 1) * 7; if (existingDate) { hours = existingDate.getHours(); minutes = existingDate.getMinutes(); seconds = existingDate.getSeconds(); milliseconds = existingDate.getMilliseconds(); } return new Date(year, 0, firstThurs.getDate() + addDays, hours, minutes, seconds, milliseconds); } } return NaN; } function createDateParser(regexp, mapping) { return function(iso, date) { var parts, map; if (isDate(iso)) { return iso; } if (isString(iso)) { // When a date is JSON'ified to wraps itself inside of an extra // set of double quotes. This makes the date parsing code unable // to match the date string and parse it as a date. if (iso.charAt(0) == '"' && iso.charAt(iso.length - 1) == '"') { iso = iso.substring(1, iso.length - 1); } if (ISO_DATE_REGEXP.test(iso)) { return new Date(iso); } regexp.lastIndex = 0; parts = regexp.exec(iso); if (parts) { parts.shift(); if (date) { map = { yyyy: date.getFullYear(), MM: date.getMonth() + 1, dd: date.getDate(), HH: date.getHours(), mm: date.getMinutes(), ss: date.getSeconds(), sss: date.getMilliseconds() / 1000 }; } else { map = { yyyy: 1970, MM: 1, dd: 1, HH: 0, mm: 0, ss: 0, sss: 0 }; } forEach(parts, function(part, index) { if (index < mapping.length) { map[mapping[index]] = +part; } }); return new Date(map.yyyy, map.MM - 1, map.dd, map.HH, map.mm, map.ss || 0, map.sss * 1000 || 0); } } return NaN; }; } function createDateInputType(type, regexp, parseDate, format) { return function dynamicDateInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter) { badInputChecker(scope, element, attr, ctrl); baseInputType(scope, element, attr, ctrl, $sniffer, $browser); var timezone = ctrl && ctrl.$options && ctrl.$options.timezone; var previousDate; ctrl.$$parserName = type; ctrl.$parsers.push(function(value) { if (ctrl.$isEmpty(value)) return null; if (regexp.test(value)) { // Note: We cannot read ctrl.$modelValue, as there might be a different // parser/formatter in the processing chain so that the model // contains some different data format! var parsedDate = parseDate(value, previousDate); if (timezone) { parsedDate = convertTimezoneToLocal(parsedDate, timezone); } return parsedDate; } return undefined; }); ctrl.$formatters.push(function(value) { if (value && !isDate(value)) { throw ngModelMinErr('datefmt', 'Expected `{0}` to be a date', value); } if (isValidDate(value)) { previousDate = value; if (previousDate && timezone) { previousDate = convertTimezoneToLocal(previousDate, timezone, true); } return $filter('date')(value, format, timezone); } else { previousDate = null; return ''; } }); if (isDefined(attr.min) || attr.ngMin) { var minVal; ctrl.$validators.min = function(value) { return !isValidDate(value) || isUndefined(minVal) || parseDate(value) >= minVal; }; attr.$observe('min', function(val) { minVal = parseObservedDateValue(val); ctrl.$validate(); }); } if (isDefined(attr.max) || attr.ngMax) { var maxVal; ctrl.$validators.max = function(value) { return !isValidDate(value) || isUndefined(maxVal) || parseDate(value) <= maxVal; }; attr.$observe('max', function(val) { maxVal = parseObservedDateValue(val); ctrl.$validate(); }); } function isValidDate(value) { // Invalid Date: getTime() returns NaN return value && !(value.getTime && value.getTime() !== value.getTime()); } function parseObservedDateValue(val) { return isDefined(val) && !isDate(val) ? parseDate(val) || undefined : val; } }; } function badInputChecker(scope, element, attr, ctrl) { var node = element[0]; var nativeValidation = ctrl.$$hasNativeValidators = isObject(node.validity); if (nativeValidation) { ctrl.$parsers.push(function(value) { var validity = element.prop(VALIDITY_STATE_PROPERTY) || {}; return validity.badInput || validity.typeMismatch ? undefined : value; }); } } function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) { badInputChecker(scope, element, attr, ctrl); baseInputType(scope, element, attr, ctrl, $sniffer, $browser); ctrl.$$parserName = 'number'; ctrl.$parsers.push(function(value) { if (ctrl.$isEmpty(value)) return null; if (NUMBER_REGEXP.test(value)) return parseFloat(value); return undefined; }); ctrl.$formatters.push(function(value) { if (!ctrl.$isEmpty(value)) { if (!isNumber(value)) { throw ngModelMinErr('numfmt', 'Expected `{0}` to be a number', value); } value = value.toString(); } return value; }); if (isDefined(attr.min) || attr.ngMin) { var minVal; ctrl.$validators.min = function(value) { return ctrl.$isEmpty(value) || isUndefined(minVal) || value >= minVal; }; attr.$observe('min', function(val) { if (isDefined(val) && !isNumber(val)) { val = parseFloat(val, 10); } minVal = isNumber(val) && !isNaN(val) ? val : undefined; // TODO(user): implement validateLater to reduce number of validations ctrl.$validate(); }); } if (isDefined(attr.max) || attr.ngMax) { var maxVal; ctrl.$validators.max = function(value) { return ctrl.$isEmpty(value) || isUndefined(maxVal) || value <= maxVal; }; attr.$observe('max', function(val) { if (isDefined(val) && !isNumber(val)) { val = parseFloat(val, 10); } maxVal = isNumber(val) && !isNaN(val) ? val : undefined; // TODO(user): implement validateLater to reduce number of validations ctrl.$validate(); }); } } function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) { // Note: no badInputChecker here by purpose as `url` is only a validation // in browsers, i.e. we can always read out input.value even if it is not valid! baseInputType(scope, element, attr, ctrl, $sniffer, $browser); stringBasedInputType(ctrl); ctrl.$$parserName = 'url'; ctrl.$validators.url = function(modelValue, viewValue) { var value = modelValue || viewValue; return ctrl.$isEmpty(value) || URL_REGEXP.test(value); }; } function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) { // Note: no badInputChecker here by purpose as `url` is only a validation // in browsers, i.e. we can always read out input.value even if it is not valid! baseInputType(scope, element, attr, ctrl, $sniffer, $browser); stringBasedInputType(ctrl); ctrl.$$parserName = 'email'; ctrl.$validators.email = function(modelValue, viewValue) { var value = modelValue || viewValue; return ctrl.$isEmpty(value) || EMAIL_REGEXP.test(value); }; } function radioInputType(scope, element, attr, ctrl) { // make the name unique, if not defined if (isUndefined(attr.name)) { element.attr('name', nextUid()); } var listener = function(ev) { if (element[0].checked) { ctrl.$setViewValue(attr.value, ev && ev.type); } }; element.on('click', listener); ctrl.$render = function() { var value = attr.value; element[0].checked = (value == ctrl.$viewValue); }; attr.$observe('value', ctrl.$render); } function parseConstantExpr($parse, context, name, expression, fallback) { var parseFn; if (isDefined(expression)) { parseFn = $parse(expression); if (!parseFn.constant) { throw ngModelMinErr('constexpr', 'Expected constant expression for `{0}`, but saw ' + '`{1}`.', name, expression); } return parseFn(context); } return fallback; } function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter, $parse) { var trueValue = parseConstantExpr($parse, scope, 'ngTrueValue', attr.ngTrueValue, true); var falseValue = parseConstantExpr($parse, scope, 'ngFalseValue', attr.ngFalseValue, false); var listener = function(ev) { ctrl.$setViewValue(element[0].checked, ev && ev.type); }; element.on('click', listener); ctrl.$render = function() { element[0].checked = ctrl.$viewValue; }; // Override the standard `$isEmpty` because the $viewValue of an empty checkbox is always set to `false` // This is because of the parser below, which compares the `$modelValue` with `trueValue` to convert // it to a boolean. ctrl.$isEmpty = function(value) { return value === false; }; ctrl.$formatters.push(function(value) { return equals(value, trueValue); }); ctrl.$parsers.push(function(value) { return value ? trueValue : falseValue; }); } /** * @ngdoc directive * @name textarea * @restrict E * * @description * HTML textarea element control with angular data-binding. The data-binding and validation * properties of this element are exactly the same as those of the * {@link ng.directive:input input element}. * * @param {string} ngModel Assignable angular expression to data-bind to. * @param {string=} name Property name of the form under which the control is published. * @param {string=} required Sets `required` validation error key if the value is not entered. * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of * `required` when you want to data-bind to the `required` attribute. * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than * minlength. * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of any * length. * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue} * does not match a RegExp found by evaluating the Angular expression given in the attribute value. * If the expression evaluates to a RegExp object, then this is used directly. * If the expression evaluates to a string, then it will be converted to a RegExp * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to * `new RegExp('^abc$')`.
* **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to * start at the index of the last search's match, thus not taking the whole input value into * account. * @param {string=} ngChange Angular expression to be executed when input changes due to user * interaction with the input element. * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input. */ /** * @ngdoc directive * @name input * @restrict E * * @description * HTML input element control. When used together with {@link ngModel `ngModel`}, it provides data-binding, * input state control, and validation. * Input control follows HTML5 input types and polyfills the HTML5 validation behavior for older browsers. * *
* **Note:** Not every feature offered is available for all input types. * Specifically, data binding and event handling via `ng-model` is unsupported for `input[file]`. *
* * @param {string} ngModel Assignable angular expression to data-bind to. * @param {string=} name Property name of the form under which the control is published. * @param {string=} required Sets `required` validation error key if the value is not entered. * @param {boolean=} ngRequired Sets `required` attribute if set to true * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than * minlength. * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of any * length. * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue} * value does not match a RegExp found by evaluating the Angular expression given in the attribute value. * If the expression evaluates to a RegExp object, then this is used directly. * If the expression evaluates to a string, then it will be converted to a RegExp * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to * `new RegExp('^abc$')`.
* **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to * start at the index of the last search's match, thus not taking the whole input value into * account. * @param {string=} ngChange Angular expression to be executed when input changes due to user * interaction with the input element. * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input. * This parameter is ignored for input[type=password] controls, which will never trim the * input. * * @example
Required!
Too short! Too long!

user = {{user}}
myForm.userName.$valid = {{myForm.userName.$valid}}
myForm.userName.$error = {{myForm.userName.$error}}
myForm.lastName.$valid = {{myForm.lastName.$valid}}
myForm.lastName.$error = {{myForm.lastName.$error}}
myForm.$valid = {{myForm.$valid}}
myForm.$error.required = {{!!myForm.$error.required}}
myForm.$error.minlength = {{!!myForm.$error.minlength}}
myForm.$error.maxlength = {{!!myForm.$error.maxlength}}
var user = element(by.exactBinding('user')); var userNameValid = element(by.binding('myForm.userName.$valid')); var lastNameValid = element(by.binding('myForm.lastName.$valid')); var lastNameError = element(by.binding('myForm.lastName.$error')); var formValid = element(by.binding('myForm.$valid')); var userNameInput = element(by.model('user.name')); var userLastInput = element(by.model('user.last')); it('should initialize to model', function() { expect(user.getText()).toContain('{"name":"guest","last":"visitor"}'); expect(userNameValid.getText()).toContain('true'); expect(formValid.getText()).toContain('true'); }); it('should be invalid if empty when required', function() { userNameInput.clear(); userNameInput.sendKeys(''); expect(user.getText()).toContain('{"last":"visitor"}'); expect(userNameValid.getText()).toContain('false'); expect(formValid.getText()).toContain('false'); }); it('should be valid if empty when min length is set', function() { userLastInput.clear(); userLastInput.sendKeys(''); expect(user.getText()).toContain('{"name":"guest","last":""}'); expect(lastNameValid.getText()).toContain('true'); expect(formValid.getText()).toContain('true'); }); it('should be invalid if less than required min length', function() { userLastInput.clear(); userLastInput.sendKeys('xx'); expect(user.getText()).toContain('{"name":"guest"}'); expect(lastNameValid.getText()).toContain('false'); expect(lastNameError.getText()).toContain('minlength'); expect(formValid.getText()).toContain('false'); }); it('should be invalid if longer than max length', function() { userLastInput.clear(); userLastInput.sendKeys('some ridiculously long name'); expect(user.getText()).toContain('{"name":"guest"}'); expect(lastNameValid.getText()).toContain('false'); expect(lastNameError.getText()).toContain('maxlength'); expect(formValid.getText()).toContain('false'); });
*/ var inputDirective = ['$browser', '$sniffer', '$filter', '$parse', function($browser, $sniffer, $filter, $parse) { return { restrict: 'E', require: ['?ngModel'], link: { pre: function(scope, element, attr, ctrls) { if (ctrls[0]) { (inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrls[0], $sniffer, $browser, $filter, $parse); } } } }; }]; var CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/; /** * @ngdoc directive * @name ngValue * * @description * Binds the given expression to the value of `
it('should show correct pluralized string', function() { var withoutOffset = element.all(by.css('ng-pluralize')).get(0); var withOffset = element.all(by.css('ng-pluralize')).get(1); var countInput = element(by.model('personCount')); expect(withoutOffset.getText()).toEqual('1 person is viewing.'); expect(withOffset.getText()).toEqual('Igor is viewing.'); countInput.clear(); countInput.sendKeys('0'); expect(withoutOffset.getText()).toEqual('Nobody is viewing.'); expect(withOffset.getText()).toEqual('Nobody is viewing.'); countInput.clear(); countInput.sendKeys('2'); expect(withoutOffset.getText()).toEqual('2 people are viewing.'); expect(withOffset.getText()).toEqual('Igor and Misko are viewing.'); countInput.clear(); countInput.sendKeys('3'); expect(withoutOffset.getText()).toEqual('3 people are viewing.'); expect(withOffset.getText()).toEqual('Igor, Misko and one other person are viewing.'); countInput.clear(); countInput.sendKeys('4'); expect(withoutOffset.getText()).toEqual('4 people are viewing.'); expect(withOffset.getText()).toEqual('Igor, Misko and 2 other people are viewing.'); }); it('should show data-bound names', function() { var withOffset = element.all(by.css('ng-pluralize')).get(1); var personCount = element(by.model('personCount')); var person1 = element(by.model('person1')); var person2 = element(by.model('person2')); personCount.clear(); personCount.sendKeys('4'); person1.clear(); person1.sendKeys('Di'); person2.clear(); person2.sendKeys('Vojta'); expect(withOffset.getText()).toEqual('Di, Vojta and 2 other people are viewing.'); }); */ var ngPluralizeDirective = ['$locale', '$interpolate', '$log', function($locale, $interpolate, $log) { var BRACE = /{}/g, IS_WHEN = /^when(Minus)?(.+)$/; return { link: function(scope, element, attr) { var numberExp = attr.count, whenExp = attr.$attr.when && element.attr(attr.$attr.when), // we have {{}} in attrs offset = attr.offset || 0, whens = scope.$eval(whenExp) || {}, whensExpFns = {}, startSymbol = $interpolate.startSymbol(), endSymbol = $interpolate.endSymbol(), braceReplacement = startSymbol + numberExp + '-' + offset + endSymbol, watchRemover = angular.noop, lastCount; forEach(attr, function(expression, attributeName) { var tmpMatch = IS_WHEN.exec(attributeName); if (tmpMatch) { var whenKey = (tmpMatch[1] ? '-' : '') + lowercase(tmpMatch[2]); whens[whenKey] = element.attr(attr.$attr[attributeName]); } }); forEach(whens, function(expression, key) { whensExpFns[key] = $interpolate(expression.replace(BRACE, braceReplacement)); }); scope.$watch(numberExp, function ngPluralizeWatchAction(newVal) { var count = parseFloat(newVal); var countIsNaN = isNaN(count); if (!countIsNaN && !(count in whens)) { // If an explicit number rule such as 1, 2, 3... is defined, just use it. // Otherwise, check it against pluralization rules in $locale service. count = $locale.pluralCat(count - offset); } // If both `count` and `lastCount` are NaN, we don't need to re-register a watch. // In JS `NaN !== NaN`, so we have to explicitly check. if ((count !== lastCount) && !(countIsNaN && isNumber(lastCount) && isNaN(lastCount))) { watchRemover(); var whenExpFn = whensExpFns[count]; if (isUndefined(whenExpFn)) { if (newVal != null) { $log.debug("ngPluralize: no rule defined for '" + count + "' in " + whenExp); } watchRemover = noop; updateElementText(); } else { watchRemover = scope.$watch(whenExpFn, updateElementText); } lastCount = count; } }); function updateElementText(newText) { element.text(newText || ''); } } }; }]; /** * @ngdoc directive * @name ngRepeat * @multiElement * * @description * The `ngRepeat` directive instantiates a template once per item from a collection. Each template * instance gets its own scope, where the given loop variable is set to the current collection item, * and `$index` is set to the item index or key. * * Special properties are exposed on the local scope of each template instance, including: * * | Variable | Type | Details | * |-----------|-----------------|-----------------------------------------------------------------------------| * | `$index` | {@type number} | iterator offset of the repeated element (0..length-1) | * | `$first` | {@type boolean} | true if the repeated element is first in the iterator. | * | `$middle` | {@type boolean} | true if the repeated element is between the first and last in the iterator. | * | `$last` | {@type boolean} | true if the repeated element is last in the iterator. | * | `$even` | {@type boolean} | true if the iterator position `$index` is even (otherwise false). | * | `$odd` | {@type boolean} | true if the iterator position `$index` is odd (otherwise false). | * *
* Creating aliases for these properties is possible with {@link ng.directive:ngInit `ngInit`}. * This may be useful when, for instance, nesting ngRepeats. *
* * * # Iterating over object properties * * It is possible to get `ngRepeat` to iterate over the properties of an object using the following * syntax: * * ```js *
...
* ``` * * However, there are a limitations compared to array iteration: * * - The JavaScript specification does not define the order of keys * returned for an object, so Angular relies on the order returned by the browser * when running `for key in myObj`. Browsers generally follow the strategy of providing * keys in the order in which they were defined, although there are exceptions when keys are deleted * and reinstated. See the * [MDN page on `delete` for more info](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete#Cross-browser_notes). * * - `ngRepeat` will silently *ignore* object keys starting with `$`, because * it's a prefix used by Angular for public (`$`) and private (`$$`) properties. * * - The built-in filters {@link ng.orderBy orderBy} and {@link ng.filter filter} do not work with * objects, and will throw an error if used with one. * * If you are hitting any of these limitations, the recommended workaround is to convert your object into an array * that is sorted into the order that you prefer before providing it to `ngRepeat`. You could * do this with a filter such as [toArrayFilter](http://ngmodules.org/modules/angular-toArrayFilter) * or implement a `$watch` on the object yourself. * * * # Tracking and Duplicates * * `ngRepeat` uses {@link $rootScope.Scope#$watchCollection $watchCollection} to detect changes in * the collection. When a change happens, ngRepeat then makes the corresponding changes to the DOM: * * * When an item is added, a new instance of the template is added to the DOM. * * When an item is removed, its template instance is removed from the DOM. * * When items are reordered, their respective templates are reordered in the DOM. * * To minimize creation of DOM elements, `ngRepeat` uses a function * to "keep track" of all items in the collection and their corresponding DOM elements. * For example, if an item is added to the collection, ngRepeat will know that all other items * already have DOM elements, and will not re-render them. * * The default tracking function (which tracks items by their identity) does not allow * duplicate items in arrays. This is because when there are duplicates, it is not possible * to maintain a one-to-one mapping between collection items and DOM elements. * * If you do need to repeat duplicate items, you can substitute the default tracking behavior * with your own using the `track by` expression. * * For example, you may track items by the index of each item in the collection, using the * special scope property `$index`: * ```html *
* {{n}} *
* ``` * * You may also use arbitrary expressions in `track by`, including references to custom functions * on the scope: * ```html *
* {{n}} *
* ``` * *
* If you are working with objects that have an identifier property, you should track * by the identifier instead of the whole object. Should you reload your data later, `ngRepeat` * will not have to rebuild the DOM elements for items it has already rendered, even if the * JavaScript objects in the collection have been substituted for new ones. For large collections, * this significantly improves rendering performance. If you don't have a unique identifier, * `track by $index` can also provide a performance boost. *
* ```html *
* {{model.name}} *
* ``` * * When no `track by` expression is provided, it is equivalent to tracking by the built-in * `$id` function, which tracks items by their identity: * ```html *
* {{obj.prop}} *
* ``` * *
* **Note:** `track by` must always be the last expression: *
* ``` *
* {{model.name}} *
* ``` * * # Special repeat start and end points * To repeat a series of elements instead of just one parent element, ngRepeat (as well as other ng directives) supports extending * the range of the repeater by defining explicit start and end points by using **ng-repeat-start** and **ng-repeat-end** respectively. * The **ng-repeat-start** directive works the same as **ng-repeat**, but will repeat all the HTML code (including the tag it's defined on) * up to and including the ending HTML tag where **ng-repeat-end** is placed. * * The example below makes use of this feature: * ```html *
* Header {{ item }} *
*
* Body {{ item }} *
*
* Footer {{ item }} *
* ``` * * And with an input of {@type ['A','B']} for the items variable in the example above, the output will evaluate to: * ```html *
* Header A *
*
* Body A *
*
* Footer A *
*
* Header B *
*
* Body B *
*
* Footer B *
* ``` * * The custom start and end points for ngRepeat also support all other HTML directive syntax flavors provided in AngularJS (such * as **data-ng-repeat-start**, **x-ng-repeat-start** and **ng:repeat-start**). * * @animations * | Animation | Occurs | * |----------------------------------|-------------------------------------| * | {@link ng.$animate#enter enter} | when a new item is added to the list or when an item is revealed after a filter | * | {@link ng.$animate#leave leave} | when an item is removed from the list or when an item is filtered out | * | {@link ng.$animate#move move } | when an adjacent item is filtered out causing a reorder or when the item contents are reordered | * * See the example below for defining CSS animations with ngRepeat. * * @element ANY * @scope * @priority 1000 * @param {repeat_expression} ngRepeat The expression indicating how to enumerate a collection. These * formats are currently supported: * * * `variable in expression` – where variable is the user defined loop variable and `expression` * is a scope expression giving the collection to enumerate. * * For example: `album in artist.albums`. * * * `(key, value) in expression` – where `key` and `value` can be any user defined identifiers, * and `expression` is the scope expression giving the collection to enumerate. * * For example: `(name, age) in {'adam':10, 'amalie':12}`. * * * `variable in expression track by tracking_expression` – You can also provide an optional tracking expression * which can be used to associate the objects in the collection with the DOM elements. If no tracking expression * is specified, ng-repeat associates elements by identity. It is an error to have * more than one tracking expression value resolve to the same key. (This would mean that two distinct objects are * mapped to the same DOM element, which is not possible.) * * Note that the tracking expression must come last, after any filters, and the alias expression. * * For example: `item in items` is equivalent to `item in items track by $id(item)`. This implies that the DOM elements * will be associated by item identity in the array. * * For example: `item in items track by $id(item)`. A built in `$id()` function can be used to assign a unique * `$$hashKey` property to each item in the array. This property is then used as a key to associated DOM elements * with the corresponding item in the array by identity. Moving the same object in array would move the DOM * element in the same way in the DOM. * * For example: `item in items track by item.id` is a typical pattern when the items come from the database. In this * case the object identity does not matter. Two objects are considered equivalent as long as their `id` * property is same. * * For example: `item in items | filter:searchText track by item.id` is a pattern that might be used to apply a filter * to items in conjunction with a tracking expression. * * * `variable in expression as alias_expression` – You can also provide an optional alias expression which will then store the * intermediate results of the repeater after the filters have been applied. Typically this is used to render a special message * when a filter is active on the repeater, but the filtered result set is empty. * * For example: `item in items | filter:x as results` will store the fragment of the repeated items as `results`, but only after * the items have been processed through the filter. * * Please note that `as [variable name] is not an operator but rather a part of ngRepeat micro-syntax so it can be used only at the end * (and not as operator, inside an expression). * * For example: `item in items | filter : x | orderBy : order | limitTo : limit as results` . * * @example * This example uses `ngRepeat` to display a list of people. A filter is used to restrict the displayed * results by name. New (entering) and removed (leaving) items are animated.
I have {{friends.length}} friends. They are:
  • [{{$index + 1}}] {{friend.name}} who is {{friend.age}} years old.
  • No results found...
angular.module('ngRepeat', ['ngAnimate']).controller('repeatController', function($scope) { $scope.friends = [ {name:'John', age:25, gender:'boy'}, {name:'Jessie', age:30, gender:'girl'}, {name:'Johanna', age:28, gender:'girl'}, {name:'Joy', age:15, gender:'girl'}, {name:'Mary', age:28, gender:'girl'}, {name:'Peter', age:95, gender:'boy'}, {name:'Sebastian', age:50, gender:'boy'}, {name:'Erika', age:27, gender:'girl'}, {name:'Patrick', age:40, gender:'boy'}, {name:'Samantha', age:60, gender:'girl'} ]; }); .example-animate-container { background:white; border:1px solid black; list-style:none; margin:0; padding:0 10px; } .animate-repeat { line-height:30px; list-style:none; box-sizing:border-box; } .animate-repeat.ng-move, .animate-repeat.ng-enter, .animate-repeat.ng-leave { transition:all linear 0.5s; } .animate-repeat.ng-leave.ng-leave-active, .animate-repeat.ng-move, .animate-repeat.ng-enter { opacity:0; max-height:0; } .animate-repeat.ng-leave, .animate-repeat.ng-move.ng-move-active, .animate-repeat.ng-enter.ng-enter-active { opacity:1; max-height:30px; } var friends = element.all(by.repeater('friend in friends')); it('should render initial data set', function() { expect(friends.count()).toBe(10); expect(friends.get(0).getText()).toEqual('[1] John who is 25 years old.'); expect(friends.get(1).getText()).toEqual('[2] Jessie who is 30 years old.'); expect(friends.last().getText()).toEqual('[10] Samantha who is 60 years old.'); expect(element(by.binding('friends.length')).getText()) .toMatch("I have 10 friends. They are:"); }); it('should update repeater when filter predicate changes', function() { expect(friends.count()).toBe(10); element(by.model('q')).sendKeys('ma'); expect(friends.count()).toBe(2); expect(friends.get(0).getText()).toEqual('[1] Mary who is 28 years old.'); expect(friends.last().getText()).toEqual('[2] Samantha who is 60 years old.'); });
*/ var ngRepeatDirective = ['$parse', '$animate', '$compile', function($parse, $animate, $compile) { var NG_REMOVED = '$$NG_REMOVED'; var ngRepeatMinErr = minErr('ngRepeat'); var updateScope = function(scope, index, valueIdentifier, value, keyIdentifier, key, arrayLength) { // TODO(user): generate setters to shave off ~40ms or 1-1.5% scope[valueIdentifier] = value; if (keyIdentifier) scope[keyIdentifier] = key; scope.$index = index; scope.$first = (index === 0); scope.$last = (index === (arrayLength - 1)); scope.$middle = !(scope.$first || scope.$last); // jshint bitwise: false scope.$odd = !(scope.$even = (index&1) === 0); // jshint bitwise: true }; var getBlockStart = function(block) { return block.clone[0]; }; var getBlockEnd = function(block) { return block.clone[block.clone.length - 1]; }; return { restrict: 'A', multiElement: true, transclude: 'element', priority: 1000, terminal: true, $$tlb: true, compile: function ngRepeatCompile($element, $attr) { var expression = $attr.ngRepeat; var ngRepeatEndComment = $compile.$$createComment('end ngRepeat', expression); var match = expression.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/); if (!match) { throw ngRepeatMinErr('iexp', "Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.", expression); } var lhs = match[1]; var rhs = match[2]; var aliasAs = match[3]; var trackByExp = match[4]; match = lhs.match(/^(?:(\s*[\$\w]+)|\(\s*([\$\w]+)\s*,\s*([\$\w]+)\s*\))$/); if (!match) { throw ngRepeatMinErr('iidexp', "'_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got '{0}'.", lhs); } var valueIdentifier = match[3] || match[1]; var keyIdentifier = match[2]; if (aliasAs && (!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(aliasAs) || /^(null|undefined|this|\$index|\$first|\$middle|\$last|\$even|\$odd|\$parent|\$root|\$id)$/.test(aliasAs))) { throw ngRepeatMinErr('badident', "alias '{0}' is invalid --- must be a valid JS identifier which is not a reserved name.", aliasAs); } var trackByExpGetter, trackByIdExpFn, trackByIdArrayFn, trackByIdObjFn; var hashFnLocals = {$id: hashKey}; if (trackByExp) { trackByExpGetter = $parse(trackByExp); } else { trackByIdArrayFn = function(key, value) { return hashKey(value); }; trackByIdObjFn = function(key) { return key; }; } return function ngRepeatLink($scope, $element, $attr, ctrl, $transclude) { if (trackByExpGetter) { trackByIdExpFn = function(key, value, index) { // assign key, value, and $index to the locals so that they can be used in hash functions if (keyIdentifier) hashFnLocals[keyIdentifier] = key; hashFnLocals[valueIdentifier] = value; hashFnLocals.$index = index; return trackByExpGetter($scope, hashFnLocals); }; } // Store a list of elements from previous run. This is a hash where key is the item from the // iterator, and the value is objects with following properties. // - scope: bound scope // - element: previous element. // - index: position // // We are using no-proto object so that we don't need to guard against inherited props via // hasOwnProperty. var lastBlockMap = createMap(); //watch props $scope.$watchCollection(rhs, function ngRepeatAction(collection) { var index, length, previousNode = $element[0], // node that cloned nodes should be inserted after // initialized to the comment node anchor nextNode, // Same as lastBlockMap but it has the current state. It will become the // lastBlockMap on the next iteration. nextBlockMap = createMap(), collectionLength, key, value, // key/value of iteration trackById, trackByIdFn, collectionKeys, block, // last object information {scope, element, id} nextBlockOrder, elementsToRemove; if (aliasAs) { $scope[aliasAs] = collection; } if (isArrayLike(collection)) { collectionKeys = collection; trackByIdFn = trackByIdExpFn || trackByIdArrayFn; } else { trackByIdFn = trackByIdExpFn || trackByIdObjFn; // if object, extract keys, in enumeration order, unsorted collectionKeys = []; for (var itemKey in collection) { if (hasOwnProperty.call(collection, itemKey) && itemKey.charAt(0) !== '$') { collectionKeys.push(itemKey); } } } collectionLength = collectionKeys.length; nextBlockOrder = new Array(collectionLength); // locate existing items for (index = 0; index < collectionLength; index++) { key = (collection === collectionKeys) ? index : collectionKeys[index]; value = collection[key]; trackById = trackByIdFn(key, value, index); if (lastBlockMap[trackById]) { // found previously seen block block = lastBlockMap[trackById]; delete lastBlockMap[trackById]; nextBlockMap[trackById] = block; nextBlockOrder[index] = block; } else if (nextBlockMap[trackById]) { // if collision detected. restore lastBlockMap and throw an error forEach(nextBlockOrder, function(block) { if (block && block.scope) lastBlockMap[block.id] = block; }); throw ngRepeatMinErr('dupes', "Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}, Duplicate value: {2}", expression, trackById, value); } else { // new never before seen block nextBlockOrder[index] = {id: trackById, scope: undefined, clone: undefined}; nextBlockMap[trackById] = true; } } // remove leftover items for (var blockKey in lastBlockMap) { block = lastBlockMap[blockKey]; elementsToRemove = getBlockNodes(block.clone); $animate.leave(elementsToRemove); if (elementsToRemove[0].parentNode) { // if the element was not removed yet because of pending animation, mark it as deleted // so that we can ignore it later for (index = 0, length = elementsToRemove.length; index < length; index++) { elementsToRemove[index][NG_REMOVED] = true; } } block.scope.$destroy(); } // we are not using forEach for perf reasons (trying to avoid #call) for (index = 0; index < collectionLength; index++) { key = (collection === collectionKeys) ? index : collectionKeys[index]; value = collection[key]; block = nextBlockOrder[index]; if (block.scope) { // if we have already seen this object, then we need to reuse the // associated scope/element nextNode = previousNode; // skip nodes that are already pending removal via leave animation do { nextNode = nextNode.nextSibling; } while (nextNode && nextNode[NG_REMOVED]); if (getBlockStart(block) != nextNode) { // existing item which got moved $animate.move(getBlockNodes(block.clone), null, previousNode); } previousNode = getBlockEnd(block); updateScope(block.scope, index, valueIdentifier, value, keyIdentifier, key, collectionLength); } else { // new item which we don't know about $transclude(function ngRepeatTransclude(clone, scope) { block.scope = scope; // http://jsperf.com/clone-vs-createcomment var endNode = ngRepeatEndComment.cloneNode(false); clone[clone.length++] = endNode; $animate.enter(clone, null, previousNode); previousNode = endNode; // Note: We only need the first/last node of the cloned nodes. // However, we need to keep the reference to the jqlite wrapper as it might be changed later // by a directive with templateUrl when its template arrives. block.clone = clone; nextBlockMap[block.id] = block; updateScope(block.scope, index, valueIdentifier, value, keyIdentifier, key, collectionLength); }); } } lastBlockMap = nextBlockMap; }); }; } }; }]; var NG_HIDE_CLASS = 'ng-hide'; var NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate'; /** * @ngdoc directive * @name ngShow * @multiElement * * @description * The `ngShow` directive shows or hides the given HTML element based on the expression * provided to the `ngShow` attribute. The element is shown or hidden by removing or adding * the `.ng-hide` CSS class onto the element. The `.ng-hide` CSS class is predefined * in AngularJS and sets the display style to none (using an !important flag). * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}). * * ```html * *
* * *
* ``` * * When the `ngShow` expression evaluates to a falsy value then the `.ng-hide` CSS class is added to the class * attribute on the element causing it to become hidden. When truthy, the `.ng-hide` CSS class is removed * from the element causing the element not to appear hidden. * * ## Why is !important used? * * You may be wondering why !important is used for the `.ng-hide` CSS class. This is because the `.ng-hide` selector * can be easily overridden by heavier selectors. For example, something as simple * as changing the display style on a HTML list item would make hidden elements appear visible. * This also becomes a bigger issue when dealing with CSS frameworks. * * By using !important, the show and hide behavior will work as expected despite any clash between CSS selector * specificity (when !important isn't used with any conflicting styles). If a developer chooses to override the * styling to change how to hide an element then it is just a matter of using !important in their own CSS code. * * ### Overriding `.ng-hide` * * By default, the `.ng-hide` class will style the element with `display: none!important`. If you wish to change * the hide behavior with ngShow/ngHide then this can be achieved by restating the styles for the `.ng-hide` * class CSS. Note that the selector that needs to be used is actually `.ng-hide:not(.ng-hide-animate)` to cope * with extra animation classes that can be added. * * ```css * .ng-hide:not(.ng-hide-animate) { * /* this is just another form of hiding an element */ * display: block!important; * position: absolute; * top: -9999px; * left: -9999px; * } * ``` * * By default you don't need to override in CSS anything and the animations will work around the display style. * * ## A note about animations with `ngShow` * * Animations in ngShow/ngHide work with the show and hide events that are triggered when the directive expression * is true and false. This system works like the animation system present with ngClass except that * you must also include the !important flag to override the display property * so that you can perform an animation when the element is hidden during the time of the animation. * * ```css * // * //a working example can be found at the bottom of this page * // * .my-element.ng-hide-add, .my-element.ng-hide-remove { * /* this is required as of 1.3x to properly * apply all styling in a show/hide animation */ * transition: 0s linear all; * } * * .my-element.ng-hide-add-active, * .my-element.ng-hide-remove-active { * /* the transition is defined in the active class */ * transition: 1s linear all; * } * * .my-element.ng-hide-add { ... } * .my-element.ng-hide-add.ng-hide-add-active { ... } * .my-element.ng-hide-remove { ... } * .my-element.ng-hide-remove.ng-hide-remove-active { ... } * ``` * * Keep in mind that, as of AngularJS version 1.3, there is no need to change the display * property to block during animation states--ngAnimate will handle the style toggling automatically for you. * * @animations * | Animation | Occurs | * |----------------------------------|-------------------------------------| * | {@link $animate#addClass addClass} `.ng-hide` | after the `ngShow` expression evaluates to a non truthy value and just before the contents are set to hidden | * | {@link $animate#removeClass removeClass} `.ng-hide` | after the `ngShow` expression evaluates to a truthy value and just before contents are set to visible | * * @element ANY * @param {expression} ngShow If the {@link guide/expression expression} is truthy * then the element is shown or hidden respectively. * * @example Click me:
Show:
I show up when your checkbox is checked.
Hide:
I hide when your checkbox is checked.
@import url(../../components/bootstrap-3.1.1/css/bootstrap.css); .animate-show { line-height: 20px; opacity: 1; padding: 10px; border: 1px solid black; background: white; } .animate-show.ng-hide-add, .animate-show.ng-hide-remove { transition: all linear 0.5s; } .animate-show.ng-hide { line-height: 0; opacity: 0; padding: 0 10px; } .check-element { padding: 10px; border: 1px solid black; background: white; } var thumbsUp = element(by.css('span.glyphicon-thumbs-up')); var thumbsDown = element(by.css('span.glyphicon-thumbs-down')); it('should check ng-show / ng-hide', function() { expect(thumbsUp.isDisplayed()).toBeFalsy(); expect(thumbsDown.isDisplayed()).toBeTruthy(); element(by.model('checked')).click(); expect(thumbsUp.isDisplayed()).toBeTruthy(); expect(thumbsDown.isDisplayed()).toBeFalsy(); });
*/ var ngShowDirective = ['$animate', function($animate) { return { restrict: 'A', multiElement: true, link: function(scope, element, attr) { scope.$watch(attr.ngShow, function ngShowWatchAction(value) { // we're adding a temporary, animation-specific class for ng-hide since this way // we can control when the element is actually displayed on screen without having // to have a global/greedy CSS selector that breaks when other animations are run. // Read: https://github.com/angular/angular.js/issues/9103#issuecomment-58335845 $animate[value ? 'removeClass' : 'addClass'](element, NG_HIDE_CLASS, { tempClasses: NG_HIDE_IN_PROGRESS_CLASS }); }); } }; }]; /** * @ngdoc directive * @name ngHide * @multiElement * * @description * The `ngHide` directive shows or hides the given HTML element based on the expression * provided to the `ngHide` attribute. The element is shown or hidden by removing or adding * the `ng-hide` CSS class onto the element. The `.ng-hide` CSS class is predefined * in AngularJS and sets the display style to none (using an !important flag). * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}). * * ```html * *
* * *
* ``` * * When the `ngHide` expression evaluates to a truthy value then the `.ng-hide` CSS class is added to the class * attribute on the element causing it to become hidden. When falsy, the `.ng-hide` CSS class is removed * from the element causing the element not to appear hidden. * * ## Why is !important used? * * You may be wondering why !important is used for the `.ng-hide` CSS class. This is because the `.ng-hide` selector * can be easily overridden by heavier selectors. For example, something as simple * as changing the display style on a HTML list item would make hidden elements appear visible. * This also becomes a bigger issue when dealing with CSS frameworks. * * By using !important, the show and hide behavior will work as expected despite any clash between CSS selector * specificity (when !important isn't used with any conflicting styles). If a developer chooses to override the * styling to change how to hide an element then it is just a matter of using !important in their own CSS code. * * ### Overriding `.ng-hide` * * By default, the `.ng-hide` class will style the element with `display: none!important`. If you wish to change * the hide behavior with ngShow/ngHide then this can be achieved by restating the styles for the `.ng-hide` * class in CSS: * * ```css * .ng-hide { * /* this is just another form of hiding an element */ * display: block!important; * position: absolute; * top: -9999px; * left: -9999px; * } * ``` * * By default you don't need to override in CSS anything and the animations will work around the display style. * * ## A note about animations with `ngHide` * * Animations in ngShow/ngHide work with the show and hide events that are triggered when the directive expression * is true and false. This system works like the animation system present with ngClass, except that the `.ng-hide` * CSS class is added and removed for you instead of your own CSS class. * * ```css * // * //a working example can be found at the bottom of this page * // * .my-element.ng-hide-add, .my-element.ng-hide-remove { * transition: 0.5s linear all; * } * * .my-element.ng-hide-add { ... } * .my-element.ng-hide-add.ng-hide-add-active { ... } * .my-element.ng-hide-remove { ... } * .my-element.ng-hide-remove.ng-hide-remove-active { ... } * ``` * * Keep in mind that, as of AngularJS version 1.3, there is no need to change the display * property to block during animation states--ngAnimate will handle the style toggling automatically for you. * * @animations * | Animation | Occurs | * |----------------------------------|-------------------------------------| * | {@link $animate#addClass addClass} `.ng-hide` | after the `ngHide` expression evaluates to a truthy value and just before the contents are set to hidden | * | {@link $animate#removeClass removeClass} `.ng-hide` | after the `ngHide` expression evaluates to a non truthy value and just before contents are set to visible | * * * @element ANY * @param {expression} ngHide If the {@link guide/expression expression} is truthy then * the element is shown or hidden respectively. * * @example Click me:
Show:
I show up when your checkbox is checked.
Hide:
I hide when your checkbox is checked.
@import url(../../components/bootstrap-3.1.1/css/bootstrap.css); .animate-hide { transition: all linear 0.5s; line-height: 20px; opacity: 1; padding: 10px; border: 1px solid black; background: white; } .animate-hide.ng-hide { line-height: 0; opacity: 0; padding: 0 10px; } .check-element { padding: 10px; border: 1px solid black; background: white; } var thumbsUp = element(by.css('span.glyphicon-thumbs-up')); var thumbsDown = element(by.css('span.glyphicon-thumbs-down')); it('should check ng-show / ng-hide', function() { expect(thumbsUp.isDisplayed()).toBeFalsy(); expect(thumbsDown.isDisplayed()).toBeTruthy(); element(by.model('checked')).click(); expect(thumbsUp.isDisplayed()).toBeTruthy(); expect(thumbsDown.isDisplayed()).toBeFalsy(); });
*/ var ngHideDirective = ['$animate', function($animate) { return { restrict: 'A', multiElement: true, link: function(scope, element, attr) { scope.$watch(attr.ngHide, function ngHideWatchAction(value) { // The comment inside of the ngShowDirective explains why we add and // remove a temporary class for the show/hide animation $animate[value ? 'addClass' : 'removeClass'](element,NG_HIDE_CLASS, { tempClasses: NG_HIDE_IN_PROGRESS_CLASS }); }); } }; }]; /** * @ngdoc directive * @name ngStyle * @restrict AC * * @description * The `ngStyle` directive allows you to set CSS style on an HTML element conditionally. * * @element ANY * @param {expression} ngStyle * * {@link guide/expression Expression} which evals to an * object whose keys are CSS style names and values are corresponding values for those CSS * keys. * * Since some CSS style names are not valid keys for an object, they must be quoted. * See the 'background-color' style in the example below. * * @example
Sample Text
myStyle={{myStyle}}
span { color: black; } var colorSpan = element(by.css('span')); it('should check ng-style', function() { expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)'); element(by.css('input[value=\'set color\']')).click(); expect(colorSpan.getCssValue('color')).toBe('rgba(255, 0, 0, 1)'); element(by.css('input[value=clear]')).click(); expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)'); });
*/ var ngStyleDirective = ngDirective(function(scope, element, attr) { scope.$watch(attr.ngStyle, function ngStyleWatchAction(newStyles, oldStyles) { if (oldStyles && (newStyles !== oldStyles)) { forEach(oldStyles, function(val, style) { element.css(style, '');}); } if (newStyles) element.css(newStyles); }, true); }); /** * @ngdoc directive * @name ngSwitch * @restrict EA * * @description * The `ngSwitch` directive is used to conditionally swap DOM structure on your template based on a scope expression. * Elements within `ngSwitch` but without `ngSwitchWhen` or `ngSwitchDefault` directives will be preserved at the location * as specified in the template. * * The directive itself works similar to ngInclude, however, instead of downloading template code (or loading it * from the template cache), `ngSwitch` simply chooses one of the nested elements and makes it visible based on which element * matches the value obtained from the evaluated expression. In other words, you define a container element * (where you place the directive), place an expression on the **`on="..."` attribute** * (or the **`ng-switch="..."` attribute**), define any inner elements inside of the directive and place * a when attribute per element. The when attribute is used to inform ngSwitch which element to display when the on * expression is evaluated. If a matching expression is not found via a when attribute then an element with the default * attribute is displayed. * *
* Be aware that the attribute values to match against cannot be expressions. They are interpreted * as literal string values to match against. * For example, **`ng-switch-when="someVal"`** will match against the string `"someVal"` not against the * value of the expression `$scope.someVal`. *
* @animations * | Animation | Occurs | * |----------------------------------|-------------------------------------| * | {@link ng.$animate#enter enter} | after the ngSwitch contents change and the matched child element is placed inside the container | * | {@link ng.$animate#leave leave} | after the ngSwitch contents change and just before the former contents are removed from the DOM | * * @usage * * ``` * * ... * ... * ... * * ``` * * * @scope * @priority 1200 * @param {*} ngSwitch|on expression to match against ng-switch-when. * On child elements add: * * * `ngSwitchWhen`: the case statement to match against. If match then this * case will be displayed. If the same match appears multiple times, all the * elements will be displayed. * * `ngSwitchDefault`: the default case when no other case match. If there * are multiple default cases, all of them will be displayed when no other * case match. * * * @example
selection={{selection}}
Settings Div
Home Span
default
angular.module('switchExample', ['ngAnimate']) .controller('ExampleController', ['$scope', function($scope) { $scope.items = ['settings', 'home', 'other']; $scope.selection = $scope.items[0]; }]); .animate-switch-container { position:relative; background:white; border:1px solid black; height:40px; overflow:hidden; } .animate-switch { padding:10px; } .animate-switch.ng-animate { transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; position:absolute; top:0; left:0; right:0; bottom:0; } .animate-switch.ng-leave.ng-leave-active, .animate-switch.ng-enter { top:-50px; } .animate-switch.ng-leave, .animate-switch.ng-enter.ng-enter-active { top:0; } var switchElem = element(by.css('[ng-switch]')); var select = element(by.model('selection')); it('should start in settings', function() { expect(switchElem.getText()).toMatch(/Settings Div/); }); it('should change to home', function() { select.all(by.css('option')).get(1).click(); expect(switchElem.getText()).toMatch(/Home Span/); }); it('should select default', function() { select.all(by.css('option')).get(2).click(); expect(switchElem.getText()).toMatch(/default/); });
*/ var ngSwitchDirective = ['$animate', '$compile', function($animate, $compile) { return { require: 'ngSwitch', // asks for $scope to fool the BC controller module controller: ['$scope', function ngSwitchController() { this.cases = {}; }], link: function(scope, element, attr, ngSwitchController) { var watchExpr = attr.ngSwitch || attr.on, selectedTranscludes = [], selectedElements = [], previousLeaveAnimations = [], selectedScopes = []; var spliceFactory = function(array, index) { return function() { array.splice(index, 1); }; }; scope.$watch(watchExpr, function ngSwitchWatchAction(value) { var i, ii; for (i = 0, ii = previousLeaveAnimations.length; i < ii; ++i) { $animate.cancel(previousLeaveAnimations[i]); } previousLeaveAnimations.length = 0; for (i = 0, ii = selectedScopes.length; i < ii; ++i) { var selected = getBlockNodes(selectedElements[i].clone); selectedScopes[i].$destroy(); var promise = previousLeaveAnimations[i] = $animate.leave(selected); promise.then(spliceFactory(previousLeaveAnimations, i)); } selectedElements.length = 0; selectedScopes.length = 0; if ((selectedTranscludes = ngSwitchController.cases['!' + value] || ngSwitchController.cases['?'])) { forEach(selectedTranscludes, function(selectedTransclude) { selectedTransclude.transclude(function(caseElement, selectedScope) { selectedScopes.push(selectedScope); var anchor = selectedTransclude.element; caseElement[caseElement.length++] = $compile.$$createComment('end ngSwitchWhen'); var block = { clone: caseElement }; selectedElements.push(block); $animate.enter(caseElement, anchor.parent(), anchor); }); }); } }); } }; }]; var ngSwitchWhenDirective = ngDirective({ transclude: 'element', priority: 1200, require: '^ngSwitch', multiElement: true, link: function(scope, element, attrs, ctrl, $transclude) { ctrl.cases['!' + attrs.ngSwitchWhen] = (ctrl.cases['!' + attrs.ngSwitchWhen] || []); ctrl.cases['!' + attrs.ngSwitchWhen].push({ transclude: $transclude, element: element }); } }); var ngSwitchDefaultDirective = ngDirective({ transclude: 'element', priority: 1200, require: '^ngSwitch', multiElement: true, link: function(scope, element, attr, ctrl, $transclude) { ctrl.cases['?'] = (ctrl.cases['?'] || []); ctrl.cases['?'].push({ transclude: $transclude, element: element }); } }); /** * @ngdoc directive * @name ngTransclude * @restrict EAC * * @description * Directive that marks the insertion point for the transcluded DOM of the nearest parent directive that uses transclusion. * * You can specify that you want to insert a named transclusion slot, instead of the default slot, by providing the slot name * as the value of the `ng-transclude` or `ng-transclude-slot` attribute. * * If the transcluded content is not empty (i.e. contains one or more DOM nodes, including whitespace text nodes), any existing * content of this element will be removed before the transcluded content is inserted. * If the transcluded content is empty, the existing content is left intact. This lets you provide fallback content in the case * that no transcluded content is provided. * * @element ANY * * @param {string} ngTransclude|ngTranscludeSlot the name of the slot to insert at this point. If this is not provided, is empty * or its value is the same as the name of the attribute then the default slot is used. * * @example * ### Basic transclusion * This example demonstrates basic transclusion of content into a component directive. * * * *
*
*
* {{text}} *
*
* * it('should have transcluded', function() { * var titleElement = element(by.model('title')); * titleElement.clear(); * titleElement.sendKeys('TITLE'); * var textElement = element(by.model('text')); * textElement.clear(); * textElement.sendKeys('TEXT'); * expect(element(by.binding('title')).getText()).toEqual('TITLE'); * expect(element(by.binding('text')).getText()).toEqual('TEXT'); * }); * *
* * @example * ### Transclude fallback content * This example shows how to use `NgTransclude` with fallback content, that * is displayed if no transcluded content is provided. * * * * * * * * * Button2 * * * * it('should have different transclude element content', function() { * expect(element(by.id('fallback')).getText()).toBe('Button1'); * expect(element(by.id('modified')).getText()).toBe('Button2'); * }); * * * * @example * ### Multi-slot transclusion * This example demonstrates using multi-slot transclusion in a component directive. * * * *
*
*
* * {{title}} *

{{text}}

*
*
*
* * angular.module('multiSlotTranscludeExample', []) * .directive('pane', function(){ * return { * restrict: 'E', * transclude: { * 'title': '?paneTitle', * 'body': 'paneBody', * 'footer': '?paneFooter' * }, * template: '
' + * '
Fallback Title
' + * '
' + * '' + * '
' * }; * }) * .controller('ExampleController', ['$scope', function($scope) { * $scope.title = 'Lorem Ipsum'; * $scope.link = "https://google.com"; * $scope.text = 'Neque porro quisquam est qui dolorem ipsum quia dolor...'; * }]); *
* * it('should have transcluded the title and the body', function() { * var titleElement = element(by.model('title')); * titleElement.clear(); * titleElement.sendKeys('TITLE'); * var textElement = element(by.model('text')); * textElement.clear(); * textElement.sendKeys('TEXT'); * expect(element(by.css('.title')).getText()).toEqual('TITLE'); * expect(element(by.binding('text')).getText()).toEqual('TEXT'); * expect(element(by.css('.footer')).getText()).toEqual('Fallback Footer'); * }); * *
*/ var ngTranscludeMinErr = minErr('ngTransclude'); var ngTranscludeDirective = ngDirective({ restrict: 'EAC', link: function($scope, $element, $attrs, controller, $transclude) { if ($attrs.ngTransclude === $attrs.$attr.ngTransclude) { // If the attribute is of the form: `ng-transclude="ng-transclude"` // then treat it like the default $attrs.ngTransclude = ''; } function ngTranscludeCloneAttachFn(clone) { if (clone.length) { $element.empty(); $element.append(clone); } } if (!$transclude) { throw ngTranscludeMinErr('orphan', 'Illegal use of ngTransclude directive in the template! ' + 'No parent directive that requires a transclusion found. ' + 'Element: {0}', startingTag($element)); } // If there is no slot name defined or the slot name is not optional // then transclude the slot var slotName = $attrs.ngTransclude || $attrs.ngTranscludeSlot; $transclude(ngTranscludeCloneAttachFn, null, slotName); } }); /** * @ngdoc directive * @name script * @restrict E * * @description * Load the content of a ` Load inlined template
it('should load template defined inside script tag', function() { element(by.css('#tpl-link')).click(); expect(element(by.css('#tpl-content')).getText()).toMatch(/Content of the template/); }); */ var scriptDirective = ['$templateCache', function($templateCache) { return { restrict: 'E', terminal: true, compile: function(element, attr) { if (attr.type == 'text/ng-template') { var templateUrl = attr.id, text = element[0].text; $templateCache.put(templateUrl, text); } } }; }]; var noopNgModelController = { $setViewValue: noop, $render: noop }; function chromeHack(optionElement) { // Workaround for https://code.google.com/p/chromium/issues/detail?id=381459 // Adding an